diff --git a/.DS_Store b/.DS_Store
index a29a3a9e..e96bc568 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/TWEB#2 (fixed webp).zip b/TWEB#2 (fixed webp).zip
new file mode 100644
index 00000000..405f62c8
Binary files /dev/null and b/TWEB#2 (fixed webp).zip differ
diff --git a/src/components/emoticonsDropdown.ts b/src/components/emoticonsDropdown.ts
index 8f322f76..6a7a8ee5 100644
--- a/src/components/emoticonsDropdown.ts
+++ b/src/components/emoticonsDropdown.ts
@@ -111,7 +111,7 @@ const initEmoticonsDropdown = (pageEl: HTMLDivElement,
categories.pop();
delete sorted["Skin Tones"];
- console.time('emojiParse');
+ //console.time('emojiParse');
for(let category in sorted) {
let div = document.createElement('div');
div.classList.add('emoji-category');
@@ -141,7 +141,7 @@ const initEmoticonsDropdown = (pageEl: HTMLDivElement,
divs[category] = div;
}
- console.timeEnd('emojiParse');
+ //console.timeEnd('emojiParse');
let heights: number[] = [0];
diff --git a/src/components/misc.ts b/src/components/misc.ts
index 3b530bcc..11cce135 100644
--- a/src/components/misc.ts
+++ b/src/components/misc.ts
@@ -74,7 +74,7 @@ export function horizontalMenu(tabs: HTMLUListElement, content: HTMLDivElement,
target = findUpTag(target, 'LI');
}
- console.log('tabs click:', target);
+ ///////console.log('tabs click:', target);
if(!target || target.classList.contains('active')) return false;
@@ -90,14 +90,14 @@ export function horizontalMenu(tabs: HTMLUListElement, content: HTMLDivElement,
let tabContent = content.children[id] as HTMLDivElement;
tabContent.classList.add('active');
- console.log('mambo rap', prevId, id);
+ /////console.log('mambo rap', prevId, id);
//content.style.marginLeft = id > 0 ? (-id * 100) + '%' : '';
let toRight = prevId < id;
if(prevId != -1) {
content.style.width = '200%';
- console.log('mambo rap setting', toRight);
+ //////console.log('mambo rap setting', toRight);
content.classList.remove('animated');
@@ -159,7 +159,7 @@ export function formatPhoneNumber(str: string) {
str = str.replace(/\D/g, '');
let phoneCode = str.slice(0, 6);
- console.log('str', str, phoneCode);
+ ////console.log('str', str, phoneCode);
let sortedCountries = Config.Countries.slice().sort((a, b) => b.phoneCode.length - a.phoneCode.length);
diff --git a/src/components/pageIm.ts b/src/components/pageIm.ts
index 5b845af8..0d02f02e 100644
--- a/src/components/pageIm.ts
+++ b/src/components/pageIm.ts
@@ -13,7 +13,7 @@ import appSidebarLeft from "../lib/appManagers/appSidebarLeft";
} */
export default () => import('../lib/services').then(services => {
- console.log('included services', services);
+ //console.log('included services', services);
let {appImManager, appMessagesManager, appDialogsManager, apiUpdatesManager, appUsersManager} = services;
//export default () => {
@@ -68,7 +68,7 @@ export default () => import('../lib/services').then(services => {
for(let id in dialogs) {
let dialog = dialogs[id];
- console.log('updating dialog:', dialog);
+ /////console.log('updating dialog:', dialog);
++performed;
@@ -81,7 +81,7 @@ export default () => import('../lib/services').then(services => {
}
if(performed) {
- console.log('will sortDom');
+ /////////console.log('will sortDom');
appDialogsManager.sortDom();
appDialogsManager.sortDom(true);
}
diff --git a/src/components/wrappers.ts b/src/components/wrappers.ts
index 98ff3c51..5362e75b 100644
--- a/src/components/wrappers.ts
+++ b/src/components/wrappers.ts
@@ -79,7 +79,7 @@ export function wrapVideo(this: any, doc: MTDocument, container: HTMLDivElement,
return;
}
- console.log('loaded doc:', doc, blob, container);
+ ///////console.log('loaded doc:', doc, blob, container);
let video = document.createElement('video');
/* video.loop = controls;
@@ -249,7 +249,7 @@ export function wrapAudio(doc: MTDocument, withTime = false): HTMLDivElement {
${durationStr}
`;
- console.log('wrapping audio', doc, doc.attributes[0].waveform);
+ //////console.log('wrapping audio', doc, doc.attributes[0].waveform);
let timeDiv = div.lastElementChild as HTMLDivElement;
@@ -303,6 +303,8 @@ export function wrapAudio(doc: MTDocument, withTime = false): HTMLDivElement {
let source = document.createElement('source');
source.src = URL.createObjectURL(blob);
source.type = doc.mime_type;
+
+ audio.volume = 1;
div.removeEventListener('click', onClick);
let toggle = div.querySelector('.audio-toggle') as HTMLDivElement;
@@ -359,6 +361,8 @@ export function wrapAudio(doc: MTDocument, withTime = false): HTMLDivElement {
});
audio.append(source);
+ audio.style.display = 'none';
+ div.append(audio);
});
downloadDiv.classList.add('downloading');
@@ -411,7 +415,7 @@ export function wrapPhoto(this: AppImManager, photo: any, message: any, containe
});
};
- console.log('wrapPhoto', load, container, image);
+ /////////console.log('wrapPhoto', load, container, image);
return this.loadMediaQueue ? this.loadMediaQueuePush(load) : load();
}
@@ -423,7 +427,7 @@ export function wrapSticker(doc: MTDocument, div: HTMLDivElement, middleware?: (
console.error('wrong doc for wrapSticker!', doc, div);
}
- console.log('wrap sticker', doc);
+ ///////console.log('wrap sticker', doc);
if(doc.thumbs && !div.firstElementChild) {
let thumb = doc.thumbs[0];
@@ -579,7 +583,7 @@ export function wrapReply(title: string, subtitle: string, media?: any) {
replyContent.append(replyTitle, replySubtitle);
div.append(replyBorder, replyContent);
- console.log('wrapReply', title, subtitle, media);
+ /////////console.log('wrapReply', title, subtitle, media);
return div;
}
diff --git a/src/lib/appManagers/appDialogsManager.ts b/src/lib/appManagers/appDialogsManager.ts
index a55bb396..d0a59797 100644
--- a/src/lib/appManagers/appDialogsManager.ts
+++ b/src/lib/appManagers/appDialogsManager.ts
@@ -236,7 +236,7 @@ export class AppDialogsManager {
//this.chatList.append(dom.listEl);
});
- console.log('sortDom', sorted.length, inUpper.length, chatList.childElementCount, inBottom.length);
+ //////console.log('sortDom', sorted.length, inUpper.length, chatList.childElementCount, inBottom.length);
chatsHidden.up = inUpper;
chatsHidden.down = inBottom;
@@ -247,7 +247,7 @@ export class AppDialogsManager {
lastMessage = appMessagesManager.getMessage(dialog.top_message);
}
- console.log('setlastMessage:', lastMessage);
+ ///////console.log('setlastMessage:', lastMessage);
if(lastMessage._ == 'messageEmpty') return;
@@ -313,7 +313,7 @@ export class AppDialogsManager {
}
default:
- console.warn('Got unknown lastMessage.media type!', lastMessage);
+ ///////console.warn('Got unknown lastMessage.media type!', lastMessage);
break;
}
}
@@ -342,7 +342,7 @@ export class AppDialogsManager {
senderBold.innerText = str + ': ';
//console.log(sender, senderBold.innerText);
dom.lastMessageSpan.prepend(senderBold);
- } else console.log('no sender', lastMessage, peerID);
+ } //////// else console.log('no sender', lastMessage, peerID);
}
}
diff --git a/src/lib/appManagers/appImManager.ts b/src/lib/appManagers/appImManager.ts
index 2a0de820..859cdcf8 100644
--- a/src/lib/appManagers/appImManager.ts
+++ b/src/lib/appManagers/appImManager.ts
@@ -672,13 +672,13 @@ export class AppImManager {
$rootScope.$on('message_sent', (e: CustomEvent) => {
let {tempID, mid} = e.detail;
- this.log('message_sent', e.detail);
+ ////this.log('message_sent', e.detail);
let bubble = this.bubbles[tempID];
if(bubble) {
this.bubbles[mid] = bubble;
- this.log('message_sent', bubble);
+ /////this.log('message_sent', bubble);
let media = bubble.querySelector('img, video');
if(media) {
@@ -719,7 +719,7 @@ export class AppImManager {
mids.forEach(mid => {
if(this.pinnedMsgID == mid) {
let message = appMessagesManager.getMessage(mid);
- this.log('setting pinned message', message);
+ /////this.log('setting pinned message', message);
this.pinnedMessageContainer.dataset.mid = '' + mid;
this.pinnedMessageContainer.style.display = '';
this.pinnedMessageContent.innerHTML = RichTextProcessor.wrapEmojiText(message.message);
@@ -803,7 +803,7 @@ export class AppImManager {
let splitted = savedFrom.split('_');
let peerID = +splitted[0];
let msgID = +splitted[1];
- this.log('savedFrom', peerID, msgID);
+ ////this.log('savedFrom', peerID, msgID);
this.setPeer(peerID, msgID, true);
return;
} else if(target.classList.contains('user-avatar') || target.classList.contains('name')) {
@@ -858,7 +858,7 @@ export class AppImManager {
let prevTarget = this.bubbles[prev] ? this.bubbles[prev].querySelector('img, video') as HTMLElement : null;
let nextTarget = this.bubbles[next] ? this.bubbles[next].querySelector('img, video') as HTMLElement : null;
- this.log('ids', ids, idx, this.bubbles[prev], this.bubbles[next]);
+ /////this.log('ids', ids, idx, this.bubbles[prev], this.bubbles[next]);
appMediaViewer.openMedia(message, target, nextTarget, prevTarget);
@@ -977,7 +977,7 @@ export class AppImManager {
//this.contextMenu.classList.add('active');
openBtnMenu(this.contextMenu);
- this.log('contextmenu', e, bubble, msgID, side);
+ /////this.log('contextmenu', e, bubble, msgID, side);
}
});
@@ -1041,7 +1041,7 @@ export class AppImManager {
peer: appPeersManager.getInputPeerByID(this.peerID),
id: this.contextMenuMsgID
}).then(updates => {
- this.log('pinned updates:', updates);
+ /////this.log('pinned updates:', updates);
apiUpdatesManager.processUpdateMessage(updates);
});
});
@@ -1082,7 +1082,7 @@ export class AppImManager {
revoke: revoke,
id: ids
}).then((affectedMessages: any) => {
- this.log('deleted messages:', affectedMessages);
+ /////this.log('deleted messages:', affectedMessages);
apiUpdatesManager.processUpdateMessage({
_: 'updateShort',
@@ -1143,7 +1143,7 @@ export class AppImManager {
let woo = this.loadMediaQueue.splice(-5, 5).reverse().map(f => f());
if(woo.length) {
- this.log('Will load more media:', woo.length);
+ ///this.log('Will load more media:', woo.length);
woo.forEach(async(promise) => {
try {
@@ -1276,7 +1276,7 @@ export class AppImManager {
if(isElementInViewport(bubble)) {
willLoad = true;
- this.log('Will load more (up) history by id:', history[0], 'maxID:', history[history.length - 1], history, bubble);
+ ////this.log('Will load more (up) history by id:', history[0], 'maxID:', history[history.length - 1], history, bubble);
/* false && */!testScroll && this.getHistory(history[0], true).then(() => { // uncomment
this.onScroll();
}).catch(err => {
@@ -1305,7 +1305,7 @@ export class AppImManager {
if(isElementInViewport(bubble)) {
willLoad = true;
- this.log('Will load more (down) history by maxID:', lastMsgIDs[lastMsgIDs.length - 1], lastMsgIDs, bubble);
+ ////this.log('Will load more (down) history by maxID:', lastMsgIDs[lastMsgIDs.length - 1], lastMsgIDs, bubble);
/* false && */!testScroll && this.getHistory(lastMsgIDs[lastMsgIDs.length - 1], false, true).then(() => { // uncomment
this.onScroll();
}).catch(err => {
@@ -1339,7 +1339,7 @@ export class AppImManager {
let chat = appPeersManager.getPeer(this.peerID);
let isChannel = appPeersManager.isChannel(this.peerID) && !appPeersManager.isMegagroup(this.peerID);
- this.log('setPeerStatus', chat);
+ ///////this.log('setPeerStatus', chat);
Promise.all([
appPeersManager.isMegagroup(this.peerID) ? apiManager.invokeApi('messages.getOnlines', {
@@ -1352,7 +1352,7 @@ export class AppImManager {
let onlines = chatOnlines ? chatOnlines.onlines : 1;
- this.log('chatInfo res:', chatInfo);
+ ///////////this.log('chatInfo res:', chatInfo);
if(chatInfo.pinned_msg_id) { // request pinned message
this.pinnedMsgID = chatInfo.pinned_msg_id;
@@ -1502,7 +1502,7 @@ export class AppImManager {
this.preloader.attach(this.chatInner);
let dialog = appMessagesManager.getDialogByPeerID(this.peerID)[0] || null;
- this.log('setPeer peerID:', this.peerID, dialog, lastMsgID);
+ //////this.log('setPeer peerID:', this.peerID, dialog, lastMsgID);
appDialogsManager.loadDialogPhoto(this.avatarEl, this.peerID);
appDialogsManager.loadDialogPhoto(appSidebarRight.profileElements.avatar, this.peerID);
if(!samePeer && appDialogsManager.lastActiveListElement) {
@@ -1538,12 +1538,12 @@ export class AppImManager {
return this.setPeerPromise = Promise.all([
this.getHistory(forwarding ? lastMsgID + 1 : lastMsgID).then(() => {
- this.log('setPeer removing preloader');
+ ////this.log('setPeer removing preloader');
if(lastMsgID) {
if(!forwarding) {
let message = appMessagesManager.getMessage(lastMsgID);
- this.log('setPeer render last message:', message, lastMsgID);
+ //////this.log('setPeer render last message:', message, lastMsgID);
this.renderMessage(message);
}
@@ -1609,7 +1609,7 @@ export class AppImManager {
public updateUnreadByDialog(dialog: any) {
let maxID = this.peerID == this.myID ? dialog.read_inbox_max_id : dialog.read_outbox_max_id;
- this.log('updateUnreadByDialog', maxID, dialog, this.unreadOut);
+ ///////this.log('updateUnreadByDialog', maxID, dialog, this.unreadOut);
let length = this.unreadOut.length;
for(let i = length - 1; i >= 0; --i) {
@@ -1629,7 +1629,7 @@ export class AppImManager {
let dialog = appMessagesManager.getDialogByPeerID(this.peerID)[0];
if(dialog) {
- this.log('setting firstTopMsgID after delete:', id, dialog.top_message, dialog);
+ ///////this.log('setting firstTopMsgID after delete:', id, dialog.top_message, dialog);
this.firstTopMsgID = dialog.top_message;
}
}
@@ -1651,14 +1651,14 @@ export class AppImManager {
public renderMessagesByIDs(msgIDs: number[]) {
if(!this.bubbles[this.firstTopMsgID] && Object.keys(this.bubbles).length) { // seems search active
- this.log('seems search is active, skipping render:', msgIDs);
+ //////this.log('seems search is active, skipping render:', msgIDs);
return;
}
msgIDs.forEach((msgID: number) => {
let message = appMessagesManager.getMessage(msgID);
- this.log('got new message to append:', message);
+ /////////this.log('got new message to append:', message);
//this.unreaded.push(msgID);
this.renderMessage(message);
@@ -1666,7 +1666,7 @@ export class AppImManager {
}
public renderMessage(message: any, reverse = false, multipleRender?: boolean, bubble: HTMLDivElement = null, updatePosition = true) {
- this.log('message to render:', message);
+ /////this.log('message to render:', message);
if(message.deleted) return;
let peerID = this.peerID;
@@ -1817,7 +1817,7 @@ export class AppImManager {
case 'messageMediaPhoto': {
let photo = message.media.photo;
- this.log('messageMediaPhoto', photo);
+ ////////this.log('messageMediaPhoto', photo);
bubble.classList.add('hide-name', 'photo');
@@ -1829,7 +1829,7 @@ export class AppImManager {
processingWebPage = true;
let webpage = message.media.webpage;
- this.log('messageMediaWebPage', webpage);
+ ////////this.log('messageMediaWebPage', webpage);
if(webpage._ == 'webPageEmpty') {
break;
}
@@ -1911,7 +1911,7 @@ export class AppImManager {
break;
} */
- this.log('messageMediaDocument', doc);
+ ////////this.log('messageMediaDocument', doc);
if(doc.sticker && doc.size <= 1e6) {
bubble.classList.add('sticker');
@@ -1942,7 +1942,7 @@ export class AppImManager {
break;
} else if(doc.mime_type == 'video/mp4' && doc.size <= 20e6) {
- this.log('never get free 2', doc);
+ ////////this.log('never get free 2', doc);
if(doc.type == 'round') {
bubble.classList.add('round');
@@ -1981,7 +1981,7 @@ export class AppImManager {
let isHidden = message.fwd_from && !message.fwd_from.from_id && !message.fwd_from.channel_id;
if(isHidden) {
- this.log('message to render hidden', message);
+ ///////this.log('message to render hidden', message);
title = message.fwd_from.from_name;
bubble.classList.add('hidden-profile');
}
@@ -2018,11 +2018,11 @@ export class AppImManager {
let originalMessage = appMessagesManager.getMessage(message.reply_to_mid);
let originalPeerTitle = appPeersManager.getPeerTitle(originalMessage.fromID, true) || '';
- this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);
+ /////////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);
// need to download separately
if(originalMessage._ == 'messageEmpty') {
- this.log('message to render reply empty, need download', message, message.reply_to_mid);
+ //////////this.log('message to render reply empty, need download', message, message.reply_to_mid);
appMessagesManager.wrapSingleMessage(message.reply_to_mid);
this.needUpdate.push({replyMid: message.reply_to_mid, mid: message.mid});
@@ -2063,7 +2063,7 @@ export class AppImManager {
let avatarDiv = document.createElement('div');
avatarDiv.classList.add('user-avatar');
- this.log('exec loadDialogPhoto', message);
+ /////////this.log('exec loadDialogPhoto', message);
if(message.fromID) { // if no - user hidden
appDialogsManager.loadDialogPhoto(avatarDiv, message.fromID);
} else if(!title && message.fwd_from && message.fwd_from.from_name) {
@@ -2091,8 +2091,12 @@ export class AppImManager {
name.dataset.peerID = message.fromID;
name.innerHTML = title;
+ let _ = action._;
+ if(_ == "messageActionPhoneCall") {
+ _ += '.' + action.type;
+ }
// @ts-ignore
- let str = name.outerHTML + ' ' + langPack[action._];
+ let str = (name.innerText ? name.outerHTML + ' ' : '') + langPack[_];
bubble.innerHTML = `${str}
`;
}
@@ -2153,7 +2157,7 @@ export class AppImManager {
let div = document.createElement('div');
div.classList.add('service');
div.innerHTML = `${str}
`;
- this.log('need to render date message', dateTimestamp, str);
+ ////////this.log('need to render date message', dateTimestamp, str);
this.dateMessages[dateTimestamp] = {
div,
@@ -2203,8 +2207,8 @@ export class AppImManager {
return Promise.resolve(true);
}
- console.time('render getHistory');
- console.time('render history total');
+ //console.time('render getHistory');
+ //console.time('render history total');
let backLimit = 0;
if(isBackLimit) {
@@ -2215,18 +2219,18 @@ export class AppImManager {
return this.getHistoryPromise = appMessagesManager.getHistory(this.peerID, maxID, loadCount, backLimit)
.then((result: any) => {
- this.log('getHistory result by maxID:', maxID, reverse, isBackLimit, result);
+ ///////this.log('getHistory result by maxID:', maxID, reverse, isBackLimit, result);
- console.timeEnd('render getHistory');
+ //console.timeEnd('render getHistory');
if(this.peerID != peerID) {
this.log.warn('peer changed');
- console.timeEnd('render history total');
+ //console.timeEnd('render history total');
return Promise.reject();
}
if(!result || !result.history) {
- console.timeEnd('render history total');
+ //console.timeEnd('render history total');
return true;
}
@@ -2245,7 +2249,7 @@ export class AppImManager {
if(reverse) history.reverse();
- console.time('render history');
+ //console.time('render history');
if(!isBackLimit) {
this.scrollPosition.prepareFor(reverse ? 'up' : 'down');
@@ -2264,11 +2268,11 @@ export class AppImManager {
this.scrollPosition.restore();
}
- console.timeEnd('render history');
+ //console.timeEnd('render history');
this.getHistoryPromise = undefined;
- console.timeEnd('render history total');
+ //console.timeEnd('render history total');
return true;
});
@@ -2412,7 +2416,7 @@ export class AppImManager {
this.setMutedState(muted);
}
- this.log('updateNotifySettings', peerID, notify_settings);
+ /////this.log('updateNotifySettings', peerID, notify_settings);
break;
}
@@ -2420,7 +2424,7 @@ export class AppImManager {
case 'updateUserPinnedMessage': {
let {id} = update;
- this.log('updateUserPinnedMessage', update);
+ /////this.log('updateUserPinnedMessage', update);
this.pinnedMsgID = id;
// hz nado li tut appMessagesIDsManager.getFullMessageID(update.max_id, channelID);
diff --git a/src/lib/appManagers/appMediaViewer.ts b/src/lib/appManagers/appMediaViewer.ts
index 6050bc64..0fd8a2e5 100644
--- a/src/lib/appManagers/appMediaViewer.ts
+++ b/src/lib/appManagers/appMediaViewer.ts
@@ -146,7 +146,7 @@ export class AppMediaViewer {
mover = this.setNewMover();
} */
- this.log('setMoverToTarget', target, closing, wasActive, fromRight);
+ ///////this.log('setMoverToTarget', target, closing, wasActive, fromRight);
let rect = target.getBoundingClientRect();
let containerRect = this.content.container.getBoundingClientRect();
@@ -182,9 +182,9 @@ export class AppMediaViewer {
mover.style.transform = transform;
- if(wasActive) {
+ /* if(wasActive) {
this.log('setMoverToTarget', mover.style.transform);
- }
+ } */
if(!closing) {
let img: HTMLImageElement;
@@ -268,14 +268,14 @@ export class AppMediaViewer {
let rect = mover.getBoundingClientRect();
let newTransform = mover.style.transform.replace(/translate\((.+?),/, /* 'translate(-' + windowW + 'px,', */ (match, p1) => {
- this.log('replace func', match, p1);
+ /////////this.log('replace func', match, p1);
let x = +p1.slice(0, -2);
x = toLeft ? -rect.width : windowW;
return match.replace(p1, x + 'px');
});
- this.log('set newTransform:', newTransform, mover.style.transform, toLeft);
+ ////////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);
mover.style.transform = newTransform;
setTimeout(() => {
@@ -296,7 +296,7 @@ export class AppMediaViewer {
}
public openMedia(message: any, target?: HTMLElement, prevTarget?: HTMLElement, nextTarget?: HTMLElement) {
- this.log('openMedia doc:', message, prevTarget, nextTarget);
+ ////////this.log('openMedia doc:', message, prevTarget, nextTarget);
let media = message.media.photo || message.media.document || message.media.webpage.document || message.media.webpage.photo;
let isVideo = media.mime_type == 'video/mp4';
@@ -351,7 +351,7 @@ export class AppMediaViewer {
this.overlaysDiv.classList.add('active');
}
- this.log('wasActive:', wasActive);
+ ////////this.log('wasActive:', wasActive);
let mover = this.content.mover;
@@ -360,7 +360,7 @@ export class AppMediaViewer {
if(isVideo) {
let size = appPhotosManager.setAttachmentSize(media, container, maxWidth, maxHeight);
- this.log('will wrap video', media, size);
+ ////////this.log('will wrap video', media, size);
let afterTimeout = this.setMoverToTarget(target, false, fromRight);
//if(wasActive) return;
@@ -390,7 +390,7 @@ export class AppMediaViewer {
return;
}
- this.log('indochina', blob);
+ ///////this.log('indochina', blob);
let image = mover.firstElementChild as HTMLImageElement || new Image();
image.src = URL.createObjectURL(blob);
diff --git a/src/lib/appManagers/appMessagesManager.ts b/src/lib/appManagers/appMessagesManager.ts
index 99a460fb..21377407 100644
--- a/src/lib/appManagers/appMessagesManager.ts
+++ b/src/lib/appManagers/appMessagesManager.ts
@@ -901,7 +901,7 @@ export class AppMessagesManager {
}, {
timeout: 300
}).then((dialogsResult: any) => {
- console.log('messages.getDialogs result:', dialogsResult);
+ ///////console.log('messages.getDialogs result:', dialogsResult);
if(!offsetDate) {
telegramMeWebService.setAuthorized(true);
@@ -1834,7 +1834,7 @@ export class AppMessagesManager {
this.lastSearchResults = [];
}
- console.log(dT(), 'search', useSearchCache, sameSearchCache, this.lastSearchResults, maxID);
+ //console.log(dT(), 'search', useSearchCache, sameSearchCache, this.lastSearchResults, maxID);
if(peerID && !maxID && !query) {
var historyStorage = this.historiesStorage[peerID];
@@ -1991,7 +1991,7 @@ export class AppMessagesManager {
appChatsManager.saveApiChats(searchResult.chats);
this.saveMessages(searchResult.messages);
- console.log('messages.search result:', searchResult);
+ ///////////console.log('messages.search result:', searchResult);
var foundCount: number = searchResult.count || searchResult.messages.length;
@@ -2140,11 +2140,11 @@ export class AppMessagesManager {
}
foundDialog.unread_count = index == -1 ? 0 : index;
- console.log('readHistory set unread_count to:', foundDialog.unread_count, foundDialog);
+ ////////console.log('readHistory set unread_count to:', foundDialog.unread_count, foundDialog);
$rootScope.$broadcast('dialog_unread', {peerID: peerID, count: foundDialog.unread_count});
$rootScope.$broadcast('messages_read');
if(historyStorage && historyStorage.history.length) {
- console.warn('readPromise:', index, historyStorage.history[index != -1 ? index : 0]);
+ ////////console.warn('readPromise:', index, historyStorage.history[index != -1 ? index : 0]);
foundDialog.read_inbox_max_id = historyStorage.history[index != -1 ? index : 0];
}
@@ -2233,7 +2233,7 @@ export class AppMessagesManager {
}
public handleUpdate(update: any) {
- console.log('AMM: handleUpdate:', update._);
+ //console.log('AMM: handleUpdate:', update._);
switch(update._) {
case 'updateMessageID': {
var randomID = update.random_id;
@@ -2588,7 +2588,7 @@ export class AppMessagesManager {
// need be commented for read out messages
//if(newUnreadCount != 0 || !isOut) { // fix 16.11.2019 (maybe not)
- console.warn(dT(), 'cnt', peerID, newUnreadCount, isOut, foundDialog, update, foundAffected);
+ //////////console.warn(dT(), 'cnt', peerID, newUnreadCount, isOut, foundDialog, update, foundAffected);
$rootScope.$broadcast('dialog_unread', {peerID: peerID, count: newUnreadCount});
//}
@@ -3266,7 +3266,7 @@ export class AppMessagesManager {
timeout: 300,
noErrorBox: true
}).then((historyResult: any) => {
- console.log('requestHistory result:', historyResult);
+ ///console.log('requestHistory result:', historyResult);
appUsersManager.saveApiUsers(historyResult.users);
appChatsManager.saveApiChats(historyResult.chats);
diff --git a/src/lib/appManagers/appSidebarLeft.ts b/src/lib/appManagers/appSidebarLeft.ts
index 92935e67..85f414cb 100644
--- a/src/lib/appManagers/appSidebarLeft.ts
+++ b/src/lib/appManagers/appSidebarLeft.ts
@@ -108,7 +108,7 @@ class AppSidebarLeft {
}
this.savedBtn.addEventListener('click', (e) => {
- this.log('savedbtn click');
+ ///////this.log('savedbtn click');
setTimeout(() => { // menu doesn't close if no timeout (lol)
let dom = appDialogsManager.getDialogDom(appImManager.myID);
if(dom) {
@@ -158,7 +158,7 @@ class AppSidebarLeft {
this.toolsBtn.classList.add('active');
this.backBtn.classList.remove('active');
this.searchContainer.classList.remove('active');
-
+ this.backBtn.click();
/* setTimeout(() => {
//this.toolsBtn.click();
@@ -175,9 +175,10 @@ class AppSidebarLeft {
this.searchInput.addEventListener('input', (e) => {
//console.log('messageInput input', this.innerText, serializeNodes(Array.from(messageInput.childNodes)));
let value = this.searchInput.value;
- this.log('input', value);
+ ////////this.log('input', value);
if(!value.trim()) {
+ //this.peerID = 0;
return;
}
@@ -199,6 +200,9 @@ class AppSidebarLeft {
this.chatsArchivedContainer.classList.remove('active');
this.toolsBtn.classList.add('active');
this.backBtn.classList.remove('active');
+ this.searchInput.value = '';
+ this.searchContainer.classList.remove('active');
+ this.peerID = 0;
});
window.addEventListener('resize', () => {
@@ -249,7 +253,7 @@ class AppSidebarLeft {
this.archivedCount.innerText = '' + count;
} */
- this.log('loaded ' + this.chatsLoadCount + ' dialogs by offset:', offset, result, this.scroll.hiddenElements);
+ /////this.log('loaded ' + this.chatsLoadCount + ' dialogs by offset:', offset, result, this.scroll.hiddenElements);
this.scroll.onScroll();
} catch(err) {
this.log.error(err);
@@ -340,7 +344,7 @@ class AppSidebarLeft {
return;
}
- this.log('input search contacts result:', contacts);
+ ///////this.log('input search contacts result:', contacts);
let setResults = (results: any, group: SearchGroup, showMembersCount = false) => {
results.forEach((inputPeer: any) => {
@@ -348,10 +352,10 @@ class AppSidebarLeft {
let peer = appPeersManager.getPeer(peerID);
let originalDialog = appMessagesManager.getDialogByPeerID(peerID)[0];
- this.log('contacts peer', peer);
+ //////////this.log('contacts peer', peer);
if(!originalDialog) {
- this.log('no original dialog by peerID:', peerID);
+ /////////this.log('no original dialog by peerID:', peerID);
originalDialog = {
peerID: peerID,
@@ -399,7 +403,7 @@ class AppSidebarLeft {
return;
}
- this.log('input search result:', this.peerID, query, null, maxID, 20, res);
+ /////////this.log('input search result:', this.peerID, query, null, maxID, 20, res);
let {count, history, next_rate} = res;
@@ -415,7 +419,7 @@ class AppSidebarLeft {
let originalDialog = appMessagesManager.getDialogByPeerID(message.peerID)[0];
if(!originalDialog) {
- this.log('no original dialog by message:', message);
+ ////////this.log('no original dialog by message:', message);
originalDialog = {
peerID: message.peerID,
diff --git a/src/lib/appManagers/appSidebarRight.ts b/src/lib/appManagers/appSidebarRight.ts
index a937777a..c0ba6f39 100644
--- a/src/lib/appManagers/appSidebarRight.ts
+++ b/src/lib/appManagers/appSidebarRight.ts
@@ -179,7 +179,7 @@ class AppSidebarRight {
}
public toggleSidebar(enable?: boolean) {
- this.log('sidebarEl', this.sidebarEl, enable, isElementInViewport(this.sidebarEl));
+ /////this.log('sidebarEl', this.sidebarEl, enable, isElementInViewport(this.sidebarEl));
/* if(enable !== undefined) {
this.sidebarEl.style.display = enable ? 'block' : 'none';
diff --git a/src/lib/appManagers/appUsersManager.ts b/src/lib/appManagers/appUsersManager.ts
index 50b4874a..dc0de35d 100644
--- a/src/lib/appManagers/appUsersManager.ts
+++ b/src/lib/appManagers/appUsersManager.ts
@@ -49,7 +49,7 @@ export class AppUsersManager {
user.sortStatus = this.getUserStatusForSort(user.status);
$rootScope.$broadcast('user_update', userID);
- } else console.warn('No user by id:', userID);
+ } //////else console.warn('No user by id:', userID);
break;
case 'updateUserPhoto':
diff --git a/src/lib/appManagers/appWebpManager.ts b/src/lib/appManagers/appWebpManager.ts
index 83165b20..c3d1eab2 100644
--- a/src/lib/appManagers/appWebpManager.ts
+++ b/src/lib/appManagers/appWebpManager.ts
@@ -18,24 +18,31 @@ class AppWebpManager {
}); */
this.webpSupported().then(res => {
- this.loaded = new Promise((resolve, reject) => {
- if(!res) {
- (window as any).webpLoaded = () => {
- console.log('webpHero loaded');
- this.webpMachine = new (window as any).WebpMachine();
- resolve();
- };
-
- let sc = document.createElement('script');
- sc.src = 'webp.bundle.js';
- sc.async = true;
- sc.onload = (window as any).webpLoaded;
-
- document.body.appendChild(sc);
- } else {
+ });
+ }
+
+ public loadWebpHero() {
+ if(this.loaded) return this.loaded;
+
+ this.loaded = new Promise(async(resolve, reject) => {
+ let res = await this.webpSupported();
+
+ if(!res) {
+ (window as any).webpLoaded = () => {
+ console.log('webpHero loaded');
+ this.webpMachine = new (window as any).WebpMachine();
resolve();
- }
- });
+ };
+
+ let sc = document.createElement('script');
+ sc.src = 'npm.webp-hero.chunk.js';
+ sc.async = true;
+ sc.onload = (window as any).webpLoaded;
+
+ document.body.appendChild(sc);
+ } else {
+ resolve();
+ }
});
}
@@ -47,8 +54,14 @@ class AppWebpManager {
async processQueue() {
if(this.busyPromise) return;
+ this.busyPromise = Promise.resolve('');
+
let {img, bytes} = this.queue.pop();
+ if(!this.loaded) {
+ this.loadWebpHero();
+ }
+
await this.loaded;
this.busyPromise = this.convert(bytes);
@@ -62,6 +75,8 @@ class AppWebpManager {
}
webpSupported() {
+ if(this.webpSupport) return this.webpSupport;
+
return this.webpSupport = new Promise((resolve, reject) => {
var webP = new Image();
webP.src = 'data:image/webp;base64,UklGRi4AAABXRUJQVlA4TCEAAAAvAUAAEB8wAiMw' +
diff --git a/src/lib/bin_utils.ts b/src/lib/bin_utils.ts
index 4d94e4ac..8e36c68f 100644
--- a/src/lib/bin_utils.ts
+++ b/src/lib/bin_utils.ts
@@ -331,7 +331,7 @@ export function addPadding(bytes: any, blockSize: number = 16, zeroes?: boolean,
let len = bytes.byteLength || bytes.length;
let needPadding = blockSize - (len % blockSize);
if(needPadding > 0 && (needPadding < blockSize || full)) {
- console.log('addPadding()', len, blockSize, needPadding);
+ ////console.log('addPadding()', len, blockSize, needPadding);
let padding = new Array(needPadding);
if(zeroes) {
for(let i = 0; i < needPadding; i++) {
diff --git a/src/lib/ckin.js b/src/lib/ckin.js
index 1951f551..8070fa4b 100644
--- a/src/lib/ckin.js
+++ b/src/lib/ckin.js
@@ -267,7 +267,7 @@ function buildControls(skin) {
}
function attachSkin(skin) {
- console.log("skin: " + skin);
+ //console.log("skin: " + skin);
if (typeof skin != 'undefined' && skin != '') {
return skin;
} else {
diff --git a/src/lib/crypto/cryptoworker.ts b/src/lib/crypto/cryptoworker.ts
index 84222940..070daf49 100644
--- a/src/lib/crypto/cryptoworker.ts
+++ b/src/lib/crypto/cryptoworker.ts
@@ -32,7 +32,7 @@ class CryptoWorker {
if(window.Worker/* && 1 == 2 */) {
import('./crypto.worker.js').then((CryptoWebWorker: any) => {
- console.log(CryptoWebWorker);
+ //console.log(CryptoWebWorker);
var tmpWorker = new CryptoWebWorker.default();
//var tmpWorker = new Worker();
tmpWorker.onmessage = (e: any) => {
diff --git a/src/lib/lottieLoader.ts b/src/lib/lottieLoader.ts
index 52fdec4e..835fd146 100644
--- a/src/lib/lottieLoader.ts
+++ b/src/lib/lottieLoader.ts
@@ -122,6 +122,6 @@ class LottieLoader {
const lottieLoader = new LottieLoader();
-(window as any).LottieLoader = lottieLoader;
+//(window as any).LottieLoader = lottieLoader;
export default lottieLoader;
diff --git a/src/lib/mtproto/apiFileManager.ts b/src/lib/mtproto/apiFileManager.ts
index 12b116bf..1957c749 100644
--- a/src/lib/mtproto/apiFileManager.ts
+++ b/src/lib/mtproto/apiFileManager.ts
@@ -396,7 +396,7 @@ export class ApiFileManager {
fileWriter.seek(startOffset);
deferred.notify({done: startOffset, total: size});
- this.log('deferred notify 1:', {done: startOffset, total: size});
+ /////this.log('deferred notify 1:', {done: startOffset, total: size});
}
for(offset = startOffset; offset < size; offset += limit) {
@@ -408,7 +408,7 @@ export class ApiFileManager {
});
Object.assign(writeFileDeferred, writeFileDeferredHelper);
- this.log('offset:', startOffset);
+ ////this.log('offset:', startOffset);
;((isFinal, offset, writeFileDeferred, writeFilePromise) => {
return this.downloadRequest(dcID, () => {
@@ -445,7 +445,7 @@ export class ApiFileManager {
deferred.resolve(this.cachedDownloads[fileName] = fileWriter.finalize());
}
} else {
- this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);
+ ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);
deferred.notify({done: offset + limit, total: size});
}
});
@@ -584,7 +584,7 @@ export class ApiFileManager {
return;
}
- this.log('Starting to upload file, isBig:', isBigFile, fileID, part, e.target.result);
+ //////this.log('Starting to upload file, isBig:', isBigFile, fileID, part, e.target.result);
apiManager.invokeApi(method, {
file_id: fileID,
@@ -599,7 +599,7 @@ export class ApiFileManager {
doneParts++;
uploadResolve();
- this.log('Progress', doneParts * partSize / fileSize);
+ //////this.log('Progress', doneParts * partSize / fileSize);
if(doneParts >= totalParts) {
deferred.resolve(resultInputFile);
resolved = true;
diff --git a/src/lib/mtproto/apiManager.ts b/src/lib/mtproto/apiManager.ts
index a42db03f..84cf4070 100644
--- a/src/lib/mtproto/apiManager.ts
+++ b/src/lib/mtproto/apiManager.ts
@@ -199,7 +199,7 @@ export class ApiManager {
stopTime?: number,
rawError?: any
} = {}) {
- this.log('Invoke api', method, params, options);
+ ///////this.log('Invoke api', method, params, options);
return new Promise((resolve, reject) => {
let rejectPromise = (error: any) => {
diff --git a/src/lib/mtproto/mtproto.ts b/src/lib/mtproto/mtproto.ts
index 8065fd40..a09d07a6 100644
--- a/src/lib/mtproto/mtproto.ts
+++ b/src/lib/mtproto/mtproto.ts
@@ -73,4 +73,4 @@ export namespace MTProto {
export const serverTimeManager = ServerTimeManager;
}
-(window as any).MTProto = MTProto;
+//(window as any).MTProto = MTProto;
diff --git a/src/lib/mtproto/networker.ts b/src/lib/mtproto/networker.ts
index 0da74bca..4ccb2d19 100644
--- a/src/lib/mtproto/networker.ts
+++ b/src/lib/mtproto/networker.ts
@@ -249,7 +249,7 @@ class MTPNetworker {
let serializer = new TLSerialization(options);
if(!this.connectionInited) { // this will call once for each new session
- this.log('Wrap api call !this.connectionInited');
+ ///////this.log('Wrap api call !this.connectionInited');
let invokeWithLayer = Config.Schema.API.methods.find((m: any) => m.method == 'invokeWithLayer');
if(!invokeWithLayer) throw new Error('no invokeWithLayer!');
@@ -291,9 +291,9 @@ class MTPNetworker {
options.resultType = serializer.storeMethod(method, params);
- if(method == 'account.updateNotifySettings') {
+ /* if(method == 'account.updateNotifySettings') {
this.log('api call body:', serializer.getBytes(true));
- }
+ } */
var messageID = timeManager.generateID();
var seqNo = this.generateSeqNo();
@@ -304,10 +304,10 @@ class MTPNetworker {
isAPI: true
};
- if(Config.Modes.debug || true) {
+ if(Config.Modes.debug/* || true */) {
this.log('Api call', method, message, params, options);
} else {
- this.log('Api call', method);
+ //////this.log('Api call', method);
}
return this.pushMessage(message, options);
@@ -1209,7 +1209,7 @@ class MTPNetworker {
if(sentMessage.isAPI && !this.connectionInited) {
this.connectionInited = true;
- this.log('Rpc set connectionInited to:', this.connectionInited, this);
+ ////this.log('Rpc set connectionInited to:', this.connectionInited);
}
}
diff --git a/src/lib/services.ts b/src/lib/services.ts
index 16afce0f..1f9cfb33 100644
--- a/src/lib/services.ts
+++ b/src/lib/services.ts
@@ -32,7 +32,7 @@ export const appDocsManager = AppDocsManager;
export const appSidebarRight = AppSidebarRight;
export const appSidebarLeft = AppSidebarLeft;
-(window as any).Services = {
+/* (window as any).Services = {
appUsersManager,
appChatsManager,
apiUpdatesManager,
@@ -48,4 +48,4 @@ export const appSidebarLeft = AppSidebarLeft;
appSidebarRight,
appSidebarLeft
//appSharedMediaManager
-};
+}; */
diff --git a/src/lib/tl_utils.ts b/src/lib/tl_utils.ts
index 8d5223ff..afed8484 100644
--- a/src/lib/tl_utils.ts
+++ b/src/lib/tl_utils.ts
@@ -68,7 +68,7 @@ class TLSerialization {
return;
}
- console.trace('Increase buffer', this.offset, needBytes, this.maxLength);
+ ///console.trace('Increase buffer', this.offset, needBytes, this.maxLength);
this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;
var previousBuffer = this.buffer;
var previousArray = new Int32Array(previousBuffer);
diff --git a/src/lib/utils.js b/src/lib/utils.js
index 66b2a7b9..563116b7 100644
--- a/src/lib/utils.js
+++ b/src/lib/utils.js
@@ -297,7 +297,7 @@ export function getSelectedText() {
export const $rootScope = {
$broadcast: (name/* : string */, detail/*? : any */) => {
- console.log(dT(), 'Broadcasting ' + name + ' event, with args:', detail);
+ ////console.log(dT(), 'Broadcasting ' + name + ' event, with args:', detail);
//console.trace();
let myCustomEvent = new CustomEvent(name, {detail});
document.dispatchEvent(myCustomEvent);
diff --git a/src/scss/partials/_chat.scss b/src/scss/partials/_chat.scss
index fedd77fa..3a177b89 100644
--- a/src/scss/partials/_chat.scss
+++ b/src/scss/partials/_chat.scss
@@ -1427,6 +1427,12 @@
/* #content-stickers {
padding: 0;
} */
+
+ .emoji-padding {
+ .menu-horizontal > li {
+ font-size: 1.65rem;
+ }
+ }
.stickers-padding {
.menu-wrapper {
diff --git a/src/scss/partials/_sidebar.scss b/src/scss/partials/_sidebar.scss
index dda0d2fc..235401fe 100644
--- a/src/scss/partials/_sidebar.scss
+++ b/src/scss/partials/_sidebar.scss
@@ -191,7 +191,7 @@
}
#content-links {
- padding: 0 15px 15px 15px;
+ padding: 0 30px 15px 15px;
> div {
display: flex;
@@ -243,7 +243,6 @@
.subtitle {
font-size: 14px;
- max-width: 300px;
}
}
diff --git a/src/scss/style.scss b/src/scss/style.scss
index 3ca88f37..1590adef 100644
--- a/src/scss/style.scss
+++ b/src/scss/style.scss
@@ -453,7 +453,7 @@ input {
}
&-download {
- z-index: 3;
+ z-index: 2;
align-items: center;
font-size: 24px;
cursor: pointer;
@@ -1318,11 +1318,13 @@ div.scrollable::-webkit-scrollbar-thumb {
&.scrollable-x {
overflow-x: auto;
scrollbar-width: none;
+ -ms-overflow-style: none;
}
&.scrollable-y {
overflow-y: auto;
scrollbar-width: none;
+ -ms-overflow-style: none;
}
&.scrollable-x ~ .scrollbar-thumb {
@@ -1378,11 +1380,11 @@ div.scrollable::-webkit-scrollbar-thumb {
text-align: center;
flex: 1;
user-select: none;
+ font-size: 16px;
&.active {
position: relative;
color: $blue;
- font-size: 16px;
&:after {
content: '';
diff --git a/stats.json b/stats.json
new file mode 100644
index 00000000..7709658c
--- /dev/null
+++ b/stats.json
@@ -0,0 +1,21229 @@
+{
+ "errors": [],
+ "warnings": [
+ "asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).\nThis can impact web performance.\nAssets: \n index.bundle.js (749 KiB)\n npm.webp-hero.chunk.js (310 KiB)",
+ "entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.\nEntrypoints:\n index (1.07 MiB)\n npm.aes-js.chunk.js\n npm.jsbn.chunk.js\n npm.leemon.chunk.js\n npm.lottie-web.chunk.js\n npm.web-streams-polyfill.chunk.js\n vendors~index.chunk.js\n index.bundle.js\n webp (317 KiB)\n npm.webp-hero.chunk.js\n webp.bundle.js\n",
+ "webpack performance recommendations: \nYou can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application.\nFor more info visit https://webpack.js.org/guides/code-splitting/"
+ ],
+ "version": "4.41.2",
+ "hash": "e28785388f6334731d60",
+ "time": 8981,
+ "builtAt": 1581916641211,
+ "publicPath": "",
+ "outputPath": "/Users/kuzmenko/Documents/projects/tweb/public",
+ "assetsByChunkName": {
+ "index": "index.bundle.js",
+ "npm.aes-js": "npm.aes-js.chunk.js",
+ "npm.jsbn": "npm.jsbn.chunk.js",
+ "npm.leemon": "npm.leemon.chunk.js",
+ "npm.lottie-web": "npm.lottie-web.chunk.js",
+ "npm.web-streams-polyfill": "npm.web-streams-polyfill.chunk.js",
+ "npm.webp-hero": "npm.webp-hero.chunk.js",
+ "vendors~index": "vendors~index.chunk.js",
+ "webp": "webp.bundle.js"
+ },
+ "assets": [
+ {
+ "name": "69d45fed4230730b6030.worker.js",
+ "size": 79262,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {
+ "immutable": true
+ },
+ "emitted": true
+ },
+ {
+ "name": "69d45fed4230730b6030.worker.js.gz",
+ "size": 26698,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "assets/fonts/tgico.eot",
+ "size": 23516,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "assets/fonts/tgico.svg",
+ "size": 85141,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "assets/fonts/tgico.svg.gz",
+ "size": 24074,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "assets/fonts/tgico.ttf",
+ "size": 23352,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "assets/fonts/tgico.woff",
+ "size": 23428,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "assets/img/camomile.jpg",
+ "size": 107703,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "assets/img/doc-in.svg",
+ "size": 1080,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "assets/img/msg-tail-left.svg",
+ "size": 325,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "assets/img/msg-tail-right.svg",
+ "size": 328,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "index.bundle.js",
+ "size": 767165,
+ "chunks": [
+ 0
+ ],
+ "chunkNames": [
+ "index"
+ ],
+ "info": {},
+ "emitted": true,
+ "isOverSizeLimit": true
+ },
+ {
+ "name": "index.bundle.js.gz",
+ "size": 172484,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "index.html",
+ "size": 24479,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "index.html.gz",
+ "size": 5560,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.aes-js.chunk.js",
+ "size": 43937,
+ "chunks": [
+ 1
+ ],
+ "chunkNames": [
+ "npm.aes-js"
+ ],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.aes-js.chunk.js.gz",
+ "size": 18149,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.jsbn.chunk.js",
+ "size": 19047,
+ "chunks": [
+ 2
+ ],
+ "chunkNames": [
+ "npm.jsbn"
+ ],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.jsbn.chunk.js.gz",
+ "size": 6583,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.leemon.chunk.js",
+ "size": 14391,
+ "chunks": [
+ 3
+ ],
+ "chunkNames": [
+ "npm.leemon"
+ ],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.leemon.chunk.js.gz",
+ "size": 4668,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.lottie-web.chunk.js",
+ "size": 202543,
+ "chunks": [
+ 4
+ ],
+ "chunkNames": [
+ "npm.lottie-web"
+ ],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.lottie-web.chunk.js.gz",
+ "size": 52399,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.web-streams-polyfill.chunk.js",
+ "size": 42988,
+ "chunks": [
+ 5
+ ],
+ "chunkNames": [
+ "npm.web-streams-polyfill"
+ ],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.web-streams-polyfill.chunk.js.gz",
+ "size": 9949,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "npm.webp-hero.chunk.js",
+ "size": 317799,
+ "chunks": [
+ 6
+ ],
+ "chunkNames": [
+ "npm.webp-hero"
+ ],
+ "info": {},
+ "emitted": true,
+ "isOverSizeLimit": true
+ },
+ {
+ "name": "npm.webp-hero.chunk.js.gz",
+ "size": 96803,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "vendors~index.chunk.js",
+ "size": 29816,
+ "chunks": [
+ 7
+ ],
+ "chunkNames": [
+ "vendors~index"
+ ],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "vendors~index.chunk.js.gz",
+ "size": 10700,
+ "chunks": [],
+ "chunkNames": [],
+ "info": {},
+ "emitted": true
+ },
+ {
+ "name": "webp.bundle.js",
+ "size": 7173,
+ "chunks": [
+ 8
+ ],
+ "chunkNames": [
+ "webp"
+ ],
+ "info": {},
+ "emitted": true
+ }
+ ],
+ "filteredAssets": 0,
+ "entrypoints": {
+ "index": {
+ "chunks": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 7,
+ 0
+ ],
+ "assets": [
+ "npm.aes-js.chunk.js",
+ "npm.jsbn.chunk.js",
+ "npm.leemon.chunk.js",
+ "npm.lottie-web.chunk.js",
+ "npm.web-streams-polyfill.chunk.js",
+ "vendors~index.chunk.js",
+ "index.bundle.js"
+ ],
+ "children": {},
+ "childAssets": {},
+ "isOverSizeLimit": true
+ },
+ "webp": {
+ "chunks": [
+ 6,
+ 8
+ ],
+ "assets": [
+ "npm.webp-hero.chunk.js",
+ "webp.bundle.js"
+ ],
+ "children": {},
+ "childAssets": {},
+ "isOverSizeLimit": true
+ }
+ },
+ "namedChunkGroups": {
+ "index": {
+ "chunks": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 7,
+ 0
+ ],
+ "assets": [
+ "npm.aes-js.chunk.js",
+ "npm.jsbn.chunk.js",
+ "npm.leemon.chunk.js",
+ "npm.lottie-web.chunk.js",
+ "npm.web-streams-polyfill.chunk.js",
+ "vendors~index.chunk.js",
+ "index.bundle.js"
+ ],
+ "children": {},
+ "childAssets": {},
+ "isOverSizeLimit": true
+ },
+ "webp": {
+ "chunks": [
+ 6,
+ 8
+ ],
+ "assets": [
+ "npm.webp-hero.chunk.js",
+ "webp.bundle.js"
+ ],
+ "children": {},
+ "childAssets": {},
+ "isOverSizeLimit": true
+ }
+ },
+ "chunks": [
+ {
+ "id": 0,
+ "rendered": true,
+ "initial": true,
+ "entry": true,
+ "size": 1315562,
+ "names": [
+ "index"
+ ],
+ "files": [
+ "index.bundle.js"
+ ],
+ "hash": "235eb41a21132db1e2b8",
+ "siblings": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 7
+ ],
+ "parents": [],
+ "children": [],
+ "childrenByOrder": {},
+ "modules": [
+ {
+ "id": 0,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/utils.js",
+ "name": "./src/lib/utils.js",
+ "index": 18,
+ "index2": 17,
+ "size": 22613,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "issuerId": 52,
+ "issuerName": "./src/index.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ }
+ ],
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 1,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiManager.ts",
+ "module": "./src/lib/mtproto/apiManager.ts",
+ "moduleName": "./src/lib/mtproto/apiManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "27:16-35"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony side effect evaluation",
+ "userRequest": "./utils",
+ "loc": "1:0-65"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "347:32-36"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "369:11-25"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "400:8-22"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "428:10-24"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "441:10-24"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "459:10-24"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "470:10-24"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "472:10-24"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "485:18-32"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "492:12-26"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "517:56-70"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "523:82-96"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "543:10-24"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "545:10-24"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "566:10-24"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "572:65-79"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "573:10-24"
+ },
+ {
+ "moduleId": 3,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "module": "./src/lib/richtextprocessor.js",
+ "moduleName": "./src/lib/richtextprocessor.js",
+ "type": "harmony import specifier",
+ "userRequest": "./utils",
+ "loc": "583:12-26"
+ },
+ {
+ "moduleId": 4,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appUsersManager.ts",
+ "module": "./src/lib/appManagers/appUsersManager.ts",
+ "moduleName": "./src/lib/appManagers/appUsersManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "6:16-35"
+ },
+ {
+ "moduleId": 5,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/misc.ts",
+ "module": "./src/components/misc.ts",
+ "moduleName": "./src/components/misc.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/utils",
+ "loc": "7:16-39"
+ },
+ {
+ "moduleId": 10,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPeersManager.ts",
+ "module": "./src/lib/appManagers/appPeersManager.ts",
+ "moduleName": "./src/lib/appManagers/appPeersManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "8:16-35"
+ },
+ {
+ "moduleId": 11,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPhotosManager.ts",
+ "module": "./src/lib/appManagers/appPhotosManager.ts",
+ "moduleName": "./src/lib/appManagers/appPhotosManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "16:16-35"
+ },
+ {
+ "moduleId": 12,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appChatsManager.ts",
+ "module": "./src/lib/appManagers/appChatsManager.ts",
+ "moduleName": "./src/lib/appManagers/appChatsManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "6:16-35"
+ },
+ {
+ "moduleId": 14,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/scrollable.ts",
+ "module": "./src/components/scrollable.ts",
+ "moduleName": "./src/components/scrollable.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/utils",
+ "loc": "3:16-39"
+ },
+ {
+ "moduleId": 15,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMessagesManager.ts",
+ "module": "./src/lib/appManagers/appMessagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appMessagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "15:16-35"
+ },
+ {
+ "moduleId": 16,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/mtproto.ts",
+ "module": "./src/lib/mtproto/mtproto.ts",
+ "moduleName": "./src/lib/mtproto/mtproto.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "15:16-35"
+ },
+ {
+ "moduleId": 19,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appImManager.ts",
+ "module": "./src/lib/appManagers/appImManager.ts",
+ "moduleName": "./src/lib/appManagers/appImManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "23:16-35"
+ },
+ {
+ "moduleId": 20,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/lottieLoader.ts",
+ "module": "./src/lib/lottieLoader.ts",
+ "moduleName": "./src/lib/lottieLoader.ts",
+ "type": "cjs require",
+ "userRequest": "./utils",
+ "loc": "19:16-34"
+ },
+ {
+ "moduleId": 23,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/serverTimeManager.ts",
+ "module": "./src/lib/mtproto/serverTimeManager.ts",
+ "moduleName": "./src/lib/mtproto/serverTimeManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "7:16-35"
+ },
+ {
+ "moduleId": 26,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarLeft.ts",
+ "module": "./src/lib/appManagers/appSidebarLeft.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarLeft.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "20:16-35"
+ },
+ {
+ "moduleId": 27,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/apiUpdatesManager.ts",
+ "module": "./src/lib/appManagers/apiUpdatesManager.ts",
+ "moduleName": "./src/lib/appManagers/apiUpdatesManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "8:16-35"
+ },
+ {
+ "moduleId": 28,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appDialogsManager.ts",
+ "module": "./src/lib/appManagers/appDialogsManager.ts",
+ "moduleName": "./src/lib/appManagers/appDialogsManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "17:16-35"
+ },
+ {
+ "moduleId": 29,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/preloader.ts",
+ "module": "./src/components/preloader.ts",
+ "moduleName": "./src/components/preloader.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/utils",
+ "loc": "3:16-39"
+ },
+ {
+ "moduleId": 30,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/wrappers.ts",
+ "module": "./src/components/wrappers.ts",
+ "moduleName": "./src/components/wrappers.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/utils",
+ "loc": "20:16-39"
+ },
+ {
+ "moduleId": 35,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
+ "module": "./src/lib/tl_utils.ts",
+ "moduleName": "./src/lib/tl_utils.ts",
+ "type": "cjs require",
+ "userRequest": "./utils",
+ "loc": "17:16-34"
+ },
+ {
+ "moduleId": 36,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/timeManager.ts",
+ "module": "./src/lib/mtproto/timeManager.ts",
+ "moduleName": "./src/lib/mtproto/timeManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "7:16-35"
+ },
+ {
+ "moduleId": 37,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appProfileManager.ts",
+ "module": "./src/lib/appManagers/appProfileManager.ts",
+ "moduleName": "./src/lib/appManagers/appProfileManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "6:16-35"
+ },
+ {
+ "moduleId": 40,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "module": "./src/components/pageSignIn.ts",
+ "moduleName": "./src/components/pageSignIn.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/utils",
+ "loc": "17:16-39"
+ },
+ {
+ "moduleId": 44,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/authorizer.ts",
+ "module": "./src/lib/mtproto/authorizer.ts",
+ "moduleName": "./src/lib/mtproto/authorizer.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "19:16-35"
+ },
+ {
+ "moduleId": 45,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarRight.ts",
+ "module": "./src/lib/appManagers/appSidebarRight.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarRight.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "8:16-35"
+ },
+ {
+ "moduleId": 46,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMediaViewer.ts",
+ "module": "./src/lib/appManagers/appMediaViewer.ts",
+ "moduleName": "./src/lib/appManagers/appMediaViewer.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "14:16-35"
+ },
+ {
+ "moduleId": 48,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/lazyLoadQueue.ts",
+ "module": "./src/components/lazyLoadQueue.ts",
+ "moduleName": "./src/components/lazyLoadQueue.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/utils",
+ "loc": "12:16-39"
+ },
+ {
+ "moduleId": 49,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appWebPagesManager.ts",
+ "module": "./src/lib/appManagers/appWebPagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appWebPagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "6:16-35"
+ },
+ {
+ "moduleId": 52,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "module": "./src/index.ts",
+ "moduleName": "./src/index.ts",
+ "type": "cjs require",
+ "userRequest": "./lib/utils",
+ "loc": "23:16-38"
+ },
+ {
+ "moduleId": 68,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/networker.ts",
+ "module": "./src/lib/mtproto/networker.ts",
+ "moduleName": "./src/lib/mtproto/networker.ts",
+ "type": "cjs require",
+ "userRequest": "../utils",
+ "loc": "22:16-35"
+ },
+ {
+ "moduleId": 83,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/emoticonsDropdown.ts",
+ "module": "./src/components/emoticonsDropdown.ts",
+ "moduleName": "./src/components/emoticonsDropdown.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/utils",
+ "loc": "18:16-39"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": [
+ "dT",
+ "checkClick",
+ "isInDOM",
+ "checkDragEvent",
+ "cancelEvent",
+ "onCtrlEnter",
+ "setFieldSelection",
+ "getFieldSelection",
+ "getRichValue",
+ "placeCaretAtEnd",
+ "getRichValueWithCaret",
+ "getRichElementValue",
+ "setRichFocus",
+ "getSelectedText",
+ "$rootScope",
+ "langPack",
+ "_",
+ "isObject",
+ "tsNow",
+ "safeReplaceObject",
+ "numberWithCommas",
+ "findUpClassName",
+ "findUpTag",
+ "isElementInViewport",
+ "isScrolledIntoView",
+ "whichChild",
+ "copy",
+ "formatBytes",
+ "formatNumber",
+ "deepEqual",
+ "listMergeSorted",
+ "listUniqSorted",
+ "encodeEntities",
+ "calcImageInBox",
+ "countryCodeEmoji",
+ "unifiedCountryCodeEmoji",
+ "SearchIndexManager"
+ ],
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./src/components/emoticonsDropdown.ts (referenced with cjs require), ./src/components/lazyLoadQueue.ts (referenced with cjs require), ./src/components/misc.ts (referenced with cjs require), ./src/components/pageSignIn.ts (referenced with cjs require), ./src/components/preloader.ts (referenced with cjs require), ./src/components/scrollable.ts (referenced with cjs require), ./src/components/wrappers.ts (referenced with cjs require), ./src/index.ts (referenced with cjs require), ./src/lib/appManagers/apiUpdatesManager.ts (referenced with cjs require), ./src/lib/appManagers/appChatsManager.ts (referenced with cjs require), ./src/lib/appManagers/appDialogsManager.ts (referenced with cjs require), ./src/lib/appManagers/appImManager.ts (referenced with cjs require), ./src/lib/appManagers/appMediaViewer.ts (referenced with cjs require), ./src/lib/appManagers/appMessagesManager.ts (referenced with cjs require), ./src/lib/appManagers/appPeersManager.ts (referenced with cjs require), ./src/lib/appManagers/appPhotosManager.ts (referenced with cjs require), ./src/lib/appManagers/appProfileManager.ts (referenced with cjs require), ./src/lib/appManagers/appSidebarLeft.ts (referenced with cjs require), ./src/lib/appManagers/appSidebarRight.ts (referenced with cjs require), ./src/lib/appManagers/appUsersManager.ts (referenced with cjs require), ./src/lib/appManagers/appWebPagesManager.ts (referenced with cjs require), ./src/lib/lottieLoader.ts (referenced with cjs require), ./src/lib/mtproto/apiManager.ts (referenced with cjs require), ./src/lib/mtproto/authorizer.ts (referenced with cjs require), ./src/lib/mtproto/mtproto.ts (referenced with cjs require), ./src/lib/mtproto/networker.ts (referenced with cjs require), ./src/lib/mtproto/serverTimeManager.ts (referenced with cjs require), ./src/lib/mtproto/timeManager.ts (referenced with cjs require), ./src/lib/tl_utils.ts (referenced with cjs require)"
+ ],
+ "depth": 1,
+ "source": "/*!\r\n * Webogram v0.7.0 - messaging web application for MTProto\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\nvar _logTimer = (new Date()).getTime()\r\nexport function dT () {\r\n return '[' + (((new Date()).getTime() - _logTimer) / 1000).toFixed(3) + ']'\r\n}\r\n\r\nexport function checkClick (e, noprevent) {\r\n if (e.which == 1 && (e.ctrlKey || e.metaKey) || e.which == 2) {\r\n return true\r\n }\r\n\r\n if (!noprevent) {\r\n e.preventDefault()\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport function isInDOM (element, parentNode) {\r\n if (!element) {\r\n return false\r\n }\r\n parentNode = parentNode || document.body\r\n if (element == parentNode) {\r\n return true\r\n }\r\n return isInDOM(element.parentNode, parentNode)\r\n}\r\n\r\nexport function checkDragEvent(e) {\r\n if (!e || e.target && (e.target.tagName == 'IMG' || e.target.tagName == 'A')) return false\r\n if (e.dataTransfer && e.dataTransfer.types) {\r\n for (var i = 0; i < e.dataTransfer.types.length; i++) {\r\n if (e.dataTransfer.types[i] == 'Files') {\r\n return true\r\n }\r\n }\r\n } else {\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport function cancelEvent (event) {\r\n event = event || window.event\r\n if (event) {\r\n event = event.originalEvent || event\r\n\r\n if (event.stopPropagation) event.stopPropagation()\r\n if (event.preventDefault) event.preventDefault()\r\n event.returnValue = false\r\n event.cancelBubble = true\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport function onCtrlEnter (textarea, cb) {\r\n $(textarea).on('keydown', function (e) {\r\n if (e.keyCode == 13 && (e.ctrlKey || e.metaKey)) {\r\n cb()\r\n return cancelEvent(e)\r\n }\r\n })\r\n}\r\n\r\nexport function setFieldSelection (field, from, to) {\r\n field = $(field)[0]\r\n try {\r\n field.focus()\r\n if (from === undefined || from === false) {\r\n from = field.value.length\r\n }\r\n if (to === undefined || to === false) {\r\n to = from\r\n }\r\n if (field.createTextRange) {\r\n var range = field.createTextRange()\r\n range.collapse(true)\r\n range.moveEnd('character', to)\r\n range.moveStart('character', from)\r\n range.select()\r\n }\r\n else if (field.setSelectionRange) {\r\n field.setSelectionRange(from, to)\r\n }\r\n } catch(e) {}\r\n}\r\n\r\nexport function getFieldSelection (field) {\r\n if (field.selectionStart) {\r\n return field.selectionStart\r\n }\r\n else if (!document.selection) {\r\n return 0\r\n }\r\n\r\n var c = '\\x01'\r\n var sel = document.selection.createRange()\r\n var txt = sel.text\r\n var dup = sel.duplicate()\r\n var len = 0\r\n\r\n try {\r\n dup.moveToElementText(field)\r\n } catch(e) {\r\n return 0\r\n }\r\n\r\n sel.text = txt + c\r\n len = dup.text.indexOf(c)\r\n sel.moveStart('character', -1)\r\n sel.text = ''\r\n\r\n // if (browser.msie && len == -1) {\r\n // return field.value.length\r\n // }\r\n return len\r\n}\r\n\r\nexport function getRichValue (field) {\r\n if (!field) {\r\n return ''\r\n }\r\n var lines = []\r\n var line = []\r\n\r\n getRichElementValue(field, lines, line)\r\n if (line.length) {\r\n lines.push(line.join(''))\r\n }\r\n\r\n var value = lines.join('\\n')\r\n value = value.replace(/\\u00A0/g, ' ')\r\n\r\n return value\r\n}\r\n\r\nexport function placeCaretAtEnd(el) {\r\n el.focus();\r\n if (typeof window.getSelection != \"undefined\"\r\n && typeof document.createRange != \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else if (typeof document.body.createTextRange != \"undefined\") {\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n\r\nexport function getRichValueWithCaret (field) {\r\n if (!field) {\r\n return []\r\n }\r\n var lines = []\r\n var line = []\r\n\r\n var sel = window.getSelection ? window.getSelection() : false\r\n var selNode\r\n var selOffset\r\n if (sel && sel.rangeCount) {\r\n var range = sel.getRangeAt(0)\r\n /* if (range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n range.startOffset == range.endOffset) { */\r\n selNode = range.startContainer\r\n selOffset = range.startOffset\r\n //}\r\n }\r\n\r\n getRichElementValue(field, lines, line, selNode, selOffset)\r\n\r\n if (line.length) {\r\n lines.push(line.join(''))\r\n }\r\n\r\n var value = lines.join('\\n')\r\n var caretPos = value.indexOf('\\x01')\r\n if (caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1)\r\n }\r\n value = value.replace(/\\u00A0/g, ' ')\r\n\r\n return [value, caretPos]\r\n}\r\n\r\nexport function getRichElementValue (node, lines, line, selNode, selOffset) {\r\n if (node.nodeType == 3) { // TEXT\r\n if (selNode === node) {\r\n var value = node.nodeValue\r\n line.push(value.substr(0, selOffset) + '\\x01' + value.substr(selOffset))\r\n } else {\r\n line.push(node.nodeValue)\r\n }\r\n return\r\n }\r\n if (node.nodeType != 1) { // NON-ELEMENT\r\n return\r\n }\r\n var isSelected = (selNode === node)\r\n var isBlock = node.tagName == 'DIV' || node.tagName == 'P'\r\n var curChild\r\n if (isBlock && line.length || node.tagName == 'BR') {\r\n lines.push(line.join(''))\r\n line.splice(0, line.length)\r\n }\r\n else if (node.tagName == 'IMG') {\r\n if (node.alt) {\r\n line.push(node.alt)\r\n }\r\n }\r\n if (isSelected && !selOffset) {\r\n line.push('\\x01')\r\n }\r\n var curChild = node.firstChild\r\n while (curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset)\r\n curChild = curChild.nextSibling\r\n }\r\n if (isSelected && selOffset) {\r\n line.push('\\x01')\r\n }\r\n if (isBlock && line.length) {\r\n lines.push(line.join(''))\r\n line.splice(0, line.length)\r\n }\r\n}\r\n\r\nexport function setRichFocus (field, selectNode, noCollapse) {\r\n field.focus()\r\n if (selectNode &&\r\n selectNode.parentNode == field &&\r\n !selectNode.nextSibling &&\r\n !noCollapse) {\r\n field.removeChild(selectNode)\r\n selectNode = null\r\n }\r\n if (window.getSelection && document.createRange) {\r\n var range = document.createRange()\r\n if (selectNode) {\r\n range.selectNode(selectNode)\r\n } else {\r\n range.selectNodeContents(field)\r\n }\r\n if (!noCollapse) {\r\n range.collapse(false)\r\n }\r\n\r\n var sel = window.getSelection()\r\n sel.removeAllRanges()\r\n sel.addRange(range)\r\n }\r\n else if (document.body.createTextRange !== undefined) {\r\n var textRange = document.body.createTextRange()\r\n textRange.moveToElementText(selectNode || field)\r\n if (!noCollapse) {\r\n textRange.collapse(false)\r\n }\r\n textRange.select()\r\n }\r\n}\r\n\r\nexport function getSelectedText() {\r\n var sel = (\r\n window.getSelection && window.getSelection() ||\r\n document.getSelection && document.getSelection() ||\r\n document.selection && document.selection.createRange().text || ''\r\n ).toString().replace(/^\\s+|\\s+$/g, '')\r\n\r\n return sel\r\n}\r\n\r\n/* if (Config.Modes.animations &&\r\n typeof window.requestAnimationFrame == 'function') {\r\n window.onAnimationFrameCallback = function (cb) {\r\n return (function () {\r\n window.requestAnimationFrame(cb)\r\n })\r\n }\r\n} else {\r\n window.onAnimationFrameCallback = function (cb) {\r\n return cb\r\n }\r\n} */\r\n\r\nexport const $rootScope = {\r\n $broadcast: (name/* : string */, detail/*? : any */) => {\r\n ////console.log(dT(), 'Broadcasting ' + name + ' event, with args:', detail);\r\n //console.trace();\r\n let myCustomEvent = new CustomEvent(name, {detail});\r\n document.dispatchEvent(myCustomEvent);\r\n },\r\n $on: (name/* : string */, callback/* : any */) => {\r\n document.addEventListener(name, callback);\r\n },\r\n\r\n selectedPeerID: 0,\r\n idle: {\r\n isIDLE: false\r\n }\r\n};\r\n\r\nexport const langPack = {\r\n \"messageActionChatCreate\": \"created the group\",\r\n\t\"messageActionChatEditTitle\": \"changed group name\",\r\n\t\"messageActionChatEditPhoto\": \"changed group photo\",\r\n\t\"messageActionChatDeletePhoto\": \"removed group photo\",\r\n\t\"messageActionChatReturn\": \"returned to group\",\r\n\t\"messageActionChatJoined\": \"joined the group\",\r\n \"messageActionChatAddUser\": \"invited {user}\",\r\n \"messageActionChatAddUsers\": \"invited {} users\",\r\n\t\"messageActionChatLeave\": \"left group\",\r\n\t\"messageActionChatDeleteUser\": \"removed user\",\r\n\t\"messageActionChatJoinedByLink\": \"joined the group\",\r\n\t\"messageActionPinMessage\": \"pinned message\",\r\n\t\"messageActionChannelCreate\": \"Channel created\",\r\n\t\"messageActionChannelEditTitle\": \"Channel renamed\",\r\n\t\"messageActionChannelEditPhoto\": \"Channel photo updated\",\r\n \"messageActionChannelDeletePhoto\": \"Channel photo removed\",\r\n \"messageActionHistoryClear\": \"History cleared\",\r\n\r\n \"messageActionPhoneCall.in_ok\": \"Incoming Call\",\r\n\t\"messageActionPhoneCall.out_ok\": \"Outgoing Call\",\r\n\t\"messageActionPhoneCall.in_missed\": \"Missed Call\",\r\n\t\"messageActionPhoneCall.out_missed\": \"Cancelled Call\",\r\n};\r\n\r\nexport const _ = (str/* : string */) => {\r\n str = str.replace('_raw', '');\r\n\r\n return langPack[str] ? langPack[str] : str;\r\n};\r\n\r\nexport function isObject(object) {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function tsNow (seconds) {\r\n var t = +new Date() + (window.tsOffset || 0)\r\n return seconds ? Math.floor(t / 1000) : t\r\n}\r\n\r\nexport function safeReplaceObject (wasObject, newObject) {\r\n for (var key in wasObject) {\r\n if (!newObject.hasOwnProperty(key) && key.charAt(0) != '$') {\r\n delete wasObject[key]\r\n }\r\n }\r\n for (var key in newObject) {\r\n if (newObject.hasOwnProperty(key)) {\r\n wasObject[key] = newObject[key]\r\n }\r\n }\r\n}\r\n\r\nexport function numberWithCommas(x) {\r\n var parts = x.toString().split(\".\");\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n return parts.join(\".\");\r\n}\r\n\r\nexport function findUpClassName(el, className) {\r\n if(el.classList.contains(className)) return el; // 03.02.2020\r\n\r\n while(el.parentNode) {\r\n el = el.parentNode;\r\n if(el.classList.contains(className)) \r\n return el;\r\n }\r\n return null;\r\n}\r\n\r\nexport function findUpTag(el, tag) {\r\n if(el.tagName == tag) return el; // 03.02.2020\r\n\r\n while(el.parentNode) {\r\n el = el.parentNode;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null;\r\n}\r\n\r\nexport function isElementInViewport(el) {\r\n var rect = el.getBoundingClientRect(),\r\n vWidth = window.innerWidth || document.documentElement.clientWidth,\r\n vHeight = window.innerHeight || document.documentElement.clientHeight,\r\n efp = function(x, y) { return document.elementFromPoint(x, y) }; \r\n\r\n // Return false if it's not in the viewport\r\n if(rect.right < 0 || rect.bottom < 0 \r\n || rect.left > vWidth || rect.top > vHeight \r\n || !rect.width || !rect.height) {\r\n return false;\r\n }\r\n\r\n let elements = [\r\n efp(rect.left + 1, rect.top + 1),\r\n efp(rect.right - 1, rect.top + 1),\r\n efp(rect.right - 1, rect.bottom - 1),\r\n efp(rect.left + 1, rect.bottom - 1)\r\n ];\r\n\r\n // Return true if any of its four corners are visible\r\n return elements.find(e => el.contains(e) || el.parentElement == e) !== undefined;\r\n}\r\n\r\nexport function isScrolledIntoView(el) {\r\n var rect = el.getBoundingClientRect();\r\n var elemTop = rect.top;\r\n var elemBottom = rect.bottom;\r\n\r\n // Only completely visible elements return true:\r\n //var isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight);\r\n // Partially visible elements return true:\r\n var isVisible = elemTop < window.innerHeight && elemBottom >= 0;\r\n return isVisible;\r\n}\r\n\r\n/* export function isScrolledIntoView(el) {\r\n var rect = el.getBoundingClientRect(), top = rect.top, height = rect.height, \r\n el = el.parentNode\r\n // Check if bottom of the element is off the page\r\n if (rect.bottom < 0) return false\r\n // Check its within the document viewport\r\n if (top > document.documentElement.clientHeight) return false\r\n do {\r\n rect = el.getBoundingClientRect()\r\n if (top <= rect.bottom === false) return false\r\n // Check if the element is out of view due to a container scrolling\r\n if ((top + height) <= rect.top) return false\r\n el = el.parentNode\r\n } while (el != document.body)\r\n return true\r\n}; */\r\n\r\nexport function whichChild(elem/* : Node */) {\r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) != null) ++i;\r\n return i;\r\n};\r\n\r\nexport function copy(obj) {\r\n //in case of premitives\r\n if(obj===null || typeof obj !== \"object\"){\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date){\r\n return new Date(obj.getTime());\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)){\r\n var clonedArr = [];\r\n obj.forEach(function(element){\r\n clonedArr.push(copy(element))\r\n });\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj){\r\n if(obj.hasOwnProperty(prop)){\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\n/* export function ripple(elem) {\r\n elem.addEventListener('mousedown', function(e) {\r\n let rect = this.getBoundingClientRect();\r\n\r\n const startTime = Date.now();\r\n const animationTime = 350;\r\n\r\n let X = e.clientX - rect.left;\r\n let Y = e.clientY - rect.top;\r\n let rippleDiv = document.createElement(\"div\");\r\n rippleDiv.classList.add(\"ripple\");\r\n rippleDiv.setAttribute(\"style\", \"top:\" + Y + \"px; left:\" + X + \"px;\");\r\n this.appendChild(rippleDiv);\r\n\r\n elem.addEventListener('mouseup', () => {\r\n let elapsed = Date.now() - startTime;\r\n\r\n setTimeout(() => {\r\n rippleDiv.parentElement.removeChild(rippleDiv);\r\n }, elapsed < animationTime ? animationTime - elapsed : 0);\r\n }, {once: true});\r\n });\r\n}; */\r\n\r\nexport function formatBytes(bytes, decimals = 2) {\r\n if (bytes === 0) return '0 Bytes';\r\n\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n}\r\n\r\nexport function formatNumber(bytes, decimals = 2) {\r\n if(bytes === 0) return '0';\r\n\r\n const k = 1000;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['', 'K', 'M', 'B', 'T'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\r\n}\r\n\r\nexport function deepEqual(x, y) {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function listMergeSorted (list1, list2) {\r\n list1 = list1 || []\r\n list2 = list2 || []\r\n\r\n var result = copy(list1);\r\n\r\n var minID = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF\r\n for (var i = 0; i < list2.length; i++) {\r\n if (list2[i] < minID) {\r\n result.push(list2[i])\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport function listUniqSorted (list) {\r\n list = list || []\r\n var resultList = []\r\n var prev = false\r\n for (var i = 0; i < list.length; i++) {\r\n if (list[i] !== prev) {\r\n resultList.push(list[i])\r\n }\r\n prev = list[i]\r\n }\r\n\r\n return resultList\r\n}\r\n\r\nexport function encodeEntities (value) {\r\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, function (value) {\r\n var hi = value.charCodeAt(0)\r\n var low = value.charCodeAt(1)\r\n return '' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';'\r\n }).replace(/([^\\#-~| |!])/g, function (value) { // non-alphanumeric\r\n return '' + value.charCodeAt(0) + ';'\r\n }).replace(//g, '>')\r\n}\r\n\r\nexport function calcImageInBox (imageW, imageH, boxW, boxH, noZooom) {\r\n if(imageW < boxW && imageH < boxH) {\r\n return {w: imageW, h: imageH};\r\n }\r\n\r\n var boxedImageW = boxW\r\n var boxedImageH = boxH\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = parseInt(imageH * boxW / imageW)\r\n } else {\r\n boxedImageW = parseInt(imageW * boxH / imageH)\r\n if(boxedImageW > boxW) {\r\n boxedImageH = parseInt(boxedImageH * boxW / boxedImageW)\r\n boxedImageW = boxW\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZooom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW\r\n boxedImageH = imageH\r\n }\r\n\r\n return {w: boxedImageW, h: boxedImageH}\r\n}\r\n\r\n/**\r\n * emojiUnicode\r\n * Get the unicode code of an emoji in base 16.\r\n *\r\n * @name emojiUnicode\r\n * @function\r\n * @param {String} input The emoji character.\r\n * @returns {String} The base 16 unicode code.\r\n */\r\n/* export function emojiUnicode (input) {\r\n let pairs = emojiUnicode.raw(input).split(' ').map(val => parseInt(val).toString(16));\r\n if(pairs[0].length == 2) pairs[0] = '00' + pairs[0];\r\n return pairs.join('-').toUpperCase();\r\n} */\r\n\r\n/**\r\n* emojiunicode.raw\r\n* Get the unicode code points of an emoji in base 16.\r\n*\r\n* @name emojiunicode.raw\r\n* @function\r\n* @param {String} input The emoji character.\r\n* @returns {String} The unicode code points.\r\n*/\r\n/* emojiUnicode.raw = function (input) {\r\n if(input.length === 1) {\r\n return input.charCodeAt(0).toString();\r\n } else if(input.length > 1) {\r\n const pairs = [];\r\n for(var i = 0; i < input.length; i++) {\r\n // high surrogate\r\n if(input.charCodeAt(i) >= 0xd800 && input.charCodeAt(i) <= 0xdbff) {\r\n if(input.charCodeAt(i + 1) >= 0xdc00 && input.charCodeAt(i + 1) <= 0xdfff) {\r\n // low surrogate\r\n pairs.push(\r\n (input.charCodeAt(i) - 0xd800) * 0x400\r\n + (input.charCodeAt(i + 1) - 0xdc00) + 0x10000\r\n );\r\n }\r\n } else if (input.charCodeAt(i) < 0xd800 || input.charCodeAt(i) > 0xdfff) {\r\n // modifiers and joiners\r\n pairs.push(input.charCodeAt(i))\r\n }\r\n }\r\n\r\n return pairs.join(' ');\r\n }\r\n\r\n return '';\r\n}; */\r\n\r\n// country code regex\r\nconst CC_REGEX = /^[a-z]{2}$/i;\r\n\r\n// offset between uppercase ascii and regional indicator symbols\r\nconst OFFSET = 127397;\r\n\r\n/**\r\n * convert country code to corresponding emoji flag\r\n * @param {string} cc - country code string\r\n * @returns {string} country code emoji\r\n */\r\nexport function countryCodeEmoji(cc/* : string */) {\r\n if(!CC_REGEX.test(cc)) {\r\n const type = typeof cc;\r\n throw new TypeError(\r\n `cc argument must be an ISO 3166-1 alpha-2 string, but got '${\r\n type === 'string' ? cc : type\r\n }' instead.`,\r\n );\r\n }\r\n\r\n const chars = [...cc.toUpperCase()].map(c => c.charCodeAt(0) + OFFSET);\r\n //console.log(chars);\r\n return String.fromCodePoint(...chars);\r\n}\r\n\r\nexport function unifiedCountryCodeEmoji(cc/* : string */) {\r\n if(!CC_REGEX.test(cc)) {\r\n const type = typeof cc;\r\n throw new TypeError(\r\n `cc argument must be an ISO 3166-1 alpha-2 string, but got '${\r\n type === 'string' ? cc : type\r\n }' instead.`,\r\n );\r\n }\r\n\r\n const chars = [...cc.toUpperCase()].map(c => c.charCodeAt(0) + OFFSET);\r\n return chars.map(c => c.toString(16).toUpperCase()).join('-');\r\n}\r\n\r\nfunction versionCompare (ver1, ver2) {\r\n if (typeof ver1 !== 'string') {\r\n ver1 = ''\r\n }\r\n if (typeof ver2 !== 'string') {\r\n ver2 = ''\r\n }\r\n ver1 = ver1.replace(/^\\s+|\\s+$/g, '').split('.')\r\n ver2 = ver2.replace(/^\\s+|\\s+$/g, '').split('.')\r\n\r\n var a = Math.max(ver1.length, ver2.length), i\r\n\r\n for (i = 0; i < a; i++) {\r\n if (ver1[i] == ver2[i]) {\r\n continue\r\n }\r\n if (ver1[i] > ver2[i]) {\r\n return 1\r\n } else {\r\n return -1\r\n }\r\n }\r\n\r\n return 0\r\n}\r\n\r\n\r\n var badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<\\s]+/g,\r\n trimRe = /^\\s+|\\s$/g\r\n\r\n function createIndex () {\r\n return {\r\n shortIndexes: {},\r\n fullTexts: {}\r\n }\r\n }\r\n\r\n function cleanSearchText (text) {\r\n var hasTag = text.charAt(0) == '%'\r\n text = text.replace(badCharsRe, ' ').replace(trimRe, '')\r\n text = text.replace(/[^A-Za-z0-9]/g, function (ch) {\r\n var latinizeCh = Config.LatinizeMap[ch]\r\n return latinizeCh !== undefined ? latinizeCh : ch\r\n })\r\n text = text.toLowerCase()\r\n if (hasTag) {\r\n text = '%' + text\r\n }\r\n\r\n return text\r\n }\r\n\r\n function cleanUsername (username) {\r\n return username && username.toLowerCase() || ''\r\n }\r\n\r\n function indexObject (id, searchText, searchIndex) {\r\n if (searchIndex.fullTexts[id] !== undefined) {\r\n return false\r\n }\r\n\r\n searchText = cleanSearchText(searchText)\r\n\r\n if (!searchText.length) {\r\n return false\r\n }\r\n\r\n var shortIndexes = searchIndex.shortIndexes\r\n\r\n searchIndex.fullTexts[id] = searchText\r\n\r\n searchText.split(' ').forEach(function(searchWord) {\r\n var len = Math.min(searchWord.length, 3),\r\n wordPart, i\r\n for (i = 1; i <= len; i++) {\r\n wordPart = searchWord.substr(0, i)\r\n if (shortIndexes[wordPart] === undefined) {\r\n shortIndexes[wordPart] = [id]\r\n } else {\r\n shortIndexes[wordPart].push(id)\r\n }\r\n }\r\n })\r\n }\r\n\r\n function search (query, searchIndex) {\r\n var shortIndexes = searchIndex.shortIndexes\r\n var fullTexts = searchIndex.fullTexts\r\n\r\n query = cleanSearchText(query)\r\n\r\n var queryWords = query.split(' ')\r\n var foundObjs = false,\r\n newFoundObjs, i\r\n var j, searchText\r\n var found\r\n\r\n for (i = 0; i < queryWords.length; i++) {\r\n newFoundObjs = shortIndexes[queryWords[i].substr(0, 3)]\r\n if (!newFoundObjs) {\r\n foundObjs = []\r\n break\r\n }\r\n if (foundObjs === false || foundObjs.length > newFoundObjs.length) {\r\n foundObjs = newFoundObjs\r\n }\r\n }\r\n\r\n newFoundObjs = {}\r\n\r\n for (j = 0; j < foundObjs.length; j++) {\r\n found = true\r\n searchText = fullTexts[foundObjs[j]]\r\n for (i = 0; i < queryWords.length; i++) {\r\n if (searchText.indexOf(queryWords[i]) == -1) {\r\n found = false\r\n break\r\n }\r\n }\r\n if (found) {\r\n newFoundObjs[foundObjs[j]] = true\r\n }\r\n }\r\n\r\n return newFoundObjs\r\n }\r\n\r\n let SearchIndexManager = {\r\n createIndex: createIndex,\r\n indexObject: indexObject,\r\n cleanSearchText: cleanSearchText,\r\n cleanUsername: cleanUsername,\r\n search: search\r\n };\r\n window.SearchIndexManager = SearchIndexManager;\r\n\r\n export {SearchIndexManager};\r\n//})(window)\r\n"
+ },
+ {
+ "id": 1,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiManager.ts",
+ "name": "./src/lib/mtproto/apiManager.ts",
+ "index": 23,
+ "index2": 47,
+ "size": 15303,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "issuerId": 40,
+ "issuerName": "./src/components/pageSignIn.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 40,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "name": "./src/components/pageSignIn.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ }
+ ],
+ "profile": {
+ "factory": 392,
+ "building": 505,
+ "dependencies": 2
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 4,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appUsersManager.ts",
+ "module": "./src/lib/appManagers/appUsersManager.ts",
+ "moduleName": "./src/lib/appManagers/appUsersManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiManager",
+ "loc": "9:37-69"
+ },
+ {
+ "moduleId": 5,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/misc.ts",
+ "module": "./src/components/misc.ts",
+ "moduleName": "./src/components/misc.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/mtproto/apiManager",
+ "loc": "6:37-73"
+ },
+ {
+ "moduleId": 9,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiFileManager.ts",
+ "module": "./src/lib/mtproto/apiFileManager.ts",
+ "moduleName": "./src/lib/mtproto/apiFileManager.ts",
+ "type": "cjs require",
+ "userRequest": "./apiManager",
+ "loc": "18:37-60"
+ },
+ {
+ "moduleId": 11,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPhotosManager.ts",
+ "module": "./src/lib/appManagers/appPhotosManager.ts",
+ "moduleName": "./src/lib/appManagers/appPhotosManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiManager",
+ "loc": "20:37-69"
+ },
+ {
+ "moduleId": 15,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMessagesManager.ts",
+ "module": "./src/lib/appManagers/appMessagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appMessagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiManager",
+ "loc": "32:37-69"
+ },
+ {
+ "moduleId": 16,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/mtproto.ts",
+ "module": "./src/lib/mtproto/mtproto.ts",
+ "moduleName": "./src/lib/mtproto/mtproto.ts",
+ "type": "cjs require",
+ "userRequest": "./apiManager",
+ "loc": "23:37-60"
+ },
+ {
+ "moduleId": 19,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appImManager.ts",
+ "module": "./src/lib/appManagers/appImManager.ts",
+ "moduleName": "./src/lib/appManagers/appImManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiManager",
+ "loc": "22:37-69"
+ },
+ {
+ "moduleId": 27,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/apiUpdatesManager.ts",
+ "module": "./src/lib/appManagers/apiUpdatesManager.ts",
+ "moduleName": "./src/lib/appManagers/apiUpdatesManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiManager",
+ "loc": "6:37-69"
+ },
+ {
+ "moduleId": 28,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appDialogsManager.ts",
+ "module": "./src/lib/appManagers/appDialogsManager.ts",
+ "moduleName": "./src/lib/appManagers/appDialogsManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiManager",
+ "loc": "15:37-69"
+ },
+ {
+ "moduleId": 37,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appProfileManager.ts",
+ "module": "./src/lib/appManagers/appProfileManager.ts",
+ "moduleName": "./src/lib/appManagers/appProfileManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiManager",
+ "loc": "15:37-69"
+ },
+ {
+ "moduleId": 38,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appStickersManager.ts",
+ "module": "./src/lib/appManagers/appStickersManager.ts",
+ "moduleName": "./src/lib/appManagers/appStickersManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiManager",
+ "loc": "16:37-69"
+ },
+ {
+ "moduleId": 40,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "module": "./src/components/pageSignIn.ts",
+ "moduleName": "./src/components/pageSignIn.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/mtproto/apiManager",
+ "loc": "19:37-73"
+ },
+ {
+ "moduleId": 41,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/passwordManager.ts",
+ "module": "./src/lib/mtproto/passwordManager.ts",
+ "moduleName": "./src/lib/mtproto/passwordManager.ts",
+ "type": "cjs require",
+ "userRequest": "./apiManager",
+ "loc": "15:37-60"
+ },
+ {
+ "moduleId": 77,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
+ "module": "./src/components/pageAuthCode.ts",
+ "moduleName": "./src/components/pageAuthCode.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/mtproto/apiManager",
+ "loc": "21:37-73"
+ },
+ {
+ "moduleId": 78,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
+ "module": "./src/components/pageSignUp.ts",
+ "moduleName": "./src/components/pageSignUp.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/mtproto/apiManager",
+ "loc": "11:37-73"
+ },
+ {
+ "moduleId": 83,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/emoticonsDropdown.ts",
+ "module": "./src/components/emoticonsDropdown.ts",
+ "moduleName": "./src/components/emoticonsDropdown.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/mtproto/apiManager",
+ "loc": "21:37-73"
+ },
+ {
+ "moduleId": 84,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
+ "module": "./src/components/pagePassword.ts",
+ "moduleName": "./src/components/pagePassword.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/mtproto/apiManager",
+ "loc": "20:37-73"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 2,
+ "source": "\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst storage_1 = __importDefault(require(\"../storage\"));\nconst bin_utils_1 = require(\"../bin_utils\");\nconst networkerFactory_1 = __importDefault(require(\"./networkerFactory\"));\nconst mtproto_1 = require(\"./mtproto\");\nconst authorizer_1 = __importDefault(require(\"./authorizer\"));\nconst utils_1 = require(\"../utils\");\nconst Config = __importStar(require(\"../config\"));\nconst dcConfigurator_1 = __importDefault(require(\"./dcConfigurator\"));\nconst http_1 = __importDefault(require(\"./transports/http\"));\nconst polyfill_1 = require(\"../polyfill\");\nclass ApiManager {\n constructor() {\n //MtpSingleInstanceService.start();\n this.cachedNetworkers = {};\n this.cachedUploadNetworkers = {};\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcID = 0;\n this.telegramMeNotified = false;\n this.log = polyfill_1.logger('API');\n /* AppStorage.get('dc').then((dcID) => {\n if(dcID) {\n this.baseDcID = dcID;\n }\n }); */\n }\n telegramMeNotify(newValue) {\n if (this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n mtproto_1.telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n }\n // mtpSetUserAuth\n setUserAuth(userAuth) {\n var fullUserAuth = Object.assign({ dcID: this.baseDcID }, userAuth);\n storage_1.default.set({\n dc: this.baseDcID,\n user_auth: fullUserAuth\n });\n this.telegramMeNotify(true);\n utils_1.$rootScope.$broadcast('user_auth', fullUserAuth);\n }\n // mtpLogOut\n logOut() {\n return __awaiter(this, void 0, void 0, function* () {\n let storageKeys = [];\n let prefix = Config.Modes.test ? 't_dc' : 'dc';\n for (let dcID = 1; dcID <= 5; dcID++) {\n storageKeys.push(prefix + dcID + '_auth_key');\n //storageKeys.push('dc' + dcID + '_auth_keyID');\n //storageKeys.push('t_dc' + dcID + '_auth_key');\n //storageKeys.push('t_dc' + dcID + '_auth_keyID');\n }\n // WebPushApiManager.forceUnsubscribe(); // WARNING\n let storageResult = yield storage_1.default.get(storageKeys);\n let logoutPromises = [];\n for (let i = 0; i < storageResult.length; i++) {\n if (storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, { dcID: i + 1, ignoreErrors: true }));\n }\n }\n return Promise.all(logoutPromises).then(() => {\n storage_1.default.remove('dc', 'user_auth', 'stickerSets');\n this.baseDcID = 0;\n this.telegramMeNotify(false);\n return this.mtpClearStorage();\n }, (error) => {\n storageKeys.push('dc', 'user_auth', 'stickerSets');\n storage_1.default.remove(storageKeys);\n this.baseDcID = 0;\n error.handled = true;\n this.telegramMeNotify(false);\n return this.mtpClearStorage();\n });\n });\n }\n mtpClearStorage() {\n var saveKeys = ['user_auth', 't_user_auth', 'dc', 't_dc'];\n for (var dcID = 1; dcID <= 5; dcID++) {\n saveKeys.push('dc' + dcID + '_auth_key');\n saveKeys.push('dc' + dcID + '_auth_keyID');\n saveKeys.push('dc' + dcID + '_server_salt'); // new\n saveKeys.push('t_dc' + dcID + '_auth_key');\n saveKeys.push('t_dc' + dcID + '_auth_keyID');\n saveKeys.push('t_dc' + dcID + '_server_salt'); // new\n }\n storage_1.default.noPrefix();\n storage_1.default.get(saveKeys).then((values) => {\n storage_1.default.clear().then(() => {\n var restoreObj = {};\n saveKeys.forEach((key, i) => {\n var value = values[i];\n if (value !== false && value !== undefined) {\n restoreObj[key] = value;\n }\n });\n storage_1.default.noPrefix();\n return storage_1.default.set(restoreObj);\n });\n });\n }\n // mtpGetNetworker\n getNetworker(dcID, options = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n let upload = (options.fileUpload || options.fileDownload)\n && (dcConfigurator_1.default.chooseServer(dcID, true) instanceof http_1.default || Config.Modes.multipleConnections);\n let cache = upload ? this.cachedUploadNetworkers : this.cachedNetworkers;\n if (!dcID) {\n throw new Error('get Networker without dcID');\n }\n if (cache[dcID] !== undefined) {\n return cache[dcID];\n }\n let getKey = dcID + '-' + +upload;\n if (this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n return this.gettingNetworkers[getKey] = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n var ak = 'dc' + dcID + '_auth_key';\n var akID = 'dc' + dcID + '_auth_keyID';\n var ss = 'dc' + dcID + '_server_salt';\n let result = yield storage_1.default.get([ak, akID, ss]);\n let [authKeyHex, authKeyIDHex, serverSaltHex] = result;\n if (authKeyHex && !authKeyIDHex && serverSaltHex) {\n this.log.warn('Updating to new version (+akID)');\n yield storage_1.default.remove(ak, akID, ss);\n authKeyHex = serverSaltHex = '';\n }\n if (authKeyHex && authKeyHex.length == 512) {\n if (!serverSaltHex || serverSaltHex.length != 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n var authKey = bin_utils_1.bytesFromHex(authKeyHex);\n var authKeyID = new Uint8Array(bin_utils_1.bytesFromHex(authKeyIDHex));\n var serverSalt = bin_utils_1.bytesFromHex(serverSaltHex);\n resolve(cache[dcID] = networkerFactory_1.default.getNetworker(dcID, authKey, authKeyID, serverSalt, options));\n }\n else\n try {\n let auth = yield authorizer_1.default.auth(dcID);\n let storeObj = {\n [ak]: bin_utils_1.bytesToHex(auth.authKey),\n [akID]: auth.authKeyID.hex,\n [ss]: bin_utils_1.bytesToHex(auth.serverSalt)\n };\n storage_1.default.set(storeObj);\n resolve(cache[dcID] = networkerFactory_1.default.getNetworker(dcID, auth.authKey, auth.authKeyID, auth.serverSalt, options));\n }\n catch (error) {\n this.log('Get networker error', error, error.stack);\n reject(error);\n }\n delete this.gettingNetworkers[getKey];\n }));\n });\n }\n // mtpInvokeApi\n invokeApi(method, params = {}, options = {}) {\n ///////this.log('Invoke api', method, params, options);\n return new Promise((resolve, reject) => {\n let rejectPromise = (error) => {\n if (!error) {\n error = { type: 'ERROR_EMPTY' };\n }\n else if (!utils_1.isObject(error)) {\n error = { message: error };\n }\n reject(error);\n if (options.ignoreErrors) {\n return;\n }\n if (error.code == 406) {\n error.handled = true;\n }\n if (!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if (!error.handled) {\n if (error.code == 401) {\n // @ts-ignore WARNING!\n this.logOut().finally(() => {\n if (location.protocol == 'http:' &&\n !Config.Modes.http &&\n Config.App.domains.indexOf(location.hostname) != -1) {\n location.href = location.href.replace(/^http:/, 'https:');\n }\n else {\n location.hash = '/login';\n // AppRuntimeManager.reload(); // WARNING\n }\n });\n }\n else {\n // ErrorService.show({error: error}); // WARNING\n }\n error.handled = true;\n }\n }, 100);\n }\n };\n var dcID;\n var cachedNetworker;\n var stack = (new Error()).stack || 'empty stack';\n var performRequest = (networker) => {\n return (cachedNetworker = networker)\n .wrapApiCall(method, params, options)\n .then(resolve, (error) => {\n this.log.error('Error', error.code, error.type, this.baseDcID, dcID);\n if (error.code == 401 && this.baseDcID == dcID) {\n storage_1.default.remove('dc', 'user_auth');\n this.telegramMeNotify(false);\n rejectPromise(error);\n }\n else if (error.code == 401 && this.baseDcID && dcID != this.baseDcID) {\n if (this.cachedExportPromise[dcID] === undefined) {\n let promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', { dc_id: dcID }, { noErrorBox: true }).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, { dcID: dcID, noErrorBox: true }).then(exportResolve, exportReject);\n }, exportReject);\n });\n this.cachedExportPromise[dcID] = promise;\n }\n this.cachedExportPromise[dcID].then(() => {\n (cachedNetworker = networker).wrapApiCall(method, params, options).then(resolve, rejectPromise);\n }, rejectPromise);\n }\n else if (error.code == 303) {\n var newDcID = error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2];\n if (newDcID != dcID) {\n if (options.dcID) {\n options.dcID = newDcID;\n }\n else {\n storage_1.default.set({ dc: this.baseDcID = newDcID });\n }\n this.getNetworker(newDcID, options).then((networker) => {\n networker.wrapApiCall(method, params, options).then(resolve, rejectPromise);\n }, rejectPromise);\n }\n }\n else if (!options.rawError && error.code == 420) {\n var waitTime = error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 10;\n if (waitTime > (options.timeout || 60)) {\n return rejectPromise(error);\n }\n setTimeout(() => {\n performRequest(cachedNetworker);\n }, (waitTime + 5) * 1000); // 03.02.2020\n }\n else if (!options.rawError && (error.code == 500 || error.type == 'MSG_WAIT_FAILED')) {\n var now = utils_1.tsNow();\n if (options.stopTime) {\n if (now >= options.stopTime) {\n return rejectPromise(error);\n }\n }\n else {\n options.stopTime = now + (options.timeout !== undefined ? options.timeout : 10) * 1000;\n }\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n setTimeout(() => {\n performRequest(cachedNetworker);\n }, options.waitTime * 1000);\n }\n else {\n rejectPromise(error);\n }\n });\n };\n if (dcID = (options.dcID || this.baseDcID)) {\n this.getNetworker(dcID, options).then(performRequest, rejectPromise);\n }\n else {\n storage_1.default.get('dc').then((baseDcID) => {\n this.getNetworker(this.baseDcID = dcID = baseDcID || Config.App.baseDcID, options).then(performRequest, rejectPromise);\n });\n }\n });\n }\n // mtpGetUserID\n getUserID() {\n return storage_1.default.get('user_auth').then((auth) => {\n this.telegramMeNotify(auth && auth.id > 0 || false);\n return auth.id || 0;\n });\n }\n}\nexports.ApiManager = ApiManager;\nexports.default = new ApiManager();\n"
+ },
+ {
+ "id": 2,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
+ "name": "./src/lib/bin_utils.ts",
+ "index": 24,
+ "index2": 22,
+ "size": 10929,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiManager.ts",
+ "issuerId": 1,
+ "issuerName": "./src/lib/mtproto/apiManager.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 40,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "name": "./src/components/pageSignIn.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ },
+ {
+ "id": 1,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiManager.ts",
+ "name": "./src/lib/mtproto/apiManager.ts",
+ "profile": {
+ "factory": 392,
+ "building": 505,
+ "dependencies": 2
+ }
+ }
+ ],
+ "profile": {
+ "factory": 196,
+ "building": 1089,
+ "dependencies": 820
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 1,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiManager.ts",
+ "module": "./src/lib/mtproto/apiManager.ts",
+ "moduleName": "./src/lib/mtproto/apiManager.ts",
+ "type": "cjs require",
+ "userRequest": "../bin_utils",
+ "loc": "23:20-43"
+ },
+ {
+ "moduleId": 7,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto/cryptoworker.ts",
+ "module": "./src/lib/crypto/cryptoworker.ts",
+ "moduleName": "./src/lib/crypto/cryptoworker.ts",
+ "type": "cjs require",
+ "userRequest": "../bin_utils",
+ "loc": "10:20-43"
+ },
+ {
+ "moduleId": 8,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/polyfill.ts",
+ "module": "./src/lib/polyfill.ts",
+ "moduleName": "./src/lib/polyfill.ts",
+ "type": "cjs require",
+ "userRequest": "./bin_utils",
+ "loc": "3:20-42"
+ },
+ {
+ "moduleId": 9,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiFileManager.ts",
+ "module": "./src/lib/mtproto/apiFileManager.ts",
+ "moduleName": "./src/lib/mtproto/apiFileManager.ts",
+ "type": "cjs require",
+ "userRequest": "../bin_utils",
+ "loc": "15:20-43"
+ },
+ {
+ "moduleId": 11,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPhotosManager.ts",
+ "module": "./src/lib/appManagers/appPhotosManager.ts",
+ "moduleName": "./src/lib/appManagers/appPhotosManager.ts",
+ "type": "cjs require",
+ "userRequest": "../bin_utils",
+ "loc": "18:20-43"
+ },
+ {
+ "moduleId": 15,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMessagesManager.ts",
+ "module": "./src/lib/appManagers/appMessagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appMessagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "../bin_utils",
+ "loc": "20:20-43"
+ },
+ {
+ "moduleId": 24,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/filemanager.ts",
+ "module": "./src/lib/filemanager.ts",
+ "moduleName": "./src/lib/filemanager.ts",
+ "type": "cjs require",
+ "userRequest": "./bin_utils",
+ "loc": "15:20-42"
+ },
+ {
+ "moduleId": 34,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/transports/http.ts",
+ "module": "./src/lib/mtproto/transports/http.ts",
+ "moduleName": "./src/lib/mtproto/transports/http.ts",
+ "type": "cjs require",
+ "userRequest": "../../bin_utils",
+ "loc": "7:20-46"
+ },
+ {
+ "moduleId": 35,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
+ "module": "./src/lib/tl_utils.ts",
+ "moduleName": "./src/lib/tl_utils.ts",
+ "type": "cjs require",
+ "userRequest": "./bin_utils",
+ "loc": "16:20-42"
+ },
+ {
+ "moduleId": 36,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/timeManager.ts",
+ "module": "./src/lib/mtproto/timeManager.ts",
+ "moduleName": "./src/lib/mtproto/timeManager.ts",
+ "type": "cjs require",
+ "userRequest": "../bin_utils",
+ "loc": "8:20-43"
+ },
+ {
+ "moduleId": 41,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/passwordManager.ts",
+ "module": "./src/lib/mtproto/passwordManager.ts",
+ "moduleName": "./src/lib/mtproto/passwordManager.ts",
+ "type": "cjs require",
+ "userRequest": "../bin_utils",
+ "loc": "16:20-43"
+ },
+ {
+ "moduleId": 43,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/rsaKeysManager.ts",
+ "module": "./src/lib/mtproto/rsaKeysManager.ts",
+ "moduleName": "./src/lib/mtproto/rsaKeysManager.ts",
+ "type": "cjs require",
+ "userRequest": "../bin_utils",
+ "loc": "16:20-43"
+ },
+ {
+ "moduleId": 44,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/authorizer.ts",
+ "module": "./src/lib/mtproto/authorizer.ts",
+ "moduleName": "./src/lib/mtproto/authorizer.ts",
+ "type": "cjs require",
+ "userRequest": "../bin_utils",
+ "loc": "17:20-43"
+ },
+ {
+ "moduleId": 68,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/networker.ts",
+ "module": "./src/lib/mtproto/networker.ts",
+ "moduleName": "./src/lib/mtproto/networker.ts",
+ "type": "cjs require",
+ "userRequest": "../bin_utils",
+ "loc": "23:20-43"
+ },
+ {
+ "moduleId": 73,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/transports/abridged.ts",
+ "module": "./src/lib/mtproto/transports/abridged.ts",
+ "moduleName": "./src/lib/mtproto/transports/abridged.ts",
+ "type": "cjs require",
+ "userRequest": "../../bin_utils",
+ "loc": "3:20-46"
+ },
+ {
+ "moduleId": 74,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/idb.ts",
+ "module": "./src/lib/idb.ts",
+ "moduleName": "./src/lib/idb.ts",
+ "type": "cjs require",
+ "userRequest": "./bin_utils",
+ "loc": "6:20-42"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 3,
+ "source": "\"use strict\";\n/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nconst jsbn_1 = require(\"jsbn\");\n// @ts-ignore\nconst pako_inflate_min_js_1 = __importDefault(require(\"pako/dist/pako_inflate.min.js\"));\n//import { dT } from './utils.js';\n/* import './closure_long.js';\n//var goog = window ? window.goog as any : this.goog;\nvar goog = typeof(window) !== 'undefined' ? window.goog : this.goog; */\nvar _logTimer = (new Date()).getTime();\nfunction dT() {\n return '[' + (((new Date()).getTime() - _logTimer) / 1000).toFixed(3) + ']';\n}\nexports.dT = dT;\nfunction bigint(num) {\n return new jsbn_1.BigInteger(num.toString(16), 16);\n}\nexports.bigint = bigint;\nfunction bigStringInt(strNum) {\n return new jsbn_1.BigInteger(strNum, 10);\n}\nexports.bigStringInt = bigStringInt;\nfunction bytesToHex(bytes) {\n bytes = bytes || [];\n var arr = [];\n for (var i = 0; i < bytes.length; i++) {\n arr.push((bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16));\n }\n return arr.join('');\n}\nexports.bytesToHex = bytesToHex;\nfunction bytesFromHex(hexString) {\n var len = hexString.length, i;\n var start = 0;\n var bytes = [];\n if (hexString.length % 2) {\n bytes.push(parseInt(hexString.charAt(0), 16));\n start++;\n }\n for (i = start; i < len; i += 2) {\n bytes.push(parseInt(hexString.substr(i, 2), 16));\n }\n return bytes;\n}\nexports.bytesFromHex = bytesFromHex;\nfunction bytesToBase64(bytes) {\n var mod3;\n var result = '';\n for (var nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if (mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(uint6ToBase64(nUint24 >>> 18 & 63), uint6ToBase64(nUint24 >>> 12 & 63), uint6ToBase64(nUint24 >>> 6 & 63), uint6ToBase64(nUint24 & 63));\n nUint24 = 0;\n }\n }\n return result.replace(/A(?=A$|$)/g, '=');\n}\nexports.bytesToBase64 = bytesToBase64;\nfunction uint6ToBase64(nUint6) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\nexports.uint6ToBase64 = uint6ToBase64;\nfunction base64ToBlob(base64str, mimeType) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n var bytes = new Array(end - begin);\n for (var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n return blobConstruct(byteArrays, mimeType);\n}\nexports.base64ToBlob = base64ToBlob;\nfunction dataUrlToBlob(url) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n}\nexports.dataUrlToBlob = dataUrlToBlob;\nfunction blobConstruct(blobParts, mimeType = '') {\n var blob;\n var safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, { type: safeMimeType });\n }\n catch (e) {\n // @ts-ignore\n var bb = new BlobBuilder;\n blobParts.forEach(function (blobPart) {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\nexports.blobConstruct = blobConstruct;\nfunction blobSafeMimeType(mimeType) {\n if ([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n return mimeType;\n}\nexports.blobSafeMimeType = blobSafeMimeType;\nfunction bytesCmp(bytes1, bytes2) {\n var len = bytes1.length;\n if (len != bytes2.length) {\n return false;\n }\n for (var i = 0; i < len; i++) {\n if (bytes1[i] != bytes2[i]) {\n return false;\n }\n }\n return true;\n}\nexports.bytesCmp = bytesCmp;\nfunction bytesXor(bytes1, bytes2) {\n var len = bytes1.length;\n var bytes = [];\n for (var i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n return bytes;\n}\nexports.bytesXor = bytesXor;\nfunction bytesFromBigInt(bigInt, len) {\n var bytes = bigInt.toByteArray();\n if (len && bytes.length < len) {\n var padding = [];\n for (var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if (bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n }\n else {\n bytes = padding.concat(bytes);\n }\n }\n else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n return bytes;\n}\nexports.bytesFromBigInt = bytesFromBigInt;\nfunction bytesToArrayBuffer(b) {\n return (new Uint8Array(b)).buffer;\n}\nexports.bytesToArrayBuffer = bytesToArrayBuffer;\nfunction convertToArrayBuffer(bytes) {\n // Be careful with converting subarrays!!\n if (bytes instanceof ArrayBuffer) {\n return bytes;\n }\n if (bytes.buffer !== undefined &&\n bytes.buffer.byteLength == bytes.length * bytes.BYTES_PER_ELEMENT) {\n return bytes.buffer;\n }\n return bytesToArrayBuffer(bytes);\n}\nexports.convertToArrayBuffer = convertToArrayBuffer;\nfunction convertToUint8Array(bytes) {\n if (bytes.buffer !== undefined) {\n return bytes;\n }\n return new Uint8Array(bytes);\n}\nexports.convertToUint8Array = convertToUint8Array;\nfunction convertToByteArray(bytes) {\n if (Array.isArray(bytes)) {\n return bytes;\n }\n bytes = convertToUint8Array(bytes);\n var newBytes = [];\n for (var i = 0, len = bytes.length; i < len; i++) {\n newBytes.push(bytes[i]);\n }\n return newBytes;\n}\nexports.convertToByteArray = convertToByteArray;\nfunction bytesFromArrayBuffer(buffer) {\n var len = buffer.byteLength;\n var byteView = new Uint8Array(buffer);\n var bytes = [];\n for (var i = 0; i < len; ++i) {\n bytes[i] = byteView[i];\n }\n return bytes;\n}\nexports.bytesFromArrayBuffer = bytesFromArrayBuffer;\nfunction bufferConcat(buffer1, buffer2) {\n var l1 = buffer1.byteLength || buffer1.length;\n var l2 = buffer2.byteLength || buffer2.length;\n var tmp = new Uint8Array(l1 + l2);\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\n return tmp.buffer;\n}\nexports.bufferConcat = bufferConcat;\nfunction bufferConcats(...args) {\n let length = 0;\n args.forEach(b => length += b.byteLength || b.length);\n var tmp = new Uint8Array(length);\n let lastLength = 0;\n args.forEach(b => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += b.byteLength || b.length;\n });\n return tmp /* .buffer */;\n}\nexports.bufferConcats = bufferConcats;\nfunction longToInts(sLong) {\n var divRem = bigStringInt(sLong).divideAndRemainder(bigint(0x100000000));\n return [divRem[0].intValue(), divRem[1].intValue()];\n}\nexports.longToInts = longToInts;\nfunction bytesFromWords(wordArray) {\n var words = wordArray.words;\n var sigBytes = wordArray.sigBytes;\n var bytes = [];\n for (var i = 0; i < sigBytes; i++) {\n bytes.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n return bytes;\n}\nexports.bytesFromWords = bytesFromWords;\nfunction longToBytes(sLong) {\n return bytesFromWords({ words: longToInts(sLong), sigBytes: 8 }).reverse();\n}\nexports.longToBytes = longToBytes;\nfunction longFromInts(high, low) {\n return bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n}\nexports.longFromInts = longFromInts;\nfunction intToUint(val) {\n if (typeof (val) === 'string')\n val = parseInt(val);\n if (val < 0) {\n val = val + 4294967296;\n }\n return val;\n}\nexports.intToUint = intToUint;\nfunction uintToInt(val) {\n if (val > 2147483647) {\n val = val - 4294967296;\n }\n return val;\n}\nexports.uintToInt = uintToInt;\nfunction addPadding(bytes, blockSize = 16, zeroes, full = false, prepend = false) {\n let len = bytes.byteLength || bytes.length;\n let needPadding = blockSize - (len % blockSize);\n if (needPadding > 0 && (needPadding < blockSize || full)) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n let padding = new Array(needPadding);\n if (zeroes) {\n for (let i = 0; i < needPadding; i++) {\n padding[i] = 0;\n }\n }\n else {\n (new jsbn_1.SecureRandom()).nextBytes(padding);\n }\n if (bytes instanceof ArrayBuffer) {\n bytes = prepend ? bufferConcat(padding, bytes) : bufferConcat(bytes, padding);\n }\n else if (bytes instanceof Uint8Array) {\n let _bytes = new Uint8Array(bytes.length + padding.length);\n if (prepend) {\n _bytes.set(padding);\n _bytes.set(bytes, padding.length);\n }\n else {\n _bytes.set(bytes);\n _bytes.set(padding, bytes.length);\n }\n bytes = _bytes;\n }\n else {\n bytes = prepend ? padding.concat(bytes) : bytes.concat(padding);\n }\n }\n return bytes;\n}\nexports.addPadding = addPadding;\nfunction gzipUncompress(bytes, toString) {\n //console.log(dT(), 'Gzip uncompress start');\n var result = pako_inflate_min_js_1.default.inflate(bytes, toString ? { to: 'string' } : undefined);\n //console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\nexports.gzipUncompress = gzipUncompress;\nfunction nextRandomInt(maxValue) {\n return Math.floor(Math.random() * maxValue);\n}\nexports.nextRandomInt = nextRandomInt;\n"
+ },
+ {
+ "id": 3,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
+ "name": "./src/lib/richtextprocessor.js",
+ "index": 52,
+ "index2": 50,
+ "size": 38942,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "issuerId": 40,
+ "issuerName": "./src/components/pageSignIn.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 40,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "name": "./src/components/pageSignIn.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ }
+ ],
+ "profile": {
+ "factory": 392,
+ "building": 505,
+ "dependencies": 2
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 4,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appUsersManager.ts",
+ "module": "./src/lib/appManagers/appUsersManager.ts",
+ "moduleName": "./src/lib/appManagers/appUsersManager.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "7:28-59"
+ },
+ {
+ "moduleId": 10,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPeersManager.ts",
+ "module": "./src/lib/appManagers/appPeersManager.ts",
+ "moduleName": "./src/lib/appManagers/appPeersManager.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "9:28-59"
+ },
+ {
+ "moduleId": 12,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appChatsManager.ts",
+ "module": "./src/lib/appManagers/appChatsManager.ts",
+ "moduleName": "./src/lib/appManagers/appChatsManager.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "7:28-59"
+ },
+ {
+ "moduleId": 15,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMessagesManager.ts",
+ "module": "./src/lib/appManagers/appMessagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appMessagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "19:28-59"
+ },
+ {
+ "moduleId": 18,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appDocsManager.ts",
+ "module": "./src/lib/appManagers/appDocsManager.ts",
+ "moduleName": "./src/lib/appManagers/appDocsManager.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "17:28-59"
+ },
+ {
+ "moduleId": 19,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appImManager.ts",
+ "module": "./src/lib/appManagers/appImManager.ts",
+ "moduleName": "./src/lib/appManagers/appImManager.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "30:28-59"
+ },
+ {
+ "moduleId": 28,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appDialogsManager.ts",
+ "module": "./src/lib/appManagers/appDialogsManager.ts",
+ "moduleName": "./src/lib/appManagers/appDialogsManager.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "22:28-59"
+ },
+ {
+ "moduleId": 30,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/wrappers.ts",
+ "module": "./src/components/wrappers.ts",
+ "moduleName": "./src/components/wrappers.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/richtextprocessor",
+ "loc": "25:28-63"
+ },
+ {
+ "moduleId": 37,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appProfileManager.ts",
+ "module": "./src/lib/appManagers/appProfileManager.ts",
+ "moduleName": "./src/lib/appManagers/appProfileManager.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "11:28-59"
+ },
+ {
+ "moduleId": 40,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "module": "./src/components/pageSignIn.ts",
+ "moduleName": "./src/components/pageSignIn.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/richtextprocessor",
+ "loc": "15:28-63"
+ },
+ {
+ "moduleId": 45,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarRight.ts",
+ "module": "./src/lib/appManagers/appSidebarRight.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarRight.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "14:28-59"
+ },
+ {
+ "moduleId": 46,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMediaViewer.ts",
+ "module": "./src/lib/appManagers/appMediaViewer.ts",
+ "moduleName": "./src/lib/appManagers/appMediaViewer.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "10:28-59"
+ },
+ {
+ "moduleId": 49,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appWebPagesManager.ts",
+ "module": "./src/lib/appManagers/appWebPagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appWebPagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "../richtextprocessor",
+ "loc": "9:28-59"
+ },
+ {
+ "moduleId": 83,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/emoticonsDropdown.ts",
+ "module": "./src/components/emoticonsDropdown.ts",
+ "moduleName": "./src/components/emoticonsDropdown.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/richtextprocessor",
+ "loc": "19:28-63"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": [
+ "RichTextProcessor"
+ ],
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./src/components/emoticonsDropdown.ts (referenced with cjs require), ./src/components/pageSignIn.ts (referenced with cjs require), ./src/components/wrappers.ts (referenced with cjs require), ./src/lib/appManagers/appChatsManager.ts (referenced with cjs require), ./src/lib/appManagers/appDialogsManager.ts (referenced with cjs require), ./src/lib/appManagers/appDocsManager.ts (referenced with cjs require), ./src/lib/appManagers/appImManager.ts (referenced with cjs require), ./src/lib/appManagers/appMediaViewer.ts (referenced with cjs require), ./src/lib/appManagers/appMessagesManager.ts (referenced with cjs require), ./src/lib/appManagers/appPeersManager.ts (referenced with cjs require), ./src/lib/appManagers/appProfileManager.ts (referenced with cjs require), ./src/lib/appManagers/appSidebarRight.ts (referenced with cjs require), ./src/lib/appManagers/appUsersManager.ts (referenced with cjs require), ./src/lib/appManagers/appWebPagesManager.ts (referenced with cjs require)"
+ ],
+ "depth": 2,
+ "source": "import {encodeEntities, copy/* , emojiUnicode */} from './utils';\r\n\r\nvar EmojiHelper = {\r\n emojiMap: (code) => { return code; },\r\n shortcuts: [],\r\n emojis: []\r\n};\r\n\r\nvar emojiData = Config.Emoji;\r\nvar emojiIconSize = emojiData.img_size;\r\nvar emojiSupported = navigator.userAgent.search(/OS X|iPhone|iPad|iOS|Android/i) != -1/* && false */,\r\n emojiCode;\r\n//var emojiRegExp = '\\\\u0023\\\\u20E3|\\\\u00a9|\\\\u00ae|\\\\u203c|\\\\u2049|\\\\u2139|[\\\\u2194-\\\\u2199]|\\\\u21a9|\\\\u21aa|\\\\u231a|\\\\u231b|\\\\u23e9|[\\\\u23ea-\\\\u23ec]|\\\\u23f0|\\\\u24c2|\\\\u25aa|\\\\u25ab|\\\\u25b6|\\\\u2611|\\\\u2614|\\\\u26fd|\\\\u2705|\\\\u2709|[\\\\u2795-\\\\u2797]|\\\\u27a1|\\\\u27b0|\\\\u27bf|\\\\u2934|\\\\u2935|[\\\\u2b05-\\\\u2b07]|\\\\u2b1b|\\\\u2b1c|\\\\u2b50|\\\\u2b55|\\\\u3030|\\\\u303d|\\\\u3297|\\\\u3299|[\\\\uE000-\\\\uF8FF\\\\u270A-\\\\u2764\\\\u2122\\\\u25C0\\\\u25FB-\\\\u25FE\\\\u2615\\\\u263a\\\\u2648-\\\\u2653\\\\u2660-\\\\u2668\\\\u267B\\\\u267F\\\\u2693\\\\u261d\\\\u26A0-\\\\u26FA\\\\u2708\\\\u2702\\\\u2601\\\\u260E]|[\\\\u2600\\\\u26C4\\\\u26BE\\\\u23F3\\\\u2764]|\\\\uD83D[\\\\uDC00-\\\\uDFFF]|\\\\uD83C[\\\\uDDE8-\\\\uDDFA\\uDDEC]\\\\uD83C[\\\\uDDEA-\\\\uDDFA\\uDDE7]|[0-9]\\\\u20e3|\\\\uD83C[\\\\uDC00-\\\\uDFFF]';\r\n//var emojiRegExp = '\\\\u00a9|\\\\u00ae|[\\\\u2000-\\\\u3300]|\\\\ud83c[\\\\ud000-\\\\udfff]|\\\\ud83d[\\\\ud000-\\\\udfff]|\\\\ud83e[\\\\ud000-\\\\udfff]';\r\nvar emojiRegExp = '\\\\uD83C\\\\uDFF4\\\\uDB40\\\\uDC67\\\\uDB40\\\\uDC62(?:\\\\uDB40\\\\uDC77\\\\uDB40\\\\uDC6C\\\\uDB40\\\\uDC73|\\\\uDB40\\\\uDC73\\\\uDB40\\\\uDC63\\\\uDB40\\\\uDC74|\\\\uDB40\\\\uDC65\\\\uDB40\\\\uDC6E\\\\uDB40\\\\uDC67)\\\\uDB40\\\\uDC7F|(?:\\\\uD83E\\\\uDDD1\\\\uD83C\\\\uDFFB\\\\u200D\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83E\\\\uDDD1|\\\\uD83D\\\\uDC69\\\\uD83C\\\\uDFFC\\\\u200D\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC69)\\\\uD83C\\\\uDFFB|\\\\uD83D\\\\uDC68(?:\\\\uD83C\\\\uDFFC\\\\u200D(?:\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC68\\\\uD83C\\\\uDFFB|\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|\\\\uD83C\\\\uDFFF\\\\u200D(?:\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC68(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFE])|\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|\\\\uD83C\\\\uDFFE\\\\u200D(?:\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC68(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFD])|\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|\\\\uD83C\\\\uDFFD\\\\u200D(?:\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC68(?:\\\\uD83C[\\\\uDFFB\\\\uDFFC])|\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|\\\\u200D(?:\\\\u2764\\\\uFE0F\\\\u200D(?:\\\\uD83D\\\\uDC8B\\\\u200D)?\\\\uD83D\\\\uDC68|(?:\\\\uD83D[\\\\uDC68\\\\uDC69])\\\\u200D(?:\\\\uD83D\\\\uDC66\\\\u200D\\\\uD83D\\\\uDC66|\\\\uD83D\\\\uDC67\\\\u200D(?:\\\\uD83D[\\\\uDC66\\\\uDC67]))|\\\\uD83D\\\\uDC66\\\\u200D\\\\uD83D\\\\uDC66|\\\\uD83D\\\\uDC67\\\\u200D(?:\\\\uD83D[\\\\uDC66\\\\uDC67])|(?:\\\\uD83D[\\\\uDC68\\\\uDC69])\\\\u200D(?:\\\\uD83D[\\\\uDC66\\\\uDC67])|[\\\\u2695\\\\u2696\\\\u2708]\\\\uFE0F|\\\\uD83D[\\\\uDC66\\\\uDC67]|\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|(?:\\\\uD83C\\\\uDFFB\\\\u200D[\\\\u2695\\\\u2696\\\\u2708]|\\\\uD83C\\\\uDFFF\\\\u200D[\\\\u2695\\\\u2696\\\\u2708]|\\\\uD83C\\\\uDFFE\\\\u200D[\\\\u2695\\\\u2696\\\\u2708]|\\\\uD83C\\\\uDFFD\\\\u200D[\\\\u2695\\\\u2696\\\\u2708]|\\\\uD83C\\\\uDFFC\\\\u200D[\\\\u2695\\\\u2696\\\\u2708])\\\\uFE0F|\\\\uD83C\\\\uDFFB\\\\u200D(?:\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|\\\\uD83C[\\\\uDFFB-\\\\uDFFF])|\\\\uD83E\\\\uDDD1(?:\\\\uD83C\\\\uDFFF\\\\u200D\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83E\\\\uDDD1(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFF])|\\\\u200D\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83E\\\\uDDD1)|\\\\uD83D\\\\uDC69(?:\\\\uD83C\\\\uDFFE\\\\u200D(?:\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC68(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFD\\\\uDFFF])|\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|\\\\uD83C\\\\uDFFD\\\\u200D(?:\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC68(?:\\\\uD83C[\\\\uDFFB\\\\uDFFC\\\\uDFFE\\\\uDFFF])|\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|\\\\uD83C\\\\uDFFC\\\\u200D(?:\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC68(?:\\\\uD83C[\\\\uDFFB\\\\uDFFD-\\\\uDFFF])|\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|\\\\uD83C\\\\uDFFB\\\\u200D(?:\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC68(?:\\\\uD83C[\\\\uDFFC-\\\\uDFFF])|\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|\\\\u200D(?:\\\\u2764\\\\uFE0F\\\\u200D(?:\\\\uD83D\\\\uDC8B\\\\u200D(?:\\\\uD83D[\\\\uDC68\\\\uDC69])|\\\\uD83D[\\\\uDC68\\\\uDC69])|\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD])|\\\\uD83C\\\\uDFFF\\\\u200D(?:\\\\uD83C[\\\\uDF3E\\\\uDF73\\\\uDF93\\\\uDFA4\\\\uDFA8\\\\uDFEB\\\\uDFED]|\\\\uD83D[\\\\uDCBB\\\\uDCBC\\\\uDD27\\\\uDD2C\\\\uDE80\\\\uDE92]|\\\\uD83E[\\\\uDDAF-\\\\uDDB3\\\\uDDBC\\\\uDDBD]))|(?:\\\\uD83E\\\\uDDD1\\\\uD83C\\\\uDFFE\\\\u200D\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83E\\\\uDDD1|\\\\uD83D\\\\uDC69\\\\uD83C\\\\uDFFF\\\\u200D\\\\uD83E\\\\uDD1D\\\\u200D(?:\\\\uD83D[\\\\uDC68\\\\uDC69]))(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFE])|(?:\\\\uD83E\\\\uDDD1\\\\uD83C\\\\uDFFD\\\\u200D\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83E\\\\uDDD1|\\\\uD83D\\\\uDC69\\\\uD83C\\\\uDFFE\\\\u200D\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC69)(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFD])|(?:\\\\uD83E\\\\uDDD1\\\\uD83C\\\\uDFFC\\\\u200D\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83E\\\\uDDD1|\\\\uD83D\\\\uDC69\\\\uD83C\\\\uDFFD\\\\u200D\\\\uD83E\\\\uDD1D\\\\u200D\\\\uD83D\\\\uDC69)(?:\\\\uD83C[\\\\uDFFB\\\\uDFFC])|\\\\uD83D\\\\uDC69\\\\u200D\\\\uD83D\\\\uDC69\\\\u200D(?:\\\\uD83D\\\\uDC66\\\\u200D\\\\uD83D\\\\uDC66|\\\\uD83D\\\\uDC67\\\\u200D(?:\\\\uD83D[\\\\uDC66\\\\uDC67]))|\\\\uD83D\\\\uDC69\\\\u200D\\\\uD83D\\\\uDC66\\\\u200D\\\\uD83D\\\\uDC66|\\\\uD83D\\\\uDC69\\\\u200D\\\\uD83D\\\\uDC69\\\\u200D(?:\\\\uD83D[\\\\uDC66\\\\uDC67])|(?:\\\\uD83D\\\\uDC41\\\\uFE0F\\\\u200D\\\\uD83D\\\\uDDE8|\\\\uD83D\\\\uDC69(?:\\\\uD83C\\\\uDFFF\\\\u200D[\\\\u2695\\\\u2696\\\\u2708]|\\\\uD83C\\\\uDFFE\\\\u200D[\\\\u2695\\\\u2696\\\\u2708]|\\\\uD83C\\\\uDFFD\\\\u200D[\\\\u2695\\\\u2696\\\\u2708]|\\\\uD83C\\\\uDFFC\\\\u200D[\\\\u2695\\\\u2696\\\\u2708]|\\\\uD83C\\\\uDFFB\\\\u200D[\\\\u2695\\\\u2696\\\\u2708]|\\\\u200D[\\\\u2695\\\\u2696\\\\u2708])|(?:\\\\uD83C[\\\\uDFC3\\\\uDFC4\\\\uDFCA]|\\\\uD83D[\\\\uDC6E\\\\uDC71\\\\uDC73\\\\uDC77\\\\uDC81\\\\uDC82\\\\uDC86\\\\uDC87\\\\uDE45-\\\\uDE47\\\\uDE4B\\\\uDE4D\\\\uDE4E\\\\uDEA3\\\\uDEB4-\\\\uDEB6]|\\\\uD83E[\\\\uDD26\\\\uDD37-\\\\uDD39\\\\uDD3D\\\\uDD3E\\\\uDDB8\\\\uDDB9\\\\uDDCD-\\\\uDDCF\\\\uDDD6-\\\\uDDDD])(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFF])\\\\u200D[\\\\u2640\\\\u2642]|(?:\\\\u26F9|\\\\uD83C[\\\\uDFCB\\\\uDFCC]|\\\\uD83D\\\\uDD75)(?:\\\\uFE0F\\\\u200D[\\\\u2640\\\\u2642]|(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFF])\\\\u200D[\\\\u2640\\\\u2642])|\\\\uD83C\\\\uDFF4\\\\u200D\\\\u2620|(?:\\\\uD83C[\\\\uDFC3\\\\uDFC4\\\\uDFCA]|\\\\uD83D[\\\\uDC6E\\\\uDC6F\\\\uDC71\\\\uDC73\\\\uDC77\\\\uDC81\\\\uDC82\\\\uDC86\\\\uDC87\\\\uDE45-\\\\uDE47\\\\uDE4B\\\\uDE4D\\\\uDE4E\\\\uDEA3\\\\uDEB4-\\\\uDEB6]|\\\\uD83E[\\\\uDD26\\\\uDD37-\\\\uDD39\\\\uDD3C-\\\\uDD3E\\\\uDDB8\\\\uDDB9\\\\uDDCD-\\\\uDDCF\\\\uDDD6-\\\\uDDDF])\\\\u200D[\\\\u2640\\\\u2642])\\\\uFE0F|\\\\uD83D\\\\uDC69\\\\u200D\\\\uD83D\\\\uDC67\\\\u200D(?:\\\\uD83D[\\\\uDC66\\\\uDC67])|\\\\uD83C\\\\uDFF3\\\\uFE0F\\\\u200D\\\\uD83C\\\\uDF08|\\\\uD83D\\\\uDC69\\\\u200D\\\\uD83D\\\\uDC67|\\\\uD83D\\\\uDC69\\\\u200D\\\\uD83D\\\\uDC66|\\\\uD83D\\\\uDC15\\\\u200D\\\\uD83E\\\\uDDBA|\\\\uD83C\\\\uDDFD\\\\uD83C\\\\uDDF0|\\\\uD83C\\\\uDDF6\\\\uD83C\\\\uDDE6|\\\\uD83C\\\\uDDF4\\\\uD83C\\\\uDDF2|\\\\uD83E\\\\uDDD1(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFF])|\\\\uD83D\\\\uDC69(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFF])|\\\\uD83C\\\\uDDFF(?:\\\\uD83C[\\\\uDDE6\\\\uDDF2\\\\uDDFC])|\\\\uD83C\\\\uDDFE(?:\\\\uD83C[\\\\uDDEA\\\\uDDF9])|\\\\uD83C\\\\uDDFC(?:\\\\uD83C[\\\\uDDEB\\\\uDDF8])|\\\\uD83C\\\\uDDFB(?:\\\\uD83C[\\\\uDDE6\\\\uDDE8\\\\uDDEA\\\\uDDEC\\\\uDDEE\\\\uDDF3\\\\uDDFA])|\\\\uD83C\\\\uDDFA(?:\\\\uD83C[\\\\uDDE6\\\\uDDEC\\\\uDDF2\\\\uDDF3\\\\uDDF8\\\\uDDFE\\\\uDDFF])|\\\\uD83C\\\\uDDF9(?:\\\\uD83C[\\\\uDDE6\\\\uDDE8\\\\uDDE9\\\\uDDEB-\\\\uDDED\\\\uDDEF-\\\\uDDF4\\\\uDDF7\\\\uDDF9\\\\uDDFB\\\\uDDFC\\\\uDDFF])|\\\\uD83C\\\\uDDF8(?:\\\\uD83C[\\\\uDDE6-\\\\uDDEA\\\\uDDEC-\\\\uDDF4\\\\uDDF7-\\\\uDDF9\\\\uDDFB\\\\uDDFD-\\\\uDDFF])|\\\\uD83C\\\\uDDF7(?:\\\\uD83C[\\\\uDDEA\\\\uDDF4\\\\uDDF8\\\\uDDFA\\\\uDDFC])|\\\\uD83C\\\\uDDF5(?:\\\\uD83C[\\\\uDDE6\\\\uDDEA-\\\\uDDED\\\\uDDF0-\\\\uDDF3\\\\uDDF7-\\\\uDDF9\\\\uDDFC\\\\uDDFE])|\\\\uD83C\\\\uDDF3(?:\\\\uD83C[\\\\uDDE6\\\\uDDE8\\\\uDDEA-\\\\uDDEC\\\\uDDEE\\\\uDDF1\\\\uDDF4\\\\uDDF5\\\\uDDF7\\\\uDDFA\\\\uDDFF])|\\\\uD83C\\\\uDDF2(?:\\\\uD83C[\\\\uDDE6\\\\uDDE8-\\\\uDDED\\\\uDDF0-\\\\uDDFF])|\\\\uD83C\\\\uDDF1(?:\\\\uD83C[\\\\uDDE6-\\\\uDDE8\\\\uDDEE\\\\uDDF0\\\\uDDF7-\\\\uDDFB\\\\uDDFE])|\\\\uD83C\\\\uDDF0(?:\\\\uD83C[\\\\uDDEA\\\\uDDEC-\\\\uDDEE\\\\uDDF2\\\\uDDF3\\\\uDDF5\\\\uDDF7\\\\uDDFC\\\\uDDFE\\\\uDDFF])|\\\\uD83C\\\\uDDEF(?:\\\\uD83C[\\\\uDDEA\\\\uDDF2\\\\uDDF4\\\\uDDF5])|\\\\uD83C\\\\uDDEE(?:\\\\uD83C[\\\\uDDE8-\\\\uDDEA\\\\uDDF1-\\\\uDDF4\\\\uDDF6-\\\\uDDF9])|\\\\uD83C\\\\uDDED(?:\\\\uD83C[\\\\uDDF0\\\\uDDF2\\\\uDDF3\\\\uDDF7\\\\uDDF9\\\\uDDFA])|\\\\uD83C\\\\uDDEC(?:\\\\uD83C[\\\\uDDE6\\\\uDDE7\\\\uDDE9-\\\\uDDEE\\\\uDDF1-\\\\uDDF3\\\\uDDF5-\\\\uDDFA\\\\uDDFC\\\\uDDFE])|\\\\uD83C\\\\uDDEB(?:\\\\uD83C[\\\\uDDEE-\\\\uDDF0\\\\uDDF2\\\\uDDF4\\\\uDDF7])|\\\\uD83C\\\\uDDEA(?:\\\\uD83C[\\\\uDDE6\\\\uDDE8\\\\uDDEA\\\\uDDEC\\\\uDDED\\\\uDDF7-\\\\uDDFA])|\\\\uD83C\\\\uDDE9(?:\\\\uD83C[\\\\uDDEA\\\\uDDEC\\\\uDDEF\\\\uDDF0\\\\uDDF2\\\\uDDF4\\\\uDDFF])|\\\\uD83C\\\\uDDE8(?:\\\\uD83C[\\\\uDDE6\\\\uDDE8\\\\uDDE9\\\\uDDEB-\\\\uDDEE\\\\uDDF0-\\\\uDDF5\\\\uDDF7\\\\uDDFA-\\\\uDDFF])|\\\\uD83C\\\\uDDE7(?:\\\\uD83C[\\\\uDDE6\\\\uDDE7\\\\uDDE9-\\\\uDDEF\\\\uDDF1-\\\\uDDF4\\\\uDDF6-\\\\uDDF9\\\\uDDFB\\\\uDDFC\\\\uDDFE\\\\uDDFF])|\\\\uD83C\\\\uDDE6(?:\\\\uD83C[\\\\uDDE8-\\\\uDDEC\\\\uDDEE\\\\uDDF1\\\\uDDF2\\\\uDDF4\\\\uDDF6-\\\\uDDFA\\\\uDDFC\\\\uDDFD\\\\uDDFF])|[#\\\\*0-9]\\\\uFE0F\\\\u20E3|(?:\\\\uD83C[\\\\uDFC3\\\\uDFC4\\\\uDFCA]|\\\\uD83D[\\\\uDC6E\\\\uDC71\\\\uDC73\\\\uDC77\\\\uDC81\\\\uDC82\\\\uDC86\\\\uDC87\\\\uDE45-\\\\uDE47\\\\uDE4B\\\\uDE4D\\\\uDE4E\\\\uDEA3\\\\uDEB4-\\\\uDEB6]|\\\\uD83E[\\\\uDD26\\\\uDD37-\\\\uDD39\\\\uDD3D\\\\uDD3E\\\\uDDB8\\\\uDDB9\\\\uDDCD-\\\\uDDCF\\\\uDDD6-\\\\uDDDD])(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFF])|(?:\\\\u26F9|\\\\uD83C[\\\\uDFCB\\\\uDFCC]|\\\\uD83D\\\\uDD75)(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFF])|(?:[\\\\u261D\\\\u270A-\\\\u270D]|\\\\uD83C[\\\\uDF85\\\\uDFC2\\\\uDFC7]|\\\\uD83D[\\\\uDC42\\\\uDC43\\\\uDC46-\\\\uDC50\\\\uDC66\\\\uDC67\\\\uDC6B-\\\\uDC6D\\\\uDC70\\\\uDC72\\\\uDC74-\\\\uDC76\\\\uDC78\\\\uDC7C\\\\uDC83\\\\uDC85\\\\uDCAA\\\\uDD74\\\\uDD7A\\\\uDD90\\\\uDD95\\\\uDD96\\\\uDE4C\\\\uDE4F\\\\uDEC0\\\\uDECC]|\\\\uD83E[\\\\uDD0F\\\\uDD18-\\\\uDD1C\\\\uDD1E\\\\uDD1F\\\\uDD30-\\\\uDD36\\\\uDDB5\\\\uDDB6\\\\uDDBB\\\\uDDD2-\\\\uDDD5])(?:\\\\uD83C[\\\\uDFFB-\\\\uDFFF])|(?:[\\\\u231A\\\\u231B\\\\u23E9-\\\\u23EC\\\\u23F0\\\\u23F3\\\\u25FD\\\\u25FE\\\\u2614\\\\u2615\\\\u2648-\\\\u2653\\\\u267F\\\\u2693\\\\u26A1\\\\u26AA\\\\u26AB\\\\u26BD\\\\u26BE\\\\u26C4\\\\u26C5\\\\u26CE\\\\u26D4\\\\u26EA\\\\u26F2\\\\u26F3\\\\u26F5\\\\u26FA\\\\u26FD\\\\u2705\\\\u270A\\\\u270B\\\\u2728\\\\u274C\\\\u274E\\\\u2753-\\\\u2755\\\\u2757\\\\u2795-\\\\u2797\\\\u27B0\\\\u27BF\\\\u2B1B\\\\u2B1C\\\\u2B50\\\\u2B55]|\\\\uD83C[\\\\uDC04\\\\uDCCF\\\\uDD8E\\\\uDD91-\\\\uDD9A\\\\uDDE6-\\\\uDDFF\\\\uDE01\\\\uDE1A\\\\uDE2F\\\\uDE32-\\\\uDE36\\\\uDE38-\\\\uDE3A\\\\uDE50\\\\uDE51\\\\uDF00-\\\\uDF20\\\\uDF2D-\\\\uDF35\\\\uDF37-\\\\uDF7C\\\\uDF7E-\\\\uDF93\\\\uDFA0-\\\\uDFCA\\\\uDFCF-\\\\uDFD3\\\\uDFE0-\\\\uDFF0\\\\uDFF4\\\\uDFF8-\\\\uDFFF]|\\\\uD83D[\\\\uDC00-\\\\uDC3E\\\\uDC40\\\\uDC42-\\\\uDCFC\\\\uDCFF-\\\\uDD3D\\\\uDD4B-\\\\uDD4E\\\\uDD50-\\\\uDD67\\\\uDD7A\\\\uDD95\\\\uDD96\\\\uDDA4\\\\uDDFB-\\\\uDE4F\\\\uDE80-\\\\uDEC5\\\\uDECC\\\\uDED0-\\\\uDED2\\\\uDED5\\\\uDEEB\\\\uDEEC\\\\uDEF4-\\\\uDEFA\\\\uDFE0-\\\\uDFEB]|\\\\uD83E[\\\\uDD0D-\\\\uDD3A\\\\uDD3C-\\\\uDD45\\\\uDD47-\\\\uDD71\\\\uDD73-\\\\uDD76\\\\uDD7A-\\\\uDDA2\\\\uDDA5-\\\\uDDAA\\\\uDDAE-\\\\uDDCA\\\\uDDCD-\\\\uDDFF\\\\uDE70-\\\\uDE73\\\\uDE78-\\\\uDE7A\\\\uDE80-\\\\uDE82\\\\uDE90-\\\\uDE95])|(?:[#\\\\*0-9\\\\xA9\\\\xAE\\\\u203C\\\\u2049\\\\u2122\\\\u2139\\\\u2194-\\\\u2199\\\\u21A9\\\\u21AA\\\\u231A\\\\u231B\\\\u2328\\\\u23CF\\\\u23E9-\\\\u23F3\\\\u23F8-\\\\u23FA\\\\u24C2\\\\u25AA\\\\u25AB\\\\u25B6\\\\u25C0\\\\u25FB-\\\\u25FE\\\\u2600-\\\\u2604\\\\u260E\\\\u2611\\\\u2614\\\\u2615\\\\u2618\\\\u261D\\\\u2620\\\\u2622\\\\u2623\\\\u2626\\\\u262A\\\\u262E\\\\u262F\\\\u2638-\\\\u263A\\\\u2640\\\\u2642\\\\u2648-\\\\u2653\\\\u265F\\\\u2660\\\\u2663\\\\u2665\\\\u2666\\\\u2668\\\\u267B\\\\u267E\\\\u267F\\\\u2692-\\\\u2697\\\\u2699\\\\u269B\\\\u269C\\\\u26A0\\\\u26A1\\\\u26AA\\\\u26AB\\\\u26B0\\\\u26B1\\\\u26BD\\\\u26BE\\\\u26C4\\\\u26C5\\\\u26C8\\\\u26CE\\\\u26CF\\\\u26D1\\\\u26D3\\\\u26D4\\\\u26E9\\\\u26EA\\\\u26F0-\\\\u26F5\\\\u26F7-\\\\u26FA\\\\u26FD\\\\u2702\\\\u2705\\\\u2708-\\\\u270D\\\\u270F\\\\u2712\\\\u2714\\\\u2716\\\\u271D\\\\u2721\\\\u2728\\\\u2733\\\\u2734\\\\u2744\\\\u2747\\\\u274C\\\\u274E\\\\u2753-\\\\u2755\\\\u2757\\\\u2763\\\\u2764\\\\u2795-\\\\u2797\\\\u27A1\\\\u27B0\\\\u27BF\\\\u2934\\\\u2935\\\\u2B05-\\\\u2B07\\\\u2B1B\\\\u2B1C\\\\u2B50\\\\u2B55\\\\u3030\\\\u303D\\\\u3297\\\\u3299]|\\\\uD83C[\\\\uDC04\\\\uDCCF\\\\uDD70\\\\uDD71\\\\uDD7E\\\\uDD7F\\\\uDD8E\\\\uDD91-\\\\uDD9A\\\\uDDE6-\\\\uDDFF\\\\uDE01\\\\uDE02\\\\uDE1A\\\\uDE2F\\\\uDE32-\\\\uDE3A\\\\uDE50\\\\uDE51\\\\uDF00-\\\\uDF21\\\\uDF24-\\\\uDF93\\\\uDF96\\\\uDF97\\\\uDF99-\\\\uDF9B\\\\uDF9E-\\\\uDFF0\\\\uDFF3-\\\\uDFF5\\\\uDFF7-\\\\uDFFF]|\\\\uD83D[\\\\uDC00-\\\\uDCFD\\\\uDCFF-\\\\uDD3D\\\\uDD49-\\\\uDD4E\\\\uDD50-\\\\uDD67\\\\uDD6F\\\\uDD70\\\\uDD73-\\\\uDD7A\\\\uDD87\\\\uDD8A-\\\\uDD8D\\\\uDD90\\\\uDD95\\\\uDD96\\\\uDDA4\\\\uDDA5\\\\uDDA8\\\\uDDB1\\\\uDDB2\\\\uDDBC\\\\uDDC2-\\\\uDDC4\\\\uDDD1-\\\\uDDD3\\\\uDDDC-\\\\uDDDE\\\\uDDE1\\\\uDDE3\\\\uDDE8\\\\uDDEF\\\\uDDF3\\\\uDDFA-\\\\uDE4F\\\\uDE80-\\\\uDEC5\\\\uDECB-\\\\uDED2\\\\uDED5\\\\uDEE0-\\\\uDEE5\\\\uDEE9\\\\uDEEB\\\\uDEEC\\\\uDEF0\\\\uDEF3-\\\\uDEFA\\\\uDFE0-\\\\uDFEB]|\\\\uD83E[\\\\uDD0D-\\\\uDD3A\\\\uDD3C-\\\\uDD45\\\\uDD47-\\\\uDD71\\\\uDD73-\\\\uDD76\\\\uDD7A-\\\\uDDA2\\\\uDDA5-\\\\uDDAA\\\\uDDAE-\\\\uDDCA\\\\uDDCD-\\\\uDDFF\\\\uDE70-\\\\uDE73\\\\uDE78-\\\\uDE7A\\\\uDE80-\\\\uDE82\\\\uDE90-\\\\uDE95])\\\\uFE0F|(?:[\\\\u261D\\\\u26F9\\\\u270A-\\\\u270D]|\\\\uD83C[\\\\uDF85\\\\uDFC2-\\\\uDFC4\\\\uDFC7\\\\uDFCA-\\\\uDFCC]|\\\\uD83D[\\\\uDC42\\\\uDC43\\\\uDC46-\\\\uDC50\\\\uDC66-\\\\uDC78\\\\uDC7C\\\\uDC81-\\\\uDC83\\\\uDC85-\\\\uDC87\\\\uDC8F\\\\uDC91\\\\uDCAA\\\\uDD74\\\\uDD75\\\\uDD7A\\\\uDD90\\\\uDD95\\\\uDD96\\\\uDE45-\\\\uDE47\\\\uDE4B-\\\\uDE4F\\\\uDEA3\\\\uDEB4-\\\\uDEB6\\\\uDEC0\\\\uDECC]|\\\\uD83E[\\\\uDD0F\\\\uDD18-\\\\uDD1F\\\\uDD26\\\\uDD30-\\\\uDD39\\\\uDD3C-\\\\uDD3E\\\\uDDB5\\\\uDDB6\\\\uDDB8\\\\uDDB9\\\\uDDBB\\\\uDDCD-\\\\uDDCF\\\\uDDD1-\\\\uDDDD])';\r\nvar alphaCharsRegExp = 'a-z' +\r\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\r\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\r\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\r\n '\\\\u02bb' + // Hawaiian\r\n '\\\\u0300-\\\\u036f' + // Combining diacritics\r\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\r\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\r\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\r\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\r\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\r\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\r\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\r\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\r\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\r\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\r\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\r\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\r\n '\\\\u200c' + // Zero-Width Non-Joiner\r\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\r\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\r\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\r\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\r\n '\\\\uff66-\\\\uff9f' + // half width Katakana\r\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\r\nvar alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\r\nvar domainAddChars = '\\u00b7';\r\n// Based on Regular Expression for URL validation by Diego Perini\r\nvar urlRegExp = '((?:https?|ftp)://|mailto:)?' +\r\n // user:pass authentication\r\n '(?:\\\\S{1,64}(?::\\\\S{0,64})?@)?' +\r\n '(?:' +\r\n // sindresorhus/ip-regexp\r\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\r\n '|' +\r\n // host name\r\n '[' + alphaCharsRegExp + '0-9][' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\r\n // domain name\r\n '(?:\\\\.[' + alphaCharsRegExp + '0-9][' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\r\n // TLD identifier\r\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\r\n ')' +\r\n // port number\r\n '(?::\\\\d{2,5})?' +\r\n // resource path\r\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?'\r\nvar usernameRegExp = '[a-zA-Z\\\\d_]{5,32}'\r\nvar botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)'\r\nvar fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i')\r\nvar emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\r\nvar youtubeRegExp = /^(?:https?:\\/\\/)?(?:www\\.)?youtu(?:|\\.be|be\\.com|\\.b)(?:\\/v\\/|\\/watch\\\\?v=|e\\/|(?:\\/\\??#)?\\/watch(?:.+)v=)(.{11})(?:\\&[^\\s]*)?/\r\nvar vimeoRegExp = /^(?:https?:\\/\\/)?(?:www\\.)?vimeo\\.com\\/(\\d+)/\r\nvar instagramRegExp = /^https?:\\/\\/(?:instagr\\.am\\/p\\/|instagram\\.com\\/p\\/)([a-zA-Z0-9\\-\\_]+)/i\r\nvar vineRegExp = /^https?:\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9\\-\\_]+)/i\r\nvar twitterRegExp = /^https?:\\/\\/twitter\\.com\\/.+?\\/status\\/\\d+/i\r\nvar facebookRegExp = /^https?:\\/\\/(?:www\\.|m\\.)?facebook\\.com\\/(?:.+?\\/posts\\/\\d+|(?:story\\.php|permalink\\.php)\\?story_fbid=(\\d+)(?:&substory_index=\\d+)?&id=(\\d+))/i\r\nvar gplusRegExp = /^https?:\\/\\/plus\\.google\\.com\\/\\d+\\/posts\\/[a-zA-Z0-9\\-\\_]+/i\r\nvar soundcloudRegExp = /^https?:\\/\\/(?:soundcloud\\.com|snd\\.sc)\\/([a-zA-Z0-9%\\-\\_]+)\\/([a-zA-Z0-9%\\-\\_]+)/i\r\nvar spotifyRegExp = /(https?:\\/\\/(open\\.spotify\\.com|play\\.spotify\\.com|spoti\\.fi)\\/(.+)|spotify:(.+))/i\r\nvar markdownTestRegExp = /[`_*@]/\r\nvar markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s)(`|\\*\\*|__)([^\\n]+?)\\7([\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)/m\r\nvar siteHashtags = {\r\n Telegram: 'tg://search_hashtag?hashtag={1}',\r\n Twitter: 'https://twitter.com/hashtag/{1}',\r\n Instagram: 'https://instagram.com/explore/tags/{1}/',\r\n 'Google Plus': 'https://plus.google.com/explore/{1}'\r\n}\r\nvar siteMentions = {\r\n Telegram: '#/im?p=%40{1}',\r\n Twitter: 'https://twitter.com/{1}',\r\n Instagram: 'https://instagram.com/{1}/',\r\n GitHub: 'https://github.com/{1}'\r\n}\r\nvar markdownEntities = {\r\n '`': 'messageEntityCode',\r\n '**': 'messageEntityBold',\r\n '__': 'messageEntityItalic'\r\n}\r\nfunction getEmojiSpritesheetCoords(emojiCode) {\r\n //////////////emojiCode = emojiUnicode(emojiCode);\r\n\r\n let emojiInfo = emojiData.emoji[emojiCode];\r\n if(!emojiInfo) {\r\n //console.error('no emoji by code:', emojiCode, emojiCode.length, new TextEncoder().encode(emojiCode));\r\n return null;\r\n }\r\n\r\n let sheetX = 0;\r\n let sheetNo = '';\r\n if(emojiData.splitted) {\r\n sheetX = emojiInfo[emojiData.keyX] % 6;\r\n sheetNo = (emojiInfo[emojiData.keyX] / 6 | 0) + 1;\r\n } else {\r\n sheetX = emojiInfo[emojiData.keyX];\r\n }\r\n\r\n /* let xPos = 100 * (((emojiInfo.sheet_x * (img_size + 2)) + 1) / (sheetSizeX - img_size));\r\n let yPos = 100 * (((emojiInfo.sheet_y * (img_size + 2)) + 1) / (sheetSizeY - img_size)); */\r\n let xPos = sheetX * emojiData.multiplyX;\r\n let yPos = 100 / emojiData.side * emojiInfo[emojiData.keyY];\r\n\r\n if(emojiData.splitted) {\r\n /* if(sheetX != 2 && sheetX != 3) {\r\n xPos += ((sheetX + 1) > (6 / 2) ? -1 : 1) * 100 / 204;\r\n } */\r\n\r\n if(sheetNo == 9) {\r\n xPos = sheetX * 100 / 5;\r\n } else {\r\n xPos = sheetX * 100 / 6;\r\n }\r\n }\r\n\r\n //console.log({row: yPos, column: xPos, sheetNo});\r\n\r\n return {row: yPos, column: xPos, sheetNo};\r\n}\r\nfunction parseEntities (text, options) {\r\n options = options || {}\r\n var match\r\n var raw = text,\r\n url\r\n var entities = [],\r\n emojiCode = '',\r\n emojiCoords,\r\n matchIndex\r\n var rawOffset = 0\r\n // var start = tsNow()\r\n while ((match = raw.match(fullRegExp))) {\r\n matchIndex = rawOffset + match.index;\r\n\r\n if(match[3]) { // mentions\r\n entities.push({\r\n _: 'messageEntityMention',\r\n offset: matchIndex + match[1].length,\r\n length: match[2].length + match[3].length\r\n });\r\n } else if(match[4]) {\r\n if(emailRegExp.test(match[4])) { // email\r\n entities.push({\r\n _: 'messageEntityEmail',\r\n offset: matchIndex,\r\n length: match[4].length\r\n });\r\n } else {\r\n var url = false;\r\n var protocol = match[5];\r\n var tld = match[6];\r\n var excluded = '';\r\n if(tld) { // URL\r\n if(!protocol && (tld.substr(0, 4) === 'xn--' || Config.TLD.indexOf(tld.toLowerCase()) !== -1)) {\r\n protocol = 'http://';\r\n }\r\n\r\n if(protocol) {\r\n var balanced = checkBrackets(match[4]);\r\n if (balanced.length !== match[4].length) {\r\n excluded = match[4].substring(balanced.length);\r\n match[4] = balanced;\r\n }\r\n\r\n url = (match[5] ? '' : protocol) + match[4];\r\n }\r\n } else { // IP address\r\n url = (match[5] ? '' : 'http://') + match[4];\r\n }\r\n\r\n if (url) {\r\n entities.push({\r\n _: 'messageEntityUrl',\r\n offset: matchIndex,\r\n length: match[4].length\r\n });\r\n }\r\n }\r\n } else if(match[7]) { // New line\r\n entities.push({\r\n _: 'messageEntityLinebreak',\r\n offset: matchIndex,\r\n length: 1\r\n });\r\n } else if(match[8]/* && !emojiSupported */) { // Emoji\r\n if(emojiCode) matchIndex -= match[8].length;\r\n emojiCode += match[8];\r\n //console.log('hit', match[8], emojiCode.length);\r\n if((emojiCoords = getEmojiSpritesheetCoords(emojiCode))) {\r\n entities.push({\r\n _: 'messageEntityEmoji',\r\n offset: matchIndex,\r\n length: emojiCode.length,\r\n coords: emojiCoords/* ,\r\n title: emojiData[emojiCode][1][0] */\r\n });\r\n\r\n emojiCode = '';\r\n }\r\n } else if(match[10]) { // Hashtag\r\n entities.push({\r\n _: 'messageEntityHashtag',\r\n offset: matchIndex + match[9].length,\r\n length: match[10].length\r\n });\r\n } else if(match[12]) { // Bot command\r\n entities.push({\r\n _: 'messageEntityBotCommand',\r\n offset: matchIndex + match[11].length,\r\n length: 1 + match[12].length + (match[13] ? 1 + match[13].length : 0)\r\n });\r\n }\r\n\r\n raw = raw.substr(match.index + match[0].length);\r\n rawOffset += match.index + match[0].length;\r\n }\r\n\r\n // if (entities.length) {\r\n // console.log('parse entities', text, entities.slice())\r\n // }\r\n return entities\r\n}\r\nfunction parseEmojis (text) {\r\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\r\n var emojiCode = EmojiHelper.shortcuts[shortcut]\r\n if (emojiCode !== undefined) {\r\n return EmojiHelper.emojis[emojiCode][0]\r\n }\r\n return all\r\n })\r\n}\r\nfunction parseMarkdown (text, entities, noTrim) {\r\n if (!markdownTestRegExp.test(text)) {\r\n return noTrim ? text : text.trim()\r\n }\r\n var raw = text\r\n var match\r\n var newText = []\r\n var rawOffset = 0\r\n var matchIndex\r\n while (match = raw.match(markdownRegExp)) {\r\n matchIndex = rawOffset + match.index\r\n newText.push(raw.substr(0, match.index))\r\n var text = (match[3] || match[8] || match[11])\r\n rawOffset -= text.length\r\n text = text.replace(/^\\s+|\\s+$/g, '')\r\n rawOffset += text.length\r\n if (text.match(/^`*$/)) {\r\n newText.push(match[0])\r\n }\r\n else if (match[3]) { // pre\r\n if (match[5] == '\\n') {\r\n match[5] = ''\r\n rawOffset -= 1\r\n }\r\n newText.push(match[1] + text + match[5])\r\n entities.push({\r\n _: 'messageEntityPre',\r\n language: '',\r\n offset: matchIndex + match[1].length,\r\n length: text.length\r\n })\r\n rawOffset -= match[2].length + match[4].length\r\n } else if (match[7]) { // code|italic|bold\r\n newText.push(match[6] + text + match[9])\r\n entities.push({\r\n _: markdownEntities[match[7]],\r\n offset: matchIndex + match[6].length,\r\n length: text.length\r\n })\r\n rawOffset -= match[7].length * 2\r\n } else if (match[11]) { // custom mention\r\n newText.push(text)\r\n entities.push({\r\n _: 'messageEntityMentionName',\r\n user_id: match[10],\r\n offset: matchIndex,\r\n length: text.length\r\n })\r\n rawOffset -= match[0].length - text.length\r\n }\r\n raw = raw.substr(match.index + match[0].length)\r\n rawOffset += match.index + match[0].length\r\n }\r\n newText.push(raw)\r\n newText = newText.join('')\r\n if (!newText.replace(/\\s+/g, '').length) {\r\n newText = text\r\n entities.splice(0, entities.length)\r\n }\r\n if (!entities.length && !noTrim) {\r\n newText = newText.trim()\r\n }\r\n return newText\r\n}\r\nfunction mergeEntities (currentEntities, newEntities, fromApi) {\r\n var totalEntities = newEntities.slice()\r\n var i\r\n var len = currentEntities.length\r\n var j\r\n var len2 = newEntities.length\r\n var startJ = 0\r\n var curEntity\r\n var newEntity\r\n var start, end\r\n var cStart, cEnd\r\n var bad\r\n for (i = 0; i < len; i++) {\r\n curEntity = currentEntities[i]\r\n if (fromApi &&\r\n curEntity._ != 'messageEntityLinebreak' &&\r\n curEntity._ != 'messageEntityEmoji') {\r\n continue\r\n }\r\n // console.log('s', curEntity, newEntities)\r\n start = curEntity.offset\r\n end = start + curEntity.length\r\n bad = false\r\n for (j = startJ; j < len2; j++) {\r\n newEntity = newEntities[j]\r\n cStart = newEntity.offset\r\n cEnd = cStart + newEntity.length\r\n if (cStart <= start) {\r\n startJ = j\r\n }\r\n if (start >= cStart && start < cEnd ||\r\n end > cStart && end <= cEnd) {\r\n // console.log('bad', curEntity, newEntity)\r\n if (fromApi &&\r\n start >= cStart && end <= cEnd) {\r\n if (newEntity.nested === undefined) {\r\n newEntity.nested = []\r\n }\r\n curEntity.offset -= cStart\r\n newEntity.nested.push(copy(curEntity))\r\n }\r\n bad = true\r\n break\r\n }\r\n if (cStart >= end) {\r\n break\r\n }\r\n }\r\n if (bad) {\r\n continue\r\n }\r\n totalEntities.push(curEntity)\r\n }\r\n totalEntities.sort(function (a, b) {\r\n return a.offset - b.offset\r\n })\r\n // console.log('merge', currentEntities, newEntities, totalEntities)\r\n return totalEntities\r\n}\r\nfunction wrapRichNestedText (text, nested, options) {\r\n if (nested === undefined) {\r\n return encodeEntities(text)\r\n }\r\n options.hasNested = true\r\n return wrapRichText(text, {entities: nested, nested: true})\r\n}\r\nfunction wrapRichText (text, options = {}) {\r\n if(!text || !text.length) {\r\n return ''\r\n }\r\n\r\n var entities = options.entities;\r\n var contextSite = options.contextSite || 'Telegram';\r\n var contextExternal = contextSite != 'Telegram';\r\n var emojiFound = false;\r\n if(entities === undefined) {\r\n entities = parseEntities(text, options);\r\n }\r\n\r\n //console.log('wrapRichText got entities:', text, entities);\r\n var len = entities.length;\r\n var entity;\r\n var entityText;\r\n var skipEntity;\r\n var url;\r\n var html = [];\r\n var lastOffset = 0;\r\n var curEmojiSize = options.emojiIconSize || emojiIconSize;\r\n for(var i = 0; i < len; i++) {\r\n entity = entities[i];\r\n if(entity.offset > lastOffset) {\r\n html.push(\r\n encodeEntities(text.substr(lastOffset, entity.offset - lastOffset))\r\n );\r\n } else if(entity.offset < lastOffset) {\r\n continue;\r\n }\r\n\r\n skipEntity = false;\r\n entityText = text.substr(entity.offset, entity.length);\r\n switch(entity._) {\r\n case 'messageEntityMention':\r\n var contextUrl = !options.noLinks && siteMentions[contextSite]\r\n if (!contextUrl) {\r\n skipEntity = true\r\n break\r\n }\r\n var username = entityText.substr(1)\r\n var attr = ''\r\n if (options.highlightUsername &&\r\n options.highlightUsername.toLowerCase() == username.toLowerCase()) {\r\n attr = 'class=\"im_message_mymention\"'\r\n }\r\n html.push(\r\n '',\r\n encodeEntities(entityText),\r\n ''\r\n )\r\n break\r\n case 'messageEntityMentionName':\r\n if (options.noLinks) {\r\n skipEntity = true\r\n break\r\n }\r\n html.push(\r\n '',\r\n encodeEntities(entityText),\r\n ''\r\n )\r\n break\r\n case 'messageEntityHashtag':\r\n var contextUrl = !options.noLinks && siteHashtags[contextSite]\r\n if (!contextUrl) {\r\n skipEntity = true\r\n break\r\n }\r\n var hashtag = entityText.substr(1)\r\n html.push(\r\n '',\r\n encodeEntities(entityText),\r\n ''\r\n )\r\n break\r\n case 'messageEntityEmail':\r\n if (options.noLinks) {\r\n skipEntity = true\r\n break\r\n }\r\n html.push(\r\n '',\r\n encodeEntities(entityText),\r\n ''\r\n )\r\n break\r\n case 'messageEntityUrl':\r\n case 'messageEntityTextUrl':\r\n var inner\r\n if (entity._ == 'messageEntityTextUrl') {\r\n url = entity.url\r\n url = wrapUrl(url, true)\r\n inner = wrapRichNestedText(entityText, entity.nested, options)\r\n } else {\r\n url = wrapUrl(entityText, false)\r\n inner = encodeEntities(replaceUrlEncodings(entityText))\r\n }\r\n if (options.noLinks) {\r\n html.push(inner);\r\n } else {\r\n html.push(\r\n '',\r\n inner,\r\n ''\r\n )\r\n }\r\n break\r\n case 'messageEntityLinebreak':\r\n html.push(options.noLinebreaks ? ' ' : '
')\r\n break\r\n case 'messageEntityEmoji':\r\n \r\n /* var inner = `${encodeEntities(entityText)}`; */\r\n /* var inner = `\\u200B`; */\r\n\r\n /* if(emojiSupported) {\r\n html.push(encodeEntities(entityText));\r\n } else {\r\n *///html.push(`${emojiSupported ? encodeEntities(entityText) : inner}\\u200B`);\r\n //}\r\n\r\n inner = `
`;\r\n\r\n //html.push(`${emojiSupported ? encodeEntities(entityText) : inner}\\u200B`);\r\n\r\n html.push(emojiSupported ? `${encodeEntities(entityText)}` : inner);\r\n\r\n emojiFound = true;\r\n break\r\n case 'messageEntityBotCommand':\r\n if (options.noLinks || options.noCommands || contextExternal) {\r\n skipEntity = true\r\n break\r\n }\r\n var command = entityText.substr(1)\r\n var bot\r\n var atPos\r\n if ((atPos = command.indexOf('@')) != -1) {\r\n bot = command.substr(atPos + 1)\r\n command = command.substr(0, atPos)\r\n } else {\r\n bot = options.fromBot\r\n }\r\n html.push(\r\n '',\r\n encodeEntities(entityText),\r\n ''\r\n )\r\n break\r\n case 'messageEntityBold':\r\n html.push(\r\n '',\r\n wrapRichNestedText(entityText, entity.nested, options),\r\n ''\r\n )\r\n break\r\n case 'messageEntityItalic':\r\n html.push(\r\n '',\r\n wrapRichNestedText(entityText, entity.nested, options),\r\n ''\r\n )\r\n break\r\n case 'messageEntityCode':\r\n html.push(\r\n '',\r\n encodeEntities(entityText),\r\n '
'\r\n )\r\n break\r\n case 'messageEntityPre':\r\n html.push(\r\n '',\r\n encodeEntities(entityText),\r\n '
'\r\n )\r\n break\r\n default:\r\n skipEntity = true\r\n }\r\n lastOffset = entity.offset + (skipEntity ? 0 : entity.length)\r\n }\r\n\r\n html.push(encodeEntities(text.substr(lastOffset))); // may be empty string\r\n //console.log(html);\r\n text = html.join('')//$sanitize(html.join(''))\r\n /* if (!options.nested && (emojiFound || options.hasNested)) {\r\n text = text.replace(/\\ufe0f|️|�|/g, '', text)\r\n var emojiSizeClass = curEmojiSize == 18 ? '' : (' emoji-w' + curEmojiSize)\r\n text = text.replace(/]*)?) class=\"emoji emoji-(\\d)-(\\d+)-(\\d+)\"(.+?)<\\/span>/g,\r\n '')\r\n } */\r\n return text;//$sce.trustAs('html', text)\r\n}\r\nfunction wrapDraftText (text, options) {\r\n if (!text || !text.length) {\r\n return ''\r\n }\r\n options = options || {}\r\n var entities = options.entities\r\n if (entities === undefined) {\r\n entities = parseEntities(text, options)\r\n }\r\n var i = 0\r\n var len = entities.length\r\n var entity\r\n var entityText\r\n var skipEntity\r\n var code = []\r\n var lastOffset = 0\r\n for (i = 0; i < len; i++) {\r\n entity = entities[i]\r\n if (entity.offset > lastOffset) {\r\n code.push(\r\n text.substr(lastOffset, entity.offset - lastOffset)\r\n )\r\n }\r\n else if (entity.offset < lastOffset) {\r\n continue\r\n }\r\n skipEntity = false\r\n entityText = text.substr(entity.offset, entity.length)\r\n switch (entity._) {\r\n case 'messageEntityEmoji':\r\n code.push(\r\n ':',\r\n entity.title,\r\n ':'\r\n )\r\n break\r\n case 'messageEntityCode':\r\n code.push(\r\n '`', entityText, '`'\r\n )\r\n break\r\n case 'messageEntityBold':\r\n code.push(\r\n '**', entityText, '**'\r\n )\r\n break\r\n case 'messageEntityItalic':\r\n code.push(\r\n '__', entityText, '__'\r\n )\r\n break\r\n case 'messageEntityPre':\r\n code.push(\r\n '```', entityText, '```'\r\n )\r\n break\r\n case 'messageEntityMentionName':\r\n code.push(\r\n '@', entity.user_id, ' (', entityText, ')'\r\n )\r\n break\r\n default:\r\n skipEntity = true\r\n }\r\n lastOffset = entity.offset + (skipEntity ? 0 : entity.length)\r\n }\r\n code.push(text.substr(lastOffset))\r\n return code.join('')\r\n}\r\nfunction checkBrackets (url) {\r\n var urlLength = url.length\r\n var urlOpenBrackets = url.split('(').length - 1\r\n var urlCloseBrackets = url.split(')').length - 1\r\n while (urlCloseBrackets > urlOpenBrackets &&\r\n url.charAt(urlLength - 1) === ')') {\r\n url = url.substr(0, urlLength - 1)\r\n urlCloseBrackets--\r\n urlLength--\r\n }\r\n if (urlOpenBrackets > urlCloseBrackets) {\r\n url = url.replace(/\\)+$/, '')\r\n }\r\n return url\r\n}\r\n\r\nfunction replaceUrlEncodings(urlWithEncoded) {\r\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, function (str) {\r\n try {\r\n return decodeURIComponent(str);\r\n } catch (e) {\r\n return str;\r\n }\r\n });\r\n}\r\n\r\nfunction wrapPlainText(text, options = {}) {\r\n if(emojiSupported) {\r\n return text;\r\n }\r\n\r\n if(!text || !text.length) {\r\n return '';\r\n }\r\n\r\n text = text.replace(/\\ufe0f/g, '', text);\r\n var match;\r\n var raw = text;\r\n var text = [],\r\n emojiTitle;\r\n while((match = raw.match(fullRegExp))) {\r\n text.push(raw.substr(0, match.index))\r\n if(match[8]) {\r\n if((emojiCode = EmojiHelper.emojiMap[match[8]]) &&\r\n (emojiTitle = emojiData[emojiCode][1][0])) {\r\n text.push(':' + emojiTitle + ':');\r\n } else {\r\n text.push(match[0]);\r\n }\r\n } else {\r\n text.push(match[0]);\r\n }\r\n\r\n raw = raw.substr(match.index + match[0].length);\r\n }\r\n text.push(raw);\r\n return text.join('');\r\n}\r\nfunction wrapEmojiText(text) {\r\n if(!text) return '';\r\n\r\n let entities = parseEntities(text).filter(e => e._ == 'messageEntityEmoji');\r\n return wrapRichText(text, {entities});\r\n}\r\nfunction wrapUrl (url, unsafe) {\r\n if (!url.match(/^https?:\\/\\//i)) {\r\n url = 'http://' + url\r\n }\r\n var tgMeMatch\r\n var telescoPeMatch\r\n if (unsafe == 2) {\r\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url)\r\n }\r\n else if ((tgMeMatch = url.match(/^https?:\\/\\/t(?:elegram)?\\.me\\/(.+)/))) {\r\n var fullPath = tgMeMatch[1]\r\n var path = fullPath.split('/')\r\n switch (path[0]) {\r\n case 'joinchat':\r\n url = 'tg://join?invite=' + path[1]\r\n break\r\n case 'addstickers':\r\n url = 'tg://addstickers?set=' + path[1]\r\n break\r\n default:\r\n if (path[1] && path[1].match(/^\\d+$/)) {\r\n url = 'tg://resolve?domain=' + path[0] + '&post=' + path[1]\r\n }\r\n else if (path.length == 1) {\r\n var domainQuery = path[0].split('?')\r\n var domain = domainQuery[0]\r\n var query = domainQuery[1]\r\n if (domain == 'iv') {\r\n var match = (query || '').match(/url=([^&=]+)/)\r\n if (match) {\r\n url = match[1]\r\n try {\r\n url = decodeURIComponent(url)\r\n } catch (e) {}\r\n return wrapUrl(url, unsafe)\r\n }\r\n }\r\n url = 'tg://resolve?domain=' + domain + (query ? '&' + query : '')\r\n }\r\n }\r\n }\r\n else if ((telescoPeMatch = url.match(/^https?:\\/\\/telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\r\n url = 'tg://resolve?domain=' + telescoPeMatch[1] + '&post=' + telescoPeMatch[2]\r\n }\r\n else if (unsafe) {\r\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url)\r\n }\r\n return url\r\n}\r\n\r\nlet RichTextProcessor = {\r\n wrapRichText: wrapRichText,\r\n wrapPlainText: wrapPlainText,\r\n wrapDraftText: wrapDraftText,\r\n wrapUrl: wrapUrl,\r\n wrapEmojiText: wrapEmojiText,\r\n parseEntities: parseEntities,\r\n parseMarkdown: parseMarkdown,\r\n parseEmojis: parseEmojis,\r\n mergeEntities: mergeEntities,\r\n getEmojiSpritesheetCoords: getEmojiSpritesheetCoords,\r\n emojiSupported: emojiSupported\r\n};\r\n\r\nwindow.RichTextProcessor = RichTextProcessor;\r\n\r\nexport {RichTextProcessor};\r\n\r\n"
+ },
+ {
+ "id": 4,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appUsersManager.ts",
+ "name": "./src/lib/appManagers/appUsersManager.ts",
+ "index": 62,
+ "index2": 54,
+ "size": 16398,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "issuerId": 50,
+ "issuerName": "./src/lib/services.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 25,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
+ "name": "./src/components/pageIm.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ },
+ {
+ "id": 50,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "name": "./src/lib/services.ts",
+ "profile": {
+ "factory": 323,
+ "building": 561,
+ "dependencies": 110
+ }
+ }
+ ],
+ "profile": {
+ "factory": 270,
+ "building": 981,
+ "dependencies": 860
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 10,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPeersManager.ts",
+ "module": "./src/lib/appManagers/appPeersManager.ts",
+ "moduleName": "./src/lib/appManagers/appPeersManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appUsersManager",
+ "loc": "6:42-70"
+ },
+ {
+ "moduleId": 11,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPhotosManager.ts",
+ "module": "./src/lib/appManagers/appPhotosManager.ts",
+ "moduleName": "./src/lib/appManagers/appPhotosManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appUsersManager",
+ "loc": "15:42-70"
+ },
+ {
+ "moduleId": 12,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appChatsManager.ts",
+ "module": "./src/lib/appManagers/appChatsManager.ts",
+ "moduleName": "./src/lib/appManagers/appChatsManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appUsersManager",
+ "loc": "8:42-70"
+ },
+ {
+ "moduleId": 15,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMessagesManager.ts",
+ "module": "./src/lib/appManagers/appMessagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appMessagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appUsersManager",
+ "loc": "18:42-70"
+ },
+ {
+ "moduleId": 19,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appImManager.ts",
+ "module": "./src/lib/appManagers/appImManager.ts",
+ "moduleName": "./src/lib/appManagers/appImManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appUsersManager",
+ "loc": "24:42-70"
+ },
+ {
+ "moduleId": 26,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarLeft.ts",
+ "module": "./src/lib/appManagers/appSidebarLeft.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarLeft.ts",
+ "type": "cjs require",
+ "userRequest": "./appUsersManager",
+ "loc": "23:42-70"
+ },
+ {
+ "moduleId": 27,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/apiUpdatesManager.ts",
+ "module": "./src/lib/appManagers/apiUpdatesManager.ts",
+ "moduleName": "./src/lib/appManagers/apiUpdatesManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appUsersManager",
+ "loc": "10:42-70"
+ },
+ {
+ "moduleId": 28,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appDialogsManager.ts",
+ "module": "./src/lib/appManagers/appDialogsManager.ts",
+ "moduleName": "./src/lib/appManagers/appDialogsManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appUsersManager",
+ "loc": "21:42-70"
+ },
+ {
+ "moduleId": 37,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appProfileManager.ts",
+ "module": "./src/lib/appManagers/appProfileManager.ts",
+ "moduleName": "./src/lib/appManagers/appProfileManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appUsersManager",
+ "loc": "10:42-70"
+ },
+ {
+ "moduleId": 45,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarRight.ts",
+ "module": "./src/lib/appManagers/appSidebarRight.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarRight.ts",
+ "type": "cjs require",
+ "userRequest": "./appUsersManager",
+ "loc": "12:42-70"
+ },
+ {
+ "moduleId": 50,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "module": "./src/lib/services.ts",
+ "moduleName": "./src/lib/services.ts",
+ "type": "cjs require",
+ "userRequest": "./appManagers/appUsersManager",
+ "loc": "7:42-82"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 3,
+ "source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst richtextprocessor_1 = require(\"../richtextprocessor\");\nconst appChatsManager_1 = __importDefault(require(\"./appChatsManager\"));\nconst apiManager_1 = __importDefault(require(\"../mtproto/apiManager\"));\nconst serverTimeManager_1 = __importDefault(require(\"../mtproto/serverTimeManager\"));\nclass AppUsersManager {\n constructor() {\n this.users = {};\n this.usernames = {};\n this.userAccess = {};\n this.cachedPhotoLocations = {};\n this.contactsIndex = utils_1.SearchIndexManager.createIndex();\n apiManager_1.default.getUserID().then((id) => {\n this.myID = id;\n });\n utils_1.$rootScope.$on('user_auth', (e) => {\n let userAuth = e.detail;\n this.myID = userAuth ? userAuth.id : 0;\n });\n setInterval(this.updateUsersStatuses.bind(this), 60000);\n utils_1.$rootScope.$on('stateSynchronized', this.updateUsersStatuses.bind(this));\n utils_1.$rootScope.$on('apiUpdate', (e) => {\n let update = e.detail;\n //console.log('on apiUpdate', update);\n switch (update._) {\n case 'updateUserStatus':\n var userID = update.user_id;\n var user = this.users[userID];\n if (user) {\n user.status = update.status;\n if (user.status) {\n if (user.status.expires) {\n user.status.expires -= serverTimeManager_1.default.serverTimeOffset;\n }\n if (user.status.was_online) {\n user.status.was_online -= serverTimeManager_1.default.serverTimeOffset;\n }\n }\n user.sortStatus = this.getUserStatusForSort(user.status);\n utils_1.$rootScope.$broadcast('user_update', userID);\n } //////else console.warn('No user by id:', userID);\n break;\n case 'updateUserPhoto':\n var userID = update.user_id;\n var user = this.users[userID];\n if (user) {\n this.forceUserOnline(userID);\n if (!user.photo) {\n user.photo = update.photo;\n }\n else {\n utils_1.safeReplaceObject(user.photo, update.photo);\n }\n if (this.cachedPhotoLocations[userID] !== undefined) {\n utils_1.safeReplaceObject(this.cachedPhotoLocations[userID], update.photo ?\n update.photo : { empty: true });\n }\n utils_1.$rootScope.$broadcast('user_update', userID);\n }\n else\n console.warn('No user by id:', userID);\n break;\n case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ == 'contactLinkContact');\n break;\n }\n });\n }\n /* public fillContacts () {\n if(this.contactsFillPromise) {\n return this.contactsFillPromise;\n }\n \n return this.contactsFillPromise = MTProto.apiManager.invokeApi('contacts.getContacts', {\n hash: 0\n }).then((result: any) => {\n var userID, searchText;\n var i;\n this.contactsList = [];\n this.saveApiUsers(result.users);\n \n for(var i = 0; i < result.contacts.length; i++) {\n userID = result.contacts[i].user_id\n this.contactsList.push(userID);\n //SearchIndexManager.indexObject(userID, getUserSearchText(userID), contactsIndex); WARNING\n }\n \n return this.contactsList;\n })\n } */\n getUserSearchText(id) {\n var user = this.users[id];\n if (!user) {\n return false;\n }\n var serviceText = '';\n if (user.pFlags.self) {\n serviceText = 'user_name_saved_msgs_raw';\n }\n return (user.first_name || '') +\n ' ' + (user.last_name || '') +\n ' ' + (user.phone || '') +\n ' ' + (user.username || '') +\n ' ' + serviceText;\n }\n /* function getContacts (query) {\n return fillContacts().then(function (contactsList) {\n if (angular.isString(query) && query.length) {\n var results = SearchIndexManager.search(query, contactsIndex)\n var filteredContactsList = []\n \n for (var i = 0; i < contactsList.length; i++) {\n if (results[contactsList[i]]) {\n filteredContactsList.push(contactsList[i])\n }\n }\n contactsList = filteredContactsList\n }\n \n contactsList.sort(function (userID1, userID2) {\n var sortName1 = (users[userID1] || {}.sortName) || ''\n var sortName2 = (users[userID2] || {}.sortName) || ''\n if (sortName1 == sortName2) {\n return 0\n }\n return sortName1 > sortName2 ? 1 : -1\n })\n \n return contactsList\n })\n } */\n resolveUsername(username) {\n return this.usernames[username] || 0;\n }\n saveApiUsers(apiUsers) {\n apiUsers.forEach((user) => this.saveApiUser(user));\n }\n saveApiUser(apiUser, noReplace) {\n if (!utils_1.isObject(apiUser) ||\n noReplace && utils_1.isObject(this.users[apiUser.id]) && this.users[apiUser.id].first_name) {\n return;\n }\n var userID = apiUser.id;\n var result = this.users[userID];\n if (apiUser.pFlags === undefined) {\n apiUser.pFlags = {};\n }\n if (apiUser.pFlags.min) {\n if (result !== undefined) {\n return;\n }\n }\n if (apiUser.phone) {\n //apiUser.rPhone = $filter('phoneNumber')(apiUser.phone); // warning\n }\n apiUser.num = (Math.abs(userID) % 8) + 1;\n if (apiUser.first_name) {\n apiUser.rFirstName = richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.first_name, { noLinks: true, noLinebreaks: true });\n apiUser.rFullName = apiUser.last_name ? richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.first_name + ' ' + (apiUser.last_name || ''), { noLinks: true, noLinebreaks: true }) : apiUser.rFirstName;\n }\n else {\n apiUser.rFirstName = richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.last_name, { noLinks: true, noLinebreaks: true }) || apiUser.rPhone || 'user_first_name_deleted';\n apiUser.rFullName = richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.last_name, { noLinks: true, noLinebreaks: true }) || apiUser.rPhone || 'user_name_deleted';\n }\n if (apiUser.username) {\n var searchUsername = utils_1.SearchIndexManager.cleanUsername(apiUser.username);\n this.usernames[searchUsername] = userID;\n }\n apiUser.sortName = apiUser.pFlags.deleted ? '' : utils_1.SearchIndexManager.cleanSearchText(apiUser.first_name + ' ' + (apiUser.last_name || ''));\n var nameWords = apiUser.sortName.split(' ');\n var firstWord = nameWords.shift();\n var lastWord = nameWords.pop();\n apiUser.initials = firstWord.charAt(0) + (lastWord ? lastWord.charAt(0) : firstWord.charAt(1));\n if (apiUser.status) {\n if (apiUser.status.expires) {\n apiUser.status.expires -= serverTimeManager_1.default.serverTimeOffset;\n }\n if (apiUser.status.was_online) {\n apiUser.status.was_online -= serverTimeManager_1.default.serverTimeOffset;\n }\n }\n if (apiUser.pFlags.bot) {\n apiUser.sortStatus = -1;\n }\n else {\n apiUser.sortStatus = this.getUserStatusForSort(apiUser.status);\n }\n var result = this.users[userID];\n if (result === undefined) {\n result = this.users[userID] = apiUser;\n }\n else {\n utils_1.safeReplaceObject(result, apiUser);\n }\n utils_1.$rootScope.$broadcast('user_update', userID);\n if (this.cachedPhotoLocations[userID] !== undefined) {\n utils_1.safeReplaceObject(this.cachedPhotoLocations[userID], apiUser &&\n apiUser.photo ? apiUser.photo : { empty: true });\n }\n }\n saveUserAccess(id, accessHash) {\n this.userAccess[id] = accessHash;\n }\n getUserStatusForSort(status) {\n if (status) {\n var expires = status.expires || status.was_online;\n if (expires) {\n return expires;\n }\n var timeNow = utils_1.tsNow(true);\n switch (status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n }\n }\n return 0;\n }\n getUser(id) {\n if (utils_1.isObject(id)) {\n return id;\n }\n return this.users[id] || { id: id, deleted: true, num: 1, access_hash: this.userAccess[id] };\n }\n getSelf() {\n return this.getUser(this.myID);\n }\n isBot(id) {\n return this.users[id] && this.users[id].pFlags.bot;\n }\n hasUser(id, allowMin) {\n var user = this.users[id];\n return utils_1.isObject(user) && (allowMin || !user.pFlags.min);\n }\n getUserPhoto(id) {\n var user = this.getUser(id);\n if (this.cachedPhotoLocations[id] === undefined) {\n this.cachedPhotoLocations[id] = user && user.photo ? user.photo : { empty: true };\n }\n return this.cachedPhotoLocations[id];\n }\n getUserString(id) {\n var user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n getUserInput(id) {\n var user = this.getUser(id);\n if (user.pFlags && user.pFlags.self) {\n return { _: 'inputUserSelf' };\n }\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash || 0\n };\n }\n updateUsersStatuses() {\n var timestampNow = utils_1.tsNow(true);\n for (let i in this.users) {\n let user = this.users[i];\n if (user.status &&\n user.status._ == 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = user.status.wasStatus || { _: 'userStatusOffline', was_online: user.status.expires };\n delete user.status.wasStatus;\n utils_1.$rootScope.$broadcast('user_update', user.id);\n }\n }\n }\n forceUserOnline(id) {\n if (this.isBot(id)) {\n return;\n }\n var user = this.getUser(id);\n if (user &&\n user.status &&\n user.status._ != 'userStatusOnline' &&\n user.status._ != 'userStatusEmpty') {\n var wasStatus;\n if (user.status._ != 'userStatusOffline') {\n delete user.status.wasStatus;\n wasStatus = utils_1.copy(user.status);\n }\n user.status = {\n _: 'userStatusOnline',\n expires: utils_1.tsNow(true) + 60,\n wasStatus: wasStatus\n };\n user.sortStatus = this.getUserStatusForSort(user.status);\n utils_1.$rootScope.$broadcast('user_update', id);\n }\n }\n wrapForFull(id) {\n var user = this.getUser(id);\n return user;\n }\n /* function importContact (phone, firstName, lastName) {\n return MtpApiManager.invokeApi('contacts.importContacts', {\n contacts: [{\n _: 'inputPhoneContact',\n client_id: '1',\n phone: phone,\n first_name: firstName,\n last_name: lastName\n }],\n replace: false\n }).then(function (importedContactsResult) {\n saveApiUsers(importedContactsResult.users)\n \n var foundUserID = false\n angular.forEach(importedContactsResult.imported, function (importedContact) {\n onContactUpdated(foundUserID = importedContact.user_id, true)\n })\n \n return foundUserID || false\n })\n }\n \n function importContacts (contacts) {\n var inputContacts = [],\n i\n var j\n \n for (i = 0; i < contacts.length; i++) {\n for (j = 0; j < contacts[i].phones.length; j++) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n })\n }\n }\n \n return MtpApiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts,\n replace: false\n }).then(function (importedContactsResult) {\n saveApiUsers(importedContactsResult.users)\n \n var result = []\n angular.forEach(importedContactsResult.imported, function (importedContact) {\n onContactUpdated(importedContact.user_id, true)\n result.push(importedContact.user_id)\n })\n \n return result\n })\n } */\n deleteContacts(userIDs) {\n var ids = [];\n userIDs.forEach((userID) => {\n ids.push(this.getUserInput(userID));\n });\n return apiManager_1.default.invokeApi('contacts.deleteContacts', {\n id: ids\n }).then(() => {\n userIDs.forEach((userID) => {\n this.onContactUpdated(userID, false);\n });\n });\n }\n getTopPeers() {\n return apiManager_1.default.invokeApi('contacts.getTopPeers', {\n flags: 1,\n correspondents: true,\n offset: 0,\n limit: 5,\n hash: 0,\n }).then((peers) => {\n //console.log(peers);\n this.saveApiUsers(peers.users);\n appChatsManager_1.default.saveApiChats(peers.chats);\n return peers.categories;\n });\n }\n searchContacts(query, limit = 20) {\n return apiManager_1.default.invokeApi('contacts.search', {\n q: query,\n limit\n }).then((peers) => {\n //console.log(peers);\n this.saveApiUsers(peers.users);\n appChatsManager_1.default.saveApiChats(peers.chats);\n return peers;\n });\n }\n onContactUpdated(userID, isContact) {\n userID = parseInt('' + userID);\n if (Array.isArray(this.contactsList)) {\n var curPos = this.contactsList.indexOf(userID);\n var curIsContact = curPos != -1;\n if (isContact != curIsContact) {\n if (isContact) {\n this.contactsList.push(userID);\n utils_1.SearchIndexManager.indexObject(userID, this.getUserSearchText(userID), this.contactsIndex);\n }\n else {\n this.contactsList.splice(curPos, 1);\n }\n utils_1.$rootScope.$broadcast('contacts_update', userID);\n }\n }\n }\n setUserStatus(userID, offline) {\n if (this.isBot(userID)) {\n return;\n }\n var user = this.users[userID];\n if (user) {\n var status = offline ? {\n _: 'userStatusOffline',\n was_online: utils_1.tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: utils_1.tsNow(true) + 500\n };\n user.status = status;\n user.sortStatus = this.getUserStatusForSort(user.status);\n utils_1.$rootScope.$broadcast('user_update', userID);\n }\n }\n}\nexports.AppUsersManager = AppUsersManager;\nexports.default = new AppUsersManager();\n"
+ },
+ {
+ "id": 5,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/misc.ts",
+ "name": "./src/components/misc.ts",
+ "index": 22,
+ "index2": 48,
+ "size": 7241,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "issuerId": 52,
+ "issuerName": "./src/index.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ }
+ ],
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 19,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appImManager.ts",
+ "module": "./src/lib/appManagers/appImManager.ts",
+ "moduleName": "./src/lib/appManagers/appImManager.ts",
+ "type": "cjs require",
+ "userRequest": "../../components/misc",
+ "loc": "44:15-47"
+ },
+ {
+ "moduleId": 25,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
+ "module": "./src/components/pageIm.ts",
+ "moduleName": "./src/components/pageIm.ts",
+ "type": "cjs require",
+ "userRequest": "./misc",
+ "loc": "14:15-32"
+ },
+ {
+ "moduleId": 26,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarLeft.ts",
+ "module": "./src/lib/appManagers/appSidebarLeft.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarLeft.ts",
+ "type": "cjs require",
+ "userRequest": "../../components/misc",
+ "loc": "16:15-47"
+ },
+ {
+ "moduleId": 28,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appDialogsManager.ts",
+ "module": "./src/lib/appManagers/appDialogsManager.ts",
+ "moduleName": "./src/lib/appManagers/appDialogsManager.ts",
+ "type": "cjs require",
+ "userRequest": "../../components/misc",
+ "loc": "23:15-47"
+ },
+ {
+ "moduleId": 40,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "module": "./src/components/pageSignIn.ts",
+ "moduleName": "./src/components/pageSignIn.ts",
+ "type": "cjs require",
+ "userRequest": "./misc",
+ "loc": "13:15-32"
+ },
+ {
+ "moduleId": 45,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarRight.ts",
+ "module": "./src/lib/appManagers/appSidebarRight.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarRight.ts",
+ "type": "cjs require",
+ "userRequest": "../../components/misc",
+ "loc": "6:15-47"
+ },
+ {
+ "moduleId": 52,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "module": "./src/index.ts",
+ "moduleName": "./src/index.ts",
+ "type": "cjs require",
+ "userRequest": "./components/misc",
+ "loc": "77:63-91"
+ },
+ {
+ "moduleId": 78,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
+ "module": "./src/components/pageSignUp.ts",
+ "moduleName": "./src/components/pageSignUp.ts",
+ "type": "cjs require",
+ "userRequest": "./misc",
+ "loc": "6:15-32"
+ },
+ {
+ "moduleId": 83,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/emoticonsDropdown.ts",
+ "module": "./src/components/emoticonsDropdown.ts",
+ "moduleName": "./src/components/emoticonsDropdown.ts",
+ "type": "cjs require",
+ "userRequest": "./misc",
+ "loc": "15:15-32"
+ },
+ {
+ "moduleId": 84,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
+ "module": "./src/components/pagePassword.ts",
+ "moduleName": "./src/components/pagePassword.ts",
+ "type": "cjs require",
+ "userRequest": "./misc",
+ "loc": "17:15-32"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 1,
+ "source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst apiManager_1 = __importDefault(require(\"../lib/mtproto/apiManager\"));\nconst utils_1 = require(\"../lib/utils\");\nlet onRippleClick = function (e) {\n var $circle = this.firstElementChild; //this.querySelector('.c-ripple__circle') as HTMLSpanElement;\n var rect = this.parentElement.getBoundingClientRect();\n var x = e.clientX - rect.left; //x position within the element.\n var y = e.clientY - rect.top;\n /* var x = e.pageX - this.parentElement.offsetLeft;\n var y = e.pageY - this.parentElement.offsetTop - this.parentElement.scrollHeight; */\n $circle.style.top = y + 'px';\n $circle.style.left = x + 'px';\n this.classList.add('active');\n //console.log('onrippleclick', e/* e.pageY, this.parentElement.offsetTop */);\n};\nfunction ripple(elem) {\n /* elem.addEventListener('click', function(e) {\n var $circle = elem.querySelector('.c-ripple__circle') as HTMLSpanElement;\n \n var x = e.pageX - elem.offsetLeft;\n var y = e.pageY - elem.offsetTop;\n \n $circle.style.top = y + 'px';\n $circle.style.left = x + 'px';\n \n elem.classList.add('active');\n }); */\n let r = document.createElement('div');\n r.classList.add('c-ripple');\n let span = document.createElement('span');\n span.classList.add('c-ripple__circle');\n r.append(span);\n elem.append(r);\n r.addEventListener('click', onRippleClick);\n let onEnd = () => {\n r.classList.remove('active');\n };\n for (let type of ['animationend', 'webkitAnimationEnd', 'oanimationend', 'MSAnimationEnd']) {\n r.addEventListener(type, onEnd);\n }\n}\nexports.ripple = ripple;\nfunction putPreloader(elem) {\n const html = `\r\n `;\n elem.innerHTML += html;\n}\nexports.putPreloader = putPreloader;\nfunction horizontalMenu(tabs, content, onClick, onTransitionEnd) {\n let hideTimeout = 0;\n let prevTabContent = null;\n let prevId = -1;\n tabs.addEventListener('click', function (e) {\n let target = e.target;\n if (target.tagName != 'LI') {\n target = utils_1.findUpTag(target, 'LI');\n }\n ///////console.log('tabs click:', target);\n if (!target || target.classList.contains('active'))\n return false;\n let prev = tabs.querySelector('li.active');\n prev && prev.classList.remove('active');\n target.classList.add('active');\n let id = utils_1.whichChild(target);\n if (id == prevId)\n return false;\n let tabContent = content.children[id];\n tabContent.classList.add('active');\n /////console.log('mambo rap', prevId, id);\n //content.style.marginLeft = id > 0 ? (-id * 100) + '%' : '';\n let toRight = prevId < id;\n if (prevId != -1) {\n content.style.width = '200%';\n //////console.log('mambo rap setting', toRight);\n content.classList.remove('animated');\n if (toRight) {\n content.classList.add('animated');\n content.style.marginLeft = '-100%';\n }\n else {\n content.style.marginLeft = '-100%';\n setTimeout(() => {\n content.classList.add('animated');\n content.style.marginLeft = '';\n }, 10);\n }\n }\n prevId = id;\n let p = prevTabContent;\n clearTimeout(hideTimeout);\n if (p)\n hideTimeout = setTimeout(() => {\n if (toRight) {\n p.classList.remove('active');\n content.classList.remove('animated');\n content.style.width = '100%';\n }\n /* content.style.marginLeft = '0%';\n content.style.width = '100%'; */\n if (!toRight) {\n p.classList.remove('active');\n content.classList.remove('animated');\n content.style.width = '100%';\n }\n content.style.marginLeft = '';\n if (onTransitionEnd)\n onTransitionEnd();\n }, 200);\n if (onClick)\n onClick(id, tabContent);\n prevTabContent = tabContent;\n });\n}\nexports.horizontalMenu = horizontalMenu;\nfunction getNearestDc() {\n return apiManager_1.default.invokeApi('help.getNearestDc').then((nearestDcResult) => {\n if (nearestDcResult.nearest_dc != nearestDcResult.this_dc) {\n //MTProto.apiManager.baseDcID = nearestDcResult.nearest_dc;\n apiManager_1.default.getNetworker(nearestDcResult.nearest_dc);\n }\n return nearestDcResult;\n });\n}\nexports.getNearestDc = getNearestDc;\nfunction formatPhoneNumber(str) {\n str = str.replace(/\\D/g, '');\n let phoneCode = str.slice(0, 6);\n ////console.log('str', str, phoneCode);\n let sortedCountries = Config.Countries.slice().sort((a, b) => b.phoneCode.length - a.phoneCode.length);\n let country = sortedCountries.find((c) => {\n return c.phoneCode.split(' and ').find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) == 0);\n });\n let pattern = country ? country.pattern || country.phoneCode : '';\n if (country) {\n pattern.split('').forEach((symbol, idx) => {\n if (symbol == ' ' && str[idx] != ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n if (country.pattern) {\n str = str.slice(0, country.pattern.length);\n }\n }\n return { formatted: str, country };\n}\nexports.formatPhoneNumber = formatPhoneNumber;\nlet onMouseMove = (e) => {\n let rect = openedMenu.getBoundingClientRect();\n let { clientX, clientY } = e;\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n if (diffX >= 100 || diffY >= 100) {\n openedMenu.classList.remove('active');\n openedMenu.parentElement.classList.remove('menu-open');\n //openedMenu.parentElement.click();\n }\n //console.log('mousemove', diffX, diffY);\n};\nlet openedMenu = null;\nfunction openBtnMenu(menuElement) {\n if (openedMenu) {\n openedMenu.classList.remove('active');\n openedMenu.parentElement.classList.remove('menu-open');\n }\n openedMenu = menuElement;\n openedMenu.classList.add('active');\n openedMenu.parentElement.classList.add('menu-open');\n window.addEventListener('click', () => {\n if (openedMenu) {\n openedMenu.parentElement.classList.remove('menu-open');\n openedMenu.classList.remove('active');\n openedMenu = null;\n }\n window.removeEventListener('mousemove', onMouseMove);\n }, { once: true });\n window.addEventListener('mousemove', onMouseMove);\n}\nexports.openBtnMenu = openBtnMenu;\n"
+ },
+ {
+ "id": 6,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/storage.ts",
+ "name": "./src/lib/storage.ts",
+ "index": 19,
+ "index2": 19,
+ "size": 1074,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "issuerId": 52,
+ "issuerName": "./src/index.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ }
+ ],
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 1,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiManager.ts",
+ "module": "./src/lib/mtproto/apiManager.ts",
+ "moduleName": "./src/lib/mtproto/apiManager.ts",
+ "type": "cjs require",
+ "userRequest": "../storage",
+ "loc": "22:34-55"
+ },
+ {
+ "moduleId": 15,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMessagesManager.ts",
+ "module": "./src/lib/appManagers/appMessagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appMessagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "../storage",
+ "loc": "24:34-55"
+ },
+ {
+ "moduleId": 16,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/mtproto.ts",
+ "module": "./src/lib/mtproto/mtproto.ts",
+ "moduleName": "./src/lib/mtproto/mtproto.ts",
+ "type": "cjs require",
+ "userRequest": "../storage",
+ "loc": "14:34-55"
+ },
+ {
+ "moduleId": 23,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/serverTimeManager.ts",
+ "module": "./src/lib/mtproto/serverTimeManager.ts",
+ "moduleName": "./src/lib/mtproto/serverTimeManager.ts",
+ "type": "cjs require",
+ "userRequest": "../storage",
+ "loc": "6:34-55"
+ },
+ {
+ "moduleId": 36,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/timeManager.ts",
+ "module": "./src/lib/mtproto/timeManager.ts",
+ "moduleName": "./src/lib/mtproto/timeManager.ts",
+ "type": "cjs require",
+ "userRequest": "../storage",
+ "loc": "6:34-55"
+ },
+ {
+ "moduleId": 37,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appProfileManager.ts",
+ "module": "./src/lib/appManagers/appProfileManager.ts",
+ "moduleName": "./src/lib/appManagers/appProfileManager.ts",
+ "type": "cjs require",
+ "userRequest": "../storage",
+ "loc": "14:34-55"
+ },
+ {
+ "moduleId": 38,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appStickersManager.ts",
+ "module": "./src/lib/appManagers/appStickersManager.ts",
+ "moduleName": "./src/lib/appManagers/appStickersManager.ts",
+ "type": "cjs require",
+ "userRequest": "../storage",
+ "loc": "15:34-55"
+ },
+ {
+ "moduleId": 52,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "module": "./src/index.ts",
+ "moduleName": "./src/index.ts",
+ "type": "cjs require",
+ "userRequest": "./lib/storage",
+ "loc": "67:70-94"
+ },
+ {
+ "moduleId": 68,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/networker.ts",
+ "module": "./src/lib/mtproto/networker.ts",
+ "moduleName": "./src/lib/mtproto/networker.ts",
+ "type": "cjs require",
+ "userRequest": "../storage",
+ "loc": "27:34-55"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 1,
+ "source": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst config_1 = require(\"./config\");\nclass AppStorage {\n setPrefix(newPrefix) {\n config_1.Storage.prefix(newPrefix);\n }\n noPrefix() {\n config_1.Storage.noPrefix();\n }\n proxy(methodName, ..._args) {\n let args = Array.prototype.slice.call(_args);\n let promise = new Promise((resolve, reject) => {\n args.push((result) => {\n resolve(result);\n });\n config_1.Storage[methodName].apply(config_1.Storage, args);\n });\n return promise;\n }\n get(...args) {\n return this.proxy('get', ...args);\n }\n set(...args) {\n //console.trace(...args);\n return this.proxy('set', ...args);\n }\n remove(...args) {\n return this.proxy('remove', ...args);\n }\n clear(...args) {\n return this.proxy('clear', ...args);\n }\n constructor() {\n if (config_1.Modes.test) {\n this.setPrefix('t_');\n }\n }\n}\nexports.default = new AppStorage();\n"
+ },
+ {
+ "id": 7,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto/cryptoworker.ts",
+ "name": "./src/lib/crypto/cryptoworker.ts",
+ "index": 31,
+ "index2": 24,
+ "size": 6765,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
+ "issuerId": 77,
+ "issuerName": "./src/components/pageAuthCode.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 40,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "name": "./src/components/pageSignIn.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ },
+ {
+ "id": 77,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
+ "name": "./src/components/pageAuthCode.ts",
+ "profile": {
+ "factory": 392,
+ "building": 505,
+ "dependencies": 2
+ }
+ }
+ ],
+ "profile": {
+ "factory": 278,
+ "building": 994,
+ "dependencies": 0
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 30,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/wrappers.ts",
+ "module": "./src/components/wrappers.ts",
+ "moduleName": "./src/components/wrappers.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/crypto/cryptoworker",
+ "loc": "16:39-76"
+ },
+ {
+ "moduleId": 41,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/passwordManager.ts",
+ "module": "./src/lib/mtproto/passwordManager.ts",
+ "moduleName": "./src/lib/mtproto/passwordManager.ts",
+ "type": "cjs require",
+ "userRequest": "../crypto/cryptoworker",
+ "loc": "17:39-72"
+ },
+ {
+ "moduleId": 43,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/rsaKeysManager.ts",
+ "module": "./src/lib/mtproto/rsaKeysManager.ts",
+ "moduleName": "./src/lib/mtproto/rsaKeysManager.ts",
+ "type": "cjs require",
+ "userRequest": "../crypto/cryptoworker",
+ "loc": "17:39-72"
+ },
+ {
+ "moduleId": 44,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/authorizer.ts",
+ "module": "./src/lib/mtproto/authorizer.ts",
+ "moduleName": "./src/lib/mtproto/authorizer.ts",
+ "type": "cjs require",
+ "userRequest": "../crypto/cryptoworker",
+ "loc": "23:39-72"
+ },
+ {
+ "moduleId": 68,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/networker.ts",
+ "module": "./src/lib/mtproto/networker.ts",
+ "moduleName": "./src/lib/mtproto/networker.ts",
+ "type": "cjs require",
+ "userRequest": "../crypto/cryptoworker",
+ "loc": "26:39-72"
+ },
+ {
+ "moduleId": 77,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
+ "module": "./src/components/pageAuthCode.ts",
+ "moduleName": "./src/components/pageAuthCode.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/crypto/cryptoworker",
+ "loc": "19:39-76"
+ },
+ {
+ "moduleId": 83,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/emoticonsDropdown.ts",
+ "module": "./src/components/emoticonsDropdown.ts",
+ "moduleName": "./src/components/emoticonsDropdown.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/crypto/cryptoworker",
+ "loc": "22:39-76"
+ },
+ {
+ "moduleId": 84,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
+ "module": "./src/components/pagePassword.ts",
+ "moduleName": "./src/components/pagePassword.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/crypto/cryptoworker",
+ "loc": "16:39-76"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 3,
+ "source": "\"use strict\";\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst bin_utils_1 = require(\"../bin_utils\");\nclass CryptoWorker {\n // @ts-ignore\n // private webCrypto = Config.Modes.webcrypto && window.crypto && (window.crypto.subtle || window.crypto.webkitSubtle); /* || window.msCrypto && window.msCrypto.subtle*/\n // private useSha1Crypto = this.webCrypto && this.webCrypto.digest !== undefined;\n // private useSha256Crypto = this.webCrypto && this.webCrypto.digest !== undefined;\n constructor() {\n this.webWorker = false;\n this.taskID = 0;\n this.awaiting = {};\n this.pending = [];\n this.debug = false;\n console.log(bin_utils_1.dT(), 'CW constructor');\n if (window.Worker /* && 1 == 2 */) {\n Promise.resolve().then(() => __importStar(require('./crypto.worker.js'))).then((CryptoWebWorker) => {\n //console.log(CryptoWebWorker);\n var tmpWorker = new CryptoWebWorker.default();\n //var tmpWorker = new Worker();\n tmpWorker.onmessage = (e) => {\n if (!this.webWorker) {\n this.webWorker = tmpWorker;\n console.info(bin_utils_1.dT(), 'CW set webWorker');\n this.releasePending();\n }\n else {\n this.finalizeTask(e.data.taskID, e.data.result);\n }\n };\n tmpWorker.onerror = (error) => {\n console.error('CW error', error /* , error.stack */);\n this.webWorker = false;\n };\n });\n }\n }\n finalizeTask(taskID, result) {\n let deferred = this.awaiting[taskID];\n if (deferred !== undefined) {\n this.debug && console.log(bin_utils_1.dT(), 'CW done', deferred.taskName, result);\n deferred.resolve(result);\n delete this.awaiting[taskID];\n }\n }\n performTaskWorker(task, ...args) {\n this.debug && console.log(bin_utils_1.dT(), 'CW start', task, args);\n return new Promise((resolve, reject) => {\n this.awaiting[this.taskID] = { resolve, reject, taskName: task };\n let params = {\n task,\n taskID: this.taskID,\n args\n };\n //(this.webWorker as Worker).postMessage(params);\n this.pending.push(params);\n this.releasePending();\n this.taskID++;\n });\n }\n releasePending() {\n if (this.webWorker) {\n this.pending.forEach(pending => {\n this.webWorker.postMessage(pending);\n });\n this.pending.length = 0;\n }\n }\n sha1Hash(bytes) {\n //if(this.webWorker) {\n return this.performTaskWorker('sha1-hash', bytes);\n //}\n /* if(this.useSha1Crypto) {\n console.error('usesha1crypto');\n // We don't use buffer since typedArray.subarray(...).buffer gives the whole buffer and not sliced one. webCrypto.digest supports typed array\n return new Promise((resolve, reject) => {\n var bytesTyped = Array.isArray(bytes) ? convertToUint8Array(bytes) : bytes;\n // console.log(dT(), 'Native sha1 start')\n \n this.webCrypto.digest({name: 'SHA-1'}, bytesTyped).then((digest: ArrayBuffer) => {\n // console.log(dT(), 'Native sha1 done')\n resolve(digest);\n }, (e: ErrorEvent) => {\n console.error('Crypto digest error', e);\n this.useSha1Crypto = false;\n resolve(sha1HashSync(bytes));\n })\n });\n }\n \n return Promise.resolve(sha1HashSync(bytes)); */\n }\n sha256Hash(bytes) {\n //if(this.webWorker) {\n return this.performTaskWorker('sha256-hash', bytes);\n //}\n /* if(this.useSha256Crypto) {\n return new Promise((resolve, reject) => {\n var bytesTyped = Array.isArray(bytes) ? convertToUint8Array(bytes) : bytes;\n // console.log(dT(), 'Native sha1 start')\n this.webCrypto.digest({name: 'SHA-256'}, bytesTyped).then((digest: ArrayBuffer) => {\n // console.log(dT(), 'Native sha1 done')\n resolve(digest);\n }, (e: ErrorEvent) => {\n console.error('Crypto digest error', e);\n this.useSha256Crypto = false;\n resolve(sha256HashSync(bytes));\n })\n });\n }\n \n return Promise.resolve(sha256HashSync(bytes)); */\n }\n pbkdf2(buffer, salt, iterations) {\n //if(this.webWorker) {\n return this.performTaskWorker('pbkdf2', buffer, salt, iterations);\n //}\n //return hash_pbkdf2(buffer, salt, iterations);\n }\n aesEncrypt(bytes, keyBytes, ivBytes) {\n //if(this.webWorker) {\n return this.performTaskWorker('aes-encrypt', bin_utils_1.convertToArrayBuffer(bytes), bin_utils_1.convertToArrayBuffer(keyBytes), bin_utils_1.convertToArrayBuffer(ivBytes));\n //}\n //return Promise.resolve(convertToArrayBuffer(aesEncryptSync(bytes, keyBytes, ivBytes)));\n }\n aesDecrypt(encryptedBytes, keyBytes, ivBytes) {\n //if(this.webWorker) {\n return this.performTaskWorker('aes-decrypt', encryptedBytes, keyBytes, ivBytes)\n .then(bytes => bin_utils_1.convertToArrayBuffer(bytes));\n //}\n //return Promise.resolve(convertToArrayBuffer(aesDecryptSync(encryptedBytes, keyBytes, ivBytes)));\n }\n rsaEncrypt(publicKey, bytes) {\n return this.performTaskWorker('rsa-encrypt', publicKey, bytes);\n }\n factorize(bytes) {\n bytes = bin_utils_1.convertToByteArray(bytes);\n //if(this.webWorker) {\n return this.performTaskWorker('factorize', bytes);\n //}\n //return Promise.resolve(pqPrimeFactorization(bytes));\n }\n modPow(x, y, m) {\n //if(this.webWorker) {\n return this.performTaskWorker('mod-pow', x, y, m);\n //}\n //return Promise.resolve(bytesModPow(x, y, m));\n }\n gzipUncompress(bytes, toString) {\n //if(this.webWorker) {\n return this.performTaskWorker('unzip', bytes, toString);\n //}\n //return Promise.resolve(gzipUncompress(bytes, toString) as T);\n }\n}\nconst cryptoWorker = new CryptoWorker();\nwindow.CryptoWorker = cryptoWorker;\nexports.default = cryptoWorker;\n"
+ },
+ {
+ "id": 8,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/polyfill.ts",
+ "name": "./src/lib/polyfill.ts",
+ "index": 39,
+ "index2": 30,
+ "size": 1324,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiManager.ts",
+ "issuerId": 1,
+ "issuerName": "./src/lib/mtproto/apiManager.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 40,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "name": "./src/components/pageSignIn.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ },
+ {
+ "id": 1,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiManager.ts",
+ "name": "./src/lib/mtproto/apiManager.ts",
+ "profile": {
+ "factory": 392,
+ "building": 505,
+ "dependencies": 2
+ }
+ }
+ ],
+ "profile": {
+ "factory": 196,
+ "building": 1089,
+ "dependencies": 820
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 1,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiManager.ts",
+ "module": "./src/lib/mtproto/apiManager.ts",
+ "moduleName": "./src/lib/mtproto/apiManager.ts",
+ "type": "cjs require",
+ "userRequest": "../polyfill",
+ "loc": "31:19-41"
+ },
+ {
+ "moduleId": 9,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiFileManager.ts",
+ "module": "./src/lib/mtproto/apiFileManager.ts",
+ "moduleName": "./src/lib/mtproto/apiFileManager.ts",
+ "type": "cjs require",
+ "userRequest": "../polyfill",
+ "loc": "19:19-41"
+ },
+ {
+ "moduleId": 19,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appImManager.ts",
+ "module": "./src/lib/appManagers/appImManager.ts",
+ "moduleName": "./src/lib/appManagers/appImManager.ts",
+ "type": "cjs require",
+ "userRequest": "../polyfill",
+ "loc": "34:19-41"
+ },
+ {
+ "moduleId": 26,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarLeft.ts",
+ "module": "./src/lib/appManagers/appSidebarLeft.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarLeft.ts",
+ "type": "cjs require",
+ "userRequest": "../polyfill",
+ "loc": "15:19-41"
+ },
+ {
+ "moduleId": 45,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarRight.ts",
+ "module": "./src/lib/appManagers/appSidebarRight.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarRight.ts",
+ "type": "cjs require",
+ "userRequest": "../polyfill",
+ "loc": "15:19-41"
+ },
+ {
+ "moduleId": 46,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMediaViewer.ts",
+ "module": "./src/lib/appManagers/appMediaViewer.ts",
+ "moduleName": "./src/lib/appManagers/appMediaViewer.ts",
+ "type": "cjs require",
+ "userRequest": "../polyfill",
+ "loc": "11:19-41"
+ },
+ {
+ "moduleId": 68,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/networker.ts",
+ "module": "./src/lib/mtproto/networker.ts",
+ "moduleName": "./src/lib/mtproto/networker.ts",
+ "type": "cjs require",
+ "userRequest": "../polyfill",
+ "loc": "33:19-41"
+ },
+ {
+ "moduleId": 71,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/transports/websocket.ts",
+ "module": "./src/lib/mtproto/transports/websocket.ts",
+ "moduleName": "./src/lib/mtproto/transports/websocket.ts",
+ "type": "cjs require",
+ "userRequest": "../../polyfill",
+ "loc": "9:19-44"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 3,
+ "source": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst bin_utils_1 = require(\"./bin_utils\");\nconst mtproto_1 = require(\"./mtproto/mtproto\");\nfunction logger(prefix) {\n function Log(...args) {\n return console.log(bin_utils_1.dT(), '[' + prefix + ']:', ...args);\n }\n Log.warn = function (...args) {\n return console.warn(bin_utils_1.dT(), '[' + prefix + ']:', ...args);\n };\n Log.info = function (...args) {\n return console.info(bin_utils_1.dT(), '[' + prefix + ']:', ...args);\n };\n Log.error = function (...args) {\n return console.error(bin_utils_1.dT(), '[' + prefix + ']:', ...args);\n };\n Log.trace = function (...args) {\n return console.trace(bin_utils_1.dT(), '[' + prefix + ']:', ...args);\n };\n return Log;\n}\nexports.logger = logger;\n;\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function () {\n return bin_utils_1.bytesToHex([...this]);\n },\n set: function (str) {\n this.set(bin_utils_1.bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\nUint8Array.prototype.randomize = function () {\n mtproto_1.MTProto.secureRandom.nextBytes(this);\n return this;\n};\nUint8Array.prototype.concat = function (...args) {\n return bin_utils_1.bufferConcats(this, ...args);\n};\n"
+ },
+ {
+ "id": 9,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiFileManager.ts",
+ "name": "./src/lib/mtproto/apiFileManager.ts",
+ "index": 46,
+ "index2": 43,
+ "size": 22788,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
+ "issuerId": 78,
+ "issuerName": "./src/components/pageSignUp.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 40,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "name": "./src/components/pageSignIn.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ },
+ {
+ "id": 77,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
+ "name": "./src/components/pageAuthCode.ts",
+ "profile": {
+ "factory": 392,
+ "building": 505,
+ "dependencies": 2
+ }
+ },
+ {
+ "id": 78,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
+ "name": "./src/components/pageSignUp.ts",
+ "profile": {
+ "factory": 278,
+ "building": 994,
+ "dependencies": 0
+ }
+ }
+ ],
+ "profile": {
+ "factory": 1027,
+ "building": 121,
+ "dependencies": 1
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 11,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPhotosManager.ts",
+ "module": "./src/lib/appManagers/appPhotosManager.ts",
+ "moduleName": "./src/lib/appManagers/appPhotosManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiFileManager",
+ "loc": "19:41-77"
+ },
+ {
+ "moduleId": 15,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMessagesManager.ts",
+ "module": "./src/lib/appManagers/appMessagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appMessagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiFileManager",
+ "loc": "27:41-77"
+ },
+ {
+ "moduleId": 16,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/mtproto.ts",
+ "module": "./src/lib/mtproto/mtproto.ts",
+ "moduleName": "./src/lib/mtproto/mtproto.ts",
+ "type": "cjs require",
+ "userRequest": "./apiFileManager",
+ "loc": "24:41-68"
+ },
+ {
+ "moduleId": 18,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appDocsManager.ts",
+ "module": "./src/lib/appManagers/appDocsManager.ts",
+ "moduleName": "./src/lib/appManagers/appDocsManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiFileManager",
+ "loc": "15:41-77"
+ },
+ {
+ "moduleId": 28,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appDialogsManager.ts",
+ "module": "./src/lib/appManagers/appDialogsManager.ts",
+ "moduleName": "./src/lib/appManagers/appDialogsManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiFileManager",
+ "loc": "16:41-77"
+ },
+ {
+ "moduleId": 30,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/wrappers.ts",
+ "module": "./src/components/wrappers.ts",
+ "moduleName": "./src/components/wrappers.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/mtproto/apiFileManager",
+ "loc": "22:41-81"
+ },
+ {
+ "moduleId": 38,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appStickersManager.ts",
+ "module": "./src/lib/appManagers/appStickersManager.ts",
+ "moduleName": "./src/lib/appManagers/appStickersManager.ts",
+ "type": "cjs require",
+ "userRequest": "../mtproto/apiFileManager",
+ "loc": "17:41-77"
+ },
+ {
+ "moduleId": 78,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
+ "module": "./src/components/pageSignUp.ts",
+ "moduleName": "./src/components/pageSignUp.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/mtproto/apiFileManager",
+ "loc": "12:41-81"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 4,
+ "source": "\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst bin_utils_1 = require(\"../bin_utils\");\nconst idb_1 = __importDefault(require(\"../idb\"));\nconst filemanager_1 = __importDefault(require(\"../filemanager\"));\nconst apiManager_1 = __importDefault(require(\"./apiManager\"));\nconst polyfill_1 = require(\"../polyfill\");\nclass ApiFileManager {\n constructor() {\n this.cachedFs = false;\n this.cachedFsPromise = false;\n this.cachedSavePromises = {};\n this.cachedDownloadPromises = {};\n this.cachedDownloads = {};\n this.downloadPulls = {};\n this.downloadActives = {};\n this.index = 0;\n this.log = polyfill_1.logger('AFM');\n }\n downloadRequest(dcID, cb, activeDelta) {\n if (this.downloadPulls[dcID] === undefined) {\n this.downloadPulls[dcID] = [];\n this.downloadActives[dcID] = 0;\n }\n var downloadPull = this.downloadPulls[dcID];\n let promise = new Promise((resolve, reject) => {\n // WARNING deferred!\n downloadPull.push({ cb: cb, deferred: { resolve, reject }, activeDelta: activeDelta });\n }).catch(() => { });\n setTimeout(() => {\n this.downloadCheck(dcID);\n }, 0);\n return promise;\n }\n downloadCheck(dcID) {\n var downloadPull = this.downloadPulls[dcID];\n var downloadLimit = dcID == 'upload' ? 11 : 5;\n if (this.downloadActives[dcID] >= downloadLimit || !downloadPull || !downloadPull.length) {\n return false;\n }\n var data = downloadPull.shift();\n var activeDelta = data.activeDelta || 1;\n this.downloadActives[dcID] += activeDelta;\n this.index++;\n data.cb()\n .then((result) => {\n this.downloadActives[dcID] -= activeDelta;\n this.downloadCheck(dcID);\n data.deferred.resolve(result);\n }, (error) => {\n if (error) {\n this.log.error('downloadCheck error:', error);\n }\n this.downloadActives[dcID] -= activeDelta;\n this.downloadCheck(dcID);\n data.deferred.reject(error);\n });\n }\n getFileName(location) {\n switch (location._) {\n case 'inputDocumentFileLocation':\n var fileName = (location.file_name || '').split('.');\n var ext = fileName[fileName.length - 1] || '';\n if (location.stickerType == 1 /* && !WebpManager.isWebpSupported() */) { // warning\n ext += 'webp'; /* 'png'; */\n }\n else if (location.stickerType == 2) {\n ext += 'tgs';\n }\n var versionPart = location.version ? ('v' + location.version) : '';\n return (fileName[0] ? fileName[0] + '_' : '') + location.id + versionPart + (ext ? '.' + ext : ext);\n default:\n if (!location.volume_id && !location.file_reference) {\n this.log.trace('Empty location', location);\n }\n var ext = 'jpg';\n if (location.stickerType == 1) {\n ext = 'webp' /* WebpManager.isWebpSupported() ? 'webp' : 'png'*/;\n }\n else if (location.stickerType == 2) {\n ext += 'tgs';\n }\n if (location.volume_id) {\n return location.volume_id + '_' + location.local_id /* + '_' + location.secret */ + '.' + ext;\n }\n else {\n return location.id + '_' + location.access_hash + '.' + ext;\n }\n }\n }\n getTempFileName(file) {\n var size = file.size || -1;\n var random = bin_utils_1.nextRandomInt(0xFFFFFFFF);\n return '_temp' + random + '_' + size;\n }\n getCachedFile(location) {\n if (!location) {\n return false;\n }\n var fileName = this.getFileName(location);\n return this.cachedDownloads[fileName] || false;\n }\n getFileStorage() {\n if (!Config.Modes.memory_only) {\n /* if(TmpfsFileStorage.isAvailable()) {\n return TmpfsFileStorage;\n } */\n if (idb_1.default.isAvailable()) {\n return idb_1.default;\n }\n }\n return idb_1.default /* MemoryFileStorage */;\n }\n saveSmallFile(location, bytes) {\n var fileName = this.getFileName(location);\n if (!this.cachedSavePromises[fileName]) {\n this.cachedSavePromises[fileName] = this.getFileStorage().saveFile(fileName, bytes).then((blob) => {\n return this.cachedDownloads[fileName] = blob;\n }, (error) => {\n delete this.cachedSavePromises[fileName];\n });\n }\n return this.cachedSavePromises[fileName];\n }\n downloadSmallFile(location, options = {}) {\n if (!filemanager_1.default.isAvailable()) {\n return Promise.reject({ type: 'BROWSER_BLOB_NOT_SUPPORTED' });\n }\n //this.log('downloadSmallFile', location, options);\n let dcID = options.dcID || location.dc_id;\n let mimeType = options.mimeType || 'image/jpeg';\n var fileName = this.getFileName(location);\n var cachedPromise = this.cachedSavePromises[fileName] || this.cachedDownloadPromises[fileName];\n //this.log('downloadSmallFile!', location, options, fileName, cachedPromise);\n if (cachedPromise) {\n return cachedPromise;\n }\n var fileStorage = this.getFileStorage();\n return this.cachedDownloadPromises[fileName] = fileStorage.getFile(fileName).then((blob) => {\n return this.cachedDownloads[fileName] = blob;\n }, () => {\n var downloadPromise = this.downloadRequest(dcID, () => {\n var inputLocation = location;\n if (!inputLocation._ || inputLocation._ == 'fileLocation') {\n inputLocation = Object.assign({}, location, { _: 'inputFileLocation' });\n }\n let params = {\n flags: 0,\n location: inputLocation,\n offset: 0,\n limit: 1024 * 1024\n };\n //this.log('next small promise', params);\n return apiManager_1.default.invokeApi('upload.getFile', params, {\n dcID: dcID,\n fileDownload: true,\n noErrorBox: true\n });\n }, dcID);\n var processDownloaded = (bytes) => {\n //this.log('processDownloaded', location, bytes);\n return Promise.resolve(bytes);\n /* if(!location.sticker || WebpManager.isWebpSupported()) {\n return qSync.when(bytes);\n }\n \n return WebpManager.getPngBlobFromWebp(bytes); */\n };\n return fileStorage.getFileWriter(fileName, mimeType).then((fileWriter) => {\n return downloadPromise.then((result) => {\n return processDownloaded(result.bytes).then((proccessedResult) => {\n return filemanager_1.default.write(fileWriter, proccessedResult).then(() => {\n return this.cachedDownloads[fileName] = fileWriter.finalize();\n });\n });\n });\n });\n });\n }\n getDownloadedFile(location, size) {\n var fileStorage = this.getFileStorage();\n var fileName = typeof (location) !== 'string' ? this.getFileName(location) : location;\n //console.log('getDownloadedFile', location, fileName);\n return fileStorage.getFile(fileName, size);\n }\n downloadFile(dcID, location, size, options = {}) {\n if (!filemanager_1.default.isAvailable()) {\n return Promise.reject({ type: 'BROWSER_BLOB_NOT_SUPPORTED' });\n }\n /* var processSticker = false;\n if(location.sticker && !WebpManager.isWebpSupported()) {\n if(options.toFileEntry || size > 524288) {\n delete location.sticker;\n } else {\n processSticker = true;\n options.mime = 'image/png';\n }\n } */\n // this.log('Dload file', dcID, location, size)\n var fileName = this.getFileName(location);\n var toFileEntry = options.toFileEntry || null;\n var cachedPromise = this.cachedSavePromises[fileName] || this.cachedDownloadPromises[fileName];\n var fileStorage = this.getFileStorage();\n //this.log('downloadFile', fileStorage.name, fileName, fileName.length, location, arguments);\n if (cachedPromise) {\n if (toFileEntry) {\n /* let blob = await cachedPromise;\n return FileManager.copy(blob, toFileEntry) as Promise; */\n return cachedPromise.then((blob) => {\n return filemanager_1.default.copy(blob, toFileEntry);\n });\n }\n //this.log('downloadFile cachedPromise');\n if (size) {\n /* let blob = await cachedPromise;\n if(blob.size < size) {\n this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\n await this.deleteFile(location);\n } else {\n return cachedPromise;\n } */\n return cachedPromise.then((blob) => {\n if (blob.size < size) {\n this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\n return this.deleteFile(location).then(() => {\n return this.downloadFile(dcID, location, size, options);\n }).catch(() => {\n return this.downloadFile(dcID, location, size, options);\n });\n }\n else {\n //return cachedPromise;\n return blob;\n }\n });\n }\n else {\n return cachedPromise;\n }\n }\n //this.log('arriba');\n //var deferred = $q.defer()\n let deferredHelper = { notify: () => { } };\n let deferred = new Promise((resolve, reject) => {\n deferredHelper.resolve = resolve;\n deferredHelper.reject = reject;\n });\n Object.assign(deferred, deferredHelper);\n //return;\n var canceled = false;\n var resolved = false;\n var mimeType = options.mimeType || 'image/jpeg', cacheFileWriter;\n var errorHandler = (error) => {\n deferred.reject(error);\n errorHandler = () => { };\n if (cacheFileWriter && (!error || error.type != 'DOWNLOAD_CANCELED')) {\n cacheFileWriter.truncate(0);\n }\n };\n fileStorage.getFile(fileName, size).then((blob) => __awaiter(this, void 0, void 0, function* () {\n //this.log('is that i wanted');\n if (blob.size < size) {\n this.log('downloadFile need to deleteFile 2, wrong size:', blob.size, size);\n yield this.deleteFile(location);\n throw false;\n }\n if (toFileEntry) {\n filemanager_1.default.copy(blob, toFileEntry).then(() => {\n deferred.resolve();\n }, errorHandler);\n }\n else {\n deferred.resolve(this.cachedDownloads[fileName] = blob);\n }\n //}, () => {\n })).catch(() => {\n //this.log('not i wanted');\n //var fileWriterPromise = toFileEntry ? FileManager.getFileWriter(toFileEntry) : fileStorage.getFileWriter(fileName, mimeType);\n var fileWriterPromise = toFileEntry ? Promise.resolve(toFileEntry) : fileStorage.getFileWriter(fileName, mimeType);\n var processDownloaded = (bytes) => {\n return Promise.resolve(bytes);\n /* if(!processSticker) {\n return Promise.resolve(bytes);\n }\n \n return WebpManager.getPngBlobFromWebp(bytes); */\n };\n fileWriterPromise.then((fileWriter) => {\n cacheFileWriter = fileWriter;\n var limit = options.limitPart || 524288, offset;\n var startOffset = 0;\n var writeFilePromise = Promise.resolve(), writeFileDeferred;\n if (fileWriter.length) {\n startOffset = fileWriter.length;\n if (startOffset >= size) {\n if (toFileEntry) {\n deferred.resolve();\n }\n else {\n deferred.resolve(this.cachedDownloads[fileName] = fileWriter.finalize());\n }\n return;\n }\n fileWriter.seek(startOffset);\n deferred.notify({ done: startOffset, total: size });\n /////this.log('deferred notify 1:', {done: startOffset, total: size});\n }\n for (offset = startOffset; offset < size; offset += limit) {\n //writeFileDeferred = $q.defer();\n let writeFileDeferredHelper = {};\n writeFileDeferred = new Promise((resolve, reject) => {\n writeFileDeferredHelper.resolve = resolve;\n writeFileDeferredHelper.reject = reject;\n });\n Object.assign(writeFileDeferred, writeFileDeferredHelper);\n ////this.log('offset:', startOffset);\n ;\n ((isFinal, offset, writeFileDeferred, writeFilePromise) => {\n return this.downloadRequest(dcID, () => {\n if (canceled) {\n return Promise.resolve();\n }\n return apiManager_1.default.invokeApi('upload.getFile', {\n flags: 0,\n location: location,\n offset: offset,\n limit: limit\n }, {\n dcID: dcID,\n fileDownload: true,\n singleInRequest: 'safari' in window\n });\n }, dcID).then((result) => {\n writeFilePromise.then(() => {\n if (canceled) {\n return Promise.resolve();\n }\n return processDownloaded(result.bytes).then((processedResult) => {\n return filemanager_1.default.write(fileWriter, processedResult).then(() => {\n writeFileDeferred.resolve();\n }, errorHandler).then(() => {\n if (isFinal) {\n resolved = true;\n if (toFileEntry) {\n deferred.resolve();\n }\n else {\n deferred.resolve(this.cachedDownloads[fileName] = fileWriter.finalize());\n }\n }\n else {\n ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);\n deferred.notify({ done: offset + limit, total: size });\n }\n });\n });\n });\n });\n })(offset + limit >= size, offset, writeFileDeferred, writeFilePromise);\n writeFilePromise = writeFileDeferred;\n }\n });\n });\n deferred.cancel = () => {\n if (!canceled && !resolved) {\n canceled = true;\n delete this.cachedDownloadPromises[fileName];\n errorHandler({ type: 'DOWNLOAD_CANCELED' });\n if (toFileEntry) {\n toFileEntry.abort();\n }\n }\n };\n //console.log(deferred, deferred.notify, deferred.cancel);\n if (!toFileEntry) {\n this.cachedDownloadPromises[fileName] = deferred;\n }\n return deferred;\n }\n deleteFile(fileName) {\n fileName = typeof (fileName) == 'string' ? fileName : this.getFileName(fileName);\n this.log('will delete file:', fileName);\n delete this.cachedDownloadPromises[fileName];\n delete this.cachedDownloads[fileName];\n delete this.cachedSavePromises[fileName];\n return this.getFileStorage().deleteFile(fileName);\n }\n uploadFile(file) {\n var fileSize = file.size, isBigFile = fileSize >= 10485760, canceled = false, resolved = false, doneParts = 0, partSize = 262144, // 256 Kb\n activeDelta = 2;\n if (fileSize > 67108864) {\n partSize = 524288;\n activeDelta = 4;\n }\n else if (fileSize < 102400) {\n partSize = 32768;\n activeDelta = 1;\n }\n var totalParts = Math.ceil(fileSize / partSize);\n var fileID = [bin_utils_1.nextRandomInt(0xFFFFFFFF), bin_utils_1.nextRandomInt(0xFFFFFFFF)];\n //var deferred = $q.defer();\n var _part = 0, resultInputFile = {\n _: isBigFile ? 'inputFileBig' : 'inputFile',\n id: fileID,\n parts: totalParts,\n name: file instanceof File ? file.name : '',\n md5_checksum: ''\n };\n /* let deferred: {\n then?: any,\n resolve?: (input: typeof resultInputFile) => void,\n reject?: (error: any) => void,\n promise?: any,\n \n cancel?: () => void,\n notify?: (details: {done: number, total: number}) => void\n } = {\n \n };\n \n deferred.promise = new Promise((resolve, reject) => {\n deferred.resolve = resolve;\n deferred.reject = reject;\n }); */\n let deferredHelper = {\n notify: (details) => { }\n };\n let deferred = new Promise((resolve, reject) => {\n if (totalParts > 3000) {\n return reject({ type: 'FILE_TOO_BIG' });\n }\n deferredHelper.resolve = resolve;\n deferredHelper.reject = reject;\n //return Promise.resolve();\n });\n Object.assign(deferred, deferredHelper);\n if (totalParts > 3000) {\n return deferred;\n }\n let errorHandler = (error) => {\n this.log.error('Up Error', error);\n deferred.reject(error);\n canceled = true;\n errorHandler = () => { };\n };\n let method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\n for (let offset = 0; offset < fileSize; offset += partSize) {\n let part = _part++; // 0, 1\n this.downloadRequest('upload', () => {\n return new Promise((uploadResolve, uploadReject) => {\n var reader = new FileReader();\n var blob = file.slice(offset, offset + partSize);\n reader.onloadend = (e) => {\n if (canceled) {\n uploadReject();\n return;\n }\n if (e.target.readyState != FileReader.DONE) {\n this.log.error('wrong readyState!');\n return;\n }\n //////this.log('Starting to upload file, isBig:', isBigFile, fileID, part, e.target.result);\n apiManager_1.default.invokeApi(method, {\n file_id: fileID,\n file_part: part,\n file_total_parts: totalParts,\n bytes: e.target.result\n }, {\n startMaxLength: partSize + 256,\n fileUpload: true,\n singleInRequest: true\n }).then((result) => {\n doneParts++;\n uploadResolve();\n //////this.log('Progress', doneParts * partSize / fileSize);\n if (doneParts >= totalParts) {\n deferred.resolve(resultInputFile);\n resolved = true;\n }\n else {\n deferred.notify({ done: doneParts * partSize, total: fileSize });\n }\n }, errorHandler);\n };\n reader.readAsArrayBuffer(blob);\n });\n }, activeDelta);\n }\n deferred.cancel = () => {\n this.log('cancel upload', canceled, resolved);\n if (!canceled && !resolved) {\n canceled = true;\n errorHandler({ type: 'UPLOAD_CANCELED' });\n }\n };\n return deferred;\n }\n}\nexports.ApiFileManager = ApiFileManager;\nexports.default = new ApiFileManager();\n"
+ },
+ {
+ "id": 10,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPeersManager.ts",
+ "name": "./src/lib/appManagers/appPeersManager.ts",
+ "index": 64,
+ "index2": 56,
+ "size": 5756,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "issuerId": 50,
+ "issuerName": "./src/lib/services.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 25,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
+ "name": "./src/components/pageIm.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ },
+ {
+ "id": 50,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "name": "./src/lib/services.ts",
+ "profile": {
+ "factory": 323,
+ "building": 561,
+ "dependencies": 110
+ }
+ }
+ ],
+ "profile": {
+ "factory": 270,
+ "building": 981,
+ "dependencies": 860
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 15,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMessagesManager.ts",
+ "module": "./src/lib/appManagers/appMessagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appMessagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appPeersManager",
+ "loc": "25:42-70"
+ },
+ {
+ "moduleId": 19,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appImManager.ts",
+ "module": "./src/lib/appManagers/appImManager.ts",
+ "moduleName": "./src/lib/appManagers/appImManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appPeersManager",
+ "loc": "26:42-70"
+ },
+ {
+ "moduleId": 27,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/apiUpdatesManager.ts",
+ "module": "./src/lib/appManagers/apiUpdatesManager.ts",
+ "moduleName": "./src/lib/appManagers/apiUpdatesManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appPeersManager",
+ "loc": "9:42-70"
+ },
+ {
+ "moduleId": 28,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appDialogsManager.ts",
+ "module": "./src/lib/appManagers/appDialogsManager.ts",
+ "moduleName": "./src/lib/appManagers/appDialogsManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appPeersManager",
+ "loc": "19:42-70"
+ },
+ {
+ "moduleId": 37,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appProfileManager.ts",
+ "module": "./src/lib/appManagers/appProfileManager.ts",
+ "moduleName": "./src/lib/appManagers/appProfileManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appPeersManager",
+ "loc": "12:42-70"
+ },
+ {
+ "moduleId": 45,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarRight.ts",
+ "module": "./src/lib/appManagers/appSidebarRight.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarRight.ts",
+ "type": "cjs require",
+ "userRequest": "./appPeersManager",
+ "loc": "11:42-70"
+ },
+ {
+ "moduleId": 46,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMediaViewer.ts",
+ "module": "./src/lib/appManagers/appMediaViewer.ts",
+ "moduleName": "./src/lib/appManagers/appMediaViewer.ts",
+ "type": "cjs require",
+ "userRequest": "./appPeersManager",
+ "loc": "6:42-70"
+ },
+ {
+ "moduleId": 50,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "module": "./src/lib/services.ts",
+ "moduleName": "./src/lib/services.ts",
+ "type": "cjs require",
+ "userRequest": "./appManagers/appPeersManager",
+ "loc": "16:42-82"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 3,
+ "source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst appUsersManager_1 = __importDefault(require(\"./appUsersManager\"));\nconst appChatsManager_1 = __importDefault(require(\"./appChatsManager\"));\nconst utils_1 = require(\"../utils\");\nconst richtextprocessor_1 = require(\"../richtextprocessor\");\n// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\n/*\n HTML-color IRC-color Description\n #c03d33 4 red\n #4fad2d 3 green\n #d09306 7 yellow\n #168acd 10 blue\n #8544d6 6 purple\n #cd4073 13 pink\n #2996ad 11 sea\n #ce671b 5 orange\n */\nconst DialogColorsFg = ['#c03d33', '#4fad2d', '#d09306', '#168acd', '#8544d6', '#cd4073', '#2996ad', '#ce671b'];\nconst DialogColors = ['#e17076', '#7bc862', '#e5ca77', '#65AADD', '#a695e7', '#ee7aae', '#6ec9cb', '#faa774'];\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\nconst AppPeersManager = {\n getPeerPhoto: (peerID) => {\n return peerID > 0\n ? appUsersManager_1.default.getUserPhoto(peerID)\n : appChatsManager_1.default.getChatPhoto(-peerID);\n },\n getPeerMigratedTo: (peerID) => {\n if (peerID >= 0) {\n return false;\n }\n var chat = appChatsManager_1.default.getChat(-peerID);\n if (chat && chat.migrated_to && chat.pFlags.deactivated) {\n return AppPeersManager.getPeerID(chat.migrated_to);\n }\n return false;\n },\n getPeerTitle: (peerID, plainText = false) => {\n let peer = {};\n if (!utils_1.isObject(peerID)) {\n peer = AppPeersManager.getPeer(peerID);\n }\n else\n peer = peerID;\n let title = '';\n if (peerID > 0) {\n if (peer.first_name)\n title += peer.first_name;\n if (peer.last_name)\n title += ' ' + peer.last_name;\n if (!title)\n title = peer.pFlags.deleted ? 'Deleted account' : peer.username;\n else\n title = title.trim();\n }\n else {\n title = peer.title;\n }\n return plainText ? title : richtextprocessor_1.RichTextProcessor.wrapEmojiText(title);\n },\n getOutputPeer: (peerID) => {\n if (peerID > 0) {\n return { _: 'peerUser', user_id: peerID };\n }\n var chatID = -peerID;\n if (appChatsManager_1.default.isChannel(chatID)) {\n return { _: 'peerChannel', channel_id: chatID };\n }\n return { _: 'peerChat', chat_id: chatID };\n },\n getPeerString: (peerID) => {\n if (peerID > 0) {\n return appUsersManager_1.default.getUserString(peerID);\n }\n return appChatsManager_1.default.getChatString(-peerID);\n },\n getPeerUsername: (peerID) => {\n if (peerID > 0) {\n return appUsersManager_1.default.getUser(peerID).username || '';\n }\n return appChatsManager_1.default.getChat(-peerID).username || '';\n },\n getPeer: (peerID) => {\n return peerID > 0\n ? appUsersManager_1.default.getUser(peerID)\n : appChatsManager_1.default.getChat(-peerID);\n },\n getPeerID: (peerString) => {\n if (utils_1.isObject(peerString)) {\n return peerString.user_id\n ? peerString.user_id\n : -(peerString.channel_id || peerString.chat_id);\n }\n var isUser = peerString.charAt(0) == 'u';\n var peerParams = peerString.substr(1).split('_');\n return isUser ? peerParams[0] : -peerParams[0] || 0;\n },\n isChannel: (peerID) => {\n return (peerID < 0) && appChatsManager_1.default.isChannel(-peerID);\n },\n isMegagroup: (peerID) => {\n return (peerID < 0) && appChatsManager_1.default.isMegagroup(-peerID);\n },\n isAnyGroup: (peerID) => {\n return (peerID < 0) && !appChatsManager_1.default.isBroadcast(-peerID);\n },\n isBroadcast: (id) => {\n return AppPeersManager.isChannel(id) && !AppPeersManager.isMegagroup(id);\n },\n isBot: (peerID) => {\n return (peerID > 0) && appUsersManager_1.default.isBot(peerID);\n },\n getInputPeerByID: (peerID) => {\n if (!peerID) {\n return { _: 'inputPeerEmpty' };\n }\n if (peerID < 0) {\n var chatID = -peerID;\n if (!appChatsManager_1.default.isChannel(chatID)) {\n return {\n _: 'inputPeerChat',\n chat_id: chatID\n };\n }\n else {\n return {\n _: 'inputPeerChannel',\n channel_id: chatID,\n access_hash: appChatsManager_1.default.getChat(chatID).access_hash || 0\n };\n }\n }\n return {\n _: 'inputPeerUser',\n user_id: peerID,\n access_hash: appUsersManager_1.default.getUser(peerID).access_hash || 0\n };\n },\n getPeerColorByID: (peerID, pic = true) => {\n let idx = DialogColorsMap[(peerID < 0 ? -peerID : peerID) % 7];\n let color = (pic ? DialogColors : DialogColorsFg)[idx];\n return color;\n },\n getPeerSearchText: (peerID) => {\n var text;\n if (peerID > 0) {\n text = '%pu ' + appUsersManager_1.default.getUserSearchText(peerID);\n }\n else if (peerID < 0) {\n var chat = appChatsManager_1.default.getChat(-peerID);\n text = '%pg ' + (chat.title || '');\n }\n return text;\n }\n};\nexports.default = AppPeersManager;\n"
+ },
+ {
+ "id": 11,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPhotosManager.ts",
+ "name": "./src/lib/appManagers/appPhotosManager.ts",
+ "index": 65,
+ "index2": 58,
+ "size": 15031,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "issuerId": 50,
+ "issuerName": "./src/lib/services.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 25,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
+ "name": "./src/components/pageIm.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ },
+ {
+ "id": 50,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "name": "./src/lib/services.ts",
+ "profile": {
+ "factory": 323,
+ "building": 561,
+ "dependencies": 110
+ }
+ }
+ ],
+ "profile": {
+ "factory": 270,
+ "building": 981,
+ "dependencies": 860
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 15,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMessagesManager.ts",
+ "module": "./src/lib/appManagers/appMessagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appMessagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appPhotosManager",
+ "loc": "23:43-72"
+ },
+ {
+ "moduleId": 19,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appImManager.ts",
+ "module": "./src/lib/appManagers/appImManager.ts",
+ "moduleName": "./src/lib/appManagers/appImManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appPhotosManager",
+ "loc": "31:43-72"
+ },
+ {
+ "moduleId": 30,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/wrappers.ts",
+ "module": "./src/components/wrappers.ts",
+ "moduleName": "./src/components/wrappers.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/appManagers/appPhotosManager",
+ "loc": "15:43-89"
+ },
+ {
+ "moduleId": 37,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appProfileManager.ts",
+ "module": "./src/lib/appManagers/appProfileManager.ts",
+ "moduleName": "./src/lib/appManagers/appProfileManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appPhotosManager",
+ "loc": "9:43-72"
+ },
+ {
+ "moduleId": 45,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appSidebarRight.ts",
+ "module": "./src/lib/appManagers/appSidebarRight.ts",
+ "moduleName": "./src/lib/appManagers/appSidebarRight.ts",
+ "type": "cjs require",
+ "userRequest": "./appPhotosManager",
+ "loc": "10:43-72"
+ },
+ {
+ "moduleId": 46,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMediaViewer.ts",
+ "module": "./src/lib/appManagers/appMediaViewer.ts",
+ "moduleName": "./src/lib/appManagers/appMediaViewer.ts",
+ "type": "cjs require",
+ "userRequest": "./appPhotosManager",
+ "loc": "8:43-72"
+ },
+ {
+ "moduleId": 49,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appWebPagesManager.ts",
+ "module": "./src/lib/appManagers/appWebPagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appWebPagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appPhotosManager",
+ "loc": "7:43-72"
+ },
+ {
+ "moduleId": 50,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "module": "./src/lib/services.ts",
+ "moduleName": "./src/lib/services.ts",
+ "type": "cjs require",
+ "userRequest": "./appManagers/appPhotosManager",
+ "loc": "11:43-84"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 3,
+ "source": "\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst appUsersManager_1 = __importDefault(require(\"./appUsersManager\"));\nconst utils_1 = require(\"../utils\");\nconst filemanager_1 = __importDefault(require(\"../filemanager\"));\nconst bin_utils_1 = require(\"../bin_utils\");\nconst apiFileManager_1 = __importDefault(require(\"../mtproto/apiFileManager\"));\nconst apiManager_1 = __importDefault(require(\"../mtproto/apiManager\"));\nclass AppPhotosManager {\n constructor() {\n this.photos = {};\n this.windowW = document.body.scrollWidth;\n this.windowH = document.body.scrollHeight;\n window.addEventListener('resize', (e) => {\n this.windowW = document.body.scrollWidth;\n this.windowH = document.body.scrollHeight;\n //console.log(`Set windowW, windowH: ${this.windowW}x${this.windowH}`);\n });\n /* $rootScope.openPhoto = openPhoto\n $rootScope.preloadPhoto = preloadPhoto; */\n }\n savePhoto(apiPhoto, context) {\n if (context) {\n Object.assign(apiPhoto, context);\n }\n if (!apiPhoto.id) {\n console.warn('no apiPhoto.id', apiPhoto);\n }\n else\n this.photos[apiPhoto.id] = apiPhoto;\n if (!('sizes' in apiPhoto))\n return;\n apiPhoto.sizes.forEach((photoSize) => {\n if (photoSize._ == 'photoCachedSize') {\n apiFileManager_1.default.saveSmallFile(photoSize.location, photoSize.bytes);\n console.log('clearing photo cached size', apiPhoto);\n // Memory\n photoSize.size = photoSize.bytes.length;\n delete photoSize.bytes;\n photoSize._ = 'photoSize';\n }\n });\n }\n choosePhotoSize(photo, width = 0, height = 0) {\n if (Config.Navigator.retina) {\n width *= 2;\n height *= 2;\n }\n /*\n s\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n let bestPhotoSize = { _: 'photoSizeEmpty' };\n let bestDiff = 0xFFFFFF;\n //console.log('choosePhotoSize', photo);\n let sizes = photo.sizes || photo.thumbs;\n if (!sizes)\n return bestPhotoSize;\n sizes.forEach((photoSize) => {\n if (!photoSize.w || !photoSize.h)\n return;\n let diff = Math.abs(photoSize.w * photoSize.h - width * height);\n if (diff < bestDiff) {\n bestPhotoSize = photoSize;\n bestDiff = diff;\n }\n //console.log('diff', diff, photoSize, bestPhotoSize);\n });\n //console.log('choosing', photo, width, height, bestPhotoSize);\n return bestPhotoSize;\n }\n getUserPhotos(userID, maxID, limit) {\n var inputUser = appUsersManager_1.default.getUserInput(userID);\n return apiManager_1.default.invokeApi('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit: limit || 20,\n max_id: maxID || 0\n }).then((photosResult) => {\n appUsersManager_1.default.saveApiUsers(photosResult.users);\n var photoIDs = [];\n var context = { user_id: userID };\n for (var i = 0; i < photosResult.photos.length; i++) {\n this.savePhoto(photosResult.photos[i], context);\n photoIDs.push(photosResult.photos[i].id);\n }\n return {\n count: photosResult.count || photosResult.photos.length,\n photos: photoIDs\n };\n });\n }\n setAttachmentPreview(bytes, div, isSticker = false, background = false) {\n //image.src = \"data:image/jpeg;base64,\" + bytesToBase64(photo.sizes[0].bytes);\n //photo.sizes[0].bytes = new Uint8Array([...photo.sizes[0].bytes].reverse());\n let arr;\n if (!isSticker) {\n arr = AppPhotosManager.jf.concat(bytes.slice(3), AppPhotosManager.Df);\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n }\n else {\n arr = bytes;\n }\n //console.log('setAttachmentPreview', bytes, arr, div, isSticker);\n let blob = new Blob([arr], { type: \"image/jpeg\" });\n if (background) {\n div.style.backgroundImage = 'url(' + URL.createObjectURL(blob) + ')';\n }\n else {\n let image = new Image();\n image.src = URL.createObjectURL(blob);\n image.style.width = '100%';\n image.style.height = '100%';\n div.append(image);\n }\n }\n setAttachmentSize(photoID, div, boxWidth = 380, boxHeight = 380, isSticker = false) {\n let photo = /* MTDocument | MTPhoto */ null;\n if (typeof (photoID) === 'string') {\n photo = this.photos[photoID];\n if (!photo)\n return { _: 'photoEmpty' };\n }\n else {\n photo = photoID;\n }\n let photoSize = this.choosePhotoSize(photo, boxWidth, boxHeight);\n //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n let sizes = photo.sizes || photo.thumbs;\n if (sizes && sizes[0].bytes) {\n this.setAttachmentPreview(sizes[0].bytes, div, isSticker);\n }\n if (photo._ == 'document' /* && photo.type != 'video' */ /* && photo.type != 'gif' */) {\n let { w, h } = utils_1.calcImageInBox(photo.w || 512, photo.h || 512, boxWidth, boxHeight);\n div.style.width = w + 'px';\n div.style.height = h + 'px';\n }\n else {\n let { w, h } = utils_1.calcImageInBox(photoSize.w || 100, photoSize.h || 100, boxWidth, boxHeight);\n div.style.width = w + 'px';\n div.style.height = h + 'px';\n }\n return photoSize;\n }\n preloadPhoto(photoID, photoSize) {\n return __awaiter(this, void 0, void 0, function* () {\n let photo = null;\n if (typeof (photoID) === 'string') {\n photo = this.photos[photoID];\n if (!photo)\n return Promise.reject();\n }\n else {\n photo = photoID;\n }\n if (!photoSize) {\n let fullWidth = this.windowW /* - (Config.Mobile ? 20 : 32) */;\n let fullHeight = this.windowH /* - (Config.Mobile ? 150 : 116) */;\n photoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n }\n if (photoSize && photoSize._ != 'photoSizeEmpty') {\n photoSize.preloaded = true;\n // maybe it's a thumb\n let isPhoto = photoSize.size && photo.access_hash && photo.file_reference;\n let location = isPhoto ? {\n _: photo._ == 'document' ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n } : photoSize.location;\n /* if(overwrite) {\n await apiFileManager.deleteFile(location);\n console.log('Photos deleted file!');\n } */\n if (isPhoto /* && photoSize.size >= 1e6 */) {\n //console.log('Photos downloadFile exec', photo);\n /* let promise = apiFileManager.downloadFile(photo.dc_id, location, photoSize.size);\n \n let blob = await promise;\n if(blob.size < photoSize.size && overwrite) {\n await apiFileManager.deleteFile(location);\n console.log('Photos deleted file!');\n return apiFileManager.downloadFile(photo.dc_id, location, photoSize.size);\n }\n \n return blob; */\n return apiFileManager_1.default.downloadFile(photo.dc_id, location, photoSize.size);\n }\n else {\n //console.log('Photos downloadSmallFile exec', photo, location);\n return apiFileManager_1.default.downloadSmallFile(location);\n }\n }\n else\n return Promise.reject('no photoSize');\n });\n }\n getPhoto(photoID) {\n return this.photos[photoID] || { _: 'photoEmpty' };\n }\n wrapForHistory(photoID, options = {}) {\n var photo = utils_1.copy(this.photos[photoID]) || { _: 'photoEmpty' };\n var width = options.website ? 64 : Math.min(this.windowW - 80, Config.Mobile ? 210 : 260);\n var height = options.website ? 64 : Math.min(this.windowH - 100, Config.Mobile ? 210 : 260);\n var thumbPhotoSize = this.choosePhotoSize(photo, width, height);\n var thumb = {\n width: width,\n height: height\n };\n if (options.website && Config.Mobile) {\n width = 50;\n height = 50;\n }\n // console.log('chosen photo size', photoID, thumbPhotoSize)\n if (thumbPhotoSize && thumbPhotoSize._ != 'photoSizeEmpty') {\n var dim = utils_1.calcImageInBox(thumbPhotoSize.w, thumbPhotoSize.h, width, height);\n thumb.width = dim.w;\n thumb.height = dim.h;\n thumb.location = thumbPhotoSize.location;\n thumb.size = thumbPhotoSize.size;\n }\n else {\n thumb.width = 100;\n thumb.height = 100;\n }\n photo.thumb = thumb;\n return photo;\n }\n /* public wrapForFull(photoID: string) {\n var photo = this.wrapForHistory(photoID);\n var fullWidth = document.body.scrollWidth - (Config.Mobile ? 0 : 32);\n var fullHeight = document.body.scrollHeight - (Config.Mobile ? 0 : 116);\n if (!Config.Mobile && fullWidth > 800) {\n fullWidth -= 208;\n }\n var fullPhotoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n var full: any = {};\n \n full.width = fullWidth;\n full.height = fullHeight;\n \n if (fullPhotoSize && fullPhotoSize._ != 'photoSizeEmpty') {\n var wh = calcImageInBox(fullPhotoSize.w, fullPhotoSize.h, fullWidth, fullHeight, true);\n full.width = wh.w;\n full.height = wh.h;\n \n full.modalWidth = Math.max(full.width, Math.min(400, fullWidth));\n \n full.location = fullPhotoSize.location;\n full.size = fullPhotoSize.size;\n }\n \n photo.full = full;\n \n return photo;\n } */\n downloadPhoto(photoID) {\n var photo = this.photos[photoID];\n var ext = 'jpg';\n var mimeType = 'image/jpeg';\n var fileName = 'photo' + photoID + '.' + ext;\n var fullWidth = this.windowW;\n var fullHeight = this.windowH;\n var fullPhotoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n var inputFileLocation = {\n // @ts-ignore\n _: photo._ == 'document' ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: fullPhotoSize.type\n };\n try { // photo.dc_id, location, photoSize.size\n let writer = filemanager_1.default.chooseSaveFile(fileName, ext, mimeType, fullPhotoSize.size);\n writer.ready.then(() => {\n console.log('ready');\n apiFileManager_1.default.downloadFile(photo.dc_id, inputFileLocation, fullPhotoSize.size, {\n mimeType: mimeType,\n toFileEntry: writer\n }).then(() => {\n writer.close();\n //writer.abort();\n console.log('file save done', fileName, ext, mimeType, writer);\n }, (e) => {\n console.log('photo download failed', e);\n });\n });\n }\n catch (err) {\n console.error('err', err);\n var cachedBlob = apiFileManager_1.default.getCachedFile(inputFileLocation);\n if (cachedBlob) {\n return filemanager_1.default.download(cachedBlob, mimeType, fileName);\n }\n apiFileManager_1.default.downloadFile(photo.dc_id, inputFileLocation, fullPhotoSize.size, { mimeType: mimeType })\n .then((blob) => {\n filemanager_1.default.download(blob, mimeType, fileName);\n }, (e) => {\n console.log('photo download failed', e);\n });\n }\n }\n}\nexports.AppPhotosManager = AppPhotosManager;\nAppPhotosManager.jf = new Uint8Array(bin_utils_1.bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00'));\nAppPhotosManager.Df = bin_utils_1.bytesFromHex('ffd9');\nexports.default = new AppPhotosManager();\n"
+ },
+ {
+ "id": 12,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appChatsManager.ts",
+ "name": "./src/lib/appManagers/appChatsManager.ts",
+ "index": 61,
+ "index2": 55,
+ "size": 8364,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "issuerId": 50,
+ "issuerName": "./src/lib/services.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 25,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
+ "name": "./src/components/pageIm.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ },
+ {
+ "id": 50,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "name": "./src/lib/services.ts",
+ "profile": {
+ "factory": 323,
+ "building": 561,
+ "dependencies": 110
+ }
+ }
+ ],
+ "profile": {
+ "factory": 270,
+ "building": 981,
+ "dependencies": 860
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 4,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appUsersManager.ts",
+ "module": "./src/lib/appManagers/appUsersManager.ts",
+ "moduleName": "./src/lib/appManagers/appUsersManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appChatsManager",
+ "loc": "8:42-70"
+ },
+ {
+ "moduleId": 10,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appPeersManager.ts",
+ "module": "./src/lib/appManagers/appPeersManager.ts",
+ "moduleName": "./src/lib/appManagers/appPeersManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appChatsManager",
+ "loc": "7:42-70"
+ },
+ {
+ "moduleId": 15,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appMessagesManager.ts",
+ "module": "./src/lib/appManagers/appMessagesManager.ts",
+ "moduleName": "./src/lib/appManagers/appMessagesManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appChatsManager",
+ "loc": "17:42-70"
+ },
+ {
+ "moduleId": 19,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appImManager.ts",
+ "module": "./src/lib/appManagers/appImManager.ts",
+ "moduleName": "./src/lib/appManagers/appImManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appChatsManager",
+ "loc": "38:42-70"
+ },
+ {
+ "moduleId": 27,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/apiUpdatesManager.ts",
+ "module": "./src/lib/appManagers/apiUpdatesManager.ts",
+ "moduleName": "./src/lib/appManagers/apiUpdatesManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appChatsManager",
+ "loc": "11:42-70"
+ },
+ {
+ "moduleId": 37,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/appManagers/appProfileManager.ts",
+ "module": "./src/lib/appManagers/appProfileManager.ts",
+ "moduleName": "./src/lib/appManagers/appProfileManager.ts",
+ "type": "cjs require",
+ "userRequest": "./appChatsManager",
+ "loc": "8:42-70"
+ },
+ {
+ "moduleId": 50,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
+ "module": "./src/lib/services.ts",
+ "moduleName": "./src/lib/services.ts",
+ "type": "cjs require",
+ "userRequest": "./appManagers/appChatsManager",
+ "loc": "8:42-82"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 3,
+ "source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst richtextprocessor_1 = require(\"../richtextprocessor\");\nconst appUsersManager_1 = __importDefault(require(\"./appUsersManager\"));\nclass AppChatsManager {\n constructor() {\n this.chats = {};\n this.usernames = {};\n this.channelAccess = {};\n this.megagroups = {};\n this.cachedPhotoLocations = {};\n utils_1.$rootScope.$on('apiUpdate', (e) => {\n // console.log('on apiUpdate', update)\n let update = e.detail;\n switch (update._) {\n case 'updateChannel':\n var channelID = update.channel_id;\n utils_1.$rootScope.$broadcast('channel_settings', { channelID: channelID });\n break;\n }\n });\n }\n saveApiChats(apiChats) {\n apiChats.forEach(chat => this.saveApiChat(chat));\n }\n saveApiChat(apiChat) {\n if (!utils_1.isObject(apiChat)) {\n return;\n }\n apiChat.rTitle = apiChat.title || 'chat_title_deleted';\n apiChat.rTitle = richtextprocessor_1.RichTextProcessor.wrapRichText(apiChat.title, { noLinks: true, noLinebreaks: true }) || 'chat_title_deleted';\n var result = this.chats[apiChat.id];\n var titleWords = utils_1.SearchIndexManager.cleanSearchText(apiChat.title || '').split(' ');\n var firstWord = titleWords.shift();\n var lastWord = titleWords.pop();\n apiChat.initials = firstWord.charAt(0) + (lastWord ? lastWord.charAt(0) : firstWord.charAt(1));\n apiChat.num = (Math.abs(apiChat.id >> 1) % 8) + 1;\n if (apiChat.pFlags === undefined) {\n apiChat.pFlags = {};\n }\n if (apiChat.pFlags.min) {\n if (result !== undefined) {\n return;\n }\n }\n if (apiChat._ == 'channel' &&\n apiChat.participants_count === undefined &&\n result !== undefined &&\n result.participants_count) {\n apiChat.participants_count = result.participants_count;\n }\n if (apiChat.username) {\n var searchUsername = utils_1.SearchIndexManager.cleanUsername(apiChat.username);\n this.usernames[searchUsername] = apiChat.id;\n }\n if (result === undefined) {\n result = this.chats[apiChat.id] = apiChat;\n }\n else {\n utils_1.safeReplaceObject(result, apiChat);\n utils_1.$rootScope.$broadcast('chat_update', apiChat.id);\n }\n if (this.cachedPhotoLocations[apiChat.id] !== undefined) {\n utils_1.safeReplaceObject(this.cachedPhotoLocations[apiChat.id], apiChat &&\n apiChat.photo ? apiChat.photo : { empty: true });\n }\n }\n getChat(id) {\n return this.chats[id] || { id: id, deleted: true, access_hash: this.channelAccess[id] };\n }\n hasRights(id, action) {\n if (!(id in this.chats)) {\n return false;\n }\n var chat = this.getChat(id);\n if (chat._ == 'chatForbidden' ||\n chat._ == 'channelForbidden' ||\n chat.pFlags.kicked ||\n chat.pFlags.left) {\n return false;\n }\n if (chat.pFlags.creator) {\n return true;\n }\n switch (action) {\n case 'send':\n if (chat._ == 'channel' &&\n !chat.pFlags.megagroup &&\n !chat.pFlags.editor) {\n return false;\n }\n break;\n case 'edit_title':\n case 'edit_photo':\n case 'invite':\n if (chat._ == 'channel') {\n if (chat.pFlags.megagroup) {\n if (!chat.pFlags.editor &&\n !(action == 'invite' && chat.pFlags.democracy)) {\n return false;\n }\n }\n else {\n return false;\n }\n }\n else {\n if (chat.pFlags.admins_enabled &&\n !chat.pFlags.admin) {\n return false;\n }\n }\n break;\n }\n return true;\n }\n resolveUsername(username) {\n return this.usernames[username] || 0;\n }\n saveChannelAccess(id, accessHash) {\n this.channelAccess[id] = accessHash;\n }\n saveIsMegagroup(id) {\n this.megagroups[id] = true;\n }\n isChannel(id) {\n var chat = this.chats[id];\n if (chat && (chat._ == 'channel' || chat._ == 'channelForbidden') ||\n this.channelAccess[id]) {\n return true;\n }\n return false;\n }\n isMegagroup(id) {\n if (this.megagroups[id]) {\n return true;\n }\n var chat = this.chats[id];\n if (chat && chat._ == 'channel' && chat.pFlags.megagroup) {\n return true;\n }\n return false;\n }\n isBroadcast(id) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n getChatInput(id) {\n return id || 0;\n }\n getChannelInput(id) {\n if (!id) {\n return { _: 'inputChannelEmpty' };\n }\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash || this.channelAccess[id] || 0\n };\n }\n hasChat(id, allowMin) {\n var chat = this.chats[id];\n return utils_1.isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n getChatPhoto(id) {\n var chat = this.getChat(id);\n if (this.cachedPhotoLocations[id] === undefined) {\n this.cachedPhotoLocations[id] = chat && chat.photo ? chat.photo : { empty: true };\n }\n return this.cachedPhotoLocations[id];\n }\n getChatString(id) {\n var chat = this.getChat(id);\n if (this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n wrapForFull(id, fullChat) {\n var chatFull = utils_1.copy(fullChat);\n var chat = this.getChat(id);\n if (!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n if (chatFull.participants &&\n chatFull.participants._ == 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n if (chatFull.about) {\n chatFull.rAbout = richtextprocessor_1.RichTextProcessor.wrapRichText(chatFull.about, { noLinebreaks: true });\n }\n chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n return chatFull;\n }\n wrapParticipants(id, participants) {\n var chat = this.getChat(id);\n var myID = appUsersManager_1.default.getSelf().id;\n if (this.isChannel(id)) {\n var isAdmin = chat.pFlags.creator || chat.pFlags.editor || chat.pFlags.moderator;\n participants.forEach((participant) => {\n participant.canLeave = myID == participant.user_id;\n participant.canKick = isAdmin && participant._ == 'channelParticipant';\n // just for order by last seen\n participant.user = appUsersManager_1.default.getUser(participant.user_id);\n });\n }\n else {\n var isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myID == participant.user_id;\n participant.canKick = !participant.canLeave && (chat.pFlags.creator ||\n participant._ == 'chatParticipant' && (isAdmin || myID == participant.inviter_id));\n // just for order by last seen\n participant.user = appUsersManager_1.default.getUser(participant.user_id);\n });\n }\n return participants;\n }\n}\nexports.AppChatsManager = AppChatsManager;\nexports.default = new AppChatsManager();\n"
+ },
+ {
+ "id": 13,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/config.js",
+ "name": "./src/lib/config.js",
+ "index": 20,
+ "index2": 18,
+ "size": 400030,
+ "cacheable": true,
+ "built": true,
+ "optional": false,
+ "prefetched": false,
+ "chunks": [
+ 0
+ ],
+ "issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/storage.ts",
+ "issuerId": 6,
+ "issuerName": "./src/lib/storage.ts",
+ "issuerPath": [
+ {
+ "id": 52,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
+ "name": "./src/index.ts",
+ "profile": {
+ "factory": 41,
+ "building": 1632
+ }
+ },
+ {
+ "id": 6,
+ "identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/storage.ts",
+ "name": "./src/lib/storage.ts",
+ "profile": {
+ "factory": 633,
+ "building": 0,
+ "dependencies": 536
+ }
+ }
+ ],
+ "profile": {
+ "factory": 559,
+ "building": 559
+ },
+ "failed": false,
+ "errors": 0,
+ "warnings": 0,
+ "assets": [],
+ "reasons": [
+ {
+ "moduleId": 1,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/apiManager.ts",
+ "module": "./src/lib/mtproto/apiManager.ts",
+ "moduleName": "./src/lib/mtproto/apiManager.ts",
+ "type": "cjs require",
+ "userRequest": "../config",
+ "loc": "28:28-48"
+ },
+ {
+ "moduleId": 6,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/storage.ts",
+ "module": "./src/lib/storage.ts",
+ "moduleName": "./src/lib/storage.ts",
+ "type": "cjs require",
+ "userRequest": "./config",
+ "loc": "3:17-36"
+ },
+ {
+ "moduleId": 16,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/mtproto.ts",
+ "module": "./src/lib/mtproto/mtproto.ts",
+ "moduleName": "./src/lib/mtproto/mtproto.ts",
+ "type": "cjs require",
+ "userRequest": "../config",
+ "loc": "13:28-48"
+ },
+ {
+ "moduleId": 35,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
+ "module": "./src/lib/tl_utils.ts",
+ "moduleName": "./src/lib/tl_utils.ts",
+ "type": "cjs require",
+ "userRequest": "./config",
+ "loc": "18:28-47"
+ },
+ {
+ "moduleId": 40,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
+ "module": "./src/components/pageSignIn.ts",
+ "moduleName": "./src/components/pageSignIn.ts",
+ "type": "cjs require",
+ "userRequest": "../lib/config",
+ "loc": "16:28-52"
+ },
+ {
+ "moduleId": 68,
+ "moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto/networker.ts",
+ "module": "./src/lib/mtproto/networker.ts",
+ "moduleName": "./src/lib/mtproto/networker.ts",
+ "type": "cjs require",
+ "userRequest": "../config",
+ "loc": "28:28-48"
+ }
+ ],
+ "usedExports": true,
+ "providedExports": null,
+ "optimizationBailout": [
+ "ModuleConcatenation bailout: Module is not an ECMAScript module"
+ ],
+ "depth": 2,
+ "source": "/*!\r\n * Webogram v0.7.0 - messaging web application for MTProto\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nConfig = window.Config || {};\r\n\r\n/*\r\n\r\n IMPORTANT NOTICE\r\n ================\r\n\r\n Do not publish your Webogram fork with my app credentials (below), or your application may be blocked.\r\n You can get your own api_id, api_hash at https://my.telegram.org, see manual at https://core.telegram.org/api/obtaining_api_id.\r\n\r\n*/\r\n\r\nConfig.App = {\r\n id: 1025907,\r\n hash: '452b0359b988148995f22ff0f4229750',\r\n version: '0.3.0',\r\n domains: [],\r\n baseDcID: 2\r\n};\r\n\r\nConfig.Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: location.search.indexOf('http=1') > 0,\r\n ssl: location.search.indexOf('ssl=1') > 0 || location.protocol == 'https:' && location.search.indexOf('ssl=0') == -1,\r\n force_mobile: location.search.indexOf('mobile=1') > 0,\r\n force_desktop: location.search.indexOf('desktop=1') > 0,\r\n webcrypto: location.search.indexOf('webcrypto=0') == -1 && 1 == 2,\r\n packed: location.protocol == 'app:' || location.protocol == 'chrome-extension:',\r\n ios_standalone: window.navigator.standalone && navigator.userAgent.match(/iOS|iPhone|iPad/),\r\n chrome_packed: window.chrome && chrome.app && chrome.app.window && true || false,\r\n animations: true,\r\n memory_only: false,\r\n allow_tmpfs: location.search.indexOf('tmpfs=yeahImSureIknowWhatImDoing') > 0 || false,\r\n push_api: location.search.indexOf('push=1') == -1,\r\n multipleConnections: true\r\n};\r\n\r\nConfig.Mobile = false;\r\n\r\nConfig.Navigator = {\r\n nativeEmoji: /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform || ''),\r\n osX: (navigator.platform || '').toLowerCase().indexOf('mac') != -1 ||\r\n (navigator.userAgent || '').toLowerCase().indexOf('mac') != -1,\r\n msie: (navigator.userAgent || '').search(/MSIE | Trident\\/|Edge\\//) != -1,\r\n retina: window.devicePixelRatio > 1,\r\n ffos: navigator.userAgent.search(/mobi.+Gecko/i) != -1,\r\n ffos2p: navigator.userAgent.search(/mobi.+Gecko\\/[34567]/i) != -1,\r\n touch: screen.width <= 768 || ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,\r\n mobile: screen.width && screen.width < 480 || navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1\r\n};\r\n\r\nConfig.ExtCredentials = {\r\n gmaps: {\r\n api_key: 'AIzaSyC72t5GDcP-dob20d-ARwSwOQ41-zgbArg'\r\n }\r\n};\r\n\r\n{\r\n /* let img_size = 32;\r\n let side = 52;\r\n let sheetUrl = `assets/img/sheet_apple_${img_size}_`; // #.png\r\n let multiplyX = 100 / 6;\r\n let sheetSizeX = 6 * (img_size + 2); // size of image in pixels\r\n let sheetSizeY = side * (img_size + 2); // size of image in pixels\r\n let sizeX = 100 * (sheetSizeX / img_size);\r\n let sizeY = 100 * (sheetSizeY / img_size);\r\n let splitted = true; */\r\n\r\n let img_size = 64;\r\n let side = 56;\r\n let sheetUrl = `assets/img/sheet_apple_${img_size}`; // #.png\r\n let multiplyX = 100 / side;\r\n let sheetSizeX = side * (img_size + 2); // size of image in pixels\r\n let sheetSizeY = side * (img_size + 2); // size of image in pixels\r\n let sizeX = 100 * (sheetSizeX / img_size);\r\n let sizeY = 100 * (sheetSizeY / img_size);\r\n let splitted = false;\r\n\r\n Config.Emoji = {\r\n img_size,\r\n sheetUrl,\r\n multiplyX,\r\n sheetSizeX,\r\n sheetSizeY,\r\n sizeX,\r\n sizeY,\r\n side,\r\n splitted,\r\n keyCategory: 'category',\r\n keyX: 'sheet_x',\r\n keyY: 'sheet_y',\r\n /* keyCategory: '2',\r\n keyX: '0', // 'sheet_x'\r\n keyY: '1', // 'sheet_y' */\r\n\r\n emoji: {\"#️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":0,\"sort_order\":132},\"*️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":1,\"sort_order\":133},\"0️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":2,\"sort_order\":134},\"1️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":3,\"sort_order\":135},\"2️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":4,\"sort_order\":136},\"3️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":5,\"sort_order\":137},\"4️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":6,\"sort_order\":138},\"5️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":7,\"sort_order\":139},\"6️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":8,\"sort_order\":140},\"7️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":9,\"sort_order\":141},\"8️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":10,\"sort_order\":142},\"9️⃣\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":11,\"sort_order\":143},\"©️\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":12,\"sort_order\":129},\"®️\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":13,\"sort_order\":130},\"🀄\":{\"category\":\"Activities\",\"sheet_x\":0,\"sheet_y\":14,\"sort_order\":73},\"🃏\":{\"category\":\"Activities\",\"sheet_x\":0,\"sheet_y\":15,\"sort_order\":72},\"🅰️\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":16,\"sort_order\":150},\"🅱️\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":17,\"sort_order\":152},\"🅾️\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":18,\"sort_order\":161},\"🅿️\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":19,\"sort_order\":163},\"🆎\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":20,\"sort_order\":151},\"🆑\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":21,\"sort_order\":153},\"🆒\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":22,\"sort_order\":154},\"🆓\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":23,\"sort_order\":155},\"🆔\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":24,\"sort_order\":157},\"🆕\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":25,\"sort_order\":159},\"🆖\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":26,\"sort_order\":160},\"🆗\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":27,\"sort_order\":162},\"🆘\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":28,\"sort_order\":164},\"🆙\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":29,\"sort_order\":165},\"🆚\":{\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":30,\"sort_order\":166},\"🇦🇨\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":31,\"sort_order\":8},\"🇦🇩\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":32,\"sort_order\":9},\"🇦🇪\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":33,\"sort_order\":10},\"🇦🇫\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":34,\"sort_order\":11},\"🇦🇬\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":35,\"sort_order\":12},\"🇦🇮\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":36,\"sort_order\":13},\"🇦🇱\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":37,\"sort_order\":14},\"🇦🇲\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":38,\"sort_order\":15},\"🇦🇴\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":39,\"sort_order\":16},\"🇦🇶\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":40,\"sort_order\":17},\"🇦🇷\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":41,\"sort_order\":18},\"🇦🇸\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":42,\"sort_order\":19},\"🇦🇹\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":43,\"sort_order\":20},\"🇦🇺\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":44,\"sort_order\":21},\"🇦🇼\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":45,\"sort_order\":22},\"🇦🇽\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":46,\"sort_order\":23},\"🇦🇿\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":47,\"sort_order\":24},\"🇧🇦\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":48,\"sort_order\":25},\"🇧🇧\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":49,\"sort_order\":26},\"🇧🇩\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":50,\"sort_order\":27},\"🇧🇪\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":51,\"sort_order\":28},\"🇧🇫\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":52,\"sort_order\":29},\"🇧🇬\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":53,\"sort_order\":30},\"🇧🇭\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":54,\"sort_order\":31},\"🇧🇮\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":55,\"sort_order\":32},\"🇧🇯\":{\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":56,\"sort_order\":33},\"🇧🇱\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":0,\"sort_order\":34},\"🇧🇲\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":1,\"sort_order\":35},\"🇧🇳\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":2,\"sort_order\":36},\"🇧🇴\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":3,\"sort_order\":37},\"🇧🇶\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":4,\"sort_order\":38},\"🇧🇷\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":5,\"sort_order\":39},\"🇧🇸\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":6,\"sort_order\":40},\"🇧🇹\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":7,\"sort_order\":41},\"🇧🇻\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":8,\"sort_order\":42},\"🇧🇼\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":9,\"sort_order\":43},\"🇧🇾\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":10,\"sort_order\":44},\"🇧🇿\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":11,\"sort_order\":45},\"🇨🇦\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":12,\"sort_order\":46},\"🇨🇨\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":13,\"sort_order\":47},\"🇨🇩\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":14,\"sort_order\":48},\"🇨🇫\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":15,\"sort_order\":49},\"🇨🇬\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":16,\"sort_order\":50},\"🇨🇭\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":17,\"sort_order\":51},\"🇨🇮\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":18,\"sort_order\":52},\"🇨🇰\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":19,\"sort_order\":53},\"🇨🇱\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":20,\"sort_order\":54},\"🇨🇲\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":21,\"sort_order\":55},\"🇨🇳\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":22,\"sort_order\":56},\"🇨🇴\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":23,\"sort_order\":57},\"🇨🇵\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":24,\"sort_order\":58},\"🇨🇷\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":25,\"sort_order\":59},\"🇨🇺\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":26,\"sort_order\":60},\"🇨🇻\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":27,\"sort_order\":61},\"🇨🇼\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":28,\"sort_order\":62},\"🇨🇽\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":29,\"sort_order\":63},\"🇨🇾\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":30,\"sort_order\":64},\"🇨🇿\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":31,\"sort_order\":65},\"🇩🇪\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":32,\"sort_order\":66},\"🇩🇬\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":33,\"sort_order\":67},\"🇩🇯\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":34,\"sort_order\":68},\"🇩🇰\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":35,\"sort_order\":69},\"🇩🇲\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":36,\"sort_order\":70},\"🇩🇴\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":37,\"sort_order\":71},\"🇩🇿\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":38,\"sort_order\":72},\"🇪🇦\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":39,\"sort_order\":73},\"🇪🇨\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":40,\"sort_order\":74},\"🇪🇪\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":41,\"sort_order\":75},\"🇪🇬\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":42,\"sort_order\":76},\"🇪🇭\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":43,\"sort_order\":77},\"🇪🇷\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":44,\"sort_order\":78},\"🇪🇸\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":45,\"sort_order\":79},\"🇪🇹\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":46,\"sort_order\":80},\"🇪🇺\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":47,\"sort_order\":81},\"🇫🇮\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":48,\"sort_order\":82},\"🇫🇯\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":49,\"sort_order\":83},\"🇫🇰\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":50,\"sort_order\":84},\"🇫🇲\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":51,\"sort_order\":85},\"🇫🇴\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":52,\"sort_order\":86},\"🇫🇷\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":53,\"sort_order\":87},\"🇬🇦\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":54,\"sort_order\":88},\"🇬🇧\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":55,\"sort_order\":89},\"🇬🇩\":{\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":56,\"sort_order\":90},\"🇬🇪\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":0,\"sort_order\":91},\"🇬🇫\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":1,\"sort_order\":92},\"🇬🇬\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":2,\"sort_order\":93},\"🇬🇭\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":3,\"sort_order\":94},\"🇬🇮\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":4,\"sort_order\":95},\"🇬🇱\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":5,\"sort_order\":96},\"🇬🇲\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":6,\"sort_order\":97},\"🇬🇳\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":7,\"sort_order\":98},\"🇬🇵\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":8,\"sort_order\":99},\"🇬🇶\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":9,\"sort_order\":100},\"🇬🇷\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":10,\"sort_order\":101},\"🇬🇸\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":11,\"sort_order\":102},\"🇬🇹\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":12,\"sort_order\":103},\"🇬🇺\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":13,\"sort_order\":104},\"🇬🇼\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":14,\"sort_order\":105},\"🇬🇾\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":15,\"sort_order\":106},\"🇭🇰\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":16,\"sort_order\":107},\"🇭🇲\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":17,\"sort_order\":108},\"🇭🇳\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":18,\"sort_order\":109},\"🇭🇷\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":19,\"sort_order\":110},\"🇭🇹\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":20,\"sort_order\":111},\"🇭🇺\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":21,\"sort_order\":112},\"🇮🇨\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":22,\"sort_order\":113},\"🇮🇩\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":23,\"sort_order\":114},\"🇮🇪\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":24,\"sort_order\":115},\"🇮🇱\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":25,\"sort_order\":116},\"🇮🇲\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":26,\"sort_order\":117},\"🇮🇳\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":27,\"sort_order\":118},\"🇮🇴\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":28,\"sort_order\":119},\"🇮🇶\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":29,\"sort_order\":120},\"🇮🇷\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":30,\"sort_order\":121},\"🇮🇸\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":31,\"sort_order\":122},\"🇮🇹\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":32,\"sort_order\":123},\"🇯🇪\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":33,\"sort_order\":124},\"🇯🇲\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":34,\"sort_order\":125},\"🇯🇴\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":35,\"sort_order\":126},\"🇯🇵\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":36,\"sort_order\":127},\"🇰🇪\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":37,\"sort_order\":128},\"🇰🇬\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":38,\"sort_order\":129},\"🇰🇭\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":39,\"sort_order\":130},\"🇰🇮\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":40,\"sort_order\":131},\"🇰🇲\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":41,\"sort_order\":132},\"🇰🇳\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":42,\"sort_order\":133},\"🇰🇵\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":43,\"sort_order\":134},\"🇰🇷\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":44,\"sort_order\":135},\"🇰🇼\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":45,\"sort_order\":136},\"🇰🇾\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":46,\"sort_order\":137},\"🇰🇿\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":47,\"sort_order\":138},\"🇱🇦\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":48,\"sort_order\":139},\"🇱🇧\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":49,\"sort_order\":140},\"🇱🇨\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":50,\"sort_order\":141},\"🇱🇮\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":51,\"sort_order\":142},\"🇱🇰\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":52,\"sort_order\":143},\"🇱🇷\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":53,\"sort_order\":144},\"🇱🇸\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":54,\"sort_order\":145},\"🇱🇹\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":55,\"sort_order\":146},\"🇱🇺\":{\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":56,\"sort_order\":147},\"🇱🇻\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":0,\"sort_order\":148},\"🇱🇾\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":1,\"sort_order\":149},\"🇲🇦\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":2,\"sort_order\":150},\"🇲🇨\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":3,\"sort_order\":151},\"🇲🇩\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":4,\"sort_order\":152},\"🇲🇪\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":5,\"sort_order\":153},\"🇲🇫\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":6,\"sort_order\":154},\"🇲🇬\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":7,\"sort_order\":155},\"🇲🇭\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":8,\"sort_order\":156},\"🇲🇰\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":9,\"sort_order\":157},\"🇲🇱\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":10,\"sort_order\":158},\"🇲🇲\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":11,\"sort_order\":159},\"🇲🇳\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":12,\"sort_order\":160},\"🇲🇴\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":13,\"sort_order\":161},\"🇲🇵\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":14,\"sort_order\":162},\"🇲🇶\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":15,\"sort_order\":163},\"🇲🇷\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":16,\"sort_order\":164},\"🇲🇸\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":17,\"sort_order\":165},\"🇲🇹\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":18,\"sort_order\":166},\"🇲🇺\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":19,\"sort_order\":167},\"🇲🇻\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":20,\"sort_order\":168},\"🇲🇼\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":21,\"sort_order\":169},\"🇲🇽\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":22,\"sort_order\":170},\"🇲🇾\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":23,\"sort_order\":171},\"🇲🇿\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":24,\"sort_order\":172},\"🇳🇦\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":25,\"sort_order\":173},\"🇳🇨\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":26,\"sort_order\":174},\"🇳🇪\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":27,\"sort_order\":175},\"🇳🇫\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":28,\"sort_order\":176},\"🇳🇬\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":29,\"sort_order\":177},\"🇳🇮\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":30,\"sort_order\":178},\"🇳🇱\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":31,\"sort_order\":179},\"🇳🇴\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":32,\"sort_order\":180},\"🇳🇵\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":33,\"sort_order\":181},\"🇳🇷\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":34,\"sort_order\":182},\"🇳🇺\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":35,\"sort_order\":183},\"🇳🇿\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":36,\"sort_order\":184},\"🇴🇲\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":37,\"sort_order\":185},\"🇵🇦\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":38,\"sort_order\":186},\"🇵🇪\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":39,\"sort_order\":187},\"🇵🇫\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":40,\"sort_order\":188},\"🇵🇬\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":41,\"sort_order\":189},\"🇵🇭\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":42,\"sort_order\":190},\"🇵🇰\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":43,\"sort_order\":191},\"🇵🇱\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":44,\"sort_order\":192},\"🇵🇲\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":45,\"sort_order\":193},\"🇵🇳\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":46,\"sort_order\":194},\"🇵🇷\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":47,\"sort_order\":195},\"🇵🇸\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":48,\"sort_order\":196},\"🇵🇹\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":49,\"sort_order\":197},\"🇵🇼\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":50,\"sort_order\":198},\"🇵🇾\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":51,\"sort_order\":199},\"🇶🇦\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":52,\"sort_order\":200},\"🇷🇪\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":53,\"sort_order\":201},\"🇷🇴\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":54,\"sort_order\":202},\"🇷🇸\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":55,\"sort_order\":203},\"🇷🇺\":{\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":56,\"sort_order\":204},\"🇷🇼\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":0,\"sort_order\":205},\"🇸🇦\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":1,\"sort_order\":206},\"🇸🇧\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":2,\"sort_order\":207},\"🇸🇨\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":3,\"sort_order\":208},\"🇸🇩\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":4,\"sort_order\":209},\"🇸🇪\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":5,\"sort_order\":210},\"🇸🇬\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":6,\"sort_order\":211},\"🇸🇭\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":7,\"sort_order\":212},\"🇸🇮\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":8,\"sort_order\":213},\"🇸🇯\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":9,\"sort_order\":214},\"🇸🇰\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":10,\"sort_order\":215},\"🇸🇱\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":11,\"sort_order\":216},\"🇸🇲\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":12,\"sort_order\":217},\"🇸🇳\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":13,\"sort_order\":218},\"🇸🇴\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":14,\"sort_order\":219},\"🇸🇷\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":15,\"sort_order\":220},\"🇸🇸\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":16,\"sort_order\":221},\"🇸🇹\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":17,\"sort_order\":222},\"🇸🇻\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":18,\"sort_order\":223},\"🇸🇽\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":19,\"sort_order\":224},\"🇸🇾\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":20,\"sort_order\":225},\"🇸🇿\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":21,\"sort_order\":226},\"🇹🇦\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":22,\"sort_order\":227},\"🇹🇨\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":23,\"sort_order\":228},\"🇹🇩\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":24,\"sort_order\":229},\"🇹🇫\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":25,\"sort_order\":230},\"🇹🇬\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":26,\"sort_order\":231},\"🇹🇭\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":27,\"sort_order\":232},\"🇹🇯\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":28,\"sort_order\":233},\"🇹🇰\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":29,\"sort_order\":234},\"🇹🇱\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":30,\"sort_order\":235},\"🇹🇲\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":31,\"sort_order\":236},\"🇹🇳\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":32,\"sort_order\":237},\"🇹🇴\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":33,\"sort_order\":238},\"🇹🇷\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":34,\"sort_order\":239},\"🇹🇹\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":35,\"sort_order\":240},\"🇹🇻\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":36,\"sort_order\":241},\"🇹🇼\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":37,\"sort_order\":242},\"🇹🇿\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":38,\"sort_order\":243},\"🇺🇦\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":39,\"sort_order\":244},\"🇺🇬\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":40,\"sort_order\":245},\"🇺🇲\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":41,\"sort_order\":246},\"🇺🇳\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":42,\"sort_order\":247},\"🇺🇸\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":43,\"sort_order\":248},\"🇺🇾\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":44,\"sort_order\":249},\"🇺🇿\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":45,\"sort_order\":250},\"🇻🇦\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":46,\"sort_order\":251},\"🇻🇨\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":47,\"sort_order\":252},\"🇻🇪\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":48,\"sort_order\":253},\"🇻🇬\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":49,\"sort_order\":254},\"🇻🇮\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":50,\"sort_order\":255},\"🇻🇳\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":51,\"sort_order\":256},\"🇻🇺\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":52,\"sort_order\":257},\"🇼🇫\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":53,\"sort_order\":258},\"🇼🇸\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":54,\"sort_order\":259},\"🇽🇰\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":55,\"sort_order\":260},\"🇾🇪\":{\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":56,\"sort_order\":261},\"🇾🇹\":{\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":0,\"sort_order\":262},\"🇿🇦\":{\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":1,\"sort_order\":263},\"🇿🇲\":{\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":2,\"sort_order\":264},\"🇿🇼\":{\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":3,\"sort_order\":265},\"🈁\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":4,\"sort_order\":167},\"🈂️\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":5,\"sort_order\":168},\"🈚\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":6,\"sort_order\":174},\"🈯\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":7,\"sort_order\":171},\"🈲\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":8,\"sort_order\":175},\"🈳\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":9,\"sort_order\":179},\"🈴\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":10,\"sort_order\":178},\"🈵\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":11,\"sort_order\":183},\"🈶\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":12,\"sort_order\":170},\"🈷️\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":13,\"sort_order\":169},\"🈸\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":14,\"sort_order\":177},\"🈹\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":15,\"sort_order\":173},\"🈺\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":16,\"sort_order\":182},\"🉐\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":17,\"sort_order\":172},\"🉑\":{\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":18,\"sort_order\":176},\"🌀\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":19,\"sort_order\":197},\"🌁\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":20,\"sort_order\":49},\"🌂\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":21,\"sort_order\":199},\"🌃\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":22,\"sort_order\":50},\"🌄\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":23,\"sort_order\":52},\"🌅\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":24,\"sort_order\":53},\"🌆\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":25,\"sort_order\":54},\"🌇\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":26,\"sort_order\":55},\"🌈\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":27,\"sort_order\":198},\"🌉\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":28,\"sort_order\":56},\"🌊\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":29,\"sort_order\":210},\"🌋\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":30,\"sort_order\":10},\"🌌\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":31,\"sort_order\":184},\"🌍\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":32,\"sort_order\":1},\"🌎\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":33,\"sort_order\":2},\"🌏\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":34,\"sort_order\":3},\"🌐\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":35,\"sort_order\":4},\"🌑\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":36,\"sort_order\":164},\"🌒\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":37,\"sort_order\":165},\"🌓\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":38,\"sort_order\":166},\"🌔\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":39,\"sort_order\":167},\"🌕\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":40,\"sort_order\":168},\"🌖\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":41,\"sort_order\":169},\"🌗\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":42,\"sort_order\":170},\"🌘\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":43,\"sort_order\":171},\"🌙\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":44,\"sort_order\":172},\"🌚\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":45,\"sort_order\":173},\"🌛\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":46,\"sort_order\":174},\"🌜\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":47,\"sort_order\":175},\"🌝\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":48,\"sort_order\":178},\"🌞\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":49,\"sort_order\":179},\"🌟\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":50,\"sort_order\":182},\"🌠\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":51,\"sort_order\":183},\"🌡️\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":52,\"sort_order\":176},\"🌤️\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":53,\"sort_order\":188},\"🌥️\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":54,\"sort_order\":189},\"🌦️\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":55,\"sort_order\":190},\"🌧️\":{\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":56,\"sort_order\":191},\"🌨️\":{\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":0,\"sort_order\":192},\"🌩️\":{\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":1,\"sort_order\":193},\"🌪️\":{\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":2,\"sort_order\":194},\"🌫️\":{\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":3,\"sort_order\":195},\"🌬️\":{\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":4,\"sort_order\":196},\"🌭\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":5,\"sort_order\":47},\"🌮\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":6,\"sort_order\":49},\"🌯\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":7,\"sort_order\":50},\"🌰\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":8,\"sort_order\":31},\"🌱\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":9,\"sort_order\":116},\"🌲\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":10,\"sort_order\":117},\"🌳\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":11,\"sort_order\":118},\"🌴\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":12,\"sort_order\":119},\"🌵\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":13,\"sort_order\":120},\"🌶️\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":14,\"sort_order\":23},\"🌷\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":15,\"sort_order\":115},\"🌸\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":16,\"sort_order\":107},\"🌹\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":17,\"sort_order\":110},\"🌺\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":18,\"sort_order\":112},\"🌻\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":19,\"sort_order\":113},\"🌼\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":20,\"sort_order\":114},\"🌽\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":21,\"sort_order\":22},\"🌾\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":22,\"sort_order\":121},\"🌿\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":23,\"sort_order\":122},\"🍀\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":24,\"sort_order\":124},\"🍁\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":25,\"sort_order\":125},\"🍂\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":26,\"sort_order\":126},\"🍃\":{\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":27,\"sort_order\":127},\"🍄\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":28,\"sort_order\":29},\"🍅\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":29,\"sort_order\":16},\"🍆\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":30,\"sort_order\":19},\"🍇\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":31,\"sort_order\":1},\"🍈\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":32,\"sort_order\":2},\"🍉\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":33,\"sort_order\":3},\"🍊\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":34,\"sort_order\":4},\"🍋\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":35,\"sort_order\":5},\"🍌\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":36,\"sort_order\":6},\"🍍\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":37,\"sort_order\":7},\"🍎\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":38,\"sort_order\":9},\"🍏\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":39,\"sort_order\":10},\"🍐\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":40,\"sort_order\":11},\"🍑\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":41,\"sort_order\":12},\"🍒\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":42,\"sort_order\":13},\"🍓\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":43,\"sort_order\":14},\"🍔\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":44,\"sort_order\":44},\"🍕\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":45,\"sort_order\":46},\"🍖\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":46,\"sort_order\":40},\"🍗\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":47,\"sort_order\":41},\"🍘\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":48,\"sort_order\":64},\"🍙\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":49,\"sort_order\":65},\"🍚\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":50,\"sort_order\":66},\"🍛\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":51,\"sort_order\":67},\"🍜\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":52,\"sort_order\":68},\"🍝\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":53,\"sort_order\":69},\"🍞\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":54,\"sort_order\":32},\"🍟\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":55,\"sort_order\":45},\"🍠\":{\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":56,\"sort_order\":70},\"🍡\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":0,\"sort_order\":76},\"🍢\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":1,\"sort_order\":71},\"🍣\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":2,\"sort_order\":72},\"🍤\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":3,\"sort_order\":73},\"🍥\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":4,\"sort_order\":74},\"🍦\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":5,\"sort_order\":85},\"🍧\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":6,\"sort_order\":86},\"🍨\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":7,\"sort_order\":87},\"🍩\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":8,\"sort_order\":88},\"🍪\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":9,\"sort_order\":89},\"🍫\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":10,\"sort_order\":94},\"🍬\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":11,\"sort_order\":95},\"🍭\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":12,\"sort_order\":96},\"🍮\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":13,\"sort_order\":97},\"🍯\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":14,\"sort_order\":98},\"🍰\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":15,\"sort_order\":91},\"🍱\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":16,\"sort_order\":63},\"🍲\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":17,\"sort_order\":56},\"🍳\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":18,\"sort_order\":54},\"🍴\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":19,\"sort_order\":118},\"🍵\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":20,\"sort_order\":102},\"🍶\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":21,\"sort_order\":103},\"🍷\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":22,\"sort_order\":105},\"🍸\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":23,\"sort_order\":106},\"🍹\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":24,\"sort_order\":107},\"🍺\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":25,\"sort_order\":108},\"🍻\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":26,\"sort_order\":109},\"🍼\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":27,\"sort_order\":99},\"🍽️\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":28,\"sort_order\":117},\"🍾\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":29,\"sort_order\":104},\"🍿\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":30,\"sort_order\":59},\"🎀\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":31,\"sort_order\":17},\"🎁\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":32,\"sort_order\":18},\"🎂\":{\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":33,\"sort_order\":90},\"🎃\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":34,\"sort_order\":1},\"🎄\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":35,\"sort_order\":2},\"🎅\":{\"category\":\"People & Body\",\"sheet_x\":7,\"sheet_y\":36,\"sort_order\":177},\"🎆\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":42,\"sort_order\":3},\"🎇\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":43,\"sort_order\":4},\"🎈\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":44,\"sort_order\":7},\"🎉\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":45,\"sort_order\":8},\"🎊\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":46,\"sort_order\":9},\"🎋\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":47,\"sort_order\":10},\"🎌\":{\"category\":\"Flags\",\"sheet_x\":7,\"sheet_y\":48,\"sort_order\":3},\"🎍\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":49,\"sort_order\":11},\"🎎\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":50,\"sort_order\":12},\"🎏\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":51,\"sort_order\":13},\"🎐\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":52,\"sort_order\":14},\"🎑\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":53,\"sort_order\":15},\"🎒\":{\"category\":\"Objects\",\"sheet_x\":7,\"sheet_y\":54,\"sort_order\":25},\"🎓\":{\"category\":\"Objects\",\"sheet_x\":7,\"sheet_y\":55,\"sort_order\":37},\"🎖️\":{\"category\":\"Activities\",\"sheet_x\":7,\"sheet_y\":56,\"sort_order\":22},\"🎗️\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":0,\"sort_order\":19},\"🎙️\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":1,\"sort_order\":56},\"🎚️\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":2,\"sort_order\":57},\"🎛️\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":3,\"sort_order\":58},\"🎞️\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":4,\"sort_order\":89},\"🎟️\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":5,\"sort_order\":20},\"🎠\":{\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":6,\"sort_order\":58},\"🎡\":{\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":7,\"sort_order\":59},\"🎢\":{\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":8,\"sort_order\":60},\"🎣\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":9,\"sort_order\":49},\"🎤\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":10,\"sort_order\":59},\"🎥\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":11,\"sort_order\":88},\"🎦\":{\"category\":\"Symbols\",\"sheet_x\":8,\"sheet_y\":12,\"sort_order\":91},\"🎧\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":13,\"sort_order\":60},\"🎨\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":14,\"sort_order\":77},\"🎩\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":15,\"sort_order\":36},\"🎪\":{\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":16,\"sort_order\":62},\"🎫\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":17,\"sort_order\":21},\"🎬\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":18,\"sort_order\":91},\"🎭\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":19,\"sort_order\":75},\"🎮\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":20,\"sort_order\":61},\"🎯\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":21,\"sort_order\":55},\"🎰\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":22,\"sort_order\":63},\"🎱\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":23,\"sort_order\":58},\"🎲\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":24,\"sort_order\":64},\"🎳\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":25,\"sort_order\":37},\"🎴\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":26,\"sort_order\":74},\"🎵\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":27,\"sort_order\":54},\"🎶\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":28,\"sort_order\":55},\"🎷\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":29,\"sort_order\":62},\"🎸\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":30,\"sort_order\":63},\"🎹\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":31,\"sort_order\":64},\"🎺\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":32,\"sort_order\":65},\"🎻\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":33,\"sort_order\":66},\"🎼\":{\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":34,\"sort_order\":53},\"🎽\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":35,\"sort_order\":51},\"🎾\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":36,\"sort_order\":35},\"🎿\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":37,\"sort_order\":52},\"🏀\":{\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":38,\"sort_order\":31},\"🏁\":{\"category\":\"Flags\",\"sheet_x\":8,\"sheet_y\":39,\"sort_order\":1},\"🏂\":{\"category\":\"People & Body\",\"sheet_x\":8,\"sheet_y\":40,\"sort_order\":248},\"🏃♀️\":{\"category\":\"People & Body\",\"sheet_x\":8,\"sheet_y\":46,\"sort_order\":232},\"🏃♂️\":{\"category\":\"People & Body\",\"sheet_x\":8,\"sheet_y\":52,\"sort_order\":231},\"🏃\":{\"category\":\"People & Body\",\"sheet_x\":9,\"sheet_y\":1,\"sort_order\":230},\"🏄♀️\":{\"category\":\"People & Body\",\"sheet_x\":9,\"sheet_y\":7,\"sort_order\":254},\"🏄♂️\":{\"category\":\"People & Body\",\"sheet_x\":9,\"sheet_y\":13,\"sort_order\":253},\"🏄\":{\"category\":\"People & Body\",\"sheet_x\":9,\"sheet_y\":19,\"sort_order\":252},\"🏅\":{\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":25,\"sort_order\":24},\"🏆\":{\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":26,\"sort_order\":23},\"🏇\":{\"category\":\"People & Body\",\"sheet_x\":9,\"sheet_y\":27,\"sort_order\":246},\"🏈\":{\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":33,\"sort_order\":33},\"🏉\":{\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":34,\"sort_order\":34},\"🏊♀️\":{\"category\":\"People & Body\",\"sheet_x\":9,\"sheet_y\":35,\"sort_order\":260},\"🏊♂️\":{\"category\":\"People & Body\",\"sheet_x\":9,\"sheet_y\":41,\"sort_order\":259},\"🏊\":{\"category\":\"People & Body\",\"sheet_x\":9,\"sheet_y\":47,\"sort_order\":258},\"🏋️♀️\":{\"category\":\"People & Body\",\"sheet_x\":9,\"sheet_y\":53,\"sort_order\":266},\"🏋️♂️\":{\"category\":\"People & Body\",\"sheet_x\":10,\"sheet_y\":2,\"sort_order\":265},\"🏋️\":{\"category\":\"People & Body\",\"sheet_x\":10,\"sheet_y\":8,\"sort_order\":264},\"🏌️♀️\":{\"category\":\"People & Body\",\"sheet_x\":10,\"sheet_y\":14,\"sort_order\":251},\"🏌️♂️\":{\"category\":\"People & Body\",\"sheet_x\":10,\"sheet_y\":20,\"sort_order\":250},\"🏌️\":{\"category\":\"People & Body\",\"sheet_x\":10,\"sheet_y\":26,\"sort_order\":249},\"🏍️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":32,\"sort_order\":92},\"🏎️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":33,\"sort_order\":91},\"🏏\":{\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":34,\"sort_order\":38},\"🏐\":{\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":35,\"sort_order\":32},\"🏑\":{\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":36,\"sort_order\":39},\"🏒\":{\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":37,\"sort_order\":40},\"🏓\":{\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":38,\"sort_order\":42},\"🏔️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":39,\"sort_order\":8},\"🏕️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":40,\"sort_order\":12},\"🏖️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":41,\"sort_order\":13},\"🏗️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":42,\"sort_order\":19},\"🏘️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":43,\"sort_order\":21},\"🏙️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":44,\"sort_order\":51},\"🏚️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":45,\"sort_order\":22},\"🏛️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":46,\"sort_order\":18},\"🏜️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":47,\"sort_order\":14},\"🏝️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":48,\"sort_order\":15},\"🏞️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":49,\"sort_order\":16},\"🏟️\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":50,\"sort_order\":17},\"🏠\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":51,\"sort_order\":23},\"🏡\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":52,\"sort_order\":24},\"🏢\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":53,\"sort_order\":25},\"🏣\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":54,\"sort_order\":26},\"🏤\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":55,\"sort_order\":27},\"🏥\":{\"category\":\"Travel & Places\",\"sheet_x\":10,\"sheet_y\":56,\"sort_order\":28},\"🏦\":{\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":0,\"sort_order\":29},\"🏧\":{\"category\":\"Symbols\",\"sheet_x\":11,\"sheet_y\":1,\"sort_order\":1},\"🏨\":{\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":2,\"sort_order\":30},\"🏩\":{\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":3,\"sort_order\":31},\"🏪\":{\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":4,\"sort_order\":32},\"🏫\":{\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":5,\"sort_order\":33},\"🏬\":{\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":6,\"sort_order\":34},\"🏭\":{\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":7,\"sort_order\":35},\"🏮\":{\"category\":\"Objects\",\"sheet_x\":11,\"sheet_y\":8,\"sort_order\":102},\"🏯\":{\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":9,\"sort_order\":36},\"🏰\":{\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":10,\"sort_order\":37},\"🏳️🌈\":{\"category\":\"Flags\",\"sheet_x\":11,\"sheet_y\":11,\"sort_order\":6},\"🏳️\":{\"category\":\"Flags\",\"sheet_x\":11,\"sheet_y\":12,\"sort_order\":5},\"🏴☠️\":{\"category\":\"Flags\",\"sheet_x\":11,\"sheet_y\":13,\"sort_order\":7},\"🏴\":{\"category\":\"Flags\",\"sheet_x\":11,\"sheet_y\":14,\"sort_order\":266},\"🏴\":{\"category\":\"Flags\",\"sheet_x\":11,\"sheet_y\":15,\"sort_order\":267},\"🏴\":{\"category\":\"Flags\",\"sheet_x\":11,\"sheet_y\":16,\"sort_order\":268},\"🏴\":{\"category\":\"Flags\",\"sheet_x\":11,\"sheet_y\":17,\"sort_order\":4},\"🏵️\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":18,\"sort_order\":109},\"🏷️\":{\"category\":\"Objects\",\"sheet_x\":11,\"sheet_y\":19,\"sort_order\":120},\"🏸\":{\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":20,\"sort_order\":43},\"🏹\":{\"category\":\"Objects\",\"sheet_x\":11,\"sheet_y\":21,\"sort_order\":189},\"🏺\":{\"category\":\"Food & Drink\",\"sheet_x\":11,\"sheet_y\":22,\"sort_order\":121},\"🏻\":{\"category\":\"Skin Tones\",\"sheet_x\":11,\"sheet_y\":23,\"sort_order\":1},\"🏼\":{\"category\":\"Skin Tones\",\"sheet_x\":11,\"sheet_y\":24,\"sort_order\":2},\"🏽\":{\"category\":\"Skin Tones\",\"sheet_x\":11,\"sheet_y\":25,\"sort_order\":3},\"🏾\":{\"category\":\"Skin Tones\",\"sheet_x\":11,\"sheet_y\":26,\"sort_order\":4},\"🏿\":{\"category\":\"Skin Tones\",\"sheet_x\":11,\"sheet_y\":27,\"sort_order\":5},\"🐀\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":28,\"sort_order\":44},\"🐁\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":29,\"sort_order\":43},\"🐂\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":30,\"sort_order\":25},\"🐃\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":31,\"sort_order\":26},\"🐄\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":32,\"sort_order\":27},\"🐅\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":33,\"sort_order\":17},\"🐆\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":34,\"sort_order\":18},\"🐇\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":35,\"sort_order\":47},\"🐈\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":36,\"sort_order\":14},\"🐉\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":37,\"sort_order\":82},\"🐊\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":38,\"sort_order\":77},\"🐋\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":39,\"sort_order\":86},\"🐌\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":40,\"sort_order\":94},\"🐍\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":41,\"sort_order\":80},\"🐎\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":42,\"sort_order\":20},\"🐏\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":43,\"sort_order\":32},\"🐐\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":44,\"sort_order\":34},\"🐑\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":45,\"sort_order\":33},\"🐒\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":46,\"sort_order\":2},\"🐓\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":47,\"sort_order\":62},\"🐔\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":48,\"sort_order\":61},\"🐕🦺\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":49,\"sort_order\":8},\"🐕\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":50,\"sort_order\":6},\"🐖\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":51,\"sort_order\":29},\"🐗\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":52,\"sort_order\":30},\"🐘\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":53,\"sort_order\":39},\"🐙\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":54,\"sort_order\":92},\"🐚\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":55,\"sort_order\":93},\"🐛\":{\"category\":\"Animals & Nature\",\"sheet_x\":11,\"sheet_y\":56,\"sort_order\":96},\"🐜\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":0,\"sort_order\":97},\"🐝\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":1,\"sort_order\":98},\"🐞\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":2,\"sort_order\":99},\"🐟\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":3,\"sort_order\":88},\"🐠\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":4,\"sort_order\":89},\"🐡\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":5,\"sort_order\":90},\"🐢\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":6,\"sort_order\":78},\"🐣\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":7,\"sort_order\":63},\"🐤\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":8,\"sort_order\":64},\"🐥\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":9,\"sort_order\":65},\"🐦\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":10,\"sort_order\":66},\"🐧\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":11,\"sort_order\":67},\"🐨\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":12,\"sort_order\":52},\"🐩\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":13,\"sort_order\":9},\"🐪\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":14,\"sort_order\":35},\"🐫\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":15,\"sort_order\":36},\"🐬\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":16,\"sort_order\":87},\"🐭\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":17,\"sort_order\":42},\"🐮\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":18,\"sort_order\":24},\"🐯\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":19,\"sort_order\":16},\"🐰\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":20,\"sort_order\":46},\"🐱\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":21,\"sort_order\":13},\"🐲\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":22,\"sort_order\":81},\"🐳\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":23,\"sort_order\":85},\"🐴\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":24,\"sort_order\":19},\"🐵\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":25,\"sort_order\":1},\"🐶\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":26,\"sort_order\":5},\"🐷\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":27,\"sort_order\":28},\"🐸\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":28,\"sort_order\":76},\"🐹\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":29,\"sort_order\":45},\"🐺\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":30,\"sort_order\":10},\"🐻\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":31,\"sort_order\":51},\"🐼\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":32,\"sort_order\":53},\"🐽\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":33,\"sort_order\":31},\"🐾\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":34,\"sort_order\":59},\"🐿️\":{\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":35,\"sort_order\":48},\"👀\":{\"category\":\"People & Body\",\"sheet_x\":12,\"sheet_y\":36,\"sort_order\":45},\"👁️🗨️\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":12,\"sheet_y\":37,\"sort_order\":145},\"👁️\":{\"category\":\"People & Body\",\"sheet_x\":12,\"sheet_y\":38,\"sort_order\":46},\"👂\":{\"category\":\"People & Body\",\"sheet_x\":12,\"sheet_y\":39,\"sort_order\":39},\"👃\":{\"category\":\"People & Body\",\"sheet_x\":12,\"sheet_y\":45,\"sort_order\":41},\"👄\":{\"category\":\"People & Body\",\"sheet_x\":12,\"sheet_y\":51,\"sort_order\":48},\"👅\":{\"category\":\"People & Body\",\"sheet_x\":12,\"sheet_y\":52,\"sort_order\":47},\"👆\":{\"category\":\"People & Body\",\"sheet_x\":12,\"sheet_y\":53,\"sort_order\":15},\"👇\":{\"category\":\"People & Body\",\"sheet_x\":13,\"sheet_y\":2,\"sort_order\":17},\"👈\":{\"category\":\"People & Body\",\"sheet_x\":13,\"sheet_y\":8,\"sort_order\":13},\"👉\":{\"category\":\"People & Body\",\"sheet_x\":13,\"sheet_y\":14,\"sort_order\":14},\"👊\":{\"category\":\"People & Body\",\"sheet_x\":13,\"sheet_y\":20,\"sort_order\":22},\"👋\":{\"category\":\"People & Body\",\"sheet_x\":13,\"sheet_y\":26,\"sort_order\":1},\"👌\":{\"category\":\"People & Body\",\"sheet_x\":13,\"sheet_y\":32,\"sort_order\":6},\"👍\":{\"category\":\"People & Body\",\"sheet_x\":13,\"sheet_y\":38,\"sort_order\":19},\"👎\":{\"category\":\"People & Body\",\"sheet_x\":13,\"sheet_y\":44,\"sort_order\":20},\"👏\":{\"category\":\"People & Body\",\"sheet_x\":13,\"sheet_y\":50,\"sort_order\":25},\"👐\":{\"category\":\"People & Body\",\"sheet_x\":13,\"sheet_y\":56,\"sort_order\":27},\"👑\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":5,\"sort_order\":34},\"👒\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":6,\"sort_order\":35},\"👓\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":7,\"sort_order\":1},\"👔\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":8,\"sort_order\":6},\"👕\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":9,\"sort_order\":7},\"👖\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":10,\"sort_order\":8},\"👗\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":11,\"sort_order\":13},\"👘\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":12,\"sort_order\":14},\"👙\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":13,\"sort_order\":19},\"👚\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":14,\"sort_order\":20},\"👛\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":15,\"sort_order\":21},\"👜\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":16,\"sort_order\":22},\"👝\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":17,\"sort_order\":23},\"👞\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":18,\"sort_order\":26},\"👟\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":19,\"sort_order\":27},\"👠\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":20,\"sort_order\":30},\"👡\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":21,\"sort_order\":31},\"👢\":{\"category\":\"Objects\",\"sheet_x\":14,\"sheet_y\":22,\"sort_order\":33},\"👣\":{\"category\":\"People & Body\",\"sheet_x\":14,\"sheet_y\":23,\"sort_order\":334},\"👤\":{\"category\":\"People & Body\",\"sheet_x\":14,\"sheet_y\":24,\"sort_order\":332},\"👥\":{\"category\":\"People & Body\",\"sheet_x\":14,\"sheet_y\":25,\"sort_order\":333},\"👦\":{\"category\":\"People & Body\",\"sheet_x\":14,\"sheet_y\":26,\"sort_order\":51},\"👧\":{\"category\":\"People & Body\",\"sheet_x\":14,\"sheet_y\":32,\"sort_order\":52},\"👨🌾\":{\"category\":\"People & Body\",\"sheet_x\":14,\"sheet_y\":38,\"sort_order\":118},\"👨🍳\":{\"category\":\"People & Body\",\"sheet_x\":14,\"sheet_y\":44,\"sort_order\":121},\"👨🎓\":{\"category\":\"People & Body\",\"sheet_x\":14,\"sheet_y\":50,\"sort_order\":109},\"👨🎤\":{\"category\":\"People & Body\",\"sheet_x\":14,\"sheet_y\":56,\"sort_order\":139},\"👨🎨\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":5,\"sort_order\":142},\"👨🏫\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":11,\"sort_order\":112},\"👨🏭\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":17,\"sort_order\":127},\"👨👦👦\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":23,\"sort_order\":322},\"👨👦\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":24,\"sort_order\":321},\"👨👧👦\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":25,\"sort_order\":324},\"👨👧👧\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":26,\"sort_order\":325},\"👨👧\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":27,\"sort_order\":323},\"👨👨👦\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":28,\"sort_order\":311},\"👨👨👦👦\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":29,\"sort_order\":314},\"👨👨👧\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":30,\"sort_order\":312},\"👨👨👧👦\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":31,\"sort_order\":313},\"👨👨👧👧\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":32,\"sort_order\":315},\"👨👩👦\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":33,\"sort_order\":306},\"👨👩👦👦\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":34,\"sort_order\":309},\"👨👩👧\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":35,\"sort_order\":307},\"👨👩👧👦\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":36,\"sort_order\":308},\"👨👩👧👧\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":37,\"sort_order\":310},\"👨💻\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":38,\"sort_order\":136},\"👨💼\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":44,\"sort_order\":130},\"👨🔧\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":50,\"sort_order\":124},\"👨🔬\":{\"category\":\"People & Body\",\"sheet_x\":15,\"sheet_y\":56,\"sort_order\":133},\"👨🚀\":{\"category\":\"People & Body\",\"sheet_x\":16,\"sheet_y\":5,\"sort_order\":148},\"👨🚒\":{\"category\":\"People & Body\",\"sheet_x\":16,\"sheet_y\":11,\"sort_order\":151},\"👨🦯\":{\"category\":\"People & Body\",\"sheet_x\":16,\"sheet_y\":17,\"sort_order\":222},\"👨🦰\":{\"category\":\"People & Body\",\"sheet_x\":16,\"sheet_y\":23,\"sort_order\":57},\"👨🦱\":{\"category\":\"People & Body\",\"sheet_x\":16,\"sheet_y\":29,\"sort_order\":58},\"👨🦲\":{\"category\":\"People & Body\",\"sheet_x\":16,\"sheet_y\":35,\"sort_order\":60},\"👨🦳\":{\"category\":\"People & Body\",\"sheet_x\":16,\"sheet_y\":41,\"sort_order\":59},\"👨🦼\":{\"category\":\"People & Body\",\"sheet_x\":16,\"sheet_y\":47,\"sort_order\":225},\"👨🦽\":{\"category\":\"People & Body\",\"sheet_x\":16,\"sheet_y\":53,\"sort_order\":228},\"👨⚕️\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":2,\"sort_order\":106},\"👨⚖️\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":8,\"sort_order\":115},\"👨✈️\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":14,\"sort_order\":145},\"👨❤️👨\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":20,\"sort_order\":303},\"👨❤️💋👨\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":21,\"sort_order\":299},\"👨\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":22,\"sort_order\":55},\"👩🌾\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":28,\"sort_order\":119},\"👩🍳\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":34,\"sort_order\":122},\"👩🎓\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":40,\"sort_order\":110},\"👩🎤\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":46,\"sort_order\":140},\"👩🎨\":{\"category\":\"People & Body\",\"sheet_x\":17,\"sheet_y\":52,\"sort_order\":143},\"👩🏫\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":1,\"sort_order\":113},\"👩🏭\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":7,\"sort_order\":128},\"👩👦👦\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":13,\"sort_order\":327},\"👩👦\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":14,\"sort_order\":326},\"👩👧👦\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":15,\"sort_order\":329},\"👩👧👧\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":16,\"sort_order\":330},\"👩👧\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":17,\"sort_order\":328},\"👩👩👦\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":18,\"sort_order\":316},\"👩👩👦👦\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":19,\"sort_order\":319},\"👩👩👧\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":20,\"sort_order\":317},\"👩👩👧👦\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":21,\"sort_order\":318},\"👩👩👧👧\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":22,\"sort_order\":320},\"👩💻\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":23,\"sort_order\":137},\"👩💼\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":29,\"sort_order\":131},\"👩🔧\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":35,\"sort_order\":125},\"👩🔬\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":41,\"sort_order\":134},\"👩🚀\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":47,\"sort_order\":149},\"👩🚒\":{\"category\":\"People & Body\",\"sheet_x\":18,\"sheet_y\":53,\"sort_order\":152},\"👩🦯\":{\"category\":\"People & Body\",\"sheet_x\":19,\"sheet_y\":2,\"sort_order\":223},\"👩🦰\":{\"category\":\"People & Body\",\"sheet_x\":19,\"sheet_y\":8,\"sort_order\":62},\"👩🦱\":{\"category\":\"People & Body\",\"sheet_x\":19,\"sheet_y\":14,\"sort_order\":64},\"👩🦲\":{\"category\":\"People & Body\",\"sheet_x\":19,\"sheet_y\":20,\"sort_order\":68},\"👩🦳\":{\"category\":\"People & Body\",\"sheet_x\":19,\"sheet_y\":26,\"sort_order\":66},\"👩🦼\":{\"category\":\"People & Body\",\"sheet_x\":19,\"sheet_y\":32,\"sort_order\":226},\"👩🦽\":{\"category\":\"People & Body\",\"sheet_x\":19,\"sheet_y\":38,\"sort_order\":229},\"👩⚕️\":{\"category\":\"People & Body\",\"sheet_x\":19,\"sheet_y\":44,\"sort_order\":107},\"👩⚖️\":{\"category\":\"People & Body\",\"sheet_x\":19,\"sheet_y\":50,\"sort_order\":116},\"👩✈️\":{\"category\":\"People & Body\",\"sheet_x\":19,\"sheet_y\":56,\"sort_order\":146},\"👩❤️👨\":{\"category\":\"People & Body\",\"sheet_x\":20,\"sheet_y\":5,\"sort_order\":302},\"👩❤️👩\":{\"category\":\"People & Body\",\"sheet_x\":20,\"sheet_y\":6,\"sort_order\":304},\"👩❤️💋👨\":{\"category\":\"People & Body\",\"sheet_x\":20,\"sheet_y\":7,\"sort_order\":298},\"👩❤️💋👩\":{\"category\":\"People & Body\",\"sheet_x\":20,\"sheet_y\":8,\"sort_order\":300},\"👩\":{\"category\":\"People & Body\",\"sheet_x\":20,\"sheet_y\":9,\"sort_order\":61},\"👪\":{\"category\":\"People & Body\",\"sheet_x\":20,\"sheet_y\":15,\"sort_order\":305},\"👫\":{\"category\":\"People & Body\",\"sheet_x\":20,\"sheet_y\":16,\"sort_order\":295},\"👬\":{\"category\":\"People & Body\",\"sheet_x\":20,\"sheet_y\":42,\"sort_order\":296},\"👭\":{\"category\":\"People & Body\",\"sheet_x\":21,\"sheet_y\":11,\"sort_order\":294},\"👮♀️\":{\"category\":\"People & Body\",\"sheet_x\":21,\"sheet_y\":37,\"sort_order\":155},\"👮♂️\":{\"category\":\"People & Body\",\"sheet_x\":21,\"sheet_y\":43,\"sort_order\":154},\"👮\":{\"category\":\"People & Body\",\"sheet_x\":21,\"sheet_y\":49,\"sort_order\":153},\"👯♀️\":{\"category\":\"People & Body\",\"sheet_x\":21,\"sheet_y\":55,\"sort_order\":238},\"👯♂️\":{\"category\":\"People & Body\",\"sheet_x\":21,\"sheet_y\":56,\"sort_order\":237},\"👯\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":0,\"sort_order\":236},\"👰\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":1,\"sort_order\":173},\"👱♀️\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":7,\"sort_order\":70},\"👱♂️\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":13,\"sort_order\":71},\"👱\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":19,\"sort_order\":54},\"👲\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":25,\"sort_order\":170},\"👳♀️\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":31,\"sort_order\":169},\"👳♂️\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":37,\"sort_order\":168},\"👳\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":43,\"sort_order\":167},\"👴\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":49,\"sort_order\":73},\"👵\":{\"category\":\"People & Body\",\"sheet_x\":22,\"sheet_y\":55,\"sort_order\":74},\"👶\":{\"category\":\"People & Body\",\"sheet_x\":23,\"sheet_y\":4,\"sort_order\":49},\"👷♀️\":{\"category\":\"People & Body\",\"sheet_x\":23,\"sheet_y\":10,\"sort_order\":164},\"👷♂️\":{\"category\":\"People & Body\",\"sheet_x\":23,\"sheet_y\":16,\"sort_order\":163},\"👷\":{\"category\":\"People & Body\",\"sheet_x\":23,\"sheet_y\":22,\"sort_order\":162},\"👸\":{\"category\":\"People & Body\",\"sheet_x\":23,\"sheet_y\":28,\"sort_order\":166},\"👹\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":23,\"sheet_y\":34,\"sort_order\":97},\"👺\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":23,\"sheet_y\":35,\"sort_order\":98},\"👻\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":23,\"sheet_y\":36,\"sort_order\":99},\"👼\":{\"category\":\"People & Body\",\"sheet_x\":23,\"sheet_y\":37,\"sort_order\":176},\"👽\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":23,\"sheet_y\":43,\"sort_order\":100},\"👾\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":23,\"sheet_y\":44,\"sort_order\":101},\"👿\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":23,\"sheet_y\":45,\"sort_order\":92},\"💀\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":23,\"sheet_y\":46,\"sort_order\":93},\"💁♀️\":{\"category\":\"People & Body\",\"sheet_x\":23,\"sheet_y\":47,\"sort_order\":89},\"💁♂️\":{\"category\":\"People & Body\",\"sheet_x\":23,\"sheet_y\":53,\"sort_order\":88},\"💁\":{\"category\":\"People & Body\",\"sheet_x\":24,\"sheet_y\":2,\"sort_order\":87},\"💂♀️\":{\"category\":\"People & Body\",\"sheet_x\":24,\"sheet_y\":8,\"sort_order\":161},\"💂♂️\":{\"category\":\"People & Body\",\"sheet_x\":24,\"sheet_y\":14,\"sort_order\":160},\"💂\":{\"category\":\"People & Body\",\"sheet_x\":24,\"sheet_y\":20,\"sort_order\":159},\"💃\":{\"category\":\"People & Body\",\"sheet_x\":24,\"sheet_y\":26,\"sort_order\":233},\"💄\":{\"category\":\"Objects\",\"sheet_x\":24,\"sheet_y\":32,\"sort_order\":41},\"💅\":{\"category\":\"People & Body\",\"sheet_x\":24,\"sheet_y\":33,\"sort_order\":32},\"💆♀️\":{\"category\":\"People & Body\",\"sheet_x\":24,\"sheet_y\":39,\"sort_order\":208},\"💆♂️\":{\"category\":\"People & Body\",\"sheet_x\":24,\"sheet_y\":45,\"sort_order\":207},\"💆\":{\"category\":\"People & Body\",\"sheet_x\":24,\"sheet_y\":51,\"sort_order\":206},\"💇♀️\":{\"category\":\"People & Body\",\"sheet_x\":25,\"sheet_y\":0,\"sort_order\":211},\"💇♂️\":{\"category\":\"People & Body\",\"sheet_x\":25,\"sheet_y\":6,\"sort_order\":210},\"💇\":{\"category\":\"People & Body\",\"sheet_x\":25,\"sheet_y\":12,\"sort_order\":209},\"💈\":{\"category\":\"Travel & Places\",\"sheet_x\":25,\"sheet_y\":18,\"sort_order\":61},\"💉\":{\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":19,\"sort_order\":208},\"💊\":{\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":20,\"sort_order\":210},\"💋\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":21,\"sort_order\":115},\"💌\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":22,\"sort_order\":116},\"💍\":{\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":23,\"sort_order\":42},\"💎\":{\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":24,\"sort_order\":43},\"💏\":{\"category\":\"People & Body\",\"sheet_x\":25,\"sheet_y\":25,\"sort_order\":297},\"💐\":{\"category\":\"Animals & Nature\",\"sheet_x\":25,\"sheet_y\":26,\"sort_order\":106},\"💑\":{\"category\":\"People & Body\",\"sheet_x\":25,\"sheet_y\":27,\"sort_order\":301},\"💒\":{\"category\":\"Travel & Places\",\"sheet_x\":25,\"sheet_y\":28,\"sort_order\":38},\"💓\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":29,\"sort_order\":121},\"💔\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":30,\"sort_order\":126},\"💕\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":31,\"sort_order\":123},\"💖\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":32,\"sort_order\":119},\"💗\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":33,\"sort_order\":120},\"💘\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":34,\"sort_order\":117},\"💙\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":35,\"sort_order\":131},\"💚\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":36,\"sort_order\":130},\"💛\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":37,\"sort_order\":129},\"💜\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":38,\"sort_order\":132},\"💝\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":39,\"sort_order\":118},\"💞\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":40,\"sort_order\":122},\"💟\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":41,\"sort_order\":124},\"💠\":{\"category\":\"Symbols\",\"sheet_x\":25,\"sheet_y\":42,\"sort_order\":214},\"💡\":{\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":43,\"sort_order\":100},\"💢\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":44,\"sort_order\":137},\"💣\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":45,\"sort_order\":143},\"💤\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":46,\"sort_order\":149},\"💥\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":47,\"sort_order\":138},\"💦\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":48,\"sort_order\":140},\"💧\":{\"category\":\"Travel & Places\",\"sheet_x\":25,\"sheet_y\":49,\"sort_order\":209},\"💨\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":50,\"sort_order\":141},\"💩\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":25,\"sheet_y\":51,\"sort_order\":95},\"💪\":{\"category\":\"People & Body\",\"sheet_x\":25,\"sheet_y\":52,\"sort_order\":34},\"💫\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":26,\"sheet_y\":1,\"sort_order\":139},\"💬\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":26,\"sheet_y\":2,\"sort_order\":144},\"💭\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":26,\"sheet_y\":3,\"sort_order\":148},\"💮\":{\"category\":\"Animals & Nature\",\"sheet_x\":26,\"sheet_y\":4,\"sort_order\":108},\"💯\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":26,\"sheet_y\":5,\"sort_order\":136},\"💰\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":6,\"sort_order\":121},\"💱\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":7,\"sort_order\":130},\"💲\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":8,\"sort_order\":131},\"💳\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":9,\"sort_order\":127},\"💴\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":10,\"sort_order\":122},\"💵\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":11,\"sort_order\":123},\"💶\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":12,\"sort_order\":124},\"💷\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":13,\"sort_order\":125},\"💸\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":14,\"sort_order\":126},\"💹\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":15,\"sort_order\":129},\"💺\":{\"category\":\"Travel & Places\",\"sheet_x\":26,\"sheet_y\":16,\"sort_order\":123},\"💻\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":17,\"sort_order\":77},\"💼\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":18,\"sort_order\":152},\"💽\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":19,\"sort_order\":83},\"💾\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":20,\"sort_order\":84},\"💿\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":21,\"sort_order\":85},\"📀\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":22,\"sort_order\":86},\"📁\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":23,\"sort_order\":153},\"📂\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":24,\"sort_order\":154},\"📃\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":25,\"sort_order\":113},\"📄\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":26,\"sort_order\":115},\"📅\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":27,\"sort_order\":156},\"📆\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":28,\"sort_order\":157},\"📇\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":29,\"sort_order\":160},\"📈\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":30,\"sort_order\":161},\"📉\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":31,\"sort_order\":162},\"📊\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":32,\"sort_order\":163},\"📋\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":33,\"sort_order\":164},\"📌\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":34,\"sort_order\":165},\"📍\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":35,\"sort_order\":166},\"📎\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":36,\"sort_order\":167},\"📏\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":37,\"sort_order\":169},\"📐\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":38,\"sort_order\":170},\"📑\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":39,\"sort_order\":118},\"📒\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":40,\"sort_order\":112},\"📓\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":41,\"sort_order\":111},\"📔\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":42,\"sort_order\":104},\"📕\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":43,\"sort_order\":105},\"📖\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":44,\"sort_order\":106},\"📗\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":45,\"sort_order\":107},\"📘\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":46,\"sort_order\":108},\"📙\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":47,\"sort_order\":109},\"📚\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":48,\"sort_order\":110},\"📛\":{\"category\":\"Symbols\",\"sheet_x\":26,\"sheet_y\":49,\"sort_order\":104},\"📜\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":50,\"sort_order\":114},\"📝\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":51,\"sort_order\":151},\"📞\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":52,\"sort_order\":72},\"📟\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":53,\"sort_order\":73},\"📠\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":54,\"sort_order\":74},\"📡\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":55,\"sort_order\":207},\"📢\":{\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":56,\"sort_order\":48},\"📣\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":0,\"sort_order\":49},\"📤\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":1,\"sort_order\":136},\"📥\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":2,\"sort_order\":137},\"📦\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":3,\"sort_order\":138},\"📧\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":4,\"sort_order\":133},\"📨\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":5,\"sort_order\":134},\"📩\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":6,\"sort_order\":135},\"📪\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":7,\"sort_order\":140},\"📫\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":8,\"sort_order\":139},\"📬\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":9,\"sort_order\":141},\"📭\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":10,\"sort_order\":142},\"📮\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":11,\"sort_order\":143},\"📯\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":12,\"sort_order\":50},\"📰\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":13,\"sort_order\":116},\"📱\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":14,\"sort_order\":69},\"📲\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":15,\"sort_order\":70},\"📳\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":16,\"sort_order\":95},\"📴\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":17,\"sort_order\":96},\"📵\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":18,\"sort_order\":23},\"📶\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":19,\"sort_order\":94},\"📷\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":20,\"sort_order\":93},\"📸\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":21,\"sort_order\":94},\"📹\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":22,\"sort_order\":95},\"📺\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":23,\"sort_order\":92},\"📻\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":24,\"sort_order\":61},\"📼\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":25,\"sort_order\":96},\"📽️\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":26,\"sort_order\":90},\"📿\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":27,\"sort_order\":40},\"🔀\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":28,\"sort_order\":73},\"🔁\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":29,\"sort_order\":74},\"🔂\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":30,\"sort_order\":75},\"🔃\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":31,\"sort_order\":41},\"🔄\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":32,\"sort_order\":42},\"🔅\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":33,\"sort_order\":92},\"🔆\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":34,\"sort_order\":93},\"🔇\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":35,\"sort_order\":44},\"🔈\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":36,\"sort_order\":45},\"🔉\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":37,\"sort_order\":46},\"🔊\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":38,\"sort_order\":47},\"🔋\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":39,\"sort_order\":75},\"🔌\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":40,\"sort_order\":76},\"🔍\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":41,\"sort_order\":97},\"🔎\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":42,\"sort_order\":98},\"🔏\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":43,\"sort_order\":177},\"🔐\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":44,\"sort_order\":178},\"🔑\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":45,\"sort_order\":179},\"🔒\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":46,\"sort_order\":175},\"🔓\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":47,\"sort_order\":176},\"🔔\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":48,\"sort_order\":51},\"🔕\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":49,\"sort_order\":52},\"🔖\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":50,\"sort_order\":119},\"🔗\":{\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":51,\"sort_order\":197},\"🔘\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":52,\"sort_order\":215},\"🔙\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":53,\"sort_order\":43},\"🔚\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":54,\"sort_order\":44},\"🔛\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":55,\"sort_order\":45},\"🔜\":{\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":56,\"sort_order\":46},\"🔝\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":0,\"sort_order\":47},\"🔞\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":1,\"sort_order\":24},\"🔟\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":2,\"sort_order\":144},\"🔠\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":3,\"sort_order\":145},\"🔡\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":4,\"sort_order\":146},\"🔢\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":5,\"sort_order\":147},\"🔣\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":6,\"sort_order\":148},\"🔤\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":7,\"sort_order\":149},\"🔥\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":8,\"sort_order\":208},\"🔦\":{\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":9,\"sort_order\":101},\"🔧\":{\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":10,\"sort_order\":191},\"🔨\":{\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":11,\"sort_order\":181},\"🔩\":{\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":12,\"sort_order\":192},\"🔪\":{\"category\":\"Food & Drink\",\"sheet_x\":28,\"sheet_y\":13,\"sort_order\":120},\"🔫\":{\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":14,\"sort_order\":188},\"🔬\":{\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":15,\"sort_order\":205},\"🔭\":{\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":16,\"sort_order\":206},\"🔮\":{\"category\":\"Activities\",\"sheet_x\":28,\"sheet_y\":17,\"sort_order\":59},\"🔯\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":18,\"sort_order\":59},\"🔰\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":19,\"sort_order\":105},\"🔱\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":20,\"sort_order\":103},\"🔲\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":21,\"sort_order\":217},\"🔳\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":22,\"sort_order\":216},\"🔴\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":23,\"sort_order\":184},\"🔵\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":24,\"sort_order\":188},\"🔶\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":25,\"sort_order\":208},\"🔷\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":26,\"sort_order\":209},\"🔸\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":27,\"sort_order\":210},\"🔹\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":28,\"sort_order\":211},\"🔺\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":29,\"sort_order\":212},\"🔻\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":30,\"sort_order\":213},\"🔼\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":31,\"sort_order\":83},\"🔽\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":32,\"sort_order\":85},\"🕉️\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":33,\"sort_order\":50},\"🕊️\":{\"category\":\"Animals & Nature\",\"sheet_x\":28,\"sheet_y\":34,\"sort_order\":68},\"🕋\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":35,\"sort_order\":46},\"🕌\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":36,\"sort_order\":42},\"🕍\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":37,\"sort_order\":44},\"🕎\":{\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":38,\"sort_order\":58},\"🕐\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":39,\"sort_order\":142},\"🕑\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":40,\"sort_order\":144},\"🕒\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":41,\"sort_order\":146},\"🕓\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":42,\"sort_order\":148},\"🕔\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":43,\"sort_order\":150},\"🕕\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":44,\"sort_order\":152},\"🕖\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":45,\"sort_order\":154},\"🕗\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":46,\"sort_order\":156},\"🕘\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":47,\"sort_order\":158},\"🕙\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":48,\"sort_order\":160},\"🕚\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":49,\"sort_order\":162},\"🕛\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":50,\"sort_order\":140},\"🕜\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":51,\"sort_order\":143},\"🕝\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":52,\"sort_order\":145},\"🕞\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":53,\"sort_order\":147},\"🕟\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":54,\"sort_order\":149},\"🕠\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":55,\"sort_order\":151},\"🕡\":{\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":56,\"sort_order\":153},\"🕢\":{\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":0,\"sort_order\":155},\"🕣\":{\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":1,\"sort_order\":157},\"🕤\":{\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":2,\"sort_order\":159},\"🕥\":{\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":3,\"sort_order\":161},\"🕦\":{\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":4,\"sort_order\":163},\"🕧\":{\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":5,\"sort_order\":141},\"🕯️\":{\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":6,\"sort_order\":99},\"🕰️\":{\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":7,\"sort_order\":139},\"🕳️\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":29,\"sheet_y\":8,\"sort_order\":142},\"🕴️\":{\"category\":\"People & Body\",\"sheet_x\":29,\"sheet_y\":9,\"sort_order\":235},\"🕵️♀️\":{\"category\":\"People & Body\",\"sheet_x\":29,\"sheet_y\":15,\"sort_order\":158},\"🕵️♂️\":{\"category\":\"People & Body\",\"sheet_x\":29,\"sheet_y\":21,\"sort_order\":157},\"🕵️\":{\"category\":\"People & Body\",\"sheet_x\":29,\"sheet_y\":27,\"sort_order\":156},\"🕶️\":{\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":33,\"sort_order\":2},\"🕷️\":{\"category\":\"Animals & Nature\",\"sheet_x\":29,\"sheet_y\":34,\"sort_order\":101},\"🕸️\":{\"category\":\"Animals & Nature\",\"sheet_x\":29,\"sheet_y\":35,\"sort_order\":102},\"🕹️\":{\"category\":\"Activities\",\"sheet_x\":29,\"sheet_y\":36,\"sort_order\":62},\"🕺\":{\"category\":\"People & Body\",\"sheet_x\":29,\"sheet_y\":37,\"sort_order\":234},\"🖇️\":{\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":43,\"sort_order\":168},\"🖊️\":{\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":44,\"sort_order\":148},\"🖋️\":{\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":45,\"sort_order\":147},\"🖌️\":{\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":46,\"sort_order\":149},\"🖍️\":{\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":47,\"sort_order\":150},\"🖐️\":{\"category\":\"People & Body\",\"sheet_x\":29,\"sheet_y\":48,\"sort_order\":3},\"🖕\":{\"category\":\"People & Body\",\"sheet_x\":29,\"sheet_y\":54,\"sort_order\":16},\"🖖\":{\"category\":\"People & Body\",\"sheet_x\":30,\"sheet_y\":3,\"sort_order\":5},\"🖤\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":9,\"sort_order\":134},\"🖥️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":10,\"sort_order\":78},\"🖨️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":11,\"sort_order\":79},\"🖱️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":12,\"sort_order\":81},\"🖲️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":13,\"sort_order\":82},\"🖼️\":{\"category\":\"Activities\",\"sheet_x\":30,\"sheet_y\":14,\"sort_order\":76},\"🗂️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":15,\"sort_order\":155},\"🗃️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":16,\"sort_order\":172},\"🗄️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":17,\"sort_order\":173},\"🗑️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":18,\"sort_order\":174},\"🗒️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":19,\"sort_order\":158},\"🗓️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":20,\"sort_order\":159},\"🗜️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":21,\"sort_order\":194},\"🗝️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":22,\"sort_order\":180},\"🗞️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":23,\"sort_order\":117},\"🗡️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":24,\"sort_order\":186},\"🗣️\":{\"category\":\"People & Body\",\"sheet_x\":30,\"sheet_y\":25,\"sort_order\":331},\"🗨️\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":26,\"sort_order\":146},\"🗯️\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":27,\"sort_order\":147},\"🗳️\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":28,\"sort_order\":144},\"🗺️\":{\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":29,\"sort_order\":5},\"🗻\":{\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":30,\"sort_order\":11},\"🗼\":{\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":31,\"sort_order\":39},\"🗽\":{\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":32,\"sort_order\":40},\"🗾\":{\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":33,\"sort_order\":6},\"🗿\":{\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":34,\"sort_order\":233},\"😀\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":35,\"sort_order\":1},\"😁\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":36,\"sort_order\":4},\"😂\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":37,\"sort_order\":8},\"😃\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":38,\"sort_order\":2},\"😄\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":39,\"sort_order\":3},\"😅\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":40,\"sort_order\":6},\"😆\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":41,\"sort_order\":5},\"😇\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":42,\"sort_order\":13},\"😈\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":43,\"sort_order\":91},\"😉\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":44,\"sort_order\":11},\"😊\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":45,\"sort_order\":12},\"😋\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":46,\"sort_order\":22},\"😌\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":47,\"sort_order\":42},\"😍\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":48,\"sort_order\":15},\"😎\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":49,\"sort_order\":60},\"😏\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":50,\"sort_order\":37},\"😐\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":51,\"sort_order\":34},\"😑\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":52,\"sort_order\":35},\"😒\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":53,\"sort_order\":38},\"😓\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":54,\"sort_order\":83},\"😔\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":55,\"sort_order\":43},\"😕\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":30,\"sheet_y\":56,\"sort_order\":63},\"😖\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":0,\"sort_order\":80},\"😗\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":1,\"sort_order\":18},\"😘\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":2,\"sort_order\":17},\"😙\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":3,\"sort_order\":21},\"😚\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":4,\"sort_order\":20},\"😛\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":5,\"sort_order\":23},\"😜\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":6,\"sort_order\":24},\"😝\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":7,\"sort_order\":26},\"😞\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":8,\"sort_order\":82},\"😟\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":9,\"sort_order\":64},\"😠\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":10,\"sort_order\":89},\"😡\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":11,\"sort_order\":88},\"😢\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":12,\"sort_order\":77},\"😣\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":13,\"sort_order\":81},\"😤\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":14,\"sort_order\":87},\"😥\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":15,\"sort_order\":76},\"😦\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":16,\"sort_order\":72},\"😧\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":17,\"sort_order\":73},\"😨\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":18,\"sort_order\":74},\"😩\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":19,\"sort_order\":84},\"😪\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":20,\"sort_order\":44},\"😫\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":21,\"sort_order\":85},\"😬\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":22,\"sort_order\":40},\"😭\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":23,\"sort_order\":78},\"😮\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":24,\"sort_order\":67},\"😯\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":25,\"sort_order\":68},\"😰\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":26,\"sort_order\":75},\"😱\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":27,\"sort_order\":79},\"😲\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":28,\"sort_order\":69},\"😳\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":29,\"sort_order\":70},\"😴\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":30,\"sort_order\":46},\"😵\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":31,\"sort_order\":56},\"😶\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":32,\"sort_order\":36},\"😷\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":33,\"sort_order\":47},\"😸\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":34,\"sort_order\":104},\"😹\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":35,\"sort_order\":105},\"😺\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":36,\"sort_order\":103},\"😻\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":37,\"sort_order\":106},\"😼\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":38,\"sort_order\":107},\"😽\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":39,\"sort_order\":108},\"😾\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":40,\"sort_order\":111},\"😿\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":41,\"sort_order\":110},\"🙀\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":42,\"sort_order\":109},\"🙁\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":43,\"sort_order\":65},\"🙂\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":44,\"sort_order\":9},\"🙃\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":45,\"sort_order\":10},\"🙄\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":31,\"sheet_y\":46,\"sort_order\":39},\"🙅♀️\":{\"category\":\"People & Body\",\"sheet_x\":31,\"sheet_y\":47,\"sort_order\":83},\"🙅♂️\":{\"category\":\"People & Body\",\"sheet_x\":31,\"sheet_y\":53,\"sort_order\":82},\"🙅\":{\"category\":\"People & Body\",\"sheet_x\":32,\"sheet_y\":2,\"sort_order\":81},\"🙆♀️\":{\"category\":\"People & Body\",\"sheet_x\":32,\"sheet_y\":8,\"sort_order\":86},\"🙆♂️\":{\"category\":\"People & Body\",\"sheet_x\":32,\"sheet_y\":14,\"sort_order\":85},\"🙆\":{\"category\":\"People & Body\",\"sheet_x\":32,\"sheet_y\":20,\"sort_order\":84},\"🙇♀️\":{\"category\":\"People & Body\",\"sheet_x\":32,\"sheet_y\":26,\"sort_order\":98},\"🙇♂️\":{\"category\":\"People & Body\",\"sheet_x\":32,\"sheet_y\":32,\"sort_order\":97},\"🙇\":{\"category\":\"People & Body\",\"sheet_x\":32,\"sheet_y\":38,\"sort_order\":96},\"🙈\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":32,\"sheet_y\":44,\"sort_order\":112},\"🙉\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":32,\"sheet_y\":45,\"sort_order\":113},\"🙊\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":32,\"sheet_y\":46,\"sort_order\":114},\"🙋♀️\":{\"category\":\"People & Body\",\"sheet_x\":32,\"sheet_y\":47,\"sort_order\":92},\"🙋♂️\":{\"category\":\"People & Body\",\"sheet_x\":32,\"sheet_y\":53,\"sort_order\":91},\"🙋\":{\"category\":\"People & Body\",\"sheet_x\":33,\"sheet_y\":2,\"sort_order\":90},\"🙌\":{\"category\":\"People & Body\",\"sheet_x\":33,\"sheet_y\":8,\"sort_order\":26},\"🙍♀️\":{\"category\":\"People & Body\",\"sheet_x\":33,\"sheet_y\":14,\"sort_order\":77},\"🙍♂️\":{\"category\":\"People & Body\",\"sheet_x\":33,\"sheet_y\":20,\"sort_order\":76},\"🙍\":{\"category\":\"People & Body\",\"sheet_x\":33,\"sheet_y\":26,\"sort_order\":75},\"🙎♀️\":{\"category\":\"People & Body\",\"sheet_x\":33,\"sheet_y\":32,\"sort_order\":80},\"🙎♂️\":{\"category\":\"People & Body\",\"sheet_x\":33,\"sheet_y\":38,\"sort_order\":79},\"🙎\":{\"category\":\"People & Body\",\"sheet_x\":33,\"sheet_y\":44,\"sort_order\":78},\"🙏\":{\"category\":\"People & Body\",\"sheet_x\":33,\"sheet_y\":50,\"sort_order\":30},\"🚀\":{\"category\":\"Travel & Places\",\"sheet_x\":33,\"sheet_y\":56,\"sort_order\":129},\"🚁\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":0,\"sort_order\":124},\"🚂\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":1,\"sort_order\":63},\"🚃\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":2,\"sort_order\":64},\"🚄\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":3,\"sort_order\":65},\"🚅\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":4,\"sort_order\":66},\"🚆\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":5,\"sort_order\":67},\"🚇\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":6,\"sort_order\":68},\"🚈\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":7,\"sort_order\":69},\"🚉\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":8,\"sort_order\":70},\"🚊\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":9,\"sort_order\":71},\"🚋\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":10,\"sort_order\":74},\"🚌\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":11,\"sort_order\":75},\"🚍\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":12,\"sort_order\":76},\"🚎\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":13,\"sort_order\":77},\"🚏\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":14,\"sort_order\":100},\"🚐\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":15,\"sort_order\":78},\"🚑\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":16,\"sort_order\":79},\"🚒\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":17,\"sort_order\":80},\"🚓\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":18,\"sort_order\":81},\"🚔\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":19,\"sort_order\":82},\"🚕\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":20,\"sort_order\":83},\"🚖\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":21,\"sort_order\":84},\"🚗\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":22,\"sort_order\":85},\"🚘\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":23,\"sort_order\":86},\"🚙\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":24,\"sort_order\":87},\"🚚\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":25,\"sort_order\":88},\"🚛\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":26,\"sort_order\":89},\"🚜\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":27,\"sort_order\":90},\"🚝\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":28,\"sort_order\":72},\"🚞\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":29,\"sort_order\":73},\"🚟\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":30,\"sort_order\":125},\"🚠\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":31,\"sort_order\":126},\"🚡\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":32,\"sort_order\":127},\"🚢\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":33,\"sort_order\":117},\"🚣♀️\":{\"category\":\"People & Body\",\"sheet_x\":34,\"sheet_y\":34,\"sort_order\":257},\"🚣♂️\":{\"category\":\"People & Body\",\"sheet_x\":34,\"sheet_y\":40,\"sort_order\":256},\"🚣\":{\"category\":\"People & Body\",\"sheet_x\":34,\"sheet_y\":46,\"sort_order\":255},\"🚤\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":52,\"sort_order\":113},\"🚥\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":53,\"sort_order\":106},\"🚦\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":54,\"sort_order\":107},\"🚧\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":55,\"sort_order\":109},\"🚨\":{\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":56,\"sort_order\":105},\"🚩\":{\"category\":\"Flags\",\"sheet_x\":35,\"sheet_y\":0,\"sort_order\":2},\"🚪\":{\"category\":\"Objects\",\"sheet_x\":35,\"sheet_y\":1,\"sort_order\":213},\"🚫\":{\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":2,\"sort_order\":17},\"🚬\":{\"category\":\"Objects\",\"sheet_x\":35,\"sheet_y\":3,\"sort_order\":230},\"🚭\":{\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":4,\"sort_order\":19},\"🚮\":{\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":5,\"sort_order\":2},\"🚯\":{\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":6,\"sort_order\":20},\"🚰\":{\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":7,\"sort_order\":3},\"🚱\":{\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":8,\"sort_order\":21},\"🚲\":{\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":9,\"sort_order\":97},\"🚳\":{\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":10,\"sort_order\":18},\"🚴♀️\":{\"category\":\"People & Body\",\"sheet_x\":35,\"sheet_y\":11,\"sort_order\":269},\"🚴♂️\":{\"category\":\"People & Body\",\"sheet_x\":35,\"sheet_y\":17,\"sort_order\":268},\"🚴\":{\"category\":\"People & Body\",\"sheet_x\":35,\"sheet_y\":23,\"sort_order\":267},\"🚵♀️\":{\"category\":\"People & Body\",\"sheet_x\":35,\"sheet_y\":29,\"sort_order\":272},\"🚵♂️\":{\"category\":\"People & Body\",\"sheet_x\":35,\"sheet_y\":35,\"sort_order\":271},\"🚵\":{\"category\":\"People & Body\",\"sheet_x\":35,\"sheet_y\":41,\"sort_order\":270},\"🚶♀️\":{\"category\":\"People & Body\",\"sheet_x\":35,\"sheet_y\":47,\"sort_order\":214},\"🚶♂️\":{\"category\":\"People & Body\",\"sheet_x\":35,\"sheet_y\":53,\"sort_order\":213},\"🚶\":{\"category\":\"People & Body\",\"sheet_x\":36,\"sheet_y\":2,\"sort_order\":212},\"🚷\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":8,\"sort_order\":22},\"🚸\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":9,\"sort_order\":15},\"🚹\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":10,\"sort_order\":5},\"🚺\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":11,\"sort_order\":6},\"🚻\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":12,\"sort_order\":7},\"🚼\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":13,\"sort_order\":8},\"🚽\":{\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":14,\"sort_order\":217},\"🚾\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":15,\"sort_order\":9},\"🚿\":{\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":16,\"sort_order\":218},\"🛀\":{\"category\":\"People & Body\",\"sheet_x\":36,\"sheet_y\":17,\"sort_order\":291},\"🛁\":{\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":23,\"sort_order\":219},\"🛂\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":24,\"sort_order\":10},\"🛃\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":25,\"sort_order\":11},\"🛄\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":26,\"sort_order\":12},\"🛅\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":27,\"sort_order\":13},\"🛋️\":{\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":28,\"sort_order\":215},\"🛌\":{\"category\":\"People & Body\",\"sheet_x\":36,\"sheet_y\":29,\"sort_order\":292},\"🛍️\":{\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":35,\"sort_order\":24},\"🛎️\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":36,\"sort_order\":131},\"🛏️\":{\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":37,\"sort_order\":214},\"🛐\":{\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":38,\"sort_order\":48},\"🛑\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":39,\"sort_order\":108},\"🛒\":{\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":40,\"sort_order\":229},\"🛕\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":41,\"sort_order\":43},\"🛠️\":{\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":42,\"sort_order\":185},\"🛡️\":{\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":43,\"sort_order\":190},\"🛢️\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":44,\"sort_order\":103},\"🛣️\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":45,\"sort_order\":101},\"🛤️\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":46,\"sort_order\":102},\"🛥️\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":47,\"sort_order\":116},\"🛩️\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":48,\"sort_order\":119},\"🛫\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":49,\"sort_order\":120},\"🛬\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":50,\"sort_order\":121},\"🛰️\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":51,\"sort_order\":128},\"🛳️\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":52,\"sort_order\":114},\"🛴\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":53,\"sort_order\":98},\"🛵\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":54,\"sort_order\":93},\"🛶\":{\"category\":\"Travel & Places\",\"sheet_x\":36,\"sheet_y\":55,\"sort_order\":112},\"🛷\":{\"category\":\"Activities\",\"sheet_x\":36,\"sheet_y\":56,\"sort_order\":53},\"🛸\":{\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":0,\"sort_order\":130},\"🛹\":{\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":1,\"sort_order\":99},\"🛺\":{\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":2,\"sort_order\":96},\"🟠\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":3,\"sort_order\":185},\"🟡\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":4,\"sort_order\":186},\"🟢\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":5,\"sort_order\":187},\"🟣\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":6,\"sort_order\":189},\"🟤\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":7,\"sort_order\":190},\"🟥\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":8,\"sort_order\":193},\"🟦\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":9,\"sort_order\":197},\"🟧\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":10,\"sort_order\":194},\"🟨\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":11,\"sort_order\":195},\"🟩\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":12,\"sort_order\":196},\"🟪\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":13,\"sort_order\":198},\"🟫\":{\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":14,\"sort_order\":199},\"🤍\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":37,\"sheet_y\":15,\"sort_order\":135},\"🤎\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":37,\"sheet_y\":16,\"sort_order\":133},\"🤏\":{\"category\":\"People & Body\",\"sheet_x\":37,\"sheet_y\":17,\"sort_order\":7},\"🤐\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":37,\"sheet_y\":23,\"sort_order\":32},\"🤑\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":37,\"sheet_y\":24,\"sort_order\":27},\"🤒\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":37,\"sheet_y\":25,\"sort_order\":48},\"🤓\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":37,\"sheet_y\":26,\"sort_order\":61},\"🤔\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":37,\"sheet_y\":27,\"sort_order\":31},\"🤕\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":37,\"sheet_y\":28,\"sort_order\":49},\"🤖\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":37,\"sheet_y\":29,\"sort_order\":102},\"🤗\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":37,\"sheet_y\":30,\"sort_order\":28},\"🤘\":{\"category\":\"People & Body\",\"sheet_x\":37,\"sheet_y\":31,\"sort_order\":11},\"🤙\":{\"category\":\"People & Body\",\"sheet_x\":37,\"sheet_y\":37,\"sort_order\":12},\"🤚\":{\"category\":\"People & Body\",\"sheet_x\":37,\"sheet_y\":43,\"sort_order\":2},\"🤛\":{\"category\":\"People & Body\",\"sheet_x\":37,\"sheet_y\":49,\"sort_order\":23},\"🤜\":{\"category\":\"People & Body\",\"sheet_x\":37,\"sheet_y\":55,\"sort_order\":24},\"🤝\":{\"category\":\"People & Body\",\"sheet_x\":38,\"sheet_y\":4,\"sort_order\":29},\"🤞\":{\"category\":\"People & Body\",\"sheet_x\":38,\"sheet_y\":5,\"sort_order\":9},\"🤟\":{\"category\":\"People & Body\",\"sheet_x\":38,\"sheet_y\":11,\"sort_order\":10},\"🤠\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":17,\"sort_order\":58},\"🤡\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":18,\"sort_order\":96},\"🤢\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":19,\"sort_order\":50},\"🤣\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":20,\"sort_order\":7},\"🤤\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":21,\"sort_order\":45},\"🤥\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":22,\"sort_order\":41},\"🤦♀️\":{\"category\":\"People & Body\",\"sheet_x\":38,\"sheet_y\":23,\"sort_order\":101},\"🤦♂️\":{\"category\":\"People & Body\",\"sheet_x\":38,\"sheet_y\":29,\"sort_order\":100},\"🤦\":{\"category\":\"People & Body\",\"sheet_x\":38,\"sheet_y\":35,\"sort_order\":99},\"🤧\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":41,\"sort_order\":52},\"🤨\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":42,\"sort_order\":33},\"🤩\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":43,\"sort_order\":16},\"🤪\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":44,\"sort_order\":25},\"🤫\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":45,\"sort_order\":30},\"🤬\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":46,\"sort_order\":90},\"🤭\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":47,\"sort_order\":29},\"🤮\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":48,\"sort_order\":51},\"🤯\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":38,\"sheet_y\":49,\"sort_order\":57},\"🤰\":{\"category\":\"People & Body\",\"sheet_x\":38,\"sheet_y\":50,\"sort_order\":174},\"🤱\":{\"category\":\"People & Body\",\"sheet_x\":38,\"sheet_y\":56,\"sort_order\":175},\"🤲\":{\"category\":\"People & Body\",\"sheet_x\":39,\"sheet_y\":5,\"sort_order\":28},\"🤳\":{\"category\":\"People & Body\",\"sheet_x\":39,\"sheet_y\":11,\"sort_order\":33},\"🤴\":{\"category\":\"People & Body\",\"sheet_x\":39,\"sheet_y\":17,\"sort_order\":165},\"🤵\":{\"category\":\"People & Body\",\"sheet_x\":39,\"sheet_y\":23,\"sort_order\":172},\"🤶\":{\"category\":\"People & Body\",\"sheet_x\":39,\"sheet_y\":29,\"sort_order\":178},\"🤷♀️\":{\"category\":\"People & Body\",\"sheet_x\":39,\"sheet_y\":35,\"sort_order\":104},\"🤷♂️\":{\"category\":\"People & Body\",\"sheet_x\":39,\"sheet_y\":41,\"sort_order\":103},\"🤷\":{\"category\":\"People & Body\",\"sheet_x\":39,\"sheet_y\":47,\"sort_order\":102},\"🤸♀️\":{\"category\":\"People & Body\",\"sheet_x\":39,\"sheet_y\":53,\"sort_order\":275},\"🤸♂️\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":2,\"sort_order\":274},\"🤸\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":8,\"sort_order\":273},\"🤹♀️\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":14,\"sort_order\":287},\"🤹♂️\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":20,\"sort_order\":286},\"🤹\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":26,\"sort_order\":285},\"🤺\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":32,\"sort_order\":245},\"🤼♀️\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":33,\"sort_order\":278},\"🤼♂️\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":34,\"sort_order\":277},\"🤼\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":35,\"sort_order\":276},\"🤽♀️\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":36,\"sort_order\":281},\"🤽♂️\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":42,\"sort_order\":280},\"🤽\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":48,\"sort_order\":279},\"🤾♀️\":{\"category\":\"People & Body\",\"sheet_x\":40,\"sheet_y\":54,\"sort_order\":284},\"🤾♂️\":{\"category\":\"People & Body\",\"sheet_x\":41,\"sheet_y\":3,\"sort_order\":283},\"🤾\":{\"category\":\"People & Body\",\"sheet_x\":41,\"sheet_y\":9,\"sort_order\":282},\"🤿\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":15,\"sort_order\":50},\"🥀\":{\"category\":\"Animals & Nature\",\"sheet_x\":41,\"sheet_y\":16,\"sort_order\":111},\"🥁\":{\"category\":\"Objects\",\"sheet_x\":41,\"sheet_y\":17,\"sort_order\":68},\"🥂\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":18,\"sort_order\":110},\"🥃\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":19,\"sort_order\":111},\"🥄\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":20,\"sort_order\":119},\"🥅\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":21,\"sort_order\":46},\"🥇\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":22,\"sort_order\":25},\"🥈\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":23,\"sort_order\":26},\"🥉\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":24,\"sort_order\":27},\"🥊\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":25,\"sort_order\":44},\"🥋\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":26,\"sort_order\":45},\"🥌\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":27,\"sort_order\":54},\"🥍\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":28,\"sort_order\":41},\"🥎\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":29,\"sort_order\":30},\"🥏\":{\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":30,\"sort_order\":36},\"🥐\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":31,\"sort_order\":33},\"🥑\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":32,\"sort_order\":18},\"🥒\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":33,\"sort_order\":24},\"🥓\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":34,\"sort_order\":43},\"🥔\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":35,\"sort_order\":20},\"🥕\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":36,\"sort_order\":21},\"🥖\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":37,\"sort_order\":34},\"🥗\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":38,\"sort_order\":58},\"🥘\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":39,\"sort_order\":55},\"🥙\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":40,\"sort_order\":51},\"🥚\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":41,\"sort_order\":53},\"🥛\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":42,\"sort_order\":100},\"🥜\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":43,\"sort_order\":30},\"🥝\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":44,\"sort_order\":15},\"🥞\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":45,\"sort_order\":37},\"🥟\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":46,\"sort_order\":77},\"🥠\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":47,\"sort_order\":78},\"🥡\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":48,\"sort_order\":79},\"🥢\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":49,\"sort_order\":116},\"🥣\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":50,\"sort_order\":57},\"🥤\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":51,\"sort_order\":112},\"🥥\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":52,\"sort_order\":17},\"🥦\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":53,\"sort_order\":26},\"🥧\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":54,\"sort_order\":93},\"🥨\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":55,\"sort_order\":35},\"🥩\":{\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":56,\"sort_order\":42},\"🥪\":{\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":0,\"sort_order\":48},\"🥫\":{\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":1,\"sort_order\":62},\"🥬\":{\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":2,\"sort_order\":25},\"🥭\":{\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":3,\"sort_order\":8},\"🥮\":{\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":4,\"sort_order\":75},\"🥯\":{\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":5,\"sort_order\":36},\"🥰\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":42,\"sheet_y\":6,\"sort_order\":14},\"🥱\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":42,\"sheet_y\":7,\"sort_order\":86},\"🥳\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":42,\"sheet_y\":8,\"sort_order\":59},\"🥴\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":42,\"sheet_y\":9,\"sort_order\":55},\"🥵\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":42,\"sheet_y\":10,\"sort_order\":53},\"🥶\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":42,\"sheet_y\":11,\"sort_order\":54},\"🥺\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":42,\"sheet_y\":12,\"sort_order\":71},\"🥻\":{\"category\":\"Objects\",\"sheet_x\":42,\"sheet_y\":13,\"sort_order\":15},\"🥼\":{\"category\":\"Objects\",\"sheet_x\":42,\"sheet_y\":14,\"sort_order\":4},\"🥽\":{\"category\":\"Objects\",\"sheet_x\":42,\"sheet_y\":15,\"sort_order\":3},\"🥾\":{\"category\":\"Objects\",\"sheet_x\":42,\"sheet_y\":16,\"sort_order\":28},\"🥿\":{\"category\":\"Objects\",\"sheet_x\":42,\"sheet_y\":17,\"sort_order\":29},\"🦀\":{\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":18,\"sort_order\":80},\"🦁\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":19,\"sort_order\":15},\"🦂\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":20,\"sort_order\":103},\"🦃\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":21,\"sort_order\":60},\"🦄\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":22,\"sort_order\":21},\"🦅\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":23,\"sort_order\":69},\"🦆\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":24,\"sort_order\":70},\"🦇\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":25,\"sort_order\":50},\"🦈\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":26,\"sort_order\":91},\"🦉\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":27,\"sort_order\":72},\"🦊\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":28,\"sort_order\":11},\"🦋\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":29,\"sort_order\":95},\"🦌\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":30,\"sort_order\":23},\"🦍\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":31,\"sort_order\":3},\"🦎\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":32,\"sort_order\":79},\"🦏\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":33,\"sort_order\":40},\"🦐\":{\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":34,\"sort_order\":82},\"🦑\":{\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":35,\"sort_order\":83},\"🦒\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":36,\"sort_order\":38},\"🦓\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":37,\"sort_order\":22},\"🦔\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":38,\"sort_order\":49},\"🦕\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":39,\"sort_order\":83},\"🦖\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":40,\"sort_order\":84},\"🦗\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":41,\"sort_order\":100},\"🦘\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":42,\"sort_order\":57},\"🦙\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":43,\"sort_order\":37},\"🦚\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":44,\"sort_order\":74},\"🦛\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":45,\"sort_order\":41},\"🦜\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":46,\"sort_order\":75},\"🦝\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":47,\"sort_order\":12},\"🦞\":{\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":48,\"sort_order\":81},\"🦟\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":49,\"sort_order\":104},\"🦠\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":50,\"sort_order\":105},\"🦡\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":51,\"sort_order\":58},\"🦢\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":52,\"sort_order\":71},\"🦥\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":53,\"sort_order\":54},\"🦦\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":54,\"sort_order\":55},\"🦧\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":55,\"sort_order\":4},\"🦨\":{\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":56,\"sort_order\":56},\"🦩\":{\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":0,\"sort_order\":73},\"🦪\":{\"category\":\"Food & Drink\",\"sheet_x\":43,\"sheet_y\":1,\"sort_order\":84},\"🦮\":{\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":2,\"sort_order\":7},\"🦯\":{\"category\":\"Objects\",\"sheet_x\":43,\"sheet_y\":3,\"sort_order\":196},\"🦴\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":4,\"sort_order\":44},\"🦵\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":5,\"sort_order\":37},\"🦶\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":11,\"sort_order\":38},\"🦷\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":17,\"sort_order\":43},\"🦸♀️\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":18,\"sort_order\":181},\"🦸♂️\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":24,\"sort_order\":180},\"🦸\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":30,\"sort_order\":179},\"🦹♀️\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":36,\"sort_order\":184},\"🦹♂️\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":42,\"sort_order\":183},\"🦹\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":48,\"sort_order\":182},\"🦺\":{\"category\":\"Objects\",\"sheet_x\":43,\"sheet_y\":54,\"sort_order\":5},\"🦻\":{\"category\":\"People & Body\",\"sheet_x\":43,\"sheet_y\":55,\"sort_order\":40},\"🦼\":{\"category\":\"Travel & Places\",\"sheet_x\":44,\"sheet_y\":4,\"sort_order\":95},\"🦽\":{\"category\":\"Travel & Places\",\"sheet_x\":44,\"sheet_y\":5,\"sort_order\":94},\"🦾\":{\"category\":\"People & Body\",\"sheet_x\":44,\"sheet_y\":6,\"sort_order\":35},\"🦿\":{\"category\":\"People & Body\",\"sheet_x\":44,\"sheet_y\":7,\"sort_order\":36},\"🧀\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":8,\"sort_order\":39},\"🧁\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":9,\"sort_order\":92},\"🧂\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":10,\"sort_order\":61},\"🧃\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":11,\"sort_order\":113},\"🧄\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":12,\"sort_order\":27},\"🧅\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":13,\"sort_order\":28},\"🧆\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":14,\"sort_order\":52},\"🧇\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":15,\"sort_order\":38},\"🧈\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":16,\"sort_order\":60},\"🧉\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":17,\"sort_order\":114},\"🧊\":{\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":18,\"sort_order\":115},\"🧍♀️\":{\"category\":\"People & Body\",\"sheet_x\":44,\"sheet_y\":19,\"sort_order\":217},\"🧍♂️\":{\"category\":\"People & Body\",\"sheet_x\":44,\"sheet_y\":25,\"sort_order\":216},\"🧍\":{\"category\":\"People & Body\",\"sheet_x\":44,\"sheet_y\":31,\"sort_order\":215},\"🧎♀️\":{\"category\":\"People & Body\",\"sheet_x\":44,\"sheet_y\":37,\"sort_order\":220},\"🧎♂️\":{\"category\":\"People & Body\",\"sheet_x\":44,\"sheet_y\":43,\"sort_order\":219},\"🧎\":{\"category\":\"People & Body\",\"sheet_x\":44,\"sheet_y\":49,\"sort_order\":218},\"🧏♀️\":{\"category\":\"People & Body\",\"sheet_x\":44,\"sheet_y\":55,\"sort_order\":95},\"🧏♂️\":{\"category\":\"People & Body\",\"sheet_x\":45,\"sheet_y\":4,\"sort_order\":94},\"🧏\":{\"category\":\"People & Body\",\"sheet_x\":45,\"sheet_y\":10,\"sort_order\":93},\"🧐\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":45,\"sheet_y\":16,\"sort_order\":62},\"🧑🌾\":{\"category\":\"People & Body\",\"sheet_x\":45,\"sheet_y\":17,\"sort_order\":117},\"🧑🍳\":{\"category\":\"People & Body\",\"sheet_x\":45,\"sheet_y\":23,\"sort_order\":120},\"🧑🎓\":{\"category\":\"People & Body\",\"sheet_x\":45,\"sheet_y\":29,\"sort_order\":108},\"🧑🎤\":{\"category\":\"People & Body\",\"sheet_x\":45,\"sheet_y\":35,\"sort_order\":138},\"🧑🎨\":{\"category\":\"People & Body\",\"sheet_x\":45,\"sheet_y\":41,\"sort_order\":141},\"🧑🏫\":{\"category\":\"People & Body\",\"sheet_x\":45,\"sheet_y\":47,\"sort_order\":111},\"🧑🏭\":{\"category\":\"People & Body\",\"sheet_x\":45,\"sheet_y\":53,\"sort_order\":126},\"🧑💻\":{\"category\":\"People & Body\",\"sheet_x\":46,\"sheet_y\":2,\"sort_order\":135},\"🧑💼\":{\"category\":\"People & Body\",\"sheet_x\":46,\"sheet_y\":8,\"sort_order\":129},\"🧑🔧\":{\"category\":\"People & Body\",\"sheet_x\":46,\"sheet_y\":14,\"sort_order\":123},\"🧑🔬\":{\"category\":\"People & Body\",\"sheet_x\":46,\"sheet_y\":20,\"sort_order\":132},\"🧑🚀\":{\"category\":\"People & Body\",\"sheet_x\":46,\"sheet_y\":26,\"sort_order\":147},\"🧑🚒\":{\"category\":\"People & Body\",\"sheet_x\":46,\"sheet_y\":32,\"sort_order\":150},\"🧑🤝🧑\":{\"category\":\"People & Body\",\"sheet_x\":46,\"sheet_y\":38,\"sort_order\":293},\"🧑🦯\":{\"category\":\"People & Body\",\"sheet_x\":47,\"sheet_y\":7,\"sort_order\":221},\"🧑🦰\":{\"category\":\"People & Body\",\"sheet_x\":47,\"sheet_y\":13,\"sort_order\":63},\"🧑🦱\":{\"category\":\"People & Body\",\"sheet_x\":47,\"sheet_y\":19,\"sort_order\":65},\"🧑🦲\":{\"category\":\"People & Body\",\"sheet_x\":47,\"sheet_y\":25,\"sort_order\":69},\"🧑🦳\":{\"category\":\"People & Body\",\"sheet_x\":47,\"sheet_y\":31,\"sort_order\":67},\"🧑🦼\":{\"category\":\"People & Body\",\"sheet_x\":47,\"sheet_y\":37,\"sort_order\":224},\"🧑🦽\":{\"category\":\"People & Body\",\"sheet_x\":47,\"sheet_y\":43,\"sort_order\":227},\"🧑⚕️\":{\"category\":\"People & Body\",\"sheet_x\":47,\"sheet_y\":49,\"sort_order\":105},\"🧑⚖️\":{\"category\":\"People & Body\",\"sheet_x\":47,\"sheet_y\":55,\"sort_order\":114},\"🧑✈️\":{\"category\":\"People & Body\",\"sheet_x\":48,\"sheet_y\":4,\"sort_order\":144},\"🧑\":{\"category\":\"People & Body\",\"sheet_x\":48,\"sheet_y\":10,\"sort_order\":53},\"🧒\":{\"category\":\"People & Body\",\"sheet_x\":48,\"sheet_y\":16,\"sort_order\":50},\"🧓\":{\"category\":\"People & Body\",\"sheet_x\":48,\"sheet_y\":22,\"sort_order\":72},\"🧔\":{\"category\":\"People & Body\",\"sheet_x\":48,\"sheet_y\":28,\"sort_order\":56},\"🧕\":{\"category\":\"People & Body\",\"sheet_x\":48,\"sheet_y\":34,\"sort_order\":171},\"🧖♀️\":{\"category\":\"People & Body\",\"sheet_x\":48,\"sheet_y\":40,\"sort_order\":241},\"🧖♂️\":{\"category\":\"People & Body\",\"sheet_x\":48,\"sheet_y\":46,\"sort_order\":240},\"🧖\":{\"category\":\"People & Body\",\"sheet_x\":48,\"sheet_y\":52,\"sort_order\":239},\"🧗♀️\":{\"category\":\"People & Body\",\"sheet_x\":49,\"sheet_y\":1,\"sort_order\":244},\"🧗♂️\":{\"category\":\"People & Body\",\"sheet_x\":49,\"sheet_y\":7,\"sort_order\":243},\"🧗\":{\"category\":\"People & Body\",\"sheet_x\":49,\"sheet_y\":13,\"sort_order\":242},\"🧘♀️\":{\"category\":\"People & Body\",\"sheet_x\":49,\"sheet_y\":19,\"sort_order\":290},\"🧘♂️\":{\"category\":\"People & Body\",\"sheet_x\":49,\"sheet_y\":25,\"sort_order\":289},\"🧘\":{\"category\":\"People & Body\",\"sheet_x\":49,\"sheet_y\":31,\"sort_order\":288},\"🧙♀️\":{\"category\":\"People & Body\",\"sheet_x\":49,\"sheet_y\":37,\"sort_order\":187},\"🧙♂️\":{\"category\":\"People & Body\",\"sheet_x\":49,\"sheet_y\":43,\"sort_order\":186},\"🧙\":{\"category\":\"People & Body\",\"sheet_x\":49,\"sheet_y\":49,\"sort_order\":185},\"🧚♀️\":{\"category\":\"People & Body\",\"sheet_x\":49,\"sheet_y\":55,\"sort_order\":190},\"🧚♂️\":{\"category\":\"People & Body\",\"sheet_x\":50,\"sheet_y\":4,\"sort_order\":189},\"🧚\":{\"category\":\"People & Body\",\"sheet_x\":50,\"sheet_y\":10,\"sort_order\":188},\"🧛♀️\":{\"category\":\"People & Body\",\"sheet_x\":50,\"sheet_y\":16,\"sort_order\":193},\"🧛♂️\":{\"category\":\"People & Body\",\"sheet_x\":50,\"sheet_y\":22,\"sort_order\":192},\"🧛\":{\"category\":\"People & Body\",\"sheet_x\":50,\"sheet_y\":28,\"sort_order\":191},\"🧜♀️\":{\"category\":\"People & Body\",\"sheet_x\":50,\"sheet_y\":34,\"sort_order\":196},\"🧜♂️\":{\"category\":\"People & Body\",\"sheet_x\":50,\"sheet_y\":40,\"sort_order\":195},\"🧜\":{\"category\":\"People & Body\",\"sheet_x\":50,\"sheet_y\":46,\"sort_order\":194},\"🧝♀️\":{\"category\":\"People & Body\",\"sheet_x\":50,\"sheet_y\":52,\"sort_order\":199},\"🧝♂️\":{\"category\":\"People & Body\",\"sheet_x\":51,\"sheet_y\":1,\"sort_order\":198},\"🧝\":{\"category\":\"People & Body\",\"sheet_x\":51,\"sheet_y\":7,\"sort_order\":197},\"🧞♀️\":{\"category\":\"People & Body\",\"sheet_x\":51,\"sheet_y\":13,\"sort_order\":202},\"🧞♂️\":{\"category\":\"People & Body\",\"sheet_x\":51,\"sheet_y\":14,\"sort_order\":201},\"🧞\":{\"category\":\"People & Body\",\"sheet_x\":51,\"sheet_y\":15,\"sort_order\":200},\"🧟♀️\":{\"category\":\"People & Body\",\"sheet_x\":51,\"sheet_y\":16,\"sort_order\":205},\"🧟♂️\":{\"category\":\"People & Body\",\"sheet_x\":51,\"sheet_y\":17,\"sort_order\":204},\"🧟\":{\"category\":\"People & Body\",\"sheet_x\":51,\"sheet_y\":18,\"sort_order\":203},\"🧠\":{\"category\":\"People & Body\",\"sheet_x\":51,\"sheet_y\":19,\"sort_order\":42},\"🧡\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":51,\"sheet_y\":20,\"sort_order\":128},\"🧢\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":21,\"sort_order\":38},\"🧣\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":22,\"sort_order\":9},\"🧤\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":23,\"sort_order\":10},\"🧥\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":24,\"sort_order\":11},\"🧦\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":25,\"sort_order\":12},\"🧧\":{\"category\":\"Activities\",\"sheet_x\":51,\"sheet_y\":26,\"sort_order\":16},\"🧨\":{\"category\":\"Activities\",\"sheet_x\":51,\"sheet_y\":27,\"sort_order\":5},\"🧩\":{\"category\":\"Activities\",\"sheet_x\":51,\"sheet_y\":28,\"sort_order\":65},\"🧪\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":29,\"sort_order\":202},\"🧫\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":30,\"sort_order\":203},\"🧬\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":31,\"sort_order\":204},\"🧭\":{\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":32,\"sort_order\":7},\"🧮\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":33,\"sort_order\":87},\"🧯\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":34,\"sort_order\":228},\"🧰\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":35,\"sort_order\":199},\"🧱\":{\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":36,\"sort_order\":20},\"🧲\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":37,\"sort_order\":200},\"🧳\":{\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":38,\"sort_order\":132},\"🧴\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":39,\"sort_order\":221},\"🧵\":{\"category\":\"Activities\",\"sheet_x\":51,\"sheet_y\":40,\"sort_order\":78},\"🧶\":{\"category\":\"Activities\",\"sheet_x\":51,\"sheet_y\":41,\"sort_order\":79},\"🧷\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":42,\"sort_order\":222},\"🧸\":{\"category\":\"Activities\",\"sheet_x\":51,\"sheet_y\":43,\"sort_order\":66},\"🧹\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":44,\"sort_order\":223},\"🧺\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":45,\"sort_order\":224},\"🧻\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":46,\"sort_order\":225},\"🧼\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":47,\"sort_order\":226},\"🧽\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":48,\"sort_order\":227},\"🧾\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":49,\"sort_order\":128},\"🧿\":{\"category\":\"Activities\",\"sheet_x\":51,\"sheet_y\":50,\"sort_order\":60},\"🩰\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":51,\"sort_order\":32},\"🩱\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":52,\"sort_order\":16},\"🩲\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":53,\"sort_order\":17},\"🩳\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":54,\"sort_order\":18},\"🩸\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":55,\"sort_order\":209},\"🩹\":{\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":56,\"sort_order\":211},\"🩺\":{\"category\":\"Objects\",\"sheet_x\":52,\"sheet_y\":0,\"sort_order\":212},\"🪀\":{\"category\":\"Activities\",\"sheet_x\":52,\"sheet_y\":1,\"sort_order\":56},\"🪁\":{\"category\":\"Activities\",\"sheet_x\":52,\"sheet_y\":2,\"sort_order\":57},\"🪂\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":3,\"sort_order\":122},\"🪐\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":4,\"sort_order\":180},\"🪑\":{\"category\":\"Objects\",\"sheet_x\":52,\"sheet_y\":5,\"sort_order\":216},\"🪒\":{\"category\":\"Objects\",\"sheet_x\":52,\"sheet_y\":6,\"sort_order\":220},\"🪓\":{\"category\":\"Objects\",\"sheet_x\":52,\"sheet_y\":7,\"sort_order\":182},\"🪔\":{\"category\":\"Objects\",\"sheet_x\":52,\"sheet_y\":8,\"sort_order\":103},\"🪕\":{\"category\":\"Objects\",\"sheet_x\":52,\"sheet_y\":9,\"sort_order\":67},\"‼️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":10,\"sort_order\":122},\"⁉️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":11,\"sort_order\":123},\"™️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":12,\"sort_order\":131},\"ℹ️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":13,\"sort_order\":156},\"↔️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":14,\"sort_order\":36},\"↕️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":15,\"sort_order\":35},\"↖️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":16,\"sort_order\":34},\"↗️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":17,\"sort_order\":28},\"↘️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":18,\"sort_order\":30},\"↙️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":19,\"sort_order\":32},\"↩️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":20,\"sort_order\":37},\"↪️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":21,\"sort_order\":38},\"⌚\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":22,\"sort_order\":135},\"⌛\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":23,\"sort_order\":133},\"⌨️\":{\"category\":\"Objects\",\"sheet_x\":52,\"sheet_y\":24,\"sort_order\":80},\"⏏️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":25,\"sort_order\":90},\"⏩\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":26,\"sort_order\":77},\"⏪\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":27,\"sort_order\":81},\"⏫\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":28,\"sort_order\":84},\"⏬\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":29,\"sort_order\":86},\"⏭️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":30,\"sort_order\":78},\"⏮️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":31,\"sort_order\":82},\"⏯️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":32,\"sort_order\":79},\"⏰\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":33,\"sort_order\":136},\"⏱️\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":34,\"sort_order\":137},\"⏲️\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":35,\"sort_order\":138},\"⏳\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":36,\"sort_order\":134},\"⏸️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":37,\"sort_order\":87},\"⏹️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":38,\"sort_order\":88},\"⏺️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":39,\"sort_order\":89},\"Ⓜ️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":40,\"sort_order\":158},\"▪️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":41,\"sort_order\":206},\"▫️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":42,\"sort_order\":207},\"▶️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":43,\"sort_order\":76},\"◀️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":44,\"sort_order\":80},\"◻️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":45,\"sort_order\":203},\"◼️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":46,\"sort_order\":202},\"◽\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":47,\"sort_order\":205},\"◾\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":48,\"sort_order\":204},\"☀️\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":49,\"sort_order\":177},\"☁️\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":50,\"sort_order\":185},\"☂️\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":51,\"sort_order\":200},\"☃️\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":52,\"sort_order\":205},\"☄️\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":53,\"sort_order\":207},\"☎️\":{\"category\":\"Objects\",\"sheet_x\":52,\"sheet_y\":54,\"sort_order\":71},\"☑️\":{\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":55,\"sort_order\":108},\"☔\":{\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":56,\"sort_order\":201},\"☕\":{\"category\":\"Food & Drink\",\"sheet_x\":53,\"sheet_y\":0,\"sort_order\":101},\"☘️\":{\"category\":\"Animals & Nature\",\"sheet_x\":53,\"sheet_y\":1,\"sort_order\":123},\"☝️\":{\"category\":\"People & Body\",\"sheet_x\":53,\"sheet_y\":2,\"sort_order\":18},\"☠️\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":53,\"sheet_y\":8,\"sort_order\":94},\"☢️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":9,\"sort_order\":25},\"☣️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":10,\"sort_order\":26},\"☦️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":11,\"sort_order\":55},\"☪️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":12,\"sort_order\":56},\"☮️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":13,\"sort_order\":57},\"☯️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":14,\"sort_order\":53},\"☸️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":15,\"sort_order\":52},\"☹️\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":53,\"sheet_y\":16,\"sort_order\":66},\"☺️\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":53,\"sheet_y\":17,\"sort_order\":19},\"♈\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":20,\"sort_order\":60},\"♉\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":21,\"sort_order\":61},\"♊\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":22,\"sort_order\":62},\"♋\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":23,\"sort_order\":63},\"♌\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":24,\"sort_order\":64},\"♍\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":25,\"sort_order\":65},\"♎\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":26,\"sort_order\":66},\"♏\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":27,\"sort_order\":67},\"♐\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":28,\"sort_order\":68},\"♑\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":29,\"sort_order\":69},\"♒\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":30,\"sort_order\":70},\"♓\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":31,\"sort_order\":71},\"♟️\":{\"category\":\"Activities\",\"sheet_x\":53,\"sheet_y\":32,\"sort_order\":71},\"♠️\":{\"category\":\"Activities\",\"sheet_x\":53,\"sheet_y\":33,\"sort_order\":67},\"♣️\":{\"category\":\"Activities\",\"sheet_x\":53,\"sheet_y\":34,\"sort_order\":70},\"♥️\":{\"category\":\"Activities\",\"sheet_x\":53,\"sheet_y\":35,\"sort_order\":68},\"♦️\":{\"category\":\"Activities\",\"sheet_x\":53,\"sheet_y\":36,\"sort_order\":69},\"♨️\":{\"category\":\"Travel & Places\",\"sheet_x\":53,\"sheet_y\":37,\"sort_order\":57},\"♻️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":38,\"sort_order\":101},\"♾️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":39,\"sort_order\":100},\"♿\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":40,\"sort_order\":4},\"⚒️\":{\"category\":\"Objects\",\"sheet_x\":53,\"sheet_y\":41,\"sort_order\":184},\"⚓\":{\"category\":\"Travel & Places\",\"sheet_x\":53,\"sheet_y\":42,\"sort_order\":110},\"⚔️\":{\"category\":\"Objects\",\"sheet_x\":53,\"sheet_y\":43,\"sort_order\":187},\"⚖️\":{\"category\":\"Objects\",\"sheet_x\":53,\"sheet_y\":45,\"sort_order\":195},\"⚗️\":{\"category\":\"Objects\",\"sheet_x\":53,\"sheet_y\":46,\"sort_order\":201},\"⚙️\":{\"category\":\"Objects\",\"sheet_x\":53,\"sheet_y\":47,\"sort_order\":193},\"⚛️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":48,\"sort_order\":49},\"⚜️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":49,\"sort_order\":102},\"⚠️\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":50,\"sort_order\":14},\"⚡\":{\"category\":\"Travel & Places\",\"sheet_x\":53,\"sheet_y\":51,\"sort_order\":203},\"⚪\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":52,\"sort_order\":192},\"⚫\":{\"category\":\"Symbols\",\"sheet_x\":53,\"sheet_y\":53,\"sort_order\":191},\"⚰️\":{\"category\":\"Objects\",\"sheet_x\":53,\"sheet_y\":54,\"sort_order\":231},\"⚱️\":{\"category\":\"Objects\",\"sheet_x\":53,\"sheet_y\":55,\"sort_order\":232},\"⚽\":{\"category\":\"Activities\",\"sheet_x\":53,\"sheet_y\":56,\"sort_order\":28},\"⚾\":{\"category\":\"Activities\",\"sheet_x\":54,\"sheet_y\":0,\"sort_order\":29},\"⛄\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":1,\"sort_order\":206},\"⛅\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":2,\"sort_order\":186},\"⛈️\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":3,\"sort_order\":187},\"⛎\":{\"category\":\"Symbols\",\"sheet_x\":54,\"sheet_y\":4,\"sort_order\":72},\"⛏️\":{\"category\":\"Objects\",\"sheet_x\":54,\"sheet_y\":5,\"sort_order\":183},\"⛑️\":{\"category\":\"Objects\",\"sheet_x\":54,\"sheet_y\":6,\"sort_order\":39},\"⛓️\":{\"category\":\"Objects\",\"sheet_x\":54,\"sheet_y\":7,\"sort_order\":198},\"⛔\":{\"category\":\"Symbols\",\"sheet_x\":54,\"sheet_y\":8,\"sort_order\":16},\"⛩️\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":9,\"sort_order\":45},\"⛪\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":10,\"sort_order\":41},\"⛰️\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":11,\"sort_order\":9},\"⛱️\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":12,\"sort_order\":202},\"⛲\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":13,\"sort_order\":47},\"⛳\":{\"category\":\"Activities\",\"sheet_x\":54,\"sheet_y\":14,\"sort_order\":47},\"⛴️\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":15,\"sort_order\":115},\"⛵\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":16,\"sort_order\":111},\"⛷️\":{\"category\":\"People & Body\",\"sheet_x\":54,\"sheet_y\":17,\"sort_order\":247},\"⛸️\":{\"category\":\"Activities\",\"sheet_x\":54,\"sheet_y\":18,\"sort_order\":48},\"⛹️♀️\":{\"category\":\"People & Body\",\"sheet_x\":54,\"sheet_y\":19,\"sort_order\":263},\"⛹️♂️\":{\"category\":\"People & Body\",\"sheet_x\":54,\"sheet_y\":25,\"sort_order\":262},\"⛹️\":{\"category\":\"People & Body\",\"sheet_x\":54,\"sheet_y\":31,\"sort_order\":261},\"⛺\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":37,\"sort_order\":48},\"⛽\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":38,\"sort_order\":104},\"✂️\":{\"category\":\"Objects\",\"sheet_x\":54,\"sheet_y\":39,\"sort_order\":171},\"✅\":{\"category\":\"Symbols\",\"sheet_x\":54,\"sheet_y\":40,\"sort_order\":107},\"✈️\":{\"category\":\"Travel & Places\",\"sheet_x\":54,\"sheet_y\":41,\"sort_order\":118},\"✉️\":{\"category\":\"Objects\",\"sheet_x\":54,\"sheet_y\":42,\"sort_order\":132},\"✊\":{\"category\":\"People & Body\",\"sheet_x\":54,\"sheet_y\":43,\"sort_order\":21},\"✋\":{\"category\":\"People & Body\",\"sheet_x\":54,\"sheet_y\":49,\"sort_order\":4},\"✌️\":{\"category\":\"People & Body\",\"sheet_x\":54,\"sheet_y\":55,\"sort_order\":8},\"✍️\":{\"category\":\"People & Body\",\"sheet_x\":55,\"sheet_y\":4,\"sort_order\":31},\"✏️\":{\"category\":\"Objects\",\"sheet_x\":55,\"sheet_y\":10,\"sort_order\":145},\"✒️\":{\"category\":\"Objects\",\"sheet_x\":55,\"sheet_y\":11,\"sort_order\":146},\"✔️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":12,\"sort_order\":109},\"✖️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":13,\"sort_order\":110},\"✝️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":14,\"sort_order\":54},\"✡️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":15,\"sort_order\":51},\"✨\":{\"category\":\"Activities\",\"sheet_x\":55,\"sheet_y\":16,\"sort_order\":6},\"✳️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":17,\"sort_order\":119},\"✴️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":18,\"sort_order\":120},\"❄️\":{\"category\":\"Travel & Places\",\"sheet_x\":55,\"sheet_y\":19,\"sort_order\":204},\"❇️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":20,\"sort_order\":121},\"❌\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":21,\"sort_order\":111},\"❎\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":22,\"sort_order\":112},\"❓\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":23,\"sort_order\":124},\"❔\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":24,\"sort_order\":125},\"❕\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":25,\"sort_order\":126},\"❗\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":26,\"sort_order\":127},\"❣️\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":55,\"sheet_y\":27,\"sort_order\":125},\"❤️\":{\"category\":\"Smileys & Emotion\",\"sheet_x\":55,\"sheet_y\":28,\"sort_order\":127},\"➕\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":29,\"sort_order\":113},\"➖\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":30,\"sort_order\":114},\"➗\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":31,\"sort_order\":115},\"➡️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":32,\"sort_order\":29},\"➰\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":33,\"sort_order\":116},\"➿\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":34,\"sort_order\":117},\"⤴️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":35,\"sort_order\":39},\"⤵️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":36,\"sort_order\":40},\"⬅️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":37,\"sort_order\":33},\"⬆️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":38,\"sort_order\":27},\"⬇️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":39,\"sort_order\":31},\"⬛\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":40,\"sort_order\":200},\"⬜\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":41,\"sort_order\":201},\"⭐\":{\"category\":\"Travel & Places\",\"sheet_x\":55,\"sheet_y\":42,\"sort_order\":181},\"⭕\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":43,\"sort_order\":106},\"〰️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":44,\"sort_order\":128},\"〽️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":45,\"sort_order\":118},\"㊗️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":46,\"sort_order\":180},\"㊙️\":{\"category\":\"Symbols\",\"sheet_x\":55,\"sheet_y\":47,\"sort_order\":181}}\r\n };\r\n}\r\n\r\nConfig.Countries = [{\"phoneCode\":\"7 840\",\"code\":\"AB\",\"name\":\"Abkhazia\",\"pattern\":\"\",\"emoji\":\"\"},{\"phoneCode\":\"93\",\"code\":\"AF\",\"name\":\"Afghanistan\",\"pattern\":\"93 XXX XXX XXX\",\"emoji\":\"🇦🇫\"},{\"phoneCode\":\"358 18\",\"code\":\"AX\",\"name\":\"Aland Islands\",\"pattern\":\"\",\"emoji\":\"🇦🇽\"},{\"phoneCode\":\"355\",\"code\":\"AL\",\"name\":\"Albania\",\"pattern\":\"355 XX XXX XXXX\",\"emoji\":\"🇦🇱\"},{\"phoneCode\":\"213\",\"code\":\"DZ\",\"name\":\"Algeria\",\"pattern\":\"213 XXX XX XX XX\",\"emoji\":\"🇩🇿\"},{\"phoneCode\":\"1 684\",\"code\":\"AS\",\"name\":\"American Samoa\",\"pattern\":\"1684 XXX XXXX\",\"emoji\":\"🇦🇸\"},{\"phoneCode\":\"376\",\"code\":\"AD\",\"name\":\"Andorra\",\"pattern\":\"376 XX XX XX\",\"emoji\":\"🇦🇩\"},{\"phoneCode\":\"244\",\"code\":\"AO\",\"name\":\"Angola\",\"pattern\":\"244 XXX XXX XXX\",\"emoji\":\"🇦🇴\"},{\"phoneCode\":\"1 264\",\"code\":\"AI\",\"name\":\"Anguilla\",\"pattern\":\"1264 XXX XXXX\",\"emoji\":\"🇦🇮\"},{\"phoneCode\":\"1 268\",\"code\":\"AG\",\"name\":\"Antigua & Barbuda\",\"pattern\":\"1268 XXX XXXX\",\"emoji\":\"🇦🇬\"},{\"phoneCode\":\"54\",\"code\":\"AR\",\"name\":\"Argentina\",\"pattern\":\"\",\"emoji\":\"🇦🇷\"},{\"phoneCode\":\"374\",\"code\":\"AM\",\"name\":\"Armenia\",\"pattern\":\"374 XX XXX XXX\",\"emoji\":\"🇦🇲\"},{\"phoneCode\":\"297\",\"code\":\"AW\",\"name\":\"Aruba\",\"pattern\":\"297 XXX XXXX\",\"emoji\":\"🇦🇼\"},{\"phoneCode\":\"247\",\"code\":\"SH\",\"name\":\"Ascension\",\"pattern\":\"290 XX XXX\",\"emoji\":\"🇸🇭\"},{\"phoneCode\":\"61\",\"code\":\"AU\",\"name\":\"Australia\",\"pattern\":\"61 XXX XXX XXX\",\"emoji\":\"🇦🇺\"},{\"phoneCode\":\"672\",\"code\":\"AU\",\"name\":\"Australian External Territories\",\"pattern\":\"61 XXX XXX XXX\",\"emoji\":\"🇦🇺\"},{\"phoneCode\":\"43\",\"code\":\"AT\",\"name\":\"Austria\",\"pattern\":\"\",\"emoji\":\"🇦🇹\"},{\"phoneCode\":\"994\",\"code\":\"AZ\",\"name\":\"Azerbaijan\",\"pattern\":\"994 XX XXX XX XX\",\"emoji\":\"🇦🇿\"},{\"phoneCode\":\"1 242\",\"code\":\"BS\",\"name\":\"Bahamas\",\"pattern\":\"1242 XXX XXXX\",\"emoji\":\"🇧🇸\"},{\"phoneCode\":\"973\",\"code\":\"BH\",\"name\":\"Bahrain\",\"pattern\":\"973 XXXX XXXX\",\"emoji\":\"🇧🇭\"},{\"phoneCode\":\"880\",\"code\":\"BD\",\"name\":\"Bangladesh\",\"pattern\":\"\",\"emoji\":\"🇧🇩\"},{\"phoneCode\":\"1 246\",\"code\":\"BB\",\"name\":\"Barbados\",\"pattern\":\"1246 XXX XXXX\",\"emoji\":\"🇧🇧\"},{\"phoneCode\":\"1 268\",\"code\":\"AG\",\"name\":\"Barbuda\",\"pattern\":\"1268 XXX XXXX\",\"emoji\":\"🇦🇬\"},{\"phoneCode\":\"375\",\"code\":\"BY\",\"name\":\"Belarus\",\"pattern\":\"375 XX XXX XXXX\",\"emoji\":\"🇧🇾\"},{\"phoneCode\":\"32\",\"code\":\"BE\",\"name\":\"Belgium\",\"pattern\":\"32 XXX XX XX XX\",\"emoji\":\"🇧🇪\"},{\"phoneCode\":\"501\",\"code\":\"BZ\",\"name\":\"Belize\",\"pattern\":\"\",\"emoji\":\"🇧🇿\"},{\"phoneCode\":\"229\",\"code\":\"BJ\",\"name\":\"Benin\",\"pattern\":\"229 XX XXX XXX\",\"emoji\":\"🇧🇯\"},{\"phoneCode\":\"1 441\",\"code\":\"BM\",\"name\":\"Bermuda\",\"pattern\":\"1441 XXX XXXX\",\"emoji\":\"🇧🇲\"},{\"phoneCode\":\"975\",\"code\":\"BT\",\"name\":\"Bhutan\",\"pattern\":\"\",\"emoji\":\"🇧🇹\"},{\"phoneCode\":\"591\",\"code\":\"BO\",\"name\":\"Bolivia\",\"pattern\":\"591 X XXX XXXX\",\"emoji\":\"🇧🇴\"},{\"phoneCode\":\"599 7\",\"code\":\"BQ\",\"name\":\"Caribbean Netherlands\",\"pattern\":\"\",\"emoji\":\"🇧🇶\"},{\"phoneCode\":\"387\",\"code\":\"BA\",\"name\":\"Bosnia & Herzegovina\",\"pattern\":\"\",\"emoji\":\"🇧🇦\"},{\"phoneCode\":\"267\",\"code\":\"BW\",\"name\":\"Botswana\",\"pattern\":\"267 XX XXX XXX\",\"emoji\":\"🇧🇼\"},{\"phoneCode\":\"55\",\"code\":\"BR\",\"name\":\"Brazil\",\"pattern\":\"55 XX XXXXX XXXX\",\"emoji\":\"🇧🇷\"},{\"phoneCode\":\"246\",\"code\":\"IO\",\"name\":\"British Indian Ocean Territory\",\"pattern\":\"246 XXX XXXX\",\"emoji\":\"🇮🇴\"},{\"phoneCode\":\"1 284\",\"code\":\"VG\",\"name\":\"British Virgin Islands\",\"pattern\":\"1284 XXX XXXX\",\"emoji\":\"🇻🇬\"},{\"phoneCode\":\"673\",\"code\":\"BN\",\"name\":\"Brunei\",\"pattern\":\"673 XXX XXXX\",\"emoji\":\"🇧🇳\"},{\"phoneCode\":\"359\",\"code\":\"BG\",\"name\":\"Bulgaria\",\"pattern\":\"\",\"emoji\":\"🇧🇬\"},{\"phoneCode\":\"226\",\"code\":\"BF\",\"name\":\"Burkina Faso\",\"pattern\":\"226 XX XX XX XX\",\"emoji\":\"🇧🇫\"},{\"phoneCode\":\"95\",\"code\":\"MM\",\"name\":\"Myanmar (Burma)\",\"pattern\":\"\",\"emoji\":\"🇲🇲\"},{\"phoneCode\":\"257\",\"code\":\"BI\",\"name\":\"Burundi\",\"pattern\":\"257 XX XX XXXX\",\"emoji\":\"🇧🇮\"},{\"phoneCode\":\"855\",\"code\":\"KH\",\"name\":\"Cambodia\",\"pattern\":\"\",\"emoji\":\"🇰🇭\"},{\"phoneCode\":\"237\",\"code\":\"CM\",\"name\":\"Cameroon\",\"pattern\":\"237 XXXX XXXX\",\"emoji\":\"🇨🇲\"},{\"phoneCode\":\"1\",\"code\":\"CA\",\"name\":\"Canada\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇨🇦\"},{\"phoneCode\":\"238\",\"code\":\"CV\",\"name\":\"Cape Verde\",\"pattern\":\"238 XXX XXXX\",\"emoji\":\"🇨🇻\"},{\"phoneCode\":\"1 345\",\"code\":\"KY\",\"name\":\"Cayman Islands\",\"pattern\":\"1345 XXX XXXX\",\"emoji\":\"🇰🇾\"},{\"phoneCode\":\"236\",\"code\":\"CF\",\"name\":\"Central African Republic\",\"pattern\":\"236 XX XX XX XX\",\"emoji\":\"🇨🇫\"},{\"phoneCode\":\"235\",\"code\":\"TD\",\"name\":\"Chad\",\"pattern\":\"235 XX XX XX XX\",\"emoji\":\"🇹🇩\"},{\"phoneCode\":\"56\",\"code\":\"CL\",\"name\":\"Chile\",\"pattern\":\"56 X XXXX XXXX\",\"emoji\":\"🇨🇱\"},{\"phoneCode\":\"86\",\"code\":\"CN\",\"name\":\"China\",\"pattern\":\"86 XXX XXXX XXXX\",\"emoji\":\"🇨🇳\"},{\"phoneCode\":\"61\",\"code\":\"CX\",\"name\":\"Christmas Island\",\"pattern\":\"\",\"emoji\":\"🇨🇽\"},{\"phoneCode\":\"61\",\"code\":\"CC\",\"name\":\"Cocos (Keeling) Islands\",\"pattern\":\"\",\"emoji\":\"🇨🇨\"},{\"phoneCode\":\"57\",\"code\":\"CO\",\"name\":\"Colombia\",\"pattern\":\"57 XXX XXX XXXX\",\"emoji\":\"🇨🇴\"},{\"phoneCode\":\"269\",\"code\":\"KM\",\"name\":\"Comoros\",\"pattern\":\"269 XXX XXXX\",\"emoji\":\"🇰🇲\"},{\"phoneCode\":\"242\",\"code\":\"CG\",\"name\":\"Congo - Brazzaville\",\"pattern\":\"242 XX XXX XXXX\",\"emoji\":\"🇨🇬\"},{\"phoneCode\":\"243\",\"code\":\"CD\",\"name\":\"Congo - Kinshasa\",\"pattern\":\"243 XX XXX XXXX\",\"emoji\":\"🇨🇩\"},{\"phoneCode\":\"682\",\"code\":\"CK\",\"name\":\"Cook Islands\",\"pattern\":\"\",\"emoji\":\"🇨🇰\"},{\"phoneCode\":\"506\",\"code\":\"CR\",\"name\":\"Costa Rica\",\"pattern\":\"\",\"emoji\":\"🇨🇷\"},{\"phoneCode\":\"225\",\"code\":\"CI\",\"name\":\"Cote d’Ivoire\",\"pattern\":\"225 XX XXX XXX\",\"emoji\":\"🇨🇮\"},{\"phoneCode\":\"385\",\"code\":\"HR\",\"name\":\"Croatia\",\"pattern\":\"\",\"emoji\":\"🇭🇷\"},{\"phoneCode\":\"53\",\"code\":\"CU\",\"name\":\"Cuba\",\"pattern\":\"53 XXXX XXXX\",\"emoji\":\"🇨🇺\"},{\"phoneCode\":\"599 9\",\"code\":\"CW\",\"name\":\"Curacao\",\"pattern\":\"\",\"emoji\":\"🇨🇼\"},{\"phoneCode\":\"357\",\"code\":\"CY\",\"name\":\"Cyprus\",\"pattern\":\"357 XXXX XXXX\",\"emoji\":\"🇨🇾\"},{\"phoneCode\":\"420\",\"code\":\"CZ\",\"name\":\"Czech Republic\",\"pattern\":\"\",\"emoji\":\"🇨🇿\"},{\"phoneCode\":\"45\",\"code\":\"DK\",\"name\":\"Denmark\",\"pattern\":\"45 XXXX XXXX\",\"emoji\":\"🇩🇰\"},{\"phoneCode\":\"246\",\"code\":\"DG\",\"name\":\"Diego Garcia\",\"pattern\":\"\",\"emoji\":\"🇩🇬\"},{\"phoneCode\":\"253\",\"code\":\"DJ\",\"name\":\"Djibouti\",\"pattern\":\"253 XX XX XX XX\",\"emoji\":\"🇩🇯\"},{\"phoneCode\":\"1 767\",\"code\":\"DM\",\"name\":\"Dominica\",\"pattern\":\"1767 XXX XXXX\",\"emoji\":\"🇩🇲\"},{\"phoneCode\":\"1 809 and 1 829\",\"code\":\"DO\",\"name\":\"Dominican Republic\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇩🇴\"},{\"phoneCode\":\"670\",\"code\":\"TL\",\"name\":\"Timor-Leste\",\"pattern\":\"\",\"emoji\":\"🇹🇱\"},{\"phoneCode\":\"593\",\"code\":\"EC\",\"name\":\"Ecuador\",\"pattern\":\"\",\"emoji\":\"🇪🇨\"},{\"phoneCode\":\"20\",\"code\":\"EG\",\"name\":\"Egypt\",\"pattern\":\"20 XX XXX XXXX\",\"emoji\":\"🇪🇬\"},{\"phoneCode\":\"503\",\"code\":\"SV\",\"name\":\"El Salvador\",\"pattern\":\"503 XXXX XXXX\",\"emoji\":\"🇸🇻\"},{\"phoneCode\":\"240\",\"code\":\"GQ\",\"name\":\"Equatorial Guinea\",\"pattern\":\"240 XXX XXX XXX\",\"emoji\":\"🇬🇶\"},{\"phoneCode\":\"291\",\"code\":\"ER\",\"name\":\"Eritrea\",\"pattern\":\"291 X XXX XXX\",\"emoji\":\"🇪🇷\"},{\"phoneCode\":\"372\",\"code\":\"EE\",\"name\":\"Estonia\",\"pattern\":\"\",\"emoji\":\"🇪🇪\"},{\"phoneCode\":\"251\",\"code\":\"ET\",\"name\":\"Ethiopia\",\"pattern\":\"251 XX XXX XXXX\",\"emoji\":\"🇪🇹\"},{\"phoneCode\":\"500\",\"code\":\"FK\",\"name\":\"Falkland Islands\",\"pattern\":\"\",\"emoji\":\"🇫🇰\"},{\"phoneCode\":\"298\",\"code\":\"FO\",\"name\":\"Faroe Islands\",\"pattern\":\"298 XXX XXX\",\"emoji\":\"🇫🇴\"},{\"phoneCode\":\"679\",\"code\":\"FJ\",\"name\":\"Fiji\",\"pattern\":\"\",\"emoji\":\"🇫🇯\"},{\"phoneCode\":\"358\",\"code\":\"FI\",\"name\":\"Finland\",\"pattern\":\"\",\"emoji\":\"🇫🇮\"},{\"phoneCode\":\"33\",\"code\":\"FR\",\"name\":\"France\",\"pattern\":\"33 X XX XX XX XX\",\"emoji\":\"🇫🇷\"},{\"phoneCode\":\"594\",\"code\":\"GF\",\"name\":\"French Guiana\",\"pattern\":\"\",\"emoji\":\"🇬🇫\"},{\"phoneCode\":\"689\",\"code\":\"PF\",\"name\":\"French Polynesia\",\"pattern\":\"\",\"emoji\":\"🇵🇫\"},{\"phoneCode\":\"241\",\"code\":\"GA\",\"name\":\"Gabon\",\"pattern\":\"241 X XX XX XX\",\"emoji\":\"🇬🇦\"},{\"phoneCode\":\"220\",\"code\":\"GM\",\"name\":\"Gambia\",\"pattern\":\"220 XXX XXXX\",\"emoji\":\"🇬🇲\"},{\"phoneCode\":\"995\",\"code\":\"GE\",\"name\":\"Georgia\",\"pattern\":\"\",\"emoji\":\"🇬🇪\"},{\"phoneCode\":\"49\",\"code\":\"DE\",\"name\":\"Germany\",\"pattern\":\"49 XXX XXXXXXXX\",\"emoji\":\"🇩🇪\"},{\"phoneCode\":\"233\",\"code\":\"GH\",\"name\":\"Ghana\",\"pattern\":\"\",\"emoji\":\"🇬🇭\"},{\"phoneCode\":\"350\",\"code\":\"GI\",\"name\":\"Gibraltar\",\"pattern\":\"350 XXXX XXXX\",\"emoji\":\"🇬🇮\"},{\"phoneCode\":\"30\",\"code\":\"GR\",\"name\":\"Greece\",\"pattern\":\"30 XX XXXX XXXX\",\"emoji\":\"🇬🇷\"},{\"phoneCode\":\"299\",\"code\":\"GL\",\"name\":\"Greenland\",\"pattern\":\"299 XXX XXX\",\"emoji\":\"🇬🇱\"},{\"phoneCode\":\"1 473\",\"code\":\"GD\",\"name\":\"Grenada\",\"pattern\":\"1473 XXX XXXX\",\"emoji\":\"🇬🇩\"},{\"phoneCode\":\"590\",\"code\":\"GP\",\"name\":\"Guadeloupe\",\"pattern\":\"\",\"emoji\":\"🇬🇵\"},{\"phoneCode\":\"1 671\",\"code\":\"GU\",\"name\":\"Guam\",\"pattern\":\"1671 XXX XXXX\",\"emoji\":\"🇬🇺\"},{\"phoneCode\":\"502\",\"code\":\"GT\",\"name\":\"Guatemala\",\"pattern\":\"502 X XXX XXXX\",\"emoji\":\"🇬🇹\"},{\"phoneCode\":\"44\",\"code\":\"GG\",\"name\":\"Guernsey\",\"pattern\":\"\",\"emoji\":\"🇬🇬\"},{\"phoneCode\":\"224\",\"code\":\"GN\",\"name\":\"Guinea\",\"pattern\":\"224 XXX XXX XXX\",\"emoji\":\"🇬🇳\"},{\"phoneCode\":\"245\",\"code\":\"GW\",\"name\":\"Guinea-Bissau\",\"pattern\":\"245 XXX XXXX\",\"emoji\":\"🇬🇼\"},{\"phoneCode\":\"592\",\"code\":\"GY\",\"name\":\"Guyana\",\"pattern\":\"\",\"emoji\":\"🇬🇾\"},{\"phoneCode\":\"509\",\"code\":\"HT\",\"name\":\"Haiti\",\"pattern\":\"\",\"emoji\":\"🇭🇹\"},{\"phoneCode\":\"504\",\"code\":\"HN\",\"name\":\"Honduras\",\"pattern\":\"504 XXXX XXXX\",\"emoji\":\"🇭🇳\"},{\"phoneCode\":\"852\",\"code\":\"HK\",\"name\":\"Hong Kong SAR China\",\"pattern\":\"\",\"emoji\":\"🇭🇰\"},{\"phoneCode\":\"36\",\"code\":\"HU\",\"name\":\"Hungary\",\"pattern\":\"36 XX XXX XXXX\",\"emoji\":\"🇭🇺\"},{\"phoneCode\":\"354\",\"code\":\"IS\",\"name\":\"Iceland\",\"pattern\":\"354 XXX XXXX\",\"emoji\":\"🇮🇸\"},{\"phoneCode\":\"91\",\"code\":\"IN\",\"name\":\"India\",\"pattern\":\"91 XXXXX XXXXX\",\"emoji\":\"🇮🇳\"},{\"phoneCode\":\"62\",\"code\":\"ID\",\"name\":\"Indonesia\",\"pattern\":\"\",\"emoji\":\"🇮🇩\"},{\"phoneCode\":\"98\",\"code\":\"IR\",\"name\":\"Iran\",\"pattern\":\"98 XXX XXX XXXX\",\"emoji\":\"🇮🇷\"},{\"phoneCode\":\"964\",\"code\":\"IQ\",\"name\":\"Iraq\",\"pattern\":\"964 XXX XXX XXXX\",\"emoji\":\"🇮🇶\"},{\"phoneCode\":\"353\",\"code\":\"IE\",\"name\":\"Ireland\",\"pattern\":\"353 XX XXX XXXX\",\"emoji\":\"🇮🇪\"},{\"phoneCode\":\"972\",\"code\":\"IL\",\"name\":\"Israel\",\"pattern\":\"972 XX XXX XXXX\",\"emoji\":\"🇮🇱\"},{\"phoneCode\":\"39\",\"code\":\"IT\",\"name\":\"Italy\",\"pattern\":\"39 XXX XXX XXXX\",\"emoji\":\"🇮🇹\"},{\"phoneCode\":\"1 876\",\"code\":\"JM\",\"name\":\"Jamaica\",\"pattern\":\"1876 XXX XXXX\",\"emoji\":\"🇯🇲\"},{\"phoneCode\":\"47 79\",\"code\":\"SJ\",\"name\":\"Svalbard & Jan Mayen\",\"pattern\":\"\",\"emoji\":\"🇸🇯\"},{\"phoneCode\":\"81\",\"code\":\"JP\",\"name\":\"Japan\",\"pattern\":\"81 XX XXXX XXXX\",\"emoji\":\"🇯🇵\"},{\"phoneCode\":\"44\",\"code\":\"JE\",\"name\":\"Jersey\",\"pattern\":\"\",\"emoji\":\"🇯🇪\"},{\"phoneCode\":\"962\",\"code\":\"JO\",\"name\":\"Jordan\",\"pattern\":\"962 X XXXX XXXX\",\"emoji\":\"🇯🇴\"},{\"phoneCode\":\"7 7\",\"code\":\"KZ\",\"name\":\"Kazakhstan\",\"pattern\":\"7 XXX XXX XX XX\",\"emoji\":\"🇰🇿\"},{\"phoneCode\":\"254\",\"code\":\"KE\",\"name\":\"Kenya\",\"pattern\":\"254 XXX XXX XXX\",\"emoji\":\"🇰🇪\"},{\"phoneCode\":\"686\",\"code\":\"KI\",\"name\":\"Kiribati\",\"pattern\":\"\",\"emoji\":\"🇰🇮\"},{\"phoneCode\":\"850\",\"code\":\"KP\",\"name\":\"North Korea\",\"pattern\":\"\",\"emoji\":\"🇰🇵\"},{\"phoneCode\":\"82\",\"code\":\"KR\",\"name\":\"South Korea\",\"pattern\":\"\",\"emoji\":\"🇰🇷\"},{\"phoneCode\":\"965\",\"code\":\"KW\",\"name\":\"Kuwait\",\"pattern\":\"965 XXXX XXXX\",\"emoji\":\"🇰🇼\"},{\"phoneCode\":\"996\",\"code\":\"KG\",\"name\":\"Kyrgyzstan\",\"pattern\":\"\",\"emoji\":\"🇰🇬\"},{\"phoneCode\":\"856\",\"code\":\"LA\",\"name\":\"Laos\",\"pattern\":\"\",\"emoji\":\"🇱🇦\"},{\"phoneCode\":\"371\",\"code\":\"LV\",\"name\":\"Latvia\",\"pattern\":\"371 XXX XXXXX\",\"emoji\":\"🇱🇻\"},{\"phoneCode\":\"961\",\"code\":\"LB\",\"name\":\"Lebanon\",\"pattern\":\"\",\"emoji\":\"🇱🇧\"},{\"phoneCode\":\"266\",\"code\":\"LS\",\"name\":\"Lesotho\",\"pattern\":\"266 XX XXX XXX\",\"emoji\":\"🇱🇸\"},{\"phoneCode\":\"231\",\"code\":\"LR\",\"name\":\"Liberia\",\"pattern\":\"\",\"emoji\":\"🇱🇷\"},{\"phoneCode\":\"218\",\"code\":\"LY\",\"name\":\"Libya\",\"pattern\":\"218 XX XXX XXXX\",\"emoji\":\"🇱🇾\"},{\"phoneCode\":\"423\",\"code\":\"LI\",\"name\":\"Liechtenstein\",\"pattern\":\"\",\"emoji\":\"🇱🇮\"},{\"phoneCode\":\"370\",\"code\":\"LT\",\"name\":\"Lithuania\",\"pattern\":\"370 XXX XXXXX\",\"emoji\":\"🇱🇹\"},{\"phoneCode\":\"352\",\"code\":\"LU\",\"name\":\"Luxembourg\",\"pattern\":\"\",\"emoji\":\"🇱🇺\"},{\"phoneCode\":\"853\",\"code\":\"MO\",\"name\":\"Macau SAR China\",\"pattern\":\"\",\"emoji\":\"🇲🇴\"},{\"phoneCode\":\"389\",\"code\":\"MK\",\"name\":\"Macedonia\",\"pattern\":\"\",\"emoji\":\"🇲🇰\"},{\"phoneCode\":\"261\",\"code\":\"MG\",\"name\":\"Madagascar\",\"pattern\":\"261 XX XX XXX XX\",\"emoji\":\"🇲🇬\"},{\"phoneCode\":\"265\",\"code\":\"MW\",\"name\":\"Malawi\",\"pattern\":\"\",\"emoji\":\"🇲🇼\"},{\"phoneCode\":\"60\",\"code\":\"MM\",\"name\":\"Malaysia\",\"pattern\":\"\",\"emoji\":\"🇲🇲\"},{\"phoneCode\":\"960\",\"code\":\"MV\",\"name\":\"Maldives\",\"pattern\":\"\",\"emoji\":\"🇲🇻\"},{\"phoneCode\":\"223\",\"code\":\"ML\",\"name\":\"Mali\",\"pattern\":\"223 XXXX XXXX\",\"emoji\":\"🇲🇱\"},{\"phoneCode\":\"356\",\"code\":\"MT\",\"name\":\"Malta\",\"pattern\":\"356 XX XX XX XX\",\"emoji\":\"🇲🇹\"},{\"phoneCode\":\"692\",\"code\":\"MH\",\"name\":\"Marshall Islands\",\"pattern\":\"\",\"emoji\":\"🇲🇭\"},{\"phoneCode\":\"596\",\"code\":\"MQ\",\"name\":\"Martinique\",\"pattern\":\"\",\"emoji\":\"🇲🇶\"},{\"phoneCode\":\"222\",\"code\":\"MR\",\"name\":\"Mauritania\",\"pattern\":\"222 XXXX XXXX\",\"emoji\":\"🇲🇷\"},{\"phoneCode\":\"230\",\"code\":\"MU\",\"name\":\"Mauritius\",\"pattern\":\"\",\"emoji\":\"🇲🇺\"},{\"phoneCode\":\"262\",\"code\":\"YT\",\"name\":\"Mayotte\",\"pattern\":\"\",\"emoji\":\"🇾🇹\"},{\"phoneCode\":\"52\",\"code\":\"MX\",\"name\":\"Mexico\",\"pattern\":\"\",\"emoji\":\"🇲🇽\"},{\"phoneCode\":\"691\",\"code\":\"FM\",\"name\":\"Micronesia\",\"pattern\":\"\",\"emoji\":\"🇫🇲\"},{\"phoneCode\":\"373\",\"code\":\"MD\",\"name\":\"Moldova\",\"pattern\":\"373 XX XXX XXX\",\"emoji\":\"🇲🇩\"},{\"phoneCode\":\"377\",\"code\":\"MC\",\"name\":\"Monaco\",\"pattern\":\"377 XXXX XXXX\",\"emoji\":\"🇲🇨\"},{\"phoneCode\":\"976\",\"code\":\"MN\",\"name\":\"Mongolia\",\"pattern\":\"\",\"emoji\":\"🇲🇳\"},{\"phoneCode\":\"382\",\"code\":\"ME\",\"name\":\"Montenegro\",\"pattern\":\"\",\"emoji\":\"🇲🇪\"},{\"phoneCode\":\"1 664\",\"code\":\"MS\",\"name\":\"Montserrat\",\"pattern\":\"1664 XXX XXXX\",\"emoji\":\"🇲🇸\"},{\"phoneCode\":\"212\",\"code\":\"MA\",\"name\":\"Morocco\",\"pattern\":\"212 XX XXX XXXX\",\"emoji\":\"🇲🇦\"},{\"phoneCode\":\"258\",\"code\":\"MZ\",\"name\":\"Mozambique\",\"pattern\":\"258 XX XXX XXXX\",\"emoji\":\"🇲🇿\"},{\"phoneCode\":\"264\",\"code\":\"NA\",\"name\":\"Namibia\",\"pattern\":\"264 XX XXX XXXX\",\"emoji\":\"🇳🇦\"},{\"phoneCode\":\"674\",\"code\":\"NR\",\"name\":\"Nauru\",\"pattern\":\"\",\"emoji\":\"🇳🇷\"},{\"phoneCode\":\"977\",\"code\":\"NP\",\"name\":\"Nepal\",\"pattern\":\"\",\"emoji\":\"🇳🇵\"},{\"phoneCode\":\"31\",\"code\":\"NL\",\"name\":\"Netherlands\",\"pattern\":\"31 X XX XX XX XX\",\"emoji\":\"🇳🇱\"},{\"phoneCode\":\"687\",\"code\":\"NC\",\"name\":\"New Caledonia\",\"pattern\":\"\",\"emoji\":\"🇳🇨\"},{\"phoneCode\":\"64\",\"code\":\"NZ\",\"name\":\"New Zealand\",\"pattern\":\"\",\"emoji\":\"🇳🇿\"},{\"phoneCode\":\"505\",\"code\":\"NI\",\"name\":\"Nicaragua\",\"pattern\":\"505 XXXX XXXX\",\"emoji\":\"🇳🇮\"},{\"phoneCode\":\"227\",\"code\":\"NE\",\"name\":\"Niger\",\"pattern\":\"227 XX XX XX XX\",\"emoji\":\"🇳🇪\"},{\"phoneCode\":\"234\",\"code\":\"NG\",\"name\":\"Nigeria\",\"pattern\":\"\",\"emoji\":\"🇳🇬\"},{\"phoneCode\":\"683\",\"code\":\"NU\",\"name\":\"Niue\",\"pattern\":\"\",\"emoji\":\"🇳🇺\"},{\"phoneCode\":\"672\",\"code\":\"NF\",\"name\":\"Norfolk Island\",\"pattern\":\"\",\"emoji\":\"🇳🇫\"},{\"phoneCode\":\"1 670\",\"code\":\"MP\",\"name\":\"Northern Mariana Islands\",\"pattern\":\"1670 XXX XXXX\",\"emoji\":\"🇲🇵\"},{\"phoneCode\":\"47\",\"code\":\"NO\",\"name\":\"Norway\",\"pattern\":\"47 XXXX XXXX\",\"emoji\":\"🇳🇴\"},{\"phoneCode\":\"968\",\"code\":\"OM\",\"name\":\"Oman\",\"pattern\":\"968 XXXX XXXX\",\"emoji\":\"🇴🇲\"},{\"phoneCode\":\"92\",\"code\":\"PK\",\"name\":\"Pakistan\",\"pattern\":\"92 XXX XXX XXXX\",\"emoji\":\"🇵🇰\"},{\"phoneCode\":\"680\",\"code\":\"PW\",\"name\":\"Palau\",\"pattern\":\"\",\"emoji\":\"🇵🇼\"},{\"phoneCode\":\"970\",\"code\":\"PS\",\"name\":\"Palestinian Territories\",\"pattern\":\"970 XXX XX XXXX\",\"emoji\":\"🇵🇸\"},{\"phoneCode\":\"507\",\"code\":\"PA\",\"name\":\"Panama\",\"pattern\":\"507 XXXX XXXX\",\"emoji\":\"🇵🇦\"},{\"phoneCode\":\"675\",\"code\":\"PG\",\"name\":\"Papua New Guinea\",\"pattern\":\"\",\"emoji\":\"🇵🇬\"},{\"phoneCode\":\"595\",\"code\":\"PY\",\"name\":\"Paraguay\",\"pattern\":\"595 XXX XXX XXX\",\"emoji\":\"🇵🇾\"},{\"phoneCode\":\"51\",\"code\":\"PE\",\"name\":\"Peru\",\"pattern\":\"51 XXX XXX XXX\",\"emoji\":\"🇵🇪\"},{\"phoneCode\":\"63\",\"code\":\"PH\",\"name\":\"Philippines\",\"pattern\":\"63 XXX XXX XXXX\",\"emoji\":\"🇵🇭\"},{\"phoneCode\":\"64\",\"code\":\"PN\",\"name\":\"Pitcairn Islands\",\"pattern\":\"\",\"emoji\":\"🇵🇳\"},{\"phoneCode\":\"48\",\"code\":\"PL\",\"name\":\"Poland\",\"pattern\":\"48 XXX XXX XXX\",\"emoji\":\"🇵🇱\"},{\"phoneCode\":\"351\",\"code\":\"PT\",\"name\":\"Portugal\",\"pattern\":\"351 X XXXX XXXX\",\"emoji\":\"🇵🇹\"},{\"phoneCode\":\"1 787 and 1 939\",\"code\":\"PR\",\"name\":\"Puerto Rico\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇵🇷\"},{\"phoneCode\":\"974\",\"code\":\"QA\",\"name\":\"Qatar\",\"pattern\":\"\",\"emoji\":\"🇶🇦\"},{\"phoneCode\":\"262\",\"code\":\"RE\",\"name\":\"Reunion\",\"pattern\":\"262 XXX XXX XXX\",\"emoji\":\"🇷🇪\"},{\"phoneCode\":\"40\",\"code\":\"RO\",\"name\":\"Romania\",\"pattern\":\"40 XXX XXX XXX\",\"emoji\":\"🇷🇴\"},{\"phoneCode\":\"7\",\"code\":\"RU\",\"name\":\"Russia\",\"pattern\":\"7 XXX XXX XX XX\",\"emoji\":\"🇷🇺\"},{\"phoneCode\":\"250\",\"code\":\"RW\",\"name\":\"Rwanda\",\"pattern\":\"250 XXX XXX XXX\",\"emoji\":\"🇷🇼\"},{\"phoneCode\":\"590\",\"code\":\"BL\",\"name\":\"St. Barthelemy\",\"pattern\":\"\",\"emoji\":\"🇧🇱\"},{\"phoneCode\":\"290\",\"code\":\"SH\",\"name\":\"St. Helena\",\"pattern\":\"290 XX XXX\",\"emoji\":\"🇸🇭\"},{\"phoneCode\":\"1 869\",\"code\":\"KN\",\"name\":\"St. Kitts & Nevis\",\"pattern\":\"1869 XXX XXXX\",\"emoji\":\"🇰🇳\"},{\"phoneCode\":\"1 758\",\"code\":\"LC\",\"name\":\"St. Lucia\",\"pattern\":\"1758 XXX XXXX\",\"emoji\":\"🇱🇨\"},{\"phoneCode\":\"590\",\"code\":\"MF\",\"name\":\"St. Martin (France)\",\"pattern\":\"\",\"emoji\":\"🇲🇫\"},{\"phoneCode\":\"508\",\"code\":\"PM\",\"name\":\"St. Pierre and Miquelon\",\"pattern\":\"\",\"emoji\":\"🇵🇲\"},{\"phoneCode\":\"1 784\",\"code\":\"VC\",\"name\":\"St. Vincent and the Grenadines\",\"pattern\":\"1784 XXX XXXX\",\"emoji\":\"🇻🇨\"},{\"phoneCode\":\"685\",\"code\":\"WS\",\"name\":\"Samoa\",\"pattern\":\"\",\"emoji\":\"🇼🇸\"},{\"phoneCode\":\"378\",\"code\":\"SM\",\"name\":\"San Marino\",\"pattern\":\"378 XXX XXX XXXX\",\"emoji\":\"🇸🇲\"},{\"phoneCode\":\"239\",\"code\":\"ST\",\"name\":\"São Tome & Principe\",\"pattern\":\"239 XX XXXXX\",\"emoji\":\"🇸🇹\"},{\"phoneCode\":\"966\",\"code\":\"SA\",\"name\":\"Saudi Arabia\",\"pattern\":\"\",\"emoji\":\"🇸🇦\"},{\"phoneCode\":\"221\",\"code\":\"SN\",\"name\":\"Senegal\",\"pattern\":\"221 XX XXX XXXX\",\"emoji\":\"🇸🇳\"},{\"phoneCode\":\"381\",\"code\":\"RS\",\"name\":\"Serbia\",\"pattern\":\"381 XX XXX XXXX\",\"emoji\":\"🇷🇸\"},{\"phoneCode\":\"248\",\"code\":\"SC\",\"name\":\"Seychelles\",\"pattern\":\"248 X XX XX XX\",\"emoji\":\"🇸🇨\"},{\"phoneCode\":\"232\",\"code\":\"SL\",\"name\":\"Sierra Leone\",\"pattern\":\"232 XX XXX XXX\",\"emoji\":\"🇸🇱\"},{\"phoneCode\":\"65\",\"code\":\"SG\",\"name\":\"Singapore\",\"pattern\":\"65 XXXX XXXX\",\"emoji\":\"🇸🇬\"},{\"phoneCode\":\"599 3\",\"code\":\"BQ\",\"name\":\"Sint Eustatius\",\"pattern\":\"\",\"emoji\":\"🇧🇶\"},{\"phoneCode\":\"1 721\",\"code\":\"SX\",\"name\":\"Sint Maarten\",\"pattern\":\"1721 XXX XXXX\",\"emoji\":\"🇸🇽\"},{\"phoneCode\":\"421\",\"code\":\"SK\",\"name\":\"Slovakia\",\"pattern\":\"\",\"emoji\":\"🇸🇰\"},{\"phoneCode\":\"386\",\"code\":\"SI\",\"name\":\"Slovenia\",\"pattern\":\"\",\"emoji\":\"🇸🇮\"},{\"phoneCode\":\"677\",\"code\":\"SB\",\"name\":\"Solomon Islands\",\"pattern\":\"\",\"emoji\":\"🇸🇧\"},{\"phoneCode\":\"252\",\"code\":\"SO\",\"name\":\"Somalia\",\"pattern\":\"252 XX XXX XXX\",\"emoji\":\"🇸🇴\"},{\"phoneCode\":\"27\",\"code\":\"ZA\",\"name\":\"South Africa\",\"pattern\":\"27 XX XXX XXXX\",\"emoji\":\"🇿🇦\"},{\"phoneCode\":\"500\",\"code\":\"GS\",\"name\":\"South Georgia & South Sandwich Islands\",\"pattern\":\"\",\"emoji\":\"🇬🇸\"},{\"phoneCode\":\"995 34\",\"code\":\"\",\"name\":\"South Ossetia\",\"pattern\":\"\",\"emoji\":\"\"},{\"phoneCode\":\"211\",\"code\":\"SS\",\"name\":\"South Sudan\",\"pattern\":\"211 XX XXX XXXX\",\"emoji\":\"🇸🇸\"},{\"phoneCode\":\"34\",\"code\":\"ES\",\"name\":\"Spain\",\"pattern\":\"34 XXX XXX XXX\",\"emoji\":\"🇪🇸\"},{\"phoneCode\":\"94\",\"code\":\"LK\",\"name\":\"Sri Lanka\",\"pattern\":\"94 XX XXX XXXX\",\"emoji\":\"🇱🇰\"},{\"phoneCode\":\"249\",\"code\":\"SD\",\"name\":\"Sudan\",\"pattern\":\"249 XX XXX XXXX\",\"emoji\":\"🇸🇩\"},{\"phoneCode\":\"597\",\"code\":\"SR\",\"name\":\"Suriname\",\"pattern\":\"597 XXX XXXX\",\"emoji\":\"🇸🇷\"},{\"phoneCode\":\"47 79\",\"code\":\"SJ\",\"name\":\"Svalbard\",\"pattern\":\"\",\"emoji\":\"🇸🇯\"},{\"phoneCode\":\"268\",\"code\":\"SZ\",\"name\":\"Swaziland\",\"pattern\":\"268 XXXX XXXX\",\"emoji\":\"🇸🇿\"},{\"phoneCode\":\"46\",\"code\":\"SE\",\"name\":\"Sweden\",\"pattern\":\"46 XX XXX XXXX\",\"emoji\":\"🇸🇪\"},{\"phoneCode\":\"41\",\"code\":\"CH\",\"name\":\"Switzerland\",\"pattern\":\"41 XX XXX XXXX\",\"emoji\":\"🇨🇭\"},{\"phoneCode\":\"963\",\"code\":\"SY\",\"name\":\"Syria\",\"pattern\":\"\",\"emoji\":\"🇸🇾\"},{\"phoneCode\":\"886\",\"code\":\"TW\",\"name\":\"Taiwan\",\"pattern\":\"\",\"emoji\":\"🇹🇼\"},{\"phoneCode\":\"992\",\"code\":\"TJ\",\"name\":\"Tajikistan\",\"pattern\":\"\",\"emoji\":\"🇹🇯\"},{\"phoneCode\":\"255\",\"code\":\"TZ\",\"name\":\"Tanzania\",\"pattern\":\"255 XX XXX XXXX\",\"emoji\":\"🇹🇿\"},{\"phoneCode\":\"66\",\"code\":\"TH\",\"name\":\"Thailand\",\"pattern\":\"66 X XXXX XXXX\",\"emoji\":\"🇹🇭\"},{\"phoneCode\":\"228\",\"code\":\"TG\",\"name\":\"Togo\",\"pattern\":\"228 XX XXX XXX\",\"emoji\":\"🇹🇬\"},{\"phoneCode\":\"690\",\"code\":\"TK\",\"name\":\"Tokelau\",\"pattern\":\"\",\"emoji\":\"🇹🇰\"},{\"phoneCode\":\"676\",\"code\":\"TO\",\"name\":\"Tonga\",\"pattern\":\"\",\"emoji\":\"🇹🇴\"},{\"phoneCode\":\"1 868\",\"code\":\"TT\",\"name\":\"Trinidad & Tobago\",\"pattern\":\"1868 XXX XXXX\",\"emoji\":\"🇹🇹\"},{\"phoneCode\":\"216\",\"code\":\"TN\",\"name\":\"Tunisia\",\"pattern\":\"216 XX XXX XXX\",\"emoji\":\"🇹🇳\"},{\"phoneCode\":\"90\",\"code\":\"TR\",\"name\":\"Turkey\",\"pattern\":\"90 XXX XXX XXXX\",\"emoji\":\"🇹🇷\"},{\"phoneCode\":\"993\",\"code\":\"TM\",\"name\":\"Turkmenistan\",\"pattern\":\"993 XX XXXXXX\",\"emoji\":\"🇹🇲\"},{\"phoneCode\":\"1 649\",\"code\":\"TC\",\"name\":\"Turks & Caicos Islands\",\"pattern\":\"1649 XXX XXXX\",\"emoji\":\"🇹🇨\"},{\"phoneCode\":\"688\",\"code\":\"TV\",\"name\":\"Tuvalu\",\"pattern\":\"\",\"emoji\":\"🇹🇻\"},{\"phoneCode\":\"256\",\"code\":\"UG\",\"name\":\"Uganda\",\"pattern\":\"256 XX XXX XXXX\",\"emoji\":\"🇺🇬\"},{\"phoneCode\":\"380\",\"code\":\"UA\",\"name\":\"Ukraine\",\"pattern\":\"380 XX XXX XX XX\",\"emoji\":\"🇺🇦\"},{\"phoneCode\":\"971\",\"code\":\"AE\",\"name\":\"United Arab Emirates\",\"pattern\":\"971 XX XXX XXXX\",\"emoji\":\"🇦🇪\"},{\"phoneCode\":\"44\",\"code\":\"GB\",\"name\":\"United Kingdom\",\"pattern\":\"44 XXXX XXXXXX\",\"emoji\":\"🇬🇧\"},{\"phoneCode\":\"1\",\"code\":\"US\",\"name\":\"United States\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇺🇸\"},{\"phoneCode\":\"598\",\"code\":\"UY\",\"name\":\"Uruguay\",\"pattern\":\"598 XXXX XXXX\",\"emoji\":\"🇺🇾\"},{\"phoneCode\":\"1 340\",\"code\":\"VI\",\"name\":\"U.S. Virgin Islands\",\"pattern\":\"1340 XXX XXXX\",\"emoji\":\"🇻🇮\"},{\"phoneCode\":\"998\",\"code\":\"UZ\",\"name\":\"Uzbekistan\",\"pattern\":\"998 XX XXXXXXX\",\"emoji\":\"🇺🇿\"},{\"phoneCode\":\"678\",\"code\":\"VU\",\"name\":\"Vanuatu\",\"pattern\":\"\",\"emoji\":\"🇻🇺\"},{\"phoneCode\":\"58\",\"code\":\"VE\",\"name\":\"Venezuela\",\"pattern\":\"58 XXX XXX XXXX\",\"emoji\":\"🇻🇪\"},{\"phoneCode\":\"39 06 698\",\"code\":\"VA\",\"name\":\"Vatican City\",\"pattern\":\"\",\"emoji\":\"🇻🇦\"},{\"phoneCode\":\"84\",\"code\":\"VN\",\"name\":\"Vietnam\",\"pattern\":\"\",\"emoji\":\"🇻🇳\"},{\"phoneCode\":\"681\",\"code\":\"WF\",\"name\":\"Wallis & Futuna\",\"pattern\":\"\",\"emoji\":\"🇼🇫\"},{\"phoneCode\":\"967\",\"code\":\"YE\",\"name\":\"Yemen\",\"pattern\":\"967 XXX XXX XXX\",\"emoji\":\"🇾🇪\"},{\"phoneCode\":\"260\",\"code\":\"ZM\",\"name\":\"Zambia\",\"pattern\":\"260 XX XXX XXXX\",\"emoji\":\"🇿🇲\"},{\"phoneCode\":\"255\",\"code\":\"\",\"name\":\"Zanzibar\",\"pattern\":\"\",\"emoji\":\"\"},{\"phoneCode\":\"263\",\"code\":\"ZW\",\"name\":\"Zimbabwe\",\"pattern\":\"263 XX XXX XXXX\",\"emoji\":\"🇿🇼\"}];\r\n\r\nif(Config.Modes.test) {\r\n Config.Countries.push({\r\n name: 'Test Country',\r\n phoneCode: '999 66',\r\n code: 'TC',\r\n emoji: '🤔',\r\n pattern: '999 66 XXX XX'\r\n });\r\n\r\n console.log('Added test country to list!');\r\n}\r\n\r\nConfig.Schema = Config.Schema || {};\r\n\r\nConfig.Schema.MTProto = {\"constructors\":[{\"id\":\"481674261\",\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":\"85337187\",\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":\"-2083955988\",\"predicate\":\"p_q_inner_data\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"}],\"type\":\"P_Q_inner_data\"},{\"id\":\"1013613780\",\"predicate\":\"p_q_inner_data_temp\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":\"2043348061\",\"predicate\":\"server_DH_params_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash\",\"type\":\"int128\"}],\"type\":\"Server_DH_Params\"},{\"id\":\"-790100132\",\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":\"-1249309254\",\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":\"1715713620\",\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":\"1003222836\",\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"1188831161\",\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"-1499615742\",\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"-212046591\",\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":\"558156313\",\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":\"1579864942\",\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":\"-847714938\",\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":\"-1539647305\",\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":\"155834844\",\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":\"-1370486635\",\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":\"880243653\",\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":\"-501201412\",\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":\"1658015945\",\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":\"-1631450872\",\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":\"1945237724\",\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":\"1538843921\",\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":\"-530561358\",\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":\"812830625\",\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":\"1658238041\",\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":\"-1477445615\",\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":\"-307542917\",\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":\"2105940488\",\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":\"-630588590\",\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":\"81704317\",\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":\"-1933520591\",\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":\"661470918\",\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":\"-2137147681\",\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":\"1973679973\",\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"}],\"methods\":[{\"id\":\"3195965169\",\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":\"1615239032\",\"method\":\"req_pq\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":\"-686627650\",\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":\"-184262881\",\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"1491380032\",\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":\"-1188971260\",\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":\"2059302892\",\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":\"-213746804\",\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":\"-414113498\",\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":\"-1835453025\",\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"}]};\r\n\r\nConfig.Schema.API = {\"constructors\":[{\"id\":\"-1132882121\",\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1720552011\",\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"1072550713\",\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":\"481674261\",\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":\"-994444869\",\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":\"1450380236\",\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":\"2134579434\",\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":\"2107670217\",\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":\"396093539\",\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"InputPeer\"},{\"id\":\"-1182234929\",\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":\"-138301121\",\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":\"-208488460\",\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":\"-181407105\",\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":\"-1771768449\",\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":\"505969924\",\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-1279654347\",\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-104578748\",\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":\"-122978821\",\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"480546647\",\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":\"-1837345356\",\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"InputChatPhoto\"},{\"id\":\"-1991004873\",\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":\"-457104426\",\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":\"-206066487\",\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"}],\"type\":\"InputGeoPoint\"},{\"id\":\"483901197\",\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":\"1001634122\",\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":\"-539317279\",\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":\"-1649296275\",\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"-1160714821\",\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"-1432995067\",\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1086091090\",\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"8322574\",\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-891180321\",\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"172975040\",\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-1373745011\",\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1384777335\",\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1258941372\",\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-1278304028\",\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"276907596\",\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"537022650\",\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"User\"},{\"id\":\"1326562017\",\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":\"-321430132\",\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"photo_small\",\"type\":\"FileLocation\"},{\"name\":\"photo_big\",\"type\":\"FileLocation\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":\"164646985\",\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"-306628279\",\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":\"9203775\",\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":\"-1683826688\",\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Chat\"},{\"id\":\"1004149726\",\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":\"120753115\",\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":\"461151667\",\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"}],\"type\":\"ChatFull\"},{\"id\":\"-925415106\",\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":\"-57668565\",\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":\"1061556205\",\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":\"935395612\",\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":\"1197267925\",\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"photo_small\",\"type\":\"FileLocation\"},{\"name\":\"photo_big\",\"type\":\"FileLocation\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":\"-2082087340\",\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Message\"},{\"id\":\"1160515173\",\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?int\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?int\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"}],\"type\":\"Message\"},{\"id\":\"-1642487306\",\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?int\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"}],\"type\":\"Message\"},{\"id\":\"1038967584\",\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":\"1766936791\",\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":\"1457575028\",\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":\"-873313984\",\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageMedia\"},{\"id\":\"-1618676578\",\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":\"-1230047312\",\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"-1503425638\",\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":\"-1247687078\",\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"2144015272\",\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":\"-1780220945\",\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"1217033015\",\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":\"-1297179892\",\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"739712882\",\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":\"590459437\",\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":\"-797637467\",\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":\"236446268\",\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":\"2009052699\",\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"FileLocation\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":\"-374917894\",\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"FileLocation\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":\"286776671\",\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":\"43446532\",\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"GeoPoint\"},{\"id\":\"1577067778\",\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":\"-855308010\",\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-543777747\",\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":\"-1195615476\",\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":\"423314455\",\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"1251338318\",\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"-1673717362\",\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":\"-1353671392\",\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":\"-2122045747\",\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"}],\"type\":\"PeerSettings\"},{\"id\":\"-1539849235\",\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":\"1490799288\",\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"505595789\",\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"777640226\",\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"-1376497949\",\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"-512463606\",\"predicate\":\"inputReportReasonOther\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"ReportReason\"},{\"id\":\"-302941166\",\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"user\",\"type\":\"User\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"}],\"type\":\"UserFull\"},{\"id\":\"-116274796\",\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":\"-805141448\",\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":\"1444661369\",\"predicate\":\"contactBlocked\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ContactBlocked\"},{\"id\":\"-748155807\",\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":\"-1219778094\",\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":\"-353862078\",\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":\"2010127419\",\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":\"471043349\",\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"-1878523231\",\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"364538944\",\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector