├── assets ├── css │ ├── facebook-incognito.css │ └── custom.css ├── images │ └── icon.png └── js │ ├── icon.js │ ├── axios.min.js │ └── vue.min.js ├── constant └── define.js ├── manifest.json ├── module.js ├── README.md ├── app.js ├── hook.js ├── util.js ├── core ├── main.js └── handle.js └── popup.html /assets/css/facebook-incognito.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svenit/facebook-incognito-v2/HEAD/assets/images/icon.png -------------------------------------------------------------------------------- /constant/define.js: -------------------------------------------------------------------------------- 1 | const INIT_APP = 'INIT_APP'; 2 | const SET_SELECTED_ELEMENT = 'SET_SELECTED_ELEMENT'; 3 | const BAN_GROUP_MEMBER = 'BAN_GROUP_MEMBER'; 4 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Facebook Incognito", 3 | "description": "Facebook Incognito 2020 Copyright Lê Quang Vỹ ", 4 | "background": { 5 | "scripts": ["constant/define.js", "assets/js/axios.min.js","util.js","core/main.js"], 6 | "persistent": true 7 | }, 8 | "content_scripts": [ 9 | { 10 | "matches": ["https://*/*"], 11 | "run_at": "document_idle", 12 | "js": ["constant/define.js","assets/js/axios.min.js", "util.js", "app.js"] 13 | } 14 | ], 15 | "externally_connectable": { 16 | "matches": [ "*://*.facebook.com/*", "*://*.messenger.com/*" ] 17 | }, 18 | "icons": { 19 | "16": "assets/images/icon.png", 20 | "48": "assets/images/icon.png", 21 | "128": "assets/images/icon.png" 22 | }, 23 | "browser_action": { 24 | "default_popup": "popup.html" 25 | }, 26 | "manifest_version": 2, 27 | "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", 28 | "permissions": ["activeTab", "notifications","tabs","unlimitedStorage","storage","", "webRequest", "webRequestBlocking", "contextMenus", "cookies"], 29 | "version": "1.0.2", 30 | "web_accessible_resources": [ "*" ] 31 | } -------------------------------------------------------------------------------- /module.js: -------------------------------------------------------------------------------- 1 | export const EXTENSION_ID = "dbhodakoonpcglkjcphdkklibellpfjc"; 2 | 3 | export function getPersistedMessages(callback) { 4 | chrome.runtime.sendMessage(EXTENSION_ID, { 5 | getPersistedMessages: true 6 | }, (response) => { 7 | callback(response); 8 | }); 9 | } 10 | 11 | export function setReceivedMessages(receivedMessages) { 12 | chrome.runtime.sendMessage(EXTENSION_ID, { 13 | receivedMessages: JSON.stringify(receivedMessages) 14 | }); 15 | } 16 | 17 | export function setRemovedMessages(removedMessages) { 18 | chrome.runtime.sendMessage(EXTENSION_ID, { 19 | removedMessages: JSON.stringify(removedMessages) 20 | }); 21 | } 22 | 23 | export function setLastPurgeTime() { 24 | chrome.runtime.sendMessage(EXTENSION_ID, { 25 | lastPurgeTime: new Date().getTime() 26 | }); 27 | } 28 | 29 | export function _getViewerAuthorFbt(removedMessage) { 30 | return `Bạn đã gỡ một tin nhắn ${getRemovedMessageText(removedMessage)}`; 31 | } 32 | 33 | export function _getOtherAuthorFbt(name, removedMessage) { 34 | return `${name} đã gỡ một tin nhắn ${getRemovedMessageText(removedMessage)}`; 35 | } 36 | 37 | export function _getUnknownAuthorFbt(removedMessage) { 38 | return `Unknown đã gỡ một tin nhắn ${getRemovedMessageText(removedMessage)}`; 39 | } 40 | 41 | function getRemovedMessageText(removedMessage) { 42 | return removedMessage ? `: ${removedMessage}` : ''; 43 | } 44 | 45 | export function getReducedMessageObject({ 46 | message_id, 47 | thread_id, 48 | offline_threading_id, 49 | author, 50 | body, 51 | has_attachment, 52 | attachments, 53 | timestamp 54 | }) { 55 | return { 56 | message_id, 57 | thread_id, 58 | offline_threading_id, 59 | author, 60 | body, 61 | has_attachment, 62 | attachments, 63 | timestamp 64 | }; 65 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Facebook Incognito Chrome Extension 3 | 4 | - Facebook Incognito là dự án mã nguồn mở của mình, các bạn có thể cài đặt và sử dụng hoàn toàn miễn phí. Tuy nhiên nghiêm cấm hành vi dùng mà nguồn của mình vào việc thương mại hóa, chuộc lợi cho bản thân 5 | - Mã nguồn sẽ được cập nhật thường xuyên tại đây 6 | - Extension cực kì nhẹ, chỉ với 700KB 7 | - Nếu bạn muốn trải nghiệm phiên bản Pro, xin vui lòng liên hệ mình với thông tin bên dưới 8 | - **Nghiêm cấm sử dụng mã nguồn này trong việc thương mại hóa, hãy tôn trọng quyền tác giả** 9 | 10 | ### Features 11 | 12 | - **Block Features** 13 | + **Dễ dàng ẩn mọi hoạt động của bạn trên Facebook** 14 | + Chặn Đã Xem Trong Chat 15 | + Chặn Đang Nhập Trong Chat 16 | + Ẩn Hoạt Động Trong Chat 17 | + Đánh Dấu Thông Báo Là Chưa Đọc 18 | + Chặn Đã Xem Trong Story 19 | + Chặn Đang Nhập Trong Bình Luận 20 | + Tạm Dừng Newsfeed Timeline 21 | 22 | - **Dead Click** 23 | + **Quản lý hội nhóm chưa bao giờ đến thế với Dead Click, tiễn đưa thành viên ra đảo chỉ với 1 cú click** 24 | + Kick trên đa nhóm 25 | + Danh sách ID bất tử 26 | + Thông báo đa kênh ( Discord, Facebook ) 27 | + Hiện số người đã kick 28 | 29 | - **Tin Nhắn Đã Gỡ** 30 | + **Bạn đang tò mò muốn biết đối phương vừa chat gì cho bạn mà bạn chưa kịp đọc đã bị thu hồi lại tin nhắn? Đừng lo đã có ngay chức năng này của mình, bạn có thể xem lại tin nhắn mà đối phương đã thu hồi cực kì dễ dàng** 31 | 32 | - **Auto Trả Lời Tin Nhắn** 33 | + Tự động trả lời tin nhắn trong lúc bạn đang bận 34 | + Bạn có thể cấu hình bằng mẫu tin nhắn, sticker hoặc với Simsimi Bot 35 | 36 | - **Đếm tin nhắn** 37 | + Hiển thị tổng số tin nhắn trong cuộc trò chuyện với lệnh ``count`` 38 | 39 | ### Installation 40 | 41 | Bước 1: Vào cmd hoặc terminal : ``git clone https://github.com/svenit/facebook-incognito-v2.git`` 42 | 43 | Bước 2: Gõ trên thanh địa chỉ ``chrome://extensions/`` 44 | 45 | Bước 3: Bật chế độ dành cho nhà phát triển ( Developer Mode ) 46 | 47 | Bước 4: Tải tiện ích đã giải nén ( Load unpacked ) 48 | 49 | Bước 5: Chọn thư mục bạn vừa clone ở **Bước 1** rồi submit 50 | 51 | ### Developer 52 | 53 | **Lê Quang Vỹ** 54 | 55 | [Facebook](https://www.facebook.com/sven307) 56 | 57 | [Gmail](mailto:lequangvy2k@gmail.com) 58 | 59 | License 60 | ---- 61 | 62 | MIT 63 | 64 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * @author : Lê Quang Vỹ 4 | * @version : 1.0.2 5 | * @facebook : https://facebook.com/sven307 6 | */ 7 | 8 | const supportDomain = ['facebook.com']; 9 | let stack = []; 10 | 11 | if(supportDomain.includes(document.domain)) 12 | { 13 | chrome.runtime.sendMessage({ 14 | action: INIT_APP, 15 | }); 16 | window.addEventListener('load', function () { 17 | console.log('Page was loaded'); 18 | createContextMenu(); 19 | injectHook(chrome.extension.getURL('hook.js')); 20 | }); 21 | } 22 | function injectHook(url) 23 | { 24 | var hookScript = document.createElement('script'); 25 | hookScript.type = 'module'; 26 | hookScript.src = url; 27 | (document.head || document.body || document.documentElement).appendChild(hookScript); 28 | } 29 | 30 | chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) => { 31 | switch(request.action) 32 | { 33 | case 'CREATE_MESSAGE_BOX': 34 | createMessageBox(request); 35 | break; 36 | case 'CONNECT_TO_FACEBOOK': 37 | let feedbackId = await getFeedbackId(request); 38 | chrome.runtime.sendMessage({ 39 | action: 'CONNECT_TO_FACEBOOK_CALLBACK', 40 | payload: JSON.stringify(feedbackId) 41 | }); 42 | break; 43 | case 'BAN_USER': 44 | try 45 | { 46 | let { message, targetSelected, groupId, option, flyColorSetting, actor } = request.payload; 47 | let form = new FormData(); 48 | form.append('fb_dtsg_ag', option.fb_dtsg_ag); 49 | form.append('fb_dtsg', option.fb_dtsg); 50 | form.append('confirmed', option.confirmed); 51 | createMessageBox({status: 'info', message: `Đang thực hiện [ Block ] - ${targetSelected.userName} ra khỏi nhóm ${targetSelected.groupName}`}); 52 | let { data } = await axios.post(`https://www.facebook.com/ajax/groups/remove_member/?group_id=${groupId}&member_id=${targetSelected.userId}&source=profile_browser&is_undo=0`, form); 53 | if(data == '' && await hasBanned(option.fb_dtsg, groupId, targetSelected.userId)) 54 | { 55 | createMessageBox({status: 'success', message}); 56 | broadcastToChannel(request.payload); 57 | chrome.runtime.sendMessage({ 58 | action: 'SET_DEAD_BADGE' 59 | }); 60 | return; 61 | } 62 | createMessageBox({status: 'error', message: `${targetSelected.userName} không thuộc nhóm bạn quản lý hoặc đã bị block trước đó`}); 63 | } 64 | catch(e) 65 | { 66 | createMessageBox({status: 'error', message: 'Đã có lỗi xảy ra, xin vui lòng thử lại'}); 67 | } 68 | break; 69 | } 70 | }); 71 | -------------------------------------------------------------------------------- /assets/css/custom.css: -------------------------------------------------------------------------------- 1 | span { 2 | font-size: 13px !important; 3 | } 4 | 5 | ::placeholder { 6 | font-size: 14px; 7 | } 8 | 9 | .col-3 { 10 | background-color: #2a3042 !important; 11 | } 12 | 13 | .nav-tabs { 14 | background-color: #2a3042; 15 | border-bottom: 0px; 16 | } 17 | 18 | .nav-tabs .nav-link { 19 | border-radius: 0px; 20 | } 21 | 22 | .nav-tabs a { 23 | color: #ccc; 24 | width: 100%; 25 | padding: 10px 30px; 26 | } 27 | 28 | .nav-tabs .nav-item.show .nav-link, 29 | .nav-tabs .nav-link.active { 30 | color: #fff; 31 | border: 1px solid #222736; 32 | background-color: #222736; 33 | } 34 | 35 | .nav-tabs .nav-link:focus, 36 | .nav-tabs .nav-link:hover { 37 | background-color: #222736; 38 | border: 1px solid #222736; 39 | } 40 | 41 | body { 42 | background-color: #222736; 43 | color: #ccc; 44 | } 45 | ::-webkit-scrollbar 46 | { 47 | width: 2px; 48 | background-color: #222736; 49 | } 50 | 51 | ::-webkit-scrollbar-thumb 52 | { 53 | background-color: #1b1f29; 54 | border: 0px; 55 | } 56 | .custom-control-input:checked~.custom-control-label::before { 57 | border-color: #5974f4; 58 | background-color: #5974f4; 59 | } 60 | 61 | .form-control { 62 | background-color: #2a3042; 63 | color: #ccc; 64 | border: 1px solid #424768; 65 | } 66 | 67 | .form-control:focus { 68 | background-color: #2a3042; 69 | border: 1px solid #424768; 70 | color: #ccc; 71 | } 72 | 73 | .sk-chase { 74 | width: 40px; 75 | margin: 0 auto; 76 | height: 40px; 77 | position: relative; 78 | animation: sk-chase 2.5s infinite linear both; 79 | } 80 | 81 | .sk-chase-dot { 82 | width: 100%; 83 | height: 100%; 84 | position: absolute; 85 | left: 0; 86 | top: 0; 87 | animation: sk-chase-dot 2.0s infinite ease-in-out both; 88 | } 89 | 90 | .sk-chase-dot:before { 91 | content: ''; 92 | display: block; 93 | width: 25%; 94 | height: 25%; 95 | background-color: #fff; 96 | border-radius: 100%; 97 | animation: sk-chase-dot-before 2.0s infinite ease-in-out both; 98 | } 99 | 100 | .sk-chase-dot:nth-child(1) { 101 | animation-delay: -1.1s; 102 | } 103 | 104 | .sk-chase-dot:nth-child(2) { 105 | animation-delay: -1.0s; 106 | } 107 | 108 | .sk-chase-dot:nth-child(3) { 109 | animation-delay: -0.9s; 110 | } 111 | 112 | .sk-chase-dot:nth-child(4) { 113 | animation-delay: -0.8s; 114 | } 115 | 116 | .sk-chase-dot:nth-child(5) { 117 | animation-delay: -0.7s; 118 | } 119 | 120 | .sk-chase-dot:nth-child(6) { 121 | animation-delay: -0.6s; 122 | } 123 | 124 | .sk-chase-dot:nth-child(1):before { 125 | animation-delay: -1.1s; 126 | } 127 | 128 | .sk-chase-dot:nth-child(2):before { 129 | animation-delay: -1.0s; 130 | } 131 | 132 | .sk-chase-dot:nth-child(3):before { 133 | animation-delay: -0.9s; 134 | } 135 | 136 | .sk-chase-dot:nth-child(4):before { 137 | animation-delay: -0.8s; 138 | } 139 | 140 | .sk-chase-dot:nth-child(5):before { 141 | animation-delay: -0.7s; 142 | } 143 | 144 | .sk-chase-dot:nth-child(6):before { 145 | animation-delay: -0.6s; 146 | } 147 | 148 | @keyframes sk-chase { 149 | 100% { 150 | transform: rotate(360deg); 151 | } 152 | } 153 | 154 | @keyframes sk-chase-dot { 155 | 156 | 80%, 157 | 100% { 158 | transform: rotate(360deg); 159 | } 160 | } 161 | 162 | @keyframes sk-chase-dot-before { 163 | 50% { 164 | transform: scale(0.4); 165 | } 166 | 167 | 100%, 168 | 0% { 169 | transform: scale(1.0); 170 | } 171 | } 172 | .coversation-img { 173 | width:61px; 174 | height:61px; 175 | object-fit:cover; 176 | margin: 3px; 177 | border-radius: 5px; 178 | } 179 | 180 | .coversation-img:hover { 181 | cursor: pointer; 182 | } 183 | 184 | .conversation { 185 | padding: 10px; 186 | border-radius: 50px; 187 | transition: all .2s; 188 | } 189 | 190 | .conversation:hover { 191 | cursor: pointer; 192 | } 193 | 194 | .conversation-active { 195 | background-color: #232836; 196 | } 197 | 198 | .conversation-active img { 199 | border: 2px solid #f2f2f2; 200 | } -------------------------------------------------------------------------------- /assets/js/icon.js: -------------------------------------------------------------------------------- 1 | window.FontAwesomeKitConfig = {"asyncLoading":{"enabled":false},"autoA11y":{"enabled":true},"baseUrl":"https://kit-free.fontawesome.com","detectConflictsUntil":null,"license":"free","method":"css","minify":{"enabled":true},"v4FontFaceShim":{"enabled":true},"v4shim":{"enabled":true},"version":"latest"}; 2 | !function(){function r(e){var t,n=[],i=document,o=i.documentElement.doScroll,r="DOMContentLoaded",a=(o?/^loaded|^c/:/^loaded|^i|^c/).test(i.readyState);a||i.addEventListener(r,t=function(){for(i.removeEventListener(r,t),a=1;t=n.shift();)t()}),a?setTimeout(e,0):n.push(e)}!function(){if(!(void 0===window.Element||"classList"in document.documentElement)){var e,t,n,i=Array.prototype,o=i.push,r=i.splice,a=i.join;d.prototype={add:function(e){this.contains(e)||(o.call(this,e),this.el.className=this.toString())},contains:function(e){return-1!=this.el.className.indexOf(e)},item:function(e){return this[e]||null},remove:function(e){if(this.contains(e)){for(var t=0;t { 29 | loadPersistedMessages(); 30 | }); 31 | 32 | function hookMessengerModules(callback) 33 | { 34 | if (window.requireLazy) 35 | { 36 | window.requireLazy(HOOK_MODULES, (...modules) => { 37 | setHookedModules(...modules); 38 | Modules.RemovedMessageTombstoneContent.getRemovedMessageTombstoneContent = getTombstoneContent; 39 | Modules.MercuryThreadInformer.prototype.informNewMessage = informNewMessage; 40 | Modules.MercuryThreadInformer.prototype.updatedMessage = updatedMessage; 41 | callback(); 42 | }); 43 | } 44 | else 45 | { 46 | console.warn('Failed to inject Unsend Recall for Messenger hook.'); 47 | } 48 | } 49 | 50 | function loadPersistedMessages() 51 | { 52 | getPersistedMessages((response) => { 53 | if (response.receivedMessages) 54 | { 55 | receivedMessages = JSON.parse(response.receivedMessages); 56 | } 57 | if (response.removedMessages) 58 | { 59 | removedMessages = JSON.parse(response.removedMessages); 60 | 61 | } 62 | purgeReceivedMessages(response.lastPurgeTime); 63 | }); 64 | } 65 | 66 | function getTombstoneContent(message, metadata) 67 | { 68 | let messageAuthor = message.author; 69 | let messageAuthorId = Modules.MercuryIDs.getUserIDFromParticipantID(messageAuthor); 70 | let currentUserId = Modules.CurrentUser.getID(); 71 | let removedMessage = getRemovedMessage(message); 72 | 73 | if (messageAuthorId === currentUserId) 74 | { 75 | return _getViewerAuthorFbt(removedMessage); 76 | } 77 | 78 | let threadMeta = Modules.MessengerState.getThreadMetaNow(currentUserId, message.thread_id); 79 | let messageAuthorName = threadMeta.custom_nickname ? threadMeta.custom_nickname[messageAuthorId] : Modules.MessengerParticipants.getNow(messageAuthor).short_name; 80 | 81 | return threadMeta ? _getOtherAuthorFbt(messageAuthorName, removedMessage) : _getUnknownAuthorFbt(removedMessage); 82 | 83 | } 84 | function informNewMessage(threadId, message) 85 | { 86 | let messageId = message.message_id; 87 | receivedMessages[messageId] = getReducedMessageObject(message); 88 | setReceivedMessages(receivedMessages); 89 | 90 | this.inform(NEW_MESSAGE_EVENT, { 91 | threadID: threadId, 92 | message: message 93 | }); 94 | if(message.is_unread) 95 | { 96 | chrome.runtime.sendMessage(EXTENSION_ID ,{action:'AUTO_REP_MESSAGE',threadId, message}); 97 | } 98 | } 99 | 100 | function updatedMessage(threadId, messageId, source) 101 | { 102 | this.$MercuryThreadInformer11[threadId] || (this.$MercuryThreadInformer11[threadId] = {}), 103 | this.$MercuryThreadInformer11[threadId][messageId] = { 104 | source 105 | } 106 | this.updatedThread(threadId); 107 | checkForRemovedMessage(messageId); 108 | } 109 | 110 | function checkForRemovedMessage(messageId) 111 | { 112 | let currentUserId = Modules.CurrentUser.getID(); 113 | let messages = Modules.MessengerState.getMessagesFromIDs(currentUserId, [messageId]); 114 | if (messages && messages[0]) 115 | { 116 | let updatedMessage = messages[0]; 117 | if (updatedMessage.message_unsendability_status === REMOVED_MESSAGE_UNSENDABILITY_STATUS) 118 | { 119 | addRemovedMessage(messageId); 120 | } 121 | } 122 | } 123 | 124 | function getRemovedMessage(message) 125 | { 126 | let messageId = message.message_id; 127 | if (receivedMessages[messageId]) 128 | { 129 | addRemovedMessage(messageId); 130 | } 131 | if (removedMessages[messageId]) { 132 | let message = removedMessages[messageId]; 133 | let messageBody = message.body; 134 | if (message.has_attachment) 135 | { 136 | let attachment = message.attachments[0]; 137 | let link = ""; 138 | if (attachment.share) 139 | { 140 | link = attachment.share.uri; 141 | } 142 | if (attachment.thumbnail_url) 143 | { 144 | link = attachment.thumbnail_url; 145 | } 146 | if (attachment.preview_url) 147 | { 148 | link = attachment.preview_url; 149 | } 150 | if (attachment.large_preview_url) 151 | { 152 | link = attachment.large_preview_url; 153 | } 154 | if (attachment.url) 155 | { 156 | link = attachment.url; 157 | } 158 | return message.body.length > 0 ? `${messageBody} ${link}` : link; 159 | } 160 | return messageBody; 161 | } 162 | return null; 163 | } 164 | 165 | function addRemovedMessage(messageId) 166 | { 167 | removedMessages[messageId] = receivedMessages[messageId]; 168 | delete receivedMessages[messageId]; 169 | setRemovedMessages(removedMessages); 170 | setReceivedMessages(receivedMessages); 171 | } 172 | 173 | function purgeReceivedMessages(lastPurgeTime) 174 | { 175 | if (!lastPurgeTime) 176 | { 177 | setLastPurgeTime(); 178 | return; 179 | } 180 | 181 | const ONE_DAY = 1 * 24 * 60 * 60 * 1000; 182 | const TEN_MINUTES = 10 * 60 * 1000; 183 | let currentTimestamp = new Date().getTime(); 184 | let oneDayFromLastPurgeTime = lastPurgeTime + ONE_DAY; 185 | 186 | if (currentTimestamp > oneDayFromLastPurgeTime) 187 | { 188 | Object.keys(receivedMessages).forEach(function (key) { 189 | let message = receivedMessages[key]; 190 | let tenMinutesFromMessageTimestamp = message.timestamp + TEN_MINUTES; 191 | if (currentTimestamp > tenMinutesFromMessageTimestamp) 192 | { 193 | delete receivedMessages[key]; 194 | } 195 | }); 196 | setReceivedMessages(receivedMessages); 197 | setLastPurgeTime(); 198 | } 199 | } 200 | 201 | function setHookedModules(...modules) 202 | { 203 | modules.forEach(function (module, key) { 204 | let moduleName = HOOK_MODULES[key].split(".")[0]; 205 | Modules[moduleName] = module; 206 | }); 207 | } 208 | -------------------------------------------------------------------------------- /util.js: -------------------------------------------------------------------------------- 1 | function createFacebookComment(userId, feedbackId, message, postId, fb_dtsg) 2 | { 3 | let variables = { 4 | 'displayCommentsFeedbackContext' : null, 5 | 'displayCommentsContextEnableComment' : null, 6 | 'displayCommentsContextIsAdPreview' : null, 7 | 'displayCommentsContextIsAggregatedShare' : null, 8 | 'displayCommentsContextIsStorySet' : null, 9 | 'feedLocation' : 'GROUP_PERMALINK', 10 | 'feedbackSource' : 2, 11 | 'focusCommentID' : null, 12 | 'includeNestedComments' : false, 13 | 'input' : { 14 | 'client_mutation_id' : 1, 15 | 'actor_id' : userId, 16 | 'attachments' : null, 17 | 'feedback_id' : feedbackId, 18 | 'message' : { 19 | 'ranges' : {}, 20 | 'text' : message 21 | }, 22 | 'tracking' : [ 23 | '{\"tn\":\"[]-R-R\",\"mf_story_key\":\"'+postId+'\",\"top_level_post_id\":\"'+postId+'\",\"tl_objid\":\"'+postId+'\",\"src\":10,\"story_location\":6,\"filter\":\"GroupStoriesByActivityEntQuery\",\"fbfeed_location\":2}' 24 | ], 25 | 'feedback_source' : 'OBJECT', 26 | }, 27 | 'containerIsFeedStory' : true, 28 | 'containerIsLiveStory' : false, 29 | 'containerIsWorkplace' : false, 30 | 'containerIsTahoe' : false, 31 | 'scale' : 1, 32 | 'isComet' : false, 33 | 'useDefaultActor' : true, 34 | 'UFI2CommentsProvider_commentsKey' : null, 35 | }; 36 | let form = new FormData(); 37 | form.append('fb_api_req_friendly_name', 'UFI2CreateCommentMutation'); 38 | form.append('fb_api_caller_class', 'RelayModern'); 39 | form.append('fb_dtsg', fb_dtsg); 40 | form.append('variables', JSON.stringify(variables)); 41 | form.append('doc_id', 3288505331162025); 42 | axios.post('https://www.facebook.com/api/graphql/', form); 43 | } 44 | 45 | function createMessageBox(request) 46 | { 47 | let status = { 48 | success: { 49 | backgroundColor: '#AFC765', 50 | border: '#A0B55C' 51 | }, 52 | error: { 53 | backgroundColor: '#DE636F', 54 | border: '#CA5A65' 55 | }, 56 | warning: { 57 | backgroundColor: '#FFAE42', 58 | border: '#E89F3C' 59 | }, 60 | info: { 61 | backgroundColor: '#7F7EFF', 62 | border: '#7473E8' 63 | } 64 | } 65 | 66 | let time = request.time || 5000; 67 | 68 | let messageBox = document.createElement('div'); 69 | 70 | stack = [...stack, stack.length]; 71 | messageBox.setAttribute('stack-id', stack.length - 1); 72 | messageBox.style.backgroundColor = status[request.status].backgroundColor; 73 | messageBox.style.borderBottom = `1px solid ${status[request.status].border}`; 74 | messageBox.style.position = 'fixed'; 75 | messageBox.style.right = '-200px'; 76 | messageBox.style.margin = '10px'; 77 | messageBox.style.bottom = 0; 78 | messageBox.style.zIndex = 9999999999; 79 | messageBox.style.color = '#fff'; 80 | messageBox.style.boxShadow = 'rgba(0, 0, 0, 0.098039) 5px 4px 10px 0'; 81 | messageBox.style.transition = 'all .2s'; 82 | messageBox.style.borderRadius = '2px'; 83 | 84 | let messageContent = document.createElement('p'); 85 | messageContent.innerText = request.message; 86 | messageContent.style.margin = '15px'; 87 | messageBox.style.fontSize = '13px'; 88 | 89 | let messageBoxProgress = document.createElement('div'); 90 | messageBoxProgress.style.height = '3px'; 91 | messageBoxProgress.style.background = '#646464'; 92 | messageBoxProgress.style.width = '100%'; 93 | messageBoxProgress.style.opacity = 0.3; 94 | messageBoxProgress.style.position = 'absolute'; 95 | messageBoxProgress.style.bottom = 0; 96 | 97 | messageBox.appendChild(messageContent); 98 | messageBox.appendChild(messageBoxProgress); 99 | document.body.appendChild(messageBox); 100 | setTimeout(() => { 101 | messageBox.style.marginRight = '210px'; 102 | }, 0); 103 | 104 | let i = 0; 105 | let progress = setInterval(() => { 106 | messageBoxProgress.style.width = `${100 - ++i}%`; 107 | messageBox.style.bottom = parseInt(messageBox.getAttribute('stack-id')) * (stack.length - 1) * messageBox.clientHeight + 'px'; 108 | if(i >= 100) 109 | { 110 | document.body.removeChild(messageBox); 111 | stack.pop() 112 | clearInterval(progress); 113 | } 114 | }, time / 100); 115 | } 116 | 117 | function broadcastToChannel(data) 118 | { 119 | try 120 | { 121 | let { message, groupId, option, flyColorSetting, actor } = data; 122 | if(flyColorSetting.discordHook) 123 | { 124 | axios.post(flyColorSetting.discordHook, { 125 | content: '```' + message + '```' 126 | }); 127 | } 128 | if(flyColorSetting.facebookPostId && flyColorSetting.facebookPostFeedbackId) 129 | { 130 | createFacebookComment(actor.id, flyColorSetting.facebookPostFeedbackId, message, flyColorSetting.facebookPostId, option.fb_dtsg); 131 | } 132 | } 133 | catch(e) 134 | { 135 | console.log(e); 136 | } 137 | } 138 | 139 | async function getFeedbackId(request) 140 | { 141 | try 142 | { 143 | if(supportDomain.includes(document.domain)) 144 | { 145 | let { fb_dtsg } = request.actor; 146 | let form = new FormData(); 147 | form.append('fb_dtsg', fb_dtsg); 148 | let res = await axios.post(`https://www.facebook.com/${request.facebookPostId}`, form); 149 | return { 150 | data: JSON.stringify(res).split('feedbackTargetID')[1].split('"')[1].replace("\\",'') || null, 151 | message: 'Kết nối thành công', 152 | status: 'success' 153 | }; 154 | } 155 | return { 156 | data: null, 157 | message: 'Bạn đang không ở trong Facebook, xin vui lòng truy cập Facebook để thực hiện hành động này', 158 | status: 'danger' 159 | }; 160 | } 161 | catch(e) 162 | { 163 | return { 164 | data: null, 165 | message: 'Không thể kết nối đến bài viết này', 166 | status: 'danger' 167 | }; 168 | } 169 | } 170 | 171 | async function hasBanned(fb_dtsg, groupId, userId) 172 | { 173 | let form = new FormData(); 174 | form.append('fb_dtsg', fb_dtsg); 175 | form.append('fb_api_caller_class', 'RelayModern'); 176 | form.append('fb_api_req_friendly_name', 'GroupAdminActivityQueuePaginationContainerWrapperQuery'); 177 | form.append('variables', JSON.stringify({ 178 | 'groupID': groupId, 179 | 'filters': {} 180 | })); 181 | form.append('doc_id', 2985696198190516); 182 | let { data } = await axios.post('https://www.facebook.com/api/graphql/', form); 183 | let memberBlockedLists = []; 184 | data.data.group.group_admin_activity.edges.forEach((item, key) => { 185 | if(item.node.activity_title.ranges[1] && typeof(item.node.activity_title.ranges[1].entity) !== 'undefined') memberBlockedLists = [item.node.activity_title.ranges[1].entity.id || null, ...memberBlockedLists]; 186 | }); 187 | memberBlockedLists = memberBlockedLists.filter((item) => item != null); 188 | return memberBlockedLists.includes(userId); 189 | } 190 | 191 | function createContextMenu() 192 | { 193 | document.addEventListener('contextmenu', event => { 194 | 195 | let target = { 196 | userId: '', 197 | userName: '', 198 | groupName: '', 199 | groupId: '' 200 | }; 201 | 202 | try { 203 | target.userId = event.target.getAttribute('data-hovercard').match(/\d+/g)[0] || null; 204 | target.userName = event.target.innerText || null; 205 | let groupCard = event.target.parentElement.querySelectorAll('[data-hovercard]'); 206 | if(groupCard.length == 2) 207 | { 208 | if(groupCard[0].getAttribute('data-hovercard').includes('&extragetparams={"directed_target_id"')) 209 | { 210 | target.groupName = document.URL.includes('/groups/') ? document.title : ''; 211 | target.groupId = groupCard[0].getAttribute('data-hovercard').match(/\d+/g)[1]; 212 | } 213 | else 214 | { 215 | target.groupName = groupCard[1].innerText || ''; 216 | target.groupId = groupCard[1].dataset.hovercard.match(/\d+/g)[0] || ''; 217 | } 218 | } 219 | else if(event.target.getAttribute('ajaxify') != null) 220 | { 221 | target.groupName = document.URL.includes('/groups/') ? document.title : ''; 222 | target.groupId = event.target.getAttribute('ajaxify').match(/\d+/g)[0] || ''; 223 | } 224 | else if(event.target.getAttribute('data-hovercard').includes('directed_target_id')) 225 | { 226 | target.groupName = document.URL.includes('/groups/') ? document.title : ''; 227 | target.groupId = event.target.getAttribute('data-hovercard').match(/\d+/g)[1] || ''; 228 | } 229 | chrome.runtime.sendMessage({ 230 | action: SET_SELECTED_ELEMENT, 231 | payload: JSON.stringify(target) 232 | }); 233 | } catch(e) { 234 | console.log(e); 235 | chrome.runtime.sendMessage({ 236 | action: SET_SELECTED_ELEMENT, 237 | payload: JSON.stringify(target) 238 | }); 239 | } 240 | }, true); 241 | } 242 | 243 | async function broadcastMessage(data, isGroup = false) 244 | { 245 | let form = new FormData(); 246 | let randomId = Math.floor(Math.random()*1000); 247 | form.append('fb_dtsg', data.fb_dtsg); 248 | form.append('client', 'mercury'); 249 | form.append('action_type', 'ma-type:user-generated-message'); 250 | if(data.message) 251 | { 252 | form.append('body', data.message); 253 | } 254 | form.append('ephemeral_ttl_mode', 0); 255 | form.append('sticker_id', data.sticker_id); 256 | form.append('has_attachment', data.has_attachment); 257 | form.append('message_id', parseInt(data.id) + randomId); 258 | form.append('offline_threading_id', parseInt(data.id) + randomId); 259 | form.append('signature_id', '52a4388e'); 260 | form.append('source', 'source:chat:web'); 261 | if(isGroup) 262 | { 263 | form.append('thread_fbid', data.thread_fbid); 264 | form.append('__user', data.my_id); 265 | form.append('tags[0]', 'web:trigger:fb_header_dock:loaded_from_browser_cookie'); 266 | } 267 | else 268 | { 269 | form.append('other_user_fbid', data.other_user_fbid); 270 | form.append('specific_to_list[0]', `fbid:${data.other_user_fbid}`); 271 | form.append('specific_to_list[1]', `fbid:${data.my_id}`); 272 | form.append('tags[0]', 'web:trigger:fb_header_dock:jewel_thread'); 273 | } 274 | form.append('timestamp', new Date().getTime()); 275 | form.append('ui_push_phase', 'C3'); 276 | await axios.post(`https://www.facebook.com/messaging/send/`, form); 277 | } 278 | 279 | const delay = ms => new Promise(resolve => setTimeout(resolve, ms));; 280 | -------------------------------------------------------------------------------- /assets/js/axios.min.js: -------------------------------------------------------------------------------- 1 | /* axios v0.19.2 | (c) 2020 by Matt Zabriskie */ 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new s(e),n=i(s.prototype.request,t);return o.extend(n,s.prototype,t),o.extend(n,t),n}var o=n(2),i=n(3),s=n(4),a=n(22),u=n(10),c=r(u);c.Axios=s,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===j.call(e)}function o(e){return"undefined"==typeof e}function i(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function s(e){return"[object ArrayBuffer]"===j.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){return"[object Date]"===j.call(e)}function l(e){return"[object File]"===j.call(e)}function h(e){return"[object Blob]"===j.call(e)}function m(e){return"[object Function]"===j.call(e)}function y(e){return p(e)&&m(e.pipe)}function g(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function v(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function x(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function w(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(e){u.headers[e]={}}),i.forEach(["post","put","patch"],function(e){u.headers[e]=i.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),i=n(5),s=n(16),a=n(19),u=n(20),c=n(14);e.exports=function(e){return new Promise(function(t,f){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password||"";d.Authorization="Basic "+btoa(h+":"+m)}var y=s(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),i(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in l?a(l.getAllResponseHeaders()):null,r=e.responseType&&"text"!==e.responseType?l.response:l.responseText,i={data:r,status:l.status,statusText:l.statusText,headers:n,config:e,request:l};o(t,f,i),l=null}},l.onabort=function(){l&&(f(c("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){f(c("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),f(c(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=n(21),v=(e.withCredentials||u(y))&&e.xsrfCookieName?g.read(e.xsrfCookieName):void 0;v&&(d[e.xsrfHeaderName]=v)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),f(e),l=null)}),void 0===p&&(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;!o||o(n.status)?e(n):t(r("Request failed with status code "+n.status,n.config,null,n.request,n))}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,i){var s=new Error(e);return r(s,t,n,o,i)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(17),o=n(18);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,s={};return e?(r.forEach(e.split("\n"),function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?s[t]=(s[t]?s[t]:[]).concat([n]):s[t]=s[t]?s[t]+", "+n:n}}),s):s}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(i)&&a.push("domain="+i),s===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){t=t||{};var n={},o=["url","method","params","data"],i=["headers","auth","proxy"],s=["baseURL","url","transformRequest","transformResponse","paramsSerializer","timeout","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","maxContentLength","validateStatus","maxRedirects","httpAgent","httpsAgent","cancelToken","socketPath"];r.forEach(o,function(e){"undefined"!=typeof t[e]&&(n[e]=t[e])}),r.forEach(i,function(o){r.isObject(t[o])?n[o]=r.deepMerge(e[o],t[o]):"undefined"!=typeof t[o]?n[o]=t[o]:r.isObject(e[o])?n[o]=r.deepMerge(e[o]):"undefined"!=typeof e[o]&&(n[o]=e[o])}),r.forEach(s,function(r){"undefined"!=typeof t[r]?n[r]=t[r]:"undefined"!=typeof e[r]&&(n[r]=e[r])});var a=o.concat(i).concat(s),u=Object.keys(t).filter(function(e){return a.indexOf(e)===-1});return r.forEach(u,function(r){"undefined"!=typeof t[r]?n[r]=t[r]:"undefined"!=typeof e[r]&&(n[r]=e[r])}),n}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}}])}); 3 | //# sourceMappingURL=axios.min.map -------------------------------------------------------------------------------- /core/main.js: -------------------------------------------------------------------------------- 1 | chrome.runtime.onMessage.addListener(async (request, sender, callback) => { 2 | switch(request.action) 3 | { 4 | case INIT_APP: 5 | createContextMenu(); 6 | if (chrome.webRequest.onBeforeRequest.hasListener(blockRequest)) { 7 | chrome.webRequest.onBeforeRequest.removeListener(blockRequest); 8 | } 9 | try { 10 | chrome.webRequest.onBeforeRequest.addListener(blockRequest, { 11 | urls: [''] 12 | }, ['blocking', 'requestBody']); 13 | } catch(e) { 14 | console.log(e); 15 | } 16 | break; 17 | case SET_SELECTED_ELEMENT: 18 | sessionStorage.setItem('targetSelected', request.payload); 19 | break; 20 | case 'SET_DEAD_BADGE': 21 | let currentDead = parseInt(localStorage.getItem('dead')) || 0; 22 | localStorage.setItem('dead', ++currentDead); 23 | setDeadBadge(); 24 | break; 25 | } 26 | 27 | function createContextMenu() 28 | { 29 | if(!sessionStorage.getItem('isMenuCreated')) 30 | { 31 | chrome.contextMenus.create({ 32 | title: 'Block this user', 33 | contexts:['all'], 34 | onclick: banUser 35 | }); 36 | sessionStorage.setItem('isMenuCreated', true); 37 | } 38 | } 39 | 40 | function blockRequest(details) { 41 | try { 42 | let currentBlocking = localStorage.getItem('blocked') || ''; 43 | details.url = details.url.split('?') ? details.url.split('?')[0] : details.url; 44 | if(details.url.includes('https://www.facebook.com/api/graphql/') && details.method == 'POST') 45 | { 46 | if(details.requestBody.formData.fb_api_req_friendly_name && currentBlocking.split(',').includes(String(details.requestBody.formData.fb_api_req_friendly_name))) 47 | { 48 | return { 49 | cancel: true 50 | }; 51 | } 52 | } 53 | else if(currentBlocking && currentBlocking.split(',').includes(details.url)) 54 | { 55 | return { 56 | cancel: true 57 | }; 58 | } 59 | return { 60 | cancel: false 61 | } 62 | } 63 | catch(e) { 64 | console.log(e); 65 | } 66 | } 67 | 68 | function createMessageBox(message, status, time) 69 | { 70 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 71 | chrome.tabs.sendMessage(tabs[0].id || null, {action: 'CREATE_MESSAGE_BOX',message, status, time}); 72 | }); 73 | } 74 | 75 | function setDeadBadge() 76 | { 77 | let flyColorSetting = JSON.parse(localStorage.getItem('flyColorSetting')) || { 78 | showDeadBadge: true 79 | }; 80 | let currentDead = parseInt(localStorage.getItem('dead')) || 0; 81 | let text = flyColorSetting.showDeadBadge ? `${currentDead}` : ''; 82 | chrome.browserAction.setBadgeText({text}); 83 | } 84 | 85 | setDeadBadge(); 86 | 87 | async function banUser(info, tab) { 88 | try 89 | { 90 | let flyColorSetting = JSON.parse(localStorage.getItem('flyColorSetting')); 91 | let actor = JSON.parse(localStorage.getItem('actor')); 92 | let targetSelected = JSON.parse(sessionStorage.getItem('targetSelected')); 93 | if(flyColorSetting !== null && actor !== null && targetSelected !== null) 94 | { 95 | let groupId = flyColorSetting.multipleGroups ? targetSelected.groupId : parseInt(flyColorSetting.groupId); 96 | flyColorSetting.ignoreMemberId = flyColorSetting.ignoreMemberId || ''; 97 | if(flyColorSetting.ignoreMemberId.length == 0 || !flyColorSetting.ignoreMemberId.split("\n").includes(targetSelected.userId)) 98 | { 99 | if(groupId && targetSelected.userId != targetSelected.groupId) 100 | { 101 | if(confirm(`Xóa ${targetSelected.userName} khỏi nhóm ${targetSelected.groupName}?`)) 102 | { 103 | let option = { 104 | fb_dtsg_ag: actor.fb_dtsg, 105 | fb_dtsg: actor.fb_dtsg, 106 | confirmed: true 107 | } 108 | option.block_user = flyColorSetting.banForever ? confirm(`[ Tùy Chọn ] Chặn ${targetSelected.userName} vĩnh viễn khỏi nhóm ${targetSelected.groupName}?`) : null; 109 | let reason = flyColorSetting.showReason ? prompt('Lí do?') : ''; 110 | let message = flyColorSetting.message.replace('{{ name }}', targetSelected.userName).replace('{{ uid }}', targetSelected.userId).replace('{{ reason }}', reason || ''); 111 | let payload = { message, targetSelected, groupId, option, flyColorSetting, actor }; 112 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 113 | chrome.tabs.sendMessage(tabs[0].id || null, {action: 'BAN_USER', payload}); 114 | }); 115 | } 116 | return; 117 | } 118 | return createMessageBox('Không tìm thấy nhóm, xin vui lòng thử lại', 'error'); 119 | } 120 | return createMessageBox('Người này nằm trong danh sách bất tử, không thể block', 'warning'); 121 | } 122 | createMessageBox('Vui lòng cấu hình Dead Click trước khi thực hiện hành động này', 'warning'); 123 | } 124 | catch(e) 125 | { 126 | console.log(e); 127 | createMessageBox('Đã có lỗi xảy ra, xin vui lòng thử lại', 'error'); 128 | } 129 | } 130 | }); 131 | 132 | chrome.webRequest.onBeforeSendHeaders.addListener(details => { 133 | const headersRequest = details.requestHeaders; 134 | const a = headersRequest.findIndex(e => 'origin' === e.name) 135 | return -1 === a ? headersRequest.push({name: 'origin', value: 'https://www.facebook.com'}) : headersRequest[a].value = 'https://www.facebook.com', {requestHeaders: headersRequest} 136 | }, { 137 | urls: ['https://www.facebook.com/messaging/send/', 'https://www.facebook.com/api/graphql'] 138 | },['blocking', 'requestHeaders', 'extraHeaders']); 139 | 140 | registerExternalMessageListener(); 141 | 142 | function registerExternalMessageListener() 143 | { 144 | chrome.runtime.onMessageExternal.addListener(async (request, sender, sendResponse) => { 145 | 146 | let actor = JSON.parse(localStorage.getItem('actor')); 147 | let setting = JSON.parse(localStorage.getItem('autoRepMessage')); 148 | const defaultCommand = ['count']; 149 | 150 | if(request.getPersistedMessages) 151 | { 152 | getPersistedMessages(messages => { 153 | sendResponse(messages); 154 | }); 155 | } 156 | if(request.receivedMessages) 157 | { 158 | setReceivedMessages(request.receivedMessages); 159 | } 160 | if(request.removedMessages) 161 | { 162 | setRemovedMessages(request.removedMessages); 163 | } 164 | if(request.lastPurgeTime) 165 | { 166 | setLastPurgeTime(request.lastPurgeTime); 167 | } 168 | if(request.action == 'AUTO_REP_MESSAGE') 169 | { 170 | console.log(request); 171 | await delay(setting.delay * 1000); 172 | if(defaultCommand.includes(request.message.body.toLowerCase())) 173 | { 174 | await loadCommandMessage(); 175 | } 176 | else if(setting.status && (request.message.thread_id.split(':')[0] != 'thread' || setting.repInGroup) && (setting.noRepInFacebook != sender.tab.active || !setting.noRepInFacebook)) 177 | { 178 | await loadAutobotMessage(); 179 | } 180 | } 181 | 182 | async function loadAutobotMessage() 183 | { 184 | let messageBody = setting.message; 185 | if(request.message.thread_id.split(':')[0] != 'thread') 186 | { 187 | let { data } = await axios.get(`https://graph.facebook.com/${request.message.other_user_fbid}/?access_token=${actor.token}`); 188 | messageBody = messageBody.replace('{{ name }}', data.name).replace('{{ id }}', data.id); 189 | } 190 | let apiKeys = setting.simsimiApi.split('\n'); 191 | if(setting.chatbotMode) 192 | { 193 | let { data } = await axios.post('https://wsapi.simsimi.com/190410/talk/', { 194 | lang: 'vi', 195 | utext: request.message.body 196 | }, { 197 | headers: { 198 | 'x-api-key': apiKeys[Math.round(Math.random(0, apiKeys.length - 1))] 199 | } 200 | }); 201 | let replaceMessages = { 202 | 'simsimi': actor.name, 203 | 'Simsimi': actor.name, 204 | 'SimSimi': actor.name, 205 | }; 206 | for(let i of Object.keys(replaceMessages)) 207 | { 208 | data.atext = data.atext.replace(i, replaceMessages[i]); 209 | } 210 | messageBody = setting.botSign + data.atext.replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, ''); 211 | } 212 | await broadcastMessage({ 213 | fb_dtsg: actor.fb_dtsg, 214 | message: setting.useSticker && !setting.chatbotMode ? null : messageBody, 215 | has_attachment: setting.useSticker && !setting.chatbotMode, 216 | id: request.message.offline_threading_id, 217 | sticker_id: setting.useSticker && !setting.chatbotMode ? setting.stickerId : null, 218 | other_user_fbid: request.message.other_user_fbid, 219 | my_id: actor.id, 220 | thread_fbid: request.message.thread_fbid, 221 | }, setting.repInGroup); 222 | chrome.notifications.create(`${Math.floor(Math.random() * 99999)}`, { 223 | type: 'basic', 224 | title: 'Thông Báo', 225 | message: `Hệ thống đã tự động trả lời tin nhắn của ${(typeof(data) != 'undefined' ? data.name : '???')}`, 226 | iconUrl: chrome.runtime.getURL('assets/images/icon.png') 227 | }); 228 | } 229 | async function loadCommandMessage() 230 | { 231 | switch(request.message.body.toLowerCase()) 232 | { 233 | case 'count': 234 | let form = new FormData(); 235 | form.append('fb_dtsg', actor.fb_dtsg); 236 | form.append('q', 'viewer(){message_threads{nodes{thread_key{thread_fbid,other_user_id},all_participants{nodes{messaging_actor{name,gender,profile_picture}}},messages_count,name,image,thread_type}}}'); 237 | let { data } = await axios.post('https://www.facebook.com/api/graphql', form); 238 | let participant = data.viewer.message_threads.nodes.filter(item => item.thread_key.other_user_id == request.message.other_user_fbid)[0]; 239 | let message = `Thống kê tin nhắn : ${participant.messages_count.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')} tin nhắn`; 240 | if(participant.thread_type == "GROUP") 241 | { 242 | await broadcastMessage({ 243 | fb_dtsg: actor.fb_dtsg, 244 | message, 245 | has_attachment: false, 246 | id: request.message.offline_threading_id, 247 | other_user_fbid: request.threadId.match(/\d+/g)[0], 248 | sticker_id: null, 249 | my_id: actor.id, 250 | thread_fbid: request.message.thread_fbid, 251 | }, true); 252 | return; 253 | } 254 | await broadcastMessage({ 255 | fb_dtsg: actor.fb_dtsg, 256 | message, 257 | has_attachment: false, 258 | id: request.message.offline_threading_id, 259 | other_user_fbid: request.threadId.match(/\d+/g)[0], 260 | sticker_id: null, 261 | my_id: actor.id, 262 | }); 263 | break; 264 | } 265 | } 266 | return true; 267 | }); 268 | } 269 | 270 | function getPersistedMessages(callback) 271 | { 272 | chrome.storage.local.get(['receivedMessages', 'removedMessages', 'lastPurgeTime'], function (result) { 273 | callback(result); 274 | }); 275 | } 276 | 277 | function setReceivedMessages(messages) 278 | { 279 | chrome.storage.local.set({ 280 | 'receivedMessages': messages 281 | }); 282 | } 283 | 284 | function setRemovedMessages(messages) 285 | { 286 | chrome.storage.local.set({ 287 | 'removedMessages': messages 288 | }); 289 | } 290 | 291 | function setLastPurgeTime(timestamp) 292 | { 293 | chrome.storage.local.set({ 294 | 'lastPurgeTime': timestamp 295 | }); 296 | } -------------------------------------------------------------------------------- /popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Lê Quang Vỹ | Facebook Incognito 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |

Đang tải dữ liệu...

23 |
24 |
25 | 43 |
44 |
45 | {{ alert.message }} 46 |
47 | 207 |
208 |
209 |
210 | 211 | 212 | 213 | 214 | 215 | -------------------------------------------------------------------------------- /core/handle.js: -------------------------------------------------------------------------------- 1 | let vm = new Vue({ 2 | el: '#app', 3 | data: { 4 | loading: false, 5 | currentTab: 'feature', 6 | tabs: [ 7 | { 8 | title: 'Tùy Chọn', 9 | name: 'feature', 10 | icon: 'fas fa-sliders-h', 11 | auth: false, 12 | showInPopup: true, 13 | showInOption: true 14 | }, 15 | { 16 | title: 'Dead Click', 17 | name: 'fly-color', 18 | icon: 'fas fa-mouse-pointer', 19 | auth: true, 20 | showInPopup: true, 21 | showInOption: false 22 | }, 23 | { 24 | title: 'Tin Nhắn Đã Gỡ', 25 | name: 'unseen-recall-message', 26 | icon: 'fas fa-mouse-pointer', 27 | auth: true, 28 | showInPopup: true, 29 | showInOption: true 30 | }, 31 | { 32 | title: 'Auto Rep Tin Nhắn', 33 | name: 'auto-rep-message', 34 | icon: 'fas fa-mouse-pointer', 35 | auth: true, 36 | showInPopup: true, 37 | showInOption: true 38 | }, 39 | { 40 | title: 'Auto Cảm Xúc', 41 | name: 'auto-reaction', 42 | icon: 'fas fa-smile', 43 | auth: true, 44 | showInPopup: false, 45 | showInOption: true 46 | }, 47 | { 48 | title: 'Cá Nhân', 49 | name: 'profile', 50 | icon: 'fas fa-user', 51 | auth: true, 52 | showInPopup: true, 53 | showInOption: true 54 | }, 55 | { 56 | title: 'Giới Thiệu', 57 | name: 'about', 58 | icon: 'fas fa-info-circle', 59 | auth: false, 60 | showInPopup: false, 61 | showInOption: true 62 | } 63 | ], 64 | features: 65 | { 66 | blockSeenChat: { 67 | text: "Chặn Đã Xem Trong Chat", 68 | status: false, 69 | api: "https://www.facebook.com/ajax/mercury/change_read_status.php", 70 | }, 71 | blockTypingChat: { 72 | text: "Chặn Đang Nhập Trong Chat", 73 | status: false, 74 | api: "https://www.facebook.com/ajax/messaging/typ.php", 75 | }, 76 | blockReceiveMessage: { 77 | text: "Ẩn Hoạt Động Trong Chat", 78 | status: false, 79 | api: "https://www.facebook.com/ajax/mercury/delivery_receipts.php", 80 | }, 81 | blockNotification: { 82 | text: "Đánh Dấu Thông Báo Là Chưa Đọc", 83 | status: false, 84 | api: "https://www.facebook.com/ajax/notifications/mark_read.php", 85 | }, 86 | blockSeenStory: { 87 | text: "Chặn Đã Xem Trong Story", 88 | status: false, 89 | api: "storiesUpdateSeenStateMutation", 90 | }, 91 | blockTypingComment: { 92 | text: "Chặn Đang Nhập Trong Bình Luận", 93 | status: false, 94 | api: "UFI2LiveTypingBroadcastMutation_StartMutation" 95 | }, 96 | stopTimeline: { 97 | text: "Tạm Dừng Newsfeed Timeline", 98 | status: false, 99 | api: "https://www.facebook.com/ajax/pagelet/generic.php/LitestandTailLoadPagelet" 100 | } 101 | }, 102 | blocked: [], 103 | flyColor: { 104 | multipleGroups: false, 105 | groupId: null, 106 | discordHook: null, 107 | facebookPostId: null, 108 | facebookPostFeedbackId: null, 109 | message: 'Blocked : {{ name }} | UID : {{ uid }} | Lí do : {{ reason }}', 110 | ignoreMemberId: null, 111 | showReason: true, 112 | banForever: false, 113 | showNotiSetting: false, 114 | showDeadBadge: true, 115 | }, 116 | alert: { 117 | status: null, 118 | show: false, 119 | message: null 120 | }, 121 | actor: { 122 | cookie: null, 123 | fb_dtsg: null, 124 | id: null, 125 | token: null, 126 | name: null 127 | }, 128 | autoReaction: { 129 | type: [], 130 | list: [], 131 | status: false, 132 | sleep: 5 133 | }, 134 | removedMessages: [], 135 | currentCoversation: 0, 136 | autoRepMessage: { 137 | status: false, 138 | message: 'Chào {{ name }} - ID {{ id }}', 139 | botSign: '[ Tin nhắn tự động ]', 140 | stickerId: null, 141 | useSticker: false, 142 | repInGroup: false, 143 | noRepInFacebook: true, 144 | delay: 5, 145 | chatbotMode: false, 146 | simsimiApi: null, 147 | stickers: [ 148 | { 149 | id: 422818978354350, 150 | url: 'https://i.imgur.com/8rPRf07.png', 151 | size: 220 152 | }, 153 | { 154 | id: 1330354290487829, 155 | url: 'https://i.imgur.com/hxBvnJ2.png', 156 | size: 340 157 | } 158 | ] 159 | } 160 | }, 161 | computed: { 162 | actorHasSet() 163 | { 164 | let keys = ['cookie', 'fb_dtsg', 'id', 'name']; 165 | return keys.filter((key) => { 166 | return this.actor[key] != null; 167 | }).length == keys.length; 168 | } 169 | }, 170 | async mounted() 171 | { 172 | this.setFeature(); 173 | this.setFlyColor(); 174 | this.setAutoReaction(); 175 | this.setAutoRepMessage(); 176 | await this.setActor(); 177 | this.renderUnseenRecallMessage(); 178 | }, 179 | methods: { 180 | setFeature() 181 | { 182 | let blocked = localStorage.getItem('blocked'); 183 | if(blocked) 184 | { 185 | this.blocked = blocked.split(','); 186 | this.setBlocking(); 187 | let properties = ['blockSeenChat', 'blockTypingChat', 'blockReceiveMessage', 'blockNotification', 'blockSeenStory', 'stopTimeline', 'blockTypingComment']; 188 | properties.forEach((item, key) => { 189 | this.checkStatus(this.features[item]); 190 | }); 191 | } 192 | }, 193 | async setActor() 194 | { 195 | this.loading = true; 196 | try 197 | { 198 | if(!sessionStorage.getItem('actorIsSet')) 199 | { 200 | var cookie; 201 | chrome.cookies.getAll({domain: 'facebook.com'}, (cookies) => { 202 | cookie = cookies.reduce((cookie, cookieValue)=> cookie += `${cookieValue.name}=${cookieValue.value}; `, ''); 203 | }); 204 | let { token, fb_dtsg, name, id } = await this.getUserDetail(); 205 | localStorage.setItem('actor', JSON.stringify({cookie, token, fb_dtsg, name, id})); 206 | sessionStorage.setItem('actorIsSet', true); 207 | } 208 | this.actor = JSON.parse(localStorage.getItem('actor')) || this.actor; 209 | } 210 | catch(e) 211 | { 212 | this.showAlert('Không có dữ liệu, hãy chắc rằng bạn đã đăng nhập trên Facebook', 'danger'); 213 | } 214 | this.loading = false; 215 | }, 216 | async getUserDetail() 217 | { 218 | let { data } = await axios.get('https://m.facebook.com/composer/ocelot/async_loader/?publisher=feed&hc_location=ufi'); 219 | data = JSON.stringify(data); 220 | let user = { 221 | token: data.split('accessToken')[1].split('\\\\\\":\\\\\\"')[1].split('\\\\\\"')[0], 222 | fb_dtsg: data.split('fb_dtsg')[1].split('\\\\\\" value=\\\\\\"')[1].split('\\\\\\"')[0], 223 | } 224 | let { data: {name, id} } = await axios.get(`https://graph.facebook.com/me/?access_token=${user.token}`); 225 | user.name = name; 226 | user.id = id; 227 | return user; 228 | }, 229 | handleStatus(data) 230 | { 231 | let { status, api } = data; 232 | if(status) 233 | { 234 | if(!this.blocked.includes(api)) 235 | { 236 | this.blocked.push(api); 237 | } 238 | return this.setBlocking(); 239 | } 240 | this.removeBlocked(api); 241 | return this.setBlocking(); 242 | }, 243 | checkStatus(data) 244 | { 245 | data.status = this.blocked.includes(data.api); 246 | }, 247 | removeBlocked(api) 248 | { 249 | return this.blocked.filter((item, key) => { 250 | if(item == api) 251 | { 252 | this.blocked.splice(key, 1); 253 | } 254 | }); 255 | }, 256 | setBlocking() 257 | { 258 | localStorage.setItem('blocked', this.blocked); 259 | }, 260 | updateFlyColor() 261 | { 262 | localStorage.setItem('flyColorSetting', JSON.stringify(this.flyColor)); 263 | this.showAlert('Cập nhật thành công', 'success'); 264 | }, 265 | updateAutoRepMessage() 266 | { 267 | if(this.autoRepMessage.useSticker && this.autoRepMessage.stickerId == null) 268 | { 269 | this.showAlert('Bạn chưa chọn nhãn dán', 'danger'); 270 | return; 271 | } 272 | if(!this.autoRepMessage.useSticker && (!this.autoRepMessage.message.trim() || this.autoRepMessage.message == "")) 273 | { 274 | this.showAlert('Bạn chưa nhập tin nhắn', 'danger'); 275 | return; 276 | } 277 | if(this.autoRepMessage.chatbotMode && (!this.autoRepMessage.simsimiApi.trim() || this.autoRepMessage.simsimiApi == "")) 278 | { 279 | this.showAlert('Bạn chưa nhập Api Key', 'danger'); 280 | return; 281 | } 282 | if(this.autoRepMessage.delay < 0) 283 | { 284 | this.showAlert('Thời gian delay không thể nhỏ hơn 0', 'danger'); 285 | return; 286 | } 287 | localStorage.setItem('autoRepMessage', JSON.stringify(this.autoRepMessage)); 288 | this.showAlert('Cập nhật thành công', 'success'); 289 | }, 290 | setFlyColor() 291 | { 292 | this.flyColor = JSON.parse(localStorage.getItem('flyColorSetting')) || this.flyColor; 293 | this.flyColor.showNotiSetting = false; 294 | }, 295 | setAutoRepMessage() 296 | { 297 | const stickers = this.autoRepMessage.stickers; 298 | this.autoRepMessage = JSON.parse(localStorage.getItem('autoRepMessage')) || this.autoRepMessage; 299 | this.autoRepMessage.stickers = stickers; 300 | }, 301 | updateAutoReaction() 302 | { 303 | localStorage.setItem('autoReaction', JSON.stringify(this.autoReaction)); 304 | if(this.autoReaction.status) 305 | { 306 | this.runAutoReaction(); 307 | } 308 | this.showAlert('Cập nhật thành công', 'success'); 309 | }, 310 | 311 | setAutoReaction() 312 | { 313 | this.autoReaction = JSON.parse(localStorage.getItem('autoReaction')) || this.autoReaction; 314 | }, 315 | 316 | connectToFacebook() 317 | { 318 | this.loading = true; 319 | let actor = this.actor; 320 | const self = this; 321 | chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 322 | chrome.tabs.sendMessage(tabs[0].id || null, {action: 'CONNECT_TO_FACEBOOK', actor, facebookPostId: self.flyColor.facebookPostId}); 323 | }); 324 | }, 325 | connectToFacebookCallback(payload) 326 | { 327 | this.loading = false; 328 | let { message, data, status } = JSON.parse(payload); 329 | if(!data) this.flyColor.facebookPostId = null; 330 | this.flyColor.facebookPostFeedbackId = data; 331 | this.showAlert(message, status); 332 | }, 333 | async connectToDiscord() 334 | { 335 | this.loading = true; 336 | try 337 | { 338 | if(this.flyColor.discordHook.trim()) 339 | { 340 | let { data } = await axios.get(`${this.flyColor.discordHook}`); 341 | this.showAlert(`Kết nối đến Discord Webhook - ${data.name} thành công`, 'success'); 342 | } 343 | } 344 | catch(e) 345 | { 346 | this.flyColor.discordHook = null; 347 | this.showAlert('Không thể kết nối đến Discord Webhook', 'danger'); 348 | } 349 | this.loading = false; 350 | }, 351 | 352 | showAlert(message, status, time = 10000) 353 | { 354 | this.alert = { 355 | show: true, 356 | message, 357 | status 358 | }; 359 | document.body.scrollTop = 0; 360 | document.documentElement.scrollTop = 0; 361 | setTimeout(() => { 362 | this.alert.show = false; 363 | }, time); 364 | }, 365 | logout() 366 | { 367 | localStorage.setItem('actor', null); 368 | this.actor = {}; 369 | }, 370 | loadUnseenRecallMessage(callback) 371 | { 372 | const self = this; 373 | chrome.storage.local.get('removedMessages', async function (result) { 374 | if(result.removedMessages) 375 | { 376 | let removedMessages = Object.values(JSON.parse(result.removedMessages)); 377 | let conversations = []; 378 | let user = {}; 379 | self.loading = true; 380 | for(let i in removedMessages) 381 | { 382 | let threadId = removedMessages[i].author; 383 | if(!conversations.hasOwnProperty(threadId)) 384 | { 385 | let { data } = await axios.get(`https://graph.facebook.com/${removedMessages[i].author.match(/\d+/g)[0]}?access_token=${self.actor.token}`); 386 | user = data; 387 | } 388 | conversations[threadId] = !conversations[threadId] ? [] : conversations[threadId]; 389 | conversations[threadId].message = !conversations[threadId].message ? [] : conversations[threadId].message; 390 | conversations[threadId].user = user; 391 | let message = []; 392 | if(removedMessages[i].has_attachment) 393 | { 394 | for(let j in removedMessages[i].attachments) 395 | { 396 | let attachment = removedMessages[i].attachments[j]; 397 | switch(attachment.attach_type) 398 | { 399 | case 'sticker': 400 | message.push({ 401 | message: ``, 402 | url: attachment.url 403 | }); 404 | break; 405 | case 'animated_image': 406 | case 'photo': 407 | message.push({ 408 | message: ``, 409 | url: attachment.preview_url 410 | }); 411 | break; 412 | } 413 | } 414 | } 415 | else 416 | { 417 | message = { 418 | message: removedMessages[i].body 419 | }; 420 | } 421 | message.time = removedMessages[i].timestamp; 422 | conversations[threadId].message.push(message); 423 | } 424 | self.loading = false; 425 | callback(conversations); 426 | } 427 | }); 428 | }, 429 | renderUnseenRecallMessage() 430 | { 431 | this.loadUnseenRecallMessage((data) => { 432 | this.removedMessages = Object.values(data).reverse(); 433 | }); 434 | }, 435 | deleteAllConversations() { 436 | if(confirm('Xóa tất cả tin nhắn?')) { 437 | chrome.storage.local.remove('removedMessages'); 438 | this.removedMessages = []; 439 | } 440 | } 441 | }, 442 | }); 443 | 444 | chrome.runtime.onMessage.addListener(async (request, sender, callback) => { 445 | switch(request.action) 446 | { 447 | case 'CONNECT_TO_FACEBOOK_CALLBACK': 448 | vm.connectToFacebookCallback(request.payload); 449 | break; 450 | } 451 | }); 452 | 453 | -------------------------------------------------------------------------------- /assets/js/vue.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Vue.js v2.6.11 3 | * (c) 2014-2019 Evan You 4 | * Released under the MIT License. 5 | */ 6 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Vue=t()}(this,function(){"use strict";var e=Object.freeze({});function t(e){return null==e}function n(e){return null!=e}function r(e){return!0===e}function i(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function o(e){return null!==e&&"object"==typeof e}var a=Object.prototype.toString;function s(e){return"[object Object]"===a.call(e)}function c(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function u(e){return n(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function l(e){return null==e?"":Array.isArray(e)||s(e)&&e.toString===a?JSON.stringify(e,null,2):String(e)}function f(e){var t=parseFloat(e);return isNaN(t)?e:t}function p(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i-1)return e.splice(n,1)}}var m=Object.prototype.hasOwnProperty;function y(e,t){return m.call(e,t)}function g(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var _=/-(\w)/g,b=g(function(e){return e.replace(_,function(e,t){return t?t.toUpperCase():""})}),$=g(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),w=/\B([A-Z])/g,C=g(function(e){return e.replace(w,"-$1").toLowerCase()});var x=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function k(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function A(e,t){for(var n in t)e[n]=t[n];return e}function O(e){for(var t={},n=0;n0,Z=J&&J.indexOf("edge/")>0,G=(J&&J.indexOf("android"),J&&/iphone|ipad|ipod|ios/.test(J)||"ios"===K),X=(J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J),J&&J.match(/firefox\/(\d+)/)),Y={}.watch,Q=!1;if(z)try{var ee={};Object.defineProperty(ee,"passive",{get:function(){Q=!0}}),window.addEventListener("test-passive",null,ee)}catch(e){}var te=function(){return void 0===B&&(B=!z&&!V&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),B},ne=z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function re(e){return"function"==typeof e&&/native code/.test(e.toString())}var ie,oe="undefined"!=typeof Symbol&&re(Symbol)&&"undefined"!=typeof Reflect&&re(Reflect.ownKeys);ie="undefined"!=typeof Set&&re(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ae=S,se=0,ce=function(){this.id=se++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){h(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t-1)if(o&&!y(i,"default"))a=!1;else if(""===a||a===C(e)){var c=Pe(String,i.type);(c<0||s0&&(st((u=e(u,(a||"")+"_"+c))[0])&&st(f)&&(s[l]=he(f.text+u[0].text),u.shift()),s.push.apply(s,u)):i(u)?st(f)?s[l]=he(f.text+u):""!==u&&s.push(he(u)):st(u)&&st(f)?s[l]=he(f.text+u.text):(r(o._isVList)&&n(u.tag)&&t(u.key)&&n(a)&&(u.key="__vlist"+a+"_"+c+"__"),s.push(u)));return s}(e):void 0}function st(e){return n(e)&&n(e.text)&&!1===e.isComment}function ct(e,t){if(e){for(var n=Object.create(null),r=oe?Reflect.ownKeys(e):Object.keys(e),i=0;i0,a=t?!!t.$stable:!o,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==e&&s===r.$key&&!o&&!r.$hasNormal)return r;for(var c in i={},t)t[c]&&"$"!==c[0]&&(i[c]=pt(n,c,t[c]))}else i={};for(var u in n)u in i||(i[u]=dt(n,u));return t&&Object.isExtensible(t)&&(t._normalized=i),R(i,"$stable",a),R(i,"$key",s),R(i,"$hasNormal",o),i}function pt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:at(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function dt(e,t){return function(){return e[t]}}function vt(e,t){var r,i,a,s,c;if(Array.isArray(e)||"string"==typeof e)for(r=new Array(e.length),i=0,a=e.length;idocument.createEvent("Event").timeStamp&&(sn=function(){return cn.now()})}function un(){var e,t;for(an=sn(),rn=!0,Qt.sort(function(e,t){return e.id-t.id}),on=0;onon&&Qt[n].id>e.id;)n--;Qt.splice(n+1,0,e)}else Qt.push(e);nn||(nn=!0,Ye(un))}}(this)},fn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||o(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Re(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},fn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},fn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},fn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||h(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var pn={enumerable:!0,configurable:!0,get:S,set:S};function dn(e,t,n){pn.get=function(){return this[t][n]},pn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,pn)}function vn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&$e(!1);var o=function(o){i.push(o);var a=Me(o,t,n,e);xe(r,o,a),o in e||dn(e,"_props",o)};for(var a in t)o(a);$e(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?S:x(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;s(t=e._data="function"==typeof t?function(e,t){le();try{return e.call(t,t)}catch(e){return Re(e,t,"data()"),{}}finally{fe()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];r&&y(r,o)||(a=void 0,36!==(a=(o+"").charCodeAt(0))&&95!==a&&dn(e,"_data",o))}var a;Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=te();for(var i in t){var o=t[i],a="function"==typeof o?o:o.get;r||(n[i]=new fn(e,a||S,S,hn)),i in e||mn(e,i,o)}}(e,t.computed),t.watch&&t.watch!==Y&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i-1:"string"==typeof e?e.split(",").indexOf(t)>-1:(n=e,"[object RegExp]"===a.call(n)&&e.test(t));var n}function An(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=xn(a.componentOptions);s&&!t(s)&&On(n,o,r,i)}}}function On(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,h(n,t)}!function(t){t.prototype._init=function(t){var n=this;n._uid=bn++,n._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(n,t):n.$options=De($n(n.constructor),t||{},n),n._renderProxy=n,n._self=n,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(n),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&qt(e,t)}(n),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,i=r&&r.context;t.$slots=ut(n._renderChildren,i),t.$scopedSlots=e,t._c=function(e,n,r,i){return Pt(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Pt(t,e,n,r,i,!0)};var o=r&&r.data;xe(t,"$attrs",o&&o.attrs||e,null,!0),xe(t,"$listeners",n._parentListeners||e,null,!0)}(n),Yt(n,"beforeCreate"),function(e){var t=ct(e.$options.inject,e);t&&($e(!1),Object.keys(t).forEach(function(n){xe(e,n,t[n])}),$e(!0))}(n),vn(n),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(n),Yt(n,"created"),n.$options.el&&n.$mount(n.$options.el)}}(wn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=ke,e.prototype.$delete=Ae,e.prototype.$watch=function(e,t,n){if(s(t))return _n(this,e,t,n);(n=n||{}).user=!0;var r=new fn(this,e,t,n);if(n.immediate)try{t.call(this,r.value)}catch(e){Re(e,this,'callback for immediate watcher "'+r.expression+'"')}return function(){r.teardown()}}}(wn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var i=0,o=e.length;i1?k(t):t;for(var n=k(arguments,1),r='event handler for "'+e+'"',i=0,o=t.length;iparseInt(this.max)&&On(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return F}};Object.defineProperty(e,"config",t),e.util={warn:ae,extend:A,mergeOptions:De,defineReactive:xe},e.set=ke,e.delete=Ae,e.nextTick=Ye,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),M.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,A(e.options.components,Tn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=k(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=De(this.options,e),this}}(e),Cn(e),function(e){M.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&s(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}(e)}(wn),Object.defineProperty(wn.prototype,"$isServer",{get:te}),Object.defineProperty(wn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(wn,"FunctionalRenderContext",{value:Tt}),wn.version="2.6.11";var En=p("style,class"),Nn=p("input,textarea,option,select,progress"),jn=function(e,t,n){return"value"===n&&Nn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Dn=p("contenteditable,draggable,spellcheck"),Ln=p("events,caret,typing,plaintext-only"),Mn=function(e,t){return Hn(t)||"false"===t?"false":"contenteditable"===e&&Ln(t)?t:"true"},In=p("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Fn="http://www.w3.org/1999/xlink",Pn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Rn=function(e){return Pn(e)?e.slice(6,e.length):""},Hn=function(e){return null==e||!1===e};function Bn(e){for(var t=e.data,r=e,i=e;n(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(t=Un(i.data,t));for(;n(r=r.parent);)r&&r.data&&(t=Un(t,r.data));return function(e,t){if(n(e)||n(t))return zn(e,Vn(t));return""}(t.staticClass,t.class)}function Un(e,t){return{staticClass:zn(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function zn(e,t){return e?t?e+" "+t:e:t||""}function Vn(e){return Array.isArray(e)?function(e){for(var t,r="",i=0,o=e.length;i-1?hr(e,t,n):In(t)?Hn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Dn(t)?e.setAttribute(t,Mn(t,n)):Pn(t)?Hn(n)?e.removeAttributeNS(Fn,Rn(t)):e.setAttributeNS(Fn,t,n):hr(e,t,n)}function hr(e,t,n){if(Hn(n))e.removeAttribute(t);else{if(q&&!W&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var mr={create:dr,update:dr};function yr(e,r){var i=r.elm,o=r.data,a=e.data;if(!(t(o.staticClass)&&t(o.class)&&(t(a)||t(a.staticClass)&&t(a.class)))){var s=Bn(r),c=i._transitionClasses;n(c)&&(s=zn(s,Vn(c))),s!==i._prevClass&&(i.setAttribute("class",s),i._prevClass=s)}}var gr,_r,br,$r,wr,Cr,xr={create:yr,update:yr},kr=/[\w).+\-_$\]]/;function Ar(e){var t,n,r,i,o,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r=0&&" "===(h=e.charAt(v));v--);h&&kr.test(h)||(u=!0)}}else void 0===i?(d=r+1,i=e.slice(0,r).trim()):m();function m(){(o||(o=[])).push(e.slice(d,r).trim()),d=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==d&&m(),o)for(r=0;r-1?{exp:e.slice(0,$r),key:'"'+e.slice($r+1)+'"'}:{exp:e,key:null};_r=e,$r=wr=Cr=0;for(;!zr();)Vr(br=Ur())?Jr(br):91===br&&Kr(br);return{exp:e.slice(0,wr),key:e.slice(wr+1,Cr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Ur(){return _r.charCodeAt(++$r)}function zr(){return $r>=gr}function Vr(e){return 34===e||39===e}function Kr(e){var t=1;for(wr=$r;!zr();)if(Vr(e=Ur()))Jr(e);else if(91===e&&t++,93===e&&t--,0===t){Cr=$r;break}}function Jr(e){for(var t=e;!zr()&&(e=Ur())!==t;);}var qr,Wr="__r",Zr="__c";function Gr(e,t,n){var r=qr;return function i(){null!==t.apply(null,arguments)&&Qr(e,i,n,r)}}var Xr=Ve&&!(X&&Number(X[1])<=53);function Yr(e,t,n,r){if(Xr){var i=an,o=t;t=o._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return o.apply(this,arguments)}}qr.addEventListener(e,t,Q?{capture:n,passive:r}:n)}function Qr(e,t,n,r){(r||qr).removeEventListener(e,t._wrapper||t,n)}function ei(e,r){if(!t(e.data.on)||!t(r.data.on)){var i=r.data.on||{},o=e.data.on||{};qr=r.elm,function(e){if(n(e[Wr])){var t=q?"change":"input";e[t]=[].concat(e[Wr],e[t]||[]),delete e[Wr]}n(e[Zr])&&(e.change=[].concat(e[Zr],e.change||[]),delete e[Zr])}(i),rt(i,o,Yr,Qr,Gr,r.context),qr=void 0}}var ti,ni={create:ei,update:ei};function ri(e,r){if(!t(e.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=e.data.domProps||{},c=r.data.domProps||{};for(i in n(c.__ob__)&&(c=r.data.domProps=A({},c)),s)i in c||(a[i]="");for(i in c){if(o=c[i],"textContent"===i||"innerHTML"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===i&&"PROGRESS"!==a.tagName){a._value=o;var u=t(o)?"":String(o);ii(a,u)&&(a.value=u)}else if("innerHTML"===i&&qn(a.tagName)&&t(a.innerHTML)){(ti=ti||document.createElement("div")).innerHTML=""+o+"";for(var l=ti.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(o!==s[i])try{a[i]=o}catch(e){}}}}function ii(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var r=e.value,i=e._vModifiers;if(n(i)){if(i.number)return f(r)!==f(t);if(i.trim)return r.trim()!==t.trim()}return r!==t}(e,t))}var oi={create:ri,update:ri},ai=g(function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach(function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t});function si(e){var t=ci(e.style);return e.staticStyle?A(e.staticStyle,t):t}function ci(e){return Array.isArray(e)?O(e):"string"==typeof e?ai(e):e}var ui,li=/^--/,fi=/\s*!important$/,pi=function(e,t,n){if(li.test(t))e.style.setProperty(t,n);else if(fi.test(n))e.style.setProperty(C(t),n.replace(fi,""),"important");else{var r=vi(t);if(Array.isArray(n))for(var i=0,o=n.length;i-1?t.split(yi).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function _i(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(yi).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function bi(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&A(t,$i(e.name||"v")),A(t,e),t}return"string"==typeof e?$i(e):void 0}}var $i=g(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}}),wi=z&&!W,Ci="transition",xi="animation",ki="transition",Ai="transitionend",Oi="animation",Si="animationend";wi&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ki="WebkitTransition",Ai="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Oi="WebkitAnimation",Si="webkitAnimationEnd"));var Ti=z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Ei(e){Ti(function(){Ti(e)})}function Ni(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),gi(e,t))}function ji(e,t){e._transitionClasses&&h(e._transitionClasses,t),_i(e,t)}function Di(e,t,n){var r=Mi(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Ci?Ai:Si,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c0&&(n=Ci,l=a,f=o.length):t===xi?u>0&&(n=xi,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Ci:xi:null)?n===Ci?o.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Ci&&Li.test(r[ki+"Property"])}}function Ii(e,t){for(;e.length1}function Ui(e,t){!0!==t.data.show&&Pi(t)}var zi=function(e){var o,a,s={},c=e.modules,u=e.nodeOps;for(o=0;ov?_(e,t(i[y+1])?null:i[y+1].elm,i,d,y,o):d>y&&$(r,p,v)}(p,h,y,o,l):n(y)?(n(e.text)&&u.setTextContent(p,""),_(p,null,y,0,y.length-1,o)):n(h)?$(h,0,h.length-1):n(e.text)&&u.setTextContent(p,""):e.text!==i.text&&u.setTextContent(p,i.text),n(v)&&n(d=v.hook)&&n(d=d.postpatch)&&d(e,i)}}}function k(e,t,i){if(r(i)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var o=0;o-1,a.selected!==o&&(a.selected=o);else if(N(Wi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function qi(e,t){return t.every(function(t){return!N(t,e)})}function Wi(e){return"_value"in e?e._value:e.value}function Zi(e){e.target.composing=!0}function Gi(e){e.target.composing&&(e.target.composing=!1,Xi(e.target,"input"))}function Xi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Yi(e){return!e.componentInstance||e.data&&e.data.transition?e:Yi(e.componentInstance._vnode)}var Qi={model:Vi,show:{bind:function(e,t,n){var r=t.value,i=(n=Yi(n)).data&&n.data.transition,o=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&i?(n.data.show=!0,Pi(n,function(){e.style.display=o})):e.style.display=r?o:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=Yi(n)).data&&n.data.transition?(n.data.show=!0,r?Pi(n,function(){e.style.display=e.__vOriginalDisplay}):Ri(n,function(){e.style.display="none"})):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},eo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function to(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?to(zt(t.children)):e}function no(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[b(o)]=i[o];return t}function ro(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var io=function(e){return e.tag||Ut(e)},oo=function(e){return"show"===e.name},ao={name:"transition",props:eo,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(io)).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var a=to(o);if(!a)return o;if(this._leaving)return ro(e,o);var s="__transition-"+this._uid+"-";a.key=null==a.key?a.isComment?s+"comment":s+a.tag:i(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=no(this),u=this._vnode,l=to(u);if(a.data.directives&&a.data.directives.some(oo)&&(a.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,l)&&!Ut(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=A({},c);if("out-in"===r)return this._leaving=!0,it(f,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),ro(e,o);if("in-out"===r){if(Ut(a))return u;var p,d=function(){p()};it(c,"afterEnter",d),it(c,"enterCancelled",d),it(f,"delayLeave",function(e){p=e})}}return o}}},so=A({tag:String,moveClass:String},eo);function co(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function uo(e){e.data.newPos=e.elm.getBoundingClientRect()}function lo(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete so.mode;var fo={Transition:ao,TransitionGroup:{props:so,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var i=Zt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=no(this),s=0;s-1?Gn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Gn[e]=/HTMLUnknownElement/.test(t.toString())},A(wn.options.directives,Qi),A(wn.options.components,fo),wn.prototype.__patch__=z?zi:S,wn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=ve),Yt(e,"beforeMount"),r=function(){e._update(e._render(),n)},new fn(e,r,S,{before:function(){e._isMounted&&!e._isDestroyed&&Yt(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,Yt(e,"mounted")),e}(this,e=e&&z?Yn(e):void 0,t)},z&&setTimeout(function(){F.devtools&&ne&&ne.emit("init",wn)},0);var po=/\{\{((?:.|\r?\n)+?)\}\}/g,vo=/[-.*+?^${}()|[\]\/\\]/g,ho=g(function(e){var t=e[0].replace(vo,"\\$&"),n=e[1].replace(vo,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")});var mo={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Fr(e,"class");n&&(e.staticClass=JSON.stringify(n));var r=Ir(e,"class",!1);r&&(e.classBinding=r)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var yo,go={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Fr(e,"style");n&&(e.staticStyle=JSON.stringify(ai(n)));var r=Ir(e,"style",!1);r&&(e.styleBinding=r)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},_o=function(e){return(yo=yo||document.createElement("div")).innerHTML=e,yo.textContent},bo=p("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),$o=p("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),wo=p("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),Co=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,xo=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ko="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+P.source+"]*",Ao="((?:"+ko+"\\:)?"+ko+")",Oo=new RegExp("^<"+Ao),So=/^\s*(\/?)>/,To=new RegExp("^<\\/"+Ao+"[^>]*>"),Eo=/^]+>/i,No=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Io=/&(?:lt|gt|quot|amp|#39);/g,Fo=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Po=p("pre,textarea",!0),Ro=function(e,t){return e&&Po(e)&&"\n"===t[0]};function Ho(e,t){var n=t?Fo:Io;return e.replace(n,function(e){return Mo[e]})}var Bo,Uo,zo,Vo,Ko,Jo,qo,Wo,Zo=/^@|^v-on:/,Go=/^v-|^@|^:|^#/,Xo=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Yo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Qo=/^\(|\)$/g,ea=/^\[.*\]$/,ta=/:(.*)$/,na=/^:|^\.|^v-bind:/,ra=/\.[^.\]]+(?=[^\]]*$)/g,ia=/^v-slot(:|$)|^#/,oa=/[\r\n]/,aa=/\s+/g,sa=g(_o),ca="_empty_";function ua(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:ma(t),rawAttrsMap:{},parent:n,children:[]}}function la(e,t){Bo=t.warn||Sr,Jo=t.isPreTag||T,qo=t.mustUseProp||T,Wo=t.getTagNamespace||T;t.isReservedTag;zo=Tr(t.modules,"transformNode"),Vo=Tr(t.modules,"preTransformNode"),Ko=Tr(t.modules,"postTransformNode"),Uo=t.delimiters;var n,r,i=[],o=!1!==t.preserveWhitespace,a=t.whitespace,s=!1,c=!1;function u(e){if(l(e),s||e.processed||(e=fa(e,t)),i.length||e===n||n.if&&(e.elseif||e.else)&&da(n,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)a=e,(u=function(e){var t=e.length;for(;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&u.if&&da(u,{exp:a.elseif,block:a});else{if(e.slotScope){var o=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[o]=e}r.children.push(e),e.parent=r}var a,u;e.children=e.children.filter(function(e){return!e.slotScope}),l(e),e.pre&&(s=!1),Jo(e.tag)&&(c=!1);for(var f=0;f]*>)","i")),p=e.replace(f,function(e,n,r){return u=r.length,Do(l)||"noscript"===l||(n=n.replace(//g,"$1").replace(//g,"$1")),Ro(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""});c+=e.length-p.length,e=p,A(l,c-u,c)}else{var d=e.indexOf("<");if(0===d){if(No.test(e)){var v=e.indexOf("--\x3e");if(v>=0){t.shouldKeepComment&&t.comment(e.substring(4,v),c,c+v+3),C(v+3);continue}}if(jo.test(e)){var h=e.indexOf("]>");if(h>=0){C(h+2);continue}}var m=e.match(Eo);if(m){C(m[0].length);continue}var y=e.match(To);if(y){var g=c;C(y[0].length),A(y[1],g,c);continue}var _=x();if(_){k(_),Ro(_.tagName,e)&&C(1);continue}}var b=void 0,$=void 0,w=void 0;if(d>=0){for($=e.slice(d);!(To.test($)||Oo.test($)||No.test($)||jo.test($)||(w=$.indexOf("<",1))<0);)d+=w,$=e.slice(d);b=e.substring(0,d)}d<0&&(b=e),b&&C(b.length),t.chars&&b&&t.chars(b,c-b.length,c)}if(e===n){t.chars&&t.chars(e);break}}function C(t){c+=t,e=e.substring(t)}function x(){var t=e.match(Oo);if(t){var n,r,i={tagName:t[1],attrs:[],start:c};for(C(t[0].length);!(n=e.match(So))&&(r=e.match(xo)||e.match(Co));)r.start=c,C(r[0].length),r.end=c,i.attrs.push(r);if(n)return i.unarySlash=n[1],C(n[0].length),i.end=c,i}}function k(e){var n=e.tagName,c=e.unarySlash;o&&("p"===r&&wo(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=e.attrs.length,f=new Array(l),p=0;p=0&&i[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=i.length-1;u>=a;u--)t.end&&t.end(i[u].tag,n,o);i.length=a,r=a&&i[a-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,o):"p"===s&&(t.start&&t.start(e,[],!1,n,o),t.end&&t.end(e,n,o))}A()}(e,{warn:Bo,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,o,a,l,f){var p=r&&r.ns||Wo(e);q&&"svg"===p&&(o=function(e){for(var t=[],n=0;nc&&(s.push(o=e.slice(c,i)),a.push(JSON.stringify(o)));var u=Ar(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=i+r[0].length}return c-1"+("true"===o?":("+t+")":":_q("+t+","+o+")")),Mr(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Br(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Br(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Br(t,"$$c")+"}",null,!0)}(e,r,i);else if("input"===o&&"radio"===a)!function(e,t,n){var r=n&&n.number,i=Ir(e,"value")||"null";Er(e,"checked","_q("+t+","+(i=r?"_n("+i+")":i)+")"),Mr(e,"change",Br(t,i),null,!0)}(e,r,i);else if("input"===o||"textarea"===o)!function(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,u=o?"change":"range"===r?Wr:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=Br(t,l);c&&(f="if($event.target.composing)return;"+f),Er(e,"value","("+t+")"),Mr(e,u,f,null,!0),(s||a)&&Mr(e,"blur","$forceUpdate()")}(e,r,i);else if(!F.isReservedTag(o))return Hr(e,r,i),!1;return!0},text:function(e,t){t.value&&Er(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Er(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:bo,mustUseProp:jn,canBeLeftOpenTag:$o,isReservedTag:Wn,getTagNamespace:Zn,staticKeys:function(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(",")}(ba)},xa=g(function(e){return p("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))});function ka(e,t){e&&($a=xa(t.staticKeys||""),wa=t.isReservedTag||T,function e(t){t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||d(e.tag)||!wa(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every($a)))}(t);if(1===t.type){if(!wa(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,r=t.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,Oa=/\([^)]*?\);*$/,Sa=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Ta={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Ea={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Na=function(e){return"if("+e+")return null;"},ja={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Na("$event.target !== $event.currentTarget"),ctrl:Na("!$event.ctrlKey"),shift:Na("!$event.shiftKey"),alt:Na("!$event.altKey"),meta:Na("!$event.metaKey"),left:Na("'button' in $event && $event.button !== 0"),middle:Na("'button' in $event && $event.button !== 1"),right:Na("'button' in $event && $event.button !== 2")};function Da(e,t){var n=t?"nativeOn:":"on:",r="",i="";for(var o in e){var a=La(e[o]);e[o]&&e[o].dynamic?i+=o+","+a+",":r+='"'+o+'":'+a+","}return r="{"+r.slice(0,-1)+"}",i?n+"_d("+r+",["+i.slice(0,-1)+"])":n+r}function La(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map(function(e){return La(e)}).join(",")+"]";var t=Sa.test(e.value),n=Aa.test(e.value),r=Sa.test(e.value.replace(Oa,""));if(e.modifiers){var i="",o="",a=[];for(var s in e.modifiers)if(ja[s])o+=ja[s],Ta[s]&&a.push(s);else if("exact"===s){var c=e.modifiers;o+=Na(["ctrl","shift","alt","meta"].filter(function(e){return!c[e]}).map(function(e){return"$event."+e+"Key"}).join("||"))}else a.push(s);return a.length&&(i+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Ma).join("&&")+")return null;"}(a)),o&&(i+=o),"function($event){"+i+(t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":r?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(r?"return "+e.value:e.value)+"}"}function Ma(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Ta[e],r=Ea[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var Ia={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:S},Fa=function(e){this.options=e,this.warn=e.warn||Sr,this.transforms=Tr(e.modules,"transformCode"),this.dataGenFns=Tr(e.modules,"genData"),this.directives=A(A({},Ia),e.directives);var t=e.isReservedTag||T;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Pa(e,t){var n=new Fa(t);return{render:"with(this){return "+(e?Ra(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Ra(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ha(e,t);if(e.once&&!e.onceProcessed)return Ba(e,t);if(e.for&&!e.forProcessed)return za(e,t);if(e.if&&!e.ifProcessed)return Ua(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=qa(e,t),i="_t("+n+(r?","+r:""),o=e.attrs||e.dynamicAttrs?Ga((e.attrs||[]).concat(e.dynamicAttrs||[]).map(function(e){return{name:b(e.name),value:e.value,dynamic:e.dynamic}})):null,a=e.attrsMap["v-bind"];!o&&!a||r||(i+=",null");o&&(i+=","+o);a&&(i+=(o?"":",null")+","+a);return i+")"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:qa(t,n,!0);return"_c("+e+","+Va(t,n)+(r?","+r:"")+")"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=Va(e,t));var i=e.inlineTemplate?null:qa(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(i?","+i:"")+")"}for(var o=0;o>>0}(a):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var o=function(e,t){var n=e.children[0];if(n&&1===n.type){var r=Pa(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map(function(e){return"function(){"+e+"}"}).join(",")+"]}"}}(e,t);o&&(n+=o+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Ga(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Ka(e){return 1===e.type&&("slot"===e.tag||e.children.some(Ka))}function Ja(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Ua(e,t,Ja,"null");if(e.for&&!e.forProcessed)return za(e,t,Ja);var r=e.slotScope===ca?"":String(e.slotScope),i="function("+r+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(qa(e,t)||"undefined")+":undefined":qa(e,t)||"undefined":Ra(e,t))+"}",o=r?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+i+o+"}"}function qa(e,t,n,r,i){var o=e.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?t.maybeComponent(a)?",1":",0":"";return""+(r||Ra)(a,t)+s}var c=n?function(e,t){for(var n=0,r=0;r':'
',ts.innerHTML.indexOf(" ")>0}var os=!!z&&is(!1),as=!!z&&is(!0),ss=g(function(e){var t=Yn(e);return t&&t.innerHTML}),cs=wn.prototype.$mount;return wn.prototype.$mount=function(e,t){if((e=e&&Yn(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=ss(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){var i=rs(r,{outputSourceRange:!1,shouldDecodeNewlines:os,shouldDecodeNewlinesForHref:as,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return cs.call(this,e,t)},wn.compile=rs,wn}); --------------------------------------------------------------------------------