Created
May 7, 2016 21:35
-
-
Save mickeypash/1ae5a651ac4ea0b19abef7256d4e2cba to your computer and use it in GitHub Desktop.
This is the javascript process running the web client for whatsapp
This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /*! Copyright (c) 2015 WhatsApp Inc. All Rights Reserved. */ | |
| webpackJsonp([84], [, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| return u[Math.round(Math.random() * (u.length - 1))] | |
| } | |
| function o() { | |
| this.logs = [], this.localCursor = 0, this.pending = void 0, this.timer = new d(this, this.persistIdb) | |
| } | |
| function i(e) { | |
| return this.writeLine(e, !1), _.noop | |
| } | |
| function a(e) { | |
| return this.writeLine(e, !0), _.noop | |
| } | |
| var s = r(6), | |
| d = r(54), | |
| c = 250, | |
| u = "LTSXOo+_*-=.<^!#?".split(""), | |
| l = n() + n() + n() + n(); | |
| o.prototype.writeLine = function(e, t) { | |
| e = t ? e : e ? e.toString().substring(0, c) : e; | |
| var r = l + " " + moment().locale("en").format("YYYY-MM-DD HH:mm:ss: ") + e; | |
| this.persist(r) | |
| }, o.prototype.logColor = function(e, t) { | |
| return i.call(this, t) | |
| }, o.prototype.log = i, o.prototype.logVerbose = a, o.prototype.info = i, o.prototype.infoVerbose = a, o.prototype.warn = i, o.prototype.warnVerbose = a, o.prototype.error = i, o.prototype.errorVerbose = a, o.prototype.trace = function(e) { | |
| var t = new Error(e); | |
| return this.errorVerbose(t.stack)(t), e | |
| }, o.prototype.persist = function(e) { | |
| this.logs.push(e), this.logs.length > s.LOG_SIZE && (this.logs.shift(), this.localCursor--), this.timer.debounceAndCap(250, 1e3) | |
| }, o.prototype.persistIdb = function() { | |
| var e = this, | |
| t = r(26), | |
| n = this.logs.slice(Math.max(this.localCursor, 0), this.logs.length); | |
| n.length && (this.pending = t.idb().then(function(t) { | |
| return t.transaction("rw", t.logs, function() { | |
| var r = void 0, | |
| o = e.getCursor(); | |
| return _.forEach(n, function(e, n) { | |
| r = (o + n) % s.LOG_SIZE, t.logs.put({ | |
| line: r, | |
| log: e | |
| }) | |
| }), r | |
| }) | |
| }).then(function(t) { | |
| e.localCursor += n.length, e.setCursor(t) | |
| })["catch"](function(e) {})["finally"](function() { | |
| e.pending = void 0 | |
| })) | |
| }, o.prototype.clearLogs = function() { | |
| var e = r(26); | |
| e.idb().then(function(e) { | |
| e.logs["delete"]() | |
| })["catch"](_.noop), this.setCursor(0), this.localCursor = 0, this.logs = [] | |
| }, o.prototype.getLogs = function() { | |
| var e = this, | |
| t = r(26), | |
| n = [this.pending]; | |
| return 0 !== this.timer.ts && (this.timer.trigger(), n.push(this.pending)), Promise.all(n).then(function() { | |
| return t.idb() | |
| }).then(function(e) { | |
| return e.logs.orderBy("line").toArray() | |
| }).then(function(t) { | |
| var r = e.getCursor(), | |
| n = r < t.length - 1 ? t.slice(r, t.length) : [], | |
| o = t.slice(0, r); | |
| return _.pluck(n.concat(o), "log") | |
| })["catch"](function() { | |
| return e.logs | |
| }) | |
| }, o.prototype.getCursor = function() { | |
| var e = r(26); | |
| try { | |
| return JSON.parse(e.permanentStorage.getItem(s.KEY_LOG_CURSOR)) || Math.max(this.localCursor, 0) | |
| } catch (t) { | |
| return Math.max(this.localCursor, 0) | |
| } | |
| }, o.prototype.setCursor = function(e) { | |
| var t = r(26); | |
| return t.permanentStorage.setItem(s.KEY_LOG_CURSOR, e) | |
| }, o.prototype.exportToWindow = function(e, t) {}, o.prototype.assert = function(e, t, r) { | |
| if (e) return _.noop; | |
| var n = new Error("AssertError " + t + ": " + r); | |
| return _.defer(function() { | |
| throw n | |
| }), this.error("Assertion Failed! " + t + " (" + e + " not truthy): " + r) | |
| }, e.exports = new o | |
| }, , , , , function(e, t, r) { | |
| "use strict"; | |
| var n = r(367); | |
| ["webkitGetUserMedia"].forEach(function(e) { | |
| var t = Object.getPrototypeOf(navigator)[e]; | |
| t && navigator[e] !== t && (navigator[e] = t) | |
| }), window.URL = window.URL || window.webkitURL, window.AudioContext = window.AudioContext || window.webkitAudioContext, navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia || navigator.webkitGetUserMedia, window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; | |
| var o = { | |
| MAX_GROUP_SIZE: 101, | |
| MAX_SUBJECT_LENGTH: 25, | |
| IMG_MAX_EDGE: 1600, | |
| IMG_MAX_BYTES: 5242880, | |
| IMG_THUMB_MAX_EDGE: 100, | |
| MAX_MEDIA_UPLOAD_SIZE: 16777216, | |
| BROWSER_CAPABILITY: { | |
| getRandomValues: !(!window.crypto || !window.crypto.getRandomValues), | |
| localstorage: !!window.localStorage, | |
| sessionstorage: !!window.sessionStorage, | |
| indexeddb: !!window.indexedDB, | |
| url: !!window.URL, | |
| websocket: !!window.WebSocket, | |
| worker: !!window.Worker | |
| }, | |
| BROWSER_TYPE: { | |
| CHROME: "chrome", | |
| CHROMIUM: "chromium", | |
| FIREFOX: "firefox", | |
| SAFARI: "safari", | |
| IE: "ie", | |
| OPERA: "opera", | |
| EDGE: "edge" | |
| }, | |
| BROWSER_LINK: { | |
| CHROME: '<a href="https://www.google.com/chrome">Google Chrome</a>', | |
| FIREFOX: '<a href="http://www.firefox.com">Mozilla Firefox</a>', | |
| OPERA: '<a href="http://www.opera.com">Opera</a>' | |
| }, | |
| OS_TYPE: { | |
| WINDOWS: "windows", | |
| MAC: "mac os", | |
| CHROMEOS: "chromium os" | |
| }, | |
| LATEST_HASH: "0bd93306a9783f3c8d64b619572ec8e89b1ec84f", | |
| VERSION: { | |
| p: 0, | |
| s: 2, | |
| t: 532 | |
| }, | |
| VERSION_BASE: "0.2.532", | |
| VERSION_STR: "0.2.532", | |
| CLB_URL: "https://web-crashlog.whatsapp.net/upload.php", | |
| PREVIEW_WINDOW: "preview-window", | |
| UPLOAD_SELECT: "upload-select", | |
| CURRENT_LOCATION_ICON: "https://maps.gstatic.com/mapfiles/ms2/micons/blue-dot.png", | |
| CURRENT_LOCATION_SHADOW: "https://maps.gstatic.com/mapfiles/ms2/micons/msmarker.shadow.png", | |
| GROUP_DEFAULT_ICON: r(452), | |
| USER_DEFAULT_ICON: r(453), | |
| NOTIFICATION_PROMPT_DELAY: 1e4, | |
| NOTIFICATION_TIMEOUT: 5e3, | |
| CALL_NOTIFICATION_TIMEOUT: 45e3, | |
| NOTIFICATION_TONE_PATH: "/assets/notification.mp3", | |
| IDLE_TIMEOUT: 6e4, | |
| IDLE_TIMEOUT_WAIT: 78e4, | |
| PING_INTERVAL: 24e4, | |
| ACK_TIMEOUT: 8e3, | |
| RETRY_TIMESTEP: 20500, | |
| SEND_UNAVAILABLE_WAIT: 15e3, | |
| SEND_PAUSED_WAIT: 2500, | |
| CLEAR_CHAT_DIRTY_WAIT: 2500, | |
| MAX_RETRY_GENERATION: 4, | |
| GIVE_UP_WAIT: 12e4, | |
| LOG_UPLOAD_INTERVAL: 36e5, | |
| EMOJI_SYNC_DELAY: 3e4, | |
| MAX_TXT_MSG_SIZE: 65536, | |
| DRAG_TYPE_FILE: "Files", | |
| DRAG_TYPE_LOCAL_IMAGE: "drag_type_local_image", | |
| NUM_COLORS: 20, | |
| KEY_STORAGE_TEST: "storage_test", | |
| KEY_CLIENT_TOKEN: "WAToken1", | |
| KEY_SERVER_TOKEN: "WAToken2", | |
| KEY_SECRET: "WASecretKey", | |
| KEY_SECRET_BUNDLE: "WASecretBundle", | |
| KEY_BROWSER_ID: "WABrowserId", | |
| KEY_GEOCODER_LOCATION: "WAGeocoderLocation", | |
| KEY_GROUP_ASSIGNED_COLOR: "WAGroupAssignedColor", | |
| KEY_GMAPS_OVER_LIMIT: "WAGmapsOverLimit", | |
| KEY_GLOBAL_MUTE_SOUNDS: "WAGlobalSounds", | |
| KEY_GLOBAL_MUTE_NOTIFICATIONS: "WAGlobalNotifications", | |
| KEY_GLOBAL_MUTE_PREVIEWS: "WAGlobalPreviews", | |
| KEY_LANG: "WALangPref", | |
| KEY_LAST_ACTIVE_EMOJI_TAB: "WALastActiveEmojiTab", | |
| KEY_UNKNOWN_ID: "WAUnknownID", | |
| KEY_VERSION: "WAVersion", | |
| KEY_LOAD_RETRY_GENERATION: "WALoadRetryGeneration", | |
| KEY_REMEMBER_ME: "remember-me", | |
| KEY_LOGOUT_TOKEN: "logout-token", | |
| KEY_OLD_LOGOUT_CREDS: "old-logout-cred", | |
| KEY_NO_TAKEOVER: "no-takeover", | |
| KEY_WHATSAPP_MUTEX: "whatsapp-mutex", | |
| KEY_WHATSAPP_LS_VERSION: "ver", | |
| KEY_LOCAL_TAKEOVER_OK: "local-takeover-ok", | |
| KEY_WAM_BUFFER: "wam-buffer", | |
| KEY_WAM_INFO: "wam-info", | |
| COOKIE_REF: "ref", | |
| COOKIE_TOK: "tok", | |
| PAGE_SIZE: 50, | |
| MSG_PRELOAD_THRESHOLD: 20, | |
| SCROLL_FUDGE: 100, | |
| MIN_PIC_SIDE: 192, | |
| MAX_PIC_SIDE: 640, | |
| PROF_PIC_THUMB_SIDE: 96, | |
| MAX_CAPTION_LENGTH: 1024, | |
| MAX_VCARD_PHOTO_SIDE: 64, | |
| EMOJI_PANEL_HEIGHT: 222, | |
| GROUP_SET_PIC_CONTEXT: "group", | |
| GROUP_CREATE_PIC_CONTEXT: "create_group", | |
| PROFILE_PIC_CONTEXT: "profile", | |
| PERMISSION_ALLOWED: "granted", | |
| PERMISSION_DEFAULT: "default", | |
| PERMISSION_DENIED: "denied", | |
| PRESENCE_COMPOSING_TIMEOUT: 25e3, | |
| PRESENCE_RESEND_WAIT: 1e4, | |
| PTT_CANCEL_AREA: 300, | |
| PTT_TIME_CHECK: 1, | |
| PTT_TIME_CANCEL: .75, | |
| CANCEL_ANIMATION_DURATION: 2700, | |
| MIMETYPE_OGG: "audio/ogg", | |
| IMAGE_MIMES: "image/*", | |
| VIDEO_MIMES: "video/*", | |
| DOC_MIMES: "application/pdf", | |
| SEARCH_ANIMATION_DURATION: 150, | |
| SLIDEDOWN_DURATION: 100, | |
| CSS_TRANSITION_DURATION: 1, | |
| EARTH_RADIUS: 6378137, | |
| LOG_SIZE: 4999, | |
| KEY_LOG_CURSOR: "debugCursor", | |
| MAX_STATUS_LENGTH: 139, | |
| QR_EDGE: 240, | |
| FILE_ERROR_MISSING: "File missing.", | |
| FILE_ERROR_SIZE: "File size is too large.", | |
| FILE_ERROR_TYPE: "File type is invalid.", | |
| FILE_ERROR_MIN_DIM: "File dimensions are too small.", | |
| DISP_TYPE: { | |
| CONVERSATION: "conversation", | |
| MSG_INFO: "msg_info", | |
| STARRED_MSGS: "starred_msgs" | |
| }, | |
| GMAPS_OVER_LIMIT_DURATION: 14400, | |
| ACK_ERROR: -1, | |
| ACK_PENDING: 0, | |
| ACK_SERVER: 1, | |
| ACK_DEVICE: 2, | |
| ACK_READ: 3, | |
| ACK_PLAYED: 4, | |
| BATTERY_LOW_THRESHOLD_1: 15, | |
| BATTERY_LOW_THRESHOLD_2: 5, | |
| BATTERY_DELAY: 1e4, | |
| WAM_MAX_BUFFER_SIZE: 5e4, | |
| NUX: { | |
| SAFARI_LIMITED_SUPPORT: "safari_limited_support" | |
| }, | |
| COLLECTION_HAS_SYNCED: "collection_has_synced", | |
| DIAGNOSTIC_DELAY: 18e3, | |
| ONE_BY_ONE_TRANS_GIF: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" | |
| }; | |
| for (var i in n) n.hasOwnProperty(i) && (o[i] = n[i]); | |
| e.exports = o | |
| }, function(e, t, r) { | |
| (function(e) { | |
| /** | |
| * @license ByteBuffer.js (c) 2013-2014 Daniel Wirtz <[email protected]> | |
| * This version of ByteBuffer.js uses an ArrayBuffer (AB) as its backing buffer and is compatible with modern browsers. | |
| * Released under the Apache License, Version 2.0 | |
| * see: https://github.com/dcodeIO/ByteBuffer.js for details | |
| */ | |
| ! function(t) { | |
| "use strict"; | |
| function n(e) { | |
| var t = function(e, n, o) { | |
| if ("undefined" == typeof e && (e = t.DEFAULT_CAPACITY), "undefined" == typeof n && (n = t.DEFAULT_ENDIAN), "undefined" == typeof o && (o = t.DEFAULT_NOASSERT), !o) { | |
| if (e = 0 | e, 0 > e) throw new RangeError("Illegal capacity: 0 <= " + e); | |
| if ("boolean" != typeof n) throw new TypeError("Illegal littleEndian: Not a boolean"); | |
| if ("boolean" != typeof o) throw new TypeError("Illegal noAssert: Not a boolean") | |
| } | |
| this.buffer = 0 === e ? r : new ArrayBuffer(e), this.view = 0 === e ? null : new DataView(this.buffer), this.offset = 0, this.markedOffset = -1, this.limit = e, this.littleEndian = "undefined" != typeof n ? !!n : !1, this.noAssert = !!o | |
| }; | |
| t.VERSION = "3.1.0", t.LITTLE_ENDIAN = !0, t.BIG_ENDIAN = !1, t.DEFAULT_CAPACITY = 16, t.DEFAULT_ENDIAN = t.BIG_ENDIAN, t.DEFAULT_NOASSERT = !1, t.Long = e || null; | |
| var r = new ArrayBuffer(0); | |
| t.allocate = function(e, r, n) { | |
| return new t(e, r, n) | |
| }, t.concat = function(e, r, n, o) { | |
| "boolean" != typeof r && "string" == typeof r || (o = n, n = r, r = void 0); | |
| for (var i, a = 0, s = 0, d = e.length; d > s; ++s) t.isByteBuffer(e[s]) || (e[s] = t.wrap(e[s], r)), i = e[s].limit - e[s].offset, i > 0 && (a += i); | |
| if (0 === a) return new t(0, n, o); | |
| var c, u = new t(a, n, o), | |
| l = new Uint8Array(u.buffer); | |
| for (s = 0; d > s;) c = e[s++], i = c.limit - c.offset, 0 >= i || (l.set(new Uint8Array(c.buffer).subarray(c.offset, c.limit), u.offset), u.offset += i); | |
| return u.limit = u.offset, u.offset = 0, u | |
| }, t.isByteBuffer = function(e) { | |
| return e && e instanceof t | |
| }, t.type = function() { | |
| return ArrayBuffer | |
| }, t.wrap = function(e, r, n, o) { | |
| if ("string" != typeof r && (o = n, n = r, r = void 0), "string" == typeof e) switch ("undefined" == typeof r && (r = "utf8"), r) { | |
| case "base64": | |
| return t.fromBase64(e, n); | |
| case "hex": | |
| return t.fromHex(e, n); | |
| case "binary": | |
| return t.fromBinary(e, n); | |
| case "utf8": | |
| return t.fromUTF8(e, n); | |
| case "debug": | |
| return t.fromDebug(e, n); | |
| default: | |
| throw new TypeError("Unsupported encoding: " + r) | |
| } | |
| if (null === e || "object" != typeof e) throw new TypeError("Illegal buffer: null or non-object"); | |
| var a; | |
| if (t.isByteBuffer(e)) return a = t.prototype.clone.call(e), a.markedOffset = -1, a; | |
| if (e instanceof Uint8Array) a = new t(0, n, o), e.length > 0 && (a.buffer = e.buffer, a.offset = e.byteOffset, a.limit = e.byteOffset + e.length, a.view = e.length > 0 ? new DataView(e.buffer) : null); | |
| else if (e instanceof ArrayBuffer) a = new t(0, n, o), e.byteLength > 0 && (a.buffer = e, a.offset = 0, a.limit = e.byteLength, a.view = e.byteLength > 0 ? new DataView(e) : null); | |
| else { | |
| if ("[object Array]" !== Object.prototype.toString.call(e)) throw new TypeError("Illegal buffer"); | |
| for (a = new t(e.length, n, o), a.limit = e.length, i = 0; i < e.length; ++i) a.view.setUint8(i, e[i]) | |
| } | |
| return a | |
| }, t.prototype.writeInt8 = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal value: " + e + " (not an integer)"); | |
| if (e |= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| t += 1; | |
| var n = this.buffer.byteLength; | |
| return t > n && this.resize((n *= 2) > t ? n : t), t -= 1, this.view.setInt8(t, e), r && (this.offset += 1), this | |
| }, t.prototype.writeByte = t.prototype.writeInt8, t.prototype.readInt8 = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 1 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+1) <= " + this.buffer.byteLength) | |
| } | |
| var r = this.view.getInt8(e); | |
| return t && (this.offset += 1), r | |
| }, t.prototype.readByte = t.prototype.readInt8, t.prototype.writeUint8 = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal value: " + e + " (not an integer)"); | |
| if (e >>>= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| t += 1; | |
| var n = this.buffer.byteLength; | |
| return t > n && this.resize((n *= 2) > t ? n : t), t -= 1, this.view.setUint8(t, e), r && (this.offset += 1), this | |
| }, t.prototype.readUint8 = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 1 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+1) <= " + this.buffer.byteLength) | |
| } | |
| var r = this.view.getUint8(e); | |
| return t && (this.offset += 1), r | |
| }, t.prototype.writeInt16 = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal value: " + e + " (not an integer)"); | |
| if (e |= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| t += 2; | |
| var n = this.buffer.byteLength; | |
| return t > n && this.resize((n *= 2) > t ? n : t), t -= 2, this.view.setInt16(t, e, this.littleEndian), r && (this.offset += 2), this | |
| }, t.prototype.writeShort = t.prototype.writeInt16, t.prototype.readInt16 = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 2 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+2) <= " + this.buffer.byteLength) | |
| } | |
| var r = this.view.getInt16(e, this.littleEndian); | |
| return t && (this.offset += 2), r | |
| }, t.prototype.readShort = t.prototype.readInt16, t.prototype.writeUint16 = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal value: " + e + " (not an integer)"); | |
| if (e >>>= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| t += 2; | |
| var n = this.buffer.byteLength; | |
| return t > n && this.resize((n *= 2) > t ? n : t), t -= 2, this.view.setUint16(t, e, this.littleEndian), r && (this.offset += 2), this | |
| }, t.prototype.readUint16 = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 2 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+2) <= " + this.buffer.byteLength) | |
| } | |
| var r = this.view.getUint16(e, this.littleEndian); | |
| return t && (this.offset += 2), r | |
| }, t.prototype.writeInt32 = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal value: " + e + " (not an integer)"); | |
| if (e |= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| t += 4; | |
| var n = this.buffer.byteLength; | |
| return t > n && this.resize((n *= 2) > t ? n : t), t -= 4, this.view.setInt32(t, e, this.littleEndian), r && (this.offset += 4), this | |
| }, t.prototype.writeInt = t.prototype.writeInt32, t.prototype.readInt32 = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 4 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+4) <= " + this.buffer.byteLength) | |
| } | |
| var r = this.view.getInt32(e, this.littleEndian); | |
| return t && (this.offset += 4), r | |
| }, t.prototype.readInt = t.prototype.readInt32, t.prototype.writeUint32 = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal value: " + e + " (not an integer)"); | |
| if (e >>>= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| t += 4; | |
| var n = this.buffer.byteLength; | |
| return t > n && this.resize((n *= 2) > t ? n : t), t -= 4, this.view.setUint32(t, e, this.littleEndian), r && (this.offset += 4), this | |
| }, t.prototype.readUint32 = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 4 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+4) <= " + this.buffer.byteLength) | |
| } | |
| var r = this.view.getUint32(e, this.littleEndian); | |
| return t && (this.offset += 4), r | |
| }, e && (t.prototype.writeInt64 = function(t, r) { | |
| var n = "undefined" == typeof r; | |
| if (n && (r = this.offset), !this.noAssert) { | |
| if ("number" == typeof t) t = e.fromNumber(t); | |
| else if (!(t && t instanceof e)) throw new TypeError("Illegal value: " + t + " (not an integer or Long)"); | |
| if ("number" != typeof r || r % 1 !== 0) throw new TypeError("Illegal offset: " + r + " (not an integer)"); | |
| if (r >>>= 0, 0 > r || r + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + r + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| "number" == typeof t && (t = e.fromNumber(t)), r += 8; | |
| var o = this.buffer.byteLength; | |
| return r > o && this.resize((o *= 2) > r ? o : r), r -= 8, this.littleEndian ? (this.view.setInt32(r, t.low, !0), this.view.setInt32(r + 4, t.high, !0)) : (this.view.setInt32(r, t.high, !1), this.view.setInt32(r + 4, t.low, !1)), n && (this.offset += 8), this | |
| }, t.prototype.writeLong = t.prototype.writeInt64, t.prototype.readInt64 = function(t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 8 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+8) <= " + this.buffer.byteLength) | |
| } | |
| var n = this.littleEndian ? new e(this.view.getInt32(t, !0), this.view.getInt32(t + 4, !0), !1) : new e(this.view.getInt32(t + 4, !1), this.view.getInt32(t, !1), !1); | |
| return r && (this.offset += 8), n | |
| }, t.prototype.readLong = t.prototype.readInt64, t.prototype.writeUint64 = function(t, r) { | |
| var n = "undefined" == typeof r; | |
| if (n && (r = this.offset), !this.noAssert) { | |
| if ("number" == typeof t) t = e.fromNumber(t); | |
| else if (!(t && t instanceof e)) throw new TypeError("Illegal value: " + t + " (not an integer or Long)"); | |
| if ("number" != typeof r || r % 1 !== 0) throw new TypeError("Illegal offset: " + r + " (not an integer)"); | |
| if (r >>>= 0, 0 > r || r + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + r + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| "number" == typeof t && (t = e.fromNumber(t)), r += 8; | |
| var o = this.buffer.byteLength; | |
| return r > o && this.resize((o *= 2) > r ? o : r), r -= 8, this.littleEndian ? (this.view.setInt32(r, t.low, !0), this.view.setInt32(r + 4, t.high, !0)) : (this.view.setInt32(r, t.high, !1), this.view.setInt32(r + 4, t.low, !1)), n && (this.offset += 8), this | |
| }, t.prototype.readUint64 = function(t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 8 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+8) <= " + this.buffer.byteLength) | |
| } | |
| var n = this.littleEndian ? new e(this.view.getInt32(t, !0), this.view.getInt32(t + 4, !0), !0) : new e(this.view.getInt32(t + 4, !1), this.view.getInt32(t, !1), !0); | |
| return r && (this.offset += 8), n | |
| }), t.prototype.writeFloat32 = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof e) throw new TypeError("Illegal value: " + e + " (not a number)"); | |
| if ("number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| t += 4; | |
| var n = this.buffer.byteLength; | |
| return t > n && this.resize((n *= 2) > t ? n : t), t -= 4, this.view.setFloat32(t, e, this.littleEndian), r && (this.offset += 4), this | |
| }, t.prototype.writeFloat = t.prototype.writeFloat32, t.prototype.readFloat32 = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 4 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+4) <= " + this.buffer.byteLength) | |
| } | |
| var r = this.view.getFloat32(e, this.littleEndian); | |
| return t && (this.offset += 4), r | |
| }, t.prototype.readFloat = t.prototype.readFloat32, t.prototype.writeFloat64 = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof e) throw new TypeError("Illegal value: " + e + " (not a number)"); | |
| if ("number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| t += 8; | |
| var n = this.buffer.byteLength; | |
| return t > n && this.resize((n *= 2) > t ? n : t), t -= 8, this.view.setFloat64(t, e, this.littleEndian), r && (this.offset += 8), this | |
| }, t.prototype.writeDouble = t.prototype.writeFloat64, t.prototype.readFloat64 = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 8 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+8) <= " + this.buffer.byteLength) | |
| } | |
| var r = this.view.getFloat64(e, this.littleEndian); | |
| return t && (this.offset += 8), r | |
| }, t.prototype.readDouble = t.prototype.readFloat64, t.MAX_VARINT32_BYTES = 5, t.calculateVarint32 = function(e) { | |
| return e >>>= 0, 128 > e ? 1 : 16384 > e ? 2 : 1 << 21 > e ? 3 : 1 << 28 > e ? 4 : 5 | |
| }, t.zigZagEncode32 = function(e) { | |
| return ((e |= 0) << 1 ^ e >> 31) >>> 0 | |
| }, t.zigZagDecode32 = function(e) { | |
| return e >>> 1 ^ -(1 & e) | 0 | |
| }, t.prototype.writeVarint32 = function(e, r) { | |
| var n = "undefined" == typeof r; | |
| if (n && (r = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal value: " + e + " (not an integer)"); | |
| if (e |= 0, "number" != typeof r || r % 1 !== 0) throw new TypeError("Illegal offset: " + r + " (not an integer)"); | |
| if (r >>>= 0, 0 > r || r + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + r + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| var o, i = t.calculateVarint32(e); | |
| r += i; | |
| var a = this.buffer.byteLength; | |
| return r > a && this.resize((a *= 2) > r ? a : r), r -= i, this.view.setUint8(r, o = 128 | e), e >>>= 0, e >= 128 ? (o = e >> 7 | 128, this.view.setUint8(r + 1, o), e >= 16384 ? (o = e >> 14 | 128, this.view.setUint8(r + 2, o), e >= 1 << 21 ? (o = e >> 21 | 128, this.view.setUint8(r + 3, o), e >= 1 << 28 ? (this.view.setUint8(r + 4, e >> 28 & 15), i = 5) : (this.view.setUint8(r + 3, 127 & o), i = 4)) : (this.view.setUint8(r + 2, 127 & o), i = 3)) : (this.view.setUint8(r + 1, 127 & o), i = 2)) : (this.view.setUint8(r, 127 & o), i = 1), n ? (this.offset += i, this) : i | |
| }, t.prototype.writeVarint32ZigZag = function(e, r) { | |
| return this.writeVarint32(t.zigZagEncode32(e), r) | |
| }, t.prototype.readVarint32 = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 1 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+1) <= " + this.buffer.byteLength) | |
| } | |
| var r, n = 0, | |
| o = 0; | |
| do r = this.view.getUint8(e + n), 5 > n && (o |= (127 & r) << 7 * n >>> 0), ++n; while (128 === (128 & r)); | |
| return o = 0 | o, t ? (this.offset += n, o) : { | |
| value: o, | |
| length: n | |
| } | |
| }, t.prototype.readVarint32ZigZag = function(e) { | |
| var r = this.readVarint32(e); | |
| return "object" == typeof r ? r.value = t.zigZagDecode32(r.value) : r = t.zigZagDecode32(r), r | |
| }, e && (t.MAX_VARINT64_BYTES = 10, t.calculateVarint64 = function(t) { | |
| "number" == typeof t && (t = e.fromNumber(t)); | |
| var r = t.toInt() >>> 0, | |
| n = t.shiftRightUnsigned(28).toInt() >>> 0, | |
| o = t.shiftRightUnsigned(56).toInt() >>> 0; | |
| return 0 == o ? 0 == n ? 16384 > r ? 128 > r ? 1 : 2 : 1 << 21 > r ? 3 : 4 : 16384 > n ? 128 > n ? 5 : 6 : 1 << 21 > n ? 7 : 8 : 128 > o ? 9 : 10 | |
| }, t.zigZagEncode64 = function(t) { | |
| return "number" == typeof t ? t = e.fromNumber(t, !1) : t.unsigned !== !1 && (t = t.toSigned()), t.shiftLeft(1).xor(t.shiftRight(63)).toUnsigned() | |
| }, t.zigZagDecode64 = function(t) { | |
| return "number" == typeof t ? t = e.fromNumber(t, !1) : t.unsigned !== !1 && (t = t.toSigned()), t.shiftRightUnsigned(1).xor(t.and(e.ONE).toSigned().negate()).toSigned() | |
| }, t.prototype.writeVarint64 = function(r, n) { | |
| var o = "undefined" == typeof n; | |
| if (o && (n = this.offset), !this.noAssert) { | |
| if ("number" == typeof r) r = e.fromNumber(r); | |
| else if (!(r && r instanceof e)) throw new TypeError("Illegal value: " + r + " (not an integer or Long)"); | |
| if ("number" != typeof n || n % 1 !== 0) throw new TypeError("Illegal offset: " + n + " (not an integer)"); | |
| if (n >>>= 0, 0 > n || n + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + n + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| "number" == typeof r ? r = e.fromNumber(r, !1) : r.unsigned !== !1 && (r = r.toSigned()); | |
| var i = t.calculateVarint64(r), | |
| a = r.toInt() >>> 0, | |
| s = r.shiftRightUnsigned(28).toInt() >>> 0, | |
| d = r.shiftRightUnsigned(56).toInt() >>> 0; | |
| n += i; | |
| var c = this.buffer.byteLength; | |
| switch (n > c && this.resize((c *= 2) > n ? c : n), n -= i, i) { | |
| case 10: | |
| this.view.setUint8(n + 9, d >>> 7 & 1); | |
| case 9: | |
| this.view.setUint8(n + 8, 9 !== i ? 128 | d : 127 & d); | |
| case 8: | |
| this.view.setUint8(n + 7, 8 !== i ? s >>> 21 | 128 : s >>> 21 & 127); | |
| case 7: | |
| this.view.setUint8(n + 6, 7 !== i ? s >>> 14 | 128 : s >>> 14 & 127); | |
| case 6: | |
| this.view.setUint8(n + 5, 6 !== i ? s >>> 7 | 128 : s >>> 7 & 127); | |
| case 5: | |
| this.view.setUint8(n + 4, 5 !== i ? 128 | s : 127 & s); | |
| case 4: | |
| this.view.setUint8(n + 3, 4 !== i ? a >>> 21 | 128 : a >>> 21 & 127); | |
| case 3: | |
| this.view.setUint8(n + 2, 3 !== i ? a >>> 14 | 128 : a >>> 14 & 127); | |
| case 2: | |
| this.view.setUint8(n + 1, 2 !== i ? a >>> 7 | 128 : a >>> 7 & 127); | |
| case 1: | |
| this.view.setUint8(n, 1 !== i ? 128 | a : 127 & a) | |
| } | |
| return o ? (this.offset += i, this) : i | |
| }, t.prototype.writeVarint64ZigZag = function(e, r) { | |
| return this.writeVarint64(t.zigZagEncode64(e), r) | |
| }, t.prototype.readVarint64 = function(t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 1 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+1) <= " + this.buffer.byteLength) | |
| } | |
| var n = t, | |
| o = 0, | |
| i = 0, | |
| a = 0, | |
| s = 0; | |
| if (s = this.view.getUint8(t++), o = 127 & s, 128 & s && (s = this.view.getUint8(t++), o |= (127 & s) << 7, 128 & s && (s = this.view.getUint8(t++), o |= (127 & s) << 14, 128 & s && (s = this.view.getUint8(t++), o |= (127 & s) << 21, 128 & s && (s = this.view.getUint8(t++), i = 127 & s, 128 & s && (s = this.view.getUint8(t++), i |= (127 & s) << 7, 128 & s && (s = this.view.getUint8(t++), i |= (127 & s) << 14, 128 & s && (s = this.view.getUint8(t++), i |= (127 & s) << 21, 128 & s && (s = this.view.getUint8(t++), a = 127 & s, 128 & s && (s = this.view.getUint8(t++), a |= (127 & s) << 7, 128 & s)))))))))) throw new Error("Data must be corrupt: Buffer overrun"); | |
| var d = e.from28Bits(o, i, a, !1); | |
| return r ? (this.offset = t, d) : { | |
| value: d, | |
| length: t - n | |
| } | |
| }, t.prototype.readVarint64ZigZag = function(r) { | |
| var n = this.readVarint64(r); | |
| return n && n.value instanceof e ? n.value = t.zigZagDecode64(n.value) : n = t.zigZagDecode64(n), n | |
| }), t.prototype.writeCString = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| r && (t = this.offset); | |
| var n, i = e.length; | |
| if (!this.noAssert) { | |
| if ("string" != typeof e) throw new TypeError("Illegal str: Not a string"); | |
| for (n = 0; i > n; ++n) | |
| if (0 === e.charCodeAt(n)) throw new RangeError("Illegal str: Contains NULL-characters"); | |
| if ("number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| var a = t; | |
| i = o.calculateUTF16asUTF8(o.stringSource(e))[1], t += i + 1; | |
| var s = this.buffer.byteLength; | |
| return t > s && this.resize((s *= 2) > t ? s : t), t -= i + 1, o.encodeUTF16toUTF8(o.stringSource(e), function(e) { | |
| this.view.setUint8(t++, e) | |
| }.bind(this)), this.view.setUint8(t++, 0), r ? (this.offset = t - a, this) : i | |
| }, t.prototype.readCString = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 1 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+1) <= " + this.buffer.byteLength) | |
| } | |
| var r, n = e, | |
| i = -1; | |
| return o.decodeUTF8toUTF16(function() { | |
| if (0 === i) return null; | |
| if (e >= this.limit) throw RangeError("Illegal range: Truncated data, " + e + " < " + this.limit); | |
| return 0 === (i = this.view.getUint8(e++)) ? null : i | |
| }.bind(this), r = o.stringDestination(), !0), t ? (this.offset = e, r()) : { | |
| string: r(), | |
| length: e - n | |
| } | |
| }, t.prototype.writeIString = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("string" != typeof e) throw new TypeError("Illegal str: Not a string"); | |
| if ("number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| var n, i = t; | |
| n = o.calculateUTF16asUTF8(o.stringSource(e), this.noAssert)[1], t += 4 + n; | |
| var a = this.buffer.byteLength; | |
| if (t > a && this.resize((a *= 2) > t ? a : t), t -= 4 + n, this.view.setUint32(t, n, this.littleEndian), t += 4, o.encodeUTF16toUTF8(o.stringSource(e), function(e) { | |
| this.view.setUint8(t++, e) | |
| }.bind(this)), t !== i + 4 + n) throw new RangeError("Illegal range: Truncated data, " + t + " == " + (t + 4 + n)); | |
| return r ? (this.offset = t, this) : t - i | |
| }, t.prototype.readIString = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 4 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+4) <= " + this.buffer.byteLength) | |
| } | |
| var r, n = 0, | |
| i = e; | |
| n = this.view.getUint32(e, this.littleEndian), e += 4; | |
| var a, s = e + n; | |
| return o.decodeUTF8toUTF16(function() { | |
| return s > e ? this.view.getUint8(e++) : null | |
| }.bind(this), a = o.stringDestination(), this.noAssert), r = a(), t ? (this.offset = e, r) : { | |
| string: r, | |
| length: e - i | |
| } | |
| }, t.METRICS_CHARS = "c", t.METRICS_BYTES = "b", t.prototype.writeUTF8String = function(e, t) { | |
| var r = "undefined" == typeof t; | |
| if (r && (t = this.offset), !this.noAssert) { | |
| if ("number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: " + t + " (not an integer)"); | |
| if (t >>>= 0, 0 > t || t + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + t + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| var n, i = t; | |
| n = o.calculateUTF16asUTF8(o.stringSource(e))[1], t += n; | |
| var a = this.buffer.byteLength; | |
| return t > a && this.resize((a *= 2) > t ? a : t), t -= n, o.encodeUTF16toUTF8(o.stringSource(e), function(e) { | |
| this.view.setUint8(t++, e) | |
| }.bind(this)), r ? (this.offset = t, this) : t - i | |
| }, t.prototype.writeString = t.prototype.writeUTF8String, t.calculateUTF8Chars = function(e) { | |
| return o.calculateUTF16asUTF8(o.stringSource(e))[0] | |
| }, t.calculateUTF8Bytes = function(e) { | |
| return o.calculateUTF16asUTF8(o.stringSource(e))[1] | |
| }, t.prototype.readUTF8String = function(e, r, n) { | |
| "number" == typeof r && (n = r, r = void 0); | |
| var i = "undefined" == typeof n; | |
| if (i && (n = this.offset), "undefined" == typeof r && (r = t.METRICS_CHARS), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal length: " + e + " (not an integer)"); | |
| if (e |= 0, "number" != typeof n || n % 1 !== 0) throw new TypeError("Illegal offset: " + n + " (not an integer)"); | |
| if (n >>>= 0, 0 > n || n + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + n + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| var a, s = 0, | |
| d = n; | |
| if (r === t.METRICS_CHARS) { | |
| if (a = o.stringDestination(), o.decodeUTF8(function() { | |
| return e > s && n < this.limit ? this.view.getUint8(n++) : null | |
| }.bind(this), function(e) { | |
| ++s, o.UTF8toUTF16(e, a) | |
| }.bind(this)), s !== e) throw new RangeError("Illegal range: Truncated data, " + s + " == " + e); | |
| return i ? (this.offset = n, a()) : { | |
| string: a(), | |
| length: n - d | |
| } | |
| } | |
| if (r === t.METRICS_BYTES) { | |
| if (!this.noAssert) { | |
| if ("number" != typeof n || n % 1 !== 0) throw new TypeError("Illegal offset: " + n + " (not an integer)"); | |
| if (n >>>= 0, 0 > n || n + e > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + n + " (+" + e + ") <= " + this.buffer.byteLength) | |
| } | |
| var c = n + e; | |
| if (o.decodeUTF8toUTF16(function() { | |
| return c > n ? this.view.getUint8(n++) : null | |
| }.bind(this), a = o.stringDestination(), this.noAssert), n !== c) throw new RangeError("Illegal range: Truncated data, " + n + " == " + c); | |
| return i ? (this.offset = n, a()) : { | |
| string: a(), | |
| length: n - d | |
| } | |
| } | |
| throw new TypeError("Unsupported metrics: " + r) | |
| }, t.prototype.readString = t.prototype.readUTF8String, t.prototype.writeVString = function(e, r) { | |
| var n = "undefined" == typeof r; | |
| if (n && (r = this.offset), !this.noAssert) { | |
| if ("string" != typeof e) throw new TypeError("Illegal str: Not a string"); | |
| if ("number" != typeof r || r % 1 !== 0) throw new TypeError("Illegal offset: " + r + " (not an integer)"); | |
| if (r >>>= 0, 0 > r || r + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + r + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| var i, a, s = r; | |
| i = o.calculateUTF16asUTF8(o.stringSource(e), this.noAssert)[1], a = t.calculateVarint32(i), r += a + i; | |
| var d = this.buffer.byteLength; | |
| if (r > d && this.resize((d *= 2) > r ? d : r), r -= a + i, r += this.writeVarint32(i, r), o.encodeUTF16toUTF8(o.stringSource(e), function(e) { | |
| this.view.setUint8(r++, e) | |
| }.bind(this)), r !== s + i + a) throw new RangeError("Illegal range: Truncated data, " + r + " == " + (r + i + a)); | |
| return n ? (this.offset = r, this) : r - s | |
| }, t.prototype.readVString = function(e) { | |
| var t = "undefined" == typeof e; | |
| if (t && (e = this.offset), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 1 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+1) <= " + this.buffer.byteLength) | |
| } | |
| var r, n = this.readVarint32(e), | |
| i = e; | |
| e += n.length, n = n.value; | |
| var a = e + n, | |
| s = o.stringDestination(); | |
| return o.decodeUTF8toUTF16(function() { | |
| return a > e ? this.view.getUint8(e++) : null | |
| }.bind(this), s, this.noAssert), r = s(), t ? (this.offset = e, r) : { | |
| string: r, | |
| length: e - i | |
| } | |
| }, t.prototype.append = function(e, r, n) { | |
| "number" != typeof r && "string" == typeof r || (n = r, r = void 0); | |
| var o = "undefined" == typeof n; | |
| if (o && (n = this.offset), !this.noAssert) { | |
| if ("number" != typeof n || n % 1 !== 0) throw new TypeError("Illegal offset: " + n + " (not an integer)"); | |
| if (n >>>= 0, 0 > n || n + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + n + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| e instanceof t || (e = t.wrap(e, r)); | |
| var i = e.limit - e.offset; | |
| if (0 >= i) return this; | |
| n += i; | |
| var a = this.buffer.byteLength; | |
| return n > a && this.resize((a *= 2) > n ? a : n), n -= i, new Uint8Array(this.buffer, n).set(new Uint8Array(e.buffer).subarray(e.offset, e.limit)), e.offset += i, o && (this.offset += i), this | |
| }, t.prototype.appendTo = function(e, t) { | |
| return e.append(this, t), this | |
| }, t.prototype.assert = function(e) { | |
| return this.noAssert = !e, this | |
| }, t.prototype.capacity = function() { | |
| return this.buffer.byteLength | |
| }, t.prototype.clear = function() { | |
| return this.offset = 0, this.limit = this.buffer.byteLength, this.markedOffset = -1, this | |
| }, t.prototype.clone = function(e) { | |
| var r = new t(0, this.littleEndian, this.noAssert); | |
| if (e) { | |
| var n = new ArrayBuffer(this.buffer.byteLength); | |
| new Uint8Array(n).set(this.buffer), r.buffer = n, r.view = new DataView(n) | |
| } else r.buffer = this.buffer, r.view = this.view; | |
| return r.offset = this.offset, r.markedOffset = this.markedOffset, r.limit = this.limit, r | |
| }, t.prototype.compact = function(e, t) { | |
| if ("undefined" == typeof e && (e = this.offset), "undefined" == typeof t && (t = this.limit), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal begin: Not an integer"); | |
| if (e >>>= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal end: Not an integer"); | |
| if (t >>>= 0, 0 > e || e > t || t > this.buffer.byteLength) throw new RangeError("Illegal range: 0 <= " + e + " <= " + t + " <= " + this.buffer.byteLength) | |
| } | |
| if (0 === e && t === this.buffer.byteLength) return this; | |
| var n = t - e; | |
| if (0 === n) return this.buffer = r, this.view = null, this.markedOffset >= 0 && (this.markedOffset -= e), this.offset = 0, this.limit = 0, this; | |
| var o = new ArrayBuffer(n); | |
| return new Uint8Array(o).set(new Uint8Array(this.buffer).subarray(e, t)), this.buffer = o, this.view = new DataView(o), this.markedOffset >= 0 && (this.markedOffset -= e), this.offset = 0, this.limit = n, this | |
| }, t.prototype.copy = function(e, r) { | |
| if ("undefined" == typeof e && (e = this.offset), "undefined" == typeof r && (r = this.limit), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal begin: Not an integer"); | |
| if (e >>>= 0, "number" != typeof r || r % 1 !== 0) throw new TypeError("Illegal end: Not an integer"); | |
| if (r >>>= 0, 0 > e || e > r || r > this.buffer.byteLength) throw new RangeError("Illegal range: 0 <= " + e + " <= " + r + " <= " + this.buffer.byteLength) | |
| } | |
| if (e === r) return new t(0, this.littleEndian, this.noAssert); | |
| var n = r - e, | |
| o = new t(n, this.littleEndian, this.noAssert); | |
| return o.offset = 0, o.limit = n, o.markedOffset >= 0 && (o.markedOffset -= e), this.copyTo(o, 0, e, r), o | |
| }, t.prototype.copyTo = function(e, r, n, o) { | |
| var i, a; | |
| if (!this.noAssert && !t.isByteBuffer(e)) throw new TypeError("Illegal target: Not a ByteBuffer"); | |
| if (r = (a = "undefined" == typeof r) ? e.offset : 0 | r, n = (i = "undefined" == typeof n) ? this.offset : 0 | n, o = "undefined" == typeof o ? this.limit : 0 | o, 0 > r || r > e.buffer.byteLength) throw new RangeError("Illegal target range: 0 <= " + r + " <= " + e.buffer.byteLength); | |
| if (0 > n || o > this.buffer.byteLength) throw new RangeError("Illegal source range: 0 <= " + n + " <= " + this.buffer.byteLength); | |
| var s = o - n; | |
| return 0 === s ? e : (e.ensureCapacity(r + s), new Uint8Array(e.buffer).set(new Uint8Array(this.buffer).subarray(n, o), r), i && (this.offset += s), a && (e.offset += s), this) | |
| }, t.prototype.ensureCapacity = function(e) { | |
| var t = this.buffer.byteLength; | |
| return e > t ? this.resize((t *= 2) > e ? t : e) : this | |
| }, t.prototype.fill = function(e, t, r) { | |
| var n = "undefined" == typeof t; | |
| if (n && (t = this.offset), "string" == typeof e && e.length > 0 && (e = e.charCodeAt(0)), "undefined" == typeof t && (t = this.offset), "undefined" == typeof r && (r = this.limit), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal value: " + e + " (not an integer)"); | |
| if (e |= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal begin: Not an integer"); | |
| if (t >>>= 0, "number" != typeof r || r % 1 !== 0) throw new TypeError("Illegal end: Not an integer"); | |
| if (r >>>= 0, 0 > t || t > r || r > this.buffer.byteLength) throw new RangeError("Illegal range: 0 <= " + t + " <= " + r + " <= " + this.buffer.byteLength) | |
| } | |
| if (t >= r) return this; | |
| for (; r > t;) this.view.setUint8(t++, e); | |
| return n && (this.offset = t), this | |
| }, t.prototype.flip = function() { | |
| return this.limit = this.offset, this.offset = 0, this | |
| }, t.prototype.mark = function(e) { | |
| if (e = "undefined" == typeof e ? this.offset : e, !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal offset: " + e + " (not an integer)"); | |
| if (e >>>= 0, 0 > e || e + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + e + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| return this.markedOffset = e, this | |
| }, t.prototype.order = function(e) { | |
| if (!this.noAssert && "boolean" != typeof e) throw new TypeError("Illegal littleEndian: Not a boolean"); | |
| return this.littleEndian = !!e, this | |
| }, t.prototype.LE = function(e) { | |
| return this.littleEndian = "undefined" != typeof e ? !!e : !0, this | |
| }, t.prototype.BE = function(e) { | |
| return this.littleEndian = "undefined" != typeof e ? !e : !1, this | |
| }, t.prototype.prepend = function(e, r, n) { | |
| "number" != typeof r && "string" == typeof r || (n = r, r = void 0); | |
| var o = "undefined" == typeof n; | |
| if (o && (n = this.offset), !this.noAssert) { | |
| if ("number" != typeof n || n % 1 !== 0) throw new TypeError("Illegal offset: " + n + " (not an integer)"); | |
| if (n >>>= 0, 0 > n || n + 0 > this.buffer.byteLength) throw new RangeError("Illegal offset: 0 <= " + n + " (+0) <= " + this.buffer.byteLength) | |
| } | |
| e instanceof t || (e = t.wrap(e, r)); | |
| var i = e.limit - e.offset; | |
| if (0 >= i) return this; | |
| var a, s = i - n; | |
| if (s > 0) { | |
| var d = new ArrayBuffer(this.buffer.byteLength + s); | |
| a = new Uint8Array(d), a.set(new Uint8Array(this.buffer).subarray(n, this.buffer.byteLength), i), this.buffer = d, this.view = new DataView(d), this.offset += s, this.markedOffset >= 0 && (this.markedOffset += s), this.limit += s, n += s | |
| } else a = new Uint8Array(this.buffer); | |
| return a.set(new Uint8Array(e.buffer).subarray(e.offset, e.limit), n - i), e.offset = e.limit, o && (this.offset -= i), this | |
| }, t.prototype.prependTo = function(e, t) { | |
| return e.prepend(this, t), this | |
| }, t.prototype.printDebug = function(e) { | |
| "function" != typeof e && (e = console.log.bind(console)), e(this.toString() + "\n-------------------------------------------------------------------\n" + this.toDebug(!0)) | |
| }, t.prototype.remaining = function() { | |
| return this.limit - this.offset | |
| }, t.prototype.reset = function() { | |
| return this.markedOffset >= 0 ? (this.offset = this.markedOffset, this.markedOffset = -1) : this.offset = 0, this | |
| }, t.prototype.resize = function(e) { | |
| if (!this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal capacity: " + e + " (not an integer)"); | |
| if (e |= 0, 0 > e) throw new RangeError("Illegal capacity: 0 <= " + e) | |
| } | |
| if (this.buffer.byteLength < e) { | |
| var t = new ArrayBuffer(e); | |
| new Uint8Array(t).set(new Uint8Array(this.buffer)), this.buffer = t, this.view = new DataView(t) | |
| } | |
| return this | |
| }, t.prototype.reverse = function(e, t) { | |
| if ("undefined" == typeof e && (e = this.offset), "undefined" == typeof t && (t = this.limit), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal begin: Not an integer"); | |
| if (e >>>= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal end: Not an integer"); | |
| if (t >>>= 0, 0 > e || e > t || t > this.buffer.byteLength) throw new RangeError("Illegal range: 0 <= " + e + " <= " + t + " <= " + this.buffer.byteLength) | |
| } | |
| return e === t ? this : (Array.prototype.reverse.call(new Uint8Array(this.buffer).subarray(e, t)), this.view = new DataView(this.buffer), this) | |
| }, t.prototype.skip = function(e) { | |
| if (!this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal length: " + e + " (not an integer)"); | |
| e |= 0 | |
| } | |
| var t = this.offset + e; | |
| if (!this.noAssert && (0 > t || t > this.buffer.byteLength)) throw new RangeError("Illegal length: 0 <= " + this.offset + " + " + e + " <= " + this.buffer.byteLength); | |
| return this.offset = t, this | |
| }, t.prototype.slice = function(e, t) { | |
| if ("undefined" == typeof e && (e = this.offset), "undefined" == typeof t && (t = this.limit), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal begin: Not an integer"); | |
| if (e >>>= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal end: Not an integer"); | |
| if (t >>>= 0, 0 > e || e > t || t > this.buffer.byteLength) throw new RangeError("Illegal range: 0 <= " + e + " <= " + t + " <= " + this.buffer.byteLength) | |
| } | |
| var r = this.clone(); | |
| return r.offset = e, r.limit = t, r | |
| }, t.prototype.toBuffer = function(e) { | |
| var t = this.offset, | |
| n = this.limit; | |
| if (t > n) { | |
| var o = t; | |
| t = n, n = o | |
| } | |
| if (!this.noAssert) { | |
| if ("number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal offset: Not an integer"); | |
| if (t >>>= 0, "number" != typeof n || n % 1 !== 0) throw new TypeError("Illegal limit: Not an integer"); | |
| if (n >>>= 0, 0 > t || t > n || n > this.buffer.byteLength) throw new RangeError("Illegal range: 0 <= " + t + " <= " + n + " <= " + this.buffer.byteLength) | |
| } | |
| if (!e && 0 === t && n === this.buffer.byteLength) return this.buffer; | |
| if (t === n) return r; | |
| var i = new ArrayBuffer(n - t); | |
| return new Uint8Array(i).set(new Uint8Array(this.buffer).subarray(t, n), 0), i | |
| }, t.prototype.toArrayBuffer = t.prototype.toBuffer, t.prototype.toString = function(e) { | |
| if ("undefined" == typeof e) return "ByteBufferAB(offset=" + this.offset + ",markedOffset=" + this.markedOffset + ",limit=" + this.limit + ",capacity=" + this.capacity() + ")"; | |
| switch (e) { | |
| case "utf8": | |
| return this.toUTF8(); | |
| case "base64": | |
| return this.toBase64(); | |
| case "hex": | |
| return this.toHex(); | |
| case "binary": | |
| return this.toBinary(); | |
| case "debug": | |
| return this.toDebug(); | |
| case "columns": | |
| return this.toColumns(); | |
| default: | |
| throw new Error("Unsupported encoding: " + e) | |
| } | |
| }; | |
| var n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; | |
| n += "", t.prototype.toBase64 = function(e, t) { | |
| if ("undefined" == typeof e && (e = this.offset), "undefined" == typeof t && (t = this.limit), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal begin: Not an integer"); | |
| if (e >>>= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal end: Not an integer"); | |
| if (t >>>= 0, 0 > e || e > t || t > this.buffer.byteLength) throw new RangeError("Illegal range: 0 <= " + e + " <= " + t + " <= " + this.buffer.byteLength) | |
| } | |
| if (e === t) return ""; | |
| for (var r, o, i, a, s, d, c, u, l, f = ""; t > e;) r = this.view.getUint8(e++), o = (a = t > e) ? this.view.getUint8(e++) : 0, i = (s = t > e) ? this.view.getUint8(e++) : 0, d = r >> 2, c = (3 & r) << 4 | o >> 4, u = (15 & o) << 2 | i >> 6, l = 63 & i, s || (l = 64, a || (u = 64)), f += n.charAt(d) + n.charAt(c) + n.charAt(u) + n.charAt(l); | |
| return f | |
| }, t.fromBase64 = function(e, r, o) { | |
| if (!o) { | |
| if ("string" != typeof e) throw new TypeError("Illegal str: Not a string"); | |
| if (e.length % 4 !== 0) throw new TypeError("Illegal str: Length not a multiple of 4") | |
| } | |
| var i, a, s = e.length, | |
| d = 0; | |
| for (i = e.length - 1; i >= 0 && "=" === e.charAt(i); --i) d++; | |
| if (d > 2) throw new TypeError("Illegal str: Suffix is too large"); | |
| if (0 === s) return new t(0, r, o); | |
| var c, u, l, f, h, p, m, g = new t(s / 4 * 3 - d, r, o); | |
| for (i = 0, a = 0; s > i;) { | |
| if (c = n.indexOf(e.charAt(i++)), u = (h = s > i) ? n.indexOf(e.charAt(i++)) : 0, l = (p = s > i) ? n.indexOf(e.charAt(i++)) : 0, f = (m = s > i) ? n.indexOf(e.charAt(i++)) : 0, !o && (0 > c || 0 > u || 0 > l || 0 > f)) throw new TypeError("Illegal str: Contains non-base64 characters"); | |
| g.view.setUint8(a++, c << 2 | u >> 4), 64 !== l && (g.view.setUint8(a++, u << 4 & 240 | l >> 2, a), 64 !== f && g.view.setUint8(a++, l << 6 & 192 | f)) | |
| } | |
| return g.limit = a, g | |
| }, t.btoa = function(e) { | |
| return t.fromBinary(e).toBase64() | |
| }, t.atob = function(e) { | |
| return t.fromBase64(e).toBinary() | |
| }, t.prototype.toBinary = function(e, t) { | |
| if (e = "undefined" == typeof e ? this.offset : e, t = "undefined" == typeof t ? this.limit : t, !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal begin: Not an integer"); | |
| if (e >>>= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal end: Not an integer"); | |
| if (t >>>= 0, 0 > e || e > t || t > this.buffer.byteLength) throw new RangeError("Illegal range: 0 <= " + e + " <= " + t + " <= " + this.buffer.byteLength) | |
| } | |
| if (e === t) return ""; | |
| for (var r = []; t > e;) r.push(this.view.getUint8(e++)); | |
| return String.fromCharCode.apply(String, r) | |
| }, t.fromBinary = function(e, r, n) { | |
| if (!n && "string" != typeof e) throw new TypeError("Illegal str: Not a string"); | |
| for (var o, i = 0, a = e.length, s = new t(a, r, n); a > i;) { | |
| if (o = e.charCodeAt(i), !n && o > 255) throw new TypeError("Illegal charCode at " + i + ": 0 <= " + o + " <= 255"); | |
| s.view.setUint8(i++, o) | |
| } | |
| return s.limit = a, s | |
| }, t.prototype.toDebug = function(e) { | |
| for (var t, r = -1, n = this.buffer.byteLength, o = "", i = "", a = ""; n > r;) { | |
| if (-1 !== r && (t = this.view.getUint8(r), o += 16 > t ? "0" + t.toString(16).toUpperCase() : t.toString(16).toUpperCase(), e && (i += t > 32 && 127 > t ? String.fromCharCode(t) : ".")), ++r, e && r > 0 && r % 16 === 0 && r !== n) { | |
| for (; o.length < 51;) o += " "; | |
| a += o + i + "\n", o = i = "" | |
| } | |
| o += r === this.offset && r === this.limit ? r === this.markedOffset ? "!" : "|" : r === this.offset ? r === this.markedOffset ? "[" : "<" : r === this.limit ? r === this.markedOffset ? "]" : ">" : r === this.markedOffset ? "'" : e || 0 !== r && r !== n ? " " : "" | |
| } | |
| if (e && " " !== o) { | |
| for (; o.length < 51;) o += " "; | |
| a += o + i + "\n" | |
| } | |
| return e ? a : o | |
| }, t.fromDebug = function(e, r, n) { | |
| for (var o, i, a = e.length, s = new t((a + 1) / 3 | 0, r, n), d = 0, c = 0, u = !1, l = !1, f = !1, h = !1, p = !1; a > d;) { | |
| switch (o = e.charAt(d++)) { | |
| case "!": | |
| if (!n) { | |
| if (l || f || h) { | |
| p = !0; | |
| break | |
| } | |
| l = f = h = !0 | |
| } | |
| s.offset = s.markedOffset = s.limit = c, u = !1; | |
| break; | |
| case "|": | |
| if (!n) { | |
| if (l || h) { | |
| p = !0; | |
| break | |
| } | |
| l = h = !0 | |
| } | |
| s.offset = s.limit = c, u = !1; | |
| break; | |
| case "[": | |
| if (!n) { | |
| if (l || f) { | |
| p = !0; | |
| break | |
| } | |
| l = f = !0 | |
| } | |
| s.offset = s.markedOffset = c, u = !1; | |
| break; | |
| case "<": | |
| if (!n) { | |
| if (l) { | |
| p = !0; | |
| break | |
| } | |
| l = !0 | |
| } | |
| s.offset = c, u = !1; | |
| break; | |
| case "]": | |
| if (!n) { | |
| if (h || f) { | |
| p = !0; | |
| break | |
| } | |
| h = f = !0 | |
| } | |
| s.limit = s.markedOffset = c, u = !1; | |
| break; | |
| case ">": | |
| if (!n) { | |
| if (h) { | |
| p = !0; | |
| break | |
| } | |
| h = !0 | |
| } | |
| s.limit = c, u = !1; | |
| break; | |
| case "'": | |
| if (!n) { | |
| if (f) { | |
| p = !0; | |
| break | |
| } | |
| f = !0 | |
| } | |
| s.markedOffset = c, u = !1; | |
| break; | |
| case " ": | |
| u = !1; | |
| break; | |
| default: | |
| if (!n && u) { | |
| p = !0; | |
| break | |
| } | |
| if (i = parseInt(o + e.charAt(d++), 16), !n && (isNaN(i) || 0 > i || i > 255)) throw new TypeError("Illegal str: Not a debug encoded string"); | |
| s.view.setUint8(c++, i), u = !0 | |
| } | |
| if (p) throw new TypeError("Illegal str: Invalid symbol at " + d) | |
| } | |
| if (!n) { | |
| if (!l || !h) throw new TypeError("Illegal str: Missing offset or limit"); | |
| if (c < s.buffer.byteLength) throw new TypeError("Illegal str: Not a debug encoded string (is it hex?) " + c + " < " + a) | |
| } | |
| return s | |
| }, t.prototype.toHex = function(e, t) { | |
| if (e = "undefined" == typeof e ? this.offset : e, t = "undefined" == typeof t ? this.limit : t, !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal begin: Not an integer"); | |
| if (e >>>= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal end: Not an integer"); | |
| if (t >>>= 0, 0 > e || e > t || t > this.buffer.byteLength) throw new RangeError("Illegal range: 0 <= " + e + " <= " + t + " <= " + this.buffer.byteLength) | |
| } | |
| for (var r, n = new Array(t - e); t > e;) r = this.view.getUint8(e++), 16 > r ? n.push("0", r.toString(16)) : n.push(r.toString(16)); | |
| return n.join("") | |
| }, t.fromHex = function(e, r, n) { | |
| if (!n) { | |
| if ("string" != typeof e) throw new TypeError("Illegal str: Not a string"); | |
| if (e.length % 2 !== 0) throw new TypeError("Illegal str: Length not a multiple of 2") | |
| } | |
| for (var o, i = e.length, a = new t(i / 2 | 0, r), s = 0, d = 0; i > s; s += 2) { | |
| if (o = parseInt(e.substring(s, s + 2), 16), !n && (!isFinite(o) || 0 > o || o > 255)) throw new TypeError("Illegal str: Contains non-hex characters"); | |
| a.view.setUint8(d++, o) | |
| } | |
| return a.limit = d, a | |
| }; | |
| var o = function() { | |
| var e = {}; | |
| return e.encodeUTF8 = function(e, t) { | |
| var r = null; | |
| for ("number" == typeof e && (r = e, e = function() { | |
| return null | |
| }); null !== r || null !== (r = e());) 128 > r ? t(127 & r) : 2048 > r ? (t(r >> 6 & 31 | 192), t(63 & r | 128)) : 65536 > r ? (t(r >> 12 & 15 | 224), t(r >> 6 & 63 | 128), t(63 & r | 128)) : (t(r >> 18 & 7 | 240), t(r >> 12 & 63 | 128), t(r >> 6 & 63 | 128), t(63 & r | 128)), r = null | |
| }, e.decodeUTF8 = function(e, t) { | |
| for (var r, n, o, i, a = function(e) { | |
| e = e.slice(0, e.indexOf(null)); | |
| var t = Error(e.toString()); | |
| throw t.name = "TruncatedError", t.bytes = e, t | |
| }; null !== (r = e());) | |
| if (0 === (128 & r)) t(r); | |
| else if (192 === (224 & r)) null === (n = e()) && a([r, n]), t((31 & r) << 6 | 63 & n); | |
| else if (224 === (240 & r))(null === (n = e()) || null === (o = e())) && a([r, n, o]), t((15 & r) << 12 | (63 & n) << 6 | 63 & o); | |
| else { | |
| if (240 !== (248 & r)) throw RangeError("Illegal starting byte: " + r); | |
| (null === (n = e()) || null === (o = e()) || null === (i = e())) && a([r, n, o, i]), t((7 & r) << 18 | (63 & n) << 12 | (63 & o) << 6 | 63 & i) | |
| } | |
| }, e.UTF16toUTF8 = function(e, t) { | |
| for (var r, n = null;;) { | |
| if (null === (r = null !== n ? n : e())) break; | |
| r >= 55296 && 57343 >= r && null !== (n = e()) && n >= 56320 && 57343 >= n ? (t(1024 * (r - 55296) + n - 56320 + 65536), n = null) : t(r) | |
| } | |
| null !== n && t(n) | |
| }, e.UTF8toUTF16 = function(e, t) { | |
| var r = null; | |
| for ("number" == typeof e && (r = e, e = function() { | |
| return null | |
| }); null !== r || null !== (r = e());) 65535 >= r ? t(r) : (r -= 65536, t((r >> 10) + 55296), t(r % 1024 + 56320)), r = null | |
| }, e.encodeUTF16toUTF8 = function(t, r) { | |
| e.UTF16toUTF8(t, function(t) { | |
| e.encodeUTF8(t, r) | |
| }) | |
| }, e.decodeUTF8toUTF16 = function(t, r) { | |
| e.decodeUTF8(t, function(t) { | |
| e.UTF8toUTF16(t, r) | |
| }) | |
| }, e.assertByte = function(e) { | |
| if ("number" != typeof e || e !== e) throw TypeError("Illegal byte: " + typeof e); | |
| if (-128 > e || e > 255) throw RangeError("Illegal byte: " + e); | |
| return e | |
| }, e.assertCharCode = function(e) { | |
| if ("number" != typeof e || e !== e) throw TypeError("Illegal char code: " + typeof e); | |
| if (0 > e || e > 65535) throw RangeError("Illegal char code: " + e); | |
| return e | |
| }, e.assertCodePoint = function(e) { | |
| if ("number" != typeof e || e !== e) throw TypeError("Illegal code point: " + typeof e); | |
| if (0 > e || e > 1114111) throw RangeError("Illegal code point: " + e); | |
| return e | |
| }, e.calculateCodePoint = function(e) { | |
| return 128 > e ? 1 : 2048 > e ? 2 : 65536 > e ? 3 : 4 | |
| }, e.calculateUTF8 = function(t) { | |
| for (var r, n = 0; null !== (r = t());) n += e.calculateCodePoint(r); | |
| return n | |
| }, e.calculateUTF16asUTF8 = function(t) { | |
| var r = 0, | |
| n = 0; | |
| return e.UTF16toUTF8(t, function(t) { | |
| ++r, n += e.calculateCodePoint(t) | |
| }), [r, n] | |
| }, e | |
| }(), | |
| a = String.fromCharCode; | |
| return o.stringSource = function(e) { | |
| var t = 0; | |
| return function() { | |
| return t < e.length ? e.charCodeAt(t++) : null | |
| } | |
| }, o.stringDestination = function() { | |
| var e = [], | |
| t = []; | |
| return function() { | |
| return 0 === arguments.length ? t.join("") + a.apply(String, e) : (e.length + arguments.length > 1024 && (t.push(a.apply(String, e)), e.length = 0), void Array.prototype.push.apply(e, arguments)) | |
| } | |
| }, t.prototype.toUTF8 = function(e, t) { | |
| if ("undefined" == typeof e && (e = this.offset), "undefined" == typeof t && (t = this.limit), !this.noAssert) { | |
| if ("number" != typeof e || e % 1 !== 0) throw new TypeError("Illegal begin: Not an integer"); | |
| if (e >>>= 0, "number" != typeof t || t % 1 !== 0) throw new TypeError("Illegal end: Not an integer"); | |
| if (t >>>= 0, 0 > e || e > t || t > this.buffer.byteLength) throw new RangeError("Illegal range: 0 <= " + e + " <= " + t + " <= " + this.buffer.byteLength) | |
| } | |
| var r, n = this; | |
| try { | |
| o.decodeUTF8toUTF16(function() { | |
| return t > e ? n.view.getUint8(e++) : null | |
| }, r = o.stringDestination()) | |
| } catch (i) { | |
| if (e !== t) throw new RangeError("Illegal range: Truncated data, " + e + " != " + t) | |
| } | |
| return r() | |
| }, t.fromUTF8 = function(e, r, n) { | |
| if (!n && "string" != typeof e) throw new TypeError("Illegal str: Not a string"); | |
| var i = new t(o.calculateUTF16asUTF8(o.stringSource(e), !0)[1], r, n), | |
| a = 0; | |
| return o.encodeUTF16toUTF8(o.stringSource(e), function(e) { | |
| i.view.setUint8(a++, e) | |
| }), i.limit = a, i | |
| }, t | |
| } | |
| e.exports = n(r(339)) | |
| }(this) | |
| }).call(t, r(50)(e)) | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(1), | |
| o = r(42), | |
| i = r(75), | |
| a = { | |
| isMainLoaded: !1, | |
| uiBusy: 0, | |
| mainLoaded: function() { | |
| this.isMainLoaded = !0, this.trigger("main_loaded") | |
| }, | |
| incrementProgress: function() { | |
| n.log("Cmd: incrementProgress")(), this.trigger("increment_progress") | |
| }, | |
| logSocketSummary: function() { | |
| this.trigger("log_socket_summary") | |
| }, | |
| muteChat: function(e, t, r) { | |
| this.trigger("mute_chat", e, t, r) | |
| }, | |
| deleteOrExitChat: function(e, t) { | |
| this.trigger("delete_or_exit_chat", e, t) | |
| }, | |
| clearChatMsgs: function(e, t) { | |
| this.trigger("clear_chat_msgs", e, t) | |
| }, | |
| archiveChat: function(e, t) { | |
| this.trigger("archive_chat", e, t) | |
| }, | |
| markChatUnread: function(e, t) { | |
| this.trigger("mark_chat_unread", e, t) | |
| }, | |
| msgInfoDrawer: function(e) { | |
| this.trigger("msg_info_drawer", e) | |
| }, | |
| groupInfoDrawer: function(e) { | |
| this.trigger("group_info_drawer", e) | |
| }, | |
| broadcastInfoDrawer: function(e) { | |
| this.trigger("broadcast_info_drawer", e) | |
| }, | |
| contactInfoDrawer: function(e) { | |
| this.trigger("contact_info_drawer", e) | |
| }, | |
| openChat: function(e, t) { | |
| var r = arguments.length <= 2 || void 0 === arguments[2] ? !0 : arguments[2], | |
| n = arguments.length <= 3 || void 0 === arguments[3] ? !0 : arguments[3]; | |
| this.closeDrawer(), !t && e && e.unreadMsgAnchor && (t = { | |
| collection: e.unreadMsgAnchor.msgChunk, | |
| promise: Promise.resolve(), | |
| msg: e.unreadMsgAnchor, | |
| isUnreadDivider: !0, | |
| highlightMsg: !1 | |
| }), this.trigger("open_chat", e, t, r, n) | |
| }, | |
| clearChat: function(e) { | |
| this.trigger("clear_chat", e) | |
| }, | |
| focusChatTextInput: function(e) { | |
| e ? this.trigger("focus_chat_text_input_" + e.id) : this.trigger("focus_chat_text_input") | |
| }, | |
| focusShowMsg: function(e) { | |
| this.trigger("focus_show_msg", e) | |
| }, | |
| enterChatTextInput: function(e) { | |
| this.trigger("enter_chat_text_input_" + e.id) | |
| }, | |
| focusNextChat: function(e) { | |
| this.trigger("focus_next_chat", e) | |
| }, | |
| focusPrevChat: function(e) { | |
| this.trigger("focus_prev_chat", e) | |
| }, | |
| focusChatList: function() { | |
| this.trigger("focus_chat_list") | |
| }, | |
| focusChatSearch: function() { | |
| this.trigger("focus_chat_search") | |
| }, | |
| pasteChatTextInput: function(e, t) { | |
| this.trigger("paste_chat_text_input_" + e.id, t) | |
| }, | |
| composeHeightChange: function(e, t) { | |
| this.trigger("compose_height_change", e, t) | |
| }, | |
| isMsgVisible: function(e, t) { | |
| this.trigger("is_msg_visible", e, t) | |
| }, | |
| jsHaltDetected: function(e) { | |
| this.trigger("js_halt_detected", e) | |
| }, | |
| login: function(e) { | |
| this.trigger("login", e) | |
| }, | |
| openContextMenu: function(e, t) { | |
| this.trigger("open_context_menu", e, t) | |
| }, | |
| openTooltip: function(e, t) { | |
| this.trigger("open_tooltip", e, t) | |
| }, | |
| openToast: function(e) { | |
| this.trigger("open_toast", e) | |
| }, | |
| closeToast: function(e) { | |
| this.trigger("close_toast", e) | |
| }, | |
| alertNewMsg: function(e) { | |
| this.trigger("alert_new_msg", e) | |
| }, | |
| alertCall: function(e, t) { | |
| this.trigger("alert_call", e, t) | |
| }, | |
| cancelCall: function(e) { | |
| this.trigger("cancel_call", e) | |
| }, | |
| windowError: function(e) {}, | |
| error2412: function(e) {}, | |
| sentPing: function(e) {}, | |
| openModal: function(e, t, r, n) { | |
| this.trigger("open_modal", e, t, r, n) | |
| }, | |
| closeModal: function() { | |
| this.trigger("close_modal") | |
| }, | |
| openModalMedia: function(e, t, r, n) { | |
| this.trigger("open_modal_media", e, t, r, n) | |
| }, | |
| closeModalMedia: function() { | |
| this.trigger("close_modal_media") | |
| }, | |
| openDrawer: function(e, t, r) { | |
| this.trigger("open_drawer", e, t, r) | |
| }, | |
| closeDrawer: function(e) { | |
| this.trigger("close_drawer", e) | |
| }, | |
| mediaPlaying: function(e) { | |
| this.trigger("mediaPlaying", e) | |
| }, | |
| uiResize: function() { | |
| this.trigger("resize") | |
| }, | |
| localeChange: function() { | |
| this.trigger("locale_change") | |
| }, | |
| clearUiBusy: _.debounce(function() { | |
| this.uiBusy && (n.log("cmd:clearUIBusy uibusy timeout")(), this.uiBusy = 0, this.trigger("ui_idle")) | |
| }, 1e3, { | |
| maxWait: 5e3 | |
| }), | |
| setUiBusy: function(e) { | |
| var t = this.uiBusy || 0; | |
| e ? (++t, this.clearUiBusy()) : t && --t, this.uiBusy = t, 0 === t && (this.clearUiBusy.cancel(), this.trigger("ui_idle")) | |
| }, | |
| windowMouseDown: function(e) { | |
| this.trigger("window_mousedown", e) | |
| }, | |
| windowClick: function(e) { | |
| this.trigger("window_click", e) | |
| }, | |
| midnight: function() { | |
| this.trigger("midnight") | |
| } | |
| }; | |
| _.extend(a, o, i), n.exportToWindow("Cmd", a), e.exports = a | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| var e = r(14), | |
| t = e.info(); | |
| if (t) { | |
| var n = "WhatsApp/" + s.VERSION_STR, | |
| o = "Web/" + t.ua, | |
| i = "Device/" + t.os; | |
| return n + " " + o + " " + i | |
| } | |
| } | |
| function o(e, t, r) { | |
| function h() { | |
| l = setTimeout(function() { | |
| var e = f; | |
| l = 0, f = void 0, "undefined" != typeof e && o(e ? "delayed-" + e : "delayed") | |
| }, s.LOG_UPLOAD_INTERVAL) | |
| } | |
| d.logSocketSummary(), i.log("==================================================")(), i.log("wa:uploadLogs ref: " + (Store.Conn.ref || "no conn"))(), i.log("wa:uploadLogs hash: " + s.LATEST_HASH)(), i.log("wa:uploadLogs version: " + s.VERSION_STR)(), i.log("wa:uploadLogs userAgent: " + navigator.userAgent)(), i.log("wa:uploadLogs platform: " + (Store.Conn.platform || "no platform"))(), i.log("wa:uploadLogs url: " + location.href)(); | |
| var p; | |
| "undefined" == typeof e ? (i.log("reason for logs: manual-upload")(), p = !0) : e && i.log("reason for logs: " + e)(), i.log("==================================================")(); | |
| var m = Store.Conn.me, | |
| g = m ? u.user(m) : c.getUnknownId(), | |
| v = n(); | |
| if (!p && !r) { | |
| if (!(Math.random() < s.UPLOAD_TO_CLB)) return i.log("wa:uploadLogs squelched logs")(), Promise.resolve("deferred"); | |
| if (l) return i.log("wa:uploadLogs delayed logs")(), "undefined" == typeof f && (f = e), Promise.resolve("deferred") | |
| } | |
| var y = (t ? Promise.resolve(i.getLogs()) : Promise.delay(500).then(i.getLogs.bind(i))).bind(this).then(function(e) { | |
| e = e.join("\n"); | |
| var t = new FormData, | |
| r = new Blob([e], { | |
| type: "text/plain" | |
| }); | |
| return t.append("from", g), t.append("agent", v), t.append("file", r, "logs.txt"), a.post(s.CLB_URL, t)["catch"](_.noop) | |
| }); | |
| return r || h(), y | |
| } | |
| var i = r(1), | |
| a = r(95), | |
| s = r(6), | |
| d = r(8), | |
| c = r(13), | |
| u = r(19), | |
| l = 0, | |
| f = void 0; | |
| e.exports = { | |
| upload: o | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| return e instanceof v | |
| } | |
| function o(e) { | |
| var t = c.getOldLogoutCreds(); | |
| c.setOldLogoutCreds(_.filter(t, _.negate(_.matches(e)))) | |
| } | |
| var i = r(1), | |
| a = r(9), | |
| s = r(43), | |
| d = r(6), | |
| c = r(13), | |
| u = r(8), | |
| l = r(170), | |
| f = r(97), | |
| h = r(153), | |
| p = r(25), | |
| m = r(18), | |
| g = r(151), | |
| v = r(7), | |
| y = r(34), | |
| b = r(45), | |
| w = r(374), | |
| E = r(96), | |
| S = r(14), | |
| N = r(74), | |
| T = r(134), | |
| $ = { | |
| OPENING: "OPENING", | |
| PAIRING: "PAIRING", | |
| UNPAIRED: "UNPAIRED", | |
| UNPAIRED_IDLE: "UNPAIRED_IDLE", | |
| CONNECTED: "CONNECTED", | |
| TIMEOUT: "TIMEOUT", | |
| CONFLICT: "CONFLICT", | |
| UNLAUNCHED: "UNLAUNCHED", | |
| PROXYBLOCK: "PROXYBLOCK", | |
| TOS_BLOCK: "TOS_BLOCK" | |
| }, | |
| C = { | |
| DISCONNECTED: "DISCONNECTED", | |
| SYNCING: "SYNCING", | |
| RESUMING: "RESUMING", | |
| CONNECTED: "CONNECTED" | |
| }, | |
| A = { | |
| NEW: "new", | |
| SENT: "sent", | |
| WEBDACKED: "webdacked", | |
| WILL_RETRY: "will_retry" | |
| }, | |
| I = m.defineAll(["SendCalledWhileDisconnected", "ExternalPoke", "MustExitLoop", "Denied401Failed", "Denied409Conflict", "DeniedTOS", "DeniedUnknown", "ForcedRefresh", "TooManyRefRequest", "UILogout", "WindowOffline", "PhoneFailedPing", "AssertionFailed", "TakeoverRequested", "PhoneReplacedClient", "NoSecretBundle", "PhoneKickedClient"]), | |
| O = { | |
| SYNC_INFO: ["Conn", g.OBJECT], | |
| CHALLENGE: ["Cmd", { | |
| type: "challenge", | |
| challenge: g.STRING | |
| }], | |
| DISCONNECT: ["Cmd", { | |
| type: "disconnect", | |
| kind: _ | |
| }], | |
| HARD_REFRESH: ["Cmd", { | |
| type: "update" | |
| }], | |
| PONG: ["Pong", g.BOOLEAN] | |
| }, | |
| k = { | |
| TAG: function(e) { | |
| return new g({ | |
| tag: e, | |
| data: g.ANY | |
| }) | |
| }, | |
| SYNC_INFO: new g({ | |
| tag: g.ANY, | |
| data: O.SYNC_INFO | |
| }), | |
| CHALLENGE: new g({ | |
| tag: g.ANY, | |
| data: O.CHALLENGE | |
| }), | |
| DISCONNECT: new g({ | |
| tag: g.ANY, | |
| data: O.DISCONNECT | |
| }), | |
| HARD_REFRESH: new g({ | |
| tag: g.ANY, | |
| data: O.HARD_REFRESH | |
| }), | |
| PONG: new g({ | |
| tag: g.ANY, | |
| data: O.PONG | |
| }) | |
| }, | |
| P = new g({ | |
| status: function(e) { | |
| return "number" == typeof e && e >= 500 | |
| }, | |
| _: _ | |
| }), | |
| R = 5, | |
| M = 6e4, | |
| L = 5, | |
| D = 500, | |
| U = 3e3, | |
| B = 3e3, | |
| x = 36e5, | |
| j = 120, | |
| W = 40, | |
| Y = s.extend({ | |
| extraProperties: "reject", | |
| props: { | |
| data: "any", | |
| tag: "string", | |
| state: { | |
| type: "string", | |
| values: _.values(A), | |
| "default": A.NEW | |
| }, | |
| ephemeral: "boolean", | |
| ignore: "boolean", | |
| clientCacheable: "boolean", | |
| onSend: "function", | |
| onDrop: "function", | |
| age: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| resends: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| resendTimer: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| binaryOpts: "object" | |
| }, | |
| derived: { | |
| likelyDead: { | |
| deps: ["age"], | |
| fn: function() { | |
| return this.age >= W | |
| } | |
| }, | |
| isToPhone: { | |
| deps: ["data"], | |
| fn: function() { | |
| return this.data instanceof ArrayBuffer | |
| } | |
| } | |
| }, | |
| getTag: function() { | |
| return this.tag || (this.onSend ? this.onSend.tag : void 0) | |
| }, | |
| toString: function() { | |
| return this.binaryOpts ? this.binaryOpts.debugString : !_.isArray(this.data) || "query" !== this.data[0] && "action" !== this.data[0] ? _.isArray(this.data) ? "[" + this.data[0] + (this.data.length > 1 ? ", ...]" : "]") : _.isObject(this.data) ? "{...}" : this.data + "" : "[" + this.data[0] + ", " + this.data[1] + (this.data.length > 2 ? ", ...]" : "]") | |
| }, | |
| serialize: function() { | |
| var e = this.tag; | |
| if (this.binaryOpts) { | |
| var t = this.binaryOpts, | |
| r = v.calculateUTF8Bytes(e) + 3, | |
| n = new v(r, !1), | |
| o = t.metric ? t.metric : 0, | |
| i = (this.ignore ? 0 : 1) << 7 | (!this.ignore && t.ackRequest ? 1 : 0) << 6 | (t.available === !0 ? 1 : 0) << 5 | (t.available === !1 ? 1 : 0) << 4 | (t.expires ? 1 : 0) << 3 | (t.skipOffline ? 1 : 0) << 2; | |
| return n.writeString(e), n.writeString(","), n.writeByte(o), n.writeByte(i), n.reset(), v.concat([n, this.data]).toBuffer() | |
| } | |
| var a = _.isString(this.data) ? this.data : JSON.stringify(this.data); | |
| return e + ",," + a | |
| } | |
| }), | |
| F = s.extend({ | |
| extraProperties: "reject", | |
| session: { | |
| socketPreload: "object", | |
| socket: "object", | |
| launchGeneration: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| backoffGeneration: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| hasSynced: "boolean", | |
| state: { | |
| type: "string", | |
| values: _.keys($), | |
| "default": $.UNLAUNCHED | |
| }, | |
| stream: { | |
| type: "string", | |
| values: _.keys(C), | |
| "default": C.DISCONNECTED | |
| }, | |
| canSend: "boolean", | |
| sendQueue: "array", | |
| sendHash: "object", | |
| sequence: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| shortTagBase: "string", | |
| socketWatcher: "object", | |
| refWatcher: "object", | |
| phoneWatchdog: "object", | |
| pendingPhoneReqs: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| isIncognito: "boolean", | |
| runPromise: "object", | |
| streamPromise: "object", | |
| logoutMutex: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| retryTimestamp: "number", | |
| pokeable: "object", | |
| conflictPromise: "object", | |
| launched: "boolean", | |
| mustExitLoop: "boolean", | |
| syncTag: "string", | |
| lastPhoneMessage: "number" | |
| }, | |
| initialize: function() { | |
| this.sendQueue = [], this.sendHash = {}, this.phoneWatchdog = new h({ | |
| waitAlgorithm: h.FIBONACCI(U, B, x), | |
| onTimeout: this.phoneTimedOut.bind(this), | |
| onActivated: this.onPhoneWatchdogActivated.bind(this), | |
| onFed: this.onPhoneWatchdogFed.bind(this), | |
| onDeactivated: this.onPhoneWatchdogDeactivated.bind(this) | |
| }), this.listenTo(this, "change:state", this.onStateChange.bind(this)), this.listenTo(this, "change:stream", this.onStreamChange.bind(this)), Promise.delay(0).then(p.determineIncognito).bind(this).then(function(e) { | |
| this.isIncognito = e | |
| }), this.listenTo(u, "log_socket_summary", this.summary) | |
| }, | |
| STATE: $, | |
| STREAM: C, | |
| preload: function(e) { | |
| this.socketPreload = e || new w | |
| }, | |
| send: function(e) { | |
| var t = new Y(e); | |
| this.sendQueue.push(t), this.flushQueue() | |
| }, | |
| shortTag: function() { | |
| return this.shortTagBase || (this.shortTagBase = (moment().unix() % 1e3).toString()), this.shortTagBase + ".--" + this.sequence++ | |
| }, | |
| tag: function(e) { | |
| var t = moment().unix() + ".--" + this.sequence++; | |
| return e && d.FLAVOR_TAGS ? t + "-" + e : t | |
| }, | |
| launch: function(e, t) { | |
| function r() { | |
| i.log("ws2:socket loop closed")(), this.socketPreload && this.socketPreload.deactivate(), this.clearState(), this.set({ | |
| state: $.UNLAUNCHED, | |
| mustExitLoop: !1, | |
| launched: !1, | |
| socketPreload: null | |
| }) | |
| } | |
| i.log("ws2:Launch gen" + this.launchGeneration + " (backoff gen" + this.backoffGeneration + ")")(), t = t || 0; | |
| var n = Date.now() + 300 * N.expBackoff(this.backoffGeneration, 100), | |
| o = n + M; | |
| if (this.launched) { | |
| var s = new Error("Redundant Launch"); | |
| return i.error("ws2:launch redundantly called!")(), i.errorVerbose(s.stack)(), void a.upload("redundant-launch") | |
| } | |
| this.mustExitLoop ? r.call(this) : (this.launched = !0, this.run(t, e).then(function(e) { | |
| return [e, !1] | |
| }).bind(this)["catch"](I.MustExitLoop, function() { | |
| return this.mustExitLoop = !0, [!1, !1] | |
| })["catch"](I.TakeoverRequested, function() { | |
| return [!1, !0] | |
| })["catch"](function(e) { | |
| return i.error("ws2:run error unknown!")(e), i.errorVerbose(e.stack)(), a.upload("unknown-error-in-ws-loop"), this.clearState(), [!0, !1] | |
| }).spread(function(e, t) { | |
| if (this.mustExitLoop) r.call(this); | |
| else { | |
| var i = Date.now(); | |
| this.launchGeneration++, this.backoffGeneration = e && o > i ? this.backoffGeneration + 1 : 0, this.launched = !1, this.launch(t, n > i ? n - i : 0) | |
| } | |
| })) | |
| }, | |
| poke: function() { | |
| this.pokeable ? this.pokeable.poke() : this.phoneWatchdog.forceTimeout() | |
| }, | |
| takeover: function() { | |
| if (!this.conflictPromise) throw "Takeover called without conflict!"; | |
| this.conflictPromise.cancel(new I.TakeoverRequested) | |
| }, | |
| exitLoop: function() { | |
| this.mustExitLoop = !0, this.runPromise && this.runPromise.cancel(new I.MustExitLoop) | |
| }, | |
| logout: function(e) { | |
| var t = this.runPromise; | |
| i.info("ws2:user logged out")(), this.stream === C.DISCONNECTED || e ? this.sendCurrentLogout() : this.sendCurrentLogout(this.socket), this.clearCredentials(), t && t.cancel(new I.UILogout), this.state === $.OPENING && this.trigger("change:state") | |
| }, | |
| summary: function() { | |
| i.log("ws:summary --------------------------------")(), i.log("ws state " + this.state)(), i.log("wd online: " + navigator.onLine)(), i.log("ws socket id: " + (this.socket ? this.socket.id : "n/a"))(), i.log("ws queue:")(), _.isEmpty(this.sendQueue) || l.printArray(_.map(this.sendQueue, function(e) { | |
| var t = _.pick(e, "tag", "state", "age", "ephemeral", "isToPhone"); | |
| return e && e.toString && (t.debug = e.toString()), t | |
| })).split(/\n/).forEach(function(e) { | |
| i.log(e)() | |
| }), i.log("ws hash:")(), _.isEmpty(this.sendHash) || l.printArray(_.map(this.sendHash, function(e) { | |
| var t = _.pick(e, "tag", "state", "age", "ephemeral", "isToPhone"); | |
| return e && e.toString && (t.debug = e.toString()), t | |
| })).split(/\n/).forEach(function(e) { | |
| i.log(e)() | |
| }) | |
| }, | |
| onStateChange: function() { | |
| i.log("ws2:state change: " + this.state)() | |
| }, | |
| onStreamChange: function() { | |
| i.log("ws2:stream change: " + this.stream)(), this.stream === C.DISCONNECTED && this.onRefCycle() | |
| }, | |
| onRefCycle: function() { | |
| i.log("ws2:onRefCycle")(), this.sendQueue.forEach(function(e) { | |
| e.state = A.NEW, e.age = 0 | |
| }), this.clearSendHash() | |
| }, | |
| onActivity: function(e) { | |
| if (e) { | |
| var t = e.data; | |
| if (k.HARD_REFRESH.test(e)) i.error("ws2:hard refresh!")(), E.update(0); | |
| else if (t) { | |
| var r = _.isArray(t) ? " [" + t[0] + ", ...]" : ""; | |
| i.logColor("green", " recv: " + e.tag + r, t)() | |
| } else i.logColor("#669999", " ack: " + e.tag)() | |
| } else T.setSkew(this.socket.timeSkew || 0); | |
| this.sendRemainingLogouts() | |
| }, | |
| onPhoneWatchdogActivated: function() {}, | |
| onPhoneWatchdogFed: function() { | |
| this.state = $.CONNECTED | |
| }, | |
| onPhoneWatchdogDeactivated: function() {}, | |
| flushQueue: function() { | |
| if (this.canSend && this.sendQueue.length) { | |
| var e = _.where(this.sendQueue, { | |
| state: A.NEW | |
| }), | |
| t = T.localUnixTime(), | |
| r = _.partition(e, function(e) { | |
| return e.binaryOpts && e.binaryOpts.expires ? t - e.binaryOpts.expires > j : !1 | |
| }), | |
| n = r[0], | |
| o = r[1]; | |
| this.sendQueue = _.difference(this.sendQueue, n), n.forEach(function(e) { | |
| delete this.sendHash[e.tag], e.onSend({ | |
| status: 408 | |
| }) | |
| }, this), o.length && o.forEach(this._send, this) | |
| } | |
| }, | |
| phoneTimedOut: function() { | |
| var e = this.phoneWatchdog.failGeneration; | |
| if (1 === e) { | |
| i.warn("ws2:Phone timed out")(); | |
| var t = _.pluck(this.sendHash, "tag"); | |
| i.warn("ws2:Outstanding Reqs: " + t.join(","))() | |
| } | |
| u.sentPing(e); | |
| var r = this.phoneWatchdog.waitAlgorithm(this.phoneWatchdog); | |
| return this.set({ | |
| state: $.TIMEOUT, | |
| retryTimestamp: Date.now() + r | |
| }), this._basicSend({ | |
| tag: this.tag("ping"), | |
| data: ["admin", "test"] | |
| }, "ping"), !0 | |
| }, | |
| clearSendHash: function(e) { | |
| if (e) _.each(this.sendHash, function(e) { | |
| e.resendTimer && clearTimeout(e.resendTimer), e.onDrop(new m.LogoutDrop(e.toString())) | |
| }); | |
| else { | |
| var t = _.filter(this.sendHash, "ephemeral"); | |
| i.warn("Ephemeral Drop: " + _.pluck(t, "tag").join(","))(), t.forEach(function(e) { | |
| e.resendTimer && clearTimeout(e.resendTimer), e.onDrop(new m.EphemeralDrop(e.toString())) | |
| }) | |
| } | |
| this.sendHash = {}, this.pendingPhoneReqs = 0, this.phoneWatchdog.deactivate() | |
| }, | |
| _basicSend: function(e, t) { | |
| i.logColor("blue", "low-send: " + t + " " + e.tag, e.data)(), this.socket.cast(e.tag + "," + JSON.stringify(e.data)) | |
| }, | |
| _send: function(e) { | |
| e.tag = e.getTag() || this.shortTag(), this.sendHash[e.tag] = e; | |
| var t = e.binaryOpts ? e.binaryOpts.debugObj : e.data; | |
| i.logColor("blue", " send: " + e.tag + ", " + e.toString(), t)(), this.socket.send(e.serialize()), e.isToPhone && (this.pendingPhoneReqs++, this.phoneWatchdog.activate()), e.state = A.SENT | |
| }, | |
| sendBasic: function(e) { | |
| return this.socket ? (e.tag = this.tag(), this._basicSend(e, "external"), this.socket.nextMessage(k.TAG(e.tag))) : Promise.reject("socket not open") | |
| }, | |
| sendEphemeral: function(e) { | |
| e.ephemeral = !0; | |
| var t = new Y(e); | |
| this.canSend ? this._send(t) : t.onDrop(new m.EphemeralDrop(t.toString())) | |
| }, | |
| sendEphemeralIgnore: function(e) { | |
| e.ephemeral = !0, e.ignore = !0, e.tag = this.tag(); | |
| var t = new Y(e); | |
| if (this.canSend) { | |
| var r = t.serialize(); | |
| this.socket.send(r), i.logColor("blue", "sending: " + t.tag + ", " + t.toString(), t.data)() | |
| } else t.onDrop(new m.EphemeralDrop(t.toString())) | |
| }, | |
| onMessage: function(e) { | |
| var t = e.tag, | |
| r = e.data; | |
| if (n(r) && (this.lastPhoneMessage = moment().unix()), k.PONG.test(e)) | |
| if (r[1]) { | |
| var o = 0, | |
| s = !1; | |
| _.each(this.sendHash, function(e) { | |
| if (e.isToPhone) { | |
| var t = e.likelyDead; | |
| e.age++, e.likelyDead && !t ? (s = !0, i.error(e.tag + " likely dead: " + e.toString(), e)(), u.error2412("(" + e.tag + ") " + e.toString()), Store.Wap.error2412()) : e.likelyDead || o++ | |
| } | |
| }), this.pendingPhoneReqs = o, this.phoneWatchdog.feed(), 0 === o && this.phoneWatchdog.deactivate(), s && a.upload("error-2412") | |
| } else this.state !== $.TIMEOUT ? i.error("ws2:Pang while not timed-out")() : this.runPromise.cancel(new I.PhoneFailedPing); | |
| else { | |
| var d = this.sendHash[t]; | |
| if (d) { | |
| if (!r) return void(d.state = A.WEBDACKED); | |
| var c; | |
| try { | |
| c = d.onSend(r) | |
| } catch (l) { | |
| if (l instanceof m.E401) return void this.logout(); | |
| i.error("ws2:onMessage error")(l), d.onDrop(l) | |
| } | |
| P.test(c) ? (i.error("ws2:onMessage 5xx error " + d.tag, c)(), d.resends >= R ? (i.error("ws2:onMessage dropping " + d.tag)(), d.onDrop(new m.Server5xxDrop), delete this.sendHash[t], this.sendQueue = _.without(this.sendQueue, d)) : this.resendRequestEventually(d)) : (delete this.sendHash[t], this.sendQueue = _.without(this.sendQueue, d), d.isToPhone && (d.likelyDead || this.pendingPhoneReqs--, this.phoneWatchdog.feed(), 0 === this.pendingPhoneReqs && this.phoneWatchdog.deactivate())) | |
| } else if (r) { | |
| var f; | |
| if (v.isByteBuffer(r)) f = Store.Wap; | |
| else { | |
| var h = _.isFunction(r.shift) ? r.shift() : r; | |
| f = Store[h] | |
| } | |
| f ? f.handle(r, this, t) : i.error("ws2: Invalid type received", r)(), n(r) && this.phoneWatchdog.feed() | |
| } | |
| } | |
| }, | |
| run: function(e, t) { | |
| return this.runPromise = y.resolve(e).bind(this).cancellable().then(function(e) { | |
| if (this.state = $.OPENING, u.incrementProgress(), e > 0) { | |
| i.log("ws2:Run Backoff " + e + "ms")(); | |
| var t = y.delay(e).cancellable()["catch"](I.ExternalPoke, _.noop); | |
| return this.setPokeable(t, Date.now() + e), t | |
| } | |
| })["finally"](function() { | |
| this.unset("pokeable"), this.unset("retryTimestamp") | |
| }).then(function() { | |
| return u.incrementProgress(), i.log("ws2:Running")(), this.openSocket() | |
| }).then(function(e) { | |
| return u.incrementProgress(), e.onactivity = this.onActivity.bind(this), this.socket = e, this.socketWatcher = p.attachWatcher(this.runPromise, this.throwOnClose()), this.state = $.PAIRING, "undefined" == typeof this.isIncognito ? p.waitForBBEvent(this, "change:isIncognito") : void 0 | |
| }).then(function() { | |
| var e = this; | |
| u.incrementProgress(), this.shortTagBase = (moment().unix() % 1e3).toString(); | |
| var r = this.initConn(); | |
| if (!c.knowsPhone()) return r.bind(this).then(function() { | |
| this.set({ | |
| state: $.UNPAIRED, | |
| refWatcher: p.attachWatcher(this.runPromise, this.manageRef()) | |
| }) | |
| }); | |
| var n = function() { | |
| var n = e.requestSync(t); | |
| return { | |
| v: Promise.all([r, n])["finally"](function() { | |
| r.cancel(), n.cancel() | |
| }) | |
| } | |
| }(); | |
| return "object" == typeof n ? n.v : void 0 | |
| }).then(this.waitForSyncInfo)["finally"](function() { | |
| this.refWatcher && (this.refWatcher.cancel(), this.unset("refWatcher")) | |
| }).then(function(e) { | |
| return u.incrementProgress(), i.log("ws2:completed " + (this.hasSynced ? "re-auth" : "auth"))(), this.state = $.CONNECTED, p.waitForMain()["return"](e) | |
| }).then(function(e) { | |
| i.log("ws2:main loaded")(), e.initial = !0, Store.Conn.handle([e]); | |
| var t = this.openStream(); | |
| return this.streamPromise = t, t | |
| }).then(function() { | |
| return new y | |
| })["catch"](m.SocketClosed, function(e) { | |
| throw e.event instanceof I.UILogout ? e.event : e | |
| })["catch"](function(e) { | |
| i.warn("ws2:run loop interrupt: " + e)(e), this.set({ | |
| canSend: !1, | |
| stream: C.DISCONNECTED, | |
| runPromise: null | |
| }), this.phoneWatchdog.deactivate(), this.streamPromise && (this.streamPromise.cancel(), this.unset("streamPromise")), this.socketWatcher && (this.socketWatcher.cancel(), this.unset("socketWatcher")); | |
| var t = this.socket; | |
| return t && "closed" !== t.state && (t.detachCallbacks(), t.close(!0, e)), this.unset("socket"), Promise.reject(e) | |
| })["catch"](m.E401, I.PhoneFailedPing, function() { | |
| return !1 | |
| })["catch"](I.ForcedRefresh, function() { | |
| return this.clearState(), !1 | |
| })["catch"](m.SocketClosed, m.SocketError, function() { | |
| return !0 | |
| })["catch"](I.DeniedUnknown, function(e) { | |
| return i.error("ws2:sync rejected, logging out")(), this.sendCurrentLogout(), this.clearCredentials(), !1 | |
| })["catch"](I.Denied401Failed, I.PhoneKickedClient, function(e) { | |
| return i.log("ws2:phone disassociated via " + e)(), this.clearCredentials(), !1 | |
| })["catch"](I.NoSecretBundle, function() { | |
| return i.error("ws2:No secret bundle!")(), this.clearCredentials(), a.upload("no-secret-bundle"), !1 | |
| })["catch"](I.TooManyRefRequest, function() { | |
| return this.state = $.UNPAIRED_IDLE, this.setPokeable(p.waitForOfflineNaive()["throw"](new I.WindowOffline)["catch"](I.ExternalPoke, _.constant(!1))) | |
| })["catch"](m.BlockedByProxy, function() { | |
| return S.promptUnloadGuards++, this.state = $.PROXYBLOCK, this.setPokeable((new y)["catch"](I.ExternalPoke, _.constant(!1))["finally"](function() { | |
| S.promptUnloadGuards-- | |
| })) | |
| })["catch"](I.DeniedTOS, function() { | |
| i.log("ws2:denied tos")(); | |
| var e = this.setPokeable((new y).cancellable()["catch"](I.ExternalPoke, _.constant(!1))).cancellable(); | |
| return this.clearState(), this.set({ | |
| state: $.TOS_BLOCK, | |
| runPromise: e | |
| }), e | |
| })["catch"](I.Denied409Conflict, I.PhoneReplacedClient, function(e) { | |
| e instanceof I.Denied409Conflict ? i.log("ws2:phone denied (conflict)")() : i.log("ws2:phone replaced")(), this.clearState(); | |
| var t = (new y).cancellable(); | |
| return this.set({ | |
| state: $.CONFLICT, | |
| conflictPromise: t, | |
| runPromise: t | |
| }), t | |
| })["finally"](function() { | |
| this.conflictPromise && this.conflictPromise.cancel() | |
| })["catch"](I.UILogout, I.WindowOffline, function() { | |
| return !1 | |
| }) | |
| }, | |
| openSocket: function() { | |
| var e = this, | |
| t = this.socketPreload; | |
| if (this.socketPreload = null, t && t.socket && "open" === t.socket.state) return Promise.resolve(t.socket); | |
| t && t.active || (t = new w); | |
| var r = function() { | |
| e.retryTimestamp = t.retryTimestamp | |
| }; | |
| t.on("change:retryTimestamp", r), this.pokeable = t; | |
| var n = p.waitForBBEvent(t, "change:socket").cancellable().then(function() { | |
| return t.socket | |
| })["finally"](function() { | |
| t.off("change:retryTimestamp", r), t.onerror = null, t.deactivate(), e.pokeable = null | |
| }); | |
| return t.onerror = function(e) { | |
| n.cancel(e) | |
| }, n | |
| }, | |
| initConn: function() { | |
| return new Promise(function(e, t) { | |
| var r = d.VERSION, | |
| n = this.tag("init"), | |
| o = S.info(); | |
| return this._basicSend({ | |
| tag: n, | |
| data: ["admin", "init", [r.p, r.s, r.t], | |
| [o.os || "Unknown", o.name || "Unknown"], S.id(), !this.isIncognito && !!c.getRememberMe() | |
| ] | |
| }, "init"), this.socket.nextMessage(k.TAG(n)).get("data")["catch"](t).then(e) | |
| }.bind(this)).then(function(e) { | |
| E.update(e.update, e.curr), T.setSkew(Date.now() - e.time), Store.Conn.handle([{ | |
| id: 1, | |
| ref: e.ref, | |
| refTTL: e.ttl | |
| }]) | |
| }) | |
| }, | |
| manageRef: function() { | |
| var e = this; | |
| return p.loopOnError(m.ShouldLoop, function(t) { | |
| var r = Store.Conn.refExpiry - Date.now() - D; | |
| return Promise.delay(Math.max(r, 0)).cancellable().then(function() { | |
| if (t >= L) throw new I.TooManyRefRequest; | |
| i.log("ws2:Requesting Ref Update")(); | |
| var r = e.tag("qr" + t); | |
| return e._basicSend({ | |
| tag: r, | |
| data: ["admin", "Conn", "reref"] | |
| }, "reref"), e.socket.nextMessage(k.TAG(r)) | |
| }).then(function(e) { | |
| var t = e.data; | |
| switch (t.status) { | |
| case 200: | |
| throw i.log("ws2:Updating Ref")(), Store.Conn.handle([{ | |
| ref: t.ref, | |
| refTTL: t.ttl | |
| }]), new m.ShouldLoop; | |
| case 304: | |
| return void i.log("ws2:Keeping Ref")(); | |
| case 429: | |
| throw i.log("ws2:Server denied new ref")(), new I.TooManyRefRequest; | |
| default: | |
| throw i.error("ws2:Bad Ref Response!", t)(), new I.AssertionFailed("unrecognized ref request status (" + t.status + ")") | |
| } | |
| }) | |
| }).cancellable() | |
| }, | |
| requestSync: function(e) { | |
| var t = this; | |
| if (this.syncTag = this.tag("sync"), !b.load()) throw new I.NoSecretBundle; | |
| var r = c.getLoginTokens(), | |
| n = r.client, | |
| o = r.server, | |
| s = ["admin", "login", n, o, S.id()]; | |
| e ? s.push("takeover") : this.hasSynced && (s.push("reconnect"), s.push(Store.Conn.me)); | |
| var d = function() { | |
| return t._basicSend({ | |
| tag: t.syncTag, | |
| data: s | |
| }, "sync"), !0 | |
| }, | |
| u = new h({ | |
| waitAlgorithm: h.FIBONACCI(0, 8500, 6e4), | |
| onTimeout: d | |
| }); | |
| u.on("change:ts", function() { | |
| t.retryTimestamp = u.ts | |
| }), this.pokeable = u, u.activate(), d(); | |
| var l = this.socket.nextMessage(k.TAG(this.syncTag)), | |
| f = this.lookForAndHandleChallenge()["catch"](Promise.CancellationError, _.noop)["catch"](l.cancel.bind(l)); | |
| return l.then(function(e) { | |
| i.log("ws2:login", e)(); | |
| var t = e.data; | |
| switch (t.status) { | |
| case 200: | |
| return e; | |
| case 401: | |
| return Promise.reject(new I.Denied401Failed); | |
| case 403: | |
| return Promise.reject(t.tos >= 2 ? new I.DeniedTOS : new I.DeniedUnknown); | |
| case 405: | |
| return i.error("ws2:Already authorized!")(), a.upload("already-authorized"), Promise.reject(new I.ForcedRefresh); | |
| case 409: | |
| return Promise.reject(new I.Denied409Conflict); | |
| default: | |
| return i.error("ws2:unknown error! status:" + t.status, e)(), Promise.reject(new I.DeniedUnknown) | |
| } | |
| })["finally"](function() { | |
| f.cancel(), u.deactivate(), t.unset("pokeable"), t.unset("retryTimestamp") | |
| }) | |
| }, | |
| waitForSyncInfo: function() { | |
| return this.socket.nextMessage(k.SYNC_INFO).then(function(e) { | |
| return e.data[1] | |
| }) | |
| }, | |
| lookForAndHandleChallenge: function() { | |
| return this.socket.nextMessage(k.CHALLENGE).bind(this).then(function(e) { | |
| i.log("ws2:challenged!")(); | |
| var t = CryptoJS.enc.Base64.parse(e.data[1].challenge), | |
| r = b.getSecurityToken(t), | |
| n = c.getLoginTokens(), | |
| o = n ? n.server : void 0; | |
| if (!o) return i.error("ws2:handleChallenge no server token!", n)(), Promise.reject(new Error("Handle challenge no server token")); | |
| var a = this.tag("challenge"); | |
| return this._basicSend({ | |
| tag: a, | |
| data: ["admin", "challenge", r, o, S.id()] | |
| }, "challenge"), this.socket.nextMessage(k.TAG(a)) | |
| }).then(function(e) { | |
| return e.data.status >= 400 ? (i.error("ws2:handleChallenge failed challenge!", e.data)(), Promise.reject(new I.Denied401Failed)) : void i.log("ws2:handleChallenge passed challenge")() | |
| }) | |
| }, | |
| throwOnClose: function() { | |
| return this.socket.nextMessage(k.DISCONNECT).then(function(e) { | |
| var t = e.data[1]; | |
| throw "replaced" === t.kind ? new I.PhoneReplacedClient : new I.PhoneKickedClient | |
| }) | |
| }, | |
| openStream: function() { | |
| this.canSend = !0; | |
| var e, t; | |
| return this.hasSynced ? e = Promise.all([this.queryReceivedActions(), Store.Chat.resyncMessages(), Store.Msg.resyncReceipts()]).bind(this).then(function() { | |
| this.flushQueue(), this.stream = C.CONNECTED | |
| })["catch"](m.EphemeralDrop, Promise.CancellationError, function() { | |
| this.stream = C.DISCONNECTED | |
| })["catch"](function(e) { | |
| throw i.error("ws2:error during resume, resyncing: " + e)(e), i.errorVerbose(e.stack)(), a.upload("error-on-resume"), this.stream = C.DISCONNECTED, new I.ForcedRefresh | |
| }) : (t = Store.Chat.sync().cancellable().bind(this).then(function() { | |
| this.set({ | |
| hasSynced: !0, | |
| stream: C.CONNECTED | |
| }) | |
| })["catch"](Promise.CancellationError, _.noop), e = Promise.all([t, Store.Contact.sync()]).bind(this)["catch"](function(e) { | |
| return t.cancel(), this.set({ | |
| hasSynced: !1, | |
| stream: C.DISCONNECTED | |
| }), Promise.reject(e) | |
| })["catch"](Promise.CancellationError, _.noop)), Promise.resolve().cancellable().bind(this).then(function() { | |
| return this.stream = this.hasSynced ? C.RESUMING : C.SYNCING, this.socket.onmessage = this.onMessage.bind(this), this.socket.releaseMessages(), e | |
| })["catch"](Promise.CancellationError, function() { | |
| e.cancel() | |
| }) | |
| }, | |
| queryReceivedActions: function() { | |
| var e = this, | |
| t = _.filter(this.sendQueue, "clientCacheable", !0), | |
| r = _.pluck(t, "tag").filter(function(e) { | |
| return e | |
| }); | |
| return i.log("ws2:queryReceivedActions")(), 0 === r.length ? Promise.resolve() : Store.Wap.queryReceivedActions(r).then(function(r) { | |
| _.isArray(r) ? r.forEach(function(t) { | |
| var r = _.find(e.sendQueue, "tag", t.id); | |
| if (r) | |
| if (i.log("ws2:queryReceivedActions found dup: " + t.id + "," + t.code)(), delete e.sendHash[t.id], e.sendQueue = _.without(e.sendQueue, r), r.onSend) { | |
| var n = r.onSend({ | |
| status: t.code, | |
| _duplicate: !0 | |
| }); | |
| P.test(n) && r.onDrop(new m.Server5xxDrop) | |
| } else i.error("ws2:queryReceivedActions onSendDup undefined; should be defined: " + t.id)(), r.onDrop(new m.ConventionViolationDrop); | |
| else i.error("ws2:queryReceivedActions unknown tag in response: " + t.id)() | |
| }) : "replaced" === r ? (t.forEach(function(e) { | |
| e.onDrop(new m.BrowserReplacedDrop) | |
| }), e.sendQueue = _.difference(e.sendQueue, t)) : i.error("ws2:queryReceivedActions error", r)() | |
| }) | |
| }, | |
| setPokeable: function(e) { | |
| var t = arguments.length <= 1 || void 0 === arguments[1] ? this.retryTimestamp : arguments[1]; | |
| return this.set({ | |
| pokeable: { | |
| poke: function() { | |
| e.cancel(new I.ExternalPoke) | |
| } | |
| }, | |
| retryTimestamp: t | |
| }), e | |
| }, | |
| clearCredentials: function() { | |
| this.clearState(), c.setBrowserId(), c.setUnknownId(), c.clearTokens(), c.clearAllLocalState(), b.clear() | |
| }, | |
| clearState: function() { | |
| this.sendQueue = [], this.clearSendHash(!0), this.unset("hasSynced"), _.each(Store, function(e) { | |
| _.isFunction(e["delete"]) && e["delete"]() | |
| }) | |
| }, | |
| resendRequestEventually: function(e) { | |
| var t = this, | |
| r = 300 * N.expBackoff(e.resends, 100); | |
| i.log("ws2:Resending " + e.toString() + " in " + r + "ms")(); | |
| var n = _.delay(function() { | |
| e.resends++, e.resendTimer = 0, t.sendHash[e.tag] === e && t._send(e) | |
| }, r); | |
| e.set({ | |
| resendTimer: n, | |
| state: A.WILL_RETRY | |
| }) | |
| }, | |
| sendCurrentLogout: function(e) { | |
| if (b.load()) { | |
| var t = { | |
| t: c.getLogoutToken(), | |
| m: Store.Wap.logoutToken() | |
| }, | |
| r = c.getOldLogoutCreds(); | |
| r.push(t), c.setOldLogoutCreds(r) | |
| } | |
| if (e && e.state === f.STATE.OPEN) { | |
| var n = this.logoutMutex; | |
| this.logoutMutex = 0 >= n ? n = 1 : ++n, i.info("ws2:logout through socket")(), e.partingSend(new I.UILogout, 'goodbye,,["admin","Conn","disconnect"]', _.matches("goodbye,")).bind(this).then(function(e) { | |
| e ? (i.log("ws2:logout through socket success")(), o(t)) : i.warn("ws2:logout through socket failure, will POST")() | |
| })["finally"](function() { | |
| this.logoutMutex === n && (this.logoutMutex = 0) | |
| }) | |
| } else this.logoutMutex < 0 && (this.logoutMutex = 0), this.sendRemainingLogouts() | |
| }, | |
| sendRemainingLogouts: function() { | |
| var e = this.logoutMutex; | |
| if (0 === e) { | |
| var t = r(95), | |
| n = c.getOldLogoutCreds(); | |
| if (0 === n.length) return void(this.logoutMutex = -1); | |
| this.logoutMutex = e = 1, Promise.all(_.map(n, function(e) { | |
| return i.info("ws2:POST logout")(), t.post(d.LOGOUT_URL, e).then(function() { | |
| o(e) | |
| })["catch"](function(e) { | |
| i.warn("ws2:POST logout failure")() | |
| }) | |
| })).bind(this)["finally"](function() { | |
| e === this.logoutMutex && (this.logoutMutex = 0) | |
| }) | |
| } | |
| } | |
| }), | |
| G = new F; | |
| i.exportToWindow("WS", G), e.exports = G | |
| }, , , function(e, t, r) { | |
| "use strict"; | |
| var n = r(6), | |
| o = r(26), | |
| i = r(1), | |
| a = r(334), | |
| s = r(379), | |
| d = [n.KEY_LOGOUT_TOKEN, n.KEY_CLIENT_TOKEN, n.KEY_SERVER_TOKEN, n.KEY_SECRET_BUNDLE], | |
| c = [n.KEY_LOG_CURSOR, n.KEY_WHATSAPP_MUTEX, n.KEY_REMEMBER_ME, n.KEY_WHATSAPP_LS_VERSION], | |
| u = [n.KEY_WHATSAPP_MUTEX, n.KEY_REMEMBER_ME, n.KEY_OLD_LOGOUT_CREDS], | |
| l = [n.KEY_VERSION], | |
| f = 1, | |
| h = { | |
| v0: function() { | |
| var e = localStorage.getItem(n.KEY_SECRET_BUNDLE); | |
| e && (e = JSON.parse(e), e = _.isObject(e) ? JSON.stringify(e) : e, localStorage.setItem(n.KEY_SECRET_BUNDLE, e)), this._setLSVersion(1) | |
| } | |
| }, | |
| p = "x" + Math.round(1e9 * Math.random()), | |
| m = function(e) { | |
| if (e.key !== n.KEY_WHATSAPP_MUTEX) return !1; | |
| var t = e.newValue || ""; | |
| return -1 === t.indexOf(p) | |
| }, | |
| g = function(e) { | |
| if (e.key !== n.KEY_LOCAL_TAKEOVER_OK) return !1; | |
| var t = e.newValue || ""; | |
| return -1 === t.indexOf(p) | |
| }, | |
| v = { | |
| thisTabId: p, | |
| getRememberMe: function() { | |
| var e = this._getPS(n.KEY_REMEMBER_ME); | |
| return _.isNull(e) && (e = !0, this._setPS(n.KEY_REMEMBER_ME, !0)), e | |
| }, | |
| setRememberMe: function(e) { | |
| if (e = !!e, e !== this.getRememberMe()) { | |
| i.log("UserPrefs:setRememberMe: " + e)(); | |
| var t, r; | |
| if (t = this._storage(), this._setPS(n.KEY_REMEMBER_ME, e), r = this._storage(), t !== r) { | |
| var o = _.difference(_.keys(t), c, u); | |
| o.forEach(function(e) { | |
| _.isFunction(t[e]) || (r[e] = t[e], t.removeItem(e)) | |
| }) | |
| } | |
| e || i.clearLogs() | |
| } | |
| }, | |
| _storage: function() { | |
| return this.getRememberMe() ? o.permanentStorage : o.temporaryStorage | |
| }, | |
| clear: function() { | |
| var e = this._getPreservedKeys(); | |
| this._storage().clear(), this._setPreservedKeys(e) | |
| }, | |
| _getKeys: function(e, t) { | |
| return _.object(t, t.map(function(t) { | |
| return e.getItem(t) | |
| })) | |
| }, | |
| _setKeys: function(e, t) { | |
| _.each(t, function(t, r) { | |
| e.setItem(r, t) | |
| }) | |
| }, | |
| _getPreservedKeys: function() { | |
| return this._getKeys(o.permanentStorage, u) | |
| }, | |
| _setPreservedKeys: function(e) { | |
| return this._setKeys(o.permanentStorage, e) | |
| }, | |
| _getAllKeyValues: function() { | |
| var e = this._storage(); | |
| return _.object(_.keys(e).map(function(t) { | |
| return [t, e.getItem(t)] | |
| })) | |
| }, | |
| _setAllKeyValues: function(e) { | |
| var t = this._storage(); | |
| _.keys(e).forEach(function(r) { | |
| t.setItem(r, e[r]) | |
| }) | |
| }, | |
| _getPS: function(e) { | |
| return this._get(e, o.permanentStorage) | |
| }, | |
| _setPS: function(e, t) { | |
| return this._set(e, t, o.permanentStorage) | |
| }, | |
| _getTS: function(e) { | |
| return this._get(e, o.temporaryStorage) | |
| }, | |
| _setTS: function(e, t) { | |
| return this._set(e, t, o.temporaryStorage) | |
| }, | |
| _get: function(e, t, n) { | |
| if (_.isUndefined(e)) throw new Error("_get called with no key"); | |
| t = t || this._storage(); | |
| var o = t.getItem(e); | |
| if (n || _.isUndefined(o)) return o; | |
| try { | |
| return JSON.parse(o) | |
| } catch (a) { | |
| i.log("userPrefs:_get(" + e + ") '" + a + "' " + o)(); | |
| var s = r(9); | |
| return s.upload("userprefs-parse-error"), void t.removeItem(e) | |
| } | |
| }, | |
| _set: function(e, t, r, n) { | |
| if (_.isUndefined(e)) throw new Error("_set called with no key"); | |
| r = r || this._storage(), _.isUndefined(t) ? r.removeItem(e) : r.setItem(e, n ? t : JSON.stringify(t)) | |
| }, | |
| _getUser: function(e) { | |
| if (!Store.Conn.me) return i.error("userPrefs: Me has not loaded yet.")(), null; | |
| var t = a([Store.Conn.me, e].join(":")); | |
| return this._get(t) | |
| }, | |
| _setUser: function(e, t) { | |
| if (!Store.Conn.me) return i.error("userPrefs: Me has not loaded yet.")(), null; | |
| var r = a([Store.Conn.me, e].join(":")); | |
| return this._set(r, t) | |
| }, | |
| getLoginTokens: function() { | |
| return { | |
| client: this._get(n.KEY_CLIENT_TOKEN), | |
| server: this._get(n.KEY_SERVER_TOKEN) | |
| } | |
| }, | |
| setLoginTokens: function(e) { | |
| var t = e.client, | |
| r = e.server; | |
| t && r && !_.isUndefined(t) && (i.log("UserPrefs:setLoginTokens")(), this._set(n.KEY_CLIENT_TOKEN, t), this._set(n.KEY_SERVER_TOKEN, r)) | |
| }, | |
| knowsPhone: function() { | |
| var e = this.getLoginTokens(); | |
| return !(!e.client || !e.server) | |
| }, | |
| setRefTokCookies: function(e, t) { | |
| v.clearCookies(), v.clearDeprecatedKeys(), s.setCookie({ | |
| name: n.COOKIE_REF, | |
| value: e, | |
| path: n.PP_REF, | |
| domain: n.COOKIE_DOMAIN, | |
| secure: !0 | |
| }); | |
| var r = { | |
| name: n.COOKIE_TOK, | |
| value: t, | |
| path: n.PP_TOK, | |
| domain: n.COOKIE_DOMAIN, | |
| secure: !0 | |
| }; | |
| s.setCookie(r) | |
| }, | |
| clearCookies: function() { | |
| s.setCookie({ | |
| name: n.COOKIE_REF, | |
| expirationDate: 0, | |
| domain: n.COOKIE_DOMAIN, | |
| path: n.PP_REF | |
| }), s.setCookie({ | |
| name: n.COOKIE_TOK, | |
| expirationDate: 0, | |
| domain: n.COOKIE_DOMAIN, | |
| path: n.PP_TOK | |
| }) | |
| }, | |
| clearDeprecatedKeys: function() { | |
| l.forEach(function(e) { | |
| o.permanentStorage.removeItem(e) | |
| }) | |
| }, | |
| getSecretBundle: function() { | |
| var e = this._get(n.KEY_SECRET_BUNDLE); | |
| return e ? _.object(_.map(e, function(e, t) { | |
| return [t, CryptoJS.enc.Base64.parse(e)] | |
| })) : (i.error("UserPrefs:Attempted to load non-existent secret bundle!", e)(), null) | |
| }, | |
| setSecretBundle: function(e) { | |
| return this._set(n.KEY_SECRET_BUNDLE, _.object(_.map(e, function(e, t) { | |
| return [t, CryptoJS.enc.Base64.stringify(e)] | |
| }))) | |
| }, | |
| clearTokens: function() { | |
| d.forEach(function(e) { | |
| this._set(e) | |
| }, this) | |
| }, | |
| getNUX: function(e) { | |
| return this._getUser(e) | |
| }, | |
| setNUX: function(e, t) { | |
| return this._setUser(e, t) | |
| }, | |
| getUnknownId: function() { | |
| var e = this._get(n.KEY_UNKNOWN_ID); | |
| return e || (e = "unknown" + Math.floor(1e10 * Math.random()), this.setUnknownId(e)), e | |
| }, | |
| setUnknownId: function(e) { | |
| return this._set(n.KEY_UNKNOWN_ID, e) | |
| }, | |
| getBrowserId: function() { | |
| return this._get(n.KEY_BROWSER_ID) | |
| }, | |
| setBrowserId: function(e) { | |
| this._set(n.KEY_BROWSER_ID, e) | |
| }, | |
| setLastEmojiTab: function(e) { | |
| return this._setUser(n.KEY_LAST_ACTIVE_EMOJI_TAB, e) | |
| }, | |
| getLastEmojiTab: function() { | |
| return this._getUser(n.KEY_LAST_ACTIVE_EMOJI_TAB) | |
| }, | |
| getCollection: function(e) { | |
| return this._getUser(e) | |
| }, | |
| setCollection: function(e, t) { | |
| return this._setUser(e, t) | |
| }, | |
| getGlobalSounds: function() { | |
| return !this._getUser(n.KEY_GLOBAL_MUTE_SOUNDS) | |
| }, | |
| setGlobalSounds: function(e) { | |
| return this._setUser(n.KEY_GLOBAL_MUTE_SOUNDS, !e) | |
| }, | |
| getGlobalNotifications: function() { | |
| return !this._getUser(n.KEY_GLOBAL_MUTE_NOTIFICATIONS) | |
| }, | |
| setGlobalNotifications: function(e) { | |
| return this._setUser(n.KEY_GLOBAL_MUTE_NOTIFICATIONS, !e) | |
| }, | |
| getGlobalPreviews: function() { | |
| return !this._getUser(n.KEY_GLOBAL_MUTE_PREVIEWS) | |
| }, | |
| setGlobalPreviews: function(e) { | |
| return this._setUser(n.KEY_GLOBAL_MUTE_PREVIEWS, !e) | |
| }, | |
| getGeocoderLocation: function() { | |
| return this._getUser(n.KEY_GEOCODER_LOCATION) | |
| }, | |
| setGeocoderLocation: function(e) { | |
| this._setUser(n.KEY_GEOCODER_LOCATION, e) | |
| }, | |
| getMapsOverQuota: function() { | |
| return this._get(n.KEY_GMAPS_OVER_LIMIT) | |
| }, | |
| setMapsOverQuota: function(e) { | |
| return this._set(n.KEY_GMAPS_OVER_LIMIT, e) | |
| }, | |
| getGroupParticipantAssignedColor: function(e) { | |
| return this._getUser(n.KEY_GROUP_ASSIGNED_COLOR + "-" + e) | |
| }, | |
| setGroupParticipantAssignedColor: function(e, t) { | |
| this._setUser(n.KEY_GROUP_ASSIGNED_COLOR + "-" + e, t) | |
| }, | |
| getMutex: function() { | |
| return this._getPS(n.KEY_WHATSAPP_MUTEX) | |
| }, | |
| setMutex: function(e) { | |
| var t = e ? p + ":" + e : e; | |
| return this._setPS(n.KEY_WHATSAPP_MUTEX, t) | |
| }, | |
| removeMutex: function() { | |
| return this._setPS(n.KEY_WHATSAPP_MUTEX) | |
| }, | |
| parseMutex: function(e) { | |
| return e = e ? JSON.parse(e) : "", e ? e.toString().split(/:/).pop() : e | |
| }, | |
| mutexFilter: m, | |
| localTakeoverSuccess: function() { | |
| var e = this.getRememberMe() ? {} : _.omit(this._getAllKeyValues(), c); | |
| e.wa_tab_src = p, this._setPS(n.KEY_LOCAL_TAKEOVER_OK, e), this._setPS(n.KEY_LOCAL_TAKEOVER_OK) | |
| }, | |
| parseTakeover: function(e) { | |
| return e = e ? JSON.parse(e) : {}, _.isObject(e) ? (delete e.wa_tab_src, e) : {} | |
| }, | |
| takeoverFilter: g, | |
| getLangPref: function() { | |
| return this._get(n.KEY_LANG) | |
| }, | |
| setLangPref: function(e) { | |
| return this._set(n.KEY_LANG, e) | |
| }, | |
| getLogoutToken: function() { | |
| return this._getPS(n.KEY_LOGOUT_TOKEN) | |
| }, | |
| setLogoutToken: function(e) { | |
| return this._setPS(n.KEY_LOGOUT_TOKEN, e) | |
| }, | |
| getOldLogoutCreds: function() { | |
| return this._getPS(n.KEY_OLD_LOGOUT_CREDS) || [] | |
| }, | |
| setOldLogoutCreds: function(e) { | |
| return this._setPS(n.KEY_OLD_LOGOUT_CREDS, e) | |
| }, | |
| setLogCursor: function(e) { | |
| e %= n.LOG_SIZE, this._setPS(n.KEY_LOG_CURSOR, e) | |
| }, | |
| _getLSVersion: function() { | |
| return this._getPS(n.KEY_WHATSAPP_LS_VERSION) || 0 | |
| }, | |
| _setLSVersion: function(e) { | |
| return this._setPS(n.KEY_WHATSAPP_LS_VERSION, e) | |
| }, | |
| _version: function() { | |
| return f | |
| }, | |
| compareVersion: function() { | |
| var e = this._getLSVersion(); | |
| return f - e | |
| }, | |
| _migrate: function(e) { | |
| if (e > 5) throw new Error("too many migrations"); | |
| var t = this.compareVersion(); | |
| if (0 !== t) { | |
| var r, n = this._getLSVersion(); | |
| if (!(t > 0)) throw new Error("downgrades not supported"); | |
| if (r = h["v" + n], !r) throw new Error("no migration for: " + n); | |
| i.log("userPrefs:migrate from: " + n + " towards: " + f)(), r.call(this), this._migrate(e + 1) | |
| } | |
| }, | |
| maybeMigrate: function() { | |
| if (!_.isEmpty(localStorage) || !_.isEmpty(sessionStorage)) { | |
| var e = _.flatten([d, n.KEY_BROWSER_ID, n.KEY_LOG_CURSOR]), | |
| t = _.pick(localStorage, e); | |
| try { | |
| this._migrate(0) | |
| } catch (r) { | |
| i.error("userPrefs:error migrating")(r), this.clear(), this._setAllKeyValues(t), this._setLSVersion(f) | |
| } | |
| } | |
| }, | |
| clearAllLocalState: function() { | |
| var e = this._getPreservedKeys(); | |
| localStorage.clear(), this._setPreservedKeys(e), sessionStorage.clear(), this.clearCookies(), i.clearLogs() | |
| }, | |
| setNoTakeover: function(e) { | |
| return this._setTS(n.KEY_NO_TAKEOVER, e) | |
| }, | |
| getNoTakeover: function() { | |
| return this._getTS(n.KEY_NO_TAKEOVER) | |
| }, | |
| getWamBuffer: function() { | |
| return this._get(n.KEY_WAM_BUFFER, void 0, !0) | |
| }, | |
| setWamBuffer: function(e) { | |
| this._set(n.KEY_WAM_BUFFER, e, void 0, !0) | |
| }, | |
| getWamInfo: function() { | |
| return this._get(n.KEY_WAM_INFO) | |
| }, | |
| setWamInfo: function(e) { | |
| return this._set(n.KEY_WAM_INFO, e) | |
| }, | |
| getWamOldBuffer: function() { | |
| return this._get(n.KEY_WAM_OLD_BUFFER) | |
| }, | |
| setWamOldBuffer: function(e) { | |
| this._set(n.KEY_WAM_OLD_BUFFER, e) | |
| }, | |
| clearWamBuffer_old: function() { | |
| this._set("WaWamBuffer", void 0) | |
| }, | |
| clearWamStatus_old: function() { | |
| this._set("WAWamStatus", void 0) | |
| }, | |
| clearWamLastRotate_old: function() { | |
| this._set("WAWamLastRotate", void 0) | |
| }, | |
| clearWamDimensionCache_old: function() { | |
| this._set("WAWamDimensionCache", void 0) | |
| } | |
| }; | |
| e.exports = v | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(40), | |
| o = !1, | |
| i = _.debounce(function() { | |
| return o = !1 | |
| }, 500); | |
| e.exports = { | |
| id: function a() { | |
| var e = r(13), | |
| a = e.getBrowserId(); | |
| if (a) return a; | |
| var t = new Uint32Array(4); | |
| window.crypto.getRandomValues(t); | |
| var n = CryptoJS.lib.WordArray.create(t); | |
| return a = CryptoJS.enc.Base64.stringify(n), e.setBrowserId(a), a | |
| }, | |
| info: function() { | |
| var e = n.parser.getResult(); | |
| return { | |
| os: e.os.name + (e.os.version ? " " + e.os.version : ""), | |
| name: e.browser.name, | |
| ua: e.browser.name + " " + e.browser.version | |
| } | |
| }, | |
| hardRefresh: function(e) { | |
| var t = arguments.length <= 1 || void 0 === arguments[1] ? !0 : arguments[1]; | |
| if (this.promptUnloadGuards++, e) { | |
| var n = r(13); | |
| n.setNoTakeover(!0) | |
| } | |
| location.reload(t) | |
| }, | |
| startDownloading: function() { | |
| o = !0, i() | |
| }, | |
| clearDownloading: function() { | |
| o = !1 | |
| }, | |
| isDownloading: function() { | |
| return o | |
| }, | |
| promptUnloadGuards: 0 | |
| } | |
| }, , , , function(e, t) { | |
| "use strict"; | |
| function r(e, t, r, n) { | |
| function o(e) { | |
| _.isFunction(t) ? this.message = t.apply(this, arguments) : arguments.length > 0 ? this.message = "" + e : t ? this.message = t : this.message = this.name; | |
| var r = this.message !== this.name ? this.name + ": " + this.message : this.name, | |
| o = new Error(r).stack; | |
| if (!o) try { | |
| throw new Error(r) | |
| } catch (i) { | |
| o = i.stack, o || (o = "Error: " + r + "\n at (unspecified)") | |
| } | |
| this.stack = o, _.isFunction(n) && n.apply(this, _.rest(arguments)) | |
| } | |
| return r = r || Error, o.prototype = Object.create(r.prototype), o.prototype.name = e, o | |
| } | |
| function n(e, t) { | |
| return _.reduce(e, function(e, n, o) { | |
| var i, a; | |
| return _.isString(o) ? (i = o, a = n) : i = n, e[i] = r(i, a, t), e | |
| }, {}) | |
| } | |
| function o(e) { | |
| this.event = e; | |
| try { | |
| return JSON.stringify(e) | |
| } catch (t) { | |
| return "" + e | |
| } | |
| } | |
| var i = r("WAPStatusCode"), | |
| a = r("401", null, i), | |
| s = r("404", null, i), | |
| d = r("500", null, i), | |
| c = r("WapDrop"), | |
| u = r("EphemeralDrop", null, c), | |
| l = r("EphemeralDrop", null, c), | |
| f = r("Server5xxDrop", null, c), | |
| h = r("ConventionViolationDrop", null, c), | |
| p = r("BrowserReplacedDrop", null, c), | |
| m = r("ShouldLoop"), | |
| g = r("GaveUpRetry"), | |
| v = r("GUMError"), | |
| y = n({ | |
| NotSupportedError: "The operation is not supported.", | |
| PermissionDeniedError: "The user did not grant permission for the operation", | |
| ConstraintNotSatisfiedError: "One of the mandatory Constraints could not be satisfied.", | |
| OverconstrainedError: "Due to changes in the environment, one or more mandatory constraints can no longer be satisfied.", | |
| NotFoundError: "The object can not be found here.", | |
| AbortError: "The operation was aborted.", | |
| SourceUnavailableError: "The source of the MediaStream could not be accessed due to a hardware error (e.g. lock from another process)." | |
| }, v), | |
| b = r("MediaFileError"), | |
| w = r("InvalidMediaFileType", null, b), | |
| E = r("MediaFileTooLarge", null, b), | |
| S = r("MediaEncryptionError", null, b), | |
| N = r("ImageError", "Image failed to load.", null, function(e) { | |
| this.src = e, this.target = { | |
| src: e | |
| } | |
| }), | |
| T = r("ContactBlocked", "Contact is blocked", null, function(e) { | |
| this.contact = e | |
| }), | |
| $ = r("CapabilityError"), | |
| C = r("CapabilityUnsupported", null, $, function(e) { | |
| this.jidCapabilities = e | |
| }), | |
| A = r("CapabilityInvalid", null, $), | |
| I = r("CapabilityUnknown", null, $), | |
| O = r("MediaMissing", "Media is no longer available on your phone"), | |
| k = r("MediaLoadError", null, null, function(e) { | |
| this.src = e | |
| }), | |
| P = r("SocketError", o), | |
| R = r("SocketClosed", o), | |
| M = r("SocketNotOpen", function(e) { | |
| return "socket not open, is " + e | |
| }), | |
| L = r("BlockedByProxy"); | |
| e.exports = { | |
| define: r, | |
| defineAll: n, | |
| QueryDrop: r("QueryDrop"), | |
| WapDrop: c, | |
| EphemeralDrop: u, | |
| LogoutDrop: l, | |
| Server5xxDrop: f, | |
| ConventionViolationDrop: h, | |
| BrowserReplacedDrop: p, | |
| ShouldLoop: m, | |
| GaveUpRetry: g, | |
| MediaFileError: b, | |
| InvalidMediaFileType: w, | |
| MediaFileTooLarge: E, | |
| MediaEncryptionError: S, | |
| WAPStatusCode: i, | |
| E401: a, | |
| E404: s, | |
| E500: d, | |
| SocketError: P, | |
| SocketClosed: R, | |
| SocketNotOpen: M, | |
| BlockedByProxy: L, | |
| ImageError: N, | |
| ContactBlocked: T, | |
| MediaMissing: O, | |
| MediaLoadError: k, | |
| CapabilityError: $, | |
| CapabilityUnsupported: C, | |
| CapabilityInvalid: A, | |
| CapabilityUnknown: I, | |
| ActionError: r("ActionError", "Could not perform action."), | |
| GUM: _.defaults(y, { | |
| GUMError: v, | |
| PERMISSION_DENIED: y.PermissionDeniedError, | |
| NOT_SUPPORTED_ERROR: y.ConstraintNotSatisfiedError, | |
| MANDATORY_UNSATISFIED_ERROR: y.NotFoundError | |
| }) | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e, t) { | |
| return _.isString(t) ? t.split("@")[1] === e : ("undefined" != typeof t && i.log("wid:isXWid called on nonstring: " + t)(), !1) | |
| } | |
| function o(e) { | |
| return _.isString(e) ? e.split("@")[0] : void 0 | |
| } | |
| var i = r(1), | |
| a = r(366), | |
| s = ["c.us", "g.us", "broadcast"], | |
| d = _.memoize(function(e) { | |
| return "Server" === e ? e : a.format(e) | |
| }); | |
| e.exports = { | |
| userToLegacy: function(e) { | |
| if (_.isString(e)) { | |
| var t = e.split("@"); | |
| if (2 === t.length && "c.us" === t[1]) return t[0] + "@s.whatsapp.net" | |
| } | |
| return e | |
| }, | |
| isUser: function(e) { | |
| return n("c.us", e) | |
| }, | |
| isBroadcast: function(e) { | |
| return n("broadcast", e) | |
| }, | |
| isGroup: function(e) { | |
| return n("g.us", e) | |
| }, | |
| isWid: function(e) { | |
| return _.isString(e) ? _.contains(s, e.split("@")[1]) : !1 | |
| }, | |
| user: o, | |
| formattedUser: function(e) { | |
| if (e) { | |
| var t = o(e); | |
| if (t) return l10n.numAndPunc(d(t)) | |
| } | |
| return "" | |
| } | |
| } | |
| }, , , , function(e, t, r) { | |
| var n = r(406)("wks"), | |
| o = r(413), | |
| i = r(31).Symbol; | |
| e.exports = function(e) { | |
| return n[e] || (n[e] = i && i[e] || (i || o)("Symbol." + e)) | |
| } | |
| }, , function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| function e(e) { | |
| var s = Promise.resolve([a++, e]).cancellable().spread(o).then(function() { | |
| return r.apply(void 0, arguments) | |
| }); | |
| t = s["catch"].apply(s, i)["catch"](function() { | |
| return n.apply(void 0, arguments) | |
| }) | |
| } | |
| var t, r, n, o = _.last(arguments), | |
| i = _.initial(arguments), | |
| a = 0; | |
| return i.push(e), Promise.resolve().then(function() { | |
| return new Promise(function(t, o) { | |
| r = t, n = o, e() | |
| }).cancellable()["catch"](function(e) { | |
| if (t && t.isPending()) return new Promise(function(o, i) { | |
| r = o, n = i, t.cancel(e) | |
| }); | |
| throw e | |
| }) | |
| }) | |
| } | |
| function o(e, t) { | |
| var r = arguments.length <= 2 || void 0 === arguments[2] ? "GET" : arguments[2]; | |
| return new Promise(function(n) { | |
| function o() { | |
| n(i.status && i.status < 12e3 ? i : null) | |
| } | |
| var i = new XMLHttpRequest; | |
| t && (i.responseType = t), i.onload = o, i.onreadystatechange = function() { | |
| 4 === i.readyState ? o() : 0 === i.readyState && n(null) | |
| }, i.onerror = n.bind(void 0, null), i.ontimeout = n.bind(void 0, null), i.open(r, e, !0), i.send() | |
| }) | |
| } | |
| function i(e, t) { | |
| return t["catch"](Promise.CancellationError, _.noop)["catch"](function(t) { | |
| e.cancel(t) | |
| }), t | |
| } | |
| function a() { | |
| return d(window, "offline") | |
| } | |
| function s() { | |
| var e, t; | |
| return new Promise(function(r) { | |
| function n() { | |
| t && t + 1e4 < Date.now() ? r(!0) : (t = Date.now(), e = _.delay(n, 1e3)) | |
| } | |
| n() | |
| }).cancellable()["finally"](function() { | |
| clearTimeout(e) | |
| }) | |
| } | |
| function d(e, t, r) { | |
| var n; | |
| return new Promise(function(o) { | |
| n = r ? function() { | |
| r.apply(this, arguments) && o.apply(this, arguments) | |
| } : o, e.addEventListener(t, n) | |
| }).cancellable()["finally"](function() { | |
| e.removeEventListener(t, n) | |
| }) | |
| } | |
| function c(e, t, r) { | |
| var n; | |
| return new Promise(function(o) { | |
| n = r ? function() { | |
| r.apply(this, arguments) && o(arguments) | |
| } : function() { | |
| o(arguments) | |
| }, e.on(t, n) | |
| }).cancellable()["finally"](function() { | |
| e.off(t, n) | |
| }) | |
| } | |
| function u() { | |
| return p.isMainLoaded ? Promise.resolve() : c(p, "main_loaded") | |
| } | |
| function l() { | |
| return new Promise(function(e, t) { | |
| function r() { | |
| e(!1) | |
| } | |
| if (window.requestFileSystem) window.requestFileSystem(window.TEMPORARY, 1, r, function(t) { | |
| e("SecurityError" === t.name) | |
| }); | |
| else if (window.indexedDB) { | |
| var n = window.indexedDB.open("pb_detect"); | |
| n ? (n.onsuccess = r, n.onerror = function(t) { | |
| t.preventDefault(), e(!0) | |
| }) : r() | |
| } else r() | |
| }).then(function(e) { | |
| if (!window.localStorage) return !0; | |
| if (e) return e; | |
| try { | |
| return window.localStorage.setItem("INCOG", 0), window.localStorage.removeItem("INCOG"), !1 | |
| } catch (t) { | |
| return "QuotaExceededError" === t.name ? !0 : Promise.reject(t) | |
| } | |
| }).timeout(100, "detectIncognitoTimeout")["catch"](Promise.TimeoutError, function() { | |
| return !1 | |
| })["catch"](function(e) { | |
| return f.error("promiseUtil:determineIncognito failed check: " + e)(e), h.upload("incog-throw"), !1 | |
| }) | |
| } | |
| var f = r(1), | |
| h = r(9), | |
| p = r(8); | |
| e.exports = { | |
| loopOnError: n, | |
| attachWatcher: i, | |
| getResponseIfOnline: o, | |
| waitForOfflineNaive: a, | |
| waitForEvent: d, | |
| waitForBBEvent: c, | |
| determineIncognito: l, | |
| waitForSkip: s, | |
| waitForMain: u | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| this.initializeStorage(), this._dbName = "wawc", this._db = new i(this._dbName), this._db.version(1).stores({ | |
| logs: "line,log" | |
| }), this._db.version(2).stores({ | |
| logs: "line,log", | |
| assets: "key,hash,data" | |
| }), this._db.version(3).stores({ | |
| logs: "line,log", | |
| assets: "key,hash,data", | |
| wam: ",buffer,prevValues,lastSend" | |
| }), this.openAttempt = 0, this.openDB(), this._dbState = u.OPENING, this.deleteLegacyDBs() | |
| } | |
| var o = r(6), | |
| i = r(426), | |
| a = r(1), | |
| s = r(40), | |
| d = r(41), | |
| c = "WA", | |
| u = { | |
| ERROR: "error", | |
| OPENING: "opening", | |
| BLOCKED: "blocked", | |
| OPEN: "open", | |
| CLOSED: "closed" | |
| }; | |
| n.prototype.initializeStorage = function() { | |
| var e = window.localStorage, | |
| t = window.sessionStorage, | |
| r = { | |
| setItem: function(e, t) { | |
| this[e] = t | |
| }, | |
| getItem: function(e, t) { | |
| return this[e] | |
| }, | |
| removeItem: function(e) { | |
| delete this[e] | |
| }, | |
| clear: function() { | |
| for (var e in this) this.hasOwnProperty(e) && "function" != typeof e && delete this[e] | |
| } | |
| }; | |
| this.permanentStorage = this._hasLocalStorage() ? e : r, this.temporaryStorage = this._hasSessionStorage() ? t : r | |
| }, n.prototype._hasLocalStorage = function() { | |
| try { | |
| return localStorage.setItem(o.KEY_STORAGE_TEST, o.KEY_STORAGE_TEST), !0 | |
| } catch (e) { | |
| return !1 | |
| } | |
| }, n.prototype._hasSessionStorage = function() { | |
| try { | |
| return sessionStorage.setItem(o.KEY_STORAGE_TEST, o.KEY_STORAGE_TEST), !0 | |
| } catch (e) { | |
| return !1 | |
| } | |
| }, n.prototype.openDB = function() { | |
| var e = new d.WebcIdbOpen; | |
| this._openDB().then(function() { | |
| e.markWebcIdbOpenT(), e.webcIdbOpenSuccess = !0, e.commit() | |
| })["catch"](function() { | |
| e.markWebcIdbOpenT(), e.webcIdbOpenSuccess = !1, e.commit() | |
| }) | |
| }, n.prototype._openDB = function() { | |
| var e = this; | |
| this._db.isOpen() && this._db.close(); | |
| var t = Promise.resolve(this._db.open()).bind(this).timeout(1e4).then(function() { | |
| return a.info("db: Successfully opened db")(), e._dbState = u.OPEN, u.OPEN | |
| })["catch"](Promise.TimeoutError, function(t) { | |
| return a.info("db:openDB blocked"), e._dbState = u.BLOCKED, u.BLOCKED | |
| })["catch"](function(t) { | |
| return a.error("db:openDB:Error " + t)(), e.openAttempt > 1 || s.isSafari ? (e.opening = void 0, e._dbState = u.ERROR, Promise.reject(u.ERROR)) : (e.openAttempt += 1, e._db["delete"]().then(function() { | |
| return e.openDB() | |
| })) | |
| }).then(function(t) { | |
| return e.opening = void 0, t === u.BLOCKED ? Promise.reject(u.BLOCKED) : e._db | |
| }); | |
| return this.opening || (this.opening = t), t | |
| }, n.prototype.idb = function() { | |
| return this._db.isOpen() ? Promise.resolve(this._db) : this._db.hasFailed() ? Promise.reject(u.FAILED) : this._dbState === u.BLOCKED ? Promise.reject(u.BLOCKED) : this.opening ? this.opening : Promise.reject(u.CLOSED) | |
| }, n.prototype.deleteLegacyDBs = function() { | |
| return i.getDatabaseNames().then(function(e) { | |
| e.forEach(function(e) { | |
| e === c && (localStorage.setItem(o.KEY_LOG_CURSOR, 0), i["delete"](e)) | |
| }) | |
| }) | |
| }, n.prototype.State = u; | |
| var l = new n; | |
| a.exportToWindow("DB", l), a.exportToWindow("Dexie", i), e.exports = l | |
| }, , , , function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| return function(t) { | |
| return "number" == typeof t.status && t.status >= 500 ? t : void e(t) | |
| } | |
| } | |
| function o(e) { | |
| return CryptoJS.lib.WordArray.create(new Uint8Array(e)) | |
| } | |
| var i, a = r(1), | |
| s = r(9), | |
| d = r(45), | |
| c = r(10), | |
| u = r(146), | |
| l = r(336), | |
| f = r(152), | |
| h = r(14), | |
| p = r(19), | |
| m = r(155), | |
| g = r(156), | |
| _ = r(157), | |
| v = r(158), | |
| y = r(159), | |
| b = r(386), | |
| w = { | |
| setVersion: function(e, t) { | |
| var r = e[0], | |
| n = e[1]; | |
| switch (a.log("wap:setVersion " + [r, n, t].join("."))(), r) { | |
| case 0: | |
| switch (n) { | |
| case 2: | |
| m.setSubProtocol(1), i = m; | |
| break; | |
| case 3: | |
| m.setSubProtocol(n), i = m; | |
| break; | |
| case 4: | |
| g.setSubProtocol(n), i = g; | |
| break; | |
| case 5: | |
| case 6: | |
| _.setSubProtocol(n), i = _; | |
| break; | |
| case 7: | |
| v.setSubProtocol(t), i = v; | |
| break; | |
| case 8: | |
| y.setSubProtocol(t), i = y; | |
| break; | |
| case 9: | |
| b.setSubProtocol(t), i = b | |
| } | |
| } | |
| i || (a.error("wap:setVersion unknown version. attempting to update")(), s.upload("wap_unknown_version", !0)["finally"](function() { | |
| return h.hardRefresh() | |
| })) | |
| }, | |
| "delete": function() { | |
| return i ? i["delete"].apply(i, arguments) : void 0 | |
| }, | |
| error2412: function() { | |
| return i.error2412.apply(i, arguments) | |
| }, | |
| setSharedSecret: function(e) { | |
| a.log("Wap:saveSharedSecret start")(); | |
| var t = u.decode(e, !0), | |
| r = t.slice(0, 32), | |
| n = u.encode(t.slice(32, 64)), | |
| i = t.slice(64), | |
| s = o(r.concat(i)), | |
| c = d.get().keyPair.privKey, | |
| h = f.sharedSecret(r, c), | |
| p = l.extractAndExpand(h, void 0, "", 80, !0), | |
| m = o(p.slice(0, 32)), | |
| g = o(p.slice(32, 64)), | |
| _ = o(p.slice(64, 80)), | |
| v = CryptoJS.HmacSHA256(s, g), | |
| y = v.toString(CryptoJS.enc.Base64); | |
| if (n !== y) return void a.error("Wap:saveSharedSecret hmac mismatch " + n + " " + y)(); | |
| var b = CryptoJS.AES.decrypt({ | |
| ciphertext: o(i), | |
| salt: void 0 | |
| }, m, { | |
| iv: _, | |
| mode: CryptoJS.mode.CBC, | |
| padding: CryptoJS.pad.Pkcs7 | |
| }), | |
| w = u.decode(b.toString(CryptoJS.enc.Base64), !0), | |
| E = o(w.slice(0, 32)), | |
| S = o(w.slice(32, 64)); | |
| d.setSecretKeys("0.1", E, S), a.log("Wap:saveSharedSecret done")() | |
| }, | |
| dispatch: function(e, t, r) { | |
| var n = i[e]; | |
| return "function" != typeof n ? r ? Promise.resolve(r) : Promise.reject("wap:" + e + ":unsupported") : n.apply(i, t) | |
| }, | |
| handle: function() { | |
| return i.handle.apply(i, arguments) | |
| }, | |
| queryServerProps: function() { | |
| return new Promise(function(e, t) { | |
| c.sendEphemeral({ | |
| data: ["query", "props"], | |
| onSend: e, | |
| onDrop: t | |
| }) | |
| }) | |
| }, | |
| resyncPictures: function(e) { | |
| return new Promise(function(t, r) { | |
| c.sendEphemeral({ | |
| data: ["query", "resumePic", e], | |
| onSend: n(t), | |
| onDrop: r | |
| }) | |
| }) | |
| }, | |
| setRememberMe: function(e) { | |
| return c.sendBasic({ | |
| data: ["admin", "remember", !!e] | |
| }) | |
| }, | |
| getPlaintextMediaInfo: function(e) { | |
| return new Promise(function(t, r) { | |
| var o = e.map(function(e) { | |
| return [e.clientUrl, e.from.split("@")[0], e.to.split("@")[0], e.t] | |
| }); | |
| c.send({ | |
| data: ["query", "refreshMedia", o], | |
| onSend: n(t), | |
| onDrop: r | |
| }) | |
| }) | |
| }, | |
| requestMediaUpload: function(e, t, r) { | |
| return new Promise(function(o, i) { | |
| var a = function(e) { | |
| switch (e.status) { | |
| case 200: | |
| o({ | |
| result: "ok", | |
| data: e.url, | |
| size: r | |
| }); | |
| break; | |
| case 299: | |
| o({ | |
| result: "duplicate", | |
| data: e.params, | |
| size: r | |
| }); | |
| break; | |
| default: | |
| i({ | |
| size: r | |
| }) | |
| } | |
| }; | |
| c.send({ | |
| data: ["action", "upload", e, t, r.toString()], | |
| onSend: n(a), | |
| onDrop: i | |
| }) | |
| }) | |
| }, | |
| requestEncryptedMediaUpload: function(e, t) { | |
| return new Promise(function(r, o) { | |
| var i = function(e) { | |
| switch (e.status) { | |
| case 200: | |
| r({ | |
| result: "ok", | |
| data: e.url | |
| }); | |
| break; | |
| default: | |
| o() | |
| } | |
| }; | |
| c.send({ | |
| data: ["action", "encr_upload", e, t], | |
| onSend: n(i), | |
| onDrop: o | |
| }) | |
| }) | |
| }, | |
| contactFindBroadcast: function(e) { | |
| return new Promise(function(t, r) { | |
| c.send({ | |
| data: ["query", "contact", e], | |
| onSend: n(t), | |
| onDrop: r | |
| }) | |
| }) | |
| }, | |
| commonGroupsFind: function(e) { | |
| return new Promise(function(t, r) { | |
| c.send({ | |
| data: ["query", "group", "common", e], | |
| onSend: t, | |
| onDrop: r | |
| }) | |
| }) | |
| }, | |
| getCapabilities: function(e) { | |
| return new Promise(function(t, r) { | |
| c.send({ | |
| data: ["query", "caps", e.filter(p.isUser)], | |
| onSend: n(t), | |
| onDrop: r | |
| }) | |
| }) | |
| }, | |
| addContact: function(e) { | |
| return this.dispatch("addContact", arguments) | |
| }, | |
| groupMetadataFind: function(e) { | |
| return new Promise(function(t, r) { | |
| c.sendEphemeral({ | |
| data: ["query", "GroupMetadata", e], | |
| onSend: n(t), | |
| onDrop: r | |
| }) | |
| }) | |
| }, | |
| groupMetadataFindFromPhone: function(e) { | |
| return i.groupMetadataFindFromPhone.apply(i, arguments) | |
| }, | |
| lastseenFind: function(e) { | |
| return new Promise(function(t, r) { | |
| c.sendEphemeral({ | |
| data: ["query", "Presence", "lastseen", e], | |
| onSend: n(t), | |
| onDrop: r | |
| }) | |
| }) | |
| }, | |
| profilePicFind: function(e, t) { | |
| return "ProfilePicThumb" === e ? new Promise(function(r, o) { | |
| c.sendEphemeral({ | |
| data: ["query", e, t], | |
| onSend: n(r), | |
| onDrop: o | |
| }) | |
| }) : void 0 | |
| }, | |
| profilePicFindThumbFromPhone: function(e, t) { | |
| return i.profilePicFindThumbFromPhone.apply(i, arguments) | |
| }, | |
| statusFind: function(e) { | |
| return new Promise(function(t, r) { | |
| c.sendEphemeral({ | |
| data: ["query", "Status", e], | |
| onSend: n(t), | |
| onDrop: r | |
| }) | |
| }) | |
| }, | |
| sendPing: function(e) { | |
| return new Promise(function(e, t) { | |
| c.send({ | |
| data: ["admin", "test"], | |
| onSend: n(e), | |
| onDrop: t | |
| }) | |
| }) | |
| }, | |
| requestDeviceUploadLogs: function() { | |
| return this.dispatch("requestDeviceUploadLogs", arguments) | |
| }, | |
| resyncMessages: function() { | |
| return this.dispatch("resyncMessages", arguments) | |
| }, | |
| resyncReceipts: function() { | |
| return this.dispatch("resyncReceipts", arguments) | |
| }, | |
| queryReceivedActions: function() { | |
| return this.dispatch("queryReceivedActions", arguments, []) | |
| }, | |
| addParticipant: function() { | |
| return this.dispatch("addParticipant", arguments) | |
| }, | |
| changeSubject: function() { | |
| return this.dispatch("changeSubject", arguments) | |
| }, | |
| createGroup: function() { | |
| return this.dispatch("createGroup", arguments) | |
| }, | |
| leaveGroup: function() { | |
| return this.dispatch("leaveGroup", arguments) | |
| }, | |
| removeParticipant: function() { | |
| return this.dispatch("removeParticipant", arguments) | |
| }, | |
| promoteParticipant: function() { | |
| return this.dispatch("promoteParticipant", arguments) | |
| }, | |
| requestMediaReupload: function() { | |
| return this.dispatch("requestMediaReupload", arguments) | |
| }, | |
| sendMedia: function() { | |
| return this.dispatch("sendMedia", arguments) | |
| }, | |
| sendConversationSeen: function() { | |
| return this.dispatch("sendConversationSeen", arguments) | |
| }, | |
| sendConversationUnseen: function() { | |
| return this.dispatch("sendConversationUnseen", arguments) | |
| }, | |
| sendConversationClear: function() { | |
| return this.dispatch("sendConversationClear", arguments) | |
| }, | |
| sendConversationDelete: function() { | |
| return this.dispatch("sendConversationDelete", arguments) | |
| }, | |
| sendConversationArchive: function() { | |
| return this.dispatch("sendConversationArchive", arguments) | |
| }, | |
| sendConversationMute: function() { | |
| return this.dispatch("sendConversationMute", arguments) | |
| }, | |
| sendConversationNotSpam: function() { | |
| return this.dispatch("sendConversationNotSpam", arguments) | |
| }, | |
| sendMessagePlayed: function() { | |
| return this.dispatch("sendMessagePlayed", arguments) | |
| }, | |
| sendMessageDelete: function() { | |
| return this.dispatch("sendMessageDelete", arguments) | |
| }, | |
| sendMessageStarred: function() { | |
| return this.dispatch("sendMessageStarred", arguments) | |
| }, | |
| sendUnstarAll: function() { | |
| return this.dispatch("sendUnstarAll", arguments) | |
| }, | |
| sendPresenceAvailable: function() { | |
| return this.dispatch("sendPresenceUpdate", ["available"]) | |
| }, | |
| sendPresenceUnavailable: function() { | |
| return this.dispatch("sendPresenceUpdate", ["unavailable"]) | |
| }, | |
| sendChatstateComposing: function(e) { | |
| return this.dispatch("sendChatstateUpdate", ["composing", e]) | |
| }, | |
| sendChatstatePaused: function(e) { | |
| return this.dispatch("sendChatstateUpdate", ["paused", e]) | |
| }, | |
| sendChatstateRecording: function(e) { | |
| return this.dispatch("sendChatstateUpdate", ["recording", e]) | |
| }, | |
| sendSetPicture: function() { | |
| return this.dispatch("sendSetPicture", arguments) | |
| }, | |
| deletePicture: function() { | |
| return this.dispatch("deletePicture", arguments) | |
| }, | |
| sendSetStatus: function() { | |
| return this.dispatch("sendSetStatus", arguments) | |
| }, | |
| setPushname: function() { | |
| return this.dispatch("setPushname", arguments) | |
| }, | |
| sendSetBlock: function() { | |
| return this.dispatch("sendSetBlock", arguments) | |
| }, | |
| sendSpamReport: function() { | |
| return this.dispatch("sendSpamReport", arguments) | |
| }, | |
| chatFindQuery: function() { | |
| return this.dispatch("chatFindQuery", arguments) | |
| }, | |
| contactFindQuery: function() { | |
| return this.dispatch("contactFindQuery", arguments) | |
| }, | |
| queryIdentity: function() { | |
| return this.dispatch("queryIdentity", arguments) | |
| }, | |
| msgCreateRecord: function() { | |
| return this.dispatch("msgCreateRecord", arguments) | |
| }, | |
| msgFindQuery: function() { | |
| return this.dispatch("msgFindQuery", arguments) | |
| }, | |
| queryLinkPreview: function() { | |
| return this.dispatch("queryLinkPreview", arguments) | |
| }, | |
| queryMsgInfo: function() { | |
| return this.dispatch("queryMsgInfo", arguments) | |
| }, | |
| presenceSubscribe: function() { | |
| return this.dispatch("presenceSubscribe", arguments) | |
| }, | |
| recentEmojiQuery: function() { | |
| return this.dispatch("recentEmojiQuery", arguments) | |
| }, | |
| logoutToken: function() { | |
| var e = d.get().encKey.toString(CryptoJS.enc.Base64), | |
| t = d.get().macKey.toString(CryptoJS.enc.Base64), | |
| r = CryptoJS.enc.Base64.parse(e), | |
| n = CryptoJS.enc.Base64.parse(t); | |
| return CryptoJS.HmacSHA256(r, n).toString(CryptoJS.enc.Base64) | |
| } | |
| }; | |
| e.exports = w | |
| }, function(e, t) { | |
| var r = e.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")(); | |
| "number" == typeof __g && (__g = r) | |
| }, , , function(e, t) { | |
| "use strict"; | |
| function r() { | |
| this._parent = null, this._subs = [], this._catchTypes = null, this._onResolve = null, this._onReject = null, this.type = s.ROOT, this.state = d.PENDING, this.value = void 0, this._forceable = !1, this._cancellable = !1; | |
| var e, t; | |
| switch (arguments.length) { | |
| case 0: | |
| break; | |
| case 1: | |
| e = arguments[0]; | |
| break; | |
| case 2: | |
| t = arguments[0], e = arguments[1]; | |
| break; | |
| default: | |
| throw new Error("TightPromise constructor with " + arguments.length + " arguments") | |
| } | |
| if (this.context = t, arguments.length > 0) try { | |
| e.call(t, n.bind(this), o.bind(this)) | |
| } catch (r) { | |
| o.call(this, r) | |
| } | |
| } | |
| function n(e) { | |
| this.state === d.PENDING && (i(e) ? e.then(n.bind(this), o.bind(this)) : (this.value = e, this.state = d.FULFILLED, this._notifySubs())) | |
| } | |
| function o(e) { | |
| this.state === d.PENDING && (this.value = e, this.state = d.REJECTED, this._notifySubs()) | |
| } | |
| function i(e) { | |
| return ("object" == typeof e || "function" == typeof e) && "function" == typeof e.then | |
| } | |
| function a(e) { | |
| setTimeout(function(e) { | |
| throw e | |
| }, 0, e) | |
| } | |
| var s = { | |
| ROOT: 1, | |
| THENABLE: 2, | |
| FINALLY: 3, | |
| META: 4 | |
| }, | |
| d = { | |
| PENDING: 1, | |
| FULFILLED: 2, | |
| REJECTED: 3 | |
| }; | |
| r.STATE = d, r.TYPE = s, r.prototype = { | |
| isPending: function() { | |
| return this.state === d.PENDING | |
| }, | |
| then: function(e, t) { | |
| if (!e && !t) return this; | |
| var n = new r; | |
| return n.type = s.THENABLE, n._onResolve = e || null, n._onReject = t || null, this._addChild(n), n | |
| }, | |
| "catch": function() { | |
| var e = new r; | |
| return e.type = s.THENABLE, e._onReject = arguments[arguments.length - 1], arguments.length > 1 && (e._catchTypes = Array.prototype.slice.call(arguments, 0, arguments.length - 1), e._catchTypes.forEach(function(e) { | |
| if ("function" != typeof e) throw new Error("expected type, got " + e) | |
| })), this._addChild(e), e | |
| }, | |
| "finally": function(e) { | |
| var t = new r; | |
| return t.type = s.FINALLY, t._onResolve = e, this._addChild(t), t | |
| }, | |
| bind: function(e) { | |
| var t = new r; | |
| return t.type = s.META, this._addChild(t), t.context = e, t | |
| }, | |
| spread: function(e) { | |
| return this.then(function(t) { | |
| e.apply(this, t) | |
| }) | |
| }, | |
| get: function(e) { | |
| return this.then(function(t) { | |
| return t[e] | |
| }) | |
| }, | |
| forceable: function() { | |
| var e = new r; | |
| return e.context = this.context, e.type = s.META, this._addChild(e), e._forceable = !0, e | |
| }, | |
| cancellable: function() { | |
| var e = new r; | |
| return e.context = this.context, e.type = s.META, this._addChild(e), e._cancellable = !0, e | |
| }, | |
| force: function(e) { | |
| if (this._forceable) { | |
| for (var t = this; t.type === s.META;) { | |
| var r = t._parent; | |
| if (!r || !r._forceable || r.state !== d.PENDING) break; | |
| t = r | |
| } | |
| n.call(this, e) | |
| } | |
| }, | |
| cancel: function(e) { | |
| if (this._cancellable) { | |
| e = e || new Promise.CancellationError; | |
| var t = this, | |
| r = !1; | |
| do { | |
| var n = t._parent; | |
| n && n._cancellable && n.state === d.PENDING ? t = n : r = !0 | |
| } while (!r); | |
| o.call(t, e) | |
| } | |
| }, | |
| timeout: function(e, t) { | |
| var n = new r; | |
| return n.type = s.META, this._addChild(n), n.state === d.PENDING && setTimeout(o.bind(n, new Promise.TimeoutError(t)), e), n | |
| }, | |
| loosen: function() { | |
| return Promise.resolve(this) | |
| }, | |
| _run: function(e, t) { | |
| var r; | |
| try { | |
| r = e.call(this.context, t) | |
| } catch (i) { | |
| return void o.call(this, i) | |
| } | |
| n.call(this, r) | |
| }, | |
| _handle: function() { | |
| if (this.state === d.PENDING) { | |
| var e = this._parent; | |
| switch (this.type) { | |
| case s.THENABLE: | |
| if (e.state === d.FULFILLED) { | |
| var t = this._onResolve; | |
| t ? this._run(t, e.value) : n.call(this, e.value) | |
| } else if (this._onReject) { | |
| var r = this._catchTypes, | |
| i = r ? r.length : 0, | |
| c = e.value; | |
| if (0 === i) return void this._run(this._onReject, c); | |
| for (var u = 0; i > u; u++) | |
| if (c instanceof r[u]) return void this._run(this._onReject, c); | |
| o.call(this, c) | |
| } else o.call(this, e.value); | |
| return; | |
| case s.FINALLY: | |
| try { | |
| this._onResolve.call(this.context) | |
| } catch (l) { | |
| a(l) | |
| } | |
| default: | |
| e.state === d.FULFILLED ? n.call(this, e.value) : o.call(this, e.value) | |
| } | |
| } | |
| }, | |
| _addChild: function(e) { | |
| e._parent = this, e.context = this.context, e._cancellable = this._cancellable, e.type === s.META && (e._forceable = this._forceable), this.state === d.PENDING ? this._subs.push(e) : e._handle() | |
| }, | |
| _notifySubs: function() { | |
| this._subs.forEach(function(e) { | |
| e._handle() | |
| }) | |
| } | |
| }, r.delay = function() { | |
| var e, t; | |
| switch (arguments.length) { | |
| case 0: | |
| e = 0; | |
| break; | |
| case 1: | |
| e = arguments[0]; | |
| break; | |
| default: | |
| e = arguments[1], t = arguments[0] | |
| } | |
| return new r(function(r) { | |
| setTimeout(r.bind(null, t), e) | |
| }) | |
| }, r.resolve = function(e) { | |
| var t = new r; | |
| return n.call(t, e), t | |
| }, r.reject = function(e) { | |
| var t = new r; | |
| return o.call(t, e), t | |
| }, e.exports = r | |
| }, function(e, t) { | |
| var r = Object; | |
| e.exports = { | |
| create: r.create, | |
| getProto: r.getPrototypeOf, | |
| isEnum: {}.propertyIsEnumerable, | |
| getDesc: r.getOwnPropertyDescriptor, | |
| setDesc: r.defineProperty, | |
| setDescs: r.defineProperties, | |
| getKeys: r.keys, | |
| getNames: r.getOwnPropertyNames, | |
| getSymbols: r.getOwnPropertySymbols, | |
| each: [].forEach | |
| } | |
| }, , , , , function(e, t, r) { | |
| "use strict"; | |
| function n(e, t) { | |
| var r, n, o, i = /(\.0)+[^\.]*$/; | |
| for (e = (e + "").replace(i, "").split("."), t = (t + "").replace(i, "").split("."), o = Math.min(e.length, t.length), r = 0; o > r; r++) | |
| if (n = parseInt(e[r], 10) - parseInt(t[r], 10), 0 !== n) return n; | |
| return e.length - t.length | |
| } | |
| function o(e, t) { | |
| return n(e, t) >= 0 | |
| } | |
| var i, a = r(589), | |
| s = window.navigator.userAgent; | |
| i = new a, i.setUA(s); | |
| var d = (i.getBrowser().name || "").toUpperCase(), | |
| c = i.getBrowser().version || "0.0.0", | |
| u = (i.getEngine().name || "").toUpperCase(), | |
| l = (i.getOS().name || "").toUpperCase(), | |
| f = i.getOS().version || "0.0.0", | |
| h = !u || "WEBKIT" === u, | |
| p = "SAFARI" === d, | |
| m = "CHROME" === d, | |
| g = "TRIDENT" === u || "EDGEHTML" === u, | |
| _ = "GECKO" === u, | |
| v = !1; | |
| switch (l) { | |
| case "MAC OS": | |
| m ? v = o(f, "10.10") && o(c, "41.0.0") : o(f, "10.7") && (v = !0); | |
| break; | |
| case "WINDOWS": | |
| o(f, "8.1") && (_ ? v = !0 : m && o(c, "41.0.0") && (v = !0)) | |
| } | |
| e.exports = { | |
| isWebkit: h, | |
| isGecko: _, | |
| isTrident: g, | |
| isSafari: p, | |
| hasEmoji: v, | |
| os: l.toLowerCase(), | |
| browser: d.toLowerCase(), | |
| parser: i | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| return "number" == typeof e && e === Math.floor(e) | |
| } | |
| function o(e, t, r) { | |
| var o = this; | |
| this.name = e, this.id = t, this.type = r, _.isObject(r) ? ! function() { | |
| var e = _.invert(r); | |
| o.validator = function(t) { | |
| return t in e | |
| } | |
| }() : r === g || r === b ? this.validator = n : this.validator = r | |
| } | |
| function i(e, t, r) { | |
| return w[e] ? w[e] : w[e] = new o(e, t, r) | |
| } | |
| function a(e, t, r) { | |
| var n = { | |
| id: t | |
| }, | |
| o = {}; | |
| for (var a in r) { | |
| var s = r[a]; | |
| s[1] === b && (n["mark" + _.capitalize(a)] = c(a)); | |
| var d = i(a, s[0], s[1]); | |
| o[a] = d.validator | |
| } | |
| var l = h.define(e, o, u); | |
| _.extend(l.prototype, n), E[e] = l | |
| } | |
| function s(e) { | |
| for (var t in e) { | |
| var r = e[t]; | |
| a(t, r[0], r[1]) | |
| } | |
| } | |
| function d(e) { | |
| var t = {}, | |
| r = function(r) { | |
| var n = e[r], | |
| o = i(r, n[0], n[1]); | |
| t[r] = { | |
| type: o.validator, | |
| allowNull: !0, | |
| set: function(e) { | |
| this.commitOnSet && p.set(o, e) | |
| } | |
| } | |
| }; | |
| for (var n in e) r(n); | |
| var o = h.define("Global", t, l); | |
| f = new o | |
| } | |
| function c(e) { | |
| return function() { | |
| this[e] = Date.now() - this.eventTime | |
| } | |
| } | |
| function u() { | |
| this.eventTime = Date.now(), this.commitTime = void 0 | |
| } | |
| function l() { | |
| this.commitOnSet = !0 | |
| } | |
| var f, h = r(387), | |
| p = r(154), | |
| m = "boolean", | |
| g = "integer", | |
| v = "number", | |
| y = "string", | |
| b = "timer", | |
| w = {}, | |
| E = {}; | |
| u.prototype = _.extend(Object.create(h.prototype), { | |
| commit: function() { | |
| p.commit(this) | |
| }, | |
| setTime: function(e) { | |
| this.eventTime = e || Date.now() | |
| } | |
| }); | |
| var S = { | |
| IPHONE: 1, | |
| ANDROID: 2, | |
| BB: 3, | |
| BBX: 7, | |
| S40: 4, | |
| SYMBIAN: 5, | |
| WP: 6, | |
| WEBCLIENT: 8, | |
| OSMETA: 11, | |
| TEST: 9, | |
| UNKNOWN: 10 | |
| }, | |
| N = { | |
| UNCACHED: 0, | |
| IDLE: 1, | |
| CHECKING: 2, | |
| DOWNLOADING: 3, | |
| UPDATEREADY: 4, | |
| OBSOLETE: 5 | |
| }, | |
| T = { | |
| PROD: 0, | |
| INTERN: 1, | |
| DEV: 2 | |
| }, | |
| $ = { | |
| NAVIGATE_NEXT: 0, | |
| RELOAD: 1, | |
| BACK_FORWARD: 2, | |
| UNDEFINED: 255 | |
| }, | |
| C = { | |
| OFFLINE: 0, | |
| OPENING: 1, | |
| PAIRING: 2, | |
| SYNCING: 3, | |
| RESUMING: 4, | |
| CONNECTING: 5, | |
| NORMAL: 6, | |
| TIMEOUT: 7 | |
| }, | |
| A = { | |
| QR: 0, | |
| MAIN: 1, | |
| SYNCING: 2, | |
| OFFLINE: 3, | |
| CONFLICT: 4, | |
| PROXYBLOCK: 5 | |
| }, | |
| I = { | |
| WEB: 1, | |
| WIN32: 2, | |
| DARWIN: 3 | |
| }; | |
| l.prototype = Object.create(h.prototype), d({ | |
| appIsBetaRelease: [21, m], | |
| appVersion: [17, y], | |
| browser: [779, y], | |
| browserVersion: [295, y], | |
| deviceName: [13, y], | |
| mcc: [5, g], | |
| mnc: [3, g], | |
| platform: [11, S], | |
| webcBucket: [875, y], | |
| webcEnv: [633, T], | |
| webcPhoneCharging: [783, m], | |
| webcPhoneDeviceManufacturer: [829, y], | |
| webcPhoneDeviceModel: [831, y], | |
| webcPhoneOsBuildNumber: [833, y], | |
| webcPhoneOsVersion: [835, y], | |
| webcPhonePlatform: [707, S], | |
| webcWebPlatform: [899, I] | |
| }), s({ | |
| WebcAvailableChange: [772, { | |
| webcAvailable: [645, m], | |
| webcAvailableDuration: [776, b] | |
| }], | |
| WebcChatOpen: [864, { | |
| webcUnreadCount: [866, v], | |
| webcChatOpenT: [868, b] | |
| }], | |
| WebcIdbOpen: [874, { | |
| webcIdbOpenT: [876, b], | |
| webcIdbOpenSuccess: [781, m] | |
| }], | |
| WebcManualWebsocketAttempt: [896, { | |
| webcManualWebsocketAttemptSuccessful: [811, m] | |
| }], | |
| WebcMediaAnalyzed: [912, { | |
| webcMediaSupported: [863, m], | |
| webcMediaExtensions: [865, y], | |
| webcMediaAnalyzeT: [914, b] | |
| }], | |
| WebcNotificationSet: [830, { | |
| webcNotificationOn: [709, m] | |
| }], | |
| WebcPageLoad: [642, { | |
| webcUnloadEventStart: [648, b], | |
| webcUnloadEventEnd: [650, b], | |
| webcRedirectStart: [652, b], | |
| webcRedirectEnd: [654, b], | |
| webcFetchStart: [656, b], | |
| webcDomainLookupStart: [658, b], | |
| webcDomainLookupEnd: [660, b], | |
| webcConnectStart: [662, b], | |
| webcConnectEnd: [664, b], | |
| webcSecureConnectionStart: [666, b], | |
| webcRequestStart: [668, b], | |
| webcResponseStart: [670, b], | |
| webcResponseEnd: [672, b], | |
| webcDomLoading: [674, b], | |
| webcDomInteractive: [676, b], | |
| webcDomContentLoadedEventStart: [678, b], | |
| webcDomContentLoadedEventEnd: [680, b], | |
| webcDomComplete: [682, b], | |
| webcLoadEventStart: [684, b], | |
| webcLoadEventEnd: [686, b], | |
| webcExeStart: [760, b], | |
| webcExeDone: [756, b], | |
| webcWsOpening: [704, b], | |
| webcWsPairing: [706, b], | |
| webcWsSyncing: [708, b], | |
| webcWsNormal: [710, b], | |
| webcWsAttempts: [712, v], | |
| webcAppcacheStatus: [629, N], | |
| webcCached: [565, m], | |
| webcQrCode: [601, m], | |
| webcNavigation: [591, $], | |
| webcRedirectCount: [700, v], | |
| webcPageLoadT: [644, b] | |
| }], | |
| WebcPageResume: [884, { | |
| webcResumeCount: [785, g] | |
| }], | |
| WebcPhoneDisconnected: [878, { | |
| webcPhoneDisconnectedT: [880, b], | |
| webcPhoneBbarShownT: [882, b] | |
| }], | |
| WebcResourceLoad: [688, { | |
| webcResourceName: [567, y], | |
| webcResourceDuration: [690, b], | |
| webcResourceCached: [569, m] | |
| }], | |
| WebcStreamInfoChange: [768, { | |
| webcStreamInfo: [641, C], | |
| webcStreamInfoDuration: [774, b] | |
| }], | |
| WebcStreamModeChange: [770, { | |
| webcStreamMode: [643, A] | |
| }], | |
| WebcWamUpload: [916, { | |
| webcTotalT: [918, b], | |
| webcAvailableTp: [920, v], | |
| webcAvailableBbarTp: [922, v], | |
| webcAvailableNormalTp: [924, v], | |
| webcUnavailableTp: [926, v], | |
| webcUnavailableBbarTp: [928, v], | |
| webcUnavailableNormalTp: [930, v] | |
| }], | |
| WebcWsOpen: [740, { | |
| webcWsOpenT: [738, b] | |
| }], | |
| WebcWsTimeout: [742, { | |
| webcWsTimeoutT: [744, b] | |
| }] | |
| }), e.exports = _.defaults({}, E, { | |
| METRICS: w, | |
| Global: f, | |
| WamEvent: u, | |
| PLATFORM_TYPE: S, | |
| WEBC_APPCACHE_STATUS_CODE: N, | |
| WEBC_ENV_CODE: T, | |
| WEBC_NAVIGATION_TYPE: $, | |
| WEBC_STREAM_INFO_CODE: C, | |
| WEBC_STREAM_MODE_CODE: A, | |
| WEBC_WEB_PLATFORM_TYPE: I | |
| }) | |
| }, , , function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = n.createClass({ | |
| displayName: "ErrorDialog", | |
| propTypes: { | |
| title: n.PropTypes.node, | |
| body: n.PropTypes.node.isRequired, | |
| tip: n.PropTypes.node, | |
| cancelLabel: n.PropTypes.node, | |
| onCancel: n.PropTypes.func, | |
| defaultLabel: n.PropTypes.node, | |
| onDefault: n.PropTypes.func | |
| }, | |
| render: function() { | |
| var e = this.props.tip ? n.createElement("div", { | |
| className: "popup-contents" | |
| }, this.props.body, n.createElement("hr", null), n.createElement("div", { | |
| className: "text text-tip" | |
| }, this.props.tip)) : n.createElement("div", { | |
| className: "popup-contents" | |
| }, this.props.body), | |
| t = this.props.title ? n.createElement("div", { | |
| className: "popup-title", | |
| dir: "auto" | |
| }, this.props.title) : null, | |
| r = []; | |
| return this.props.onCancel && this.props.cancelLabel && r.push(n.createElement("button", { | |
| className: "btn-plain popup-controls-item", | |
| onClick: this.props.onCancel, | |
| key: "secondary" | |
| }, this.props.cancelLabel)), this.props.onDefault && this.props.defaultLabel && r.push(n.createElement("button", { | |
| className: "btn-plain btn-default popup-controls-item", | |
| onClick: this.props.onDefault, | |
| key: "primary" | |
| }, this.props.defaultLabel)), r.length && (r = n.createElement("div", { | |
| className: "popup-controls" | |
| }, r)), n.createElement("div", null, n.createElement("div", { | |
| className: "backdrop backdrop-transparent" | |
| }, n.createElement("div", { | |
| className: "popup-container" | |
| }, n.createElement("div", { | |
| className: "popup" | |
| }, n.createElement("div", { | |
| className: "popup-body" | |
| }, t, e), r)))) | |
| } | |
| }); | |
| e.exports = o | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| p = e | |
| } | |
| function o() { | |
| p = void 0 | |
| } | |
| function i() { | |
| return p | |
| } | |
| function a() { | |
| if (!p) return v.log("secret_bundle:getSecurityToken: no secret bundle!")(), "nosecretbundle!"; | |
| var e = l(_.toArray(arguments)); | |
| return e.toString(CryptoJS.enc.Base64) | |
| } | |
| function s(e, t, r) { | |
| "0.1" === e ? t && r ? (p.encKey = t, p.macKey = r, p.key = r) : v.error("secret_bundle:setSecretKeys v" + e + " " + t + " " + r)() : v.log("secret_bundle:setSecretKeys unknown version: v" + e)() | |
| } | |
| function d() { | |
| if (p && p.key && p.keyPair) return p.key.toString(CryptoJS.enc.Base64); | |
| var e = g.keyPair(), | |
| t = CryptoJS.lib.WordArray.create(e.pubKey), | |
| r = CryptoJS.enc.Base64.stringify(t), | |
| o = { | |
| key: CryptoJS.enc.Base64.parse(r), | |
| keyPair: e | |
| }; | |
| return n(o), r | |
| } | |
| function c() { | |
| var e = y.getSecretBundle(); | |
| return e ? (n(e), e) : (v.log("secret_bundle:load: attempted to load non-existent secret bundle!")(), null) | |
| } | |
| function u() { | |
| return p ? (delete p.keyPair, void y.setSecretBundle(p)) : void v.log("secret_bundle:save: trying to save empty secret bundle!")() | |
| } | |
| function l(e) { | |
| for (var t = p.key.toString(CryptoJS.enc.Base64), r = f(e), n = [], o = 0; o < r.length; o++) { | |
| var i = CryptoJS.enc.Base64.parse(t); | |
| n.push(CryptoJS.HmacSHA256(r[o], i)) | |
| } | |
| return n.reduce(h) | |
| } | |
| function f(e) { | |
| var t = []; | |
| if (null === e || "undefined" == typeof e) return []; | |
| if (_.isArray(e)) | |
| for (var r = 0; r < e.length; r++) t = t.concat(f(e[r])); | |
| else if ("object" == typeof e) | |
| if ("undefined" != typeof e.words && "undefined" != typeof e.sigBytes) t.push(e); | |
| else | |
| for (var n in e) { | |
| var o = e[n]; | |
| o && (t = t.concat(f(o))) | |
| } else t.push(m.userToLegacy(e.toString())); | |
| return t | |
| } | |
| function h(e, t) { | |
| var r, n; | |
| e.sigBytes > t.sigBytes ? (n = e, r = t) : (n = t, r = e); | |
| for (var o = r.words.length, i = 0; o > i; i++) n.words[i] = r.words[i] ^ n.words[i]; | |
| return n | |
| } | |
| var p, m = r(19), | |
| g = r(152), | |
| v = r(1), | |
| y = r(13); | |
| e.exports = { | |
| set: n, | |
| get: i, | |
| clear: o, | |
| getOrGenerate: d, | |
| load: c, | |
| save: u, | |
| getSecurityToken: a, | |
| setSecretKeys: s | |
| } | |
| }, , , , , , function(e, t) { | |
| "use strict"; | |
| var r, n = { | |
| build: function(e, t) { | |
| return t && (t = _.chain(t).map(function(e, t) { | |
| return e ? encodeURIComponent(t) + "=" + encodeURIComponent(e) : null | |
| }).compact().join("&").value()), t ? e + "?" + t : e | |
| }, | |
| relToAbs: function(e) { | |
| return r || (r = document.createElement("a")), r.href = e, r.href | |
| }, | |
| hostname: _.memoize(function(e) { | |
| return r || (r = document.createElement("a")), r.href = this.isHttp(e) ? e : "http://" + e, r.hostname | |
| }), | |
| isHttp: function(e) { | |
| return e && ("https://" === e.toLowerCase().substring(0, 8) || "http://" === e.toLowerCase().substring(0, 7)) | |
| }, | |
| isBlob: function(e) { | |
| return _.isString(e) && "blob:" === e.substring(0, 5) | |
| }, | |
| isEncryptedMedia: function(e) { | |
| return e && _.isString(e) && _.endsWith(e, ".enc") | |
| }, | |
| parseDataURL: function(e) { | |
| var t = e.indexOf(":"), | |
| r = e.indexOf(";"), | |
| n = e.indexOf(","); | |
| return { | |
| mimetype: e.substring(t + 1, r), | |
| data: e.substring(n + 1) | |
| } | |
| } | |
| }; | |
| e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(1), | |
| o = r(43), | |
| i = r(75), | |
| a = o.extend(i, { | |
| extraProperties: "allow", | |
| session: { | |
| _uiObservers: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| _promises: { | |
| type: "array", | |
| "default": function() { | |
| return [] | |
| } | |
| }, | |
| stale: "boolean" | |
| }, | |
| derived: { | |
| isObserved: { | |
| deps: ["_uiObservers"], | |
| fn: function() { | |
| return this._uiObservers > 0 | |
| } | |
| } | |
| }, | |
| update: function() { | |
| return this.getCollection().update(this.id) | |
| }, | |
| find: function() { | |
| return this.getCollection().find(this.id) | |
| }, | |
| getCollection: function() { | |
| return this.Collection ? Store[this.Collection] : n.error("baseState:getCollection Attempting to get a non existing collection")() | |
| }, | |
| getp: function(e) { | |
| if (_.isString(e)) { | |
| for (var t = e.split("."), r = this, n = 0; n < t.length; n++) { | |
| if (!r) throw Error("Path: " + e + " is not defined"); | |
| r = r.get(t[n]) | |
| } | |
| return r | |
| } | |
| }, | |
| regCancellablePromise: function(e) { | |
| var t = this; | |
| return this._promises.push(e), e.cancellable()["finally"](function() { | |
| t._promises = _.without(t._promises, e) | |
| }) | |
| }, | |
| hasPendingPromises: function() { | |
| return this._promises && this._promises.length > 0 | |
| }, | |
| cancelPendingPromises: function() { | |
| this.hasPendingPromises() && (this._promises.forEach(function(e) { | |
| e.cancel() | |
| }), this._promises = []) | |
| }, | |
| set: function(e, t) { | |
| return t && t.merge && _.isObject(e) ? o.prototype.set.call(this, _.omit(e, _.isUndefined), t) : o.prototype.set.call(this, e, t) | |
| }, | |
| "delete": function() { | |
| this.stopListening() | |
| } | |
| }); | |
| e.exports = a | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| switch (f.state) { | |
| case f.STATE.TIMEOUT: | |
| return b.TIMEOUT; | |
| case f.STATE.OPENING: | |
| return l.online ? b.OPENING : b.OFFLINE; | |
| case f.STATE.PAIRING: | |
| return f.hasSynced ? b.RESUMING : b.PAIRING; | |
| case f.STATE.CONNECTED: | |
| return f.stream !== f.STREAM.CONNECTED ? f.hasSynced ? b.NORMAL : b.SYNCING : b.NORMAL; | |
| case f.STATE.UNLAUNCHED: | |
| case f.STATE.PROXYBLOCK: | |
| default: | |
| return b.NORMAL | |
| } | |
| } | |
| function o() { | |
| if (!v.knowsPhone() && f.state !== f.STATE.PROXYBLOCK) return w.QR; | |
| var e = f.hasSynced; | |
| switch (f.state) { | |
| case f.STATE.PROXYBLOCK: | |
| return w.PROXYBLOCK; | |
| case f.STATE.CONFLICT: | |
| return w.CONFLICT; | |
| case f.STATE.TOS_BLOCK: | |
| return w.TOS_BLOCK; | |
| case f.STATE.UNLAUNCHED: | |
| return w.SYNCING; | |
| case f.STATE.UNPAIRED_IDLE: | |
| case f.STATE.UNPAIRED: | |
| return w.QR; | |
| case f.STATE.OPENING: | |
| if (!l.online && !f.hasSynced) return w.OFFLINE; | |
| default: | |
| return e || f.stream === f.STREAM.CONNECTED ? w.MAIN : w.SYNCING | |
| } | |
| } | |
| function i(e, t) { | |
| switch (t) { | |
| case E.SHOW: | |
| return e; | |
| case E.HIDE: | |
| return f.hasSynced ? b.NORMAL : b.CONNECTING; | |
| case E.OBSCURE: | |
| switch (e) { | |
| case b.OPENING: | |
| case b.PAIRING: | |
| case b.SYNCING: | |
| case b.RESUMING: | |
| return b.CONNECTING; | |
| default: | |
| return e | |
| } | |
| } | |
| } | |
| var a = r(6), | |
| s = r(1), | |
| d = r(52), | |
| c = r(41), | |
| u = r(89), | |
| l = r(98), | |
| f = r(10), | |
| h = r(18), | |
| p = r(30), | |
| m = r(96), | |
| g = r(54), | |
| v = r(13), | |
| y = r(97), | |
| b = { | |
| OFFLINE: "OFFLINE", | |
| OPENING: "OPENING", | |
| PAIRING: "PAIRING", | |
| SYNCING: "SYNCING", | |
| RESUMING: "RESUMING", | |
| CONNECTING: "CONNECTING", | |
| NORMAL: "NORMAL", | |
| TIMEOUT: "TIMEOUT" | |
| }, | |
| w = { | |
| QR: "QR", | |
| MAIN: "MAIN", | |
| SYNCING: "SYNCING", | |
| OFFLINE: "OFFLINE", | |
| CONFLICT: "CONFLICT", | |
| PROXYBLOCK: "PROXYBLOCK", | |
| TOS_BLOCK: "TOS_BLOCK" | |
| }, | |
| E = { | |
| SHOW: "SHOW", | |
| OBSCURE: "OBSCURE", | |
| HIDE: "HIDE" | |
| }, | |
| S = 3e3, | |
| N = d.extend({ | |
| extraProperties: "reject", | |
| session: { | |
| info: { | |
| type: "string", | |
| values: _.values(b), | |
| "default": b.NORMAL | |
| }, | |
| obscurity: { | |
| type: "string", | |
| values: _.values(E), | |
| "default": E.HIDE | |
| }, | |
| mode: { | |
| type: "string", | |
| values: _.values(w), | |
| "default": w.SYNCING | |
| }, | |
| needsUpdate: "boolean", | |
| couldForce: "boolean", | |
| uiActive: "boolean", | |
| available: ["boolean", !1, !0], | |
| unavailableShiftTimer: "object", | |
| unavailableLogoutTimer: "object", | |
| unobscureShiftTimer: "object", | |
| timeoutEvent: "object", | |
| resumeCount: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| phoneActive: "boolean", | |
| phoneAuthed: ["boolean", !1, !1] | |
| }, | |
| derived: { | |
| displayInfo: { | |
| deps: ["info", "obscurity"], | |
| fn: function() { | |
| return i(this.info, this.obscurity) | |
| } | |
| } | |
| }, | |
| initialize: function() { | |
| this.unavailableShiftTimer = new g(this, this.markUnavailable), this.unobscureShiftTimer = new g(this, this.unobscure), this.unavailableLogoutTimer = new g(function() { | |
| v.getRememberMe() || (s.log("Stream:unavailableLogoutTimer logout due to inactivity")(), f.logout()) | |
| }), this.listenTo(f, "change:state change:stream change:hasSynced", this.onSocketUpdate), this.listenTo(l, "change:online", this.onSocketUpdate), this.listenTo(this, "change:available", this.onAvailableUpdate), this.listenTo(this, "change:phoneAuthed", this.onPhoneAuthedUpdate), this.listenTo(this, "change:info change:displayInfo change:mode", _.debounce(this.onSelfUpdate)), this.listenTo(this, "change:info", this.logPageResume), this.listenTo(this, "change:info", this.updateWamLog), this.listenTo(this, "change:available change:uiActive", this.updateCouldForce.bind(this, !1)), document.addEventListener("visibilitychange", this.updateCouldForce.bind(this, !1)), this.updateCouldForce(!1) | |
| }, | |
| "delete": function() {}, | |
| INFO: b, | |
| MODE: w, | |
| handle: function(e) { | |
| switch (e[0]) { | |
| case "awake": | |
| this.phoneActive = !1, this.phoneActive = !0; | |
| break; | |
| case "asleep": | |
| this.phoneActive = !1; | |
| break; | |
| case "update": | |
| m.update(e[1], e[2]); | |
| break; | |
| case "killsw": | |
| m.killServiceWorker(); | |
| break; | |
| case "update_desktop": | |
| m.updateDesktop(e[1], e[2], e[3]); | |
| break; | |
| case "desktop_manual_download": | |
| Store.Stream.needsManualDownload = e[1]; | |
| break; | |
| default: | |
| s.error("Stream:handle unknown cmd " + e[0], e)() | |
| } | |
| }, | |
| markAvailable: function() { | |
| this.unavailableShiftTimer.cancel(), this.available = !0, u.monitor(!0, this.displayInfo === b.TIMEOUT) | |
| }, | |
| markUnavailable: function(e) { | |
| e ? this.unavailableShiftTimer.before(e) : (this.unavailableShiftTimer.cancel(), this.available = !1, u.monitor(!1, this.displayInfo === b.TIMEOUT)) | |
| }, | |
| onSelfUpdate: function() { | |
| var e = this.timeoutEvent; | |
| this.info === b.TIMEOUT ? (e || (this.timeoutEvent = e = new c.WebcPhoneDisconnected), this.displayInfo !== b.TIMEOUT || e._bbarTime || (e._bbarTime = Date.now())) : e && (e.markWebcPhoneDisconnectedT(), e._bbarTime && (e.webcPhoneBbarShownT = Date.now() - e._bbarTime), e.commit(), this.timeoutEvent = null), s.log("Stream:onSelfUpdate mode:" + this.mode + (" info:" + this.info + " view:" + this.displayInfo))() | |
| }, | |
| onSocketUpdate: function() { | |
| var e = {}, | |
| t = f.previousAttributes(); | |
| t.stream !== f.stream && f.stream === f.STREAM.DISCONNECTED && (e.phoneActive = !1); | |
| var r = n(); | |
| if (e.info = r, e.mode = o(), e.phoneAuthed = f.stream !== f.STREAM.DISCONNECTED, r === b.NORMAL) this.unobscureShiftTimer.cancel(), e.obscurity = E.HIDE; | |
| else if (r === b.OFFLINE) this.unobscureShiftTimer.cancel(), e.obscurity = E.OBSCURE; | |
| else switch (this.obscurity) { | |
| case E.HIDE: | |
| this.unobscureShiftTimer.before(a.DIAGNOSTIC_DELAY); | |
| break; | |
| case E.OBSCURE: | |
| this.unobscureShiftTimer.before(S); | |
| break; | |
| case E.SHOW: | |
| } | |
| this.set(e) | |
| }, | |
| unobscure: function() { | |
| this.obscurity = E.SHOW | |
| }, | |
| onPhoneAuthedUpdate: function() { | |
| this.phoneAuthed && (this.sendAvailability(!0), Store.RecentEmoji.sync()) | |
| }, | |
| onAvailableUpdate: function() { | |
| var e = this.available; | |
| s.log("Stream:onAvailableUpdate user " + (e ? "available" : "unavailable"))(), e || v.getRememberMe() ? this.unavailableLogoutTimer.cancel() : this.unavailableLogoutTimer.before(a.IDLE_TIMEOUT), this.sendAvailability(!1) | |
| }, | |
| sendAvailability: function(e) { | |
| (e || this.uiActive) && (this.available ? p.sendPresenceAvailable()["catch"](h.WapDrop, _.noop) : p.sendPresenceUnavailable()["catch"](h.WapDrop, _.noop)) | |
| }, | |
| updateCouldForce: function() { | |
| this.couldForce = !this.uiActive || !this.available && document.hidden | |
| }, | |
| logPageResume: function() { | |
| this.info === b.RESUMING && (this.resumeCount++, new c.WebcPageResume({ | |
| webcResumeCount: this.resumeCount | |
| }).commit()) | |
| }, | |
| updateWamLog: function() { | |
| var e = this.info === b.NORMAL; | |
| u.streamInfoChange(this.info, y.numSocketsAttempted, e), e && this.stopListening(null, "change:info", this.updateWamLog) | |
| } | |
| }); | |
| e.exports = new N | |
| }, function(e, t) { | |
| "use strict"; | |
| function r() { | |
| this.cancel(), this.foo.apply(this.context, arguments) | |
| } | |
| var n = function() { | |
| 1 === arguments.length ? (this.context = null, this.foo = arguments[0]) : (this.context = arguments[0], this.foo = arguments[1]), this.timer = 0, this.ts = 0, this._before = 0, this._after = 0, this.trigger = r.bind(this) | |
| }; | |
| n.prototype = { | |
| before: function(e) { | |
| var t = e + Date.now(), | |
| r = this.ts; | |
| return this._before && this._before < t ? r : this._after && t < this._after ? r : (this._before = t, (!r || r > t) && (arguments[0] = t, r = this.set.apply(this, arguments)), r) | |
| }, | |
| after: function(e) { | |
| var t = e + Date.now(), | |
| r = this.ts; | |
| return this._after && this._after > t ? r : this._before && t > this._before ? r : (this._after = t, (!r || r > t) && (arguments[0] = t, r = this.set.apply(this, arguments)), r) | |
| }, | |
| debounce: function(e) { | |
| return arguments[0] = e + Date.now(), this.set.apply(this, arguments) | |
| }, | |
| debounceAndCap: function(e, t) { | |
| if (arguments.length <= 2) this.debounce(e), this.before(t); | |
| else { | |
| for (var r = new Array(arguments.length - 1), n = 2; n < arguments.length; n++) r[n - 1] = arguments[n]; | |
| r[0] = e, this.debounce.apply(this, r), r[0] = t, this.before.apply(this, r) | |
| } | |
| }, | |
| set: function(e) { | |
| for (var t = this, n = arguments.length, o = Array(n > 1 ? n - 1 : 0), i = 1; n > i; i++) o[i - 1] = arguments[i]; | |
| var a = Date.now(); | |
| if (e = Math.max(e, a), this._before && this._before < e || this._after && this._after > e) return this.ts; | |
| this.timer && clearTimeout(this.timer); | |
| var s = e - a; | |
| return this.timer = o.length > 0 ? setTimeout(function() { | |
| r.apply(t, o) | |
| }, s) : setTimeout(this.trigger, s), this.ts = e | |
| }, | |
| cancel: function() { | |
| this.timer && (clearTimeout(this.timer), this.timer = 0, this.ts = 0, this._before = 0, this._after = 0) | |
| } | |
| }, e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| "number" == typeof e && (e = "v" + e); | |
| var t = m[e]; | |
| t || (o.error("binaryProtocol unknown version: " + e)(), a.upload("bp_unknown_version", !0)["finally"](function() { | |
| return i.hardRefresh() | |
| })); | |
| var r = t.OutputStream, | |
| n = new t.Writer(t.Dictionary), | |
| s = t.InputStream, | |
| d = new t.Reader(t.Dictionary), | |
| c = t.Crypto; | |
| this.Node = t.Node, this.read = function(e) { | |
| var t; | |
| try { | |
| var r = new s(c.decrypt(e)); | |
| t = d.readNode(r) | |
| } catch (n) { | |
| o.errorVerbose("binaryProtocol:read error " + n.stack)() | |
| } | |
| return t | |
| }, this.write = function(e) { | |
| var t; | |
| try { | |
| var i = new r; | |
| n.writeNode(i, e), t = c.encrypt(i.toBuffer()) | |
| } catch (a) { | |
| o.errorVerbose("binaryProtocol:write error " + a.stack)() | |
| } | |
| return t | |
| } | |
| } | |
| var o = r(1), | |
| i = r(14), | |
| a = r(9), | |
| s = { | |
| OutputStream: r(347), | |
| Writer: r(349), | |
| InputStream: r(345), | |
| Reader: r(348), | |
| Dictionary: r(344), | |
| Node: r(346), | |
| Crypto: r(343) | |
| }, | |
| d = { | |
| OutputStream: r(354), | |
| Writer: r(356), | |
| InputStream: r(352), | |
| Reader: r(355), | |
| Dictionary: r(351), | |
| Node: r(353), | |
| Crypto: r(350) | |
| }, | |
| c = _.defaults({ | |
| Dictionary: r(357) | |
| }, d), | |
| u = _.defaults({ | |
| Dictionary: r(358) | |
| }, c), | |
| l = _.defaults({ | |
| Writer: r(360), | |
| Reader: r(359) | |
| }, u), | |
| f = _.defaults({ | |
| Dictionary: r(361) | |
| }, l), | |
| h = _.defaults({ | |
| Dictionary: r(362) | |
| }, f), | |
| p = _.defaults({ | |
| Dictionary: r(363) | |
| }, h), | |
| m = { | |
| "01": s, | |
| "03": d, | |
| "04": c, | |
| "05": u, | |
| "06": l, | |
| v1: u, | |
| v2: l, | |
| v3: f, | |
| v4: h, | |
| v5: p | |
| }; | |
| e.exports = n | |
| }, function(e, t, r) { | |
| var n = r(77); | |
| e.exports = function(e) { | |
| if (!n(e)) throw TypeError(e + " is not an object!"); | |
| return e | |
| } | |
| }, function(e, t) { | |
| var r = e.exports = { | |
| version: "1.2.6" | |
| }; | |
| "number" == typeof __e && (__e = r) | |
| }, function(e, t, r) { | |
| var n = r(100); | |
| e.exports = function(e, t, r) { | |
| if (n(e), void 0 === t) return e; | |
| switch (r) { | |
| case 1: | |
| return function(r) { | |
| return e.call(t, r) | |
| }; | |
| case 2: | |
| return function(r, n) { | |
| return e.call(t, r, n) | |
| }; | |
| case 3: | |
| return function(r, n, o) { | |
| return e.call(t, r, n, o) | |
| } | |
| } | |
| return function() { | |
| return e.apply(t, arguments) | |
| } | |
| } | |
| }, function(e, t) { | |
| e.exports = {} | |
| }, , , , , , , , , , , function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| return e && _.isFunction(e.isMounted) && e.isMounted() ? i.findDOMNode(e) : null | |
| } | |
| function o(e, t) { | |
| var r; | |
| return e && t && (r = n(e.component)) && r.contains(t) | |
| } | |
| var i = r(24), | |
| a = r(8), | |
| s = r(40), | |
| d = r(1), | |
| c = { | |
| TOOLTIP: "tooltip", | |
| MENU: "menu", | |
| MODAL: "modal", | |
| MODAL_MEDIA: "modal_media", | |
| EMOJI: "emoji", | |
| DRAWER_LEFT: "drawer_left", | |
| DRAWER_MID: "drawer_mid", | |
| DRAWER_RIGHT: "drawer_right", | |
| PTT: "ptt_recorder", | |
| MAIN: "main", | |
| CONVERSATION_FOOTER: "conversation_footer", | |
| MEDIA_VIEWER: "media_viewer", | |
| STATUS_INPUT: "status_input", | |
| ADVANCED_INPUT: "advanced_input", | |
| SUBJECT_INPUT: "subject_input", | |
| COMPOSE_INPUT: "compose_input", | |
| CAPTION_INPUT: "caption_input", | |
| CONTACT_SEARCH: "contact_search", | |
| CHAT_SEARCH: "chat_search", | |
| CHATLIST_PANEL: "chatlist_panel", | |
| SETTINGS_DRAWER: "settings_drawer", | |
| BLOCKED_DRAWER: "blocked_drawer", | |
| IGNORE_ANY: "any", | |
| IGNORE_CONTEXT: "contextmenu", | |
| _stack: [], | |
| _base: null, | |
| _events: !1, | |
| push: function(e, t) { | |
| var r, n = arguments.length <= 2 || void 0 === arguments[2] ? {} : arguments[2]; | |
| (r = this.find(t)) && (this._stack = _.without(this._stack, r)), r = { | |
| component: e, | |
| type: t, | |
| popable: !!n.popable, | |
| escapable: !!n.escapable || !!n.popable, | |
| maintainFocus: !!n.maintainFocus, | |
| parent: n.parent | |
| }, this._stack.push(r), this._listeners(), this._focus() | |
| }, | |
| pop: function(e, t) { | |
| if (this._stack.length) { | |
| var r; | |
| if (e ? r = this.find(e) : (r = _.last(this._stack), r = r.popable ? r : null), r) { | |
| var n = this._deps(r.component); | |
| n.push(r), this._close(n, t) | |
| } | |
| } | |
| }, | |
| popDependents: function(e) { | |
| this._close(this._deps(e)) | |
| }, | |
| stealFocus: function(e) { | |
| for (var t, r = function(t) { | |
| return t.maintainFocus && t.type !== e | |
| }; t = _.find(this._stack, r);) { | |
| var n = this._deps(t.component); | |
| n.push(t), this._close(n) | |
| } | |
| }, | |
| _close: function(e, t) { | |
| var r = this; | |
| if (!_.isEmpty(e)) { | |
| var i = this._stack; | |
| e.forEach(function(e) { | |
| e.index = _.findIndex(i, e) | |
| }), e = e.sort(function(e, t) { | |
| return t.index - e.index | |
| }); | |
| var a = _.findLast(e, "parent"), | |
| s = document.activeElement; | |
| e.forEach(function(e) { | |
| r.unregBubbleTrap(e), i = _.without(i, e), o(e, s) && _.isFunction(s.blur) && r.blurNode(s), _.isFunction(e.component.uimClose) && e.component.uimClose(e.type, t) | |
| }), this._stack = i, this._listeners(), document.activeElement === document.body && (a ? this.focusNodeOrParent(n(a.parent)) : this._focus(t)) | |
| } | |
| }, | |
| focusNodeOrParent: function(e) { | |
| for (; e && _.isFunction(e.focus);) { | |
| if (this.focusNode(e), document.activeElement === e) return; | |
| e = e.parentNode | |
| } | |
| }, | |
| _deps: function(e) { | |
| var t = this, | |
| r = _.filter(this._stack, { | |
| parent: e | |
| }); | |
| return _.flatten(r, _.chain(r).pluck("component").map(function(e) { | |
| return t._deps(e) | |
| }).value()) | |
| }, | |
| top: function() { | |
| return _.last(this._stack) || this._base | |
| }, | |
| find: function(e) { | |
| return _.find(this._stack, { | |
| type: e | |
| }) | |
| }, | |
| _listeners: function() { | |
| var e = this.top(); | |
| e && e.popable ? this.regListeners() : this.unregListeners() | |
| }, | |
| _focus: function(e) { | |
| var t = this.top(); | |
| t && _.isFunction(t.component.uimFocus) && t.component.isMounted() && t.component.uimFocus(t.type, e) | |
| }, | |
| regListeners: function() { | |
| this._events || (window.addEventListener("DOMMouseScroll", this.maybePreventDefault, !0), window.addEventListener("mousewheel", this.maybePreventDefault, !0), a.on("window_mousedown", this.onMouseDown), window.addEventListener("resize", this.onResize, !0), this._events = !0) | |
| }, | |
| unregListeners: function() { | |
| this._events && (window.removeEventListener("DOMMouseScroll", this.maybePreventDefault, !0), window.removeEventListener("mousewheel", this.maybePreventDefault, !0), a.off("window_mousedown", this.onMouseDown), window.removeEventListener("resize", this.onResize, !0), this._events = !1) | |
| }, | |
| regBubbleTrap: function(e) { | |
| var t = n(e.parent); | |
| t && (t.addEventListener("click", this.stopEvent), t.addEventListener("contextmenu", this.stopEvent)) | |
| }, | |
| unregBubbleTrap: function(e) { | |
| var t = n(e.parent); | |
| t && (t.removeEventListener("click", this.stopEvent), t.removeEventListener("contextmenu", this.stopEvent)) | |
| }, | |
| stopEvent: function(e) { | |
| e.preventDefault(), e.stopPropagation() | |
| }, | |
| maybePreventDefault: function(e) { | |
| return o(this.top(), e.target) ? !0 : (e.preventDefault(), void e.stopPropagation()) | |
| }, | |
| maintainFocus: function(e) { | |
| var t = _.findLast(this._stack, "maintainFocus"); | |
| t && t.component.uimFocus && (o(t, e.target) || (e.preventDefault(), t.component.uimFocus())) | |
| }, | |
| onMouseDown: function(e) { | |
| this.unregEatClick(); | |
| var t = e.target, | |
| r = _.last(this._stack); | |
| if (o(r, t)) return void this.maintainFocus(e); | |
| var n = "click"; | |
| e.button > 0 && (n = "contextmenu"); | |
| for (var i = !0; t !== document;) { | |
| var a = t.getAttribute("data-ignore-capture"); | |
| if (a) { | |
| if (a === c.IGNORE_ANY || a === n) { | |
| i = !1; | |
| break | |
| } | |
| break | |
| } | |
| t = t.parentNode | |
| } | |
| this.pop(), this.maintainFocus(e), i && this.regEatClick() | |
| }, | |
| regEatClick: function() { | |
| a.on("window_click", this.onClick), a.on("window_mousedown", this.unregEatClick) | |
| }, | |
| unregEatClick: function() { | |
| a.off("window_click", this.onClick), a.off("window_mousedown", this.unregEatClick) | |
| }, | |
| onClick: function(e) { | |
| s.isGecko && "click" === e.type && e.button > 0 || (this.unregEatClick(), e.defaultPrevented || (e.preventDefault(), e.stopPropagation())) | |
| }, | |
| onResize: function(e) { | |
| for (var t = this.top(); t && t.popable;) this.pop(), t = this.top() | |
| }, | |
| focusNode: function(e) { | |
| e.focus() | |
| }, | |
| blurNode: function(e) { | |
| e.blur() | |
| } | |
| }; | |
| "maybePreventDefault stopEvent onMouseDown regEatClick unregEatClick onClick onResize".split(/ /).forEach(function(e) { | |
| c[e] = c[e].bind(c) | |
| }), window.addEventListener("keydown", function(e) { | |
| if (27 === e.keyCode) { | |
| e.stopPropagation(), e.preventDefault(); | |
| var t = _.last(c._stack); | |
| t && t.escapable && c.pop(t.type) | |
| } | |
| }), d.exportToWindow("UIM", c), e.exports = c | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| this.proto = [0, 0], this.F = _(a).flatten().map(_.keys).flatten().concat(_.keys(s)).uniq().map(function(e) { | |
| return [e, e] | |
| }).zipObject().value() | |
| } | |
| var o = !0, | |
| i = r(1), | |
| a = [ | |
| [{ | |
| RESEND_ICON: !1 | |
| }, {}, {}, { | |
| FORWARD_MESSAGE: !0 | |
| }, { | |
| SET_STATUS: !0, | |
| SET_PROFILE_PIC: !0, | |
| SET_BLOCK: !0, | |
| MUTE: !0, | |
| ARCHIVE: !0, | |
| ARCHIVE_BROADCAST: !0, | |
| DELETE: !0, | |
| GROUP_CREATE: !0, | |
| GROUP_EXIT: !0, | |
| GROUP_SET_SUBJECT: !0, | |
| GROUP_SET_PIC: !0, | |
| GROUP_ADD_PARTICIPANT: !0, | |
| GROUP_REMOVE_PARTICIPANT: !0, | |
| GROUP_PROMOTE_PARTICIPANT: !0 | |
| }, { | |
| RECENT_EMOJI_SYNC: !0, | |
| MESSAGE_DELETE: !0, | |
| MESSAGE_INFO: !0, | |
| CHAT_MARK_UNSEEN: !0, | |
| CHAT_CLEAR: !0 | |
| }, {}, { | |
| MUTE_1_1: !0, | |
| MEDIA_RETRY: !0, | |
| STARRED: !o | |
| }, { | |
| SPAM: !0, | |
| FULL_TEXT_SEARCH: !o | |
| }] | |
| ], | |
| s = { | |
| KEY_PARTICIPANT: !1, | |
| MEDIA_RETRY: !1, | |
| STARRED: !1, | |
| DOCUMENT: !1, | |
| URL: !1, | |
| CHAT_CLEAR_STARRED: !1, | |
| ENC_IMAGE: !1, | |
| ENC_AUDIO: !1, | |
| ENC_VIDEO: !1, | |
| ENC_DOC: !1, | |
| RICH_TEXT: !o | |
| }; | |
| n.prototype = { | |
| setVersion: function(e) { | |
| if (this.proto.length !== e.length || this.proto[0] !== e[0] || this.proto[1] !== e[1]) { | |
| this.proto = e; | |
| var t = a.slice(0, e[0] + 1), | |
| r = a.slice(e[0] + 1, a.length), | |
| n = t[e[0]], | |
| o = n.slice(0, e[1] + 1), | |
| i = n.slice(e[1] + 1, n.length); | |
| t[e[0]] = o, r.unshift(i), this.features = _.merge(_.omit(_.merge.apply(_, [{}].concat(_.flatten(t))), function(e) { | |
| return !e | |
| }), this.features || {}); | |
| var s = _.merge.apply(_, [{}].concat(_.flatten(r))); | |
| this.features = _.omit(this.features, function(e, t) { | |
| return !!s[t] | |
| }), this.VF = _(_.keys(_.merge.apply(_, [{}].concat(_.flatten(t))))).map(function(e) { | |
| return [e, e] | |
| }).zipObject().value() | |
| } | |
| }, | |
| setPlatform: function(e) { | |
| switch (e) { | |
| case "iphone": | |
| this.features.RECENT_EMOJI_SYNC = !1, this.features.ARCHIVE_BROADCAST = !1, this.features.RESEND_ICON = !0; | |
| break; | |
| case "symbian": | |
| case "s40": | |
| case "bb": | |
| this.features.CHAT_MARK_UNSEEN = !1 | |
| } | |
| }, | |
| setFeature: function(e, t) { | |
| var r = this.features[e] !== t; | |
| return this.features[e] = t, r | |
| }, | |
| setFeatures: function(e) { | |
| var t = {}, | |
| r = _.merge({}, s, e); | |
| for (var n in r) n in this.VF || (t[n] = this.setFeature(n, !!r[n])); | |
| return t | |
| }, | |
| supportsFeature: function(e) { | |
| return !!this.features[e] | |
| }, | |
| lt: function(e) { | |
| var t = this.proto; | |
| return e[0] > t[0] || e[0] === t[0] && e[1] > t[1] | |
| }, | |
| lte: function(e) { | |
| var t = this.proto; | |
| return e[0] > t[0] || e[0] === t[0] && e[1] >= t[1] | |
| }, | |
| gt: function(e) { | |
| var t = this.proto; | |
| return e[0] < t[0] || e[0] === t[0] && e[1] < t[1] | |
| }, | |
| gte: function(e) { | |
| var t = this.proto; | |
| return e[0] < t[0] || e[0] === t[0] && e[1] <= t[1] | |
| } | |
| }; | |
| var d = new n; | |
| i.exportToWindow("GateKeeper", d), e.exports = d | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(8), | |
| o = { | |
| getCmds: function() { | |
| return this._cmds || (this._cmds = []), this._cmds | |
| }, | |
| regCmd: function(e, t) { | |
| if (!_.isFunction(t)) throw Error("handler is not a function"); | |
| this.getCmds().push({ | |
| cmd: e, | |
| handler: t | |
| }), this.isMounted() && n.on(e, t) | |
| }, | |
| unregCmd: function(e, t) { | |
| n.off(e, t), this._cmds = _.reject(this._cmds, _.matches({ | |
| cmd: e, | |
| handler: t | |
| })) | |
| }, | |
| registerCmds: function() { | |
| this._cmds && this.getCmds().forEach(function(e) { | |
| n.on(e.cmd, e.handler) | |
| }) | |
| }, | |
| unregisterCmds: function() { | |
| this._cmds && (this.getCmds().forEach(function(e) { | |
| n.off(e.cmd, e.handler) | |
| }), delete this._cmds) | |
| }, | |
| componentDidMount: function() { | |
| this.registerCmds() | |
| }, | |
| componentWillUnmount: function() { | |
| this.unregisterCmds() | |
| } | |
| }; | |
| e.exports = o | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e, t) { | |
| if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") | |
| } | |
| var o = r(5), | |
| i = r(8), | |
| a = r(135), | |
| s = r(39), | |
| d = 3e3, | |
| c = function l(e, t, r) { | |
| if (n(this, l), !e) throw new Error("ActionType must have text!"); | |
| if (t && !r || r && !t) throw new Error("ActionType must have an action and a handler or have neither."); | |
| this.text = e, this.action = t, this.handler = r | |
| }, | |
| u = o.createClass({ | |
| displayName: "ActionToast", | |
| mixins: [a], | |
| propTypes: { | |
| id: o.PropTypes.string.isRequired, | |
| initialAction: o.PropTypes.instanceOf(c).isRequired, | |
| pendingAction: o.PropTypes.instanceOf(Promise).isRequired | |
| }, | |
| statics: { | |
| genId: function(e) { | |
| return _.uniqueId(e || "action_toast") | |
| } | |
| }, | |
| getInitialState: function() { | |
| return { | |
| actionType: this.props.initialAction, | |
| pending: !0 | |
| } | |
| }, | |
| componentWillReceiveProps: function(e) { | |
| this.actionPromise && this.actionPromise.control.cancel(), this.setState({ | |
| actionType: e.initialAction, | |
| pending: !0 | |
| }), this.runAction(e.pendingAction) | |
| }, | |
| componentWillMount: function() { | |
| this.runAction(this.props.pendingAction) | |
| }, | |
| runAction: function(e) { | |
| var t = this, | |
| r = {}; | |
| this.actionPromise = e.bind(this).addRejectControl("cancel", function() { | |
| return r | |
| }).then(function(e) { | |
| this.setState({ | |
| actionType: e, | |
| pending: !1 | |
| }) | |
| })["catch"](function(e) { | |
| return e !== r | |
| }, function(e) { | |
| this.setState({ | |
| actionType: e, | |
| pending: !1 | |
| }) | |
| }).delay(d).addRejectControl("cancel", function() { | |
| return r | |
| }).then(function() { | |
| t.isMounted() && i.closeToast(t) | |
| })["catch"](function(e) { | |
| return e === r | |
| }, _.noop).endWithControls("cancel") | |
| }, | |
| onAction: function() { | |
| this.state.actionType.handler()["catch"](_.noop) | |
| }, | |
| onDismiss: function() { | |
| i.closeToast(this) | |
| }, | |
| render: function() { | |
| var e = this.state.actionType, | |
| t = void 0, | |
| r = void 0; | |
| return e.action && e.handler && (r = o.createElement("button", { | |
| className: "action", | |
| onClick: this.onAction | |
| }, e.action)), this.state.pending || (t = o.createElement("button", { | |
| className: "icon icon-x-alt", | |
| onClick: this.onDismiss | |
| })), o.createElement("div", { | |
| className: s("toast", this.props.className) | |
| }, o.createElement("span", null, e.text), r, t) | |
| } | |
| }); | |
| e.exports = { | |
| ActionToast: u, | |
| ActionType: c | |
| } | |
| }, function(e, t) { | |
| "use strict"; | |
| function r(e, t, r, n) { | |
| var o; | |
| return o = 0 === e ? r || 0 : Math.pow(2, e), _.isFinite(t) && o > t && (o = t), _.isFinite(r) && r > o && (o = r), n && (o *= 1 + n * Math.random()), o | |
| } | |
| e.exports = { | |
| expBackoff: r | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(42), | |
| o = { | |
| listenTo: function(e, t, r) { | |
| if (!_.isObject(e)) throw Error("obj is not an object"); | |
| if (_.isObject(t)); | |
| else if (!_.isFunction(r)) throw Error("callback is not a function"); | |
| n.listenTo.apply(this, arguments) | |
| }, | |
| listenToOnce: function(e, t, r) { | |
| if (!_.isObject(e)) throw Error("obj is not an object"); | |
| if (_.isObject(t)); | |
| else if (!_.isFunction(r)) throw Error("callback is not a function"); | |
| n.listenToOnce.apply(this, arguments) | |
| } | |
| }; | |
| e.exports = o | |
| }, function(e, t) { | |
| var r = {}.toString; | |
| e.exports = function(e) { | |
| return r.call(e).slice(8, -1) | |
| } | |
| }, function(e, t) { | |
| e.exports = function(e) { | |
| return "object" == typeof e ? null !== e : "function" == typeof e | |
| } | |
| }, , , , , , , , , , , , function(e, t, r) { | |
| "use strict"; | |
| function n(e, t, r) { | |
| var n = Math.floor(window.performance.now()); | |
| m[e] = n, r && (m.socketSequence = t, o(), i(), h.resumeJobs()) | |
| } | |
| function o() { | |
| function e(e) { | |
| var r = 0 | t[e]; | |
| return r && r - n | |
| } | |
| if (!(window.performance && window.performance.timing && window.performance.navigation)) return void l.log("MetricReporter:logPageLoad metrics not provided by browser!", "red")(); | |
| var t = window.performance.timing, | |
| r = window.performance.navigation, | |
| n = 0 | t.navigationStart, | |
| i = (0 | t.loadEventEnd) - n; | |
| return 0 >= i ? (l.log("MetricReporter:logPageLoad delayed", "blue")(), void _.delay(o, 1e4)) : (p.set({ | |
| webcPageLoadT: i, | |
| webcUnloadEventStart: e("unloadEventStart"), | |
| webcUnloadEventEnd: e("unloadEventEnd"), | |
| webcRedirectStart: e("redirectStart"), | |
| webcRedirectEnd: e("redirectEnd"), | |
| webcFetchStart: e("fetchStart"), | |
| webcDomainLookupStart: e("domainLookupStart"), | |
| webcDomainLookupEnd: e("domainLookupEnd"), | |
| webcConnectStart: e("connectStart"), | |
| webcConnectEnd: e("connectEnd"), | |
| webcSecureConnectionStart: e("secureConnectionStart"), | |
| webcRequestStart: e("requestStart"), | |
| webcResponseStart: e("responseStart"), | |
| webcResponseEnd: e("responseEnd"), | |
| webcDomLoading: e("domLoading"), | |
| webcDomInteractive: e("domInteractive"), | |
| webcDomContentLoadedEventStart: e("domContentLoadedEventStart"), | |
| webcDomContentLoadedEventEnd: e("domContentLoadedEventEnd"), | |
| webcDomComplete: e("domComplete"), | |
| webcLoadEventStart: e("loadEventStart"), | |
| webcLoadEventEnd: e("loadEventEnd"), | |
| webcAppcacheStatus: window.applicationCache ? window.applicationCache.status : void 0, | |
| webcCached: t.fetchStart === t.domainLookupEnd, | |
| webcNavigation: r.type, | |
| webcRedirectCount: r.redirectCount, | |
| webcWsOpening: m.OPENING, | |
| webcWsPairing: m.PAIRING, | |
| webcWsSyncing: m.SYNCING, | |
| webcWsNormal: m.NORMAL, | |
| webcWsAttempts: m.socketSequence, | |
| webcQrCode: !m.SYNCING | |
| }), p.commit(), void(p = null)) | |
| } | |
| function i() { | |
| if (window.performance.getEntriesByType) { | |
| var e, t = window.performance.getEntriesByType("resource"), | |
| r = document.createElement("a"); | |
| t.forEach(function(t) { | |
| r.href = t.name, e = r.pathname + r.search + r.hash, new f.WebcResourceLoad({ | |
| webcResourceName: e, | |
| webcResourceDuration: Math.round(t.duration), | |
| webcResourceCached: t.domainLookupEnd === t.fetchStart | |
| }).commit() | |
| }) | |
| } | |
| } | |
| function a(e) { | |
| v = Date.now(), y = e, g = { | |
| total: 0, | |
| ab: 0, | |
| an: 0, | |
| ub: 0, | |
| un: 0 | |
| } | |
| } | |
| function s(e, t) { | |
| var r = e ? t ? "ab" : "an" : t ? "ub" : "un"; | |
| d(r) | |
| } | |
| function d(e) { | |
| if (g) { | |
| var t = Date.now(), | |
| n = Math.max(t - v, 0); | |
| g.total += n, g[e] += n, v = t, y = e | |
| } else a(e), r(8).on("js_halt_detected", c) | |
| } | |
| function c(e) { | |
| Date.now() - e > v ? v += e : g[y] -= e | |
| } | |
| function u() { | |
| var e = new f.WebcWamUpload; | |
| if (g) { | |
| d(y); | |
| var t = g.total; | |
| if (t > 0) { | |
| var r = g.an + g.ab, | |
| n = g.un + g.ub; | |
| e.set({ | |
| webcTotalT: Math.ceil(g.total), | |
| webcAvailableTp: r / t, | |
| webcAvailableNormalTp: r ? g.an / r : void 0, | |
| webcAvailableBbarTp: r ? g.ab / r : void 0, | |
| webcUnavailableTp: n / t, | |
| webcUnavailableNormalTp: n ? g.un / n : void 0, | |
| webcUnavailableBbarTp: n ? g.ub / n : void 0 | |
| }) | |
| } | |
| a(y) | |
| } | |
| return e | |
| } | |
| var l = r(1), | |
| f = r(41), | |
| h = r(154), | |
| p = new f.WebcPageLoad, | |
| m = {}, | |
| g = void 0, | |
| v = void 0, | |
| y = void 0; | |
| e.exports = { | |
| monitor: s, | |
| PageLoad: p, | |
| streamInfoChange: n, | |
| uploadEvent: u | |
| } | |
| }, , function(e, t, r) { | |
| "use strict"; | |
| var n = r(42), | |
| o = { | |
| getInitialState: function() { | |
| return { | |
| _observedStateIndex: 0 | |
| } | |
| }, | |
| addObserver: function(e, t, r) { | |
| if (!this._isObservable(e)) throw Error("Attempting to observe non-observable object"); | |
| this._observer || (this._observer = n.createEmitter()), this._observer.listenTo(e, t, this._cbWrapper(r)), e.isState && e._uiObservers++ | |
| }, | |
| addObserverAndRun: function(e, t, r) { | |
| this.addObserver(e, t, r); | |
| var n = this._cbWrapper(r); | |
| n(e, t) | |
| }, | |
| removeObserver: function(e, t) { | |
| if (!this._isObservable(e)) throw Error("Attempting to unobserve non-observable object"); | |
| this._observer && (this._observer.stopListening(e, t), e.isState && e._uiObservers--) | |
| }, | |
| _cbWrapper: function(e) { | |
| var t = this; | |
| return _.isFunction(e) ? function() { | |
| if (t.isMounted()) { | |
| for (var r = arguments.length, n = Array(r), o = 0; r > o; o++) n[o] = arguments[o]; | |
| return e.apply(t, n) | |
| } | |
| } : function() { | |
| return t.isMounted() ? t.setState({ | |
| _observedStateIndex: t.state._observedStateIndex + 1 | |
| }) : void 0 | |
| } | |
| }, | |
| _isObservable: function(e) { | |
| return e ? _.isFunction(e.trigger) : !1 | |
| }, | |
| componentWillUnmount: function() { | |
| if (this._observer) { | |
| var e = this._observer._listeningTo; | |
| for (var t in e) { | |
| var r = e[t]; | |
| r.isState && r._uiObservers-- | |
| } | |
| this._observer.stopListening() | |
| } | |
| } | |
| }; | |
| e.exports = o | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = Object.assign || function(e) { | |
| for (var t = 1; t < arguments.length; t++) { | |
| var r = arguments[t]; | |
| for (var n in r) Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]) | |
| } | |
| return e | |
| }, | |
| o = r(24), | |
| i = r(5), | |
| a = r(1), | |
| s = r(385), | |
| d = r(8), | |
| c = r(528), | |
| u = i.createClass({ | |
| displayName: "VelocityTransitionGroupChild", | |
| propTypes: { | |
| transitionName: i.PropTypes.string.isRequired, | |
| delay: i.PropTypes.number, | |
| onAnimationComplete: i.PropTypes.func | |
| }, | |
| _getTransition: function() { | |
| return s[this.props.transitionName] || a.log("TransitionName " + this.props.transitionName + " wasn't found in VelocityTransitionGroupChild transitions.")(), s[this.props.transitionName] || s["default"] | |
| }, | |
| componentWillEnter: function(e) { | |
| var t = this._getTransition(); | |
| this.animateTransitions(t.enter)["finally"](this._cbWrapper(e)) | |
| }, | |
| componentWillLeave: function(e) { | |
| var t = this._getTransition(); | |
| this.animateTransitions(t.leave)["finally"](this._cbWrapper(e)) | |
| }, | |
| _cbWrapper: function(e) { | |
| var t = this; | |
| return function() { | |
| return t.isMounted() && _.isFunction(e) ? e() : void 0 | |
| } | |
| }, | |
| animateTransitions: function(e) { | |
| var t = this, | |
| r = this._getTransition(); | |
| if (!r || !e) return Promise.resolve(); | |
| var n = o.findDOMNode(this), | |
| s = this.props.delay, | |
| c = _.omit(r, "leave", "enter"), | |
| u = {}, | |
| l = i.Children.only(this.props.children); | |
| return e = _.filter(_.forceArray(e), function(e) { | |
| if (_.isString(e.selector) || u[e.selector]) { | |
| var t = n.querySelectorAll(e.selector); | |
| if (!t.length) return !1; | |
| u[e.selector] = t | |
| } | |
| return !0 | |
| }), l.props.staggerDelay || s || _.forEach(e, function(e) { | |
| if (!e.delay && !c.delay) { | |
| var t = e.selector ? u[e.selector] : n; | |
| _.forEach(e.props, function(e, r) { | |
| _.isArray(e) && Velocity.hook(t, r, e[1]) | |
| }) | |
| } | |
| }), d.setUiBusy(!0), Promise.map(e, function(e) { | |
| var r = e.selector ? u[e.selector] : n, | |
| o = Velocity(r, e.props, { | |
| easing: e.easing || c.easing || "easeInSine", | |
| duration: e.duration || c.duration || 0, | |
| delay: l.props.staggerDelay || s || e.delay || c.delay || 0, | |
| queue: c.queue || !1, | |
| stagger: e.stagger || !1, | |
| drag: e.drag || !1 | |
| }); | |
| return o ? o.then(function() { | |
| c.cleanOnComplete && (_.isArray(r) ? _.forEach(r, function(e) { | |
| e.removeAttribute("style") | |
| }) : r.removeAttribute("style")) | |
| }) : (a.log("VelocityTransitionGroup:animationTransitions:error " + t.props.transitionName)(), Promise.resolve()) | |
| })["finally"](function() { | |
| t.props.onAnimationComplete && t.props.onAnimationComplete(), d.setUiBusy(!1) | |
| }) | |
| }, | |
| componentWillUnmount: function() { | |
| var e = o.findDOMNode(this); | |
| Velocity(e, "stop") | |
| }, | |
| render: function() { | |
| return i.Children.only(this.props.children) | |
| } | |
| }), | |
| l = i.createClass({ | |
| displayName: "VelocityTransitionGroup", | |
| propTypes: { | |
| transitionName: i.PropTypes.string.isRequired, | |
| delay: i.PropTypes.number, | |
| onAnimationComplete: i.PropTypes.func | |
| }, | |
| _wrapChild: function(e) { | |
| return i.createElement(u, this.props, e) | |
| }, | |
| render: function() { | |
| return i.createElement(c, n({ | |
| childFactory: this._wrapChild | |
| }, this.props)) | |
| } | |
| }); | |
| e.exports = l | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(1), | |
| o = r(141), | |
| i = { | |
| _nativeEventSafeIsMounted: function() { | |
| return this.isMounted() && "UNMOUNTING" !== this._compositeLifeCycleState | |
| }, | |
| getEvents: function() { | |
| return this._events || (this._events = []), this._events | |
| }, | |
| regNativeListener: function(e, t, r, n) { | |
| if (!_.isFunction(r)) throw Error("handler is not a function"); | |
| t = o.prefix(t, e); | |
| var i = this, | |
| a = function() { | |
| return i._nativeEventSafeIsMounted() ? r.apply(null, arguments) : void 0 | |
| }; | |
| this.getEvents().push({ | |
| src: e, | |
| evnt: t, | |
| handler: r, | |
| fn: a, | |
| capture: n | |
| }), this.isMounted() && e.addEventListener(t, a, n) | |
| }, | |
| unregNativeListener: function(e, t, r, i) { | |
| t = o.prefix(t, e); | |
| var a = _.matches({ | |
| src: e, | |
| evnt: t, | |
| handler: r, | |
| capture: i | |
| }), | |
| s = _.find(this.getEvents(), a); | |
| s ? (this._events = _.without(this._events, s), s.src.removeEventListener(s.evnt, s.fn, s.capture)) : n.error("nativeEventMixin:unregNativeListener unreg could not find event:" + t)() | |
| }, | |
| unregisterListeners: function() { | |
| this._events && (this.getEvents().forEach(function(e) { | |
| e.src.removeEventListener(e.evnt, e.fn, e.capture) | |
| }), delete this._events) | |
| }, | |
| componentDidMount: function() { | |
| this._events && this.getEvents().forEach(function(e) { | |
| e.src.addEventListener(e.evnt, e.fn, e.capture) | |
| }) | |
| }, | |
| componentWillUnmount: function() { | |
| this.unregisterListeners() | |
| } | |
| }; | |
| e.exports = i | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e, t, r, n, s) { | |
| this._from = e, this._to = t, this._id = r, this._participant = n, this._selfDir = s; | |
| var d, c; | |
| if (!(e && t && r && Store.Conn.me)) throw new Error("MsgKey error: " + [e, t, r, Store.Conn.me].join()); | |
| s = e === t ? s : void 0, e === t && e === Store.Conn.me ? (d = "out" === s, c = Store.Conn.me) : e === Store.Conn.me ? (d = !0, c = t) : t === Store.Conn.me ? (d = !1, c = e) : e === t && (i.isGroup(e) || i.isBroadcast(e)) ? (d = !0, c = e) : o.error("MsgKey case error: " + [e, t, r, Store.Conn.me].join())(), this.fromMe = d, this.remote = c, this.id = r; | |
| var u = [this.fromMe, this.remote, this.id]; | |
| "undefined" != typeof s && (this.self = s, u.push(this.self)), a.gte([0, 5]) && a.supportsFeature(a.F.KEY_PARTICIPANT) && "undefined" != typeof n && (this.participant = n, u.push(this.participant)), this._serialized = u.join("_") | |
| } | |
| var o = r(1), | |
| i = r(19), | |
| a = r(71); | |
| n.prototype = { | |
| toString: function() { | |
| return this._serialized | |
| }, | |
| clone: function() { | |
| return new n(this._from, this._to, this._id, this._participant, this._selfDir) | |
| } | |
| }, e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e, t, r, n, o) { | |
| var i = new XMLHttpRequest, | |
| a = new Promise(function(a, s) { | |
| i.onload = function(e) { | |
| 4 === i.readyState ? a(i) : s(e) | |
| }, i.onerror = s, i.ontimeout = s, i.onprogress = o, i.onabort = s, r instanceof FormData ? (i.open(t || u.POST, e, !0), n && (i.responseType = n), i.send(r)) : r instanceof Object ? (e = d.build(e, r), i.open(t || u.GET, e, !0), n && (i.responseType = n), i.send()) : (i.open(t || u.GET, e, !0), n && (i.responseType = n), i.send()) | |
| }); | |
| return a.cancellable()["catch"](Promise.CancellationError, function(e) { | |
| return i.abort(), Promise.reject(e) | |
| }) | |
| } | |
| function o(e, t) { | |
| return n(e, u.GET, null, t) | |
| } | |
| function i(e, t) { | |
| return n(e, u.POST, t) | |
| } | |
| function a(e) { | |
| return n(e, u.HEAD) | |
| } | |
| function s(e) { | |
| return window.jsonp || (window.jsonp = {}), new Promise(function(t, r) { | |
| var n = _.uniqueId("jsonp_"); | |
| e += "&JsonType=callback&JsonCallback=" + n; | |
| var o = document.createElement("script"); | |
| o.type = "text/javascript", o.src = e, o.onerror = function(e) { | |
| delete window.jsonp[n], document.head.removeChild(o), r(e) | |
| }, window.jsonp[n] = function(e) { | |
| delete window.jsonp[n], document.head.removeChild(o), t(e) | |
| }, document.head.appendChild(o) | |
| }) | |
| } | |
| var d = r(51), | |
| c = r(1), | |
| u = { | |
| GET: "GET", | |
| POST: "POST", | |
| HEAD: "HEAD", | |
| PUT: "PUT" | |
| }, | |
| l = { | |
| BLOB: "blob", | |
| ARRAY_BUFFER: "arraybuffer" | |
| }; | |
| e.exports = { | |
| head: a, | |
| get: o, | |
| post: i, | |
| request: n, | |
| jsonp: s, | |
| VERB: u, | |
| RESP_TYPE: l | |
| }, c.exportToWindow("XHR", e.exports) | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| this.Type = u, this.Mode = l, this.pendingUpdate = void 0, this.pendingHardRefreshTimer = void 0, this.mode = l.IDLE, this.version = i.VERSION_BASE | |
| } | |
| var o = r(140), | |
| i = r(6), | |
| a = r(1), | |
| s = r(42), | |
| d = r(75), | |
| c = r(99), | |
| u = { | |
| SILENT: "silent", | |
| SOFT: "soft", | |
| HARD: "hard" | |
| }, | |
| l = { | |
| IDLE: "idle", | |
| REFRESHING: "refreshing", | |
| PENDING_REFRESH: "pending_refresh" | |
| }; | |
| n.prototype.update = function(e, t) { | |
| var n = this; | |
| a.log("AppUpdate:update: " + e + " current: " + this.version + " latest: " + t)(); | |
| var i = void 0; | |
| if (_.isNumber(e)) i = u.HARD; | |
| else if (e) i = u.SOFT; | |
| else { | |
| if (this.version === t) return; | |
| i = u.SILENT | |
| } | |
| var s = i === u.HARD ? Date.now() + e : void 0; | |
| return this.clearHardRefresh(), i === u.HARD && this.setMode(l.REFRESHING), this._update(t).then(function(e) { | |
| var t = r(14); | |
| i !== u.SILENT && (Store.Stream.needsUpdate = e), i === u.HARD && (n.setMode(l.PENDING_REFRESH), n.pendingHardRefreshTimer = o.setTimeout(function() { | |
| t.hardRefresh(!0), n.clearHardRefresh() | |
| }, s), n.listenTo(Store.Stream, "change:couldForce", function() { | |
| t.hardRefresh(!0), n.clearHardRefresh() | |
| })) | |
| }) | |
| }, n.prototype.setMode = function(e) { | |
| this.mode = e, this.trigger("change:mode", e) | |
| }, n.prototype._update = function(e) { | |
| if (this.version !== e) { | |
| if (c && navigator.serviceWorker.controller) return this._swUpdate(e); | |
| if (window.applicationCache && window.applicationCache.status !== window.applicationCache.UNCACHED) return this._appcacheUpdate(e) | |
| } | |
| return Promise.resolve(this.version !== e) | |
| }, n.prototype.killServiceWorker = function() { | |
| return c && navigator.serviceWorker.controller ? (a.info("Killing service worker")(), navigator.serviceWorker.ready.then(function(e) { | |
| return e.unregister() | |
| }).then(function(e) { | |
| return a.log("Service worker unregistration status: " + e)(), e | |
| })) : Promise.resolve() | |
| }, n.prototype._swUpdate = function(e) { | |
| return navigator.serviceWorker.ready.then(function(t) { | |
| return new Promise(function(r, n) { | |
| function o(t) { | |
| s(), a.error("Unable to update service worker to version " + e + ". Error: " + t)() | |
| } | |
| function i(e) { | |
| s(), r(!0) | |
| } | |
| function s() { | |
| navigator.serviceWorker.removeEventListener("error", o), navigator.serviceWorker.removeEventListener("controllerchange", i) | |
| } | |
| navigator.serviceWorker.addEventListener("error", o), navigator.serviceWorker.addEventListener("controllerchange", i), t.update().then(function() { | |
| t.installing || r(!0) | |
| })["catch"](function(e) { | |
| o(e), r(!1) | |
| }) | |
| }) | |
| })["catch"](function(e) { | |
| return a.error("Unable to update serviceworker, error: " + e)(), !1 | |
| }) | |
| }; | |
| var f = r(25), | |
| h = r(18), | |
| p = r(74); | |
| n.prototype._appcacheUpdate = function(e) { | |
| return this.pendingUpdate || this.fetch(e).then(function() { | |
| return window.applicationCache.status === window.applicationCache.UPDATEREADY ? (a.info("Updater:handleUpdate:ApplicationCacheSuccess")(), !0) : (a.log("Updater:handleUpdate:ApplicationNoUpdate")(), !1) | |
| })["catch"](function(e) { | |
| return a.error("Updater:handleUpdate:ApplicationCacheError " + e)(e), r(9).upload("appcache-error"), !1 | |
| }) | |
| }, n.prototype.fetch = function(e) { | |
| var t = this; | |
| return this.pendingUpdate = f.loopOnError(h.ShouldLoop, function(r) { | |
| return Promise.delay(1e3 * p.expBackoff(r, 120, 1, .1)).then(function() { | |
| return new Promise(function(r, n) { | |
| function o() { | |
| window.applicationCache.removeEventListener("updateready", a), window.applicationCache.removeEventListener("error", s), window.applicationCache.removeEventListener("noupdate", i) | |
| } | |
| function i() { | |
| o(), d.version = e, r() | |
| } | |
| function a() { | |
| o(), d.version = e, r() | |
| } | |
| function s(e) { | |
| o(), n(new h.ShouldLoop("AppCache Error. Retrying...")) | |
| } | |
| var d = t; | |
| window.applicationCache.addEventListener("updateready", a), window.applicationCache.addEventListener("error", s), window.applicationCache.addEventListener("noupdate", i), window.applicationCache.status !== window.applicationCache.IDLE && window.applicationCache.status !== window.applicationCache.UPDATEREADY || window.applicationCache.update() | |
| }) | |
| }) | |
| })["finally"](function() { | |
| t.pendingUpdate = void 0 | |
| }) | |
| }, n.prototype.clearHardRefresh = function() { | |
| this.setMode(l.IDLE), this.pendingHardRefreshTimer && (o.clearTimeout(this.pendingHardRefreshTimer), this.pendingHardRefreshTimer = void 0), this.stopListening(Store.Stream, "change:couldForce") | |
| }, n.prototype.restart = function() { | |
| var e = r(14); | |
| e.hardRefresh(void 0, !1) | |
| }, e.exports = new n, _.extend(e.exports, s, d) | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e, t) { | |
| var r = -1, | |
| n = _.find(e, function(e) { | |
| return r++, t(e) | |
| }); | |
| return void 0 === n ? void 0 : { | |
| index: r, | |
| value: n | |
| } | |
| } | |
| function o(e) { | |
| var t, r; | |
| try { | |
| t = new S(e) | |
| } catch (n) { | |
| return s.error("WatchedSocket error constructing: " + n)(n), m.reject(n) | |
| } | |
| return new m(t, function(e, t) { | |
| this.id = S.numSocketsAttempted++, s.log("WatchedSocket opening socket " + this.id)(), r = new f.WebcWsOpen; | |
| var n = new WebSocket(this.url); | |
| n.binaryType = "arraybuffer", n.onopen = e, n.onclose = n.onerror = function(e) { | |
| t(new l.SocketError(e)) | |
| }, this.socket = n | |
| }).cancellable()["catch"](function(e) { | |
| if (s.error("WatchedSocket error on open of " + this.id + ": " + e, e)(), this.socket) { | |
| var t = this.socket; | |
| switch (t.readyState) { | |
| case WebSocket.OPENING: | |
| t.onopen = null; | |
| case WebSocket.OPEN: | |
| t.onerror = null, t.onclose = null, t.close(); | |
| break; | |
| case WebSocket.CLOSING: | |
| case WebSocket.CLOSED: | |
| t.onerror = null, t.onclose = null | |
| } | |
| } | |
| throw e | |
| }).then(function(e) { | |
| s.log("WatchedSocket opened socket " + this.id)(), r.markWebcWsOpenT(), r.commit(); | |
| var t = this.socket; | |
| return t.onmessage = this._onMessage.bind(this, !0), t.onerror = this._onCloseOrError.bind(this, !0), t.onclose = this._onCloseOrError.bind(this, !1), this._offlineListener = u.waitForOfflineNaive().then(this.close.bind(this, !1, "offline"))["catch"](Promise.CancellationError, _.noop), this._pingTimer.after(i()), this.state = E.OPEN, this | |
| }) | |
| } | |
| function i() { | |
| return Math.random() * (y - v) + v | |
| } | |
| function a() { | |
| return Math.random() * (w - b) + b | |
| } | |
| var s = r(1), | |
| d = r(9), | |
| c = r(43), | |
| u = r(25), | |
| l = r(18), | |
| f = r(41), | |
| h = r(151), | |
| p = r(54), | |
| m = r(34), | |
| g = 2e4, | |
| v = 1e4, | |
| y = 3e4, | |
| b = 2e4, | |
| w = 9e4, | |
| E = { | |
| OPEN: "open", | |
| CLOSED: "closed" | |
| }, | |
| S = c.extend({ | |
| extraProperties: "reject", | |
| session: { | |
| id: "number", | |
| url: { | |
| type: "string", | |
| required: !0, | |
| allowNull: !1 | |
| }, | |
| onmessage: "function", | |
| onactivity: "function", | |
| timeSkew: "number", | |
| msgParser: "function", | |
| state: { | |
| type: "string", | |
| values: [E.OPEN, E.CLOSED] | |
| }, | |
| error: "any", | |
| socket: "object", | |
| isQueueing: { | |
| type: "boolean", | |
| "default": !0 | |
| }, | |
| maxQueueSize: "number", | |
| messageQueue: "array", | |
| _offlineListener: "object", | |
| _msgListeners: "array", | |
| _pingTimer: "object", | |
| _killTimer: "object" | |
| }, | |
| initialize: function() { | |
| this._msgListeners = [], this.messageQueue = [], this._pingTimer = new p(this, this._ping), this._killTimer = new p(this, this._killSocket) | |
| }, | |
| _ping: function() { | |
| this.send("?,,"), this._killTimer.after(a()) | |
| }, | |
| _killSocket: function() { | |
| s.warn("WatchedSocket " + this.id + " Timeout!")(), this.close(!0, "stale") | |
| }, | |
| detachCallbacks: function() { | |
| this.set({ | |
| onactivity: void 0, | |
| onmessage: void 0 | |
| }) | |
| }, | |
| send: function(e) { | |
| if ("open" !== this.state) throw new l.SocketNotOpen(this.state); | |
| try { | |
| this.socket.send(e) | |
| } catch (t) { | |
| s.error("exception sending: " + t)(t), s.error("" + t.stack)(), d.upload("send-exception"), this.close(!0, t) | |
| } | |
| }, | |
| cast: function(e) { | |
| this.send(e) | |
| }, | |
| partingSend: function(e, t, r) { | |
| var n = this, | |
| o = this.socket; | |
| return new Promise(function(i) { | |
| function a() { | |
| i(void 0) | |
| } | |
| o.onclose = a, o.onerror = a, o.onmessage = function(e) { | |
| var t = e.data; | |
| r && !r(t) || i(t) | |
| }, n.send(t), n._onCloseOrError(!1, e) | |
| }).timeout(g, "paringSendTimeout")["catch"](_.noop)["finally"](function() { | |
| o.onclose = void 0, o.onerror = void 0, o.onmessage = void 0, o.readyState === WebSocket.OPEN && o.close() | |
| }) | |
| }, | |
| close: function(e, t) { | |
| var r, n = this.socket; | |
| if (this._onCloseOrError(!!e, t || "unspecified"), n && (r = n.readyState, r === WebSocket.OPENING || r === WebSocket.OPEN)) try { | |
| n.close() | |
| } catch (o) { | |
| s.error("WatchedSocket:exception closing: " + o)(o), s.error("" + o.stack)() | |
| } | |
| }, | |
| _onMessage: function(e, t) { | |
| if (e) { | |
| this._pingTimer.after(i()), this._killTimer.cancel(); | |
| var r = t.data; | |
| if ("string" == typeof r && "!" === r.charAt(0)) { | |
| var o = parseInt(t.data.slice(1), 10); | |
| return o === o && (this.timeSkew = Date.now() - o), void(this.onactivity && this.onactivity()) | |
| } | |
| this.msgParser && (t = this.msgParser(t)), this.onactivity && this.onactivity(t) | |
| } | |
| var a = n(this._msgListeners, function(e) { | |
| return !e.filter || e.filter(t) | |
| }); | |
| a ? (this._msgListeners.splice(a.index, 1), a.value.removed = !0, a.value.promise.force(t)) : this.isQueueing ? (s.warn("watchedSocket:enqueued", t)(), this.messageQueue.push(t), void 0 !== this.maxQueueSize && this.messageQueue.length > this.maxQueueSize && this.close(!0, "Queue Overflow")) : this.onmessage ? this.onmessage(t) : s.error("watchedSocket:dropped!", t)() | |
| }, | |
| _onCloseOrError: function(e, t) { | |
| if ("closed" !== this.state) { | |
| this.socket && (this.socket.onclose = void 0, this.socket.onerror = void 0, this.socket.onmessage = void 0), this._offlineListener && this._offlineListener.cancel(), s.warn("Socket " + this.id + " closing: " + t)(), this._pingTimer.cancel(), this._killTimer.cancel(), this.set({ | |
| state: "closed", | |
| error: e ? t : void 0 | |
| }); | |
| var r = this._msgListeners, | |
| n = e ? new l.SocketError(t) : new l.SocketClosed(t); | |
| this._msgListeners = [], _.forEach(r, function(e) { | |
| e.removed = !0, e.promise.cancel(n) | |
| }) | |
| } | |
| }, | |
| holdMessages: function(e) { | |
| var t = this.isQueueing && void 0 !== e && this.messageQueue > e; | |
| this.set({ | |
| isQueueing: !0, | |
| messageQueue: this.messageQueue || [], | |
| maxQueueSize: e | |
| }), t && this.close(!0, "Queue Overflow") | |
| }, | |
| releaseMessages: function(e) { | |
| if (!this.isQueueing) return void s.error("WatchedSocket:releaseMessages not queued!")(); | |
| var t = this.messageQueue; | |
| this.set({ | |
| isQueueing: !1, | |
| messageQueue: void 0 | |
| }), e ? t.length > 0 && s.error("WatchedSocket:releaseMessages dropping " + t.length + " messages.")() : _.forEach(t, function(e) { | |
| this._onMessage(!1, e) | |
| }, this) | |
| }, | |
| nextMessage: function(e) { | |
| if ("open" !== this.state && "opening" !== this.state) return m.reject(new l.SocketNotOpen(this.state)).cancellable(); | |
| if (e instanceof h && (e = e.test.bind(e)), this.isQueueing) { | |
| var t; | |
| if (e) { | |
| var r = n(this.messageQueue, e); | |
| r && (t = r.value, this.messageQueue.splice(r.index, 1)) | |
| } else this.messageQueue.length > 0 && (t = this.messageQueue.shift()); | |
| if (t) return m.resolve(t).cancellable() | |
| } | |
| var o = (new m).cancellable().forceable(), | |
| i = { | |
| removed: !1, | |
| filter: e, | |
| promise: o | |
| }; | |
| return this._msgListeners.push(i), o.bind(this)["catch"](function() { | |
| i.removed || (this._msgListeners = _.without(this._msgListeners, i)) | |
| }), o | |
| } | |
| }); | |
| S.STATE = E, S.open = o, S.numSocketsAttempted = 0, e.exports = S | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(43), | |
| o = r(6), | |
| i = r(1), | |
| a = r(25), | |
| s = n.extend({ | |
| session: { | |
| online: { | |
| type: "boolean", | |
| "default": !0 | |
| }, | |
| _onlineCheck: "object", | |
| waitForOnline: "object", | |
| _waitForOnlinePromiseResolver: "function" | |
| }, | |
| initialize: function() { | |
| this.listenTo(this, "change:online", function() { | |
| var e = this, | |
| t = this.online; | |
| if (i.log("NetworkStatus " + (t ? "online" : "offline"))(), t) { | |
| this.waitForOnline = Promise.resolve(); | |
| var r = this._waitForOnlinePromiseResolver; | |
| r && (this._waitForOnlinePromiseResolver = void 0, r()) | |
| } else this._waitForOnlinePromiseResolver || (this.waitForOnline = new Promise(function(t) { | |
| e._waitForOnlinePromiseResolver = t | |
| })) | |
| }) | |
| }, | |
| checkOnline: function() { | |
| return this._onlineCheck && this._onlineCheck.isPending() ? this._onlineCheck : (i.log("NetworkStatus:checkOnline checking")(), this._onlineCheck = a.getResponseIfOnline(o.STATUS_URL).bind(this).then(function(e) { | |
| var t = !!e; | |
| i.log("NetworkStatus:checkOnline response " + t)(), this.online = t, this._onlineCheck = null | |
| })["catch"](function(e) { | |
| i.error("NetworkStatus:checkOnline errored! " + e)(e), this._onlineCheck = null | |
| }), this._onlineCheck) | |
| } | |
| }); | |
| e.exports = new s | |
| }, , function(e, t) { | |
| e.exports = function(e) { | |
| if ("function" != typeof e) throw TypeError(e + " is not a function!"); | |
| return e | |
| } | |
| }, function(e, t, r) { | |
| e.exports = !r(391)(function() { | |
| return 7 != Object.defineProperty({}, "a", { | |
| get: function() { | |
| return 7 | |
| } | |
| }).a | |
| }) | |
| }, function(e, t, r) { | |
| var n = r(35), | |
| o = r(166); | |
| e.exports = r(101) ? function(e, t, r) { | |
| return n.setDesc(e, t, o(1, r)) | |
| } : function(e, t, r) { | |
| return e[t] = r, e | |
| } | |
| }, function(e, t, r) { | |
| var n = r(35).setDesc, | |
| o = r(163), | |
| i = r(23)("toStringTag"); | |
| e.exports = function(e, t, r) { | |
| e && !o(e = r ? e : e.prototype, i) && n(e, i, { | |
| configurable: !0, | |
| value: t | |
| }) | |
| } | |
| }, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , function(e, t) { | |
| "use strict"; | |
| function r(e) { | |
| _ = e | |
| } | |
| function n(e) { | |
| v = e, y = Math.round(e / 1e3) | |
| } | |
| function o(e) { | |
| return void 0 !== e ? e + y : Math.floor(Date.now() / 1e3) | |
| } | |
| function i(e) { | |
| return void 0 !== e ? e - y : Math.floor((Date.now() - v) / 1e3) | |
| } | |
| function a(e) { | |
| return moment.unix(e).format(_ ? "HH:mm" : "LT") | |
| } | |
| function s(e) { | |
| return moment.unix(e).format("l") | |
| } | |
| function d(e, t) { | |
| var r = moment().startOf("day"), | |
| n = moment.unix(e).startOf("day"), | |
| o = r.diff(n, "days"), | |
| i = t && a(e); | |
| if (0 === o) return t ? l10n.t("web_today_at", { | |
| time: i | |
| }) : l10n.t("web_today"); | |
| if (1 === o) return t ? l10n.t("web_yesterday_at", { | |
| time: i | |
| }) : l10n.t("web_yesterday"); | |
| if (!t && 6 > o) return moment.unix(e).format("dddd"); | |
| var d = s(e); | |
| return t ? l10n.t("web_time_at", { | |
| date: d, | |
| time: i | |
| }) : d | |
| } | |
| function c(e) { | |
| var t = e + y; | |
| return t >= moment().startOf("day").unix() ? a(t) : d(t, !1) | |
| } | |
| function u(e) { | |
| return d(e + y, !1) | |
| } | |
| function l(e) { | |
| return d(e + y, !0) | |
| } | |
| function f(e) { | |
| return moment.unix(e + y).format(_ ? "HH:mm, l" : "LT, l") | |
| } | |
| function h(e) { | |
| return a(e + y) | |
| } | |
| function p(e) { | |
| var t = e + y, | |
| r = a(t), | |
| n = moment.unix(t).startOf("day"), | |
| o = moment().startOf("day").diff(n, "days"); | |
| if (0 === o) return l10n.t("web_conversation_last_seen_today", { | |
| time: r | |
| }); | |
| if (1 === o) return l10n.t("web_conversation_last_seen_yesterday", { | |
| time: r | |
| }); | |
| if (6 > o) { | |
| var i = d(t, !1); | |
| return l10n.t("web_conversation_last_seen_weekday", { | |
| date: i, | |
| time: r | |
| }) | |
| } | |
| var s = d(t, !1); | |
| return l10n.t("web_conversation_last_seen_date", { | |
| date: s, | |
| time: r | |
| }) | |
| } | |
| function m(e) { | |
| var t = moment.utc(1e3 * e); | |
| return t.isValid() ? t.format("m:ss") : "" | |
| } | |
| function g(e) { | |
| var t = e.startOfDaySkew; | |
| return void 0 !== t && t > y - 30 && y + 30 > t ? e.startOfDay : (e.startOfDaySkew = y, e.startOfDay = moment.unix(e.t + y).startOf("day").unix()) | |
| } | |
| var _ = !1, | |
| v = 0, | |
| y = 0; | |
| e.exports = { | |
| setIs24Hour: r, | |
| setSkew: n, | |
| localUnixTime: o, | |
| globalUnixTime: i, | |
| relativeStr: c, | |
| relativeDateStr: u, | |
| relativeDateAndTimeStr: l, | |
| timeStr: f, | |
| timestampStr: h, | |
| lastSeenStr: p, | |
| durationStr: m, | |
| dayOfMsg: g | |
| } | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| getInitialState: function() { | |
| return this._timer_mixin_timers = {}, this._timer_mixin_seq = 0, {} | |
| }, | |
| componentWillUnmount: function() { | |
| var e = this._timer_mixin_timers; | |
| e && _.values(e).forEach(function(e) { | |
| e() | |
| }) | |
| }, | |
| safeIsMounted: function() { | |
| return this.isMounted() && "UNMOUNTING" !== this._compositeLifeCycleState | |
| }, | |
| safeInterval: function(e, t) { | |
| e = e.bind === Object.getPrototypeOf(e).bind ? e.bind(this) : e; | |
| var r = setInterval(e, t); | |
| return this._regTimer(clearInterval.bind(void 0, r)) | |
| }, | |
| safeDelay: function() { | |
| var e, t = _.toArray(arguments), | |
| r = t.shift(), | |
| n = t.shift(), | |
| o = _.delay(function(n) { | |
| delete n._timer_mixin_timers[e], r.apply(n, t) | |
| }, n, this); | |
| return e = this._regTimer(clearTimeout.bind(void 0, o)) | |
| }, | |
| safeDefer: function() { | |
| var e, t = _.toArray(arguments), | |
| r = t.shift(), | |
| n = _.defer(function(n) { | |
| delete n._timer_mixin_timers[e], r.apply(n, t) | |
| }, this); | |
| return e = this._regTimer(clearTimeout.bind(void 0, n)) | |
| }, | |
| safeDebounce: function(e, t, r) { | |
| var n, o = this, | |
| i = this._timer_mixin_timers, | |
| a = function() { | |
| delete i[n], e() | |
| }, | |
| s = _.debounce(a, t, r); | |
| return function() { | |
| n && delete i[n], s(), n = o._regTimer(s.cancel) | |
| } | |
| }, | |
| clearSafeTimeout: function(e) { | |
| var t = this._timer_mixin_timers[e]; | |
| t && t() | |
| }, | |
| clearSafeInterval: function(e) { | |
| return this.clearSafeTimeout(e) | |
| }, | |
| _regTimer: function(e) { | |
| var t = this._timer_mixin_timers, | |
| r = ++this._timer_mixin_seq; | |
| return t[r] = function() { | |
| delete t[r], e() | |
| }, r | |
| } | |
| }; | |
| e.exports = r | |
| }, , function(e, t, r) { | |
| "use strict"; | |
| function n(e, t) { | |
| var r = {}; | |
| for (var n in e) t.indexOf(n) >= 0 || Object.prototype.hasOwnProperty.call(e, n) && (r[n] = e[n]); | |
| return r | |
| } | |
| var o = Object.assign || function(e) { | |
| for (var t = 1; t < arguments.length; t++) { | |
| var r = arguments[t]; | |
| for (var n in r) Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]) | |
| } | |
| return e | |
| }, | |
| i = r(5), | |
| a = r(39), | |
| s = 20, | |
| d = i.createClass({ | |
| displayName: "Spinner", | |
| propTypes: { | |
| size: i.PropTypes.number.isRequired, | |
| stroke: i.PropTypes.number.isRequired | |
| }, | |
| getDefaultProps: function() { | |
| return { | |
| size: 65, | |
| stroke: 4 | |
| } | |
| }, | |
| shouldComponentUpdate: function(e, t) { | |
| return !1 | |
| }, | |
| render: function() { | |
| var e = this.props, | |
| t = e.size, | |
| r = e.stroke, | |
| d = e.className, | |
| c = n(e, ["size", "stroke", "className"]), | |
| u = { | |
| width: t, | |
| height: t | |
| }, | |
| l = 2 * s + r, | |
| f = "0 0 " + l + " " + l; | |
| return i.createElement("svg", o({ | |
| className: a("spinner-container", d), | |
| style: u, | |
| viewBox: f | |
| }, c), i.createElement("circle", { | |
| className: "path", | |
| cx: l / 2, | |
| cy: l / 2, | |
| r: s, | |
| fill: "none", | |
| strokeWidth: r | |
| })) | |
| } | |
| }); | |
| e.exports = d | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(1), | |
| i = r(19), | |
| a = r(145), | |
| s = r(52), | |
| d = r(30), | |
| c = r(333), | |
| u = r(335), | |
| l = r(8), | |
| f = r(71), | |
| h = r(18), | |
| p = r(73).ActionToast, | |
| m = r(73).ActionType, | |
| g = { | |
| ptt: 0, | |
| audio: 0, | |
| image: 1, | |
| location: 2, | |
| url: 3, | |
| video: 4, | |
| document: 5 | |
| }, | |
| v = { | |
| NONE: 0, | |
| ALLOW: 1, | |
| DISABLE: 2, | |
| UPGRADE: 3, | |
| FORWARD: 4 | |
| }, | |
| y = s.extend({ | |
| Collection: "Contact", | |
| props: { | |
| id: "string", | |
| name: "string", | |
| shortName: "string", | |
| type: { | |
| type: "string", | |
| values: ["in", "out"], | |
| "default": "in" | |
| }, | |
| plaintextDisabled: "boolean" | |
| }, | |
| session: { | |
| pendingAction: "number", | |
| checked: "boolean", | |
| notifyName: { | |
| type: "any", | |
| "default": null | |
| }, | |
| _capabilities: "object", | |
| _capabilitiesPromise: "object" | |
| }, | |
| derived: { | |
| userid: { | |
| fn: function() { | |
| return this.isUser ? i.user(this.id) : null | |
| } | |
| }, | |
| searchName: { | |
| deps: ["name"], | |
| fn: function() { | |
| return this.name ? l10n.accentFold(this.name) : null | |
| } | |
| }, | |
| header: { | |
| deps: ["name"], | |
| fn: function() { | |
| if (this.name) { | |
| var e = this.name.charAt(0).toLowerCase(); | |
| if (a.alpha.test(e)) { | |
| var t = l10n.removeAccents(e); | |
| return y.Collator.compare(t, e) ? e : t | |
| } | |
| return "#" | |
| } | |
| } | |
| }, | |
| isMe: { | |
| fn: function() { | |
| return Store.Conn.me === this.id | |
| } | |
| }, | |
| isUser: { | |
| fn: function() { | |
| return i.isUser(this.id) | |
| } | |
| }, | |
| isGroup: { | |
| fn: function() { | |
| return i.isGroup(this.id) | |
| } | |
| }, | |
| isBroadcast: { | |
| fn: function() { | |
| return i.isBroadcast(this.id) | |
| } | |
| }, | |
| formattedShortNameWithNonBreakingSpaces: { | |
| deps: ["shortName", "formattedName", "id"], | |
| fn: function() { | |
| return this.id ? this.isMe ? l10n.t("web_you") : this.shortName || this.formattedName.replace(/\s/g, " ") : void 0 | |
| } | |
| }, | |
| formattedShortName: { | |
| deps: ["shortName", "formattedName", "id"], | |
| fn: function() { | |
| return this.id ? this.isMe ? l10n.t("web_you") : this.shortName || this.formattedName : void 0 | |
| } | |
| }, | |
| formattedName: { | |
| deps: ["name", "id"], | |
| fn: function() { | |
| if (this.id) { | |
| if (this.isMe) return l10n.t("web_you"); | |
| var e; | |
| return this.name || (e = l10n.isRTL() ? l10n.embedLTR(i.formattedUser(this.id)) : i.formattedUser(this.id)), this.name || e | |
| } | |
| } | |
| }, | |
| formattedUser: { | |
| deps: ["name", "id"], | |
| fn: function() { | |
| return this.id ? this.name ? this.name : l10n.isRTL() ? l10n.embedLTR(i.formattedUser(this.id)) : i.formattedUser(this.id) : void 0 | |
| } | |
| }, | |
| isWAContact: { | |
| deps: ["type"], | |
| fn: function() { | |
| return this.isUser && "in" === this.type; | |
| } | |
| }, | |
| isMyContact: { | |
| deps: ["name"], | |
| fn: function() { | |
| return !!(this.isUser && this.name && this.name.length) | |
| } | |
| }, | |
| capabilities: { | |
| cache: !1, | |
| fn: function() { | |
| var e = this; | |
| return _.isObject(this._capabilities) ? Promise.resolve(this._capabilities) : this._capabilitiesPromise ? this._capabilitiesPromise : this.isUser ? this._capabilitiesPromise = d.getCapabilities([this.id]).then(function(t) { | |
| if (200 === t.status) { | |
| var r = e._capabilities = t[e.id]; | |
| return r ? (r.jid = e.id, r) : Promise.reject(new h.CapabilityUnknown(e.id)) | |
| } | |
| return Promise.reject(new h.CapabilityUnknown(e.id + " status:" + t.status)) | |
| })["finally"](function() { | |
| return e._capabilitiesPromise = void 0 | |
| }) : this.isGroup || this.isBroadcast ? this._capabilitiesPromise = Store.GroupMetadata.find(this.id).then(function(e) { | |
| return e.participants.map(function(e) { | |
| return e.id | |
| }) | |
| }).then(function(t) { | |
| return t.filter(i.isUser).length === t.length ? Promise.all(t.map(function(e) { | |
| return Store.Contact.get(e).capabilities | |
| })).then(function(t) { | |
| return e._capabilities = t | |
| }) : Promise.reject(new h.CapabilityInvalid("assertion fail: not all users: " + e.id)) | |
| })["finally"](function() { | |
| return e._capabilitiesPromise = void 0 | |
| }) : Promise.reject(new h.CapabilityInvalid("unknown contact type: " + this.id)) | |
| } | |
| } | |
| }, | |
| children: { | |
| status: c, | |
| profilePicThumb: u | |
| }, | |
| initialize: function() { | |
| this.id && (this.status = Store.Status.gadd(this.id), this.listenTo(this.status, "all", this._getEventBubblingHandler("status")), this.listenTo(l, "locale_change", function() { | |
| this.trigger("change:name", this, this.name) | |
| }), this.profilePicThumb = Store.ProfilePicThumb.gadd(this.id), this.listenTo(this.profilePicThumb, "all", this._getEventBubblingHandler("profilePicThumb")), this.pendingAction = 0, this.listenTo(this, "change:pendingAction", this.onPendingActionUpdate)) | |
| }, | |
| onPendingActionUpdate: function() { | |
| this.pendingAction < 0 && (o.log("contact:onPendingActionUpdate pendingAction value is invalid")(), this.pendingAction = 0) | |
| }, | |
| canBlock: function() { | |
| return f.supportsFeature(f.F.SET_BLOCK) | |
| }, | |
| setBlock: function(e, t) { | |
| var r = this; | |
| if (e && Store.Blocklist.get(this.id)) return Promise.resolve(); | |
| if (!e && !Store.Blocklist.get(this.id)) return Promise.resolve(); | |
| var i = d.sendSetBlock(e, [{ | |
| jid: this.id | |
| }]), | |
| a = new m(e ? l10n.t("action_blocking", { | |
| participant: this.formattedName | |
| }) : l10n.t("action_unblocking", { | |
| participant: this.formattedName | |
| })); | |
| t = t || p.genId(); | |
| var s = i.bind(this)["catch"](function(n) { | |
| o.error("models:contact:setBlock dropped")(n); | |
| var i = new m(e ? l10n.t("action_block_failed", { | |
| participant: r.formattedName | |
| }) : l10n.t("action_unblock_failed", { | |
| participant: r.formattedName | |
| }), l10n.t("action_try_again"), r.setBlock.bind(r, e, t)); | |
| return Promise.reject(i) | |
| }).then(function(n) { | |
| if (200 === n.status) { | |
| var o = e ? l10n.t("action_blocked", { | |
| participant: r.formattedName | |
| }) : l10n.t("action_unblocked", { | |
| participant: r.formattedName | |
| }); | |
| return new m(o, l10n.t("action_undo"), r.setBlock.bind(r, !e, t)) | |
| } | |
| if (n.status >= 400) { | |
| var i = new m(e ? l10n.t("action_block_failed", { | |
| participant: r.formattedName | |
| }) : l10n.t("action_unblock_failed", { | |
| participant: r.formattedName | |
| })); | |
| return Promise.reject(i) | |
| } | |
| }); | |
| return l.openToast(n.createElement(p, { | |
| id: t, | |
| initialAction: a, | |
| pendingAction: s | |
| })), i.bind(this).then(function(t) { | |
| 200 !== t.status || t._duplicate || (e ? Store.Blocklist.add({ | |
| id: r.id | |
| }) : Store.Blocklist.remove(r.id)) | |
| }) | |
| }, | |
| isBlocked: function() { | |
| return !!Store.Blocklist.get(this.id) | |
| }, | |
| findCommonGroups: function() { | |
| var e = this.id; | |
| return new Promise(function(t, r) { | |
| d.commonGroupsFind(e).then(function(e) { | |
| if (200 === e.status) { | |
| var n = e.groups.map(function(e) { | |
| return Store.Chat.get(e) | |
| }); | |
| t(n) | |
| } else o.error("models:Contact:findCommonGroups error: " + e.status)(), r(new Error("models:Contact:findCommonGroups error: " + e.status)) | |
| }) | |
| }) | |
| }, | |
| searchMatch: function(e) { | |
| return this.searchName ? this.searchName.indexOf(e) > -1 : e && this.userid ? this.userid.indexOf(e) > -1 : !1 | |
| }, | |
| canSendEncryptedMedia: function(e, t) { | |
| var r = this, | |
| n = g[e]; | |
| return "undefined" != typeof n ? this.capabilities.then(function(e) { | |
| return _.flatten([e]) | |
| }).then(function(o) { | |
| return o.length > 0 ? o.reduce(function(e, t) { | |
| return e && t[n] === v.ALLOW | |
| }, !0) || Promise.reject(new h.CapabilityUnsupported(r.id + " " + e, t ? _.zipObject(o.filter(function(e) { | |
| return e[n] !== v.ALLOW | |
| }).map(function(e) { | |
| return [e.jid, e[n]] | |
| })) : void 0)) : Promise.reject(new h.CapabilityUnknown("no caps")) | |
| }) : Promise.reject(new h.CapabilityInvalid(e)) | |
| } | |
| }); | |
| y.setCollator = function(e) { | |
| y.Collator = window.Intl ? window.Intl.Collator([e], { | |
| sensitivity: "base" | |
| }) : { | |
| compare: function(e, t) { | |
| return e.localeCompare(t) | |
| } | |
| } | |
| }, y.Comparator = function(e, t) { | |
| var r = e.id, | |
| n = t.id; | |
| if (r === Store.Conn.me) return 1; | |
| if (n === Store.Conn.me) return -1; | |
| var o = e.name, | |
| i = t.name; | |
| if (!o && i) return 1; | |
| if (o && !i) return -1; | |
| if (o && i) { | |
| var a = y.Collator.compare(e.header, t.header); | |
| return 0 === a ? y.Collator.compare(o, i) : a | |
| } | |
| return r && n ? r.localeCompare(n) : -1 | |
| }, e.exports = y | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(70), | |
| o = { | |
| uimPush: function(e, t, r) { | |
| n.push(e, t, r), this._uim = this._uim || [], this._uim.push({ | |
| component: e, | |
| type: t | |
| }) | |
| }, | |
| uimPop: function(e) { | |
| n.pop(e), this._uim && (this._uim = _.reject(this._uim, { | |
| type: e | |
| })) | |
| }, | |
| componentWillUnmount: function() { | |
| if (this._uim) | |
| for (var e; e = this._uim.shift();) n.pop(e.type), n.popDependents(e.component) | |
| } | |
| }; | |
| e.exports = o | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| this._alarms = {}, this._initialize(e) | |
| } | |
| var o = r(1), | |
| i = 1e4, | |
| a = 3e3, | |
| s = Math.pow(2, 31) - 1, | |
| d = r(8); | |
| n.prototype._initialize = function(e) { | |
| var t, r, n, i = this; | |
| t = window.performance.now(), window.setInterval(function() { | |
| r = window.performance.now(), n = Math.abs(r - t - e), n > a && (_.isEmpty(i._alarms) || i._validateTimeouts(), o.log("Alarm:validate js halt detected.")(), d.jsHaltDetected(n)), t = r | |
| }, e) | |
| }, n.prototype._validateTimeouts = function() { | |
| var e = this; | |
| _.forEach(_.keys(this._alarms), function(t) { | |
| var r = e._alarms[t]; | |
| r && (r.expiration < Date.now() ? (e.clearTimeout(t), r.fn()) : e.setTimeout(r.fn, r.expiration, t, !0)) | |
| }) | |
| }, n.prototype.setTimeout = function(e, t, r, n) { | |
| var i = this; | |
| r && this.clearTimeout(r), r = r || _.uniqueId("alarm_timer_"); | |
| var d = t - Date.now(), | |
| c = Math.min(d, s); | |
| if (0 > d) return o.log("Alarm:setTimeout:Cannot set alarm in the past.")(), e(), r; | |
| var u = window.setTimeout(function() { | |
| t - Date.now() < a ? (delete i._alarms[r], e()) : i.setTimeout(e, t, r) | |
| }, c); | |
| return this._alarms[r] = { | |
| fn: e, | |
| expiration: t, | |
| timeoutId: u | |
| }, n || o.log("Alarm:setTimeout:" + r + " set", this._alarms[r])(), r | |
| }, n.prototype.clearTimeout = function(e) { | |
| var t = this._alarms[e]; | |
| t && (window.clearTimeout(t.timeoutId), delete this._alarms[e]) | |
| }; | |
| var c = new n(i); | |
| o.exportToWindow("Alarm", c), e.exports = c | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = "animation", | |
| n = "transition", | |
| o = { | |
| _normalize: function(e, t, r) { | |
| var n = e.toLowerCase().indexOf(t), | |
| o = e.slice(0, n).toLowerCase(); | |
| return 0 === e.indexOf(t) ? o + e.slice(n) + r.toLowerCase() : o + e.slice(n) + r | |
| }, | |
| prefix: function(e, t) { | |
| var o; | |
| return 0 === e.indexOf(r) ? (o = e.substring(r.length), this._normalize(window.Modernizr.prefixed(r), r, o)) : 0 === e.indexOf(n) ? (o = e.substring(n.length), this._normalize(window.Modernizr.prefixed(n), n, o)) : window.Modernizr.prefixed(e, t, !1) || e | |
| } | |
| }; | |
| e.exports = o | |
| }, , function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| var e = this.phone || {}; | |
| e.mcc && "string" == typeof e.mcc && (e.mcc = parseInt(e.mcc, 10)), e.mnc && "string" == typeof e.mnc && (e.mnc = parseInt(e.mnc, 10)), a.Global.set({ | |
| mcc: e.mcc || null, | |
| mnc: e.mnc || null, | |
| webcPhoneDeviceManufacturer: e.device_manufacturer || null, | |
| webcPhoneDeviceModel: e.device_model || null, | |
| webcPhoneOsBuildNumber: e.os_build_number || null, | |
| webcPhoneOsVersion: e.os_version || null | |
| }) | |
| } | |
| var o = r(52), | |
| i = r(13), | |
| a = r(41), | |
| s = r(1), | |
| d = r(45), | |
| c = r(30), | |
| u = r(71), | |
| l = r(134), | |
| f = r(14), | |
| h = { | |
| ANDROID: "android", | |
| BB: "bb", | |
| BBX: "bbx", | |
| IPAD: "ipad", | |
| IPHONE: "iphone", | |
| IPOD: "ipod", | |
| S40: "s40", | |
| SYMBIAN: "symbian", | |
| WP7: "wp7" | |
| }, | |
| p = o.extend({ | |
| props: { | |
| id: "number", | |
| ref: "string", | |
| refTTL: "number", | |
| refId: "number", | |
| wid: "string", | |
| connected: "boolean", | |
| me: "string", | |
| clientToken: "string", | |
| serverToken: "string", | |
| secret: "string", | |
| isResponse: "string", | |
| battery: "number", | |
| plugged: "boolean", | |
| lc: "string", | |
| lg: "string", | |
| is24h: "boolean", | |
| platform: "string", | |
| phone: "object", | |
| tos: "number", | |
| pushname: "string" | |
| }, | |
| derived: { | |
| refExpiry: { | |
| deps: ["ref", "refTTL"], | |
| fn: function() { | |
| return Date.now() + this.refTTL | |
| } | |
| }, | |
| locale: { | |
| deps: ["lg", "lc"], | |
| fn: function() { | |
| return this.lg ? this.lc ? this.lg + "-" + this.lc : this.lg : null | |
| } | |
| }, | |
| platformField: { | |
| deps: ["platform"], | |
| fn: function() { | |
| return "wp7" === this.platform ? a.PLATFORM_TYPE.WP : this.platform ? a.PLATFORM_TYPE[this.platform.toUpperCase()] || a.PLATFORM_TYPE.UNKNOWN : a.PLATFORM_TYPE.UNKNOWN | |
| } | |
| }, | |
| tosShowCallNotification: { | |
| deps: ["tos"], | |
| fn: function() { | |
| return this.tos < 2 | |
| } | |
| } | |
| }, | |
| initialize: function() { | |
| var e = this; | |
| this.listenTo(this, "change:locale", function(e, t) { | |
| i.setLangPref(t), l10n.init(t) | |
| }), this.listenTo(this, "change:plugged", _.debounce(function() { | |
| a.Global.webcPhoneCharging = e.plugged | |
| }, 5e3, { | |
| leading: !0 | |
| })), this.listenTo(this, "change:phone", n) | |
| }, | |
| "delete": function() { | |
| this.clear() | |
| }, | |
| handle: function(e) { | |
| var t, r = e.shift(); | |
| if (r.id = 1, r.protoVersion) { | |
| u.setVersion(r.protoVersion); | |
| var n = r.features || {}, | |
| o = u.setFeatures(n); | |
| t = !!o.KEY_PARTICIPANT, c.setVersion(r.protoVersion, r.binVersion), Store.Stream.handle(["awake"]) | |
| } | |
| if (r.initial) { | |
| u.setPlatform(r.platform), i.setLogoutToken(r.browserToken), r.hasOwnProperty("is24h") && l.setIs24Hour(r.is24h); | |
| var a = r.ref, | |
| h = r.serverToken, | |
| p = r.clientToken, | |
| m = r.connected; | |
| a && m && h && i.setRefTokCookies(a, h), i.setLoginTokens({ | |
| client: p, | |
| server: h | |
| }), r.secret && c.setSharedSecret(r.secret), "true" !== r.isResponse && d.save(), "iw" === r.lg && (r.lg = "he"), r.wid && (this.me = r.wid, Store.Contact.gadd(r.wid)) | |
| } else this.connected && t && (s.log("models:Conn:participantChange:to:" + u.supportsFeature(u.F.KEY_PARTICIPANT))(), f.hardRefresh()); | |
| this.set(r) | |
| } | |
| }), | |
| m = new p({ | |
| id: 1 | |
| }); | |
| m.PLATFORMS = h, e.exports = m | |
| }, function(e, t) { | |
| "use strict"; | |
| e.exports = { | |
| ring: function(e, t) { | |
| return e > t.length - 1 ? 0 : 0 > e ? t.length - 1 : e | |
| } | |
| } | |
| }, function(e, t) { | |
| "use strict"; | |
| e.exports = { | |
| alpha: new RegExp("[A-Za-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԧԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠࢢ-ࢬऄ-हऽॐक़-ॡॱ-ॷॹ-ॿঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-ళవ-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤜᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々〆〱-〵〻〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚗꚠ-ꛥꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꪀ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ]"), | |
| mark: new RegExp("[̀-ͯ҃-҉֑-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࣤ-ࣾऀ-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఁ-ఃా-ౄె-ైొ-్ౕౖౢౣಂಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣംഃാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢩᤠ-ᤫᤰ-᤻ᦰ-ᧀᧈᧉᨗ-ᨛᩕ-ᩞ᩠-᩿᩼ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᷀-ᷦ᷼-᷿⃐-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯-꙲ꙴ-꙽ꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-꣄꣠-꣱ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꨩ-ꨶꩃꩌꩍꩻꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︦]", "g"), | |
| arabic: "[-؆-؋؍-ؚ؞ؠ-ؿف-يٖ-ٞ٪-ٯٱ-ۜ۞-ۿݐ-ݿࢠࢢ-ࢬࣤ-ࣾﭐ-﯁ﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-﷼ﹰ-ﹴﹶ-ﻼ]" | |
| } | |
| }, function(e, t) { | |
| "use strict"; | |
| function r(e) { | |
| "string" == typeof e ? e = e.split("") : "undefined" == typeof e.length && (e = new Uint8Array(e)); | |
| for (var t = Math.ceil(4 * e.length / 3), r = 4 * Math.ceil(e.length / 3), n = new Array(r), o = 0, i = 0; r > o; o += 4, i += 3) { | |
| var a = e[i] << 16 | e[i + 1] << 8 | e[i + 2]; | |
| n[o] = a >> 18, n[o + 1] = a >> 12 & 63, n[o + 2] = a >> 6 & 63, n[o + 3] = 63 & a | |
| } | |
| for (var s = 0; t > s; s++) { | |
| var d = n[s]; | |
| if (0 > d || d >= 64) return null; | |
| 26 > d ? n[s] = 65 + d : 52 > d ? n[s] = 71 + d : 62 > d ? n[s] = d - 4 : 62 === d ? n[s] = 43 : n[s] = 47 | |
| } | |
| for (var c = t; r > c; c++) n[c] = 61; | |
| return String.fromCharCode.apply(String, n) | |
| } | |
| function n(e, t) { | |
| for (var r = e.length, n = new Int32Array(r + r % 4), o = 0; r > o; o++) { | |
| var i = e.charCodeAt(o); | |
| if (i >= 65 && 90 >= i) n[o] = i - 65; | |
| else if (i >= 97 && 122 >= i) n[o] = i - 71; | |
| else if (i >= 48 && 57 >= i) n[o] = i + 4; | |
| else if (43 === i) n[o] = 62; | |
| else { | |
| if (47 !== i) { | |
| if (61 === i) { | |
| r = o; | |
| break | |
| } | |
| return null | |
| } | |
| n[o] = 63 | |
| } | |
| } | |
| for (var a = n.length / 4, s = 0, d = 0; a > s; s++, d += 4) n[s] = n[d] << 18 | n[d + 1] << 12 | n[d + 2] << 6 | n[d + 3]; | |
| for (var c = Math.floor(3 * r / 4), u = new Uint8Array(c), l = 0, f = 0; c >= f + 3; l++, f += 3) { | |
| var h = n[l]; | |
| u[f] = h >> 16, u[f + 1] = h >> 8 & 255, u[f + 2] = 255 & h | |
| } | |
| switch (c - f) { | |
| case 2: | |
| u[f] = n[l] >> 16, u[f + 1] = n[l] >> 8 & 255; | |
| break; | |
| case 1: | |
| u[f] = n[l] >> 16 | |
| } | |
| return t ? Array.prototype.slice.call(u) : u | |
| } | |
| function o(e) { | |
| return e.replace(/\+/g, "-").replace(/\//g, "_") | |
| } | |
| e.exports = { | |
| encode: r, | |
| decode: n, | |
| urlSafe: o | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| var e = this; | |
| this.assetStyle = new c("asset-style"), this.assets = {}, window.addEventListener("dpichange", function() { | |
| return e.loadAssets(e.assets) | |
| }) | |
| } | |
| var o = r(1), | |
| i = r(25), | |
| a = r(18), | |
| s = r(53), | |
| d = r(26), | |
| c = r(381), | |
| u = r(380), | |
| l = { | |
| DEFAULT: "default", | |
| WEBP: "webp" | |
| }, | |
| f = { | |
| sprite: { | |
| "class": ".icon, .icon-s, .icon-l, .icon-xl", | |
| low: { | |
| "default": r(177) | |
| }, | |
| high: { | |
| "default": r(177) | |
| } | |
| }, | |
| "bg-chat": { | |
| "class": ".pane-chat-tile", | |
| low: { | |
| "default": r(176) | |
| }, | |
| high: { | |
| "default": r(176) | |
| } | |
| }, | |
| "emoji-small": { | |
| "class": ".emoji", | |
| low: { | |
| "default": r(445), | |
| webp: r(446) | |
| }, | |
| high: { | |
| "default": r(448), | |
| webp: r(449) | |
| } | |
| }, | |
| "emoji-large": { | |
| "class": ".emojik", | |
| low: { | |
| "default": r(447) | |
| }, | |
| high: { | |
| "default": r(450), | |
| webp: r(451) | |
| } | |
| }, | |
| "intro-connection": { | |
| "class": ".intro-image", | |
| low: { | |
| "default": r(455) | |
| }, | |
| high: { | |
| "default": r(454) | |
| } | |
| } | |
| }; | |
| n.prototype.loadInitialAssets = function(e) { | |
| return this.loadAssets(f) | |
| }, n.prototype.loadAssets = function(e) { | |
| return Promise.all(_.map(e, this.loadAsset.bind(this))) | |
| }, n.prototype._supportsWebp = new Promise(function(e, t) { | |
| Modernizr.on("webp", function(t) { | |
| e(t && t.valueOf() ? !0 : !1) | |
| }) | |
| }).timeout(500)["catch"](Promise.TimeoutError, function(e) { | |
| return !1 | |
| }), n.prototype.loadAsset = function(e, t) { | |
| var r, n, i = this, | |
| a = u.currentRes, | |
| s = t + "-" + a; | |
| return r = window.performance.now(), this.unloadAsset(t), this.assets[t] = e, this.assets[t].promise = this._supportsWebp.then(function(t) { | |
| return t && e[a][l.WEBP] ? l.WEBP : l.DEFAULT | |
| }).then(function(t) { | |
| return d.idb().then(function(e) { | |
| return e.assets.get(s) | |
| })["catch"](function(e) { | |
| o.warn('Failed to "get" asset: ' + s)(e) | |
| }).then(function(r) { | |
| var n = _.last(e[a][t].split("/")); | |
| return r && r.hash === n ? i.loadBlob(URL.createObjectURL(r.data)) : Promise.reject("No result") | |
| })["catch"](function() { | |
| return i.loadAndCacheData(e[a][t], s).then(function(e) { | |
| return URL.createObjectURL(e) | |
| }) | |
| }).then(function(t) { | |
| return e["class"] && i.assetStyle.setRule("" + e["class"], { | |
| "background-image": "url('" + t + "')" | |
| }), n = window.performance.now(), o.log("Asset: " + s + " loaded: " + (n - r).toFixed(2) + "ms")(), e.onSet && e.onSet(t), t | |
| }) | |
| }) | |
| }, n.prototype.unloadAsset = function(e) { | |
| var t = this.assets[e]; | |
| t && t.promise && t.promise.isFulfilled() && URL.revokeObjectURL(t.promise.value()), delete this.assets[e] | |
| }, n.prototype.loadAndCacheData = function(e, t) { | |
| var r, n = _.last(e.split("/")); | |
| return this.loadData(e).then(function(e) { | |
| return r = e, d.idb().then(function(r) { | |
| return r.assets.put({ | |
| key: t, | |
| hash: n, | |
| data: e | |
| }) | |
| }) | |
| })["catch"](function(e) { | |
| o.warn('Failed to "put" asset: ' + t)(e) | |
| }).then(function(e) { | |
| return r | |
| }) | |
| }, n.prototype.loadBlob = function(e) { | |
| return new Promise(function(t, r) { | |
| var n = new XMLHttpRequest; | |
| n.onload = function() { | |
| 200 === n.status ? t(e) : (o.warn("Blob: " + e + " failed. Refetching asset")(), r(e)) | |
| }, n.onerror = function() { | |
| return r(e) | |
| }, n.open("GET", e, !0), n.send() | |
| }) | |
| }, n.prototype.loadData = function(e) { | |
| return i.loopOnError(a.ShouldLoop, function(t) { | |
| var r; | |
| return r = s.info === s.INFO.OFFLINE ? i.waitForBBEvent(s, "change:info", function(e) { | |
| return e.info !== s.INFO.OFFLINE | |
| }) : Promise.delay(5e3 * (t > 0 ? 1 : 0)), r.then(function() { | |
| return new Promise(function(t, r) { | |
| var n = new XMLHttpRequest; | |
| n.onload = function(i) { | |
| 200 === n.status ? t(n.response) : (o.warn("Asset: " + _.last(e.split("/")) + " failed. Retrying...")(i), r(new a.ShouldLoop("Asset failed to load. Retrying..."))) | |
| }, n.onerror = function(t) { | |
| o.warn("Asset: " + _.last(e.split("/")) + " failed. Retrying...")(t), r(new a.ShouldLoop("Asset failed to load. Retrying...")) | |
| }, n.open("GET", e, !0), n.responseType = "blob", n.send() | |
| }) | |
| }) | |
| }) | |
| }, n.prototype.loadImage = function(e) { | |
| return i.loopOnError(a.ShouldLoop, function(t) { | |
| var r; | |
| return r = s.info === s.INFO.OFFLINE ? i.waitForBBEvent(s, "change:info", function(e) { | |
| return e.info !== s.INFO.OFFLINE | |
| }) : Promise.delay(5e3 * (t > 0 ? 1 : 0)), r.bind(this).then(function() { | |
| return new Promise(function(t, r) { | |
| var n = new Image; | |
| n.onload = function() { | |
| t(e) | |
| }, n.onerror = function() { | |
| o.warn("Asset: " + _.last(e.split("/")) + " failed. Retrying...")(), r(new a.ShouldLoop("Asset failed to load. Retrying...")) | |
| }, n.src = e | |
| }) | |
| }) | |
| }) | |
| }, e.exports = new n | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| STREAM_END: 2, | |
| LIST_EMPTY: 0, | |
| DICTIONARY_0: 236, | |
| DICTIONARY_1: 237, | |
| DICTIONARY_2: 238, | |
| DICTIONARY_3: 239, | |
| LIST_8: 248, | |
| LIST_16: 249, | |
| JID_PAIR: 250, | |
| BINARY_8: 252, | |
| BINARY_20: 253, | |
| SINGLE_BYTE_MAX: 256 | |
| }; | |
| e.exports = r | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| STREAM_END: 2, | |
| LIST_EMPTY: 0, | |
| DICTIONARY_0: 236, | |
| DICTIONARY_1: 237, | |
| DICTIONARY_2: 238, | |
| DICTIONARY_3: 239, | |
| LIST_8: 248, | |
| LIST_16: 249, | |
| JID_PAIR: 250, | |
| BINARY_8: 252, | |
| BINARY_20: 253, | |
| BINARY_32: 254, | |
| NIBBLE_8: 255, | |
| SINGLE_BYTE_MAX: 256, | |
| NIBBLE_MAX: 254 | |
| }; | |
| e.exports = r | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| STREAM_END: 2, | |
| LIST_EMPTY: 0, | |
| DICTIONARY_0: 236, | |
| DICTIONARY_1: 237, | |
| DICTIONARY_2: 238, | |
| DICTIONARY_3: 239, | |
| LIST_8: 248, | |
| LIST_16: 249, | |
| JID_PAIR: 250, | |
| HEX_8: 251, | |
| BINARY_8: 252, | |
| BINARY_20: 253, | |
| BINARY_32: 254, | |
| NIBBLE_8: 255, | |
| SINGLE_BYTE_MAX: 256, | |
| PACKED_MAX: 254 | |
| }; | |
| e.exports = r | |
| }, function(e, t) { | |
| "use strict"; | |
| function r(e) { | |
| var t = [], | |
| r = !1, | |
| o = 0; | |
| _.each(e, function(e, i) { | |
| function a(e) { | |
| return e.hasOwnProperty(i) && s(e[i]) | |
| } | |
| if (e === _) return void(r = !0); | |
| o++; | |
| var s = n(e); | |
| t.push(a) | |
| }); | |
| var i = _.reduceRight(t, function(e, t) { | |
| return e ? function(r) { | |
| return t(r) && e(r) | |
| } : t | |
| }); | |
| return function(e) { | |
| if ("object" != typeof e) return !1; | |
| var t = _.keys(e).length; | |
| return o > t ? !1 : !r && t > o ? !1 : i(e) | |
| } | |
| } | |
| function n(e) { | |
| switch (typeof e) { | |
| case "object": | |
| return r(e); | |
| case "function": | |
| return e; | |
| case "boolean": | |
| case "null": | |
| case "undefined": | |
| case "number": | |
| case "string": | |
| return function(t) { | |
| return t === e | |
| } | |
| } | |
| } | |
| function o(e) { | |
| this.predicate = n(e) | |
| } | |
| o.ANY = _.constant(!0), o.OBJECT = _.isObject, o.STRING = _.isString, o.BOOLEAN = _.isBoolean, o.prototype = { | |
| test: function(e) { | |
| return this.predicate(e) | |
| } | |
| }, e.exports = o | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| c || (c = r(592)) | |
| } | |
| function o(e) { | |
| var t = void 0; | |
| return void 0 === e ? (t = new Uint8Array(32), window.crypto.getRandomValues(t)) : t = new Uint8Array(e), t[0] &= 248, t[31] &= 127, t[31] |= 64, d({ | |
| pubKey: 32, | |
| privKey: t, | |
| basepoint: u | |
| }, function(e) { | |
| var r = c._curve25519_donna(e.pubKey, e.privKey, e.basepoint); | |
| if (r) throw new Error("Curve25519:keyPair Error Code " + r); | |
| return { | |
| pubKey: s(e.pubKey, 32), | |
| privKey: t.buffer | |
| } | |
| }) | |
| } | |
| function i(e, t) { | |
| return d({ | |
| sharedKey: 32, | |
| pubKey: e, | |
| privKey: t | |
| }, function(e) { | |
| var t = c._curve25519_donna(e.sharedKey, e.privKey, e.pubKey); | |
| if (t) throw new Error("Curve25519:sharedSecret Error Code " + t); | |
| return s(e.sharedKey, 32) | |
| }) | |
| } | |
| function a(e) { | |
| if ("number" == typeof e) return c._malloc(e); | |
| var t = new Uint8Array(e.buffer || e), | |
| r = c._malloc(t.length); | |
| return c.HEAPU8.set(t, r), r | |
| } | |
| function s(e, t) { | |
| var r = new Uint8Array(t); | |
| return r.set(c.HEAPU8.subarray(e, e + t)), r.buffer | |
| } | |
| function d(e, t) { | |
| n(); | |
| var r = {}; | |
| try { | |
| for (var o in e) r[o] = a(e[o]); | |
| return t(r) | |
| } finally { | |
| for (var i in r) c._free(r[i]) | |
| } | |
| } | |
| var c, u = new Uint8Array(32); | |
| u[0] = 9, e.exports = { | |
| keyPair: o, | |
| sharedSecret: i | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| var e = this.onTimeout; | |
| return e ? (this.failGeneration++, void(e(this) && this._run(!1))) : (i.error("Watchdog timed-out without handler!")(), void a.upload("watchdog-no-handler")) | |
| } | |
| function o(e, t, r) { | |
| return "number" == typeof r ? function(n) { | |
| switch (n.failGeneration) { | |
| case 0: | |
| return Math.min(r, t); | |
| case 1: | |
| return Math.min(r, e + t); | |
| default: | |
| return Math.min(r, n.waitDuration + n.prevWaitDuration) | |
| } | |
| } : function(r) { | |
| switch (r.failGeneration) { | |
| case 0: | |
| return t; | |
| case 1: | |
| return e + t; | |
| default: | |
| return r.waitDuration + r.prevWaitDuration | |
| } | |
| } | |
| } | |
| var i = r(1), | |
| a = r(9), | |
| s = r(43), | |
| d = r(54), | |
| c = s.extend({ | |
| session: { | |
| failGeneration: { | |
| type: "number", | |
| allowNull: !1, | |
| "default": 0 | |
| }, | |
| ts: "number", | |
| waitDuration: { | |
| type: "number", | |
| allowNull: !1, | |
| "default": 0 | |
| }, | |
| prevWaitDuration: { | |
| type: "number", | |
| allowNull: !1, | |
| "default": 0 | |
| }, | |
| jitter: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| shiftTimer: "object", | |
| waitAlgorithm: { | |
| type: "function", | |
| required: !0, | |
| allowNull: !1 | |
| }, | |
| onActivated: "function", | |
| onDeactivated: "function", | |
| onFed: "function", | |
| onTimeout: "function" | |
| }, | |
| initialize: function() { | |
| this.shiftTimer = new d(this, n) | |
| }, | |
| activate: function() { | |
| this.shiftTimer.ts || (this._run(!0), this.onActivated && this.onActivated(this)) | |
| }, | |
| deactivate: function() { | |
| this.shiftTimer.ts && (this.shiftTimer.cancel(), this.onDeactivated && this.onDeactivated(this)) | |
| }, | |
| feed: function() { | |
| this.shiftTimer.ts && (this._run(!0), this.onFed && this.onFed(this)) | |
| }, | |
| forceTimeout: function(e) { | |
| this.shiftTimer.ts ? e ? this.ts = this.shiftTimer.before(e) : this.shiftTimer.trigger() : i.error("forced non-running watchdog!")() | |
| }, | |
| poke: function() { | |
| this.forceTimeout.apply(this, arguments) | |
| }, | |
| _run: function(e) { | |
| e && (this.failGeneration = 0); | |
| var t = this.waitAlgorithm(this), | |
| r = this.jitter * Math.random() * t; | |
| this.set({ | |
| ts: this.shiftTimer.debounce(t + r), | |
| waitDuration: t, | |
| prevWaitDuration: this.waitDuration | |
| }) | |
| } | |
| }); | |
| c.FIBONACCI = o, e.exports = c | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| return function() { | |
| if (R) return e.apply(void 0, arguments); | |
| P || (P = [], window.setTimeout(function() { | |
| b = r(14), w = r(7), E = r(9), S = r(6), N = r(26), T = r(1), $ = r(41), C = r(89), A = r(54), I = r(13), O = new A(c); | |
| for (var e = 0; e < P.length; e++) P[e](); | |
| P = null, R = !0 | |
| }, 0)); | |
| var t = Array.prototype.slice.call(arguments); | |
| P.push(e.apply.bind(e, void 0, t)) | |
| } | |
| } | |
| function o(e) { | |
| e.commitTime ? T.error("wam:commit redundant commit! " + e.$className)() : (T.log("wam:commit " + e.$className, e.all)(), e.commitTime = y(), a([!0, e])) | |
| } | |
| function i(e, t) { | |
| T.log("wam:set " + e.name + " = " + t)(), a([!1, e, t]) | |
| } | |
| function a(e) { | |
| D.push(e), U && O.before(B) | |
| } | |
| function s() { | |
| T.log("wam pause processing")(), U = !1, O.cancel() | |
| } | |
| function d() { | |
| T.log("wam enable processing")(), U = !0, D.length > 0 && O.before(B) | |
| } | |
| function c() { | |
| s(), Promise.resolve(D).then(function(e) { | |
| if (!j) { | |
| var t = b.info(); | |
| j = { | |
| appVersion: S.VERSION_BASE, | |
| platform: $.PLATFORM_TYPE.WEBCLIENT, | |
| browser: t.name || null, | |
| browserVersion: t.ua || null, | |
| deviceName: t.os || null, | |
| webcPhonePlatform: Store.Conn.platformField || null, | |
| webcEnv: $.WEBC_ENV_CODE.PROD, | |
| webcWebPlatform: $.WEBC_WEB_PLATFORM_TYPE["web".toUpperCase()] | |
| }, T.log("wam:executePending initializing", j)(), $.Global.commitOnSet = !1, $.Global.set(j), $.Global.commitOnSet = !0, I.clearWamBuffer_old(), I.clearWamStatus_old(), I.clearWamLastRotate_old(), I.clearWamDimensionCache_old() | |
| } | |
| T.log("wam:executePending " + e.length + " jobs")(), k || (k = new u(j)); | |
| for (var r = 0; r < e.length; r++) { | |
| var n = e[r]; | |
| if (n[0]) k.write(n[1]); | |
| else { | |
| var o = n[1], | |
| i = n[2]; | |
| j[o.name] = i, k.set(-o.id, i) | |
| } | |
| } | |
| var a = y(); | |
| if (k.bufferLength > 0 && (k.bufferLength > S.WAM_MAX_BUFFER_SIZE || a > L + S.WAM_ROTATE_INTERVAL || !x)) { | |
| if (!I.getLoginTokens().server) return T.log("wam:executePending wam unauthed, didn't send")(), k.bufferLength > S.WAM_MAX_BUFFER_SIZE ? (k = null, T.log("wam:executePending abandoned current buffer")(), Promise.resolve()) : m(); | |
| var s = C.uploadEvent(); | |
| return s.commitTime = a, T.log("wam:executePending commit upload", s.all)(), k.write(s), g() | |
| } | |
| return m() | |
| })["catch"](function(e) { | |
| T.error("wam:executePending error " + (e && e.stack ? e.stack : e))(e), E.upload("wam-error"), k = null | |
| }).then(d, d), D = [] | |
| } | |
| function u(e) { | |
| this.buffer = [], this.bufferLength = 0, this.prevValues = {}, this.dirtyGlobals = null, this.unsavedPortion = null, this.saveKey = 1e9 * Math.random() | 0, e && this.setAll(e) | |
| } | |
| function l(e) { | |
| var t = new w(10 + e.length, !0); | |
| t.writeString("WASTATS"); | |
| for (var r = JSON.parse("[" + e + "]"), n = 0; n < r.length; n++) { | |
| var o = r[n], | |
| i = o[0]; | |
| i > 0 ? f(t, i, o[1]) : h(t, -i, o[1], W) | |
| } | |
| return t | |
| } | |
| function f(e, t, r) { | |
| for (var n = 0; n < r.length; n++) { | |
| var o = r[n]; | |
| h(e, o[0], o[1], F) | |
| } | |
| h(e, t, r.length, Y) | |
| } | |
| function h(e, t, r, n) { | |
| if (null === r && n === W) p(e, t, n); | |
| else if (r === (0 | r)) 0 === r ? p(e, t, 16 | n) : 1 === r ? p(e, t, 32 | n) : r >= -128 && 128 > r ? (p(e, t, 48 | n), e.writeInt8(r)) : r >= -32768 && 32768 > r ? (p(e, t, 64 | n), e.writeInt16(r)) : (p(e, t, 80 | n), e.writeInt32(r)); | |
| else if ("number" == typeof r) p(e, t, 112 | n), e.writeFloat64(r); | |
| else if ("string" == typeof r) { | |
| for (var o = 0, i = 0; i < r.length; i++) { | |
| var a = r.charCodeAt(i); | |
| a >= 55296 && 56320 > a && (a = ((1023 & a) << 10 | 1023 & r.charCodeAt(++i)) + 65536), 128 > a ? o++ : o += 2048 > a ? 2 : 65536 > a ? 3 : 4 | |
| } | |
| 256 > o ? (p(e, t, 128 | n), e.writeUint8(o)) : 65536 > o ? (p(e, t, 144 | n), e.writeUint16(o)) : (p(e, t, 160 | n), e.writeUint32(o)), e.writeString(r) | |
| } else null === r && p(e, t, 176 | n) | |
| } | |
| function p(e, t, r) { | |
| 256 > t ? (e.writeUint8(r), e.writeUint8(t)) : (e.writeUint8(4 | r), e.writeUint16(t)) | |
| } | |
| function m() { | |
| var e = k.stringBuffer(); | |
| if (!e) return Promise.resolve(); | |
| var t = k.unsavedPortion; | |
| if (t && 0 === t.bufferLength) return Promise.resolve(); | |
| var r = k.saveKey, | |
| n = { | |
| buffer: e, | |
| lastSend: r | |
| }, | |
| o = void 0; | |
| return o = t ? N.idb().then(function(e) { | |
| return e.wam.update(r, n) | |
| }).then(function(e) { | |
| return 0 === e ? (k = k.unsavedPortion, T.log("wam:save other tab claimed buffer, cutting head")(), m()) : (T.log("wam:save successfully updated " + r)(), void(k.unsavedPortion = new u(j))) | |
| }) : N.idb().then(function(e) { | |
| return e.wam.add(n, r) | |
| }).then(function() { | |
| T.log("wam:save successfully saved new entry " + r)(), k.unsavedPortion = new u(j) | |
| }), o["catch"](function(e) { | |
| T.warn("wam:save indexeddb failed to save " + e)(e) | |
| }) | |
| } | |
| function g() { | |
| var e = {}; | |
| return N.idb().then(function(t) { | |
| return t.wam.toCollection().modify(function(t) { | |
| e[t.lastSend] = t.buffer, delete this.value | |
| }) | |
| })["catch"](function(e) { | |
| T.warn("wam:sendAllLogs failed to read because " + e)(e) | |
| }).then(function() { | |
| return k && (!k.unsavedPortion || k.saveKey in e || (k = k.unsavedPortion), e[k.saveKey] = k.stringBuffer()), Promise.all(_.map(e, v)) | |
| }).then(function(t) { | |
| var r = _.filter(t); | |
| if (r.length !== t.length && (L = y(), x = !0), k && -1 === _.indexOf(r, k.saveKey) && (k = null), 0 === r.length) return Promise.resolve(); | |
| var n = _.reduce(r, function(t, r) { | |
| return t + e[r].length | |
| }, 0); | |
| return n < S.WAM_MAX_BUFFER_SIZE ? N.idb().then(function(t) { | |
| return Promise.all(_.map(r, function(r) { | |
| return t.wam.add({ | |
| buffer: e[r], | |
| lastSend: r | |
| }, r).then(_.noop, _.noop) | |
| })) | |
| }) : (k = null, void T.error("wam dropped " + r.length + " buffers! (" + n + " bytes)", e)()) | |
| }) | |
| } | |
| function v(e, t) { | |
| if ("" === e) return Promise.resolve(void 0); | |
| var n = r(95), | |
| o = l(e).flip().toBase64(); | |
| T.log("wam:sendLogs { strlen:" + e.length + ", b64len:" + o.length + " }")(); | |
| var i = new FormData; | |
| return i.append("t", "" + y()), i.append("v", S.VERSION_BASE), i.append("tok", I.getLoginTokens().server), i.append("buffer", o), n.post(S.WAM_URL, i).uncancellable().then(function(e) { | |
| if (e.status >= 500) throw e.status + " response"; | |
| return e | |
| })["catch"](function(e) { | |
| return T.error("wam:sendLogs retry on error: " + e)(e), n.post(S.WAM_URL, i) | |
| }).then(function(e) { | |
| return 200 === e.status ? void T.log("wam:sendLogs success")() : (T.error("wam:sendLogs failure code: " + e.status)(), t) | |
| })["catch"](function(e) { | |
| return T.error("wam:sendLogs failure error: " + e)(e), t | |
| }) | |
| } | |
| function y() { | |
| return Math.floor(Date.now() / 1e3) | |
| } | |
| var b, w, E, S, N, T, $, C, A, I, O, k, P = null, | |
| R = !1, | |
| M = -47, | |
| L = 0, | |
| D = [], | |
| U = !1, | |
| B = 1e4, | |
| x = !1, | |
| j = null; | |
| u.prototype = { | |
| setAll: function(e) { | |
| for (var t in e) { | |
| var r = e[t]; | |
| void 0 !== r && this.set(-$.METRICS[t].id, r) | |
| } | |
| }, | |
| set: function(e, t) { | |
| this.dirtyGlobals || (this.dirtyGlobals = {}), this.dirtyGlobals[e] = t, this.unsavedPortion && this.unsavedPortion.set(e, t) | |
| }, | |
| flushGlobals: function() { | |
| if (this.dirtyGlobals) { | |
| var e = this.dirtyGlobals, | |
| t = this.prevValues; | |
| for (var r in e) { | |
| var n = 0 | r, | |
| o = e[n]; | |
| if ("boolean" == typeof o ? o = o ? 1 : 0 : void 0 === o && (o = null), o === t[n]) return; | |
| t[n] = o, this.appendToBuffer(JSON.stringify([n, o])) | |
| } | |
| this.dirtyGlobals = null | |
| } | |
| }, | |
| write: function(e) { | |
| var t = this.prevValues; | |
| this.appendToBuffer(JSON.stringify([M, e.commitTime])), this.flushGlobals(); | |
| var r = e.all, | |
| n = []; | |
| for (var o in r) { | |
| var i = $.METRICS[o].id, | |
| a = r[o]; | |
| null !== a && void 0 !== a && ("boolean" == typeof a && (a = a ? 1 : 0), 0 !== a && 1 !== a && a === t[i] ? n.push([i, null]) : (t[i] = a, n.push([i, a]))) | |
| } | |
| this.appendToBuffer(JSON.stringify([e.id, n])), this.unsavedPortion && this.unsavedPortion.write(e) | |
| }, | |
| appendToBuffer: function(e) { | |
| this.buffer.push(e), this.buffer.length > 1 ? this.bufferLength += 1 + e.length : this.bufferLength += e.length | |
| }, | |
| stringBuffer: function() { | |
| var e = this.buffer.join(","); | |
| return this.buffer.length > 1 && (this.buffer = [e]), this.bufferLength = e.length, e | |
| } | |
| }; | |
| var W = 0, | |
| Y = 1, | |
| F = 2; | |
| e.exports = _.mapValues({ | |
| commit: o, | |
| set: i, | |
| resumeJobs: d | |
| }, n) | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| return function(t) { | |
| return "number" == typeof t.status && t.status >= 500 ? t : void e(t) | |
| } | |
| } | |
| var o = r(1), | |
| i = r(18), | |
| a = r(10), | |
| s = r(7), | |
| d = r(34), | |
| c = r(19), | |
| u = r(51), | |
| l = r(55), | |
| f = r(94), | |
| h = { | |
| BinaryProtocol: null, | |
| N: null, | |
| M: { | |
| DEBUG_LOG: 1, | |
| QUERY_RESUME: 2, | |
| QUERY_RECEIPT: 3, | |
| QUERY_MEDIA: 4, | |
| QUERY_CHAT: 5, | |
| QUERY_CONTACTS: 6, | |
| QUERY_MESSAGES: 7, | |
| PRESENCE: 8, | |
| PRESENCE_SUBSCRIBE: 9, | |
| GROUP: 10, | |
| READ: 11, | |
| CHAT: 12, | |
| RECEIVED: 13, | |
| PIC: 14, | |
| STATUS: 15, | |
| MESSAGE: 16 | |
| }, | |
| isRequestingDeviceUploadLogsMutex: 0, | |
| wrap: n, | |
| wrap02: n, | |
| binWrap: function(e, t) { | |
| return function(r) { | |
| if ("object" == typeof r && "number" == typeof r.status) { | |
| if (401 === r.status) throw new i.E401; | |
| if (r.status >= 500) return r; | |
| t(r) | |
| } else e(r) | |
| } | |
| }, | |
| actionNode: function(e, t) { | |
| return ["action", { | |
| type: e | |
| }, t] | |
| }, | |
| queryNode: function(e, t) { | |
| return ["query", e, t] | |
| }, | |
| dropIfConditionMet: function(e, t) { | |
| return e.reduce(function(e, t) { | |
| return e || t | |
| }, !1) ? void 0 : t | |
| }, | |
| actionGetMeta: function(e) { | |
| var t = {}; | |
| if ("action" !== this.N.tag(e)) return t; | |
| var r = this.N.attr("add", e), | |
| n = this.N.attr("missing", e), | |
| o = this.N.attr("checksum", e); | |
| switch (r) { | |
| case "unread": | |
| t.unreadId = this.N.attr("index", e), t.unreadFromMe = "true" === this.N.attr("owner", e), t.unreadParticipant = this.N.attr("participant", e); | |
| case "after": | |
| case "before": | |
| case "last": | |
| t.pendingMsgsDone = "true" === this.N.attr("last", e), t.resume = "true" === this.N.attr("resume", e); | |
| case "relay": | |
| case "update": | |
| t.add = r | |
| } | |
| switch (n) { | |
| case "remove": | |
| t.missing = n | |
| } | |
| return o && (t.checksum = o), t | |
| }, | |
| groupActionsByType: function(e) { | |
| var t = {}; | |
| if (!_.isArray(e)) return t; | |
| var r, n, i = e.length; | |
| for (n = 0; i > n; n++) switch (r = e[n], this.N.tag(r)) { | |
| case "broadcast": | |
| switch (this.N.attr("type", r)) { | |
| case "create": | |
| case "add": | |
| case "remove": | |
| t.msg || (t.msg = []), t.msg.push(r); | |
| break; | |
| case "modify": | |
| t.bcUpdate || (t.bcUpdate = []), t.bcUpdate.push(r) | |
| } | |
| break; | |
| case "message": | |
| case "groups_v2": | |
| case "notification": | |
| case "call_log": | |
| case "security": | |
| t.msg || (t.msg = []), t.msg.push(r); | |
| break; | |
| case "read": | |
| case "log": | |
| case "identity": | |
| t.cmd || (t.cmd = []), t.cmd.push(r); | |
| break; | |
| case "received": | |
| t.ack || (t.ack = []), t.ack.push(r); | |
| break; | |
| case "user": | |
| t.contact || (t.contact = []), t.contact.push(r); | |
| break; | |
| case "chat": | |
| switch (this.N.attr("type", r)) { | |
| case "mute": | |
| t.mute || (t.mute = []), t.mute.push(r); | |
| break; | |
| default: | |
| t.chat || (t.chat = []), t.chat.push(r) | |
| } | |
| break; | |
| case "battery": | |
| t.battery || (t.battery = []), t.battery.push(r); | |
| break; | |
| default: | |
| o.errorVerbose("Wap:groupActionsByType unknown action: " + this.N.toString(r), r)() | |
| } | |
| return t | |
| }, | |
| safeParseInt: function(e, t) { | |
| var r = parseInt(this.N.attr(t, e), 10); | |
| return _.isNaN(r) ? void 0 : r | |
| }, | |
| parseChat: function(e) { | |
| if ("chat" === this.N.tag(e)) { | |
| var t = this.N.attr("jid", e), | |
| r = parseInt(this.N.attr("t", e), 10) || void 0, | |
| n = this.N.attr("type", e), | |
| o = parseInt(this.N.attr("mute", e), 10) || void 0, | |
| i = parseInt(this.N.attr("before", e), 10) || void 0, | |
| a = "true" === this.N.attr("archive", e), | |
| s = "true" === this.N.attr("read_only", e), | |
| d = parseInt(this.N.attr("modify_tag", e), 10) || void 0, | |
| c = this.N.attr("name", e) || void 0, | |
| u = this.safeParseInt(e, "count"), | |
| l = "true" === this.N.attr("message", e); | |
| "ahead" === n && (n = "clear"); | |
| var f, h = this.N.children(e); | |
| if (_.isArray(h)) { | |
| f = []; | |
| var p, m, g = h.length; | |
| for (p = 0; g > p; p++) | |
| if (m = h[p], "item" === this.N.tag(m)) { | |
| var v = this.N.attr("index", m); | |
| v && f.push([v, "true" === this.N.attr("owner", m)]) | |
| } | |
| } | |
| var y = { | |
| id: t, | |
| t: r, | |
| type: n, | |
| keys: f, | |
| before: i, | |
| archive: a, | |
| isReadOnly: s, | |
| unreadCount: u, | |
| muteExpiration: o, | |
| modifyTag: d, | |
| name: c, | |
| pendingMsgs: l | |
| }, | |
| b = [n && "delete" !== n && "clear" !== n && "archive" !== n && "unarchive" !== n && "mute" !== n && "modify_tag" !== n, !n && !t, a && n && "clear" !== n, "clear" !== n && i && i > 0, "clear" !== n && f && f.length > 0]; | |
| return this.dropIfConditionMet(b, y) | |
| } | |
| }, | |
| parseContact: function(e) { | |
| if ("user" === this.N.tag(e)) { | |
| var t = this.N.attr("jid", e), | |
| r = this.N.attr("name", e), | |
| n = this.N.attr("short", e) || void 0, | |
| o = this.N.attr("type", e) || "in", | |
| i = "true" === this.N.attr("plaintext_disabled", e), | |
| a = { | |
| id: t, | |
| name: r, | |
| type: o, | |
| shortName: n, | |
| plaintextDisabled: i | |
| }, | |
| s = [!t, "in" !== o && "out" !== o && !!o]; | |
| return this.dropIfConditionMet(s, a) | |
| } | |
| }, | |
| parseCmd: function(e) { | |
| if ("read" === this.N.tag(e)) { | |
| var t = this.N.attr("jid", e), | |
| r = { | |
| type: "read", | |
| jid: t | |
| }, | |
| n = [!t]; | |
| return this.dropIfConditionMet(n, r) | |
| } | |
| }, | |
| parseAck: function(e) { | |
| if ("received" === this.N.tag(e)) { | |
| var t, r = this.N.attr("type", e), | |
| n = this.N.attr("id", e), | |
| o = this.N.attr("to", e); | |
| switch (r) { | |
| case "message": | |
| t = 2; | |
| break; | |
| case "read": | |
| t = 3; | |
| break; | |
| case "played": | |
| t = 4; | |
| break; | |
| case "error": | |
| t = -1; | |
| break; | |
| case "pending": | |
| default: | |
| t = 0 | |
| } | |
| var i = { | |
| cmd: "ack", | |
| id: n, | |
| ack: t, | |
| from: Store.Conn.me, | |
| to: o | |
| }, | |
| a = [!n, !o, "message" !== r && "read" !== r && "played" !== r && "error" !== r && "pending" !== r]; | |
| return this.dropIfConditionMet(a, i) | |
| } | |
| }, | |
| parseBCUpdate: function(e) { | |
| if ("broadcast" === this.N.tag(e) && "modify" === this.N.attr("type", e)) { | |
| var t = this.N.attr("jid", e), | |
| r = this.N.children(e), | |
| n = []; | |
| if (_.isArray(r)) { | |
| var o, i, a, s = r.length; | |
| for (o = 0; s > o; o++) i = r[o], a = this.N.attr("jid", i), "recipient" === this.N.tag(i) && a && 2 === a.split("@").length && "c.us" === a.split("@")[1] && n.push({ | |
| id: a | |
| }) | |
| } | |
| var d = { | |
| id: t, | |
| participants: n | |
| }, | |
| c = [!t, "broadcast" !== t.split("@")[1], 0 === n.length]; | |
| return this.dropIfConditionMet(c, d) | |
| } | |
| }, | |
| parseBattery: function(e) { | |
| if ("battery" === this.N.tag(e)) { | |
| var t = Math.min(parseInt(this.N.attr("value", e), 10) || -1, 100), | |
| r = this.N.attr("live", e), | |
| n = { | |
| battery: 0 > t ? void 0 : t, | |
| plugged: r ? "true" === r : void 0 | |
| }, | |
| o = [0 > t && !r]; | |
| return this.dropIfConditionMet(o, n) | |
| } | |
| }, | |
| msgGetTarget: function(e) { | |
| return e.from === Store.Conn.me ? e.to : e.from | |
| }, | |
| parseMsg: function(e, t) { | |
| switch (this.N.tag(e)) { | |
| case "message": | |
| return this.parseMsgMessage(e, t); | |
| case "groups_v2": | |
| return this.parseMsgGp2(e); | |
| case "broadcast": | |
| return this.parseMsgBroadcast(e); | |
| case "notification": | |
| return this.parseMsgNotification(e); | |
| case "call_log": | |
| return this.parseMsgCallLog(e); | |
| case "security": | |
| return this.parseMsgSecurity(e); | |
| default: | |
| return | |
| } | |
| }, | |
| parseMsgMessage: function(e, t) { | |
| if ("message" === this.N.tag(e)) { | |
| var r; | |
| this.N.attr("from", e) !== Store.Conn.me || this.N.attr("to", e) ? this.N.attr("to", e) !== Store.Conn.me || this.N.attr("from", e) || (r = "out") : r = "in"; | |
| var n, i = this.N.attr("id", e), | |
| a = parseInt(this.N.attr("t", e), 10) || 0, | |
| s = this.N.attr("to", e) || Store.Conn.me, | |
| d = this.N.attr("from", e) || Store.Conn.me, | |
| c = "broadcast" === d.split("@")[1], | |
| u = this.N.attr("participant", e), | |
| l = c ? u : d, | |
| f = c ? void 0 : u, | |
| h = c ? !1 : this.N.child("broadcast", e) && d === Store.Conn.me, | |
| p = "invis" === this.N.attr("web", e), | |
| m = this.N.attr("notify", e) || "", | |
| g = parseInt(this.N.attr("status", e)) || 0, | |
| v = [], | |
| y = this.N.child("broadcast", e); | |
| if ("broadcast" !== s) { | |
| switch (t) { | |
| case "fresh": | |
| n = 1; | |
| break; | |
| default: | |
| n = g >= -1 && 4 >= g ? g : 1 | |
| } | |
| if (_.isArray(y)) { | |
| var b, w = y.length; | |
| for (b = 0; w > b; b++) { | |
| var E = y[b], | |
| S = this.N.attr("jid", E); | |
| "to" === this.N.tag(E) && S && v.push(S) | |
| } | |
| } | |
| var N, T = [], | |
| $ = this.N.attr("type", e); | |
| switch ($) { | |
| case "ciphertext": | |
| case "text": | |
| var C = this.N.dataStr(this.N.child("body", e)) || ""; | |
| N = { | |
| id: i, | |
| body: "text" === $ ? C : void 0, | |
| type: "text" === $ ? "chat" : "ciphertext", | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| invis: p, | |
| ack: n, | |
| broadcast: h, | |
| recipients: v | |
| }, T = [!i, !a, !l, !s]; | |
| break; | |
| case "media": | |
| var A, I, O, k, P, R = this.N.child("media", e), | |
| M = this.N.attr("type", R), | |
| L = this.N.attr("media_key", R), | |
| D = this.N.attr("mimetype", R); | |
| if ("retry" === this.N.attr("reason", R)) return; | |
| switch (M) { | |
| case "image": | |
| case "video": | |
| var U = this.N.attr("caption", R); | |
| A = this.thumbFromMediaXml(R), I = this.N.attr("url", R), I = _.isString(I) && I.indexOf("/u/") > 0 ? void 0 : I, O = this.N.attr("filehash", R), k = parseInt(this.N.attr("size", R), 10) || 0, P = this.N.attr("seconds", R), N = { | |
| id: i, | |
| body: A, | |
| type: M, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| invis: p, | |
| ack: n, | |
| clientUrl: I, | |
| duration: P, | |
| broadcast: h, | |
| recipients: v, | |
| filehash: O, | |
| size: k, | |
| caption: U, | |
| mediaKey: L, | |
| mimetype: D | |
| }, T = [!i, !a, !l, !s]; | |
| break; | |
| case "location": | |
| var B = this.N.attr("latitude", R), | |
| x = this.N.attr("longitude", R), | |
| j = this.N.attr("name", R); | |
| A = this.thumbFromMediaXml(R), I = this.N.attr("url", R), N = { | |
| id: i, | |
| body: A, | |
| type: M, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| invis: p, | |
| ack: n, | |
| clientUrl: I, | |
| loc: j, | |
| lat: B, | |
| lng: x, | |
| broadcast: h, | |
| recipients: v | |
| }, T = [!i, !a, !l, !s, !B || !x]; | |
| break; | |
| case "audio": | |
| var W = "live" === this.N.attr("origin", R) ? "ptt" : M; | |
| I = this.N.attr("url", R), I = _.isString(I) && I.indexOf("/u/") > 0 ? void 0 : I, O = this.N.attr("filehash", R), k = parseInt(this.N.attr("size", R), 10) || 0, P = this.N.attr("seconds", R), N = { | |
| id: i, | |
| type: W, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| invis: p, | |
| ack: n, | |
| clientUrl: I, | |
| duration: P, | |
| broadcast: h, | |
| recipients: v, | |
| filehash: O, | |
| size: k, | |
| mediaKey: L, | |
| mimetype: D | |
| }, T = [!i, !a, !l, !s]; | |
| break; | |
| case "vcard": | |
| var Y = this.N.child("vcard", R), | |
| F = this.N.dataStr(Y), | |
| G = this.N.attr("name", Y); | |
| N = { | |
| id: i, | |
| body: F, | |
| type: M, | |
| subtype: G, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| invis: p, | |
| ack: n, | |
| broadcast: h, | |
| recipients: v | |
| }, T = [!i, !a, !l, !s, !F, !G]; | |
| break; | |
| default: | |
| o.error("wap:parseMsgMessage: unknown media type: " + this.N.toString(e), e)() | |
| } | |
| break; | |
| default: | |
| o.error("wap:parseMsgMessage: unknown message type: " + this.N.toString(e), e)() | |
| } | |
| return this.dropIfConditionMet(T, N) | |
| } | |
| } | |
| }, | |
| thumbFromMediaXml: function(e) { | |
| return "raw" === this.N.attr("encoding", e) ? s.isByteBuffer(this.N.children(e)) ? this.N.children(e).toBase64() : "" : this.N.dataStr(e) | |
| }, | |
| parseMsgGp2: function(e) { | |
| if ("groups_v2" === this.N.tag(e)) { | |
| var t, r = parseInt(this.N.attr("t", e), 10) || 0, | |
| n = this.N.attr("id", e), | |
| o = this.N.attr("jid", e), | |
| i = "invis" === this.N.attr("web", e), | |
| a = this.N.attr("type", e), | |
| s = this.N.attr("author", e), | |
| d = this.N.children(e), | |
| c = []; | |
| switch (a) { | |
| case "create": | |
| t = this.N.attr("subject", e); | |
| break; | |
| case "subject": | |
| t = this.N.attr("subject", e); | |
| break; | |
| case "picture": | |
| t = this.N.attr("picture", e) | |
| } | |
| if (_.isArray(d)) { | |
| var u, l = d.length; | |
| for (u = 0; l > u; u++) { | |
| var f = d[u], | |
| h = this.N.attr("jid", f); | |
| "participant" === this.N.tag(f) && h && c.push(h) | |
| } | |
| } | |
| var p = _.isString(s) ? s.indexOf("s.whatsapp.net") : -1; | |
| p > -1 && (s = s.slice(0, p) + "c.us"); | |
| var m = { | |
| t: r, | |
| id: n, | |
| to: o, | |
| from: o, | |
| author: s, | |
| body: t ? t.toString() : void 0, | |
| type: "gp2", | |
| subtype: a, | |
| invis: i, | |
| recipients: c | |
| }, | |
| g = [!n, !r, "subject" !== a && "add" !== a && "remove" !== a && "leave" !== a && "picture" !== a && "modify" !== a && "create" !== a && "delete" !== a && "promote" !== a && "demote" !== a, "subject" === a && !t, ("add" === a || "remove" === a || "leave" === a || "promote" === a || "demote" === a || "modify" === a) && 0 === c.length, !o, "string" == typeof o && "g.us" !== o.split("@")[1]]; | |
| return this.dropIfConditionMet(g, m) | |
| } | |
| }, | |
| parseMsgBroadcast: function(e) { | |
| if ("broadcast" === this.N.tag(e)) { | |
| var t, r = this.N.attr("type", e), | |
| n = this.N.attr("id", e), | |
| o = parseInt(this.N.attr("t", e), 10) || 0, | |
| i = this.N.attr("jid", e); | |
| switch (r) { | |
| case "create": | |
| t = parseInt(this.N.attr("count", e), 10) || 0; | |
| break; | |
| case "add": | |
| case "remove": | |
| t = this.N.attr("participant", e) | |
| } | |
| var a = { | |
| id: n, | |
| t: o, | |
| type: "broadcast_notification", | |
| subtype: r, | |
| from: i, | |
| to: i, | |
| body: t ? t.toString() : void 0 | |
| }, | |
| s = [!n, !o, !i, "string" == typeof i && "broadcast" !== i.split("@")[1], "create" !== r && "add" !== r && "remove" !== r, ("add" === r || "remove" === r) && 2 !== t.split("@").length]; | |
| return this.dropIfConditionMet(s, a) | |
| } | |
| }, | |
| parseMsgNotification: function(e) { | |
| if ("notification" === this.N.tag(e)) { | |
| var t = this.N.attr("id", e), | |
| r = parseInt(this.N.attr("t", e), 10) || 0, | |
| n = this.N.attr("jid", e), | |
| o = "invis" === this.N.attr("web", e), | |
| i = this.N.dataStr(e), | |
| a = "true" === this.N.attr("owner", e) ? Store.Conn.me : n, | |
| s = "true" === this.N.attr("owner", e) ? n : Store.Conn.me, | |
| d = { | |
| id: t, | |
| type: "notification", | |
| t: r, | |
| invis: o, | |
| from: a, | |
| to: s, | |
| body: i | |
| }, | |
| c = [!t, !r, !n, 2 !== n.split("@").length]; | |
| return this.dropIfConditionMet(c, d) | |
| } | |
| }, | |
| "delete": _.noop, | |
| error2412: _.noop, | |
| setSubProtocol: function(e) { | |
| 1 === e ? (this.BinaryProtocol = new l("01"), this.N = this.BinaryProtocol.Node) : (this.BinaryProtocol = new l("03"), this.N = this.BinaryProtocol.Node) | |
| }, | |
| handle: function(e, t, r) { | |
| var n, i, a, s, d, c, u, l, f = this.BinaryProtocol.read(e); | |
| switch (this.N.tag(f)) { | |
| case "response": | |
| if (0 === r.indexOf("preempt")) switch (this.N.attr("type", f)) { | |
| case "chat": | |
| if (o.logColor("green", "bin-recv: " + r + ",response,chat", f)(), i = this.N.children(f) || [], _.isArray(i)) { | |
| for (s = i.length, n = [], a = 0; s > a; a++) u = this.parseChat(i[a]), u && n.push(u); | |
| Store.Chat.handle([{ | |
| cmd: "preempt", | |
| response: n | |
| }], t) | |
| } | |
| break; | |
| case "contacts": | |
| if (o.logColor("green", "bin-recv: " + r + ",response,contact", f)(), i = this.N.children(f), _.isArray(i)) { | |
| for (s = i.length, n = [], a = 0; s > a; a++) d = this.parseContact(i[a]), d && n.push(d); | |
| Store.Contact.handle([{ | |
| cmd: "preempt", | |
| checksum: this.N.attr("checksum", f), | |
| response: n | |
| }], t) | |
| } | |
| break; | |
| default: | |
| o.error("Wap:handle unknown response type: " + this.N.toString(f, !0), f)() | |
| } else o.error("Wap:handle non-preemptive response: " + this.N.toString(f, !0), f)(); | |
| break; | |
| case "action": | |
| var h = this.actionGetMeta(f), | |
| p = this.groupActionsByType(this.N.children(f)), | |
| m = Object.keys(p); | |
| if (_.isArray(m)) { | |
| var g, v, y, b, w = m.length; | |
| if (0 === w && "last" === h.add) Store.Msg.handle([{ | |
| recent: !0, | |
| meta: h | |
| }]); | |
| else | |
| for (a = 0; w > a; a++) { | |
| v = m[a], g = p[v]; | |
| var E, S = g.length; | |
| switch (v) { | |
| case "msg": | |
| var N; | |
| switch (h.add) { | |
| case "relay": | |
| case "update": | |
| N = this.parseMsg(g[0], "relay"), 1 !== S && o.error("Wap:handle action msg relay length not 1", f)(), N ? (o.logColor("green", "bin-recv: " + [r, "action", "msg", h.add, N.type, N.from, N.to, N.id].join(","), f)(), b = this.msgGetTarget(N), Store.Msg.handle([{ | |
| meta: { | |
| add: h.add | |
| }, | |
| chat: b, | |
| msg: N | |
| }])) : o.error("Wap:handle action msg relay dropped", g[0])(); | |
| break; | |
| case "last": | |
| for (o.logColor("green", "bin-recv: " + [r, "action", "msg", "last", g.length].join(","), f)(), y = [], E = 0; S > E; E++) N = this.parseMsg(g[E], "last"), N ? y.push(N) : o.error("Wap:handle action msg last dropped", g[E])(); | |
| if (y.length > 0) { | |
| for (var T = { | |
| recent: !0, | |
| meta: h | |
| }, $ = 0; $ < y.length; $++) T[this.msgGetTarget(y[$])] = y[$]; | |
| Store.Msg.handle([T]) | |
| } else o.error("Wap:handle action msg last dropped to 0")(); | |
| break; | |
| case "before": | |
| case "after": | |
| case "unread": | |
| if (S > 0) { | |
| for (y = [], E = 0; S > E; E++) N = this.parseMsg(g[E], h.add), N ? y.push(N) : o.error("Wap:handle action msg before/after dropped", g[E])(); | |
| o.logColor("green", "bin-recv: " + [r, "action", "msg", h.add, y.length].join(","), f)(), y.length > 0 ? (b = this.msgGetTarget(y[0]), Store.Msg.handle([{ | |
| meta: h, | |
| chat: b, | |
| msgs: y | |
| }])) : o.error("Wap:handle action msg before/after droppped to 0")() | |
| } else o.error("Wap:handle action msg before/after 0 msgs")(); | |
| break; | |
| default: | |
| o.error("Wap:handle action msg no meta.add", f)() | |
| } | |
| break; | |
| case "cmd": | |
| for (E = 0; S > E; E++) { | |
| var C = this.parseCmd(g[E]); | |
| if (C) { | |
| var A = _.values(C).join(","); | |
| o.logColor("green", "bin-recv: " + [r, "action", "cmd", A].join(","), f)(), Store.Cmd.handle([C], t) | |
| } else o.error("Wap:handle action cmd invalid", f)() | |
| } | |
| break; | |
| case "bcUpdate": | |
| var I = []; | |
| for (E = 0; S > E; E++) { | |
| var O = this.parseBCUpdate(g[E]); | |
| O ? I.push(O) : o.error("Wap:handle action bc update invalid", g[E])() | |
| } | |
| o.logColor("green", "bin-recv: " + [r, "action", "bcUpdate", I.length].join(","), f)(), I.length > 0 && Store.GroupMetadata.handle(I, t); | |
| break; | |
| case "ack": | |
| for (E = 0; S > E; E++) { | |
| var k = this.parseAck(g[E]); | |
| k ? (o.logColor("green", "bin-recv: " + [r, "action", "ack", k.to, k.id, k.ack].join(","), f)(), Store.Msg.handle([k], t)) : o.error("Wap:handle action ack invalid", f)() | |
| } | |
| break; | |
| case "contact": | |
| for (c = [], E = 0; S > E; E++) d = this.parseContact(g[E]), d ? c.push(d) : o.error("Wap:handle action contact dropped", g[E])(); | |
| if (o.logColor("green", "bin-recv: " + [r, "action", "contact", c.length, h.missing].join(","), f)(), c.length > 0) { | |
| var P = [c]; | |
| (h.missing || h.checksum) && P.push(h), Store.Contact.handle(P, t) | |
| } | |
| break; | |
| case "chat": | |
| for (l = [], E = 0; S > E; E++) u = this.parseChat(g[E]), u ? l.push(u) : o.error("Wap:handle action chat dropped", g[E])(); | |
| o.logColor("green", "bin-recv: " + [r, "action", "chat", l.length].join(","), f)(), l.length > 0 && Store.Chat.handle([l], t); | |
| break; | |
| case "battery": | |
| var R = this.parseBattery(g[0]); | |
| R ? (o.logColor("green", "bin-recv: " + [r, "action", "battery", R.battery, R.plugged].join(","), f)(), Store.Conn.handle([R], t)) : o.error("Wap:handle action battery dropped", g[0])(); | |
| break; | |
| case "mute": | |
| for (l = [], E = 0; S > E; E++) u = this.parseChat(g[E]), u ? l.push(u) : o.error("Wap:handle action mute dropped", g[E])(); | |
| o.logColor("green", "bin-recv: " + [r, "action", "mute", l.length].join(","), f)(), l.length > 0 && Store.Mute.handle(l, t); | |
| break; | |
| default: | |
| o.error("Wap:handle action unknown " + v, f)() | |
| } | |
| } | |
| } | |
| break; | |
| default: | |
| o.errorVerbose("TODO " + this.N.toString(f, !0), f)() | |
| } | |
| return !0 | |
| }, | |
| requestDeviceUploadLogs: function() { | |
| var e, t = this; | |
| return new Promise(function(r, n) { | |
| if (t.isRequestingDeviceUploadLogsMutex) return void r(); | |
| e = ++t.isRequestingDeviceUploadLogsMutex; | |
| var o = t.actionNode("debug", [ | |
| ["log", void 0, void 0] | |
| ]), | |
| i = r; | |
| i.drop = !0, a.send({ | |
| data: t.BinaryProtocol.write(o), | |
| onSend: i, | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "debug,log", | |
| debugObj: o, | |
| metric: t.M.DEBUG_LOG, | |
| ackRequest: !0 | |
| } | |
| }) | |
| })["finally"](function() { | |
| e === t.isRequestingDeviceUploadLogsMutex && (t.isRequestingDeviceUploadLogsMutex = 0) | |
| }) | |
| }, | |
| resyncMessages: function(e) { | |
| var t = this; | |
| return new d(function(r, n) { | |
| var i = function(e) { | |
| var n = [], | |
| i = t.BinaryProtocol.read(e), | |
| a = t.N.children(i); | |
| if (o.logColor("green", "bin-recv: response,resume", i)(), "response" === t.N.tag(i) && "resume" === t.N.attr("type", i) && _.isArray(a)) { | |
| var s, d = a.length; | |
| for (s = 0; d > s; s++) { | |
| var c = t.parseChat(a[s]); | |
| c && n.push(c) | |
| } | |
| } | |
| r({ | |
| checksum: t.N.attr("checksum", i), | |
| data: n | |
| }) | |
| }, | |
| s = e.map(function(e) { | |
| var t = { | |
| jid: e.wid, | |
| index: e.id, | |
| owner: e.fromMe, | |
| archive: (!!e.archive).toString() | |
| }; | |
| return e.mute && (t.mute = e.mute.toString()), e.active && (t.active = "true"), c.isGroup(e.wid) && (t.read_only = (!!e.isReadOnly).toString()), e.modifyTag && (t.modify_tag = e.modifyTag.toString()), e.unreadCount && (t.count = e.unreadCount.toString()), ["last", t, void 0] | |
| }), | |
| d = t.queryNode({ | |
| type: "resume" | |
| }, s); | |
| a.sendEphemeral({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: t.binWrap(i, r), | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "query,resume", | |
| debugObj: d, | |
| metric: t.M.QUERY_RESUME, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| resyncReceipts: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var i = function(e) { | |
| var n = [], | |
| i = t.BinaryProtocol.read(e), | |
| a = t.N.children(i); | |
| if (o.logColor("green", "bin-recv: response,receipt", i)(), "response" === t.N.tag(i) && "receipt" === t.N.attr("type", i) && _.isArray(a)) { | |
| var s, d, c, u = a.length; | |
| for (s = 0; u > s; s++) { | |
| d = a[s], c = t.N.children(d); | |
| var l = t.N.attr("jid", d), | |
| f = t.N.attr("t", d); | |
| if ("receipt" === t.N.tag(d) && l && f && _.isArray(c)) { | |
| var h, p = [], | |
| m = c.length; | |
| for (h = 0; m > h; h++) { | |
| var g = c[h]; | |
| if ("item" === t.N.tag(g)) { | |
| var v = t.N.attr("index", g), | |
| y = parseInt(t.N.attr("status", g), 10) || 0; | |
| v && 0 !== y && 4 >= y && p.push([v, !0, void 0, y]) | |
| } | |
| } | |
| p.length > 0 && n.push({ | |
| id: l, | |
| t: parseInt(f, 10), | |
| acks: p | |
| }) | |
| } | |
| } | |
| } | |
| r(n) | |
| }, | |
| s = e.map(function(e) { | |
| return ["last", { | |
| jid: e.remote, | |
| index: e.id, | |
| t: e.t.toString() | |
| }, void 0] | |
| }), | |
| d = t.queryNode({ | |
| type: "receipt" | |
| }, s); | |
| a.sendEphemeral({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: t.binWrap(i, r), | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "query,receipt", | |
| debugObj: d, | |
| metric: t.M.QUERY_RECEIPT, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| addParticipant: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var i = a.tag(), | |
| s = r.wrap(n); | |
| s.tag = i; | |
| var d = ["participant", { | |
| jid: t | |
| }, void 0], | |
| c = ["group", { | |
| id: i, | |
| jid: e, | |
| type: "add", | |
| author: Store.Conn.me | |
| }, | |
| [d] | |
| ], | |
| u = r.actionNode("set", [c]); | |
| a.send({ | |
| data: r.BinaryProtocol.write(u), | |
| onSend: s, | |
| onDrop: o, | |
| binaryOpts: { | |
| debugString: "action,group,add_participant", | |
| debugObj: u, | |
| metric: r.M.GROUP, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| changeSubject: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var i = a.tag(), | |
| s = r.wrap(n); | |
| s.tag = i; | |
| var d = ["group", { | |
| id: i, | |
| jid: e, | |
| type: "subject", | |
| author: Store.Conn.me, | |
| subject: t | |
| }, void 0], | |
| c = r.actionNode("set", [d]); | |
| a.send({ | |
| data: r.BinaryProtocol.write(c), | |
| onSend: s, | |
| onDrop: o, | |
| binaryOpts: { | |
| debugString: "action,group,subject", | |
| debugObj: c, | |
| metric: r.M.GROUP, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| createGroup: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, i) { | |
| var s = a.tag(), | |
| d = r.wrap(n); | |
| d.tag = s; | |
| var c = t.map(function(e) { | |
| return ["participant", { | |
| jid: e | |
| }, void 0] | |
| }); | |
| o.log("create group tag", s)(); | |
| var u = ["group", { | |
| id: s, | |
| type: "create", | |
| author: Store.Conn.me, | |
| subject: e | |
| }, c], | |
| l = r.actionNode("set", [u]); | |
| a.send({ | |
| data: r.BinaryProtocol.write(l), | |
| onSend: d, | |
| onDrop: i, | |
| binaryOpts: { | |
| debugString: "action,group,create", | |
| debugObj: l, | |
| metric: r.M.GROUP, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| leaveGroup: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = a.tag(), | |
| i = t.wrap(r); | |
| i.tag = o; | |
| var s = ["group", { | |
| id: o, | |
| jid: e, | |
| type: "leave", | |
| author: Store.Conn.me | |
| }, void 0], | |
| d = t.actionNode("set", [s]); | |
| a.send({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: i, | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "action,group,delete", | |
| debugObj: d, | |
| metric: t.M.GROUP, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| removeParticipant: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var i = a.tag(), | |
| s = r.wrap(n); | |
| s.tag = i; | |
| var d = ["participant", { | |
| jid: t | |
| }, void 0], | |
| c = ["group", { | |
| id: i, | |
| jid: e, | |
| type: "remove", | |
| author: Store.Conn.me | |
| }, | |
| [d] | |
| ], | |
| u = r.actionNode("set", [c]); | |
| a.send({ | |
| data: r.BinaryProtocol.write(u), | |
| onSend: s, | |
| onDrop: o, | |
| binaryOpts: { | |
| debugString: "action,group,rem_participant", | |
| debugObj: u, | |
| metric: r.M.GROUP, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| requestMediaReupload: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var i = e.id, | |
| s = function(e) { | |
| var n, i = t.BinaryProtocol.read(e); | |
| if ("response" === t.N.tag(i) && "media" === t.N.attr("type", i)) { | |
| var a = parseInt(t.N.attr("code", i)) || 400, | |
| s = t.N.attr("url", i); | |
| a >= 500 && 502 !== a ? (o.error("wap:requestMediaReupload:error " + a)(), n = { | |
| status: a | |
| }) : 200 === a && s ? n = { | |
| status: 200, | |
| url: s, | |
| mediaKey: t.N.attr("media_key", i) | |
| } : 200 !== a || s ? (o.error("wap:requestMediaReupload:error " + a)(), n = { | |
| status: a | |
| }) : n = { | |
| status: 400 | |
| } | |
| } else o.error("wap:requestMediaReupload:malformed")(), n = { | |
| status: 400 | |
| }; | |
| r(n) | |
| }, | |
| d = i, | |
| c = t.queryNode({ | |
| type: "media", | |
| index: d.id, | |
| jid: d.remote, | |
| owner: d.fromMe.toString() | |
| }, void 0); | |
| a.sendEphemeral({ | |
| data: t.BinaryProtocol.write(c), | |
| onSend: t.binWrap(s, r), | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "query,media", | |
| debugObj: c, | |
| metric: t.M.QUERY_MEDIA, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationSeen: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(o, i) { | |
| var s = o, | |
| d = n.actionNode("set", [ | |
| ["read", { | |
| jid: e, | |
| index: t ? t.id : void 0, | |
| owner: t ? t.fromMe.toString() : void 0, | |
| count: r && t ? r.toString() : void 0 | |
| }, void 0] | |
| ]); | |
| a.sendEphemeral({ | |
| data: n.BinaryProtocol.write(d), | |
| onSend: s, | |
| onDrop: i, | |
| binaryOpts: { | |
| debugString: "action,chat,read, " + JSON.stringify(t) + ", " + r, | |
| debugObj: d, | |
| metric: n.M.READ, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationDelete: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = r, | |
| i = t.actionNode("set", [ | |
| ["chat", { | |
| type: "delete", | |
| jid: e | |
| }, void 0] | |
| ]); | |
| a.send({ | |
| data: t.BinaryProtocol.write(i), | |
| onSend: o, | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "action,chat,delete", | |
| debugObj: i, | |
| metric: t.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationArchive: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var i = n, | |
| s = t ? "archive" : "unarchive", | |
| d = r.actionNode("set", [ | |
| ["chat", { | |
| type: s, | |
| jid: e | |
| }, void 0] | |
| ]); | |
| a.send({ | |
| data: r.BinaryProtocol.write(d), | |
| onSend: i, | |
| onDrop: o, | |
| binaryOpts: { | |
| debugString: "action,chat, " + s, | |
| debugObj: d, | |
| metric: r.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationMute: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var i = n, | |
| s = t ? t.toString() : void 0, | |
| d = r.actionNode("set", [ | |
| ["chat", { | |
| type: "mute", | |
| mute: s, | |
| jid: e | |
| }, void 0] | |
| ]); | |
| a.send({ | |
| data: r.BinaryProtocol.write(d), | |
| onSend: i, | |
| onDrop: o, | |
| binaryOpts: { | |
| debugString: "action,chat, " + e + ", " + (s ? "mute, " + s : "unmute"), | |
| debugObj: d, | |
| metric: r.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendMessagePlayed: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = r, | |
| i = e.remote, | |
| s = e.id, | |
| d = t.actionNode("set", [ | |
| ["received", { | |
| type: "played", | |
| index: s, | |
| from: i | |
| }, void 0] | |
| ]); | |
| a.send({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: o, | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "action,played, " + i + "_" + s, | |
| debugObj: d, | |
| metric: t.M.RECEIVED, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| profilePicFindThumbFromPhone: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var i = function(i) { | |
| var a = r.BinaryProtocol.read(i); | |
| "response" === r.N.tag(a) && "preview" === r.N.attr("type", a) || o(); | |
| var s = r.N.children(a), | |
| d = s && s[0]; | |
| if (d || o(), "missing" === r.N.attr("type", d)) n({ | |
| id: e, | |
| tag: void 0, | |
| raw: void 0 | |
| }); | |
| else { | |
| var c, u = r.N.attr("id", d); | |
| if (t && u === t.tag && t.raw) c = t.raw; | |
| else { | |
| var l = r.N.children(d); | |
| c = l ? l.toBase64() : void 0 | |
| } | |
| n({ | |
| id: e, | |
| tag: u, | |
| raw: c | |
| }) | |
| } | |
| }, | |
| s = { | |
| type: "preview", | |
| jid: e | |
| }; | |
| t && t.tag && (s.id = t.tag); | |
| var d = r.queryNode(s, []); | |
| a.sendEphemeral({ | |
| data: r.BinaryProtocol.write(d), | |
| onSend: r.binWrap(i, n), | |
| onDrop: o, | |
| binaryOpts: { | |
| debugString: "query,thumb, " + e, | |
| debugObj: d, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| groupMetadataFindFromPhone: function(e, t) { | |
| var r = this; | |
| return new Promise(function(t, n) { | |
| var o = function(n) { | |
| var o = r.BinaryProtocol.read(n); | |
| if ("response" !== r.N.tag(o) || "group" !== r.N.attr("type", o)) return void t({ | |
| status: "error", | |
| info: "bad format: response incorrect" | |
| }); | |
| var i = r.N.children(o), | |
| a = i && i[0]; | |
| if (!a) return void t({ | |
| status: "error", | |
| info: "bad format: no group node" | |
| }); | |
| if ("missing" === r.N.attr("type")) return void t({ | |
| status: "missing" | |
| }); | |
| var s = _.map(r.N.children(a), function(e) { | |
| return { | |
| id: r.N.attr("jid", e), | |
| isAdmin: "admin" === r.N.attr("type", e) | |
| } | |
| }); | |
| t({ | |
| status: "ok", | |
| data: { | |
| id: e, | |
| owner: r.N.attr("creator", a), | |
| creation: parseInt(r.N.attr("create", a), 10) || void 0, | |
| participants: s, | |
| stale: !1 | |
| } | |
| }) | |
| }, | |
| i = r.queryNode({ | |
| type: "group", | |
| jid: e | |
| }, []); | |
| a.sendEphemeral({ | |
| data: r.BinaryProtocol.write(i), | |
| onSend: r.binWrap(o, t), | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "query,group, " + e, | |
| debugObj: i, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendPresenceUpdate: function(e) { | |
| var t = this; | |
| return ["available", "unavailable"].indexOf(e) > -1 ? new Promise(function(r, n) { | |
| var o = r, | |
| i = t.actionNode("set", [ | |
| ["presence", { | |
| type: e | |
| }, void 0] | |
| ]), | |
| s = { | |
| data: t.BinaryProtocol.write(i), | |
| onSend: o, | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "action,presence, " + e, | |
| debugObj: i, | |
| metric: t.M.PRESENCE, | |
| available: "available" === e, | |
| ackRequest: "available" === e | |
| } | |
| }; | |
| "available" === e ? a.sendEphemeral(s) : a.sendEphemeralIgnore(s) | |
| }) : void 0 | |
| }, | |
| sendChatstateUpdate: function(e, t) { | |
| var r = this; | |
| return ["composing", "paused", "recording"].indexOf(e) > -1 ? new Promise(function(n, o) { | |
| var i = n, | |
| s = r.actionNode("set", [ | |
| ["presence", { | |
| type: e, | |
| to: t | |
| }, void 0] | |
| ]); | |
| a.sendEphemeralIgnore({ | |
| data: r.BinaryProtocol.write(s), | |
| onSend: i, | |
| onDrop: o, | |
| binaryOpts: { | |
| debugString: "action,chatstate, " + e, | |
| debugObj: s, | |
| metric: r.M.PRESENCE, | |
| skipOffline: !0, | |
| ackRequest: !1 | |
| } | |
| }, !0) | |
| }) : void 0 | |
| }, | |
| sendSetPicture: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(o, i) { | |
| var d = u.parseDataURL(t).data, | |
| c = u.parseDataURL(r).data, | |
| l = s.fromBase64(d, !1), | |
| f = s.fromBase64(c, !1), | |
| h = a.tag(), | |
| p = n.wrap(o); | |
| p.tag = h; | |
| var m = ["picture", { | |
| id: h, | |
| jid: e, | |
| type: "set" | |
| }, | |
| [ | |
| ["image", void 0, f], | |
| ["preview", void 0, l] | |
| ] | |
| ], | |
| g = n.actionNode("set", [m]); | |
| a.send({ | |
| data: n.BinaryProtocol.write(g), | |
| onSend: p, | |
| onDrop: i, | |
| binaryOpts: { | |
| debugString: "action,set_pic, " + e, | |
| debugObj: g, | |
| metric: n.M.PIC, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| deletePicture: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = a.tag(), | |
| i = t.wrap(r); | |
| i.tag = o; | |
| var s = ["picture", { | |
| id: o, | |
| jid: e, | |
| type: "delete" | |
| }, void 0], | |
| d = t.actionNode("set", [s]); | |
| a.send({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: i, | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "action,delete_pic, " + e, | |
| debugObj: d, | |
| metric: t.M.PIC, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendSetStatus: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = a.tag(), | |
| i = t.wrap(r); | |
| i.tag = o; | |
| var s = t.actionNode("set", [ | |
| ["status", void 0, e] | |
| ]); | |
| a.send({ | |
| data: t.BinaryProtocol.write(s), | |
| onSend: i, | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "action,status,set", | |
| debugObj: s, | |
| metric: t.M.STATUS, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| chatFindQuery: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = function(e) { | |
| var n = [], | |
| o = t.BinaryProtocol.read(e), | |
| i = t.N.children(o); | |
| if ("response" === t.N.tag(o) && "chat" === t.N.attr("type", o)) | |
| if ("true" === t.N.attr("duplicate", o)) n = "preempted"; | |
| else if (_.isArray(i)) { | |
| var a, s = i.length; | |
| for (a = 0; s > a; a++) { | |
| var d = t.parseChat(i[a]); | |
| d && n.push(d) | |
| } | |
| } | |
| r(n) | |
| }, | |
| i = t.queryNode({ | |
| type: "chat", | |
| kind: e ? "retry" : void 0 | |
| }, void 0); | |
| a.sendEphemeral({ | |
| data: t.BinaryProtocol.write(i), | |
| onSend: t.binWrap(o, r), | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "query,chat, " + e, | |
| debugObj: i, | |
| metric: t.M.QUERY_CHAT, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| contactFindQuery: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = function(e) { | |
| var n = [], | |
| o = t.BinaryProtocol.read(e), | |
| i = t.N.children(o); | |
| if ("response" === t.N.tag(o) && "contacts" === t.N.attr("type", o)) | |
| if ("true" === t.N.attr("duplicate", o)) n = "preempted"; | |
| else if (_.isArray(i)) { | |
| var a, s = i.length; | |
| for (a = 0; s > a; a++) { | |
| var d = t.parseContact(i[a]); | |
| d && n.push(d) | |
| } | |
| } | |
| r({ | |
| checksum: t.N.attr("checksum", o), | |
| data: n | |
| }) | |
| }, | |
| i = t.queryNode({ | |
| type: "contacts", | |
| kind: e ? "retry" : void 0 | |
| }, void 0); | |
| a.send({ | |
| data: t.BinaryProtocol.write(i), | |
| onSend: t.binWrap(o, r), | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "query,contacts, " + e, | |
| debugObj: i, | |
| metric: t.M.QUERY_CONTACTS, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| msgCreateRecord: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, i) { | |
| var d, c, u = e.id; | |
| if ("chat" === e.type) c = Promise.resolve(["message", { | |
| type: "text", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["body", void 0, e.body] | |
| ] | |
| ]); | |
| else if ("location" === e.type) d = e.body ? s.fromBase64(e.body, !1) : void 0, c = Promise.resolve(["message", { | |
| type: "media", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["media", { | |
| type: "location", | |
| latitude: e.lat || void 0, | |
| longitude: e.lng || void 0, | |
| name: e.loc && e.url ? e.loc : void 0, | |
| url: e.loc && e.url ? e.url : void 0, | |
| encoding: e.body ? "raw" : void 0 | |
| }, d] | |
| ] | |
| ]); | |
| else if ("vcard" === e.type) { | |
| var l = ["vcard", { | |
| name: e.subtype | |
| }, e.body]; | |
| c = Promise.resolve(["message", { | |
| type: "media", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["media", { | |
| type: "vcard" | |
| }, | |
| [l] | |
| ] | |
| ] | |
| ]) | |
| } else { | |
| var h = e.mediaKey; | |
| d = e.body ? s.fromBase64(e.body, !1) : void 0, c = (t && !h ? r.sendMedia(e.avparams) : Promise.resolve(_.merge({ | |
| status: 200 | |
| }, e.avparams))).then(function(t) { | |
| return 200 === t.status ? Promise.resolve(["message", { | |
| type: "media", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["media", { | |
| encoding: e.body ? "raw" : void 0, | |
| origin: "ptt" === e.type ? "live" : void 0, | |
| seconds: "ptt" === e.type && e.duration ? e.duration.toString() : void 0, | |
| type: t.type, | |
| mimetype: e.mimetype || t.mimetype || void 0, | |
| size: e.size ? e.size.toString() : void 0, | |
| filehash: t.filehash, | |
| url: t.url, | |
| duration: t.duration ? t.duration.toString() : void 0, | |
| vcodec: t.vcodec || void 0, | |
| width: t.width ? t.width.toString() : void 0, | |
| height: t.height ? t.height.toString() : void 0, | |
| fps: t.fps ? t.fps.toString() : void 0, | |
| vbitrate: t.vbitrate ? t.vbitrate.toString() : void 0, | |
| acodec: t.acodec || void 0, | |
| asampfreq: t.asampfreq ? t.asampfreq.toString() : void 0, | |
| asampfmt: t.asampfmt || void 0, | |
| abitrate: t.abitrate ? t.abitrate.toString() : void 0, | |
| caption: "video" !== e.type && "image" !== e.type || !e.caption ? void 0 : e.caption, | |
| page_count: "number" != typeof e.pageCount || isNaN(e.pageCount) ? void 0 : e.pageCount.toString(), | |
| media_key: h, | |
| filename: t.filename | |
| }, d] | |
| ] | |
| ]) : (o.error("wap:msgCreateRecord:sendMedia error " + t.status)(), Promise.reject()) | |
| })["catch"](function() { | |
| return o.error("wap:msgCreateRecord:sendMedia dropped")(), Promise.reject() | |
| }) | |
| } | |
| c.then(function(t) { | |
| var o = r.actionNode("relay", [t]), | |
| s = r.wrap(n); | |
| s.tag = u, s.meta = { | |
| type: "message", | |
| key: new f(e.from, e.to, e.id) | |
| }, a.send({ | |
| data: r.BinaryProtocol.write(o), | |
| onSend: s, | |
| onDrop: i, | |
| binaryOpts: { | |
| debugString: "action,message, " + e.type, | |
| debugObj: o, | |
| metric: r.M.MESSAGE, | |
| ackRequest: !1 | |
| } | |
| }) | |
| })["catch"](function() { | |
| o.error("wap:msgCreateRecord mPromise error")(), i() | |
| }) | |
| }) | |
| }, | |
| msgFindQuery: function(e, t) { | |
| var r = this; | |
| return "before" !== e ? Promise.reject("wap:msgFindQuery:unsupported:" + e) : new Promise(function(e, n) { | |
| var o = function(t) { | |
| var n = [], | |
| o = r.BinaryProtocol.read(t), | |
| i = r.N.children(o); | |
| if ("response" === r.N.tag(o) && "message" === r.N.attr("type", o) && _.isArray(i)) { | |
| var a, s = i.length; | |
| for (a = 0; s > a; a++) { | |
| var d = r.parseMsg(i[a], "response"); | |
| d && n.push(d) | |
| } | |
| } | |
| e(n) | |
| }, | |
| i = r.queryNode({ | |
| type: "message", | |
| jid: t.remote, | |
| count: t.count.toString(), | |
| index: t.id, | |
| owner: "undefined" == typeof t.fromMe ? void 0 : t.fromMe.toString() | |
| }, void 0); | |
| a.sendEphemeral({ | |
| data: r.BinaryProtocol.write(i), | |
| onSend: r.binWrap(o, e), | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "query,message, " + t.remote + "_" + t.id + "_" + t.fromMe + "_" + t.count, | |
| debugObj: i, | |
| metric: r.M.QUERY_MESSAGES, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| presenceSubscribe: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = r, | |
| i = t.actionNode("set", [ | |
| ["presence", { | |
| type: "subscribe", | |
| to: e | |
| }, void 0] | |
| ]); | |
| a.sendEphemeral({ | |
| data: t.BinaryProtocol.write(i), | |
| onSend: o, | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "action,presence,subscribe, " + e, | |
| debugObj: i, | |
| metric: t.M.PRESENCE_SUBSCRIBE, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendMedia: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = _.clone(e), | |
| i = function(e) { | |
| r(_.merge(o, e)) | |
| }; | |
| a.send({ | |
| data: ["query", "sendMedia", o.url], | |
| onSend: t.wrap02(i), | |
| onDrop: n | |
| }) | |
| }) | |
| } | |
| }; | |
| e.exports = h | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(1), | |
| o = r(18), | |
| i = r(10), | |
| a = r(7), | |
| s = r(34), | |
| d = r(19), | |
| c = r(51), | |
| u = r(55), | |
| l = r(94), | |
| f = r(155), | |
| h = { | |
| BinaryProtocol: null, | |
| N: null, | |
| M: { | |
| DEBUG_LOG: 1, | |
| QUERY_RESUME: 2, | |
| QUERY_RECEIPT: 3, | |
| QUERY_MEDIA: 4, | |
| QUERY_CHAT: 5, | |
| QUERY_CONTACTS: 6, | |
| QUERY_MESSAGES: 7, | |
| PRESENCE: 8, | |
| PRESENCE_SUBSCRIBE: 9, | |
| GROUP: 10, | |
| READ: 11, | |
| CHAT: 12, | |
| RECEIVED: 13, | |
| PIC: 14, | |
| STATUS: 15, | |
| MESSAGE: 16, | |
| QUERY_ACTIONS: 17, | |
| BLOCK: 18, | |
| QUERY_GROUP: 19, | |
| QUERY_PREVIEW: 20 | |
| }, | |
| epochCount: 0, | |
| epoch: 0, | |
| isRequestingDeviceUploadLogsMutex: 0, | |
| epochSend: function(e) { | |
| return 0 === this.epochCount && this.epoch++, e || this.epochCount++, n.log("wap:epochCount: " + this.epochCount + " epoch: " + this.epoch)(), this.epoch.toString() | |
| }, | |
| epochRecv: function() { | |
| this.epochCount > 0 ? this.epochCount-- : n.error("wap:epochRecv: NEGATIVE")(), n.log("wap:epochCount: " + this.epochCount + " epoch: " + this.epoch)() | |
| }, | |
| wrap: function(e) { | |
| var t = this; | |
| return function(r) { | |
| return r && "number" == typeof r.status && r.status >= 500 ? r : (t.epochRecv(), void e(r)) | |
| } | |
| }, | |
| binWrap: function(e, t) { | |
| var r = this; | |
| return function(n) { | |
| if ("object" == typeof n && "number" == typeof n.status) { | |
| if (401 === n.status) throw r.epochRecv(), new o.E401; | |
| if (n.status >= 500) return n; | |
| r.epochRecv(), t(n) | |
| } else r.epochRecv(), e(n) | |
| } | |
| }, | |
| actionNode: function(e, t, r) { | |
| return ["action", { | |
| type: e, | |
| epoch: this.epochSend(r) | |
| }, t] | |
| }, | |
| queryNode: function(e, t) { | |
| return e.epoch = this.epochSend(), ["query", e, t] | |
| }, | |
| parseMsgMessage: function(e, t) { | |
| if ("message" === this.N.tag(e)) { | |
| var r; | |
| this.N.attr("from", e) !== Store.Conn.me || this.N.attr("to", e) ? this.N.attr("to", e) !== Store.Conn.me || this.N.attr("from", e) || (r = "out") : r = "in"; | |
| var o, i = this.N.attr("id", e), | |
| a = parseInt(this.N.attr("t", e), 10) || 0, | |
| s = this.N.attr("to", e) || Store.Conn.me, | |
| d = this.N.attr("from", e) || Store.Conn.me, | |
| c = "broadcast" === d.split("@")[1], | |
| u = this.N.attr("participant", e), | |
| l = c ? u : d, | |
| f = c ? void 0 : u, | |
| h = c ? !1 : this.N.child("broadcast", e) && d === Store.Conn.me, | |
| p = "invis" === this.N.attr("web", e), | |
| m = this.N.attr("notify", e) || "", | |
| g = parseInt(this.N.attr("status", e)) || 0, | |
| v = [], | |
| y = this.N.child("broadcast", e); | |
| if ("broadcast" !== s) { | |
| switch (t) { | |
| case "fresh": | |
| o = 1; | |
| break; | |
| default: | |
| o = g >= -1 && 4 >= g ? g : 1 | |
| } | |
| if (_.isArray(y)) { | |
| var b, w = y.length; | |
| for (b = 0; w > b; b++) { | |
| var E = y[b], | |
| S = this.N.attr("jid", E); | |
| "to" === this.N.tag(E) && S && v.push(S) | |
| } | |
| } | |
| var N, T = [], | |
| $ = this.N.attr("type", e); | |
| switch ($) { | |
| case "ciphertext": | |
| case "text": | |
| var C = this.N.dataStr(this.N.child("body", e)) || ""; | |
| N = { | |
| id: i, | |
| body: "text" === $ ? C : void 0, | |
| type: "text" === $ ? "chat" : "ciphertext", | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| invis: p, | |
| ack: o, | |
| broadcast: h, | |
| recipients: v | |
| }, T = [!i, !a, !l, !s]; | |
| break; | |
| case "media": | |
| var A, I, O, k, P, R = this.N.child("media", e), | |
| M = this.N.attr("type", R), | |
| L = this.N.attr("media_key", R), | |
| D = this.N.attr("mimetype", R); | |
| if ("retry" === this.N.attr("reason", R)) return; | |
| switch (M) { | |
| case "image": | |
| case "video": | |
| var U = this.N.attr("caption", R); | |
| A = this.thumbFromMediaXml(R), I = this.N.attr("url", R), I = _.isString(I) && I.indexOf("/u/") > 0 ? void 0 : I, O = this.N.attr("filehash", R), k = parseInt(this.N.attr("size", R), 10) || 0, P = this.N.attr("seconds", R), N = { | |
| id: i, | |
| body: A, | |
| type: M, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| invis: p, | |
| ack: o, | |
| clientUrl: I, | |
| duration: P, | |
| broadcast: h, | |
| recipients: v, | |
| filehash: O, | |
| size: k, | |
| caption: U, | |
| mediaKey: L, | |
| mimetype: D | |
| }, T = [!i, !a, !l, !s]; | |
| break; | |
| case "location": | |
| var B = this.N.attr("latitude", R), | |
| x = this.N.attr("longitude", R), | |
| j = this.N.attr("name", R); | |
| A = this.thumbFromMediaXml(R), I = this.N.attr("url", R), N = { | |
| id: i, | |
| body: A, | |
| type: M, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| invis: p, | |
| ack: o, | |
| clientUrl: I, | |
| loc: j, | |
| lat: B, | |
| lng: x, | |
| broadcast: h, | |
| recipients: v | |
| }, T = [!i, !a, !l, !s, !B || !x]; | |
| break; | |
| case "audio": | |
| var W = "live" === this.N.attr("origin", R) ? "ptt" : M; | |
| I = this.N.attr("url", R), I = _.isString(I) && I.indexOf("/u/") > 0 ? void 0 : I, O = this.N.attr("filehash", R), k = parseInt(this.N.attr("size", R), 10) || 0, P = this.N.attr("seconds", R), N = { | |
| id: i, | |
| type: W, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| invis: p, | |
| ack: o, | |
| clientUrl: I, | |
| duration: P, | |
| broadcast: h, | |
| recipients: v, | |
| filehash: O, | |
| size: k, | |
| mediaKey: L, | |
| mimetype: D | |
| }, T = [!i, !a, !l, !s]; | |
| break; | |
| case "vcard": | |
| var Y = this.N.child("vcard", R), | |
| F = this.N.dataStr(Y), | |
| G = this.N.attr("name", Y); | |
| N = { | |
| id: i, | |
| body: F, | |
| type: M, | |
| subtype: G, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| invis: p, | |
| ack: o, | |
| broadcast: h, | |
| recipients: v | |
| }, T = [!i, !a, !l, !s, !F, !G]; | |
| break; | |
| default: | |
| n.error("wap:parseMsgMessage unknown media type: " + this.N.toString(e), e)() | |
| } | |
| break; | |
| default: | |
| n.error("wap:parseMsgMessage unknown message type: " + this.N.toString(e), e)() | |
| } | |
| return this.dropIfConditionMet(T, N) | |
| } | |
| } | |
| }, | |
| parseMsgGp2: function(e) { | |
| if ("groups_v2" === this.N.tag(e)) { | |
| var t, r = parseInt(this.N.attr("t", e), 10) || 0, | |
| n = this.N.attr("id", e), | |
| o = this.N.attr("jid", e), | |
| i = "invis" === this.N.attr("web", e), | |
| a = this.N.attr("type", e), | |
| s = this.N.attr("author", e), | |
| d = this.N.children(e), | |
| c = []; | |
| switch (a) { | |
| case "create": | |
| t = this.N.attr("subject", e); | |
| break; | |
| case "subject": | |
| t = this.N.attr("subject", e); | |
| break; | |
| case "picture": | |
| t = this.N.attr("picture", e) | |
| } | |
| if (_.isArray(d)) { | |
| var u, l = d.length; | |
| for (u = 0; l > u; u++) { | |
| var f = d[u], | |
| h = this.N.attr("jid", f); | |
| "participant" === this.N.tag(f) && h && c.push(h) | |
| } | |
| } | |
| var p = { | |
| t: r, | |
| id: n, | |
| to: o, | |
| from: o, | |
| author: s, | |
| body: t ? t.toString() : void 0, | |
| type: "gp2", | |
| subtype: a, | |
| invis: i, | |
| recipients: c | |
| }, | |
| m = [!n, !r, "subject" !== a && "add" !== a && "remove" !== a && "leave" !== a && "picture" !== a && "modify" !== a && "create" !== a && "delete" !== a && "promote" !== a && "demote" !== a, "subject" === a && !t, ("add" === a || "remove" === a || "leave" === a || "promote" === a || "demote" === a || "modify" === a) && 0 === c.length, !o, "string" == typeof o && "g.us" !== o.split("@")[1]]; | |
| return this.dropIfConditionMet(m, p) | |
| } | |
| }, | |
| setGroupParticipant: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(o, a) { | |
| var s = i.tag(), | |
| d = n.wrap(o), | |
| c = ["participant", { | |
| jid: r | |
| }, void 0], | |
| u = ["group", { | |
| id: s, | |
| jid: t, | |
| type: e, | |
| author: Store.Conn.me | |
| }, | |
| [c] | |
| ], | |
| l = n.actionNode("set", [u]); | |
| i.send({ | |
| tag: s, | |
| data: n.BinaryProtocol.write(l), | |
| clientCacheable: !0, | |
| onSend: d, | |
| onDrop: n.wrap(a), | |
| binaryOpts: { | |
| debugString: "action,group,participant," + [e, t, r].join(","), | |
| debugObj: l, | |
| metric: n.M.GROUP, | |
| ackRequest: !1, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| "delete": function() { | |
| this.epochCount = 0, this.epoch = 0 | |
| }, | |
| error2412: function() { | |
| this.epochRecv() | |
| }, | |
| setSubProtocol: function(e) { | |
| 4 === e ? (this.BinaryProtocol = new u("04"), this.N = this.BinaryProtocol.Node) : (n.error("Wap:setSubProtocol unknown " + e)(), this.BinaryProtocol = new u("04"), this.N = this.BinaryProtocol.Node) | |
| }, | |
| requestDeviceUploadLogs: function() { | |
| var e, t = this; | |
| return new Promise(function(r, n) { | |
| if (t.isRequestingDeviceUploadLogsMutex) return void r(); | |
| e = ++t.isRequestingDeviceUploadLogsMutex; | |
| var o = t.actionNode("debug", [ | |
| ["log", void 0, void 0] | |
| ]), | |
| a = t.wrap(r); | |
| a.drop = !0, i.send({ | |
| data: t.BinaryProtocol.write(o), | |
| clientCacheable: !0, | |
| onSend: a, | |
| onDrop: n, | |
| binaryOpts: { | |
| debugString: "debug,log", | |
| debugObj: o, | |
| metric: t.M.DEBUG_LOG, | |
| ackRequest: !0 | |
| } | |
| }) | |
| })["finally"](function() { | |
| e === t.isRequestingDeviceUploadLogsMutex && (t.isRequestingDeviceUploadLogsMutex = 0) | |
| }) | |
| }, | |
| resyncMessages: function(e) { | |
| var t = this; | |
| return new s(function(r, o) { | |
| var a = function(e) { | |
| var o = [], | |
| i = t.BinaryProtocol.read(e), | |
| a = t.N.children(i); | |
| if (n.logColor("green", "bin-recv: response,resume", i)(), "response" === t.N.tag(i) && "resume" === t.N.attr("type", i) && _.isArray(a)) { | |
| var s, d = a.length; | |
| for (s = 0; d > s; s++) { | |
| var c = t.parseChat(a[s]); | |
| c && o.push(c) | |
| } | |
| } | |
| r({ | |
| checksum: t.N.attr("checksum", i), | |
| data: o | |
| }) | |
| }, | |
| s = e.map(function(e) { | |
| var t = { | |
| jid: e.wid, | |
| index: e.id, | |
| owner: e.fromMe, | |
| archive: (!!e.archive).toString() | |
| }; | |
| return e.mute && (t.mute = e.mute.toString()), e.active && (t.active = "true"), | |
| d.isGroup(e.wid) && (t.read_only = (!!e.isReadOnly).toString()), e.modifyTag && (t.modify_tag = e.modifyTag.toString()), e.unreadCount && (t.count = e.unreadCount.toString()), ["last", t, void 0] | |
| }), | |
| c = t.queryNode({ | |
| type: "resume" | |
| }, s); | |
| i.sendEphemeral({ | |
| data: t.BinaryProtocol.write(c), | |
| onSend: t.binWrap(a, r), | |
| onDrop: t.wrap(o), | |
| binaryOpts: { | |
| debugString: "query,resume", | |
| debugObj: c, | |
| metric: t.M.QUERY_RESUME, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| resyncReceipts: function(e) { | |
| var t = this; | |
| return new Promise(function(r, o) { | |
| var a = function(e) { | |
| var o = [], | |
| i = t.BinaryProtocol.read(e), | |
| a = t.N.children(i); | |
| if (n.logColor("green", "bin-recv: response,receipt", i)(), "response" === t.N.tag(i) && "receipt" === t.N.attr("type", i) && _.isArray(a)) { | |
| var s, d, c, u = a.length; | |
| for (s = 0; u > s; s++) { | |
| d = a[s], c = t.N.children(d); | |
| var l = t.N.attr("jid", d), | |
| f = t.N.attr("t", d); | |
| if ("receipt" === t.N.tag(d) && l && f && _.isArray(c)) { | |
| var h, p = [], | |
| m = c.length; | |
| for (h = 0; m > h; h++) { | |
| var g = c[h]; | |
| if ("item" === t.N.tag(g)) { | |
| var v = t.N.attr("index", g), | |
| y = parseInt(t.N.attr("status", g), 10) || 0; | |
| v && 0 !== y && 4 >= y && p.push([v, !0, void 0, y]) | |
| } | |
| } | |
| p.length > 0 && o.push({ | |
| id: l, | |
| t: parseInt(f, 10), | |
| acks: p | |
| }) | |
| } | |
| } | |
| } | |
| r(o) | |
| }, | |
| s = e.map(function(e) { | |
| return ["last", { | |
| jid: e.remote, | |
| index: e.id, | |
| t: e.t.toString() | |
| }, void 0] | |
| }), | |
| d = t.queryNode({ | |
| type: "receipt" | |
| }, s); | |
| i.sendEphemeral({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: t.binWrap(a, r), | |
| onDrop: t.wrap(o), | |
| binaryOpts: { | |
| debugString: "query,receipt", | |
| debugObj: d, | |
| metric: t.M.QUERY_RECEIPT, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| queryReceivedActions: function(e) { | |
| var t = this; | |
| return new Promise(function(r, o) { | |
| var a = function(e) { | |
| var o = [], | |
| i = t.BinaryProtocol.read(e), | |
| a = t.N.children(i); | |
| if (n.logColor("green", "bin-recv: response,actions", i)(), "response" === t.N.tag(i) && "action" === t.N.attr("type", i)) | |
| if (_.isArray(a)) { | |
| var s, d = a.length; | |
| for (s = 0; d > s; s++) { | |
| var c = a[s], | |
| u = t.N.attr("id", c), | |
| l = parseInt(t.N.attr("code", c), 10) || 0; | |
| "item" === t.N.tag(c) && u && 0 !== l && o.push({ | |
| id: u, | |
| code: l | |
| }) | |
| } | |
| } else "true" === t.N.attr("replaced", i) && (o = "replaced"); | |
| r(o) | |
| }, | |
| s = e.map(function(e) { | |
| return ["item", { | |
| id: e | |
| }, void 0] | |
| }), | |
| d = t.queryNode({ | |
| type: "action" | |
| }, s); | |
| i.sendEphemeral({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: t.binWrap(a, r), | |
| onDrop: t.wrap(o), | |
| binaryOpts: { | |
| debugString: "query,actions", | |
| debugObj: d, | |
| metric: t.M.QUERY_ACTIONS, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| changeSubject: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var a = i.tag(), | |
| s = r.wrap(n); | |
| s.tag = a; | |
| var d = ["group", { | |
| id: a, | |
| jid: e, | |
| type: "subject", | |
| author: Store.Conn.me, | |
| subject: t | |
| }, void 0], | |
| c = r.actionNode("set", [d]); | |
| i.send({ | |
| data: r.BinaryProtocol.write(c), | |
| clientCacheable: !0, | |
| onSend: s, | |
| onDrop: r.wrap(o), | |
| binaryOpts: { | |
| debugString: "action,group,subject", | |
| debugObj: c, | |
| metric: r.M.GROUP, | |
| ackRequest: !1, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| createGroup: function(e, t) { | |
| var r = this; | |
| return new Promise(function(o, a) { | |
| var s = i.tag(), | |
| d = r.wrap(o); | |
| d.tag = s; | |
| var c = t.map(function(e) { | |
| return ["participant", { | |
| jid: e | |
| }, void 0] | |
| }); | |
| n.log("create group tag", s)(); | |
| var u = ["group", { | |
| id: s, | |
| type: "create", | |
| author: Store.Conn.me, | |
| subject: e | |
| }, c], | |
| l = r.actionNode("set", [u]); | |
| i.send({ | |
| data: r.BinaryProtocol.write(l), | |
| clientCacheable: !0, | |
| onSend: d, | |
| onDrop: r.wrap(a), | |
| binaryOpts: { | |
| debugString: "action,group,create", | |
| debugObj: l, | |
| metric: r.M.GROUP, | |
| ackRequest: !1, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| leaveGroup: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = i.tag(), | |
| a = t.wrap(r); | |
| a.tag = o; | |
| var s = ["group", { | |
| id: o, | |
| jid: e, | |
| type: "leave", | |
| author: Store.Conn.me | |
| }, void 0], | |
| d = t.actionNode("set", [s]); | |
| i.send({ | |
| data: t.BinaryProtocol.write(d), | |
| clientCacheable: !0, | |
| onSend: a, | |
| onDrop: t.wrap(n), | |
| binaryOpts: { | |
| debugString: "action,group,delete", | |
| debugObj: d, | |
| metric: t.M.GROUP, | |
| ackRequest: !1, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| addParticipant: function(e, t) { | |
| return this.setGroupParticipant("add", e, t) | |
| }, | |
| removeParticipant: function(e, t) { | |
| return this.setGroupParticipant("remove", e, t) | |
| }, | |
| promoteParticipant: function(e, t) { | |
| return this.setGroupParticipant("promote", e, t) | |
| }, | |
| requestMediaReupload: function(e) { | |
| var t = this; | |
| return new Promise(function(r, o) { | |
| var a = e.id, | |
| s = function(e) { | |
| var o, i = t.BinaryProtocol.read(e); | |
| if ("response" === t.N.tag(i) && "media" === t.N.attr("type", i)) { | |
| var a = parseInt(t.N.attr("code", i)) || 400, | |
| s = t.N.attr("url", i); | |
| a >= 500 && 502 !== a ? (n.error("wap:requestMediaReupload:error " + a)(), o = { | |
| status: a | |
| }) : 200 === a && s ? o = { | |
| status: 200, | |
| url: s, | |
| mediaKey: t.N.attr("media_key", i) | |
| } : 200 !== a || s ? (n.error("wap:requestMediaReupload:error " + a)(), o = { | |
| status: a | |
| }) : o = { | |
| status: 400 | |
| } | |
| } else n.error("wap:requestMediaReupload:malformed")(), o = { | |
| status: 400 | |
| }; | |
| r(o) | |
| }, | |
| d = a, | |
| c = t.queryNode({ | |
| type: "media", | |
| index: d.id, | |
| jid: d.remote, | |
| owner: d.fromMe.toString() | |
| }, void 0); | |
| i.sendEphemeral({ | |
| data: t.BinaryProtocol.write(c), | |
| onSend: t.binWrap(s, r), | |
| onDrop: t.wrap(o), | |
| binaryOpts: { | |
| debugString: "query,media", | |
| debugObj: c, | |
| metric: t.M.QUERY_MEDIA, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationSeen: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(o, a) { | |
| var s = n.actionNode("set", [ | |
| ["read", { | |
| jid: e, | |
| index: t ? t.id : void 0, | |
| owner: t ? t.fromMe.toString() : void 0, | |
| count: r && t ? r.toString() : void 0 | |
| }, void 0] | |
| ]); | |
| i.send({ | |
| data: n.BinaryProtocol.write(s), | |
| clientCacheable: !0, | |
| onSend: n.wrap(o), | |
| onDrop: n.wrap(a), | |
| binaryOpts: { | |
| debugString: "action,chat,read," + JSON.stringify(t) + "," + r, | |
| debugObj: s, | |
| metric: n.M.READ, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationDelete: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var a = r.actionNode("set", [ | |
| ["chat", { | |
| type: "delete", | |
| jid: e, | |
| index: t ? t.id : void 0, | |
| owner: t ? t.fromMe.toString() : void 0 | |
| }, void 0] | |
| ]); | |
| i.send({ | |
| data: r.BinaryProtocol.write(a), | |
| clientCacheable: !0, | |
| onSend: r.wrap(n), | |
| onDrop: r.wrap(o), | |
| binaryOpts: { | |
| debugString: "action,chat,delete", | |
| debugObj: a, | |
| metric: r.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationArchive: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(o, a) { | |
| var s = t ? "archive" : "unarchive", | |
| d = n.actionNode("set", [ | |
| ["chat", { | |
| type: s, | |
| jid: e, | |
| index: r ? r.id : void 0, | |
| owner: r ? r.fromMe.toString() : void 0 | |
| }, void 0] | |
| ]); | |
| i.send({ | |
| data: n.BinaryProtocol.write(d), | |
| clientCacheable: !0, | |
| onSend: n.wrap(o), | |
| onDrop: n.wrap(a), | |
| binaryOpts: { | |
| debugString: "action,chat," + s, | |
| debugObj: d, | |
| metric: n.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationMute: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(o, a) { | |
| var s = t ? t.toString() : void 0, | |
| d = r ? r.toString() : void 0, | |
| c = n.actionNode("set", [ | |
| ["chat", { | |
| type: "mute", | |
| mute: s, | |
| previous: d, | |
| jid: e | |
| }, void 0] | |
| ]); | |
| i.send({ | |
| data: n.BinaryProtocol.write(c), | |
| clientCacheable: !0, | |
| onSend: n.wrap(o), | |
| onDrop: n.wrap(a), | |
| binaryOpts: { | |
| debugString: "action,chat," + e + ", " + (s ? "mute," + s : "unmute"), | |
| debugObj: c, | |
| metric: n.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendMessagePlayed: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = t.wrap(r), | |
| a = e.remote, | |
| s = e.id, | |
| d = t.actionNode("set", [ | |
| ["received", { | |
| type: "played", | |
| index: s, | |
| from: a | |
| }, void 0] | |
| ]); | |
| i.send({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: o, | |
| onDrop: t.wrap(n), | |
| binaryOpts: { | |
| debugString: "action,played," + a + "_" + s, | |
| debugObj: d, | |
| metric: t.M.RECEIVED, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| profilePicFindThumbFromPhone: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var a = function(i) { | |
| var a = r.BinaryProtocol.read(i); | |
| "response" === r.N.tag(a) && "preview" === r.N.attr("type", a) || o(); | |
| var s = r.N.children(a), | |
| d = s && s[0]; | |
| if (d || o(), "missing" === r.N.attr("type", d)) n({ | |
| id: e, | |
| tag: void 0, | |
| raw: void 0 | |
| }); | |
| else { | |
| var c, u = r.N.attr("id", d); | |
| if (t && u === t.tag && t.raw) c = t.raw; | |
| else { | |
| var l = r.N.children(d); | |
| c = l ? l.toBase64() : void 0 | |
| } | |
| n({ | |
| id: e, | |
| tag: u, | |
| raw: c | |
| }) | |
| } | |
| }, | |
| s = { | |
| type: "preview", | |
| jid: e | |
| }; | |
| t && t.tag && (s.id = t.tag); | |
| var d = r.queryNode(s, []); | |
| i.sendEphemeral({ | |
| data: r.BinaryProtocol.write(d), | |
| onSend: r.binWrap(a, n), | |
| onDrop: r.wrap(o), | |
| binaryOpts: { | |
| debugString: "query,thumb," + e, | |
| debugObj: d, | |
| metric: r.M.QUERY_PREVIEW, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| groupMetadataFindFromPhone: function(e, t) { | |
| var r = this; | |
| return new Promise(function(t, n) { | |
| var o = function(n) { | |
| var o = r.BinaryProtocol.read(n); | |
| if ("response" !== r.N.tag(o) || "group" !== r.N.attr("type", o)) return void t({ | |
| status: "error", | |
| info: "bad format: response incorrect" | |
| }); | |
| var i = r.N.children(o), | |
| a = i && i[0]; | |
| if (!a) return void t({ | |
| status: "error", | |
| info: "bad format: no group node" | |
| }); | |
| if ("missing" === r.N.attr("type")) return void t({ | |
| status: "missing" | |
| }); | |
| var s = _.map(r.N.children(a), function(e) { | |
| return { | |
| id: r.N.attr("jid", e), | |
| isAdmin: "admin" === r.N.attr("type", e) | |
| } | |
| }); | |
| t({ | |
| status: "ok", | |
| data: { | |
| id: e, | |
| owner: r.N.attr("creator", a), | |
| creation: parseInt(r.N.attr("create", a), 10) || void 0, | |
| participants: s, | |
| stale: !1 | |
| } | |
| }) | |
| }, | |
| a = r.queryNode({ | |
| type: "group", | |
| jid: e | |
| }, []); | |
| i.sendEphemeral({ | |
| data: r.BinaryProtocol.write(a), | |
| onSend: r.binWrap(o, t), | |
| onDrop: r.wrap(n), | |
| binaryOpts: { | |
| debugString: "query,group," + e, | |
| debugObj: a, | |
| metric: r.M.QUERY_GROUP, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendPresenceUpdate: function(e) { | |
| var t = this; | |
| return ["available", "unavailable"].indexOf(e) > -1 ? new Promise(function(r, n) { | |
| var o = "available" === e, | |
| a = t.actionNode("set", [ | |
| ["presence", { | |
| type: e | |
| }, void 0] | |
| ], !o), | |
| s = { | |
| data: t.BinaryProtocol.write(a), | |
| onSend: o ? t.wrap(r) : r, | |
| onDrop: o ? t.wrap(n) : r, | |
| binaryOpts: { | |
| debugString: "action,presence," + e, | |
| debugObj: a, | |
| metric: t.M.PRESENCE, | |
| available: "available" === e, | |
| ackRequest: o | |
| } | |
| }; | |
| o ? i.sendEphemeral(s) : i.sendEphemeralIgnore(s) | |
| }) : void 0 | |
| }, | |
| sendChatstateUpdate: function(e, t) { | |
| var r = this; | |
| return ["composing", "paused", "recording"].indexOf(e) > -1 ? new Promise(function(n, o) { | |
| var a = n, | |
| s = r.actionNode("set", [ | |
| ["presence", { | |
| type: e, | |
| to: t | |
| }, void 0] | |
| ], !0); | |
| i.sendEphemeralIgnore({ | |
| data: r.BinaryProtocol.write(s), | |
| onSend: a, | |
| onDrop: o, | |
| binaryOpts: { | |
| debugString: "action,chatstate," + e, | |
| debugObj: s, | |
| metric: r.M.PRESENCE, | |
| skipOffline: !0, | |
| ackRequest: !1 | |
| } | |
| }, !0) | |
| }) : void 0 | |
| }, | |
| sendSetPicture: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(o, s) { | |
| var d = c.parseDataURL(t).data, | |
| u = c.parseDataURL(r).data, | |
| l = a.fromBase64(d, !1), | |
| f = a.fromBase64(u, !1), | |
| h = i.tag(), | |
| p = n.wrap(o); | |
| p.tag = h; | |
| var m = ["picture", { | |
| id: h, | |
| jid: e, | |
| type: "set" | |
| }, | |
| [ | |
| ["image", void 0, f], | |
| ["preview", void 0, l] | |
| ] | |
| ], | |
| g = n.actionNode("set", [m]); | |
| i.send({ | |
| data: n.BinaryProtocol.write(g), | |
| clientCacheable: !0, | |
| onSend: p, | |
| onDrop: n.wrap(s), | |
| binaryOpts: { | |
| debugString: "action,set_pic," + e, | |
| debugObj: g, | |
| metric: n.M.PIC, | |
| ackRequest: !1, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| deletePicture: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = i.tag(), | |
| a = t.wrap(r); | |
| a.tag = o; | |
| var s = ["picture", { | |
| id: o, | |
| jid: e, | |
| type: "delete" | |
| }, void 0], | |
| d = t.actionNode("set", [s]); | |
| i.send({ | |
| data: t.BinaryProtocol.write(d), | |
| clientCacheable: !0, | |
| onSend: a, | |
| onDrop: t.wrap(n), | |
| binaryOpts: { | |
| debugString: "action,delete_pic," + e, | |
| debugObj: d, | |
| metric: t.M.PIC, | |
| ackRequest: !1, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| sendSetStatus: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = t.wrap(r), | |
| a = t.actionNode("set", [ | |
| ["status", void 0, e] | |
| ]); | |
| i.send({ | |
| data: t.BinaryProtocol.write(a), | |
| clientCacheable: !0, | |
| onSend: o, | |
| onDrop: t.wrap(n), | |
| binaryOpts: { | |
| debugString: "action,status,set", | |
| debugObj: a, | |
| metric: t.M.STATUS, | |
| ackRequest: !1, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| sendSetBlock: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var a = t.map(function(t) { | |
| return ["user", { | |
| jid: t.jid, | |
| reason: e && t.spam ? "spam" : void 0 | |
| }, void 0] | |
| }), | |
| s = ["block", { | |
| type: e ? "add" : "remove" | |
| }, a], | |
| d = r.actionNode("set", [s]); | |
| i.send({ | |
| data: r.BinaryProtocol.write(d), | |
| clientCacheable: !0, | |
| onSend: r.wrap(n), | |
| onDrop: r.wrap(o), | |
| binaryOpts: { | |
| debugString: "action,block," + e + "," + _.pluck(t, "jid").join(","), | |
| debugObj: d, | |
| metric: r.M.BLOCK, | |
| ackRequest: !1, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| chatFindQuery: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = function(e) { | |
| var n = [], | |
| o = t.BinaryProtocol.read(e), | |
| i = t.N.children(o); | |
| if ("response" === t.N.tag(o) && "chat" === t.N.attr("type", o)) | |
| if ("true" === t.N.attr("duplicate", o)) n = "preempted"; | |
| else if (_.isArray(i)) { | |
| var a, s = i.length; | |
| for (a = 0; s > a; a++) { | |
| var d = t.parseChat(i[a]); | |
| d && n.push(d) | |
| } | |
| } | |
| r(n) | |
| }, | |
| a = t.queryNode({ | |
| type: "chat", | |
| kind: e ? "retry" : void 0 | |
| }, void 0); | |
| i.sendEphemeral({ | |
| data: t.BinaryProtocol.write(a), | |
| onSend: t.binWrap(o, r), | |
| onDrop: t.wrap(n), | |
| binaryOpts: { | |
| debugString: "query,chat," + e, | |
| debugObj: a, | |
| metric: t.M.QUERY_CHAT, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| contactFindQuery: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = function(e) { | |
| var n = [], | |
| o = t.BinaryProtocol.read(e), | |
| i = t.N.children(o); | |
| if ("response" === t.N.tag(o) && "contacts" === t.N.attr("type", o)) | |
| if ("true" === t.N.attr("duplicate", o)) n = "preempted"; | |
| else if (_.isArray(i)) { | |
| var a, s = i.length; | |
| for (a = 0; s > a; a++) { | |
| var d = t.parseContact(i[a]); | |
| d && n.push(d) | |
| } | |
| } | |
| r({ | |
| checksum: t.N.attr("checksum", o), | |
| data: n | |
| }) | |
| }, | |
| a = t.queryNode({ | |
| type: "contacts", | |
| kind: e ? "retry" : void 0 | |
| }, void 0); | |
| i.send({ | |
| data: t.BinaryProtocol.write(a), | |
| onSend: t.binWrap(o, r), | |
| onDrop: t.wrap(n), | |
| binaryOpts: { | |
| debugString: "query,contacts, " + e, | |
| debugObj: a, | |
| metric: t.M.QUERY_CONTACTS, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| msgCreateRecord: function(e, t) { | |
| var r = this; | |
| return new Promise(function(o, s) { | |
| var d, c, u = e.id; | |
| if ("chat" === e.type) c = Promise.resolve(["message", { | |
| type: "text", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["body", void 0, e.body] | |
| ] | |
| ]); | |
| else if ("location" === e.type) d = e.body ? a.fromBase64(e.body, !1) : void 0, c = Promise.resolve(["message", { | |
| type: "media", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["media", { | |
| type: "location", | |
| latitude: e.lat || void 0, | |
| longitude: e.lng || void 0, | |
| name: e.loc && e.url ? e.loc : void 0, | |
| url: e.loc && e.url ? e.url : void 0, | |
| encoding: e.body ? "raw" : void 0 | |
| }, d] | |
| ] | |
| ]); | |
| else if ("vcard" === e.type) { | |
| var f = ["vcard", { | |
| name: e.subtype | |
| }, e.body]; | |
| c = Promise.resolve(["message", { | |
| type: "media", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["media", { | |
| type: "vcard" | |
| }, | |
| [f] | |
| ] | |
| ] | |
| ]) | |
| } else { | |
| var h = e.mediaKey; | |
| d = e.body ? a.fromBase64(e.body, !1) : void 0, c = (t && !h ? r.sendMedia(e.avparams) : Promise.resolve(_.merge({ | |
| status: 200 | |
| }, e.avparams))).then(function(t) { | |
| return 200 === t.status ? Promise.resolve(["message", { | |
| type: "media", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["media", { | |
| encoding: e.body ? "raw" : void 0, | |
| origin: "ptt" === e.type ? "live" : void 0, | |
| seconds: "ptt" === e.type && e.duration ? e.duration.toString() : void 0, | |
| type: t.type, | |
| mimetype: e.mimetype || t.mimetype || void 0, | |
| size: e.size ? e.size.toString() : void 0, | |
| filehash: t.filehash, | |
| url: t.url, | |
| duration: t.duration ? t.duration.toString() : void 0, | |
| vcodec: t.vcodec || void 0, | |
| width: t.width ? t.width.toString() : void 0, | |
| height: t.height ? t.height.toString() : void 0, | |
| fps: t.fps ? t.fps.toString() : void 0, | |
| vbitrate: t.vbitrate ? t.vbitrate.toString() : void 0, | |
| acodec: t.acodec || void 0, | |
| asampfreq: t.asampfreq ? t.asampfreq.toString() : void 0, | |
| asampfmt: t.asampfmt || void 0, | |
| abitrate: t.abitrate ? t.abitrate.toString() : void 0, | |
| caption: "video" !== e.type && "image" !== e.type || !e.caption ? void 0 : e.caption, | |
| page_count: "number" != typeof e.pageCount || isNaN(e.pageCount) ? void 0 : e.pageCount.toString(), | |
| media_key: h, | |
| filename: t.filename | |
| }, d] | |
| ] | |
| ]) : (n.error("wap:msgCreateRecord:sendMedia error " + t.status)(), Promise.reject()) | |
| })["catch"](function() { | |
| return n.error("wap:msgCreateRecord:sendMedia dropped")(), Promise.reject() | |
| }) | |
| } | |
| c.then(function(t) { | |
| var n = r.actionNode("relay", [t]), | |
| a = r.wrap(o); | |
| a.tag = u, a.meta = { | |
| type: "message", | |
| key: new l(e.from, e.to, e.id) | |
| }, i.send({ | |
| data: r.BinaryProtocol.write(n), | |
| onSend: a, | |
| onDrop: r.wrap(s), | |
| binaryOpts: { | |
| debugString: "action,message, " + e.type, | |
| debugObj: n, | |
| metric: r.M.MESSAGE, | |
| ackRequest: !1 | |
| } | |
| }) | |
| })["catch"](function() { | |
| n.error("wap:msgCreateRecord mPromise error")(), s() | |
| }) | |
| }) | |
| }, | |
| msgFindQuery: function(e, t) { | |
| var r = this; | |
| return "before" !== e ? Promise.reject("wap:msgFindQuery:unsupported:" + e) : new Promise(function(e, n) { | |
| var o = function(t) { | |
| var n = [], | |
| o = r.BinaryProtocol.read(t), | |
| i = r.N.children(o); | |
| if ("response" === r.N.tag(o) && "message" === r.N.attr("type", o) && _.isArray(i)) { | |
| var a, s = i.length; | |
| for (a = 0; s > a; a++) { | |
| var d = r.parseMsg(i[a], "response"); | |
| d && n.push(d) | |
| } | |
| } | |
| e(n) | |
| }, | |
| a = r.queryNode({ | |
| type: "message", | |
| jid: t.remote, | |
| count: t.count.toString(), | |
| index: t.id, | |
| owner: "undefined" == typeof t.fromMe ? void 0 : t.fromMe.toString() | |
| }, void 0); | |
| i.sendEphemeral({ | |
| data: r.BinaryProtocol.write(a), | |
| onSend: r.binWrap(o, e), | |
| onDrop: r.wrap(n), | |
| binaryOpts: { | |
| debugString: "query,message," + t.remote + "_" + t.id + "_" + t.fromMe + "_" + t.count, | |
| debugObj: a, | |
| metric: r.M.QUERY_MESSAGES, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| presenceSubscribe: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = t.wrap(r), | |
| a = t.actionNode("set", [ | |
| ["presence", { | |
| type: "subscribe", | |
| to: e | |
| }, void 0] | |
| ]); | |
| i.sendEphemeral({ | |
| data: t.BinaryProtocol.write(a), | |
| onSend: o, | |
| onDrop: t.wrap(n), | |
| binaryOpts: { | |
| debugString: "action,presence,subscribe," + e, | |
| debugObj: a, | |
| metric: t.M.PRESENCE_SUBSCRIBE, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| } | |
| }; | |
| e.exports = _.defaults(h, f) | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(1), | |
| o = r(10), | |
| i = r(34), | |
| a = r(19), | |
| s = r(55), | |
| d = r(156), | |
| c = { | |
| BinaryProtocol: null, | |
| N: null, | |
| M: { | |
| DEBUG_LOG: 1, | |
| QUERY_RESUME: 2, | |
| QUERY_RECEIPT: 3, | |
| QUERY_MEDIA: 4, | |
| QUERY_CHAT: 5, | |
| QUERY_CONTACTS: 6, | |
| QUERY_MESSAGES: 7, | |
| PRESENCE: 8, | |
| PRESENCE_SUBSCRIBE: 9, | |
| GROUP: 10, | |
| READ: 11, | |
| CHAT: 12, | |
| RECEIVED: 13, | |
| PIC: 14, | |
| STATUS: 15, | |
| MESSAGE: 16, | |
| QUERY_ACTIONS: 17, | |
| BLOCK: 18, | |
| QUERY_GROUP: 19, | |
| QUERY_PREVIEW: 20, | |
| QUERY_EMOJI: 21, | |
| QUERY_MESSAGE_INFO: 22 | |
| }, | |
| epochCount: 0, | |
| epoch: 0, | |
| isRequestingDeviceUploadLogsMutex: 0, | |
| parseChat: function(e) { | |
| if ("chat" === this.N.tag(e)) { | |
| var t = this.N.attr("jid", e), | |
| r = parseInt(this.N.attr("t", e), 10) || void 0, | |
| n = this.N.attr("type", e), | |
| o = parseInt(this.N.attr("mute", e), 10) || void 0, | |
| i = parseInt(this.N.attr("before", e), 10) || void 0, | |
| a = "true" === this.N.attr("archive", e), | |
| s = "true" === this.N.attr("read_only", e), | |
| d = parseInt(this.N.attr("modify_tag", e), 10) || void 0, | |
| c = this.N.attr("name", e) || void 0, | |
| u = this.safeParseInt(e, "count"), | |
| l = "true" === this.N.attr("message", e); | |
| "ahead" === n && (n = "clear"); | |
| var f, h = this.N.children(e); | |
| if (_.isArray(h)) { | |
| f = []; | |
| var p, m, g = h.length; | |
| for (p = 0; g > p; p++) | |
| if (m = h[p], "item" === this.N.tag(m)) { | |
| var v = this.N.attr("index", m); | |
| v && f.push([v, "true" === this.N.attr("owner", m), this.N.attr("participant", m)]) | |
| } | |
| } | |
| var y = { | |
| id: t, | |
| t: r, | |
| type: n, | |
| keys: f, | |
| before: i, | |
| archive: a, | |
| isReadOnly: s, | |
| unreadCount: u, | |
| muteExpiration: o, | |
| modifyTag: d, | |
| name: c, | |
| pendingMsgs: l | |
| }, | |
| b = [n && "delete" !== n && "clear" !== n && "archive" !== n && "unarchive" !== n && "mute" !== n && "modify_tag" !== n, !n && !t, a && n && "clear" !== n, "clear" !== n && i && i > 0, "clear" !== n && f && f.length > 0]; | |
| return this.dropIfConditionMet(b, y) | |
| } | |
| }, | |
| parseCmd: function(e) { | |
| if ("read" === this.N.tag(e)) { | |
| var t = this.N.attr("jid", e), | |
| r = "false" === this.N.attr("type", e), | |
| n = { | |
| type: r ? "unread" : "read", | |
| jid: t | |
| }, | |
| o = [!t]; | |
| return this.dropIfConditionMet(o, n) | |
| } | |
| }, | |
| parseMsgMessage: function(e, t) { | |
| if ("message" === this.N.tag(e)) { | |
| var r; | |
| this.N.attr("from", e) !== Store.Conn.me || this.N.attr("to", e) ? this.N.attr("to", e) !== Store.Conn.me || this.N.attr("from", e) || (r = "out") : r = "in"; | |
| var o, i = this.N.attr("id", e), | |
| a = parseInt(this.N.attr("t", e), 10) || 0, | |
| s = this.N.attr("to", e) || Store.Conn.me, | |
| d = this.N.attr("from", e) || Store.Conn.me, | |
| c = "broadcast" === d.split("@")[1], | |
| u = this.N.attr("participant", e), | |
| l = c ? u : d, | |
| f = c ? void 0 : u, | |
| h = c ? !1 : this.N.child("broadcast", e) && d === Store.Conn.me, | |
| p = "invis" === this.N.attr("web", e), | |
| m = this.N.attr("notify", e) || "", | |
| g = parseInt(this.N.attr("status", e)) || 0, | |
| v = [], | |
| y = this.N.child("broadcast", e); | |
| if ("broadcast" !== s) { | |
| switch (t) { | |
| case "fresh": | |
| o = 1; | |
| break; | |
| default: | |
| o = g >= -1 && 4 >= g ? g : 1 | |
| } | |
| if (_.isArray(y)) { | |
| var b, w = y.length; | |
| for (b = 0; w > b; b++) { | |
| var E = y[b], | |
| S = this.N.attr("jid", E); | |
| "to" === this.N.tag(E) && S && v.push(S) | |
| } | |
| } | |
| var N, T = [], | |
| $ = this.N.attr("type", e); | |
| switch ($) { | |
| case "ciphertext": | |
| case "text": | |
| var C = this.N.dataStr(this.N.child("body", e)) || ""; | |
| N = { | |
| id: i, | |
| body: "text" === $ ? C : void 0, | |
| type: "text" === $ ? "chat" : "ciphertext", | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| participant: u, | |
| invis: p, | |
| ack: o, | |
| broadcast: h, | |
| recipients: v | |
| }, T = [!i, !a, !l, !s]; | |
| break; | |
| case "media": | |
| var A, I, O, k, P, R, M = this.N.child("media", e), | |
| L = this.N.attr("type", M), | |
| D = this.N.attr("media_key", M), | |
| U = this.N.attr("mimetype", M); | |
| if ("retry" === this.N.attr("reason", M)) return; | |
| switch (L) { | |
| case "image": | |
| case "video": | |
| case "document": | |
| var B = parseInt(this.N.attr("page_count", M), 10) || 0, | |
| x = this.N.attr("filename", M); | |
| R = this.N.attr("caption", M), A = this.thumbFromMediaXml(M), I = this.N.attr("url", M), I = _.isString(I) && I.indexOf("/u/") > 0 ? void 0 : I, O = this.N.attr("filehash", M), k = parseInt(this.N.attr("size", M), 10) || 0, P = this.N.attr("seconds", M), N = { | |
| id: i, | |
| body: A, | |
| type: L, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| participant: u, | |
| invis: p, | |
| ack: o, | |
| clientUrl: I, | |
| duration: P, | |
| broadcast: h, | |
| recipients: v, | |
| filehash: O, | |
| size: k, | |
| caption: R, | |
| mediaKey: D, | |
| pageCount: B, | |
| mimetype: U, | |
| filename: x | |
| }, T = [!i, !a, !l, !s]; | |
| break; | |
| case "location": | |
| var j = this.N.attr("latitude", M), | |
| W = this.N.attr("longitude", M), | |
| Y = this.N.attr("name", M); | |
| A = this.thumbFromMediaXml(M), I = this.N.attr("url", M), N = { | |
| id: i, | |
| body: A, | |
| type: L, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| participant: u, | |
| invis: p, | |
| ack: o, | |
| clientUrl: I, | |
| loc: Y, | |
| lat: j, | |
| lng: W, | |
| broadcast: h, | |
| recipients: v | |
| }, T = [!i, !a, !l, !s, !j || !W]; | |
| break; | |
| case "audio": | |
| var F = "live" === this.N.attr("origin", M) ? "ptt" : L; | |
| I = this.N.attr("url", M), I = _.isString(I) && I.indexOf("/u/") > 0 ? void 0 : I, O = this.N.attr("filehash", M), k = parseInt(this.N.attr("size", M), 10) || 0, P = this.N.attr("seconds", M), N = { | |
| id: i, | |
| type: F, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| participant: u, | |
| invis: p, | |
| ack: o, | |
| clientUrl: I, | |
| duration: P, | |
| broadcast: h, | |
| recipients: v, | |
| filehash: O, | |
| size: k, | |
| mediaKey: D, | |
| mimetype: U | |
| }, T = [!i, !a, !l, !s]; | |
| break; | |
| case "vcard": | |
| var G = this.N.child("vcard", M), | |
| q = this.N.dataStr(G), | |
| K = this.N.attr("name", G); | |
| N = { | |
| id: i, | |
| body: q, | |
| type: L, | |
| subtype: K, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| participant: u, | |
| invis: p, | |
| ack: o, | |
| broadcast: h, | |
| recipients: v | |
| }, T = [!i, !a, !l, !s, !q, !K]; | |
| break; | |
| default: | |
| n.error("wap:parseMsgMessage unknown media type: " + this.N.toString(e), e)() | |
| } | |
| break; | |
| default: | |
| n.error("wap:parseMsgMessage unknown message type: " + this.N.toString(e), e)() | |
| } | |
| return this.dropIfConditionMet(T, N) | |
| } | |
| } | |
| }, | |
| parseMsgGp2: function(e) { | |
| if ("groups_v2" === this.N.tag(e)) { | |
| var t, r = parseInt(this.N.attr("t", e), 10) || 0, | |
| n = this.N.attr("id", e), | |
| o = this.N.attr("jid", e), | |
| i = "invis" === this.N.attr("web", e), | |
| a = "true" === this.N.attr("owner", e), | |
| s = this.N.attr("type", e), | |
| d = this.N.attr("author", e), | |
| c = this.N.children(e), | |
| u = this.N.attr("participant", e), | |
| l = []; | |
| switch (s) { | |
| case "create": | |
| t = this.N.attr("subject", e); | |
| break; | |
| case "subject": | |
| t = this.N.attr("subject", e); | |
| break; | |
| case "picture": | |
| t = this.N.attr("picture", e) | |
| } | |
| if (_.isArray(c)) { | |
| var f, h = c.length; | |
| for (f = 0; h > f; f++) { | |
| var p = c[f], | |
| m = this.N.attr("jid", p); | |
| "participant" === this.N.tag(p) && m && l.push(m) | |
| } | |
| } | |
| var g = { | |
| t: r, | |
| id: n, | |
| to: a ? o : Store.Conn.me, | |
| from: a ? Store.Conn.me : o, | |
| author: d, | |
| participant: u, | |
| body: t ? t.toString() : void 0, | |
| type: "gp2", | |
| subtype: s, | |
| invis: i, | |
| recipients: l | |
| }, | |
| v = [!n, !r, "subject" !== s && "add" !== s && "remove" !== s && "leave" !== s && "picture" !== s && "modify" !== s && "create" !== s && "delete" !== s && "promote" !== s && "demote" !== s, "subject" === s && !t, ("add" === s || "remove" === s || "leave" === s || "promote" === s || "demote" === s || "modify" === s) && 0 === l.length, !o, "string" == typeof o && "g.us" !== o.split("@")[1]]; | |
| return this.dropIfConditionMet(v, g) | |
| } | |
| }, | |
| parseMsgBroadcast: function(e) { | |
| if ("broadcast" === this.N.tag(e)) { | |
| var t, r, n = this.N.attr("type", e), | |
| o = this.N.attr("id", e), | |
| i = parseInt(this.N.attr("t", e), 10) || 0, | |
| a = this.N.attr("jid", e), | |
| s = "true" === this.N.attr("owner", e), | |
| d = this.N.attr("participant", e); | |
| switch (n) { | |
| case "create": | |
| t = parseInt(this.N.attr("count", e), 10) || 0; | |
| break; | |
| case "add": | |
| case "remove": | |
| r = this.N.child("participant", e), r && (t = this.N.attr("jid", r)) | |
| } | |
| var c = { | |
| id: o, | |
| t: i, | |
| participant: d, | |
| type: "broadcast_notification", | |
| subtype: n, | |
| from: s ? Store.Conn.me : a, | |
| to: s ? a : Store.Conn.me, | |
| body: t ? t.toString() : void 0 | |
| }, | |
| u = [!o, !i, !a, "string" == typeof a && "broadcast" !== a.split("@")[1], "create" !== n && "add" !== n && "remove" !== n, ("add" === n || "remove" === n) && 2 !== t.split("@").length]; | |
| return this.dropIfConditionMet(u, c) | |
| } | |
| }, | |
| parseMsgNotification: function(e) { | |
| if ("notification" === this.N.tag(e)) { | |
| var t = this.N.attr("id", e), | |
| r = parseInt(this.N.attr("t", e), 10) || 0, | |
| n = this.N.attr("jid", e), | |
| o = this.N.attr("participant", e), | |
| i = "invis" === this.N.attr("web", e), | |
| a = this.N.dataStr(e), | |
| s = "true" === this.N.attr("owner", e) ? Store.Conn.me : n, | |
| d = "true" === this.N.attr("owner", e) ? n : Store.Conn.me, | |
| c = { | |
| id: t, | |
| type: "notification", | |
| t: r, | |
| invis: i, | |
| from: s, | |
| to: d, | |
| participant: o, | |
| body: a | |
| }, | |
| u = [!t, !r, !n, 2 !== n.split("@").length]; | |
| return this.dropIfConditionMet(u, c) | |
| } | |
| }, | |
| sendConversationOpWithKey: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(i, a) { | |
| var s = n.actionNode("set", [ | |
| ["chat", { | |
| type: e, | |
| jid: t, | |
| index: r ? r.id : void 0, | |
| owner: r ? r.fromMe.toString() : void 0, | |
| participant: r ? r.participant : void 0 | |
| }, void 0] | |
| ]); | |
| o.send({ | |
| data: n.BinaryProtocol.write(s), | |
| clientCacheable: !0, | |
| onSend: n.wrap(i), | |
| onDrop: n.wrap(a), | |
| binaryOpts: { | |
| debugString: "action,chat," + [e, (r || "no_msg_key").toString()].join(), | |
| debugObj: s, | |
| metric: n.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| setSubProtocol: function(e) { | |
| 5 === e ? (this.BinaryProtocol = new s("05"), this.N = this.BinaryProtocol.Node) : 6 === e ? (this.BinaryProtocol = new s("06"), this.N = this.BinaryProtocol.Node) : (n.error("Wap:setSubProtocol unknown " + e)(), this.BinaryProtocol = new s("05"), this.N = this.BinaryProtocol.Node) | |
| }, | |
| resyncMessages: function(e) { | |
| var t = this; | |
| return new i(function(r, i) { | |
| var s = function(e) { | |
| var o = [], | |
| i = t.BinaryProtocol.read(e), | |
| a = t.N.children(i); | |
| if (n.logColor("green", "bin-recv: response,resume", i)(), "response" === t.N.tag(i) && "resume" === t.N.attr("type", i) && _.isArray(a)) { | |
| var s, d = a.length; | |
| for (s = 0; d > s; s++) { | |
| var c = t.parseChat(a[s]); | |
| c && o.push(c) | |
| } | |
| } | |
| r({ | |
| checksum: t.N.attr("checksum", i), | |
| data: o | |
| }) | |
| }, | |
| d = e.map(function(e) { | |
| var t = { | |
| jid: e.wid, | |
| index: e.id, | |
| owner: e.fromMe, | |
| participant: e.participant, | |
| archive: (!!e.archive).toString() | |
| }; | |
| return e.mute && (t.mute = e.mute.toString()), e.active && (t.active = "true"), a.isGroup(e.wid) && (t.read_only = (!!e.isReadOnly).toString()), e.modifyTag && (t.modify_tag = e.modifyTag.toString()), e.unreadCount && (t.count = e.unreadCount.toString()), ["last", t, void 0] | |
| }), | |
| c = t.queryNode({ | |
| type: "resume" | |
| }, d); | |
| o.sendEphemeral({ | |
| data: t.BinaryProtocol.write(c), | |
| onSend: t.binWrap(s, r), | |
| onDrop: t.wrap(i), | |
| binaryOpts: { | |
| debugString: "query,resume", | |
| debugObj: c, | |
| metric: t.M.QUERY_RESUME, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| resyncReceipts: function(e) { | |
| var t = this; | |
| return new Promise(function(r, i) { | |
| var a = function(e) { | |
| var o = [], | |
| i = t.BinaryProtocol.read(e), | |
| a = t.N.children(i); | |
| if (n.logColor("green", "bin-recv: response,receipt", i)(), "response" === t.N.tag(i) && "receipt" === t.N.attr("type", i) && _.isArray(a)) { | |
| var s, d, c, u = a.length; | |
| for (s = 0; u > s; s++) { | |
| d = a[s], c = t.N.children(d); | |
| var l = t.N.attr("jid", d), | |
| f = t.N.attr("t", d); | |
| if ("receipt" === t.N.tag(d) && l && f && _.isArray(c)) { | |
| var h, p = [], | |
| m = c.length; | |
| for (h = 0; m > h; h++) { | |
| var g = c[h]; | |
| if ("item" === t.N.tag(g)) { | |
| var v = t.N.attr("index", g), | |
| y = "true" === t.N.attr("owner", g), | |
| b = parseInt(t.N.attr("status", g), 10) || 0, | |
| w = t.N.attr("participant", g); | |
| v && 0 !== b && 4 >= b && p.push([v, y, w, b]) | |
| } | |
| } | |
| p.length > 0 && o.push({ | |
| id: l, | |
| t: parseInt(f, 10), | |
| acks: p | |
| }) | |
| } | |
| } | |
| } | |
| r(o) | |
| }, | |
| s = e.map(function(e) { | |
| return ["last", { | |
| jid: e.remote, | |
| index: e.id, | |
| owner: e.fromMe.toString(), | |
| participant: e.participant, | |
| t: e.t.toString() | |
| }, void 0] | |
| }), | |
| d = t.queryNode({ | |
| type: "receipt" | |
| }, s); | |
| o.sendEphemeral({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: t.binWrap(a, r), | |
| onDrop: t.wrap(i), | |
| binaryOpts: { | |
| debugString: "query,receipt", | |
| debugObj: d, | |
| metric: t.M.QUERY_RECEIPT, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| recentEmojiQuery: function(e) { | |
| var t = this; | |
| return new Promise(function(r, i) { | |
| var a = function(e) { | |
| var o = [], | |
| i = t.BinaryProtocol.read(e), | |
| a = t.N.children(i); | |
| if (n.logColor("green", "bin-recv: response,emoji", i)(), "response" === t.N.tag(i) && "emoji" === t.N.attr("type", i) && _.isArray(a)) { | |
| var s, d = a.length; | |
| for (s = 0; d > s; s++) { | |
| var c = a[s], | |
| u = t.N.attr("code", c), | |
| l = parseFloat(t.N.attr("value", c)) || 0; | |
| "item" === t.N.tag(c) && u && l && !isNaN(l) && o.push({ | |
| "char": u, | |
| weight: l | |
| }) | |
| } | |
| } | |
| r(o) | |
| }, | |
| s = _.isArray(e) ? e.map(function(e) { | |
| return ["item", { | |
| code: e["char"], | |
| value: e.weight.toString() | |
| }, void 0] | |
| }) : void 0, | |
| d = t.queryNode({ | |
| type: "emoji" | |
| }, s); | |
| o.sendEphemeral({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: t.binWrap(a, r), | |
| onDrop: t.wrap(i), | |
| binaryOpts: { | |
| debugString: "query,emoji", | |
| debugObj: d, | |
| metric: t.M.QUERY_EMOJI, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| queryMsgInfo: function(e) { | |
| var t = this, | |
| r = function(e) { | |
| var r, n, o = []; | |
| if (_.isArray(e)) { | |
| r = e.length; | |
| for (var i = 0; r > i; i++) n = e[i], "item" === t.N.tag(n) && t.N.attr("jid", n) && t.N.attr("t", n) && o.push({ | |
| id: t.N.attr("jid", n), | |
| t: parseInt(t.N.attr("t", n), 10) || 0 | |
| }) | |
| } | |
| return o | |
| }; | |
| return new Promise(function(i, a) { | |
| var s = function(e) { | |
| var o = t.BinaryProtocol.read(e), | |
| a = { | |
| played: [], | |
| playedRemaining: 0, | |
| read: [], | |
| readRemaining: 0, | |
| delivery: [], | |
| deliveryRemaining: 0 | |
| }; | |
| if (n.logColor("green", "bin-recv: response,msg,info", o)(), "response" === t.N.tag(o) && "message_info" === t.N.attr("type", o)) { | |
| var s = t.N.child("played", o), | |
| d = t.N.child("read", o), | |
| c = t.N.child("delivery", o), | |
| u = t.N.children(s), | |
| l = t.N.children(d), | |
| f = t.N.children(c), | |
| h = parseInt(t.N.attr("count", o), 10) || 0; | |
| a.played = r(u), a.read = r(l), a.delivery = r(f); | |
| var p = h - a.played.length, | |
| m = h - a.played.length - a.read.length, | |
| g = h - a.played.length - a.read.length - a.delivery.length; | |
| a.playedRemaining = 0 > p ? 0 : p, a.readRemaining = 0 > m ? 0 : m, a.deliveryRemaining = 0 > g ? 0 : g | |
| } | |
| i(a) | |
| }, | |
| d = t.queryNode({ | |
| type: "message_info", | |
| index: e.id, | |
| jid: e.remote | |
| }, void 0); | |
| o.sendEphemeral({ | |
| data: t.BinaryProtocol.write(d), | |
| onSend: t.binWrap(s, i), | |
| onDrop: t.wrap(a), | |
| binaryOpts: { | |
| debugString: ["query,msg,info", e.id, e.remote, e.fromMe].join(), | |
| debugObj: d, | |
| metric: t.M.QUERY_MESSAGE_INFO, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| requestMediaReupload: function(e) { | |
| var t = this; | |
| return new Promise(function(r, i) { | |
| var a = e.id, | |
| s = function(e) { | |
| var o, i = t.BinaryProtocol.read(e); | |
| if ("response" === t.N.tag(i) && "media" === t.N.attr("type", i)) { | |
| var a = parseInt(t.N.attr("code", i)) || 400, | |
| s = t.N.attr("url", i); | |
| a >= 500 && 502 !== a ? (n.error("wap:requestMediaReupload:error " + a)(), o = { | |
| status: a | |
| }) : 200 === a && s ? o = { | |
| status: 200, | |
| url: s, | |
| mediaKey: t.N.attr("media_key", i) | |
| } : 200 !== a || s ? (n.error("wap:requestMediaReupload:error " + a)(), o = { | |
| status: a | |
| }) : o = { | |
| status: 400 | |
| } | |
| } else n.error("wap:requestMediaReupload:malformed")(), o = { | |
| status: 400 | |
| }; | |
| r(o) | |
| }, | |
| d = a, | |
| c = t.queryNode({ | |
| type: "media", | |
| index: d.id, | |
| jid: d.remote, | |
| owner: d.fromMe.toString(), | |
| participant: d.participant | |
| }, void 0); | |
| o.sendEphemeral({ | |
| data: t.BinaryProtocol.write(c), | |
| onSend: t.binWrap(s, r), | |
| onDrop: t.wrap(i), | |
| binaryOpts: { | |
| debugString: "query,media", | |
| debugObj: c, | |
| metric: t.M.QUERY_MEDIA, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationSeen: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(i, a) { | |
| var s = n.actionNode("set", [ | |
| ["read", { | |
| jid: e, | |
| index: t ? t.id : void 0, | |
| owner: t ? t.fromMe.toString() : void 0, | |
| participant: t ? t.participant : void 0, | |
| count: r && t ? r.toString() : void 0 | |
| }, void 0] | |
| ]); | |
| o.send({ | |
| data: n.BinaryProtocol.write(s), | |
| clientCacheable: !0, | |
| onSend: n.wrap(i), | |
| onDrop: n.wrap(a), | |
| binaryOpts: { | |
| debugString: "action,chat,read," + JSON.stringify(t) + "," + r, | |
| debugObj: s, | |
| metric: n.M.READ, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationUnseen: function(e, t) { | |
| return this.sendConversationSeen(e, t, -2) | |
| }, | |
| sendConversationClear: function(e, t) { | |
| return this.sendConversationOpWithKey("clear", e, t) | |
| }, | |
| sendConversationDelete: function(e, t) { | |
| return this.sendConversationOpWithKey("delete", e, t) | |
| }, | |
| sendConversationArchive: function(e, t, r) { | |
| return this.sendConversationOpWithKey(t ? "archive" : "unarchive", e, r) | |
| }, | |
| sendMessagePlayed: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var i = t.wrap(r), | |
| a = t.actionNode("set", [ | |
| ["received", { | |
| type: "played", | |
| index: e.id, | |
| from: e.remote, | |
| participant: e.participant | |
| }, void 0] | |
| ]); | |
| o.send({ | |
| data: t.BinaryProtocol.write(a), | |
| onSend: i, | |
| onDrop: t.wrap(n), | |
| binaryOpts: { | |
| debugString: "action,played," + e.toString(), | |
| debugObj: a, | |
| metric: t.M.RECEIVED, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendMessageDelete: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(i, a) { | |
| var s = t.map(function(e) { | |
| return ["item", { | |
| index: e.id, | |
| owner: e.fromMe.toString(), | |
| participant: e.participant | |
| }, void 0] | |
| }), | |
| d = n.actionNode("set", [ | |
| ["chat", { | |
| type: "clear", | |
| jid: e, | |
| media: r.toString() | |
| }, s] | |
| ]); | |
| o.send({ | |
| data: n.BinaryProtocol.write(d), | |
| clientCacheable: !0, | |
| onSend: n.wrap(i), | |
| onDrop: n.wrap(a), | |
| binaryOpts: { | |
| debugString: "action,msgs,delete," + [e, r, t.length].join(), | |
| debugObj: d, | |
| metric: n.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| msgFindQuery: function(e, t) { | |
| var r = this; | |
| return "before" !== e ? Promise.reject("wap:msgFindQuery:unsupported:" + e) : new Promise(function(e, n) { | |
| var i = function(t) { | |
| var n = [], | |
| o = r.BinaryProtocol.read(t), | |
| i = r.N.children(o); | |
| if ("response" === r.N.tag(o) && "message" === r.N.attr("type", o) && _.isArray(i)) { | |
| var a, s = i.length; | |
| for (a = 0; s > a; a++) { | |
| var d = r.parseMsg(i[a], "response"); | |
| d && n.push(d) | |
| } | |
| } | |
| e(n) | |
| }, | |
| a = r.queryNode({ | |
| type: "message", | |
| jid: t.remote, | |
| count: t.count.toString(), | |
| index: t.id, | |
| owner: "undefined" == typeof t.fromMe ? void 0 : t.fromMe.toString(), | |
| participant: t.participant | |
| }, void 0); | |
| o.sendEphemeral({ | |
| data: r.BinaryProtocol.write(a), | |
| onSend: r.binWrap(i, e), | |
| onDrop: r.wrap(n), | |
| binaryOpts: { | |
| debugString: "query,message," + [t.toString(), t.count].join(), | |
| debugObj: a, | |
| metric: r.M.QUERY_MESSAGES, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| } | |
| }; | |
| e.exports = _.defaults(c, d) | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(1), | |
| o = r(9), | |
| i = r(10), | |
| a = r(7), | |
| s = r(55), | |
| d = r(94), | |
| c = r(14), | |
| u = r(157), | |
| l = { | |
| BinaryProtocol: null, | |
| N: null, | |
| M: { | |
| DEBUG_LOG: 1, | |
| QUERY_RESUME: 2, | |
| QUERY_RECEIPT: 3, | |
| QUERY_MEDIA: 4, | |
| QUERY_CHAT: 5, | |
| QUERY_CONTACTS: 6, | |
| QUERY_MESSAGES: 7, | |
| PRESENCE: 8, | |
| PRESENCE_SUBSCRIBE: 9, | |
| GROUP: 10, | |
| READ: 11, | |
| CHAT: 12, | |
| RECEIVED: 13, | |
| PIC: 14, | |
| STATUS: 15, | |
| MESSAGE: 16, | |
| QUERY_ACTIONS: 17, | |
| BLOCK: 18, | |
| QUERY_GROUP: 19, | |
| QUERY_PREVIEW: 20, | |
| QUERY_EMOJI: 21, | |
| QUERY_MESSAGE_INFO: 22, | |
| SPAM: 23 | |
| }, | |
| epochCount: 0, | |
| epoch: 0, | |
| isRequestingDeviceUploadLogsMutex: 0, | |
| parseChat: function(e) { | |
| if ("chat" === this.N.tag(e)) { | |
| var t = this.N.attr("jid", e), | |
| r = parseInt(this.N.attr("t", e), 10) || void 0, | |
| n = this.N.attr("type", e), | |
| o = parseInt(this.N.attr("mute", e), 10) || void 0, | |
| i = parseInt(this.N.attr("before", e), 10) || void 0, | |
| a = "true" === this.N.attr("archive", e), | |
| s = "true" === this.N.attr("read_only", e), | |
| d = parseInt(this.N.attr("modify_tag", e), 10) || void 0, | |
| c = this.N.attr("name", e) || void 0, | |
| u = this.safeParseInt(e, "count"), | |
| l = "true" === this.N.attr("message", e), | |
| f = "true" === this.N.attr("star", e); | |
| "ahead" === n && (n = "clear"); | |
| var h, p = this.N.children(e); | |
| if (_.isArray(p)) { | |
| h = []; | |
| var m, g, v = p.length; | |
| for (m = 0; v > m; m++) | |
| if (g = p[m], "item" === this.N.tag(g)) { | |
| var y = this.N.attr("index", g); | |
| y && h.push([y, "true" === this.N.attr("owner", g), this.N.attr("participant", g)]) | |
| } | |
| } | |
| var b = { | |
| id: t, | |
| t: r, | |
| type: n, | |
| keys: h, | |
| before: i, | |
| archive: a, | |
| isReadOnly: s, | |
| unreadCount: u, | |
| muteExpiration: o, | |
| modifyTag: d, | |
| name: c, | |
| pendingMsgs: l, | |
| star: f | |
| }, | |
| w = [n && "delete" !== n && "clear" !== n && "archive" !== n && "unarchive" !== n && "mute" !== n && "star" !== n && "unstar" !== n && "modify_tag" !== n, !n && !t, a && n && "clear" !== n, "clear" !== n && i && i > 0, "clear" !== n && "star" !== n && "unstar" !== n && h && h.length > 0]; | |
| return this.dropIfConditionMet(w, b) | |
| } | |
| }, | |
| parseMsgMessage: function(e, t) { | |
| if ("message" === this.N.tag(e)) { | |
| var r; | |
| this.N.attr("from", e) !== Store.Conn.me || this.N.attr("to", e) ? this.N.attr("to", e) !== Store.Conn.me || this.N.attr("from", e) || (r = "out") : r = "in"; | |
| var o, i = this.N.attr("id", e), | |
| a = parseInt(this.N.attr("t", e), 10) || 0, | |
| s = this.N.attr("to", e) || Store.Conn.me, | |
| d = this.N.attr("from", e) || Store.Conn.me, | |
| c = "broadcast" === d.split("@")[1], | |
| u = this.N.attr("participant", e), | |
| l = c ? u : d, | |
| f = c ? void 0 : u, | |
| h = c ? !1 : this.N.child("broadcast", e) && d === Store.Conn.me, | |
| p = "invis" === this.N.attr("web", e), | |
| m = this.N.attr("notify", e) || "", | |
| g = parseInt(this.N.attr("status", e)) || 0, | |
| v = [], | |
| y = this.N.child("broadcast", e), | |
| b = "true" === this.N.attr("star", e); | |
| if ("broadcast" !== s) { | |
| switch (t) { | |
| case "fresh": | |
| o = 1; | |
| break; | |
| default: | |
| o = g >= -1 && 4 >= g ? g : 1 | |
| } | |
| if (_.isArray(y)) { | |
| var w, E = y.length; | |
| for (w = 0; E > w; w++) { | |
| var S = y[w], | |
| N = this.N.attr("jid", S); | |
| "to" === this.N.tag(S) && N && v.push(N) | |
| } | |
| } | |
| var T, $ = [], | |
| C = this.N.attr("type", e); | |
| switch (C) { | |
| case "ciphertext": | |
| case "text": | |
| var A = this.N.dataStr(this.N.child("body", e)) || ""; | |
| T = { | |
| id: i, | |
| body: "text" === C ? A : void 0, | |
| type: "text" === C ? "chat" : "ciphertext", | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| participant: u, | |
| invis: p, | |
| ack: o, | |
| broadcast: h, | |
| recipients: v, | |
| star: b | |
| }; | |
| var I = this.N.child("media", e); | |
| I && "url" === this.N.attr("type", I) && _.merge(T, { | |
| subtype: "url", | |
| title: this.N.attr("title", I), | |
| description: this.N.attr("description", I), | |
| canonicalUrl: this.N.attr("canonical-url", I), | |
| matchedText: this.N.attr("matched-text", I), | |
| thumbnail: this.thumbFromMediaXml(I) | |
| }), $ = [!i, !a, !l, !s]; | |
| break; | |
| case "media": | |
| var O, k, P, R, M, L, D = this.N.child("media", e), | |
| U = this.N.attr("type", D), | |
| B = this.N.attr("media_key", D), | |
| x = this.N.attr("mimetype", D); | |
| if ("retry" === this.N.attr("reason", D)) return; | |
| switch (U) { | |
| case "image": | |
| case "video": | |
| case "document": | |
| var j = parseInt(this.N.attr("page_count", D), 10) || 0, | |
| W = this.N.attr("filename", D); | |
| L = this.N.attr("caption", D), O = this.thumbFromMediaXml(D), k = this.N.attr("url", D), k = _.isString(k) && k.indexOf("/u/") > 0 ? void 0 : k, P = this.N.attr("filehash", D), R = parseInt(this.N.attr("size", D), 10) || 0, M = this.N.attr("seconds", D), T = { | |
| id: i, | |
| body: O, | |
| type: U, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| participant: u, | |
| invis: p, | |
| ack: o, | |
| clientUrl: k, | |
| duration: M, | |
| broadcast: h, | |
| recipients: v, | |
| filehash: P, | |
| size: R, | |
| caption: L, | |
| mediaKey: B, | |
| star: b, | |
| pageCount: j, | |
| mimetype: x, | |
| filename: W | |
| }, $ = [!i, !a, !l, !s]; | |
| break; | |
| case "location": | |
| var Y = this.N.attr("latitude", D), | |
| F = this.N.attr("longitude", D), | |
| G = this.N.attr("name", D); | |
| O = this.thumbFromMediaXml(D), k = this.N.attr("url", D), T = { | |
| id: i, | |
| body: O, | |
| type: U, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| participant: u, | |
| invis: p, | |
| ack: o, | |
| clientUrl: k, | |
| loc: G, | |
| lat: Y, | |
| lng: F, | |
| broadcast: h, | |
| recipients: v, | |
| star: b | |
| }, $ = [!i, !a, !l, !s, !Y || !F]; | |
| break; | |
| case "audio": | |
| var q = "live" === this.N.attr("origin", D) ? "ptt" : U; | |
| k = this.N.attr("url", D), k = _.isString(k) && k.indexOf("/u/") > 0 ? void 0 : k, P = this.N.attr("filehash", D), R = parseInt(this.N.attr("size", D), 10) || 0, M = this.N.attr("seconds", D), T = { | |
| id: i, | |
| type: q, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| participant: u, | |
| invis: p, | |
| ack: o, | |
| clientUrl: k, | |
| duration: M, | |
| broadcast: h, | |
| recipients: v, | |
| filehash: P, | |
| size: R, | |
| star: b, | |
| mediaKey: B, | |
| mimetype: x | |
| }, $ = [!i, !a, !l, !s]; | |
| break; | |
| case "vcard": | |
| var K = this.N.child("vcard", D), | |
| H = this.N.dataStr(K), | |
| V = this.N.attr("name", K); | |
| T = { | |
| id: i, | |
| body: H, | |
| type: U, | |
| subtype: V, | |
| t: a, | |
| notifyName: m, | |
| from: l, | |
| to: s, | |
| self: r, | |
| author: f, | |
| participant: u, | |
| invis: p, | |
| ack: o, | |
| broadcast: h, | |
| recipients: v, | |
| star: b | |
| }, $ = [!i, !a, !l, !s, !H, !V]; | |
| break; | |
| default: | |
| n.error("wap:parseMsgMessage unknown media type: " + this.N.toString(e), e)() | |
| } | |
| break; | |
| default: | |
| n.error("wap:parseMsgMessage unknown message type: " + this.N.toString(e), e)() | |
| } | |
| return this.dropIfConditionMet($, T) | |
| } | |
| } | |
| }, | |
| sendConversationOpWithKey: function(e, t, r, n) { | |
| var o = this; | |
| return new Promise(function(a, s) { | |
| var d; | |
| switch (e) { | |
| case "clear": | |
| d = (!!n).toString() | |
| } | |
| var c = o.actionNode("set", [ | |
| ["chat", { | |
| type: e, | |
| jid: t, | |
| index: r ? r.id : void 0, | |
| owner: r ? r.fromMe.toString() : void 0, | |
| participant: r ? r.participant : void 0, | |
| star: "undefined" != typeof d ? d : void 0 | |
| }, void 0] | |
| ]); | |
| i.send({ | |
| data: o.BinaryProtocol.write(c), | |
| clientCacheable: !0, | |
| onSend: o.wrap(a), | |
| onDrop: o.wrap(s), | |
| binaryOpts: { | |
| debugString: "action,chat," + [e, r, n].join(), | |
| debugObj: c, | |
| metric: o.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| setSubProtocol: function(e) { | |
| e ? (this.BinaryProtocol = new s(e), this.N = this.BinaryProtocol.Node) : (n.error("Wap:setSubProtocol unknown " + e)(), o.upload("07_unknown_version", !0)["finally"](function() { | |
| return c.hardRefresh() | |
| })) | |
| }, | |
| sendConversationClear: function(e, t, r) { | |
| return this.sendConversationOpWithKey("clear", e, t, r) | |
| }, | |
| sendMessageStarred: function(e, t, r) { | |
| var n = this; | |
| return new Promise(function(o, a) { | |
| var s = t.map(function(e) { | |
| return ["item", { | |
| index: e.id, | |
| owner: e.fromMe.toString(), | |
| participant: e.participant | |
| }, void 0] | |
| }), | |
| d = n.actionNode("set", [ | |
| ["chat", { | |
| type: r ? "star" : "unstar", | |
| jid: e | |
| }, s] | |
| ]); | |
| i.send({ | |
| data: n.BinaryProtocol.write(d), | |
| clientCacheable: !0, | |
| onSend: n.wrap(o), | |
| onDrop: n.wrap(a), | |
| binaryOpts: { | |
| debugString: "action,msgs,star," + [e, r, t.length].join(), | |
| debugObj: d, | |
| metrics: n.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendUnstarAll: function() { | |
| var e = this; | |
| return new Promise(function(t, r) { | |
| var n = e.actionNode("set", [ | |
| ["chat", { | |
| type: "unstar" | |
| }, void 0] | |
| ]); | |
| i.send({ | |
| data: e.BinaryProtocol.write(n), | |
| clientCacheable: !0, | |
| onSend: e.wrap(t), | |
| onDrop: e.wrap(r), | |
| binaryOpts: { | |
| debugString: "action,unstar,all", | |
| debugObj: n, | |
| metrics: e.M.CHAT, | |
| ackRequest: !0, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| sendSetBlock: function(e, t) { | |
| var r = this; | |
| return new Promise(function(n, o) { | |
| var a = t.map(function(e) { | |
| return ["user", { | |
| jid: e.jid | |
| }, void 0] | |
| }), | |
| s = ["block", { | |
| type: e ? "add" : "remove" | |
| }, a], | |
| d = r.actionNode("set", [s]); | |
| i.send({ | |
| data: r.BinaryProtocol.write(d), | |
| clientCacheable: !0, | |
| onSend: r.wrap(n), | |
| onDrop: r.wrap(o), | |
| binaryOpts: { | |
| debugString: "action,block," + e + "," + _.pluck(t, "jid").join(","), | |
| debugObj: d, | |
| metric: r.M.BLOCK, | |
| ackRequest: !1, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| sendSpamReport: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = t.actionNode("set", [ | |
| ["spam", { | |
| jid: e | |
| }, void 0] | |
| ]); | |
| i.send({ | |
| data: t.BinaryProtocol.write(o), | |
| onSend: t.wrap(r), | |
| onDrop: t.wrap(n), | |
| binaryOpts: { | |
| debugString: "action,spam," + e, | |
| debugObj: o, | |
| metric: t.M.SPAM, | |
| ackRequest: !1, | |
| expires: moment().unix() | |
| } | |
| }) | |
| }) | |
| }, | |
| chatFindQuery: function(e) { | |
| var t = this; | |
| return new Promise(function(r, n) { | |
| var o = function(e) { | |
| var n = [], | |
| o = t.BinaryProtocol.read(e), | |
| i = t.N.children(o); | |
| if ("response" === t.N.tag(o) && "chat" === t.N.attr("type", o)) | |
| if ("true" === t.N.attr("duplicate", o)) n = "preempted"; | |
| else if (_.isArray(i)) { | |
| var a, s = i.length; | |
| for (a = 0; s > a; a++) { | |
| var d = t.parseChat(i[a]); | |
| d && n.push(d) | |
| } | |
| } | |
| r(n) | |
| }, | |
| a = { | |
| type: "chat" | |
| }; | |
| "boolean" == typeof e && e ? a.kind = "retry" : "string" == typeof e && (a.jid = e); | |
| var s = t.queryNode(a, void 0); | |
| i.sendEphemeral({ | |
| data: t.BinaryProtocol.write(s), | |
| onSend: t.binWrap(o, r), | |
| onDrop: t.wrap(n), | |
| binaryOpts: { | |
| debugString: ["query", "chat", e].join(), | |
| debugObj: s, | |
| metric: t.M.QUERY_CHAT, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| msgCreateRecord: function(e, t) { | |
| var r = this; | |
| return new Promise(function(o, s) { | |
| var c, u, l = e.id; | |
| if ("chat" === e.type) { | |
| var f = [ | |
| ["body", void 0, e.body] | |
| ]; | |
| "url" === e.subtype && f.push(["media", { | |
| type: "url", | |
| title: e.title, | |
| description: e.description, | |
| "canonical-url": e.canonicalUrl, | |
| "matched-text": e.matchedText, | |
| encoding: "raw" | |
| }, e.thumbnail ? a.fromBase64(e.thumbnail, !1) : void 0]), u = Promise.resolve(["message", { | |
| type: "text", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, f]) | |
| } else if ("location" === e.type) c = e.body ? a.fromBase64(e.body, !1) : void 0, u = Promise.resolve(["message", { | |
| type: "media", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["media", { | |
| type: "location", | |
| latitude: e.lat || void 0, | |
| longitude: e.lng || void 0, | |
| name: e.loc && e.url ? e.loc : void 0, | |
| url: e.loc && e.url ? e.url : void 0, | |
| encoding: e.body ? "raw" : void 0 | |
| }, c] | |
| ] | |
| ]); | |
| else if ("vcard" === e.type) { | |
| var h = ["vcard", { | |
| name: e.subtype | |
| }, e.body]; | |
| u = Promise.resolve(["message", { | |
| type: "media", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["media", { | |
| type: "vcard" | |
| }, | |
| [h] | |
| ] | |
| ] | |
| ]) | |
| } else { | |
| var p = e.mediaKey; | |
| c = e.body ? a.fromBase64(e.body, !1) : void 0; | |
| var m = "ptt" === e.type ? "audio" : e.type; | |
| u = (t && !p ? r.sendMedia(e.avparams) : Promise.resolve(_.merge({ | |
| status: 200, | |
| type: m | |
| }, e.avparams))).then(function(t) { | |
| return 200 === t.status ? Promise.resolve(["message", { | |
| type: "media", | |
| to: e.to, | |
| id: e.id, | |
| t: e.t.toString() | |
| }, | |
| [ | |
| ["media", { | |
| encoding: e.body ? "raw" : void 0, | |
| origin: "ptt" === e.type ? "live" : void 0, | |
| seconds: "ptt" === e.type && e.duration ? e.duration.toString() : void 0, | |
| type: t.type, | |
| mimetype: e.mimetype || t.mimetype || void 0, | |
| size: e.size ? e.size.toString() : void 0, | |
| filehash: t.filehash, | |
| url: t.url, | |
| duration: t.duration ? t.duration.toString() : void 0, | |
| vcodec: t.vcodec || void 0, | |
| width: t.width ? t.width.toString() : void 0, | |
| height: t.height ? t.height.toString() : void 0, | |
| fps: t.fps ? t.fps.toString() : void 0, | |
| vbitrate: t.vbitrate ? t.vbitrate.toString() : void 0, | |
| acodec: t.acodec || void 0, | |
| asampfreq: t.asampfreq ? t.asampfreq.toString() : void 0, | |
| asampfmt: t.asampfmt || void 0, | |
| abitrate: t.abitrate ? t.abitrate.toString() : void 0, | |
| caption: "video" !== e.type && "image" !== e.type && "document" !== e.type || !e.caption ? void 0 : e.caption, | |
| page_count: "number" != typeof e.pageCount || isNaN(e.pageCount) ? void 0 : e.pageCount.toString(), | |
| media_key: p, | |
| filename: t.filename | |
| }, c] | |
| ] | |
| ]) : (n.error("wap:msgCreateRecord:sendMedia error " + t.status)(), Promise.reject()) | |
| })["catch"](function() { | |
| return n.error("wap:msgCreateRecord:sendMedia dropped")(), Promise.reject() | |
| }) | |
| } | |
| u.then(function(t) { | |
| var n = r.actionNode("relay", [t]), | |
| a = r.wrap(o); | |
| a.tag = l, a.meta = { | |
| type: "message", | |
| key: new d(e.from, e.to, e.id) | |
| }, i.send({ | |
| data: r.BinaryProtocol.write(n), | |
| onSend: a, | |
| onDrop: r.wrap(s), | |
| binaryOpts: { | |
| debugString: ["action", "message", e.type, e.subtype].join(), | |
| debugObj: n, | |
| metric: r.M.MESSAGE, | |
| ackRequest: !1 | |
| } | |
| }) | |
| })["catch"](function() { | |
| n.error("wap:msgCreateRecord mPromise error")(), s() | |
| }) | |
| }) | |
| }, | |
| msgFindQuery: function(e, t) { | |
| var r = this; | |
| return "before" !== e ? Promise.reject("wap:msgFindQuery:unsupported:" + e) : new Promise(function(e, n) { | |
| var o = function(t) { | |
| var n = [], | |
| o = r.BinaryProtocol.read(t), | |
| i = r.N.children(o); | |
| if ("response" === r.N.tag(o) && ("message" === r.N.attr("type", o) || "star" === r.N.attr("type", o) || "search" === r.N.attr("type", o)) && _.isArray(i)) { | |
| var a, s = i.length; | |
| for (a = 0; s > a; a++) { | |
| var d = r.parseMsg(i[a], "response"); | |
| d && n.push(d) | |
| } | |
| } | |
| e(n) | |
| }, | |
| a = r.queryNode({ | |
| type: "message", | |
| jid: t.remote, | |
| count: t.count.toString(), | |
| index: t.id, | |
| owner: "undefined" == typeof t.fromMe ? void 0 : t.fromMe.toString(), | |
| participant: t.participant | |
| }, void 0); | |
| i.sendEphemeral({ | |
| data: r.BinaryProtocol.write(a), | |
| onSend: r.binWrap(o, e), | |
| onDrop: r.wrap(n), | |
| binaryOpts: { | |
| debugString: "query,message," + [t.toString(), t.count].join(), | |
| debugObj: a, | |
| metric: r.M.QUERY_MESSAGES, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| } | |
| }; | |
| e.exports = _.defaults(l, u) | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(1), | |
| o = r(9), | |
| i = r(10), | |
| a = r(34), | |
| s = r(19), | |
| d = r(55), | |
| c = r(14), | |
| u = r(158), | |
| l = { | |
| version: "08", | |
| BinaryProtocol: null, | |
| N: null, | |
| M: { | |
| DEBUG_LOG: 1, | |
| QUERY_RESUME: 2, | |
| QUERY_RECEIPT: 3, | |
| QUERY_MEDIA: 4, | |
| QUERY_CHAT: 5, | |
| QUERY_CONTACTS: 6, | |
| QUERY_MESSAGES: 7, | |
| PRESENCE: 8, | |
| PRESENCE_SUBSCRIBE: 9, | |
| GROUP: 10, | |
| READ: 11, | |
| CHAT: 12, | |
| RECEIVED: 13, | |
| PIC: 14, | |
| STATUS: 15, | |
| MESSAGE: 16, | |
| QUERY_ACTIONS: 17, | |
| BLOCK: 18, | |
| QUERY_GROUP: 19, | |
| QUERY_PREVIEW: 20, | |
| QUERY_EMOJI: 21, | |
| QUERY_MESSAGE_INFO: 22, | |
| SPAM: 23, | |
| QUERY_SEARCH: 24 | |
| }, | |
| epochCount: 0, | |
| epoch: 0, | |
| isRequestingDeviceUploadLogsMutex: 0, | |
| parseChat: function(e) { | |
| if ("chat" === this.N.tag(e)) { | |
| var t = this.N.attr("jid", e), | |
| r = parseInt(this.N.attr("t", e), 10) || void 0, | |
| n = this.N.attr("type", e), | |
| o = parseInt(this.N.attr("mute", e), 10) || void 0, | |
| i = parseInt(this.N.attr("before", e), 10) || void 0, | |
| a = "true" === this.N.attr("archive", e), | |
| s = "true" === this.N.attr("read_only", e), | |
| d = parseInt(this.N.attr("modify_tag", e), 10) || void 0, | |
| c = this.N.attr("name", e) || void 0, | |
| u = this.safeParseInt(e, "count"), | |
| l = "true" === this.N.attr("message", e), | |
| f = "true" === this.N.attr("star", e), | |
| h = "false" === this.N.attr("spam", e); | |
| "ahead" === n && (n = "clear"); | |
| var p, m = this.N.children(e); | |
| if (_.isArray(m)) { | |
| p = []; | |
| var g, v, y = m.length; | |
| for (g = 0; y > g; g++) | |
| if (v = m[g], "item" === this.N.tag(v)) { | |
| var b = this.N.attr("index", v); | |
| b && p.push([b, "true" === this.N.attr("owner", v), this.N.attr("participant", v)]) | |
| } | |
| } | |
| var w = { | |
| id: t, | |
| t: r, | |
| type: n, | |
| keys: p, | |
| before: i, | |
| archive: a, | |
| isReadOnly: s, | |
| unreadCount: u, | |
| muteExpiration: o, | |
| modifyTag: d, | |
| name: c, | |
| pendingMsgs: l, | |
| star: f, | |
| notSpam: h | |
| }, | |
| E = [n && "delete" !== n && "clear" !== n && "archive" !== n && "unarchive" !== n && "mute" !== n && "star" !== n && "unstar" !== n && "spam" !== n && "modify_tag" !== n, !n && !t, a && n && "clear" !== n, "clear" !== n && i && i > 0, "clear" !== n && "star" !== n && "unstar" !== n && p && p.length > 0]; | |
| return this.dropIfConditionMet(E, w) | |
| } | |
| }, | |
| sendConversationOpWithKey: function(e, t, r, n) { | |
| var o = this; | |
| return new Promise(function(a, s) { | |
| var d, c; | |
| switch (e) { | |
| case "clear": | |
| d = (!!n).toString(); | |
| break; | |
| case "spam": | |
| c = (!!n).toString() | |
| } | |
| var u = o.actionNode("set", [ | |
| ["chat", { | |
| type: e, | |
| jid: t, | |
| index: r ? r.id : void 0, | |
| owner: r ? r.fromMe.toString() : void 0, | |
| participant: r ? r.participant : void 0, | |
| star: "undefined" != typeof d ? d : void 0, | |
| spam: "undefined" != typeof c ? c : void 0 | |
| }, void 0] | |
| ]); | |
| i.send({ | |
| data: o.BinaryProtocol.write(u), | |
| clientCacheable: !0, | |
| onSend: o.wrap(a), | |
| onDrop: o.wrap(s), | |
| binaryOpts: { | |
| debugString: "action,chat," + [e, r, n].join(), | |
| debugObj: u, | |
| metric: o.M.CHAT, | |
| ackRequest: !0 | |
| } | |
| }) | |
| }) | |
| }, | |
| setSubProtocol: function(e) { | |
| e ? (this.BinaryProtocol = new d(e), this.N = this.BinaryProtocol.Node) : (n.error("Wap:setSubProtocol unknown " + e)(), o.upload(this.version + "_unknown_version", !0)["finally"](function() { | |
| return c.hardRefresh() | |
| })) | |
| }, | |
| resyncMessages: function(e) { | |
| var t = this; | |
| return new a(function(r, o) { | |
| var a = function(e) { | |
| var o = [], | |
| i = t.BinaryProtocol.read(e), | |
| a = t.N.children(i); | |
| if (n.logColor("green", "bin-recv: response,resume", i)(), "response" === t.N.tag(i) && "resume" === t.N.attr("type", i) && _.isArray(a)) { | |
| var s, d = a.length; | |
| for (s = 0; d > s; s++) { | |
| var c = t.parseChat(a[s]); | |
| c && o.push(c) | |
| } | |
| } | |
| r({ | |
| checksum: t.N.attr("checksum", i), | |
| data: o | |
| }) | |
| }, | |
| d = e.map(function(e) { | |
| var t = { | |
| jid: e.wid, | |
| index: e.id, | |
| owner: e.fromMe, | |
| participant: e.participant, | |
| archive: (!!e.archive).toString(), | |
| spam: (!e.notSpam).toString() | |
| }; | |
| return e.mute && (t.mute = e.mute.toString()), e.active && (t.active = "true"), s.isGroup(e.wid) && (t.read_only = (!!e.isReadOnly).toString()), e.modifyTag && (t.modify_tag = e.modifyTag.toString()), e.unreadCount && (t.count = e.unreadCount.toString()), ["last", t, void 0] | |
| }), | |
| c = t.queryNode({ | |
| type: "resume" | |
| }, d); | |
| i.sendEphemeral({ | |
| data: t.BinaryProtocol.write(c), | |
| onSend: t.binWrap(a, r), | |
| onDrop: t.wrap(o), | |
| binaryOpts: { | |
| debugString: "query,resume", | |
| debugObj: c, | |
| metric: t.M.QUERY_RESUME, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| requestMediaReupload: function(e) { | |
| var t = this; | |
| return new Promise(function(r, o) { | |
| var a = e.id, | |
| s = function(e) { | |
| var o, i = t.BinaryProtocol.read(e); | |
| if (n.logColor("green", "bin-recv: response,media", i)(), "response" === t.N.tag(i) && "media" === t.N.attr("type", i)) { | |
| var a = parseInt(t.N.attr("code", i)) || 400, | |
| s = t.N.attr("url", i); | |
| a >= 500 && 502 !== a ? (n.error("wap:requestMediaReupload:error " + a)(), o = { | |
| status: a | |
| }) : 200 === a && s ? o = { | |
| status: 200, | |
| url: s, | |
| mediaKey: t.N.attr("media_key", i) | |
| } : 200 !== a || s ? (n.error("wap:requestMediaReupload:error " + a)(), o = { | |
| status: a | |
| }) : o = { | |
| status: 400 | |
| } | |
| } else n.error("wap:requestMediaReupload:malformed")(), o = { | |
| status: 400 | |
| }; | |
| r(o) | |
| }, | |
| d = a, | |
| c = t.queryNode({ | |
| type: "media", | |
| index: d.id, | |
| jid: d.remote, | |
| owner: d.fromMe.toString(), | |
| participant: d.participant | |
| }, void 0); | |
| i.sendEphemeral({ | |
| data: t.BinaryProtocol.write(c), | |
| onSend: t.binWrap(s, r), | |
| onDrop: t.wrap(o), | |
| binaryOpts: { | |
| debugString: "query,media", | |
| debugObj: c, | |
| metric: t.M.QUERY_MEDIA, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| }, | |
| sendConversationUnseen: function(e, t) { | |
| return this.sendConversationSeen(e, t, -2) | |
| }, | |
| sendConversationNotSpam: function(e) { | |
| return this.sendConversationOpWithKey("spam", e, void 0, !1) | |
| }, | |
| msgFindQuery: function(e, t) { | |
| var r = this; | |
| return new Promise(function(o, a) { | |
| var s, d = function(e) { | |
| var t = [], | |
| i = r.BinaryProtocol.read(e), | |
| a = r.N.children(i); | |
| if (n.logColor("green", "bin-recv: response,msg", i)(), "response" === r.N.tag(i) && ("message" === r.N.attr("type", i) || "star" === r.N.attr("type", i) || "search" === r.N.attr("type", i)) && _.isArray(a)) { | |
| var s, d = a.length; | |
| for (s = 0; d > s; s++) { | |
| var c = r.parseMsg(a[s], "response"); | |
| c && t.push(c) | |
| } | |
| } | |
| o(t) | |
| }, | |
| c = ""; | |
| switch (e) { | |
| case "after": | |
| t.id || (e = "before"); | |
| case "before": | |
| s = { | |
| type: "message", | |
| kind: e, | |
| jid: t.remote, | |
| count: t.count.toString(), | |
| index: t.id, | |
| owner: "undefined" == typeof t.fromMe ? void 0 : t.fromMe.toString(), | |
| participant: t.participant | |
| }, c = [t.toString(), t.count].join(); | |
| break; | |
| case "search": | |
| s = { | |
| type: "search", | |
| search: t.searchTerm | |
| }, c = "search," + t.searchTerm; | |
| break; | |
| case "star": | |
| s = { | |
| type: "star" | |
| }, c = "starred" | |
| } | |
| var u = r.queryNode(s, void 0); | |
| i.sendEphemeral({ | |
| data: r.BinaryProtocol.write(u), | |
| onSend: r.binWrap(d, o), | |
| onDrop: r.wrap(a), | |
| binaryOpts: { | |
| debugString: "query,message," + c, | |
| debugObj: u, | |
| metric: r.M.QUERY_SEARCH, | |
| ackRequest: !1 | |
| } | |
| }) | |
| }) | |
| } | |
| }; | |
| e.exports = _.defaults(l, u) | |
| }, function(e, t, r) { | |
| var n = r(76), | |
| o = r(23)("toStringTag"), | |
| i = "Arguments" == n(function() { | |
| return arguments | |
| }()); | |
| e.exports = function(e) { | |
| var t, r, a; | |
| return void 0 === e ? "Undefined" : null === e ? "Null" : "string" == typeof(r = (t = Object(e))[o]) ? r : i ? n(t) : "Object" == (a = n(t)) && "function" == typeof t.callee ? "Arguments" : a | |
| } | |
| }, function(e, t) { | |
| e.exports = function(e) { | |
| if (void 0 == e) throw TypeError("Can't call method on " + e); | |
| return e | |
| } | |
| }, function(e, t, r) { | |
| var n = r(31), | |
| o = r(57), | |
| i = r(58), | |
| a = "prototype", | |
| s = function(e, t, r) { | |
| var d, c, u, l = e & s.F, | |
| f = e & s.G, | |
| h = e & s.S, | |
| p = e & s.P, | |
| m = e & s.B, | |
| g = e & s.W, | |
| _ = f ? o : o[t] || (o[t] = {}), | |
| v = f ? n : h ? n[t] : (n[t] || {})[a]; | |
| f && (r = t); | |
| for (d in r) c = !l && v && d in v, c && d in _ || (u = c ? v[d] : r[d], _[d] = f && "function" != typeof v[d] ? r[d] : m && c ? i(u, n) : g && v[d] == u ? function(e) { | |
| var t = function(t) { | |
| return this instanceof e ? new e(t) : e(t) | |
| }; | |
| return t[a] = e[a], t | |
| }(u) : p && "function" == typeof u ? i(Function.call, u) : u, p && ((_[a] || (_[a] = {}))[d] = u)) | |
| }; | |
| s.F = 1, s.G = 2, s.S = 4, s.P = 8, s.B = 16, s.W = 32, e.exports = s | |
| }, function(e, t) { | |
| var r = {}.hasOwnProperty; | |
| e.exports = function(e, t) { | |
| return r.call(e, t) | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(165), | |
| o = r(162), | |
| i = r(167), | |
| a = r(102), | |
| s = r(163), | |
| d = r(59), | |
| c = r(398), | |
| u = r(103), | |
| l = r(35).getProto, | |
| f = r(23)("iterator"), | |
| h = !([].keys && "next" in [].keys()), | |
| p = "@@iterator", | |
| m = "keys", | |
| g = "values", | |
| _ = function() { | |
| return this | |
| }; | |
| e.exports = function(e, t, r, v, y, b, w) { | |
| c(r, t, v); | |
| var E, S, N = function(e) { | |
| if (!h && e in A) return A[e]; | |
| switch (e) { | |
| case m: | |
| return function() { | |
| return new r(this, e) | |
| }; | |
| case g: | |
| return function() { | |
| return new r(this, e) | |
| } | |
| } | |
| return function() { | |
| return new r(this, e) | |
| } | |
| }, | |
| T = t + " Iterator", | |
| $ = y == g, | |
| C = !1, | |
| A = e.prototype, | |
| I = A[f] || A[p] || y && A[y], | |
| O = I || N(y); | |
| if (I) { | |
| var k = l(O.call(new e)); | |
| u(k, T, !0), !n && s(A, p) && a(k, f, _), $ && I.name !== g && (C = !0, O = function() { | |
| return I.call(this) | |
| }) | |
| } | |
| if (n && !w || !h && !C && A[f] || a(A, f, O), d[t] = O, d[T] = _, y) | |
| if (E = { | |
| values: $ ? O : N(g), | |
| keys: b ? O : N(m), | |
| entries: $ ? N("entries") : O | |
| }, w) | |
| for (S in E) S in A || i(A, S, E[S]); | |
| else o(o.P + o.F * (h || C), t, E); | |
| return E | |
| } | |
| }, function(e, t) { | |
| e.exports = !0 | |
| }, function(e, t) { | |
| e.exports = function(e, t) { | |
| return { | |
| enumerable: !(1 & e), | |
| configurable: !(2 & e), | |
| writable: !(4 & e), | |
| value: t | |
| } | |
| } | |
| }, function(e, t, r) { | |
| e.exports = r(102) | |
| }, function(e, t) { | |
| var r = Math.ceil, | |
| n = Math.floor; | |
| e.exports = function(e) { | |
| return isNaN(e = +e) ? 0 : (e > 0 ? n : r)(e) | |
| } | |
| }, , , , , , , , function(e, t, r) { | |
| e.exports = r.p + "img/23de3746eb94b2e205186a6486cca7f1.png" | |
| }, function(e, t, r) { | |
| e.exports = r.p + "img/3c01a611ce9ae52843e8da979486ecb4.svg" | |
| }, function(e, t) { | |
| e.exports = { | |
| action_undo: "Undo", | |
| action_try_again: "Try again.", | |
| action_profile_setting: "Setting profile photo", | |
| action_profile_set: "Profile photo set", | |
| action_profile_set_failed: "Couldn't set profile photo.", | |
| action_status_setting: "Changing status", | |
| action_status_set: "Status changed", | |
| action_status_set_failed: "Couldn't change status.", | |
| action_status_empty: "Status can't be empty", | |
| action_profile_removing: "Removing profile photo", | |
| action_profile_removed: "Profile photo removed", | |
| action_profile_remove_failed: "Couldn't remove profile photo.", | |
| action_chat_deleting: "Deleting chat", | |
| action_chat_deleted: "Chat deleted", | |
| action_chat_delete_failed: "Couldn't delete chat.", | |
| action_chat_archiving: "Archiving chat", | |
| action_chat_archived: "Chat archived", | |
| action_chat_archive_failed: "Couldn't archive chat.", | |
| action_chat_unarchiving: "Unarchiving chat", | |
| action_chat_unarchived: "Chat unarchived", | |
| action_chat_unarchive_failed: "Couldn't unarchive chat.", | |
| action_chat_marking_read: "Marking as read", | |
| action_chat_marked_read: "Marked as read", | |
| action_chat_mark_read_failed: "Couldn't mark chat as read.", | |
| action_chat_marking_unread: "Marking as unread", | |
| action_chat_marked_unread: "Marked as unread", | |
| action_chat_mark_unread_failed: "Couldn't mark chat as unread.", | |
| action_chat_clearing: "Clearing chat", | |
| action_chat_cleared: "Chat cleared", | |
| action_chat_clear_failed: "Couldn't clear chat.", | |
| action_group_deleting: "Deleting group", | |
| action_group_deleted: "Group deleted", | |
| action_group_delete_failed: "Couldn't delete group.", | |
| action_mark_as_not_spam: "Marking as not spam", | |
| action_marked_as_not_spam: "Marked as not spam", | |
| action_mark_as_not_spam_failed: "Couldn't mark as not spam", | |
| action_spam_report: "Reporting spam", | |
| action_spam_reported: "Reported spam", | |
| action_spam_report_failed: "Couldn't report spam", | |
| action_broadcast_deleting: "Deleting broadcast list", | |
| action_broadcast_deleted: "Broadcast list deleted", | |
| action_broadcast_delete_failed: "Couldn't delete broadcast list.", | |
| action_participant_adding: "Adding __participant__", | |
| action_participant_added: "__participant__ added", | |
| action_participant_add_failed: "Couldn't add __participant__.", | |
| action_participant_removing: "Removing __participant__", | |
| action_participant_removed: "__participant__ removed", | |
| action_participant_remove_failed: "Couldn't remove __participant__.", | |
| action_participant_promoting: "Making __participant__ a group admin", | |
| action_participant_promoted: "__participant__ is now a group admin", | |
| action_participant_promote_failed: "Couldn't make __participant__ an admin.", | |
| action_blocking: "Blocking __participant__", | |
| action_blocked: "__participant__ blocked", | |
| action_block_failed: "Couldn't block __participant__", | |
| action_unblocking: "Unblocking __participant__", | |
| action_unblocked: "__participant__ unblocked", | |
| action_unblock_failed: "Couldn't unblock __participant__", | |
| action_participant_failed_already_added: "__participant__ is already a participant.", | |
| action_participant_failed_401: "You're not an admin.", | |
| action_participant_failed_403: "You're not a participant.", | |
| action_participant_failed_404: "This group has ended.", | |
| action_group_creating: "Creating group", | |
| action_group_created: "Created group", | |
| action_group_create_failed: "Couldn't create group.", | |
| action_group_create_failed_406: "Please enter a shorter subject.", | |
| action_group_create_failed_participant: "Can't add more than __max__ participants", | |
| action_group_subject_empty: "Group subject can't be empty", | |
| action_group_icon_setting: "Setting group icon", | |
| action_group_icon_set: "Group icon set", | |
| action_group_icon_set_failed: "Couldn't set group icon.", | |
| action_group_icon_removing: "Removing group icon", | |
| action_group_icon_removed: "Group icon removed", | |
| action_group_icon_remove_failed: "Couldn't remove group icon.", | |
| action_group_exiting: "Exiting group", | |
| action_group_exited: "Exited group", | |
| action_group_exit_failed: "Couldn't exit group.", | |
| action_group_renaming: "Renaming group", | |
| action_group_renamed: "Group renamed to __subject__", | |
| action_group_rename_failed: "Couldn't rename group.", | |
| action_group_muting: "Muting group", | |
| action_group_muted: "Group muted", | |
| action_group_mute_failed: "Couldn't mute group.", | |
| action_group_unmuting: "Unmuting group", | |
| action_group_unmuted: "Group unmuted", | |
| action_group_unmute_failed: "Couldn't unmute group.", | |
| action_chat_muting: "Muting chat", | |
| action_chat_muted: "Chat muted", | |
| action_chat_mute_failed: "Couldn't mute chat.", | |
| action_chat_unmuting: "Unmuting chat", | |
| action_chat_unmuted: "Chat unmuted", | |
| action_chat_unmute_failed: "Couldn't unmute chat.", | |
| action_message_deleting: "Deleting message", | |
| action_message_deleting_plural: "Deleting messages", | |
| action_message_deleted: "Message deleted", | |
| action_message_deleted_plural: "__count__ messages deleted", | |
| action_message_delete_failed: "Couldn't delete message", | |
| action_message_delete_failed_plural: "Couldn't delete messages", | |
| delete_message: "Delete message", | |
| delete_message_plural: "Delete messages", | |
| action_message_starring: "Starring message", | |
| action_message_starring_plural: "Starring messages", | |
| action_message_starred: "Message starred", | |
| action_message_starred_plural: "__count__ messages starred", | |
| action_message_star_failed: "Couldn't star message", | |
| action_message_star_failed_plural: "Couldn't star messages", | |
| action_message_unstarring: "Unstarring message", | |
| action_message_unstarring_plural: "Unstarring messages", | |
| action_message_unstarred: "Message unstarred", | |
| action_message_unstarred_plural: "__count__ messages starred", | |
| action_message_unstar_failed: "Couldn't unstar message", | |
| action_message_unstar_failed_plural: "Couldn't unstar messages", | |
| star_message: "Star message", | |
| star_message_plural: "Star messages", | |
| unstar_message: "Unstar message", | |
| unstar_message_plural: "Unstar messages", | |
| msg_info_failed: "To view message info, update WhatsApp on your phone.", | |
| intro_title: "Keep your phone connected", | |
| intro_connection: "WhatsApp Web connects to your phone to sync messages. To reduce data usage, connect your phone to Wi-Fi.", | |
| add_contact_to_group: "Add to a group", | |
| enumeration_comma: ", ", | |
| archive_chat: "Archive chat", | |
| unarchive_chat: "Unarchive chat", | |
| mark_unread_chat: "Mark as unread", | |
| mark_read_chat: "Mark as read", | |
| forward: "Forward", | |
| selected_count: "__count__ selected", | |
| selected_count_plural: "__count__ selected", | |
| forward_message: "Forward message", | |
| forward_message_plural: "Forward messages", | |
| forward_message_to: "Forward message to", | |
| forward_message_to_plural: "Forward messages to", | |
| confirm_forward_to_group: "Forward to “__chat__”?", | |
| confirm_forward_to_contact: "Forward to __chat__?", | |
| confirm_unblock_contact_and_forward: "Unblock __chat__ and forward messages?", | |
| confirm_unblock_contact_and_forward_text: "Blocked. Click to unblock and send.", | |
| message_author: "Message __author__", | |
| message: "Message", | |
| message_info: "Message info", | |
| hidden_group_message_text: "New Message", | |
| hidden_group_message_text_with_author: "Message from __author__", | |
| hidden_message_text: "__unreadCount__ New Message", | |
| hidden_message_text_plural: "__unreadCount__ New Messages", | |
| message_info_played_by: "Played by", | |
| message_info_played: "Played", | |
| message_info_read_by: "Read by", | |
| message_info_read: "Read", | |
| message_info_seen_by: "Seen by", | |
| message_info_seen: "Seen", | |
| message_info_delivered_to: "Delivered to", | |
| message_info_delivered: "Delivered", | |
| message_info_remaining: "__count__ remaining", | |
| message_info_remaining_plural: "__count__ remaining", | |
| copy_text: "Copy text", | |
| web_archive_broadcast: "Archive broadcast list", | |
| web_unarchive_broadcast: "Unarchive broadcast list", | |
| conversation_archived: "Chat archived", | |
| broadcast_archived: "Broadcast list archived", | |
| group_archived: "Group archived", | |
| web_undo: "undo", | |
| web_menuitem_groupchat: "New group", | |
| web_menuitem_new: "New chat", | |
| menuitem_profile_status: "Profile & status", | |
| menuitem_send_logs: "Send logs", | |
| send_logs_confirm: "send", | |
| describe_logs: "Enter log issue", | |
| menuitem_help: "Help", | |
| menuitem_keep_me_signed_in: "Keep me signed in", | |
| menuitem_notification_sounds: "Notification sounds", | |
| menuitem_notifications: "Notifications", | |
| menuitem_blocked: "Blocked", | |
| menuitem_archived: "Archived", | |
| menuitem_settings: "Settings", | |
| menuitem_starred: "Starred", | |
| menuitem_logout: "Log out", | |
| menuitem_remove: "Remove", | |
| menuitem_make_group_admin: "Make group admin", | |
| menutitle_attach: "Attach", | |
| menutitle_menu: "Menu", | |
| web_settings_faq: "FAQ", | |
| if_unchecked_you_will_be_logged_out_afterawhile: "You'll be logged out after several minutes of inactivity", | |
| change_group_icon: "Change group icon", | |
| add_group_icon: "Add group icon", | |
| change_profile_photo: "Change profile photo", | |
| add_profile_photo: "Add profile photo", | |
| adjust_image: "Drag the image to adjust", | |
| done_adjusting: "Done", | |
| remove_profile_photo: "Remove your profile photo?", | |
| remove_group_icon: "Remove this group's icon?", | |
| delete_message_confirmation: "Delete message?", | |
| delete_message_confirmation_plural: "Delete messages?", | |
| confirm_remove_group_participant: "Remove __participant__ from “__subject__” group?", | |
| confirm_add_group_participant: "Add __participant__ to “__subject__” group?", | |
| confirm_promote_group_participant: "Make __participant__ an admin for “__subject__” group?", | |
| remove: "Remove", | |
| conversation_unarchived: "Chat unarchived", | |
| conversation_archive_failed: "Couldn't archive chat.", | |
| conversation_unarchive_failed: "Couldn't unarchive chat.", | |
| web_status: "Status", | |
| web_delete: "Delete", | |
| web_exit: "Exit", | |
| subject: "Subject", | |
| group_subject: "Group Subject", | |
| web_contact_phone: "Phone", | |
| web_group_creation_time: "Created __when__", | |
| group_participant_hint: "Type contact name", | |
| participant_already_blocked: "Already blocked", | |
| chat_not_an_admin: "You are not an admin", | |
| new_chat_flow_title: "New chat", | |
| new_group_flow_title: "New group", | |
| add_group_participants_title: "Add group participants", | |
| add_group_participant: "Add participant", | |
| already_added_to_group: "Already added to group", | |
| web_contact_info: "Contact info", | |
| broadcast_list_info: "Broadcast list info", | |
| web_group_info: "Group info", | |
| web_groups_participation_you_and_name: "Groups in common", | |
| web_participants_title: "Participants", | |
| web_recipients_title: "Recipients", | |
| web_participants_count: "__count__ of __max__", | |
| blocked_flow_title: "Blocked contacts", | |
| add_blocked_title: "Add blocked contact", | |
| add_blocked_hint: "Type contact name", | |
| blocked_description: "List of contacts that you have blocked", | |
| add_blocked_description: "Blocked contacts will no longer be able to call you or send you messages", | |
| add_blocked_instructions: "Click __icon__ button below to select a contact to block", | |
| blocked_empty: "No blocked contacts yet", | |
| unblock_button: "Unblock", | |
| unblock_confirmation: "Unblock __contact__?", | |
| settings_flow_title: "Settings", | |
| archived_flow_title: "Archived chats", | |
| archived_empty: "No archived chats", | |
| starred_flow_title: "Starred messages", | |
| starred_empty: "No starred messages", | |
| cant_load_whatsapp: "Can't Load WhatsApp Web", | |
| computer_behind_proxy: "Your computer is connected to a network that prevents WhatsApp Web from working correctly", | |
| missing_photo_title: "Photo Unavailable", | |
| missing_photo_text: "Can’t view this photo because it's no longer on your phone.", | |
| missing_photo_forward_text: "Can’t forward this photo because it's no longer on your phone.", | |
| missing_video_title: "Video Unavailable", | |
| missing_video_text: "Can’t play this video because it's no longer on your phone.", | |
| missing_video_forward_text: "Can’t forward this video because it's no longer on your phone.", | |
| missing_audio_title: "Voice Message Unavailable", | |
| missing_audio_text: "Can’t play this Voice Message because it's no longer on your phone.", | |
| missing_audio_forward_text: "Can’t forward this Voice Message because it's no longer on your phone.", | |
| missing_media_title: "Media Message Unavailable", | |
| missing_media_forward_text: "Can't forward this media message because it's no longer on your phone", | |
| missing_media_forward_text_plural: "Can't forward some media messages because they are no longer on your phone", | |
| err_unsent_forward_title: "Can’t Forward", | |
| err_unsent_forward_text: "Wait until your message finishes sending and displays a checkmark before forwarding.", | |
| err_unsent_forward_text_plural: "Wait until each of your messages finishes sending and displays a checkmark before forwarding.", | |
| confirm_forward_partial_messages_title: "Can't forward all messages", | |
| confirm_forward_partial_messages_text: "Some messages have not been sent, do you want to forward rest of the messages?", | |
| retry_upload_photo_title: "Couldn’t Send Photo", | |
| retry_upload_photo_text: "Open WhatsApp on your phone and resend this photo", | |
| retry_upload_video_title: "Couldn’t Send Video", | |
| retry_upload_video_text: "Open WhatsApp on your phone and resend this video", | |
| retry_upload_audio_title: "Couldn’t Send Voice Message", | |
| retry_upload_audio_text: "Open WhatsApp on your phone and resend this Voice Message", | |
| guide_desktop_notifications_title: "Allow notifications", | |
| guide_desktop_notifications_description: "To get notifications for new messages, click “Allow” above.", | |
| guide_desktop_notifications_description_firefox: "To get notifications for new messages, select “Always show notifications” from the prompt below the URL bar.", | |
| guide_desktop_camera_title: "Allow camera", | |
| guide_desktop_camera_description: "To take photos, click “Allow” above to give WhatsApp Web access to your computer's camera.", | |
| guide_desktop_camera_description_firefox: "To take photos, WhatsApp Web needs access to your computer’s camera. Select “Always share” from the prompt below the URL bar.", | |
| guide_desktop_camera_description_edge: "To take photos, click “Yes” below to give WhatsApp Web access to your computer's camera.", | |
| guide_desktop_mic_title: "Allow microphone", | |
| guide_desktop_mic_description: "To record Voice Messages, click “Allow” above to give WhatsApp Web access to your computer's microphone.", | |
| guide_desktop_mic_description_firefox: "To record Voice Messages, WhatsApp Web needs access to your computer’s microphone. Select “Always share” from the prompt below the URL bar. Note: selecting “Share selected device” won’t let you record Voice Messages.", | |
| guide_desktop_mic_description_edge: "To record Voice Messages, click “Yes” below to give WhatsApp Web access to your computer's microphone.", | |
| guide_desktop_camera_fail_description: "To take photos, WhatsApp Web needs access to your computer's camera. Click __chrome_media_error__ in the URL bar and choose “Always allow web.whatsapp.com to access your camera.”", | |
| guide_desktop_camera_fail_description_firefox: "To take photos, WhatsApp Web needs access to your computer’s camera. Click __firefox_lock__ in the URL bar and set “Use the Camera” to “Allow.”", | |
| guide_desktop_camera_fail_description_opera: "To take photos, WhatsApp Web needs access to your computer’s camera. Click __opera_media__ in the URL bar and click “Clear This Setting and Reload.”", | |
| guide_desktop_camera_fail_description_edge: "To take photos, WhatsApp Web needs access to your computer’s camera. Refresh the page, try sending a camera image, and select “Yes” from the menu that appears.", | |
| guide_desktop_mic_fail_description: "To record Voice Messages, WhatsApp Web needs access to your microphone. Click __chrome_media_error__ in the URL bar and choose “Always allow web.whatsapp.com to access your microphone.”", | |
| guide_desktop_mic_fail_description_firefox: "To record Voice Messages, WhatsApp Web needs access to your computer’s microphone. Click __firefox_lock__ in the URL bar and set “Use the Microphone” to “Allow.”", | |
| guide_desktop_mic_fail_description_opera: "To record Voice Messages, WhatsApp Web needs access to your computer’s microphone. Click __opera_media__ in the URL bar and click “Clear This Setting and Reload.”", | |
| guide_desktop_mic_fail_description_edge: "To record Voice Messages, WhatsApp Web needs access to your computer’s microphone. Refresh the page, try sending a Voice Message, and select “Yes” from the menu that appears.", | |
| guide_desktop_camera_missing_title: "Camera Not Found", | |
| guide_desktop_camera_missing_description: "You can’t take a photo because it looks like your computer doesn’t have a camera. Try connecting one or if you have one connected, try restarting your browser.", | |
| guide_desktop_mic_missing_title: "Microphone Not Found", | |
| guide_desktop_mic_missing_description: "You can’t record a Voice Message because it looks like your computer doesn’t have a microphone. Try connecting one or if you have one connected, try restarting your browser.", | |
| attach_media: "Photos & Videos", | |
| attach_capture: "Camera", | |
| attach_location: "Location", | |
| attach_vcard: "Contact", | |
| attach_document: "Document", | |
| guide_help_title: "Help", | |
| guide_help_faq: "Click FAQ for help using WhatsApp Web.", | |
| guide_help_description_android: "To contact support, open WhatsApp on your phone and tap Menu – Settings – Help – Contact us.", | |
| guide_help_description_symbian: "To contact support, open WhatsApp on your phone and select Options – About – Contact support.", | |
| guide_help_description_bb: "To contact support, open WhatsApp on your phone and tap Settings – About – Contact support.", | |
| guide_help_description_bbx: "To contact support, open WhatsApp on your phone and swipe down from the top of the screen – Settings – Contact support.", | |
| guide_help_description_wp7: "To contact support, open WhatsApp on your phone and tap menu (three dots at the bottom of the screen) – Settings – About – Contact support.", | |
| guide_help_description_s40: "To contact support, open WhatsApp on your phone – swipe up from bottom – Settings – About – Options – Contact support.", | |
| guide_help_description_iphone: "To contact support, open WhatsApp on your phone and tap Settings – About – Contact Us.", | |
| turn_off_all_desktop_notifications_for: "Turn off all desktop notifications for:", | |
| learn_more: "Learn more", | |
| ok_got_it: "OK, got it", | |
| login: "Log in", | |
| web_view: "View", | |
| web_preview_msg: "Preview", | |
| add_a_caption: "Add a caption…", | |
| add_media: "Add media", | |
| drag_media_here: "Drag media here", | |
| view_photo: "View photo", | |
| take_photo: "Take photo", | |
| remove_photo: "Remove photo", | |
| upload_photo: "Upload photo", | |
| invalid_media_files: "WhatsApp Web doesn't support the type of image or video you tried adding. Try adding a different one.", | |
| image_too_big: "The image you tried adding is larger than the 16MB limit. Try adding a different one.", | |
| video_too_big: "The video you tried adding is larger than the 16MB limit. Try adding a different one.", | |
| option_select_mute: "Turn off alerts and sounds for…", | |
| option_desktop_notifications: "Desktop Alerts", | |
| option_sounds: "Sounds", | |
| option_msg_previews: "Show Previews", | |
| option_msg_previews_hint_text: "Display message text in desktop alerts", | |
| web_menuitem_mute_off: "Cancel mute", | |
| web_menuitem_mute: "Mute", | |
| group_muted: "Group muted", | |
| web_mute_time: "Mute group for…", | |
| web_mute_time_chat: "Mute chat for…", | |
| web_list_info: "Broadcast list info", | |
| click_here_for_group_info: "click here for group info", | |
| click_here_for_user_info: "click here for contact info", | |
| web_delete_contact_dialog_title: "Delete chat with “__name__”?", | |
| clear_button: "Clear", | |
| clear_chat_chat: "Clear chat with “__name__”?", | |
| clear_chat_group: "Clear “__name__” group?", | |
| clear_chat_broadcast: "Clear broadcast list?", | |
| keep_starred: "Keep starred messages", | |
| web_delete_group_dialog_title: "Delete “__groupName__” group?", | |
| web_exit_group_dialog_title: "Exit “__groupName__” group?", | |
| delete_chat_dialog_title: "Delete chat with “__name__”?", | |
| delete_list_dialog_title: "Delete broadcast list?", | |
| are_you_sure: "Are you sure?", | |
| next_button: "Next", | |
| previous_button: "Previous", | |
| save_button: "Save", | |
| edit_button: "Edit", | |
| clear_chat: "Clear messages", | |
| web_exit_group: "Exit group", | |
| web_delete_group: "Delete group", | |
| delete_chat: "Delete chat", | |
| web_delete_list: "Delete broadcast list", | |
| web_select_messages: "Select messages", | |
| conversation_deleted: "Chat deleted", | |
| broadcast_deleted: "Broadcast list deleted", | |
| group_deleted: "Group deleted", | |
| report_spam: "Report spam", | |
| report_group_spam_ack: "Are you sure you want to report spam and leave this group?", | |
| report_spam_ack: "Are you sure you want to report spam and block this contact?", | |
| report_group_spam: "Report spam and leave group", | |
| block: "Block", | |
| block_ack: "Are you sure you want to block this contact?", | |
| not_spam: "Not spam", | |
| group_admin_not_a_contact: "You were added by someone who's not in your contacts", | |
| sender_not_a_contact: "The sender is not in your contact list", | |
| unread_message_count: "__count__ unread message", | |
| unread_message_count_plural: "__count__ unread messages", | |
| web_chats: "Chats", | |
| web_recent_chats: "Chats", | |
| web_groups: "Groups", | |
| web_contacts: "Contacts", | |
| web_messages: "Messages", | |
| web_starred_messages: "Starred Messages", | |
| web_conversation_is_composing: "typing…", | |
| web_conversation_is_recording: "recording audio…", | |
| web_conversation_contact_online: "online", | |
| web_conversation_name_is_composing: "__participant__ is typing…", | |
| web_conversation_name_is_recording: "__participant__ is recording audio…", | |
| web_conversations_most_recent_image: "Photo", | |
| web_conversations_most_recent_audio: "Audio", | |
| web_conversations_most_recent_voice: "Voice message", | |
| web_conversations_most_recent_video: "Video", | |
| web_conversations_most_recent_contact: "Contact", | |
| web_conversations_most_recent_location: "Location", | |
| web_conversations_most_recent_file: "Document", | |
| web_conversations_most_recent_document: "__count__ page", | |
| web_conversations_most_recent_document_plural: "__count__ pages", | |
| untitled_document: "Untitled", | |
| search_no_chats_or_contacts: "No chats or contacts found", | |
| search_no_contacts: "No contacts found", | |
| search_no_groups: "No groups found", | |
| no_chats: "No chats", | |
| no_contacts: "No contacts", | |
| no_groups: "No groups", | |
| chat_archived: "Archived", | |
| all_chats_archived: "All chats are archived", | |
| no_starred_messages: "No starred messages", | |
| see_archived: "See __count__ archived chat", | |
| see_archived_plural: "See __count__ archived chats", | |
| web_group_admin: "Group Admin", | |
| contact_status_loading: "Loading status…", | |
| retry_now: "Retry Now", | |
| retake: "Retake", | |
| web_cancel: "Cancel", | |
| web_ok: "OK", | |
| web_close: "Close", | |
| web_share: "Share", | |
| web_button_download: "Download", | |
| trying_to_reach_phone: "Trying to reach phone", | |
| connecting_to_whatsapp: "Connecting to WhatsApp", | |
| connecting_to_whatsapp_or_phone: "Connecting", | |
| connecting: "Connecting…", | |
| updating_whatsapp_web_title: "Updating", | |
| updating_whatsapp_web: "WhatsApp Web is out of date. Updating now…", | |
| retrying: "Retrying…", | |
| retrying_in: "Retrying in __duration__…", | |
| loading_messages: "loading messages…", | |
| load_earlier_messages: "load earlier messages…", | |
| load_recent_messages: "load recent messages…", | |
| resend_message: "Click to resend", | |
| click_to_save_esc_to_cancel: "Click to save, ESC to cancel", | |
| web_today_at: "today at __time__", | |
| web_yesterday_at: "yesterday at __time__", | |
| web_time_at: "__date__ at __time__", | |
| web_conversation_last_seen_today: "last seen today at __time__", | |
| web_conversation_last_seen_yesterday: "last seen yesterday at __time__", | |
| web_conversation_last_seen_date: "last seen __date__ at __time__", | |
| web_conversation_last_seen_weekday: "last seen __date__ at __time__", | |
| web_you: "You", | |
| web_today: "today", | |
| web_yesterday: "yesterday", | |
| retrying_in_some_seconds: "Retrying in __number__ second…", | |
| retrying_in_some_seconds_plural: "Retrying in __number__ seconds…", | |
| web_you_created_list_unnamed: "You created a broadcast list with __count__ recipient", | |
| web_you_created_list_unnamed_plural: "You created a broadcast list with __count__ recipients", | |
| web_list_recipient_added: "__name__ added to the list", | |
| web_list_recipient_removed: "__name__ removed from the list", | |
| web_group_subject_changed_by_you: "You changed the subject to “__subject__”", | |
| web_group_subject_changed_by_name: "__name__ changed the subject to “__subject__”", | |
| web_group_participant_added_name: "__name__ was added", | |
| web_group_participant_added_you: "You were added", | |
| web_group_participant_removed_name: "__name__ was removed", | |
| web_group_participant_removed_you: "You were removed", | |
| web_group_participant_left_name: "__name__ left", | |
| web_group_participant_left_you: "You left", | |
| web_group_participant_changed_number: "__name__ changed from __old_number__ to __new_number__", | |
| web_group_participant_changed_number_unknown_name: "__name__ changed to __new_number__", | |
| web_group_participants_name_added_names: "__name__ added __participants__", | |
| web_group_participants_you_added_names: "You added __participants__", | |
| web_group_participants_name_removed_names: "__name__ removed __participants__", | |
| web_group_participants_you_removed_names: "You removed __participants__", | |
| web_group_participants_name_added_you: "__name__ added you", | |
| web_group_participants_name_removed_you: "__name__ removed you", | |
| web_group_participant_promoted_names: "__participants__ is now an admin", | |
| web_group_participant_promoted_names_plural: "__participants__ are now admins", | |
| web_group_participant_demoted_names: "__participants__ is no longer an admin", | |
| web_group_participant_demoted_names_plural: "__participants__ are no longer admins", | |
| web_group_participant_promoted_you: "You're now an admin", | |
| web_group_participant_demoted_you: "You're no longer an admin", | |
| web_group_created_by_you: "You created group “__subject__”", | |
| web_group_created_by_name: "__name__ created group “__subject__”", | |
| web_group_created_by_you_no_subject: "You created this group", | |
| web_group_created_by_name_no_subject: "__name__ created this group", | |
| web_group_ended_you: "You ended this group", | |
| web_group_ended_name: "__name__ ended this group", | |
| web_photo_changed_by: "__name__ changed this group's icon", | |
| web_photo_removed_by: "__name__ deleted this group's icon", | |
| web_photo_changed_by_you: "You changed this group's icon", | |
| web_photo_removed_by_you: "You deleted this group's icon", | |
| web_mute_8hours: "8 Hours", | |
| web_mute_1week: "1 Week", | |
| web_mute_1year: "1 Year", | |
| mute_1hour: "1 Hour", | |
| mute_1day: "1 Day", | |
| mute_1week: "1 Week", | |
| global_muted: "Alerts and sounds off", | |
| global_muted_1hour: "Alerts and sounds off for 1 hour", | |
| global_muted_1day: "Alerts and sounds off for 1 day", | |
| global_muted_1week: "Alerts and sounds off for 1 week", | |
| global_notification_sounds_on: "Notification sounds on", | |
| global_notification_sounds_off: "Notification sounds off", | |
| global_unmuted: "Notifications enabled", | |
| global_unmute: "Alerts and sounds off. Click to restore.", | |
| web_cannot_send_not_a_group_participant: "You can't send messages to this group because you're no longer a participant.", | |
| web_cannot_send_to_blocked_contact_1: "Can't send a message to blocked contact __contact__.", | |
| cannot_send_document_to_contact_unsupported: "Can't send documents to __contact__ because __contact__ is on a version of WhatsApp that doesn't support them.", | |
| cannot_send_document_to_group_unsupported: "Can't send documents to __group__ because some members are on a version of WhatsApp that doesn't support them.", | |
| type_a_message: "Type a message", | |
| whatsapp_web: "WhatsApp Web", | |
| whatsapp: "WhatsApp", | |
| default_group_message_notification_title: "WhatsApp group message", | |
| incoming_call_notification_title: "WhatsApp Call from __name__", | |
| incoming_call_notification_text: "Check your phone to answer", | |
| default_contact_message_notification_title: "WhatsApp message", | |
| search_or_start_new_chat: "Search or start new chat", | |
| search_contacts: "Search contacts", | |
| search: "Search…", | |
| search_groups: "Search groups", | |
| update_available: "Update Available", | |
| click_to_update_whatsapp_web: "Click to update WhatsApp Web", | |
| desktop_client_update_required: "To continue using WhatsApp, update to the latest version.", | |
| desktop_client_update_available: "New version available", | |
| click_to_download_desktop_client: "Update WhatsApp", | |
| desktop_client_updating: "WhatsApp is updating", | |
| phone_battery_low: "Phone Battery Low", | |
| charge_phone_description: "Charge your phone to keep using WhatsApp Web", | |
| computer_not_connected: "Computer Not Connected", | |
| make_sure_computer_active_internet_connection: "Make sure your computer has an active Internet connection.", | |
| check_internet_connection: "No Internet connection", | |
| reconnect: "Reconnect", | |
| phone_not_connected: "Phone Not Connected", | |
| make_sure_phone_active_internet_connection: "Make sure your phone has an active Internet connection.", | |
| enable_desktop_notifications: "Turn on desktop notifications", | |
| get_notified_of_new_messages: "Get Notified of New Messages", | |
| phone_has_another_active_webclient_session: "WhatsApp Web is open on another computer or browser. Click “Use Here” to use WhatsApp Web in this window.", | |
| whatsapp_web_is_open_in_another_window: "WhatsApp Web is open in another window. Click “Use Here” to use WhatsApp Web in this window.", | |
| button_use_here: "Use Here", | |
| open_whatsapp: "Open WhatsApp", | |
| click_to_reload_qr_code: "Click to reload QR code", | |
| scan_code_with_phone_to_login: "Use WhatsApp on your phone to scan the code", | |
| reduce_data_usage_connect_phone_to_wifi: "To reduce mobile data usage, connect your phone to Wi-Fi", | |
| android: "Android", | |
| android_login_path: "Open WhatsApp — Menu — WhatsApp Web", | |
| blackberry: "BlackBerry", | |
| blackberry_login_path: "Open WhatsApp — Chats — Menu key — WhatsApp Web", | |
| windows_phone: "Windows Phone", | |
| windows_phone_login_path: "Open WhatsApp — Menu — WhatsApp Web", | |
| nokia_symbian_s60: "Nokia S60", | |
| nokia_symbian_s60_login_path: "Open WhatsApp — Menu — WhatsApp Web", | |
| bb10: "BlackBerry 10", | |
| bb10_login_path: "Open WhatsApp — Swipe down from top of screen — WhatsApp Web", | |
| iphone: "iPhone", | |
| iphone_login_path: "Open WhatsApp — Settings — WhatsApp Web", | |
| message_too_large_title: "Message Too Long", | |
| message_too_large_text: "The message you’re pasting is too long. Try shortening it or sending it in multiple parts.", | |
| video_playback_not_supported: "Your browser doesn’t support video playback.", | |
| audio_playback_not_supported: "Your browser doesn’t support audio playback.", | |
| whatsapp_web_meta_description: "Quickly send and receive WhatsApp messages right from your computer.", | |
| whatsapp_web_description: "Send and receive WhatsApp messages right from your computer.", | |
| whatsapp_web_requirements: "We recommend using WhatsApp Web with one of the following browsers:", | |
| whatsapp_web_supports: "WhatsApp Web also supports:", | |
| update_safari: "Update Safari", | |
| get_safari: "Safari (MacOS 10.8+ Only)", | |
| get_google_chrome: "Google Chrome", | |
| update_google_chrome: "Update Google Chrome", | |
| get_mozilla_firefox: "Mozilla Firefox", | |
| update_mozilla_firefox: "Update Mozilla Firefox", | |
| get_opera: "Opera", | |
| get_edge: "Microsoft Edge", | |
| whatsapp_edge_version: "WhatsApp Web works with Microsoft Edge 13+", | |
| whatsapp_edge_instructions: "To use WhatsApp Web, update Windows 10 to get Microsoft Edge 13+, or use __chrome_homepage__, __firefox_homepage__, or __opera_homepage__.", | |
| update_edge: "Download latest Windows 10", | |
| whatsapp_safari_version: "WhatsApp Web works with Safari 7.1+", | |
| whatsapp_safari_instructions: "To use WhatsApp Web, update Safari or use __chrome_homepage__, __firefox_homepage__, or __opera_homepage__.", | |
| whatsapp_safari_limited_title: "Using Safari", | |
| whatsapp_safari_limited: "To use all of WhatsApp Web's features like photo capturing and Voice Message recording, we recommend using __chrome_homepage__, __firefox_homepage__ or __opera_homepage__.", | |
| whatsapp_firefox_version: "WhatsApp Web works with Mozilla Firefox 30+", | |
| whatsapp_firefox_instructions: "To use WhatsApp Web, update Firefox or use __chrome_homepage__, __safari_homepage__, or __opera_homepage__.", | |
| whatsapp_chrome_version: "WhatsApp Web works with Google Chrome 36+", | |
| whatsapp_chrome_instructions: "To use WhatsApp Web, update Chrome or use __firefox_homepage__, __safari_homepage__, or __opera_homepage__.", | |
| filesize_byte: "B", | |
| filesize_kilobyte: "kB", | |
| filesize_megabyte: "MB", | |
| filesize_gigabyte: "GB", | |
| confirm_closing_webclient: "You are closing WhatsApp Web.", | |
| confirm_logout: "Log out?", | |
| some_of_your_messages_are_still_sending: "Some of your messages are still sending.", | |
| terms_and_privacy_link: "Terms and Privacy Policy", | |
| web_terms_of_service_1: "WhatsApp is updating our Terms and Privacy Policy to reflect new features like WhatsApp Calling. Open WhatsApp on your phone to read our Terms and Privacy Policy and learn more about the choices you have.", | |
| web_terms_of_service_2: "WhatsApp is updating our Terms and Privacy Policy to reflect new features like WhatsApp Calling. Open WhatsApp on your phone to read our Terms and Privacy Policy and learn more about the choices you have.", | |
| web_terms_of_service_login_block: 'WhatsApp is updating our Terms and Privacy Policy to reflect new features like WhatsApp Calling. Open WhatsApp on your phone to read our Terms and Privacy Policy and learn more about the choices you have. If you have accepted the Terms and Privacy Policy, click \\"LOG IN\\" to continue using WhatsApp Web.', | |
| web_security_code_change: "__name__'s security code changed. Click for more info.", | |
| web_individual_chat_encryption_state_change: "Messages you send to this chat and calls are now secured with end-to-end encryption. Click for more info.", | |
| web_group_encryption_state_change: "Messages you send to this group are now secured with end-to-end encryption. Click for more info.", | |
| web_broadcast_encryption_state_change: "Messages you send to this broadcast list are now secured with end-to-end encryption. Click for more info.", | |
| web_contact_info_encrypted: "Messages you send to this chat and calls are now secured with end-to-end encryption.", | |
| web_contact_info_encrypted_verify: "Messages you send to this chat and calls are now secured with end-to-end encryption. Click to verify.", | |
| web_group_info_encrypted: "Messages you send to this group are secured with end-to-end encryption. Click for more info.", | |
| web_broadcast_info_encrypted: "Messages you send to this broadcast list are secured with end-to-end encryption. Click for more info.", | |
| web_group_info_encrypted_description: "Messages you send to this group are secured with end-to-end encryption, which means WhatsApp and third parties can't read them.", | |
| web_broadcast_info_encrypted_description: "Messages you send to this broadcast list are secured with end-to-end encryption, which means WhatsApp and third parties can't read them.", | |
| web_security_code_change_description: "__name__'s security code changed, likely because __name__ reinstalled WhatsApp or switched phones.", | |
| web_security_code_change_description_verify: '__name__\'s security code changed, likely because __name__ reinstalled WhatsApp or switched phones. Click \\"verify\\" to confirm the new security code.', | |
| web_individual_chat_encryption_state_change_description: "Messages you send to this chat and calls are now secured with end-to-end encryption, which means WhatsApp and third parties can't read or listen to them.", | |
| web_group_encryption_state_change_description: "Messages you send to this group are now secured with end-to-end encryption, which means WhatsApp and third parties can't read them.", | |
| web_broadcast_encryption_state_change_description: "Messages you send to this broadcast list are now secured with end-to-end encryption, which means WhatsApp and third parties can't read them.", | |
| web_missed_call_system_message: "Missed call at __time__" | |
| } | |
| }, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| return _.filter(_.keys(v.BROWSER_CAPABILITY), function(e) { | |
| return !v.BROWSER_CAPABILITY[e] | |
| }) | |
| } | |
| function o() { | |
| return T.loopOnError(function(e) { | |
| return Promise.delay(P.expBackoff(e, 12e4, 1e3, .1)).then(function() { | |
| return r.e(0).then(function(e) { | |
| s = r(672) | |
| }.bind(null, r))["catch"](function(e) { | |
| r.oe(e) | |
| }) | |
| }) | |
| }) | |
| } | |
| function i() { | |
| return _.isFunction(String.prototype.normalize) ? Promise.resolve() : T.loopOnError(function(e) { | |
| return Promise.delay(P.expBackoff(e, 12e4, 1e3, .1)).then(function() { | |
| return r.e(5).then(function(e) { | |
| r(751) | |
| }.bind(null, r))["catch"](function(e) { | |
| r.oe(e) | |
| }) | |
| }) | |
| }) | |
| } | |
| var a, s, d = r(5), | |
| c = r(1), | |
| u = r(373), | |
| l = r(375), | |
| f = r(371), | |
| h = r(372), | |
| p = r(364), | |
| m = r(377), | |
| g = r(44), | |
| v = r(6), | |
| y = r(8), | |
| b = r(39), | |
| w = r(370), | |
| E = r(365), | |
| S = r(10), | |
| N = r(53), | |
| T = r(25), | |
| $ = r(72), | |
| C = r(91), | |
| A = r(93), | |
| I = r(13), | |
| O = r(147), | |
| k = r(26), | |
| P = r(74), | |
| R = r(140), | |
| M = r(96), | |
| L = { | |
| INIT: "init", | |
| PING: "ping", | |
| PONG: "pong", | |
| TAKEOVER: "local-takeover" | |
| }, | |
| D = 6e5, | |
| U = r(99), | |
| B = r(376), | |
| x = r(9); | |
| U && ! function() { | |
| var e = function() { | |
| B.send(navigator.serviceWorker.controller, "setl10n", { | |
| isRTL: l10n.isRTL(), | |
| lng: l10n.lng() | |
| }) | |
| }, | |
| t = function() { | |
| try { | |
| navigator.serviceWorker.controller && navigator.serviceWorker.controller.addEventListener("error", function(e) { | |
| S.state !== S.STATE.UNLAUNCHED && c.error("ServiceWorker controller error: " + e.error)() | |
| }) | |
| } catch (e) { | |
| c.error('Unable to add "error" event listener to service worker, error: ' + e)() | |
| } | |
| }; | |
| try { | |
| navigator.serviceWorker.addEventListener("controllerchange", function(r) { | |
| t(), S.state === S.STATE.UNLAUNCHED ? Store.Stream.needsUpdate = !0 : e() | |
| }) | |
| } catch (r) { | |
| c.error('Unable to add "controllerchange" event listener to service worker container, error: ' + r)() | |
| } | |
| try { | |
| navigator.serviceWorker.addEventListener("error", function(e) { | |
| S.state !== S.STATE.UNLAUNCHED && c.error("ServiceWorker container error: " + e.error)() | |
| }) | |
| } catch (r) { | |
| c.error('Unable to add "error" event listener to service worker container, error: ' + r)() | |
| } | |
| t(); | |
| var n = function(e, t) { | |
| e.buffer.forEach(function(e) { | |
| e.message[0] = "ServiceWorker(" + t + "): " + e.message[0], c[e.level].apply(c, e.message)() | |
| }) | |
| }; | |
| B.on("log", function(e, t, r) { | |
| S.state !== S.STATE.UNLAUNCHED && n(e, r) | |
| }), B.on("uploadLogs", function(e, t, r) { | |
| e && n(e, r), x.upload("Requested by Service Worker") | |
| }), y.on("locale_change", function() { | |
| navigator.serviceWorker.ready.then(function() { | |
| e() | |
| }) | |
| }) | |
| }(); | |
| var j = d.createClass({ | |
| displayName: "App", | |
| mixins: [$, C, A], | |
| statics: { | |
| hasPending: function() { | |
| return !!s && s.hasPending() | |
| } | |
| }, | |
| getInitialState: function() { | |
| return { | |
| mode: N.mode, | |
| updating: !1, | |
| anotherSession: !1, | |
| takingOver: !1, | |
| locale: _.first(l10n._locales) | |
| } | |
| }, | |
| clearMutexTimer: function() { | |
| this.updateMutexTimerID && R.clearTimeout(this.updateMutexTimerID) | |
| }, | |
| updateMutex: function() { | |
| this.clearMutexTimer(); | |
| var e = Date.now(); | |
| I.setMutex(this.ourMutex = L.INIT + "_" + e), this.updateMutexTimerID = R.setTimeout(this.updateMutex, e + D) | |
| }, | |
| unloadMutex: function() { | |
| var e = I.getMutex(); | |
| e && this.ourMutex && e.indexOf(this.ourMutex) > -1 && I.removeMutex() | |
| }, | |
| componentWillUpdate: function(e, t) { | |
| this.state.anotherSession === !0 && t.anotherSession === !1 ? k.openDB() : this.state.anotherSession === !1 && t.anotherSession === !0 && k.idb().then(function(e) { | |
| return e.close() | |
| })["catch"](_.noop) | |
| }, | |
| componentWillMount: function() { | |
| var e = this; | |
| Promise.all([o(), i()]).then(function() { | |
| return y.mainLoaded() | |
| }); | |
| var t = n(); | |
| if (t.length > 0) { | |
| var r = v.CAPABILITY_URL + "?missing=" + t.join(","); | |
| window.location.replace ? window.location.replace(r) : window.location.href = r | |
| } | |
| this.regNativeListener(window, "beforeunload", this.unloadMutex), this.regNativeListener(window, "unload", this.unloadMutex), this.regNativeListener(window, "storage", this.storagePong), this.addObserver(M, "change:mode", this.onUpdaterModeChange), this.addObserver(N, "change:mode", this.onStreamModeChange); | |
| var a = this; | |
| this.regCmd("locale_change", function() { | |
| c.log("App:componentWillMount:rerenderUI locale change")(), a.setState({ | |
| locale: _.first(l10n._locales) | |
| }) | |
| }), O.loadInitialAssets().then(function() { | |
| c.log("App:componentWillMount:loadInitialAssets")() | |
| }), this.registerYesterdayTimer(), c.log("App:componentWillMount:visibilityState: " + document.visibilityState)(), "prerender" === document.visibilityState ? T.waitForEvent(document, "visibilitychange").timeout(5e3).then(function() { | |
| return e.init(0) | |
| })["catch"](function() { | |
| return e.init(0) | |
| }) : this.init(0) | |
| }, | |
| registerYesterdayTimer: function() { | |
| var e = this; | |
| R.setTimeout(function() { | |
| c.log("App:registerYesterdayTimer:rerenderUI relative timestamps")(), y.midnight(), e.registerYesterdayTimer() | |
| }, moment().endOf("day").valueOf()) | |
| }, | |
| onStreamModeChange: function() { | |
| this.setState({ | |
| mode: N.mode | |
| }) | |
| }, | |
| onUpdaterModeChange: function() { | |
| M.mode !== M.Mode.PENDING_REFRESH && M.mode !== M.Mode.REFRESHING || S.hasSynced || this.setState({ | |
| updating: !0 | |
| }) | |
| }, | |
| init: function() { | |
| var e = arguments.length <= 0 || void 0 === arguments[0] ? 0 : arguments[0], | |
| t = this; | |
| if (e += 1, e > 3) return void this.setState({ | |
| takingOver: !1, | |
| anotherSession: !0 | |
| }); | |
| var r = I.getNoTakeover(); | |
| I.setNoTakeover(), S.preload(), this.pingForOtherLocalSession().then(function(n) { | |
| n ? (I.maybeMigrate(), t.updateMutex(), S.launch(!r), t.setState({ | |
| takingOver: !1, | |
| anotherSession: !1 | |
| })) : r ? t.setState({ | |
| takingOver: !1, | |
| anotherSession: !0 | |
| }) : t.takeoverLocal(e) | |
| }) | |
| }, | |
| pingForOtherLocalSession: function() { | |
| var e = I.getMutex(); | |
| if (e) { | |
| e += ""; | |
| var t = 1e4; | |
| if (e.indexOf("_") > 0 && (e = parseInt(_.last(e.split("_")), 10), _.isFinite(e))) { | |
| var r = Date.now() - 1.5 * D; | |
| r > e && (c.log("app:pingForOtherLocalSession stale mutex")(), t = 1e3) | |
| } | |
| var n = T.waitForEvent(window, "storage", I.mutexFilter).timeout(t, "waitForOtherLocalSessionTimeout")["return"](!1)["catch"](Promise.TimeoutError, function(e) { | |
| return c.error("app:pingForOtherLocalSession mutex timeout")(), !0 | |
| }); | |
| return I.setMutex(L.PING + Math.random()), n | |
| } | |
| return Promise.resolve(!0) | |
| }, | |
| storagePong: function(e) { | |
| if (I.mutexFilter(e)) { | |
| var t = I.parseMutex(e.newValue); | |
| t && (t === L.TAKEOVER ? (this.clearMutexTimer(), S.exitLoop(), I.localTakeoverSuccess(), this.setState({ | |
| takingOver: !1, | |
| anotherSession: !0 | |
| })) : 0 === t.indexOf(L.PING) && I.setMutex(L.PONG + Math.random())) | |
| } | |
| }, | |
| takeoverLocal: function(e) { | |
| if (I.compareVersion() < 0 || Store.Stream.needsUpdate) return c.log("app:takeoverLocal stale client: " + I._version() + " ls: " + I._getLSVersion())(), document.location.reload(!0); | |
| if (I.getMutex()) { | |
| this.setState({ | |
| takingOver: !0 | |
| }); | |
| var t = this; | |
| T.waitForEvent(window, "storage", I.takeoverFilter).timeout(3e4, "takeoverLocalTimeout").then(function(r) { | |
| var n = I.parseTakeover(r.newValue); | |
| I.getRememberMe() || I._setAllKeyValues(n), S.mustExitLoop = !1, I.removeMutex(), t.init(e) | |
| })["catch"](Promise.TimeoutError, function(r) { | |
| c.error("app:takeoverLocal timeout")(), S.mustExitLoop = !1, I.removeMutex(), t.init(e) | |
| }), I.setMutex(L.TAKEOVER) | |
| } else this.init(e) | |
| }, | |
| onMouseDown: function(e) { | |
| y.windowMouseDown(e) | |
| }, | |
| onClick: function(e) { | |
| y.windowClick(e) | |
| }, | |
| render: function() { | |
| var e, t = b("app-wrapper", { | |
| "app-wrapper-web": !0 | |
| }); | |
| if (this.state.desktopClientExpired) { | |
| var r, n, o; | |
| M.mode === M.Mode.DOWNLOADING || M.mode === M.Mode.CHECKING ? o = l10n.t("desktop_client_updating") : (r = l10n.t("click_to_download_desktop_client"), n = function() { | |
| M.manualDownload() | |
| }, o = l10n.t("desktop_client_update_required")), e = d.createElement(g, { | |
| title: l10n.t("click_to_download_desktop_client"), | |
| body: o, | |
| defaultLabel: r, | |
| onDefault: n | |
| }) | |
| } else if (this.state.updating) e = d.createElement(g, { | |
| body: l10n.t("updating_whatsapp_web"), | |
| title: l10n.t("updating_whatsapp_web_title") | |
| }); | |
| else if (this.state.anotherSession) { | |
| var i, v; | |
| if (this.state.takingOver) i = _.noop, v = l10n.t("connecting"); | |
| else { | |
| var y = this; | |
| i = function() { | |
| y.takeoverLocal(0) | |
| }, v = l10n.t("button_use_here") | |
| } | |
| e = d.createElement(g, { | |
| body: l10n.t("whatsapp_web_is_open_in_another_window"), | |
| cancelLabel: l10n.t("web_close"), | |
| onCancel: window.open.bind(window, "http://www.whatsapp.com/", "_self"), | |
| defaultLabel: v, | |
| onDefault: i | |
| }) | |
| } else switch (this.state.mode) { | |
| case N.MODE.QR: | |
| e = [d.createElement(w, { | |
| type: "main", | |
| key: "modal-manager" | |
| }), d.createElement(u, { | |
| key: "qr-code" | |
| })]; | |
| break; | |
| case N.MODE.SYNCING: | |
| e = d.createElement(l, null); | |
| break; | |
| case N.MODE.OFFLINE: | |
| e = d.createElement(f, null); | |
| break; | |
| case N.MODE.PROXYBLOCK: | |
| e = d.createElement(h, null); | |
| break; | |
| case N.MODE.CONFLICT: | |
| e = d.createElement(p, null); | |
| break; | |
| case N.MODE.TOS_BLOCK: | |
| e = d.createElement(m, null); | |
| break; | |
| case N.MODE.MAIN: | |
| e = [d.createElement(w, { | |
| type: "media", | |
| key: "media-modal-manager" | |
| }), d.createElement(w, { | |
| type: "main", | |
| key: "main-modal-manager" | |
| }), d.createElement(E, { | |
| type: "menu", | |
| key: "context-menu-manager" | |
| }), d.createElement(E, { | |
| type: "tooltip", | |
| key: "tooltip-manager" | |
| }), d.createElement(s, { | |
| key: "main", | |
| conn: Store.Conn | |
| })], t += " app-wrapper-main"; | |
| break; | |
| default: | |
| c.log("app:render Error invalid App state", this.state.mode)() | |
| } | |
| return d.createElement("div", { | |
| className: t, | |
| onMouseDownCapture: this.onMouseDown, | |
| onClickCapture: this.onClick, | |
| key: this.state.locale | |
| }, e, a ? d.createElement(a, null) : null) | |
| } | |
| }); | |
| e.exports = j | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(6), | |
| o = r(1), | |
| i = r(327), | |
| a = r(138), | |
| s = r(25), | |
| d = r(19), | |
| c = r(30), | |
| u = r(8), | |
| l = r(18), | |
| f = r(10), | |
| h = i.extend({ | |
| model: a, | |
| comparator: a.Comparator, | |
| _sort: _.debounce(function() { | |
| return i.prototype.sort.call(this) | |
| }, 1e3), | |
| _silentSort: _.debounce(function() { | |
| return i.prototype.sort.call(this, { | |
| silent: !0 | |
| }) | |
| }, 1e3), | |
| sort: function(e) { | |
| return e && e.slient ? this._silentSort() : this._sort() | |
| }, | |
| initialize: function() { | |
| i.prototype.initialize.call(this, { | |
| CachePolicy: { | |
| id: "contact_collection", | |
| policy: i.CACHE_POLICY.NONE | |
| } | |
| }), this.checksum = void 0, this.listenTo(u, "locale_change", this.sort), this.listenTo(this, "change:name", this.sort), this.listenTo(f, "change:stream", function() { | |
| f.stream === f.STREAM.DISCONNECTED && this.forEach(function(e) { | |
| return e.unset("_capabilities") | |
| }) | |
| }) | |
| }, | |
| "delete": function() { | |
| i.prototype["delete"].call(this), delete this.checksum | |
| }, | |
| isFilteredContact: function(e) { | |
| return e.name && !e.isMe && e.isWAContact | |
| }, | |
| getFilteredContacts: function() { | |
| return this.filter(function(e) { | |
| return e.name && !e.isMe && e.isWAContact | |
| }) | |
| }, | |
| _find: function(e) { | |
| var t = this.get(e); | |
| return t ? Promise.resolve(t) : Promise.resolve({ | |
| id: e | |
| }) | |
| }, | |
| _findQuery: function(e) { | |
| var t = this; | |
| return c.contactFindQuery(e.retry).then(function(e) { | |
| return "preempted" === e ? Promise.reject("contacts preempted") : (t.trigger(n.COLLECTION_HAS_SYNCED), e.checksum && (t.checksum = e.checksum, o.log("Store:Contact:query update checksum " + e.checksum)()), Promise.resolve(e.data)) | |
| }) | |
| }, | |
| handle: function(e) { | |
| var t = this, | |
| r = function(e) { | |
| t.add(e, { | |
| merge: !0 | |
| }); | |
| var r = t.get(e.id); | |
| e.name || (r.unset("name"), r.unset("shortName")) | |
| }, | |
| i = e.shift(); | |
| if (_.isArray(i)) { | |
| var a = e.shift(); | |
| if (a && "remove" === a.missing) { | |
| var s = {}; | |
| i.forEach(function(e) { | |
| s[e.id] = !0 | |
| }), this.forEach(function(e) { | |
| var t = e.get("id"); | |
| d.isUser(t) && !s[t] && (e.unset("name"), e.unset("shortName")) | |
| }) | |
| } | |
| a && a.checksum && (this.checksum = a.checksum, o.log("Store:Contact:handle update checksum " + a.checksum)()), i.forEach(r) | |
| } else if ("preempt" === i.cmd) this.add(i.response, { | |
| merge: !0 | |
| }), i.checksum && (this.checksum = i.checksum, o.log("Store:Contact:handle update checksum " + i.checksum)()), this.trigger(n.COLLECTION_HAS_SYNCED); | |
| else if ("caps" === i.type) { | |
| var c = this.get(i.jid); | |
| if (c && c.isUser && c._capabilities && _.isObject(i.data)) | |
| for (var u in i.data) c._capabilities[u] = i.data[u] | |
| } else o.error("Store:Contact:handle unknown: " + JSON.stringify(i))() | |
| }, | |
| sync: function() { | |
| return this.findQuery({})["catch"](l.WapDrop, _.noop), s.waitForBBEvent(this, n.COLLECTION_HAS_SYNCED) | |
| }, | |
| resyncContacts: function(e) { | |
| "undefined" != typeof this.checksum && "undefined" != typeof e && (this.checksum !== e ? this.findQuery({ | |
| retry: !0 | |
| }).then(function(e) { | |
| if (_.isArray(e)) { | |
| o.log("Store:Contact:resync success")(); | |
| var t, r, n = {}; | |
| for (r = 0; r < e.length; r++) t = e[r], n[t.id] = t; | |
| for (r = 0; r < this.length; r++) t = this.at(r), n[t.id] || t.unset("name") | |
| } else o.error("Store.Contact.resync error " + JSON.stringify(e), e)() | |
| })["catch"](l.WapDrop, _.noop) : o.log("Store:Contact:resync checksum match")()) | |
| } | |
| }); | |
| e.exports = new h | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| o.log("Application Cache " + e.type + " event")(e) | |
| } | |
| var o = r(1); | |
| applicationCache.addEventListener("cached", n), applicationCache.addEventListener("checking", n), applicationCache.addEventListener("downloading", n), applicationCache.addEventListener("error", n), applicationCache.addEventListener("noupdate", n), applicationCache.addEventListener("obsolete", n), applicationCache.addEventListener("progress", n), applicationCache.addEventListener("updateready", n) | |
| }, function(e, t) { | |
| "use strict"; | |
| ! function(e) { | |
| var t = e.HTMLCanvasElement && e.HTMLCanvasElement.prototype, | |
| r = e.Blob && function() { | |
| try { | |
| return Boolean(new Blob) | |
| } catch (e) { | |
| return !1 | |
| } | |
| }(), | |
| n = r && e.Uint8Array && function() { | |
| try { | |
| return 100 === new Blob([new Uint8Array(100)]).size | |
| } catch (e) { | |
| return !1 | |
| } | |
| }(), | |
| o = e.BlobBuilder || e.WebKitBlobBuilder || e.MozBlobBuilder || e.MSBlobBuilder, | |
| i = /^data:((.*?)(;charset=.*?)?)(;base64)?,/, | |
| a = (r || o) && e.atob && e.ArrayBuffer && e.Uint8Array && function(e) { | |
| var t, a, s, d, c, u, l, f, h; | |
| if (t = e.match(i), !t) throw new Error("invalid data URI"); | |
| for (a = t[2] ? t[1] : "text/plain" + (t[3] || ";charset=US-ASCII"), s = !!t[4], | |
| d = e.slice(t[0].length), c = s ? atob(d) : decodeURIComponent(d), u = new ArrayBuffer(c.length), l = new Uint8Array(u), f = 0; f < c.length; f += 1) l[f] = c.charCodeAt(f); | |
| return r ? new Blob([n ? l : u], { | |
| type: a | |
| }) : (h = new o, h.append(u), h.getBlob(a)) | |
| }; | |
| e.HTMLCanvasElement && !t.toBlob && (t.mozGetAsFile ? t.toBlob = function(e, r, n) { | |
| e(n && t.toDataURL && a ? a(this.toDataURL(r, n)) : this.mozGetAsFile("blob", r)) | |
| } : t.toDataURL && a && (t.toBlob = function(e, t, r) { | |
| e(a(this.toDataURL(t, r))) | |
| })), e.dataURLtoBlob = a | |
| }(window) | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| return C[parseInt(e, 10)] | |
| } | |
| function o() { | |
| var e = m || window.location.href || "", | |
| t = e.split("/%F0%9F%8C%90/"); | |
| return t.length > 1 ? _.first(t[1].split("/")) : void 0 | |
| } | |
| var i = r(1), | |
| a = r(40), | |
| s = r(138), | |
| d = r(456), | |
| c = r(384), | |
| u = r(8), | |
| l = r(145), | |
| f = r(25), | |
| h = r(463), | |
| p = r(74), | |
| m = window.location.href, | |
| g = window.history && window.history.pushState && window.location; | |
| g && m && m.indexOf("/%F0%9F%8C%90/") > -1 && window.history.replaceState({}, "", "/"); | |
| var v = "en", | |
| y = "en-GB", | |
| b = document.documentElement.getAttribute("dir"), | |
| w = document.getElementById("style").getAttribute("href"), | |
| E = { | |
| en: r(178) | |
| }, | |
| S = { | |
| LTR: "ltr", | |
| RTL: "rtl" | |
| }, | |
| N = r(461), | |
| T = ["ar", "fa", "ur", "he", "dv", "ku"], | |
| $ = ["ar", "fa"], | |
| C = "٠١٢٣٤٥٦٧٨٩".split(""); | |
| s.setCollator(v), e.exports = { | |
| _locales: [v], | |
| init: function(e) { | |
| this.initPromise && this.initPromise.cancel(); | |
| var t = []; | |
| if (this._addLocale(e, t), this._addLocale(o(), t), navigator.languages) { | |
| var n = this; | |
| _.forEach(navigator.languages, function(e) { | |
| n._addLocale(e, t) | |
| }) | |
| } | |
| this._addLocale(navigator.language, t), this._addLocale(v, t); | |
| var a = t.filter(function(e) { | |
| return !E[e] | |
| }), | |
| d = a.map(function(e) { | |
| return e = N[e], e ? f.loopOnError(function(t) { | |
| return Promise.delay(p.expBackoff(t, 12e4, 1e3, .1)).then(function() { | |
| return r(340)("./" + e + "/translation.json")() | |
| }) | |
| }).cancellable()["catch"](Promise.CancellationError, _.noop) : Promise.reject("Non-existent language requested.") | |
| }), | |
| c = this.curDir(); | |
| return this.initPromise = Promise.all(d).bind(this).cancellable()["finally"](function() { | |
| return _.forEach(d, function(e) { | |
| return e.cancel() | |
| }) | |
| }).then(function(r) { | |
| a.forEach(function(e, t) { | |
| E[e] = r[t] | |
| }), this._locales = t; | |
| var n = _.first(this._locales).replace("_", "-").toLowerCase(); | |
| s.setCollator(n); | |
| var o = [e, _.first(this._locales), y].filter(function(e) { | |
| return !!e | |
| }); | |
| moment.locale(o), this.customizeMomentLocale(moment.locale()); | |
| var d = T.indexOf(_.first(this._locales)) > -1 ? S.RTL : S.LTR; | |
| if (d !== b) { | |
| if (this._loadedStyle && c === b) return this._switchStyleDir(c, d), u.localeChange(), i.log("i10n:init Locale Updated: " + this._locales.join(":"))(), this._locales; | |
| var l = window.performance.now(); | |
| return this._loadStyle().bind(this).then(function(e) { | |
| this._loadedStyle = e; | |
| var t = window.performance.now(); | |
| this._switchStyleDir(c, d); | |
| var r = window.performance.now(); | |
| return i.log("i10n:init style fetching:" + (t - l) + "ms")(), i.log("i10n:init style executing:" + (r - t) + "ms")(), u.localeChange(), i.log("i10n:init Locale Updated: " + this._locales.join(":"))(), this._locales | |
| }) | |
| } | |
| return this._switchStyleDir(c, d), u.localeChange(), i.log("i10n:init Locale Updated: " + this._locales.join(":"))(), this._locales | |
| })["catch"](Promise.CancellationError, _.noop)["catch"](function() { | |
| this._locales = [v], s.setCollator(v); | |
| var r = [e, _.first(this._locales), y].filter(function(e) { | |
| return !!e | |
| }); | |
| return moment.locale(r), this.customizeMomentLocale(moment.locale()), this._switchStyleDir(c, S.LTR), u.localeChange(), i.error("i10n:init Failed to fetch locales", t)(), this._locales | |
| }) | |
| }, | |
| _switchStyleDir: function(e, t) { | |
| if (e !== t) { | |
| var r = document.getElementById("style"); | |
| t === b ? (e !== b && this._loadedStyle && (this._loadedStyle.unuse(), a.isGecko && r.setAttribute("href", w)), r.removeAttribute("disabled"), document.documentElement.setAttribute("dir", t)) : (a.isGecko && r.setAttribute("href", ""), r.setAttribute("disabled", "true"), document.documentElement.setAttribute("dir", t), this._loadedStyle.use()) | |
| } | |
| }, | |
| _loadRTL: function() { | |
| return f.loopOnError(function(e) { | |
| return Promise.delay(p.expBackoff(e, 12e4, 1e3, .1)).then(function() { | |
| return r.e(1).then(function(e) { | |
| return r(674) | |
| }.bind(null, r))["catch"](function(e) { | |
| r.oe(e) | |
| }) | |
| }) | |
| }) | |
| }, | |
| _loadLTR: function() { | |
| return f.loopOnError(function(e) { | |
| return Promise.delay(p.expBackoff(e, 12e4, 1e3, .1)).then(function() { | |
| return r.e(2).then(function(e) { | |
| return r(673) | |
| }.bind(null, r))["catch"](function(e) { | |
| r.oe(e) | |
| }) | |
| }) | |
| }) | |
| }, | |
| _loadStyle: function() { | |
| return b === S.RTL ? this._loadLTR() : this._loadRTL() | |
| }, | |
| _addLocale: function(e, t) { | |
| if (e) { | |
| var r = e.replace("-", "_").toLowerCase(); | |
| N[r] && (r = N[r], r = r.replace("-", "_").toLowerCase()); | |
| var n = t.indexOf(r); | |
| 0 > n && this.isLocaleSupported(e) && t.push(r); | |
| var o = r.split("_"); | |
| if (!(o.length < 0)) { | |
| var i = _.first(o), | |
| a = t.indexOf(i); | |
| 0 > a && this.isLocaleSupported(i) && t.push(i) | |
| } | |
| } | |
| }, | |
| isLocaleSupported: function(e) { | |
| try { | |
| return !!e && (!window.Intl || _.isArray(window.Intl.Collator.supportedLocalesOf([e]))) && !!N[e.replace("-", "_").toLowerCase()] | |
| } catch (t) { | |
| return !1 | |
| } | |
| }, | |
| lng: function() { | |
| var e = _.first(this._locales); | |
| return N[e] || e | |
| }, | |
| isRTL: function() { | |
| return T.indexOf(_.first(this._locales)) >= 0 | |
| }, | |
| LR: function(e, t) { | |
| return this.isRTL() ? t : e | |
| }, | |
| curDir: function() { | |
| return document.documentElement.getAttribute("dir") === S.RTL ? S.RTL : S.LTR | |
| }, | |
| embedDir: function(e) { | |
| var t = arguments.length <= 1 || void 0 === arguments[1] ? this.isRTL() : arguments[1]; | |
| return t ? this.embedRTL(e) : this.embedLTR(e) | |
| }, | |
| forceDir: function(e) { | |
| var t = arguments.length <= 1 || void 0 === arguments[1] ? this.isRTL() : arguments[1]; | |
| return t ? this.forceRTL(e) : this.forceLTR(e) | |
| }, | |
| embedLTR: function(e) { | |
| return "" + e + "" | |
| }, | |
| embedRTL: function(e) { | |
| return "" + e + "" | |
| }, | |
| forceLTR: function(e) { | |
| return "" + e | |
| }, | |
| forceRTL: function(e) { | |
| return "" + e | |
| }, | |
| hasT: function(e, t) { | |
| for (var r, n, o = t && t._plural ? t._plural : void 0, i = 0; i < this._locales.length; i++) | |
| if (r = e + this.getPluralExt(this._locales[i], o), n = E[this._locales[i]], n[r]) return !0; | |
| return !1 | |
| }, | |
| t: function(e, t) { | |
| for (var r, n, o = "", i = t && t._plural ? t._plural : void 0, a = 0; a < this._locales.length && (r = e + this.getPluralExt(n = this._locales[a], i), !(o = E[n][r])); a++); | |
| for (r in t) { | |
| if (!t.hasOwnProperty(r)) return; | |
| var s = new RegExp("__" + r + "__", "g"), | |
| d = this.n(t[r], n); | |
| o = o.replace(s, d) | |
| } | |
| return o | |
| }, | |
| isHindiNumerals: function(e) { | |
| return $.indexOf(e || this._locales[0]) > -1 | |
| }, | |
| n: function(e, t) { | |
| return this.isHindiNumerals(t) ? e.toString().replace(/[0-9]/g, n) : e | |
| }, | |
| numAndPunc: function(e) { | |
| return this.isHindiNumerals() ? this.embedLTR(this.n(e).replace(/./g, this.forceLTR)) : e | |
| }, | |
| filesize: function(e) { | |
| return this.n(d(e, { | |
| round: 0, | |
| suffixes: { | |
| B: this.t("filesize_byte"), | |
| kB: this.t("filesize_kilobyte"), | |
| MB: this.t("filesize_megabyte"), | |
| GB: this.t("filesize_gigabyte") | |
| } | |
| })) | |
| }, | |
| getPluralExt: function(e, t) { | |
| if (!t) return ""; | |
| var r = c[e]; | |
| if (!r) return ""; | |
| var n = r.plurals(t), | |
| o = r.numbers[n]; | |
| return 1 === o ? "" : 2 === r.numbers.length && 2 === o ? "_plural" : "_plural_" + o | |
| }, | |
| removeAccents: function() { | |
| var e = arguments.length <= 0 || void 0 === arguments[0] ? "" : arguments[0]; | |
| return h(e.normalize("NFKD").replace(l.mark, "")) | |
| }, | |
| accentFold: function(e) { | |
| return this.removeAccents(e).toLowerCase() | |
| }, | |
| customizeMomentLocale: function() { | |
| var e = { | |
| "zh-tw": { | |
| longDateFormat: { | |
| LT: "Ah:mm", | |
| LTS: "Ah:m:s", | |
| L: "YYYY年MMMD日", | |
| LL: "YYYY年MMMD日", | |
| LLL: "YYYY年MMMD日LT", | |
| LLLL: "YYYY年MMMD日ddddLT", | |
| l: "YYYY年MMMD日", | |
| ll: "YYYY年MMMD日", | |
| lll: "YYYY年MMMD日LT", | |
| llll: "YYYY年MMMD日ddddLT" | |
| } | |
| }, | |
| "zh-cn": { | |
| longDateFormat: { | |
| LT: "Ah:mm", | |
| LTS: "Ah:m:s", | |
| L: "YYYY-MM-DD", | |
| LL: "YYYY年MMMD日", | |
| LLL: "YYYY年MMMD日LT", | |
| LLLL: "YYYY年MMMD日ddddLT", | |
| l: "YYYY年MMMD日", | |
| ll: "YYYY年MMMD日", | |
| lll: "YYYY年MMMD日LT", | |
| llll: "YYYY年MMMD日ddddLT" | |
| } | |
| }, | |
| ar: { | |
| longDateFormat: { | |
| LT: "HH:mm", | |
| LTS: "HH:mm:ss", | |
| L: "YYYY/MM/DD", | |
| LL: "D MMMM YYYY", | |
| LLL: "D MMMM YYYY LT", | |
| LLLL: "dddd D MMMM YYYY LT" | |
| } | |
| } | |
| }; | |
| return function(t) { | |
| var r = e[t]; | |
| r && moment.locale(t, r) | |
| } | |
| }() | |
| } | |
| }, function(e, t) { | |
| "use strict"; | |
| _.mixin({ | |
| forceArray: function(e) { | |
| return _.isArray(e) ? e : [e] | |
| } | |
| }) | |
| }, function(e, t) { | |
| "use strict"; | |
| ! function() { | |
| if ("performance" in window == !1 && (window.performance = {}), !("now" in window.performance)) { | |
| var e = window.performance, | |
| t = e.timing && e.timing.navigationStart ? e.timing.navigationStart : Date.now(); | |
| e.now = function() { | |
| return Date.now() - t | |
| } | |
| } | |
| }() | |
| }, function(e, t, r) { | |
| (function(t) { | |
| "use strict"; | |
| function r(e, t) { | |
| var r = this; | |
| this._flags = 0, this._value = void 0, this._onFulfilled = void 0, this._onRejected = void 0, this._context = void 0, this._resolveLevel = 0, this._control = void 0, this.x = void 0, this._parent = void 0, this._child = void 0, this._children = void 0, this.control = void 0, t && (this._context = t["this"]), "function" == typeof e && (this._onFulfilled = e, this._flags |= Q, this._flags |= re, P(e, this._context, function(e) { | |
| return S(r, 0, !0, !1, e) | |
| }, function(e) { | |
| return S(r, 0, !1, !1, e) | |
| })) | |
| } | |
| function n(e) { | |
| if (void 0 === e) return se; | |
| if (w(e)) return e; | |
| var t = new r; | |
| return S(t, 0, !0, !1, e), t._flags |= ne, t | |
| } | |
| function o(e) { | |
| var t = new r; | |
| return t._value = e, t._flags |= z | ne, q.push(t), t | |
| } | |
| function i(e) { | |
| return new r(function(t, r) { | |
| function n(e) { | |
| if (0 === --o) { | |
| for (var r = [], n = 0; n < i.length; n++) { | |
| var a = i[n]; | |
| r.push(a && a._flags & ie ? a._value : e) | |
| } | |
| t(r) | |
| } | |
| return e | |
| } | |
| var o = e.length; | |
| if (0 === o) return void t([]); | |
| for (var i = new Array(e.length), a = 0; a < e.length; a++) i[a] = E(e[a], n, r) | |
| }) | |
| } | |
| function a(e, t) { | |
| this.errors = e || [], this.message = t || this.errors.length + " errors" | |
| } | |
| function s(e) { | |
| var t = ""; | |
| if (e._flags & te) { | |
| var r = e._onFulfilled || e._onRejected; | |
| t = r.call(e._context, Y) | |
| } else if (e._control) t = ".addRawControl(" + e._control.name + ", " + e._control.foo + ")"; | |
| else if (e._flags & J) t = ".endWithControls(" + Object.keys(e.control) + ")"; | |
| else if (e._flags & ne) t = e._flags & V ? "Promise.resolve(" + (void 0 === e._value ? "" : e._value) + ")" : "Promise.reject(" + (void 0 === e._value ? "" : e._value) + ")"; | |
| else if (e._flags & re) switch (e._flags & ie) { | |
| case z: | |
| t = "new Promise(" + e._onFulfilled + ")"; | |
| break; | |
| case ae: | |
| t = "new Promise(" + e._onFulfilled + ")"; | |
| break; | |
| case V: | |
| t = "new Promise(" + e._onFulfilled + ")" | |
| } else e._onFulfilled && e._onRejected ? t = ".then(" + e._onFulfilled + ", " + e._onRejected + ")" : e._onFulfilled ? t = ".then(" + e._onFulfilled + ")" : e._onRejected && (t = ".catch(" + e._onRejected + ")"); | |
| return t | |
| } | |
| function d(e, t) { | |
| return new r(function(r) { | |
| var n = b(t); | |
| w(n) && (n._flags |= X), setTimeout(r, e, n) | |
| }) | |
| } | |
| function c(e) { | |
| this.message = e || "StackPromise timed out" | |
| } | |
| function u(e, t) { | |
| var n = void 0; | |
| if (arguments.length > 2) { | |
| n = new Array(arguments.length - 2); | |
| for (var o = 2; o < arguments.length; o++) n[o - 2] = arguments[o] | |
| } | |
| return new r(function(r) { | |
| r(e.apply(t, n)) | |
| }) | |
| } | |
| function l(e, t, r, n) { | |
| this.name = e, this.foo = t, this.lightning = !!r, this.canRunMultipleTimes = !!n | |
| } | |
| function f(e, t) { | |
| function n() { | |
| for (var n = void 0, o = e._parent; o && !(o._flags & ie) && !(o._flags & J); o = o._parent) !o._control || o._control.name !== t || o._flags & Q || (n = o); | |
| if (!n) return r.NO_ACTIVE_CONTROL; | |
| n._control.canRunMultipleTimes || (n._flags |= Q); | |
| var i = void 0; | |
| if (arguments.length > 0) { | |
| i = new Array(arguments.length); | |
| for (var a = 0; a < arguments.length; a++) i[a] = arguments[a] | |
| } | |
| return n._control.foo.call(n._context, function(e) { | |
| return N(n, n._resolveLevel, !0, !1, e) | |
| }, function(e) { | |
| return N(n, n._resolveLevel, !1, !1, e) | |
| }, n._parent, i) | |
| } | |
| return n | |
| } | |
| function h(e) { | |
| this.message = e, this.stack = new Error(e || this.name).stack | |
| } | |
| function p(e, t, r, n) { | |
| t(new h(n && n[0])) | |
| } | |
| function m() { | |
| 0 === D && (B.length || q.length) && (D = 1, ce || (ce = g()), ce()) | |
| } | |
| function g() { | |
| var e = void 0, | |
| r = void 0; | |
| return "undefined" == typeof MutationObserver || window && window.navigator && window.navigator.standalone ? "function" == typeof t ? function() { | |
| t(k) | |
| } : function() { | |
| setTimeout(k, 0) | |
| } : (e = document.createElement("div"), r = new MutationObserver(k), r.observe(e, { | |
| attributes: !0 | |
| }), function() { | |
| e.setAttribute("tick", 1 & L) | |
| }) | |
| } | |
| function _(e) { | |
| return e === Y ? ".tap()" : j | |
| } | |
| function v(e, t) { | |
| e._flags |= X, t._parent = e, e._children ? e._children.push(t) : e._child ? (e._children = [e._child, t], e._child = void 0) : e._child = t | |
| } | |
| function y(e) { | |
| if (e && ("object" == typeof e || "function" == typeof e)) { | |
| var t = void 0; | |
| try { | |
| t = e.then | |
| } catch (r) { | |
| return G = r, F | |
| } | |
| if ("function" == typeof t) return t | |
| } | |
| } | |
| function b(e) { | |
| if (!e || w(e)) return e; | |
| var t = y(e); | |
| return t === F ? o(G) : t ? new r(function(r, n) { | |
| t.call(e, r, n) | |
| }) : e | |
| } | |
| function w(e) { | |
| return e instanceof r | |
| } | |
| function E(e, t, r) { | |
| e = b(e); | |
| var i = w(e), | |
| a = void 0, | |
| s = void 0, | |
| d = !1, | |
| c = void 0; | |
| if (i) { | |
| if (!(e._flags & ie)) { | |
| var u = e.then(t, r); | |
| return u._synchronous |= Z, u | |
| } | |
| e._flags |= X, d = !!(e._flags & ee), c = e._context, a = e._flags & V ? t : r, s = e._value | |
| } else a = t, s = e; | |
| if (!a) return n(e).then(); | |
| s = M(a, c, s, !0); | |
| var l = void 0; | |
| if (s === F) l = o(G); | |
| else { | |
| if (s === W) return n(e).then(t, r); | |
| if (s === j) return i ? e.then() : n(e); | |
| l = n(s) | |
| } | |
| return d && (l = l.cancellable()), void 0 !== c && (l = l.bind(c)), l | |
| } | |
| function S(e, t, r, n, o) { | |
| if (t === e._resolveLevel) { | |
| var i = ++e._resolveLevel; | |
| if (e._flags |= Q, !r) return void A(e, !1, n, o); | |
| if (o === e) e._parent = void 0, A(e, !1, n, new TypeError("promise resolved to itself")); | |
| else if (w(o)) { | |
| var a = o._flags & ie; | |
| a === ae ? v(o, e) : (e._parent = o, e._flags |= oe, o._flags |= X, A(e, a === V, n, o._value)) | |
| } else { | |
| var s = y(o); | |
| s === F ? (e._parent = void 0, A(e, !1, n, G)) : s ? (e._parent = void 0, P(s, o, function(t) { | |
| return S(e, i, !0, !1, t) | |
| }, function(t) { | |
| return S(e, i, !1, !1, t) | |
| })) : A(e, !0, n, o) | |
| } | |
| } | |
| } | |
| function N(e, t, r, n, o) { | |
| if (t === e._resolveLevel) { | |
| if (e._parent) { | |
| var i = e._parent; | |
| if (e._parent = void 0, i._child === e) i._child = void 0; | |
| else if (i._children) { | |
| for (var a = i._children, s = 0; s < a.length; s++) | |
| if (a[s] === e) { | |
| a.splice(s, 1); | |
| break | |
| } | |
| 0 === a.length && (i._children = void 0) | |
| } | |
| } | |
| S(e, t, r, n, o) | |
| } | |
| } | |
| function T(e) { | |
| if (null === e || void 0 === e) throw new Error("Invalid .catch guard " + e); | |
| if ("function" == typeof e) return e; | |
| if ("object" == typeof e) throw new Error("Object guards in .catch are currently unsupported"); | |
| return function(t) { | |
| return t === e | |
| } | |
| } | |
| function $(e, t) { | |
| for (var r = 0; r < e.length; r++) { | |
| var n = e[r]; | |
| if (n === Error || n.prototype instanceof Error) { | |
| if (t instanceof n) return !0 | |
| } else if (n(t)) return !0 | |
| } | |
| return !1 | |
| } | |
| function C(e, t) { | |
| function r(r, n) { | |
| return r === Y ? ".catch(..., " + t + ")" : e && !$(e, r) ? j : n ? W : t.call(this, r) | |
| } | |
| return r | |
| } | |
| function A(e, t, r, n) { | |
| if (e._flags |= t ? V : z, e._flags |= Q, e._value = n, e._child) I(e._child, t, r, n, e), e._child = void 0; | |
| else if (e._children) { | |
| var o = e._children; | |
| e._children = void 0; | |
| for (var i = 0; i < o.length; i++) I(o[i], t, r, n, e) | |
| } else t || e._flags & X || q.push(e) | |
| } | |
| function I(e, t, r, n, o) { | |
| e._resolveLevel++; | |
| var i = R(e, t); | |
| if (i && e._flags & Z) { | |
| e._flags |= Q; | |
| var a = M(i, e._context, n, !0); | |
| if (a !== W) return void(a === F ? (e._parent = void 0, A(e, !1, r, G)) : a === j ? A(e, t, r, n) : (e._parent = void 0, S(e, e._resolveLevel, !0, r, a))); | |
| e._flags &= ~Q | |
| } | |
| i ? ((r ? x : B).push(e), m()) : A(e, t, r, n) | |
| } | |
| function O(e, t) { | |
| for (; 0 !== e.length;) t.push(e.pop()) | |
| } | |
| function k() { | |
| for (; 0 !== U.length || 0 !== B.length;) { | |
| 0 === U.length && O(B, U); | |
| var e = U.pop(), | |
| t = e._parent, | |
| n = !!(t && t._flags & V), | |
| o = t && t._value, | |
| i = R(e, n); | |
| if (e._flags |= Q, i) { | |
| var a = void 0; | |
| do a = M(i, e._context, o, !1); while (a === W); | |
| a === F ? (o = G, n = !1, e._parent = void 0) : a !== j && (o = a, n = !0, e._parent = void 0) | |
| } | |
| e._flags & ie || (S(e, e._resolveLevel, n, !0, o), O(x, U)) | |
| } | |
| for (D--, L++; 0 !== q.length;) { | |
| var s = q.pop(); | |
| s._flags & X || H.push(s) | |
| } | |
| for (; 0 !== K.length;) { | |
| var d = K.pop(); | |
| d._flags & X || r.onPossiblyUnhandledRejection(d._value, d) | |
| } | |
| var c = K; | |
| K = H, H = c | |
| } | |
| function P(e, t, r, n) { | |
| try { | |
| e.call(t, r, n) | |
| } catch (o) { | |
| n(o) | |
| } | |
| } | |
| function R(e, t) { | |
| return e._flags & Q ? void 0 : t ? e._onFulfilled : e._onRejected | |
| } | |
| function M(e, t, r, n) { | |
| try { | |
| return n ? e.call(t, r, !0) : e.call(t, r) | |
| } catch (o) { | |
| return G = o, F | |
| } | |
| } | |
| var L = 0, | |
| D = 0, | |
| U = [], | |
| B = [], | |
| x = [], | |
| j = { | |
| sentinel: "CONTINUE_AS_IF_NO_HANDLER" | |
| }, | |
| W = { | |
| sentinel: "RETRY_ASYNCHRONOUSLY" | |
| }, | |
| Y = { | |
| sentinel: "TO_STRING" | |
| }, | |
| F = { | |
| sentinel: "DID_ERROR" | |
| }, | |
| G = null, | |
| q = [], | |
| K = [], | |
| H = [], | |
| V = 1, | |
| z = 2, | |
| Q = 4, | |
| X = 8, | |
| J = 16, | |
| Z = 32, | |
| ee = 64, | |
| te = 128, | |
| re = 256, | |
| ne = 512, | |
| oe = 1024, | |
| ie = V | z, | |
| ae = 0, | |
| se = void 0; | |
| r.resolve = n, r.reject = o, r.prototype.then = function(e, t) { | |
| "function" != typeof e && (e = void 0), "function" != typeof t && (t = void 0); | |
| var n = new r; | |
| n._onFulfilled = e, n._onRejected = t, n._context = this._context, this._flags & ee && (n._flags |= ee); | |
| var o = this._flags & ie; | |
| return o === ae ? v(this, n) : (this._flags |= X, (o === V ? e : t) ? (n._parent = this, B.push(n), m()) : (n._parent = this, n._flags |= o, n._value = this._value, o === z && q.push(n))), n | |
| }, r.prototype["catch"] = function(e) { | |
| var t = arguments.length - 1; | |
| if (0 === t) return this.then(void 0, e); | |
| for (var r = new Array(t), n = 0; t > n; n++) r[n] = T(arguments[n]); | |
| var o = C(r, arguments[t]), | |
| i = E(this, void 0, o); | |
| return i._onRejected && (i._flags |= te), i | |
| }, r.prototype.bind = function(e) { | |
| var t = this.then(); | |
| return t._context = e, t | |
| }, r.prototype.end = function(e) { | |
| var t = this.then(); | |
| if (t._flags |= J, t.control = {}, t._context = void 0, e) { | |
| var r = e.controls; | |
| if (r) | |
| for (var n = 0; n < r.length; n++) { | |
| var o = r[n]; | |
| t.control[o] = f(t, o) | |
| } | |
| return t | |
| } | |
| }, r.prototype.endWithControls = function() { | |
| var e = this.then(); | |
| e._flags |= J, e.control = {}, e._context = void 0; | |
| for (var t = 0; t < arguments.length; t++) { | |
| var r = arguments[t]; | |
| e.control[r] = f(e, r) | |
| } | |
| return e | |
| }, r.all = i, r.any = function(e) { | |
| return new r(function(t, r) { | |
| function n(e) { | |
| if (0 === --o) { | |
| for (var t = [], n = 0; n < i.length; n++) { | |
| var s = i[n]; | |
| t.push(s && s._flags & ie ? s._value : e) | |
| } | |
| r(new a(t)) | |
| } | |
| return e | |
| } | |
| var o = e.length; | |
| 0 === o && r(new a([], "StackPromise.any called with []")); | |
| for (var i = new Array(e.length), s = 0; s < e.length; s++) i[s] = E(e[s], t, n) | |
| }) | |
| }, r.props = function(e) { | |
| function t(e) { | |
| for (var t = {}, r = 0; r < e.length; r++) t[n[r]] = e[r]; | |
| return t | |
| } | |
| var n = Object.keys(e), | |
| o = r.all(n.map(function(t) { | |
| return e[t] | |
| })); | |
| switch (o._flags & ie) { | |
| case z: | |
| return o; | |
| case ae: | |
| return o = o.then(t), o._flags |= Z, o; | |
| case V: | |
| return o._value = t(o._value), o | |
| } | |
| }, r.map = function(e, t) { | |
| function r(e) { | |
| return function(r) { | |
| return o && t(r, e) | |
| } | |
| } | |
| var o = !0, | |
| a = i(e.map(function(e, t) { | |
| return n(e).then(r(t)) | |
| })); | |
| switch (a._flags & ie) { | |
| case z: | |
| o = !1; | |
| break; | |
| case ae: | |
| a = a["catch"](function() { | |
| return o = !1, j | |
| }), a._flags |= Z; | |
| break; | |
| case V: | |
| } | |
| return a | |
| }, r.reduce = function(e, t, r) { | |
| return n(e).reduce(t, r) | |
| }, r.prototype.reduce = function(e, t) { | |
| return t = b(t), E(this, function(r, n) { | |
| function o() { | |
| for (var r = i.length;;) { | |
| var n = c, | |
| a = i[n]; | |
| if (w(a)) switch (a._flags & ie) { | |
| case z: | |
| return a; | |
| case ae: | |
| return a.then(o); | |
| case V: | |
| a = a._value | |
| } | |
| if (w(t)) switch (t._flags & ie) { | |
| case z: | |
| return t; | |
| case ae: | |
| return t.then(o); | |
| case V: | |
| t = t._value | |
| } | |
| var s = e.call(d, t, a, n, r); | |
| if (++c === r) return s; | |
| if (s = b(s), w(s)) switch (s._flags & ie) { | |
| case z: | |
| return s; | |
| case ae: | |
| return t = s, s.then(o); | |
| case V: | |
| s._flags |= X, t = s._value | |
| } else t = s | |
| } | |
| } | |
| if (0 === r.length) return t; | |
| if (n) return W; | |
| for (var i = new Array(r.length), a = 0; a < r.length; a++) { | |
| var s = i[a] = b(r[a]); | |
| w(s) && (s._flags |= X) | |
| } | |
| var d = this, | |
| c = 0; | |
| return o() | |
| }) | |
| }, r.each = function(e, t) { | |
| return n(e).each(t) | |
| }, r.prototype.each = function(e) { | |
| function t(t, n, o, i) { | |
| return r.push(n), e.call(this, n, o, i) | |
| } | |
| var r = []; | |
| return this.reduce(t)["return"](r) | |
| }, r.mapSeries = function(e, t) { | |
| return n(e).mapSeries(t) | |
| }, r.prototype.mapSeries = function(e) { | |
| function t(t, r, n, o) { | |
| var i = b(e.call(this, r, n, o)); | |
| return w(i) ? i.then(function(e) { | |
| return t.push(e), t | |
| }) : (t.push(i), t) | |
| } | |
| return this.reduce(t, []) | |
| }, r.race = function(e) { | |
| var t = b(e); | |
| if (w(t)) { | |
| var n = t.then(function(e) { | |
| return r.race(e) | |
| }); | |
| return n._context = void 0, n._flags &= ~ee, n | |
| } | |
| return new r(function(e, r) { | |
| for (var n = 0; n < t.length; n++) { | |
| var o = b(t[n]); | |
| if (!w(o) || o._flags & ie) | |
| for (e(o), n++; n < t.length; n++) { | |
| var i = t[n]; | |
| w(i) && (i._flags |= X) | |
| } else o.then(e, r) | |
| } | |
| }) | |
| }, a.prototype = Object.create(Error.prototype, { | |
| name: { | |
| value: "AggregateError" | |
| } | |
| }), r.AggregateError = a, r.onPossiblyUnhandledRejection = function(e, t) { | |
| console.error("StackPromise did not catch " + e, t, e) | |
| }, r.prototype.toString = function() { | |
| for (var e = [], t = void 0, r = this, n = !1; r; r = r._parent) { | |
| t = r, !n && r._flags & ie && (n = !0, r._flags & ne || (r._flags & V ? e.push("[resolved value: " + r._value + "]") : e.push("[rejected reason: " + r._value + "]"))); | |
| var o = s(r); | |
| r._flags & oe && (o = "~" + o), e.push(o) | |
| } | |
| return e.reverse(), t._flags & (ne | re) || (e[0] = "[Promise]" + e[0]), e.join("\n") | |
| }, r.delay = d, r.prototype.delay = function(e) { | |
| return this.then(function(t) { | |
| return d(e, t) | |
| }) | |
| }, r.prototype.timeout = function(e, t) { | |
| function r(r) { | |
| return r === Y ? ".timeout(" + e + ", " + t + ")" : (clearTimeout(n), j) | |
| } | |
| if ((this._flags & ie) !== ae) return this.then(); | |
| var n = void 0, | |
| o = this.then(r, r); | |
| return o._flags |= Z | te, n = setTimeout(function(e, t) { | |
| if (!(e._flags & ie)) { | |
| var r = t instanceof Error ? t : new c(t); | |
| N(e, 0, !1, !1, r) | |
| } | |
| }, e, o, t), o | |
| }, c.prototype = Object.create(Error.prototype, { | |
| name: { | |
| value: "TimeoutError" | |
| } | |
| }), r.TimeoutError = c, r.prototype.isFulfilled = function() { | |
| return !!(this._flags & V) | |
| }, r.prototype.isRejected = function() { | |
| return !!(this._flags & z) | |
| }, r.prototype.isPending = function() { | |
| return !(this._flags & ie) | |
| }, r.prototype.value = function() { | |
| if (this._flags & V) return this._value; | |
| throw new Error(this._flags & z ? "value() called on StackPromise that was rejected" : "value() called on StackPromise that is pending") | |
| }, r.prototype.reason = function() { | |
| if (this._flags & z) return this._value; | |
| throw new Error(this._flags & V ? "reason() called on StackPromise that was fulfilled, not rejected" : "reason() called on StackPromise that is pending") | |
| }, r.callSynchronously = u, r.wrap = function(e) { | |
| return function() { | |
| var t = this, | |
| r = void 0; | |
| if (arguments.length > 0) { | |
| r = new Array(arguments.length); | |
| for (var o = 0; o < arguments.length; o++) r[o] = arguments[o] | |
| } | |
| var i = function(n) { | |
| return n === Y ? ".wrap(" + e + ").apply(" + t + ", [" + r + "])" : e.apply(t, r) | |
| }, | |
| a = n().then(i); | |
| return a._flags |= te, a | |
| } | |
| }, r.loop = function(e, t) { | |
| return n(t).loop(e) | |
| }, r.prototype.loop = function(e) { | |
| var t = E(this.then(function(r) { | |
| function n(r) { | |
| return u(e, o, a, r, i++).then(function(e) { | |
| return t._flags & ie ? void 0 : n(e) | |
| }) | |
| } | |
| var o = this, | |
| i = 0, | |
| a = function(e) { | |
| return N(t, 0, !0, !1, e) | |
| }; | |
| return n(r) | |
| }), function(t) { | |
| return t === Y ? ".loop(" + e + ")" : j | |
| }); | |
| return t._flags |= te, t | |
| }, r.prototype.checkpoint = function(e) { | |
| return e = n(e), this.then(function(t) { | |
| return e._flags & z ? e : t | |
| }) | |
| }, r.prototype["finally"] = function(e) { | |
| function t(t) { | |
| return t === Y ? ".finally(" + e + ")" : (e.call(this, t), j) | |
| } | |
| var r = this.then(t, t); | |
| return r._flags |= te, r | |
| }, r.prototype.get = function(e) { | |
| var t = this.then(function(t) { | |
| return t === Y ? ".get('" + e + "')" : t[e] | |
| }); | |
| return t._flags |= te, t | |
| }, r.prototype.tap = function(e) { | |
| function t(t) { | |
| return t === Y ? ".tap(" + e + ")" : (e.call(this, t), j) | |
| } | |
| if ("function" != typeof e) { | |
| var r = this.then(_); | |
| return r._flags |= te, r | |
| } | |
| var n = this.then(t); | |
| return n._flags |= te, n | |
| }, r.prototype.spread = function(e) { | |
| var t = this.then(function(t) { | |
| return t === Y ? ".spread(" + e + ")" : e.apply(this, t) | |
| }); | |
| return t._flags |= te, t | |
| }, r.prototype["return"] = function(e) { | |
| switch (this._flags & ie) { | |
| case z: | |
| return this.then(); | |
| case ae: | |
| case V: | |
| e = b(e), w(e) && (e._flags |= X); | |
| var t = E(this, function(t) { | |
| return t === Y ? ".return(" + e + ")" : e | |
| }); | |
| return t._flags |= te, t | |
| } | |
| }, r.prototype["throw"] = function(e) { | |
| return this["return"](o(e)) | |
| }, r.Control = l, r.NO_ACTIVE_CONTROL = new Error("No active control was found."), r.prototype.addControl = function(e) { | |
| if (!(e instanceof l)) throw new Error("addControl must be given Control, but got " + e); | |
| var t = this.then(e.lightning ? void 0 : _); | |
| return t._control = e, t | |
| }, r.prototype.addRawControl = function(e, t, r, n) { | |
| return this.addControl(new l(e, t, r, n)) | |
| }, r.prototype.addResolveControl = function(e, t, r, n) { | |
| function o(e, r, n, o) { | |
| try { | |
| e(t.apply(this, o)) | |
| } catch (i) { | |
| r(i) | |
| } | |
| } | |
| return this.addControl(new l(e, o, r, n)) | |
| }, r.prototype.addRejectControl = function(e, t, r, n) { | |
| function o(e, r, n, o) { | |
| try { | |
| r(t.apply(this, o)) | |
| } catch (i) { | |
| r(i) | |
| } | |
| } | |
| return this.addControl(new l(e, o, r, n)) | |
| }, h.prototype = Object.create(Error.prototype, { | |
| name: { | |
| value: "CancellationError" | |
| } | |
| }), r.CancellationError = h; | |
| var de = new l("cancel", p, !1, !1); | |
| r.prototype.addCancelControl = function() { | |
| var e = this.addControl(de); | |
| return e._flags |= ee, e | |
| }, r.sit = function(e, t) { | |
| var n = new r; | |
| return n._control = new l(e, function(e, r, n, o) { | |
| e(t ? t.apply(void 0, o) : o && o[0]) | |
| }), n | |
| }, r.prototype.cancellable = function() { | |
| var e = this.then(); | |
| return e._flags |= ee, e | |
| }, r.prototype.uncancellable = function() { | |
| var e = this.then(); | |
| return e._flags &= ~ee, e | |
| }, r.prototype.cancel = function(e) { | |
| for (var t = void 0, r = this; r && !(r._flags & ie); r = r._parent) r._flags & ee && (t = r); | |
| t && (void 0 === e && (e = new h), N(t, t._resolveLevel, !1, !1, e)) | |
| }; | |
| var ce = void 0; | |
| se = new r, S(se, 0, !0, !1, void 0), e.exports = r | |
| }).call(t, r(88).setImmediate) | |
| }, function(e, t, r) { | |
| e.exports = { | |
| "default": r(388), | |
| __esModule: !0 | |
| } | |
| }, , , , , , , , , function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(328), | |
| i = r(93), | |
| a = n.createClass({ | |
| displayName: "ConfirmPopup", | |
| mixins: [i], | |
| propTypes: { | |
| classes: n.PropTypes.string, | |
| onCancel: n.PropTypes.func, | |
| cancelText: n.PropTypes.string, | |
| onOK: n.PropTypes.func, | |
| okText: n.PropTypes.string, | |
| children: n.PropTypes.node.isRequired, | |
| title: n.PropTypes.node, | |
| a8n: n.PropTypes.string | |
| }, | |
| getDefaultProps: function() { | |
| return { | |
| classes: "", | |
| cancelText: l10n.t("web_cancel"), | |
| okText: l10n.t("web_ok") | |
| } | |
| }, | |
| onOK: function(e) { | |
| this.actionTriggered || (this.props.onOK(e), this.actionTriggered = !0) | |
| }, | |
| onCancel: function(e) { | |
| this.actionTriggered || (this.props.onCancel(e), this.actionTriggered = !0) | |
| }, | |
| componentDidMount: function() { | |
| if (this.props.onOK) { | |
| var e = this; | |
| this.regNativeListener(window, "keydown", function(t) { | |
| 13 === t.keyCode && (t.stopPropagation(), t.preventDefault(), e.props.onOK()) | |
| }) | |
| } | |
| }, | |
| render: function() { | |
| var e = this.props.onOK ? n.createElement("button", { | |
| "data-a8n": o.key("popup-controls-ok"), | |
| className: "btn-plain btn-default popup-controls-item", | |
| onClick: this.onOK | |
| }, this.props.okText) : null, | |
| t = this.props.onCancel ? n.createElement("button", { | |
| className: "btn-plain popup-controls-item", | |
| onClick: this.onCancel | |
| }, this.props.cancelText) : null, | |
| r = this.props.title ? n.createElement("div", { | |
| "data-a8n": o.key("popup-title"), | |
| className: "popup-title" | |
| }, this.props.title) : null; | |
| return n.createElement("div", { | |
| className: "backdrop" | |
| }, n.createElement("div", { | |
| className: "popup-container" | |
| }, n.createElement("div", { | |
| className: "popup " + this.props.classes | |
| }, n.createElement("div", { | |
| className: "popup-body" | |
| }, r, n.createElement("div", { | |
| "data-a8n": o.key("popup-contents"), | |
| className: "popup-contents" | |
| }, this.props.children)), n.createElement("div", { | |
| className: "popup-controls" | |
| }, t, e)))) | |
| } | |
| }); | |
| e.exports = a | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(1), | |
| o = r(9), | |
| i = r(332), | |
| a = r(75), | |
| s = r(331), | |
| d = r(10), | |
| c = r(18), | |
| u = r(13), | |
| l = { | |
| QUERY: "QUERY", | |
| FIND: "FIND", | |
| UPDATE: "UPDATE" | |
| }, | |
| f = { | |
| NONE: "NONE", | |
| LOAD: "LOAD" | |
| }, | |
| h = s.extend(i, a, { | |
| listenTo: function(e, t, r) { | |
| if (!_.isObject(e) || _.isEmpty(t) || !_.isFunction(r)) { | |
| var n = []; | |
| throw _.isObject(e) || n.push("obj parameter is not an object"), _.isEmpty(t) && n.push("event is empty string"), _.isFunction(r) || n.push("callback is not a function"), new Error(n.join(", ")) | |
| } | |
| s.prototype.listenTo.apply(this, arguments) | |
| }, | |
| initialize: function(e) { | |
| this._config = _.extend({ | |
| CachePolicy: { | |
| id: void 0, | |
| policy: f.NONE, | |
| delay: 0 | |
| }, | |
| staleCollection: !1 | |
| }, e), this._inflight = {}, this.listenTo(this, "add remove reset sort", function() { | |
| var e = this._last, | |
| t = this.last(); | |
| (!e && t || e !== t) && (this._last = t, this.trigger("change:last", t)); | |
| var r = this._first, | |
| n = this.first(); | |
| (!r && n || r !== n) && (this._first = n, this.trigger("change:first", n)) | |
| }), this._initializeFromCache(), this._config.staleCollection && this._initializeStaleCollection() | |
| }, | |
| _initializeFromCache: function(e) { | |
| var t = this._config.CachePolicy, | |
| r = t.id, | |
| o = t.policy, | |
| i = t.delay, | |
| a = t.trigger || "all"; | |
| this.listenTo(d, "change:stream", function() { | |
| if (d.stream === d.STREAM.SYNCING) { | |
| if (o === f.NONE) return void(_.isUndefined(r) || u.setCollection(r)); | |
| if (n.log("baseCollection:initFromCache load: " + r)(), this.add(u.getCollection(r)), !_.isNumber(i)) return; | |
| this._saveToCache = _.debounce(this.saveToCache, i), this.listenTo(this, a, this._saveToCache), this.initializeFromCache() | |
| } | |
| }) | |
| }, | |
| initializeFromCache: function() {}, | |
| saveToCache: function() { | |
| if (Store.Conn.me) { | |
| var e = this._config.CachePolicy.id; | |
| n.log("baseCollection:saveToCache save: " + e)(), u.setCollection(e, this.toJSON()) | |
| } | |
| }, | |
| _initializeStaleCollection: function() { | |
| var e = this; | |
| this.listenTo(d, "change:stream", function() { | |
| switch (d.stream) { | |
| case d.STREAM.DISCONNECTED: | |
| e.invoke("set", "stale", !0); | |
| break; | |
| case d.STREAM.RESUMING: | |
| case d.STREAM.SYNCING: | |
| break; | |
| case d.STREAM.CONNECTED: | |
| d.previousAttributes().stream === d.STREAM.RESUMING && _.isFunction(e.onResume) && e.onResume() | |
| } | |
| }) | |
| }, | |
| _query: function(e, t) { | |
| var r = _.isString(t) ? t : JSON.stringify(t), | |
| o = e === l.QUERY ? void 0 : this.get(t), | |
| i = "force-" + r; | |
| return (this._inflight[i] && e === l.FIND || e === l.UPDATE) && (r = i), this._inflight[r] ? o && e === l.FIND ? Promise.resolve(o) : this._inflight[r] : !o || o && o.stale || e === l.UPDATE ? this._inflight[r] = this._serverQuery(e, t).bind(this)["finally"](function() { | |
| delete this._inflight[r] | |
| })["catch"](c.WapDrop, function(e) { | |
| throw n.warn(e.toString())(), e | |
| })["catch"](_.isString, function(e) { | |
| n.log("baseCollection:query query promise rejected: " + e)() | |
| }) : Promise.resolve(o) | |
| }, | |
| _serverQuery: function(e, t) { | |
| var r; | |
| r = e === l.UPDATE ? this._update(t) : e === l.FIND ? this._find(t) : this._findQuery(t); | |
| var n = this; | |
| return r.then(function(e) { | |
| return n._config.staleCollection && _.each(_.compact(_.forceArray(e)), function(e) { | |
| "undefined" == typeof e.stale && (e.stale = !1) | |
| }), n.add(e, { | |
| merge: !0 | |
| }) | |
| }) | |
| }, | |
| findQuery: function(e) { | |
| return this._query(l.QUERY, e) | |
| }, | |
| find: function(e) { | |
| return e ? this._query(l.FIND, e) : (o.upload(n.trace("Called find without an id")), Promise.resolve()) | |
| }, | |
| update: function(e) { | |
| return e ? this._query(l.UPDATE, e) : (o.upload(n.trace("Called update without an id")), Promise.resolve()) | |
| }, | |
| _update: function(e) { | |
| return this._find(e) | |
| }, | |
| handle: function(e) { | |
| var t = this._handle(e.shift()); | |
| this._config.staleCollection && _.each(_.compact(_.forceArray(t)), function(e) { | |
| e.stale = !1 | |
| }), this.add(t, { | |
| merge: !0 | |
| }) | |
| }, | |
| gadd: function(e) { | |
| if (_.isString(e) || _.isNumber(e)) { | |
| var t = {}; | |
| return t[this.mainIndex] = e, this.get(e) || this.add(t, { | |
| merge: !0 | |
| }) | |
| } | |
| if (e && e[this.mainIndex]) return this.add(e, { | |
| merge: !0 | |
| }); | |
| var r = _.findKey(Store, this) || "unknown"; | |
| throw new Error(r + ".gadd called without an id attr (" + this.mainIndex + ")") | |
| }, | |
| "delete": function() { | |
| this.stopListening(this, "all", this._saveToCache), _.invoke(this.models, "stopListening"), _.invoke(this.models, "cancelPendingPromises"), this._inflight = {}, this.reset() | |
| }, | |
| isStateStale: function(e) { | |
| var t = this.get(e); | |
| return t && t.stale | |
| } | |
| }); | |
| h.CACHE_POLICY = f, e.exports = h | |
| }, function(e, t) { | |
| "use strict"; | |
| e.exports = { | |
| key: function(e) { | |
| var t = !1; | |
| return t ? e : void 0 | |
| } | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| var t = {}; | |
| return e.forEach(function(e) { | |
| var r = e.split(""), | |
| n = _.initial(r).join(""), | |
| o = _.last(r); | |
| (t[n] || (t[n] = {}))[o] = 1 | |
| }), _.keys(t).forEach(function(e) { | |
| t[e] = i(_.keys(t[e])) | |
| }), o(t) | |
| } | |
| function o(e) { | |
| return _.map(_.keys(e).sort(function(e, t) { | |
| return t.length - e.length | |
| }), function(t) { | |
| return _.escapeRegExp(t) + e[t] | |
| }).join("|") | |
| } | |
| function i(e) { | |
| if (1 === e.length) return _.escapeRegExp(e[0]); | |
| e = e.sort(); | |
| for (var t = [], r = 0, n = e[r], o = e.length, i = 0; o >= i; i++) { | |
| var a = e[i]; | |
| if (!a || a.charCodeAt(0) !== n.charCodeAt(0) + (i - r)) { | |
| var s = e[i - 1]; | |
| s === n ? t.push(s) : t.push(n + "-" + s), r = i, n = a | |
| } | |
| } | |
| return "[" + _.escapeRegExp(t.join("")) + "]" | |
| } | |
| function a() { | |
| var e = Object.keys(T).concat(Object.keys(y), w); | |
| try { | |
| return new RegExp("(" + n(e) + ")", "g") | |
| } catch (t) { | |
| f.log("createRegexp Failed", e)() | |
| } | |
| } | |
| function s() { | |
| var e = Object.keys(T).concat(Object.keys(y), w); | |
| try { | |
| return new RegExp("(" + n(e) + ")") | |
| } catch (t) { | |
| f.log("createSingleRegexp Failed", e)() | |
| } | |
| } | |
| var d = r(383), | |
| c = r(382), | |
| u = r(6), | |
| l = r(39), | |
| f = r(1), | |
| h = null, | |
| p = null, | |
| m = {}, | |
| g = "□", | |
| v = "🏻 🏼 🏽 🏾 🏿".split(/ /), | |
| y = { | |
| "︀": !0, | |
| "︁": !0, | |
| "︂": !0, | |
| "︃": !0, | |
| "︄": !0, | |
| "︅": !0, | |
| "︆": !0, | |
| "︇": !0, | |
| "︈": !0, | |
| "︉": !0, | |
| "︊": !0, | |
| "︋": !0, | |
| "︌": !0, | |
| "︍": !0, | |
| "︎": !0, | |
| "️": !0 | |
| }, | |
| b = ["🇦", "🇧", "🇨", "🇩", "🇪", "🇫", "🇬", "🇭", "🇮", "🇯", "🇰", "🇱", "🇲", "🇳", "🇴", "🇵", "🇶", "🇷", "🇸", "🇹", "🇺", "🇻", "🇼", "🇽", "🇾", "🇿"], | |
| w = []; | |
| b.forEach(function(e) { | |
| b.forEach(function(t) { | |
| w.push(e + t) | |
| }) | |
| }); | |
| var E = function(e, t) { | |
| for (var r in t) t.hasOwnProperty(r) && (e[r] = t[r]); | |
| return e | |
| }, | |
| S = function(e) { | |
| var t = {}; | |
| for (var r in e) e.hasOwnProperty(r) && (t[e[r]] = r); | |
| return t | |
| }, | |
| N = S(d), | |
| T = E(E({}, c), d), | |
| $ = {}, | |
| C = v[0]; | |
| _.keys(d).forEach(function(e) { | |
| d[e + C] && ($[e] = e, v.map(function(t) { | |
| $[e + t] = e | |
| })) | |
| }); | |
| var A = { | |
| emojiIndex: _.memoize(function(e) { | |
| return p || (p = s()), p.exec(e) | |
| }), | |
| containsEmoji: _.memoize(function(e) { | |
| return h || (h = a()), h.test(e) | |
| }), | |
| normalizeEmoji: _.memoize(function(e) { | |
| return h || (h = a()), e ? e.replace(h, function(e, t) { | |
| if (y[t]) return ""; | |
| var r = T[t]; | |
| return N[r] || g | |
| }) : "" | |
| }), | |
| codeToEmoji: S(T), | |
| emojiToImage: _.memoize(function(e, t, r) { | |
| r = r || "small"; | |
| var n = "small" === r ? "emoji" : "emojik"; | |
| if (y[e]) return null; | |
| var o = m[e]; | |
| if (o) return o; | |
| var i, a = T[e]; | |
| if (a) { | |
| var s = N[a] || g, | |
| d = document.createElement("img"); | |
| return d.alt = s, d.draggable = !1, d.className = l(n, "emoji" + a, t), d.src = u.ONE_BY_ONE_TRANS_GIF, d | |
| } | |
| return i = g, m[e] = i | |
| }, function(e, t, r) { | |
| return "t:" + (e || "") + "c:" + (t || "") + "s:" + (r || "small") | |
| }), | |
| emojiToHTML: _.memoize(function(e, t, r) { | |
| h || (h = a()), r = r || "small"; | |
| var n = "small" === r ? "emoji" : "emojik"; | |
| return e ? e.replace(h, function(e, r) { | |
| if (y[r]) return ""; | |
| var o = m[r]; | |
| if (o) return o; | |
| var i, a = T[r]; | |
| if (a) { | |
| var s = N[a] || g, | |
| d = document.createElement("img"); | |
| return d.alt = s, d.draggable = !1, d.className = l(n, "emoji" + a, t), d.src = u.ONE_BY_ONE_TRANS_GIF, d.outerHTML | |
| } | |
| return i = g, m[r] = i | |
| }) : "" | |
| }, function(e, t, r) { | |
| return "t:" + (e || "") + "c:" + (t || "") + "s:" + (r || "small") | |
| }), | |
| NodeToEmoji: function(e) { | |
| for (var t = [""], r = 0, n = e.firstChild; null !== n;) { | |
| if (1 === n.nodeType) switch (n.tagName) { | |
| case "P": | |
| case "PRE": | |
| case "DIV": | |
| t.push(""), r++; | |
| break; | |
| case "IMG": | |
| t[r] += n.getAttribute("alt"); | |
| break; | |
| case "BR": | |
| t[r] += "\n" | |
| } else 3 === n.nodeType && (t[r] += n.nodeValue); | |
| if (n.hasChildNodes()) n = n.firstChild; | |
| else { | |
| for (; null === n.nextSibling;) { | |
| if (n = n.parentNode, n === e) return t.join("\n"); | |
| switch (n.tagName) { | |
| case "P": | |
| case "PRE": | |
| case "DIV": | |
| t.push(""), r++ | |
| } | |
| } | |
| n = n.nextSibling | |
| } | |
| } | |
| return t.join("\n") | |
| }, | |
| emojiMap: T, | |
| skinToneEmojis: $, | |
| skinToneVariations: v | |
| }; | |
| e.exports = A | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(24), | |
| i = r(141), | |
| a = r(144), | |
| s = r(93), | |
| d = r(39), | |
| c = r(70), | |
| u = r(136), | |
| l = u.HotKeys, | |
| f = { | |
| X: { | |
| LEFT: "left", | |
| RIGHT: "right" | |
| }, | |
| Y: { | |
| TOP: "top", | |
| BOTTOM: "bottom" | |
| } | |
| }, | |
| h = { | |
| DROPDOWN: "dropdown", | |
| DROPDOWN_MENU: "dropdown_menu", | |
| MENU: "menu", | |
| PICKER: "picker", | |
| EMOJI_PICKER: "emoji_picker" | |
| }, | |
| p = n.createClass({ | |
| displayName: "Menu", | |
| mixins: [s], | |
| propTypes: { | |
| children: n.PropTypes.node.isRequired, | |
| origin: n.PropTypes.shape({ | |
| x: n.PropTypes.number, | |
| y: n.PropTypes.number | |
| }), | |
| type: n.PropTypes.oneOf(_.values(h)).isRequired, | |
| direction: n.PropTypes.shape({ | |
| x: n.PropTypes.oneOf(_.values(f.X)), | |
| y: n.PropTypes.oneOf(_.values(f.Y)) | |
| }).isRequired, | |
| flipOnRTL: n.PropTypes.bool, | |
| classes: n.PropTypes.string, | |
| onDefault: n.PropTypes.func | |
| }, | |
| statics: { | |
| Direction: f, | |
| Type: h | |
| }, | |
| getDefaultProps: function() { | |
| return { | |
| type: h.DROPDOWN, | |
| direction: { | |
| x: f.X.RIGHT, | |
| y: f.Y.BOTTOM | |
| } | |
| } | |
| }, | |
| getInitialState: function() { | |
| return { | |
| hasKeyboard: !_.contains([h.MENU, h.EMOJI_PICKER], this.props.type), | |
| showShortcuts: !1, | |
| keyboard: !1, | |
| selected: void 0 | |
| } | |
| }, | |
| componentDidMount: function() { | |
| this.state.hasKeyboard && c.focusNode(o.findDOMNode(this)) | |
| }, | |
| onMouseMove: function(e) { | |
| c.focusNode(o.findDOMNode(this)), this.setState({ | |
| keyboard: !1 | |
| }) | |
| }, | |
| getStyle: function() { | |
| var e = this.props, | |
| t = {}, | |
| r = e.direction.x, | |
| n = e.direction.y; | |
| this.props.flipOnRTL && l10n.isRTL() && (r = r === f.X.LEFT ? f.X.RIGHT : f.X.LEFT); | |
| var o = r === f.X.RIGHT ? f.X.LEFT : f.X.RIGHT, | |
| a = n === f.Y.TOP ? f.Y.BOTTOM : f.Y.TOP; | |
| return t[i.prefix("transformOrigin")] = a + " " + o, e.origin ? (r === f.X.RIGHT ? t.left = e.origin.x : t.right = window.innerWidth - e.origin.x, n === f.Y.BOTTOM ? t.top = e.origin.y : t.bottom = window.innerHeight - e.origin.y, _.merge(t, e.style)) : _.merge(t, e.style) | |
| }, | |
| onKeyDown: function(e) { | |
| e.metaKey && this.setState({ | |
| showShortcuts: !0 | |
| }) | |
| }, | |
| onKeyUp: function(e) { | |
| this.state.showShortcuts && !e.metaKey && this.setState({ | |
| showShortcuts: !1 | |
| }) | |
| }, | |
| up: function(e) { | |
| e.preventDefault(), e.stopPropagation(); | |
| var t = _.toArray(this.props.children), | |
| r = a.ring(_.indexOf(t, this.state.selected) - 1, t); | |
| c.focusNode(o.findDOMNode(this.refs.list).children[r]), this.setState({ | |
| keyboard: !0, | |
| selected: t[r] | |
| }) | |
| }, | |
| down: function(e) { | |
| e.preventDefault(), e.stopPropagation(); | |
| var t = _.toArray(this.props.children), | |
| r = a.ring(_.indexOf(t, this.state.selected) + 1, t); | |
| c.focusNode(o.findDOMNode(this.refs.list).children[r]), this.setState({ | |
| keyboard: !0, | |
| selected: t[r] | |
| }) | |
| }, | |
| close: function(e) { | |
| e.preventDefault(), c.pop() | |
| }, | |
| "default": function(e) { | |
| this.props.onDefault && (l.flashFocus = Date.now(), c.pop(c.MENU), this.props.onDefault(e)) | |
| }, | |
| render: function() { | |
| var e = this.props, | |
| t = d(e.classes, { | |
| dropdown: e.type === h.DROPDOWN, | |
| "dropdown dropdown-right": e.type === h.DROPDOWN_MENU, | |
| "menu menu-icons": e.type === h.MENU, | |
| "dropdown-picker k context-menu": e.type === h.PICKER, | |
| "dropdown dropdown-emoji": e.type === h.EMOJI_PICKER, | |
| inverse: (e.type === h.PICKER || e.type === h.EMOJI_PICKER) && e.direction.x === f.X.LEFT, | |
| "inverse-vertical": e.type === h.EMOJI_PICKER && e.direction.y === f.Y.TOP, | |
| "shortcut-active": this.state.showShortcuts | |
| }), | |
| r = this.state.hasKeyboard ? n.createElement("ul", { | |
| ref: "list" | |
| }, e.children) : e.children, | |
| o = _.contains([h.PICKER, h.EMOJI_PICKER], e.type) ? n.createElement("div", { | |
| className: "nib" | |
| }) : null; | |
| if (this.state.hasKeyboard) { | |
| var i = { | |
| up: this.up, | |
| down: this.down, | |
| enter: this["default"] | |
| }; | |
| return i[l10n.LR("left", "right")] = this.close, i[l10n.LR("right", "left")] = this["default"], n.createElement(l, { | |
| handlers: i, | |
| className: t, | |
| style: this.getStyle(), | |
| onMouseMove: this.state.keyboard ? this.onMouseMove : null | |
| }, r, o) | |
| } | |
| return n.createElement("div", { | |
| className: t, | |
| style: this.getStyle() | |
| }, r, o) | |
| } | |
| }); | |
| e.exports = p | |
| }, , function(e, t) { | |
| "use strict"; | |
| var r = [].slice, | |
| n = {}, | |
| o = ["first", "last", "partition", "contains", "toArray", "invoke", "pluck", "filter", "any"]; | |
| _.each(o, function(e) { | |
| if (!_[e]) throw new Error("attempt to reference non-existant _ method: " + e); | |
| n[e] = function() { | |
| var t = r.call(arguments); | |
| return t.unshift(this.models), _[e].apply(_, t) | |
| } | |
| }); | |
| var i = ["groupBy", "countBy", "sortBy", "indexBy"]; | |
| _.each(i, function(e) { | |
| if (!_[e]) throw new Error("attempt to reference non-existant _ method: " + e); | |
| n[e] = function(t, r) { | |
| var n = _.isFunction(t) ? t : function(e) { | |
| return e.get ? e.get(t) : e[t] | |
| }; | |
| return _[e](this.models, n, r) | |
| } | |
| }), n.where = function(e, t) { | |
| return _.isEmpty(e) ? t ? void 0 : [] : this[t ? "find" : "filter"](function(t) { | |
| var r; | |
| for (var n in e) | |
| if (r = t.get ? t.get(n) : t[n], e[n] !== r) return !1; | |
| return !0 | |
| }) | |
| }, n.findWhere = function(e) { | |
| return this.where(e, !0) | |
| }, e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(52), | |
| o = n.extend({ | |
| Collection: "Status", | |
| props: { | |
| id: "string", | |
| status: "string" | |
| }, | |
| session: { | |
| stale: ["boolean", !1, !0] | |
| } | |
| }); | |
| e.exports = o | |
| }, function(e, t) { | |
| "use strict"; | |
| e.exports = _.memoize(function(e) { | |
| return CryptoJS.MD5(e).toString(CryptoJS.enc.Base64) | |
| }) | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(6), | |
| i = r(1), | |
| a = r(30), | |
| s = r(52), | |
| d = r(71), | |
| c = r(18), | |
| u = r(51), | |
| l = r(19), | |
| f = r(8), | |
| h = r(73).ActionToast, | |
| p = r(73).ActionType, | |
| m = s.extend({ | |
| Collection: "ProfilePicThumb", | |
| props: { | |
| id: "string", | |
| tag: "string", | |
| raw: "string" | |
| }, | |
| session: { | |
| stale: ["boolean", !1, !0] | |
| }, | |
| derived: { | |
| img: { | |
| deps: ["tag", "raw", "stale"], | |
| fn: function() { | |
| if (this.raw) return "data:image/jpeg;base64," + this.raw; | |
| if (!this.tag && this.stale) return null; | |
| if (this.tag) return u.build(o.PP_URL, { | |
| t: "s", | |
| u: this.id, | |
| i: this.tag | |
| }) | |
| } | |
| }, | |
| imgFull: { | |
| deps: ["tag", "raw", "stale"], | |
| fn: function() { | |
| if ((this.raw || !this.tag) && this.stale) return null; | |
| if (!this.raw && this.tag) return u.build(o.PP_URL, { | |
| t: "l", | |
| u: this.id, | |
| i: this.tag | |
| }) | |
| } | |
| } | |
| }, | |
| canSet: function() { | |
| return l.isGroup(this.id) && d.supportsFeature(d.F.GROUP_SET_PIC) ? !0 : !(!l.isUser(this.id) || this.id !== Store.Conn.me || !d.supportsFeature(d.F.SET_PROFILE_PIC)) | |
| }, | |
| setPicture: function(e, t, r) { | |
| var o = this; | |
| if (!this.canSet()) return Promise.reject(new c.ActionError); | |
| var s = a.sendSetPicture(this.id, e, t), | |
| d = new p(this.id === Store.Conn.me ? l10n.t("action_profile_setting") : l10n.t("action_group_icon_setting")); | |
| r = r || h.genId(); | |
| var u = s["catch"](function(e) { | |
| throw i.error("models:ProfilePicThumb:setPicture dropped")(e), new p(o.id === Store.Conn.me ? l10n.t("action_profile_set_failed") : l10n.t("action_group_icon_set_failed")) | |
| }).then(function(n) { | |
| if (200 === n.status) return new p(o.id === Store.Conn.me ? l10n.t("action_profile_set") : l10n.t("action_group_icon_set")); | |
| if (n.status >= 400) { | |
| var i = o.id === Store.Conn.me ? l10n.t("action_profile_set_failed") : l10n.t("action_group_icon_set_failed"); | |
| return new p(i, l10n.t("action_try_again"), o.setPicture.bind(o, e, t, r)) | |
| } | |
| }); | |
| return f.openToast(n.createElement(h, { | |
| id: r, | |
| initialAction: d, | |
| pendingAction: u | |
| })), s.bind(this).then(function(e) { | |
| 200 !== e.status || e._duplicate || (this.tag = e.tag) | |
| }) | |
| }, | |
| canDelete: function() { | |
| return l.isGroup(this.id) && d.supportsFeature(d.F.GROUP_SET_PIC) && this.tag ? !0 : !!(l.isUser(this.id) && this.id === Store.Conn.me && d.supportsFeature(d.F.SET_PROFILE_PIC) && this.tag) | |
| }, | |
| deletePicture: function(e) { | |
| var t = this; | |
| if (!this.canDelete()) return Promise.reject(new c.ActionError); | |
| var r = a.deletePicture(this.id), | |
| o = new p(this.id === Store.Conn.me ? l10n.t("action_profile_removing") : l10n.t("action_group_icon_removing")); | |
| e = e || h.genId(); | |
| var s = r["catch"](function(e) { | |
| throw i.error("models:ProfilePicThumb:deletePicture dropped")(e), new p(t.id === Store.Conn.me ? l10n.t("action_profile_remove_failed") : l10n.t("action_group_icon_remove_failed")) | |
| }).then(function(r) { | |
| if (200 === r.status) return new p(t.id === Store.Conn.me ? l10n.t("action_profile_removed") : l10n.t("action_group_icon_removed")); | |
| if (r.status >= 400) { | |
| var n = t.id === Store.Conn.me ? l10n.t("action_profile_remove_failed") : l10n.t("action_group_icon_remove_failed"); | |
| return new p(n, l10n.t("action_try_again"), t.deletePicture.bind(t, e)) | |
| } | |
| }); | |
| return f.openToast(n.createElement(h, { | |
| id: e, | |
| initialAction: o, | |
| pendingAction: s | |
| })), r.bind(this).then(function(e) { | |
| 200 !== e.status || e._duplicate || (this.tag = void 0) | |
| }) | |
| } | |
| }); | |
| e.exports = m | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| return "string" == typeof e ? e : CryptoJS.lib.WordArray.create(new Uint8Array(e)) | |
| } | |
| function o(e, t) { | |
| return d.decode(e.toString(CryptoJS.enc.Base64), !!t) | |
| } | |
| function i(e) { | |
| var t = arguments.length <= 1 || void 0 === arguments[1] ? new Uint8Array(c) : arguments[1], | |
| r = arguments[2]; | |
| return o(CryptoJS.HmacSHA256(n(e), n(t)), r) | |
| } | |
| function a(e, t, r, i) { | |
| if (0 > r || r > 255 * c) return null; | |
| var a = n(e), | |
| s = n(t), | |
| d = Math.ceil(r / c), | |
| u = new Array(d + 1); | |
| u[0] = ""; | |
| for (var l = new Uint8Array(1), f = 0; d > f; f++) { | |
| l[0] = f + 1; | |
| var h = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, a); | |
| h.update(u[f]), h.update(s), h.update(n(l)), u[f + 1] = h.finalize() | |
| } | |
| for (var p = new Uint8Array(r), m = 0, g = 0; d > m; m++) | |
| for (var _ = o(u[m + 1]), v = 0; c > v && r > g; v++, g++) p[g] = _[v]; | |
| return i ? Array.prototype.slice.call(p) : p | |
| } | |
| function s(e, t, r, n, o) { | |
| return a(i(e, t), r, n, o) | |
| } | |
| var d = r(146), | |
| c = 32; | |
| e.exports = { | |
| extract: i, | |
| expand: a, | |
| extractAndExpand: s | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e, t) { | |
| if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") | |
| } | |
| function o(e, t) { | |
| if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); | |
| return !t || "object" != typeof t && "function" != typeof t ? e : t | |
| } | |
| function i(e, t) { | |
| if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); | |
| e.prototype = Object.create(t && t.prototype, { | |
| constructor: { | |
| value: e, | |
| enumerable: !1, | |
| writable: !0, | |
| configurable: !0 | |
| } | |
| }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) | |
| } | |
| var a = function() { | |
| function e(e, t) { | |
| for (var r = 0; r < t.length; r++) { | |
| var n = t[r]; | |
| n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) | |
| } | |
| } | |
| return function(t, r, n) { | |
| return r && e(t.prototype, r), n && e(t, n), t | |
| } | |
| }(), | |
| s = function g(e, t, r) { | |
| null === e && (e = Function.prototype); | |
| var n = Object.getOwnPropertyDescriptor(e, t); | |
| if (void 0 === n) { | |
| var o = Object.getPrototypeOf(e); | |
| return null === o ? void 0 : g(o, t, r) | |
| } | |
| if ("value" in n) return n.value; | |
| var i = n.get; | |
| if (void 0 !== i) return i.call(r) | |
| }, | |
| d = r(1), | |
| c = r(147), | |
| u = r(6), | |
| l = r(329), | |
| f = r(378), | |
| h = r(51), | |
| p = r(8), | |
| m = function(e) { | |
| function t() { | |
| var e; | |
| n(this, t); | |
| for (var r = arguments.length, i = Array(r), a = 0; r > a; a++) i[a] = arguments[a]; | |
| return o(this, (e = Object.getPrototypeOf(t)).call.apply(e, [this].concat(i))) | |
| } | |
| return i(t, e), a(t, [{ | |
| key: "setTitleAndIcon", | |
| value: function(e) { | |
| switch (e) { | |
| case -1: | |
| case 0: | |
| document.title = l10n.t("whatsapp_web"); | |
| break; | |
| default: | |
| document.title = "(" + l10n.n(e) + ") " + l10n.t("whatsapp_web") | |
| } | |
| this.setIcon(e) | |
| } | |
| }, { | |
| key: "setIcon", | |
| value: function(e) { | |
| var t; | |
| t = -1 === e ? "favicon-error2" : 0 === e ? "favicon" : 10 > e ? "f0" + e : 100 > e ? "f" + e : "f00"; | |
| var r = "/img/favicon/1x/" + t + ".png", | |
| n = "/img/favicon/2x/" + t + ".png", | |
| o = { | |
| low: { | |
| "default": r | |
| }, | |
| high: { | |
| "default": n | |
| }, | |
| onSet: function(e) { | |
| var t = document.getElementById("favicon"); | |
| t || (t = document.createElement("link"), t.id = "favicon", t.rel = "shortcut icon", document.head.appendChild(t)), t.href = e, t.type = "image/png" | |
| } | |
| }; | |
| c.loadAsset(o, t).then(function() { | |
| d.log("Favicon updated: " + t)() | |
| }) | |
| } | |
| }, { | |
| key: "showNotification", | |
| value: function(e, r, n, o, i, a) { | |
| var c, f = this; | |
| try { | |
| c = new window.Notification(l.normalizeEmoji(n), { | |
| body: l.normalizeEmoji(o), | |
| tag: a ? r : e, | |
| icon: h.relToAbs(i), | |
| dir: "auto", | |
| lang: l10n.lng(), | |
| silent: !0 | |
| }) | |
| } catch (m) { | |
| window.Notification = void 0 | |
| } | |
| if (!c) return void d.log("notificationManager:showDesktopNotification: could not create Notification")(); | |
| s(Object.getPrototypeOf(t.prototype), "showNotification", this).call(this, e, r, c); | |
| var g = function v() { | |
| window.removeEventListener("unload", v), f.closeNotification(r) | |
| }; | |
| c.onclick = function() { | |
| window.focus(), Store.Chat.find(e).then(function(e) { | |
| p.openChat(e, void 0, !0) | |
| }), g() | |
| }, c.onclose = g, c.onshow = function() { | |
| _.delay(g, a ? u.CALL_NOTIFICATION_TIMEOUT : u.NOTIFICATION_TIMEOUT) | |
| }, _.delay(g, a ? u.CALL_NOTIFICATION_TIMEOUT : 5 * u.NOTIFICATION_TIMEOUT), window.addEventListener("unload", g) | |
| } | |
| }]), t | |
| }(f); | |
| e.exports = new m | |
| }, , function(e, t, r) { | |
| var n, o; | |
| (function(e) { | |
| /** | |
| * @license Long.js (c) 2013 Daniel Wirtz <[email protected]> | |
| * Released under the Apache License, Version 2.0 | |
| * Derived from goog.math.Long from the Closure Library | |
| * see: https://github.com/dcodeIO/Long.js for details | |
| */ | |
| ! function(i) { | |
| "use strict"; | |
| var a = function(e, t, r) { | |
| e && "object" == typeof e && (t = e.high, r = e.unsigned, e = e.low), this.low = 0 | e, this.high = 0 | t, this.unsigned = !!r | |
| }, | |
| s = {}, | |
| d = {}; | |
| a.fromInt = function(e, t) { | |
| var r, n; | |
| return t ? (e >>>= 0, e >= 0 && 256 > e && (n = d[e]) ? n : (r = new a(e, 0 > (0 | e) ? -1 : 0, !0), e >= 0 && 256 > e && (d[e] = r), r)) : (e = 0 | e, e >= -128 && 128 > e && (n = s[e]) ? n : (r = new a(e, 0 > e ? -1 : 0, !1), e >= -128 && 128 > e && (s[e] = r), r)) | |
| }, a.fromNumber = function(e, t) { | |
| return t = !!t, isNaN(e) || !isFinite(e) ? a.ZERO : !t && -f >= e ? a.MIN_SIGNED_VALUE : t && 0 >= e ? a.MIN_UNSIGNED_VALUE : !t && e + 1 >= f ? a.MAX_SIGNED_VALUE : t && e >= l ? a.MAX_UNSIGNED_VALUE : 0 > e ? a.fromNumber(-e, !1).negate() : new a(e % u | 0, e / u | 0, t) | |
| }, a.fromBits = function(e, t, r) { | |
| return new a(e, t, r) | |
| }, a.from28Bits = function(e, t, r, n) { | |
| return a.fromBits(e | t << 28, t >>> 4 | r << 24, n) | |
| }, a.fromString = function(e, t, r) { | |
| if (0 == e.length) throw new Error("number format error: empty string"); | |
| if ("NaN" === e || "Infinity" === e || "+Infinity" === e || "-Infinity" === e) return a.ZERO; | |
| if ("number" == typeof t && (r = t, t = !1), r = r || 10, 2 > r || r > 36) throw new Error("radix out of range: " + r); | |
| if ("-" == e.charAt(0)) return a.fromString(e.substring(1), t, r).negate(); | |
| if (e.indexOf("-") >= 0) throw new Error('number format error: interior "-" character: ' + e); | |
| for (var n = a.fromNumber(Math.pow(r, 8)), o = a.ZERO, i = 0; i < e.length; i += 8) { | |
| var s = Math.min(8, e.length - i), | |
| d = parseInt(e.substring(i, i + s), r); | |
| if (8 > s) { | |
| var c = a.fromNumber(Math.pow(r, s)); | |
| o = o.multiply(c).add(a.fromNumber(d)) | |
| } else o = o.multiply(n), o = o.add(a.fromNumber(d)) | |
| } | |
| return o.unsigned = t, o | |
| }; | |
| var c = 65536, | |
| u = c * c, | |
| l = u * u, | |
| f = l / 2, | |
| h = a.fromInt(1 << 24); | |
| a.ZERO = a.fromInt(0), a.UZERO = a.fromInt(0, !0), a.ONE = a.fromInt(1), a.UONE = a.fromInt(1, !0), a.NEG_ONE = a.fromInt(-1), a.MAX_SIGNED_VALUE = a.fromBits(-1, 2147483647, !1), a.MAX_UNSIGNED_VALUE = a.fromBits(-1, -1, !0), a.MAX_VALUE = a.MAX_SIGNED_VALUE, a.MIN_SIGNED_VALUE = a.fromBits(0, -2147483648, !1), a.MIN_UNSIGNED_VALUE = a.fromBits(0, 0, !0), a.MIN_VALUE = a.MIN_SIGNED_VALUE, a.prototype.toInt = function() { | |
| return this.unsigned ? this.low >>> 0 : this.low | |
| }, a.prototype.toNumber = function() { | |
| return this.unsigned ? (this.high >>> 0) * u + (this.low >>> 0) : this.high * u + (this.low >>> 0) | |
| }, a.prototype.toString = function(e) { | |
| if (e = e || 10, 2 > e || e > 36) throw new Error("radix out of range: " + e); | |
| if (this.isZero()) return "0"; | |
| var t; | |
| if (this.isNegative()) { | |
| if (this.equals(a.MIN_SIGNED_VALUE)) { | |
| var r = a.fromNumber(e), | |
| n = this.div(r); | |
| return t = n.multiply(r).subtract(this), n.toString(e) + t.toInt().toString(e) | |
| } | |
| return "-" + this.negate().toString(e) | |
| } | |
| var o = a.fromNumber(Math.pow(e, 6)); | |
| t = this; | |
| for (var i = "";;) { | |
| var s = t.div(o), | |
| d = t.subtract(s.multiply(o)).toInt(), | |
| c = d.toString(e); | |
| if (t = s, t.isZero()) return c + i; | |
| for (; c.length < 6;) c = "0" + c; | |
| i = "" + c + i | |
| } | |
| }, a.prototype.getHighBits = function() { | |
| return this.high | |
| }, a.prototype.getHighBitsUnsigned = function() { | |
| return this.high >>> 0 | |
| }, a.prototype.getLowBits = function() { | |
| return this.low | |
| }, a.prototype.getLowBitsUnsigned = function() { | |
| return this.low >>> 0 | |
| }, a.prototype.getNumBitsAbs = function() { | |
| if (this.isNegative()) return this.equals(a.MIN_SIGNED_VALUE) ? 64 : this.negate().getNumBitsAbs(); | |
| for (var e = 0 != this.high ? this.high : this.low, t = 31; t > 0 && 0 == (e & 1 << t); t--); | |
| return 0 != this.high ? t + 33 : t + 1 | |
| }, a.prototype.isZero = function() { | |
| return 0 == this.high && 0 == this.low | |
| }, a.prototype.isNegative = function() { | |
| return !this.unsigned && this.high < 0 | |
| }, a.prototype.isOdd = function() { | |
| return 1 == (1 & this.low) | |
| }, a.prototype.isEven = function() { | |
| return 0 == (1 & this.low) | |
| }, a.prototype.equals = function(e) { | |
| return this.unsigned != e.unsigned && this.high >>> 31 != e.high >>> 31 ? !1 : this.high == e.high && this.low == e.low | |
| }, a.prototype.notEquals = function(e) { | |
| return !this.equals(e) | |
| }, a.prototype.lessThan = function(e) { | |
| return this.compare(e) < 0 | |
| }, a.prototype.lessThanOrEqual = function(e) { | |
| return this.compare(e) <= 0 | |
| }, a.prototype.greaterThan = function(e) { | |
| return this.compare(e) > 0 | |
| }, a.prototype.greaterThanOrEqual = function(e) { | |
| return this.compare(e) >= 0 | |
| }, a.prototype.compare = function(e) { | |
| if (this.equals(e)) return 0; | |
| var t = this.isNegative(), | |
| r = e.isNegative(); | |
| return t && !r ? -1 : !t && r ? 1 : this.unsigned ? e.high >>> 0 > this.high >>> 0 || e.high == this.high && e.low >>> 0 > this.low >>> 0 ? -1 : 1 : this.subtract(e).isNegative() ? -1 : 1 | |
| }, a.prototype.negate = function() { | |
| return !this.unsigned && this.equals(a.MIN_SIGNED_VALUE) ? a.MIN_SIGNED_VALUE : this.not().add(a.ONE) | |
| }, a.prototype.add = function(e) { | |
| var t = this.high >>> 16, | |
| r = 65535 & this.high, | |
| n = this.low >>> 16, | |
| o = 65535 & this.low, | |
| i = e.high >>> 16, | |
| s = 65535 & e.high, | |
| d = e.low >>> 16, | |
| c = 65535 & e.low, | |
| u = 0, | |
| l = 0, | |
| f = 0, | |
| h = 0; | |
| return h += o + c, f += h >>> 16, h &= 65535, f += n + d, l += f >>> 16, f &= 65535, l += r + s, u += l >>> 16, l &= 65535, u += t + i, u &= 65535, a.fromBits(f << 16 | h, u << 16 | l, this.unsigned) | |
| }, a.prototype.subtract = function(e) { | |
| return this.add(e.negate()) | |
| }, a.prototype.multiply = function(e) { | |
| if (this.isZero()) return a.ZERO; | |
| if (e.isZero()) return a.ZERO; | |
| if (this.equals(a.MIN_VALUE)) return e.isOdd() ? a.MIN_VALUE : a.ZERO; | |
| if (e.equals(a.MIN_VALUE)) return this.isOdd() ? a.MIN_VALUE : a.ZERO; | |
| if (this.isNegative()) return e.isNegative() ? this.negate().multiply(e.negate()) : this.negate().multiply(e).negate(); | |
| if (e.isNegative()) return this.multiply(e.negate()).negate(); | |
| if (this.lessThan(h) && e.lessThan(h)) return a.fromNumber(this.toNumber() * e.toNumber(), this.unsigned); | |
| var t = this.high >>> 16, | |
| r = 65535 & this.high, | |
| n = this.low >>> 16, | |
| o = 65535 & this.low, | |
| i = e.high >>> 16, | |
| s = 65535 & e.high, | |
| d = e.low >>> 16, | |
| c = 65535 & e.low, | |
| u = 0, | |
| l = 0, | |
| f = 0, | |
| p = 0; | |
| return p += o * c, f += p >>> 16, p &= 65535, f += n * c, l += f >>> 16, f &= 65535, f += o * d, l += f >>> 16, f &= 65535, l += r * c, u += l >>> 16, l &= 65535, l += n * d, u += l >>> 16, l &= 65535, l += o * s, u += l >>> 16, l &= 65535, u += t * c + r * d + n * s + o * i, u &= 65535, a.fromBits(f << 16 | p, u << 16 | l, this.unsigned) | |
| }, a.prototype.div = function(e) { | |
| if (e.isZero()) throw new Error("division by zero"); | |
| if (this.isZero()) return this.unsigned ? a.UZERO : a.ZERO; | |
| var t, r, n; | |
| if (this.equals(a.MIN_SIGNED_VALUE)) { | |
| if (e.equals(a.ONE) || e.equals(a.NEG_ONE)) return a.MIN_SIGNED_VALUE; | |
| if (e.equals(a.MIN_SIGNED_VALUE)) return a.ONE; | |
| var o = this.shiftRight(1); | |
| return t = o.div(e).shiftLeft(1), t.equals(a.ZERO) ? e.isNegative() ? a.ONE : a.NEG_ONE : (r = this.subtract(e.multiply(t)), n = t.add(r.div(e))) | |
| } | |
| if (e.equals(a.MIN_SIGNED_VALUE)) return this.unsigned ? a.UZERO : a.ZERO; | |
| if (this.isNegative()) return e.isNegative() ? this.negate().div(e.negate()) : this.negate().div(e).negate(); | |
| if (e.isNegative()) return this.div(e.negate()).negate(); | |
| for (n = a.ZERO, r = this; r.greaterThanOrEqual(e);) { | |
| t = Math.max(1, Math.floor(r.toNumber() / e.toNumber())); | |
| for (var i = Math.ceil(Math.log(t) / Math.LN2), s = 48 >= i ? 1 : Math.pow(2, i - 48), d = a.fromNumber(t, this.unsigned), c = d.multiply(e); c.isNegative() || c.greaterThan(r);) t -= s, d = a.fromNumber(t, this.unsigned), c = d.multiply(e); | |
| d.isZero() && (d = a.ONE), n = n.add(d), r = r.subtract(c) | |
| } | |
| return n | |
| }, a.prototype.modulo = function(e) { | |
| return this.subtract(this.div(e).multiply(e)) | |
| }, a.prototype.not = function() { | |
| return a.fromBits(~this.low, ~this.high, this.unsigned) | |
| }, a.prototype.and = function(e) { | |
| return a.fromBits(this.low & e.low, this.high & e.high, this.unsigned) | |
| }, a.prototype.or = function(e) { | |
| return a.fromBits(this.low | e.low, this.high | e.high, this.unsigned) | |
| }, a.prototype.xor = function(e) { | |
| return a.fromBits(this.low ^ e.low, this.high ^ e.high, this.unsigned) | |
| }, a.prototype.shiftLeft = function(e) { | |
| if (e &= 63, 0 == e) return this; | |
| var t = this.low; | |
| if (32 > e) { | |
| var r = this.high; | |
| return a.fromBits(t << e, r << e | t >>> 32 - e, this.unsigned) | |
| } | |
| return a.fromBits(0, t << e - 32, this.unsigned) | |
| }, a.prototype.shiftRight = function(e) { | |
| if (e &= 63, 0 == e) return this; | |
| var t = this.high; | |
| if (32 > e) { | |
| var r = this.low; | |
| return a.fromBits(r >>> e | t << 32 - e, t >> e, this.unsigned) | |
| } | |
| return a.fromBits(t >> e - 32, t >= 0 ? 0 : -1, this.unsigned) | |
| }, a.prototype.shiftRightUnsigned = function(e) { | |
| if (e &= 63, 0 == e) return this; | |
| var t = this.high; | |
| if (32 > e) { | |
| var r = this.low; | |
| return a.fromBits(r >>> e | t << 32 - e, t >>> e, this.unsigned) | |
| } | |
| return 32 == e ? a.fromBits(t, 0, this.unsigned) : a.fromBits(t >>> e - 32, 0, this.unsigned) | |
| }, a.prototype.toSigned = function() { | |
| var e = this.clone(); | |
| return e.unsigned = !1, e | |
| }, a.prototype.toUnsigned = function() { | |
| var e = this.clone(); | |
| return e.unsigned = !0, e | |
| }, a.prototype.clone = function() { | |
| return new a(this.low, this.high, this.unsigned) | |
| }, "undefined" != typeof e && e.exports ? e.exports = a : r(590).amd ? (n = [], o = function() { | |
| return a | |
| }.apply(t, n), !(void 0 !== o && (e.exports = o))) : (i.dcodeIO || (i.dcodeIO = {}), i.dcodeIO.Long = a) | |
| }(this) | |
| }).call(t, r(50)(e)) | |
| }, function(e, t, r) { | |
| function n(e) { | |
| return r(o(e)) | |
| } | |
| function o(e) { | |
| var t = i[e]; | |
| if (!(t + 1)) throw new Error("Cannot find module '" + e + "'."); | |
| return t | |
| } | |
| var i = { | |
| "./af/translation.json": 593, | |
| "./ak/translation.json": 594, | |
| "./ar/translation.json": 595, | |
| "./az/translation.json": 596, | |
| "./be/translation.json": 597, | |
| "./bg/translation.json": 598, | |
| "./bn/translation.json": 599, | |
| "./bs/translation.json": 600, | |
| "./ca/translation.json": 601, | |
| "./cs/translation.json": 602, | |
| "./da/translation.json": 603, | |
| "./de/translation.json": 604, | |
| "./el/translation.json": 605, | |
| "./en/translation.json": 606, | |
| "./es/translation.json": 607, | |
| "./et/translation.json": 608, | |
| "./eu/translation.json": 609, | |
| "./fa/translation.json": 610, | |
| "./fi/translation.json": 611, | |
| "./fil/translation.json": 612, | |
| "./fr/translation.json": 613, | |
| "./gl/translation.json": 614, | |
| "./gu/translation.json": 615, | |
| "./ha/translation.json": 616, | |
| "./he/translation.json": 617, | |
| "./hi/translation.json": 618, | |
| "./hr/translation.json": 619, | |
| "./hu/translation.json": 620, | |
| "./id/translation.json": 621, | |
| "./is/translation.json": 622, | |
| "./it/translation.json": 623, | |
| "./ja/translation.json": 624, | |
| "./ka/translation.json": 625, | |
| "./kk/translation.json": 626, | |
| "./km/translation.json": 627, | |
| "./kn/translation.json": 628, | |
| "./ko/translation.json": 629, | |
| "./ky/translation.json": 630, | |
| "./lo/translation.json": 631, | |
| "./lt/translation.json": 632, | |
| "./lv/translation.json": 633, | |
| "./mk/translation.json": 634, | |
| "./ml/translation.json": 635, | |
| "./mr/translation.json": 636, | |
| "./ms/translation.json": 637, | |
| "./my/translation.json": 638, | |
| "./nb/translation.json": 639, | |
| "./ne/translation.json": 640, | |
| "./nl/translation.json": 641, | |
| "./nn/translation.json": 642, | |
| "./pa/translation.json": 643, | |
| "./pl/translation.json": 644, | |
| "./ps/translation.json": 645, | |
| "./pt-BR/translation.json": 646, | |
| "./pt-ZZ/translation.json": 647, | |
| "./pt/translation.json": 648, | |
| "./ro/translation.json": 649, | |
| "./ru/translation.json": 650, | |
| "./si/translation.json": 651, | |
| "./sk/translation.json": 652, | |
| "./sl/translation.json": 653, | |
| "./sq/translation.json": 654, | |
| "./sr/translation.json": 655, | |
| "./sv/translation.json": 656, | |
| "./sw/translation.json": 657, | |
| "./ta/translation.json": 658, | |
| "./te/translation.json": 659, | |
| "./th/translation.json": 660, | |
| "./tr/translation.json": 661, | |
| "./uk/translation.json": 662, | |
| "./ur/translation.json": 663, | |
| "./uz/translation.json": 664, | |
| "./vi/translation.json": 665, | |
| "./zh-CN/translation.json": 666, | |
| "./zh-TW/translation.json": 667, | |
| "./zu/translation.json": 668 | |
| }; | |
| n.keys = function() { | |
| return Object.keys(i) | |
| }, n.resolve = o, e.exports = n, n.id = 340 | |
| }, , , function(e, t, r) { | |
| "use strict"; | |
| var n = r(1), | |
| o = r(45), | |
| i = r(7), | |
| a = { | |
| getKeys: function() { | |
| var e = o.get().encKey.toString(CryptoJS.enc.Base64), | |
| t = o.get().macKey.toString(CryptoJS.enc.Base64); | |
| return { | |
| enc: CryptoJS.enc.Base64.parse(e), | |
| mac: CryptoJS.enc.Base64.parse(t) | |
| } | |
| }, | |
| encrypt: function(e) { | |
| var t = CryptoJS.lib.WordArray.create(e), | |
| r = new Uint32Array(4), | |
| n = this.getKeys(); | |
| window.crypto.getRandomValues(r); | |
| var o = CryptoJS.AES.encrypt(t, n.enc, { | |
| iv: CryptoJS.lib.WordArray.create(r), | |
| mode: CryptoJS.mode.CBC, | |
| padding: CryptoJS.pad.Pkcs7 | |
| }), | |
| a = o.iv.concat(o.ciphertext), | |
| s = CryptoJS.HmacSHA256(a, n.mac), | |
| d = s.concat(a); | |
| return i.fromBase64(d.toString(CryptoJS.enc.Base64)).toBuffer() | |
| }, | |
| decrypt: function(e) { | |
| var t = i.wrap(e), | |
| r = t.slice(t.offset, t.offset + 32).toBase64(), | |
| o = t.slice(t.offset + 32).toBuffer(), | |
| a = this.getKeys(), | |
| s = CryptoJS.lib.WordArray.create(o), | |
| d = CryptoJS.HmacSHA256(s, a.mac).toString(CryptoJS.enc.Base64); | |
| if (r !== d) throw n.error("bp:01:decrypt hmac dont match " + r + " " + d)(), new Error("hmac mismatch"); | |
| var c = t.slice(t.offset + 32, t.offset + 48).toBuffer(), | |
| u = t.slice(t.offset + 48).toBuffer(), | |
| l = CryptoJS.AES.decrypt({ | |
| ciphertext: CryptoJS.lib.WordArray.create(u), | |
| salt: void 0 | |
| }, a.enc, { | |
| iv: CryptoJS.lib.WordArray.create(c), | |
| mode: CryptoJS.mode.CBC, | |
| padding: CryptoJS.pad.Pkcs7 | |
| }); | |
| return i.fromBase64(l.toString(CryptoJS.enc.Base64)).toBuffer() | |
| } | |
| }; | |
| e.exports = a | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| singleByte: [void 0, void 0, void 0, "200", "400", "404", "500", "501", "502", "action", "add", "after", "archive", "author", "available", "battery", "before", "body", "broadcast", "chat", "clear", "code", "composing", "contacts", "count", "create", "debug", "delete", "demote", "duplicate", "encoding", "error", "false", "filehash", "from", "g.us", "group", "groups_v2", "height", "id", "image", "in", "index", "invis", "item", "jid", "kind", "last", "leave", "live", "log", "media", "message", "mimetype", "missing", "modify", "name", "notification", "notify", "out", "owner", "participant", "paused", "picture", "played", "presence", "preview", "promote", "query", "raw", "read", "receipt", "received", "recipient", "recording", "relay", "remove", "response", "resume", "retry", "s.whatsapp.net", "seconds", "set", "size", "status", "subject", "subscribe", "t", "text", "to", "true", "type", "unarchive", "unavailable", "url", "user", "value", "web", "width", "mute", "read_only", "admin", "creator", "short", "update", "powersave"], | |
| doubleByte: [] | |
| }; | |
| e.exports = r | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| var t = !1, | |
| r = o.wrap(e, void 0, t); | |
| this.readByte = function() { | |
| return r.readUint8() | |
| }, this.readInt16 = function() { | |
| return r.readUint16() | |
| }, this.readInt20 = function() { | |
| var e = 15 & r.readUint8(), | |
| t = r.readUint8(), | |
| n = r.readUint8(); | |
| return (e << 16) + (t << 8) + n | |
| }, this.readString = function(e) { | |
| return r.readString(e, o.METRICS_BYTES) | |
| }, this.readBytes = function(e) { | |
| var t = r.copy(r.offset, r.offset + e); | |
| return r.offset += e, t | |
| }, this.debugInfo = function() { | |
| return "offset: " + r.offset + " byte: " + r.readUint8(r.offset) | |
| } | |
| } | |
| var o = r(7); | |
| e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e, t) { | |
| if (!e) return "undefined"; | |
| var r = o(e[1], t), | |
| n = i(e[2], t); | |
| return "<" + e[0] + r + (n ? ">\n" + n + "\n</" + e[0] + ">" : "/>") | |
| } | |
| function o(e, t) { | |
| if (e) { | |
| var r = ""; | |
| for (var n in e) { | |
| var o = "string" == typeof e[n] ? t ? "..." : '"' + e[n] + '"' : e[n]; | |
| r += " " + n + "=" + o | |
| } | |
| return r | |
| } | |
| return "" | |
| } | |
| function i(e, t) { | |
| return a.isByteBuffer(e) ? "<<bin:" + e.limit + ">>" : "string" == typeof e ? t ? "<<string:" + e.length + ">>" : e : _.isArray(e) ? e.map(_.partial(n, _, t)).join("\n") : void 0 | |
| } | |
| var a = r(7), | |
| s = { | |
| tag: function(e) { | |
| return e && e[0] | |
| }, | |
| attr: function(e, t) { | |
| return t && t[1] ? t[1][e] : void 0 | |
| }, | |
| attrs: function(e) { | |
| return e[1] | |
| }, | |
| child: function d(e, t) { | |
| var r = t[2]; | |
| if (_.isArray(r)) | |
| for (var n = r.length, o = 0; n > o; o++) { | |
| var d = r[o]; | |
| if (_.isArray(d) && d[0] === e) return d | |
| } | |
| }, | |
| children: function(e) { | |
| return e && e[2] | |
| }, | |
| dataStr: function(e) { | |
| if (!e) return ""; | |
| var t = e[2]; | |
| return "string" == typeof t ? t : a.isByteBuffer(t) ? t.readString(t.limit, a.METRICS_BYTES, 0).string : void 0 | |
| }, | |
| toString: n | |
| }; | |
| e.exports = s | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| function e(e) { | |
| r++, n.push(e) | |
| } | |
| var t = !1, | |
| r = 0, | |
| n = []; | |
| this.pushInt16 = function(t) { | |
| if ("number" != typeof t) throw new Error("invalid int16"); | |
| e((65280 & t) >> 8), e((255 & t) >> 0) | |
| }, this.pushInt20 = function(t) { | |
| if ("number" != typeof t) throw new Error("invalid int20"); | |
| e((983040 & t) >> 16), e((65280 & t) >> 8), e((255 & t) >> 0) | |
| }, this.pushByte = function(t) { | |
| if ("number" != typeof t || 0 > t || t > 255) throw new Error("invalid byte value: " + t); | |
| e(t) | |
| }, this.pushBytes = function(e) { | |
| if (!o.isByteBuffer(e)) throw new Error("invalid byte buffer"); | |
| r += e.limit, n.push(e) | |
| }, this.pushString = function(e) { | |
| if ("string" != typeof e) throw new Error("invalid string"); | |
| r += o.calculateUTF8Bytes(e), n.push(e) | |
| }, this.toBuffer = function() { | |
| for (var e = new o(r, t), i = n.length, a = 0; i > a; a++) { | |
| var s = n[a]; | |
| "string" == typeof s ? e.writeString(s) : o.isByteBuffer(s) ? (s.reset(), e.append(s)) : e.writeByte(s) | |
| } | |
| return e.reset(), e.toBuffer(!0) | |
| } | |
| } | |
| var o = r(7); | |
| e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| var t = e.singleByte, | |
| r = e.doubleByte; | |
| this.readNode = function(e) { | |
| var t = e.readByte(), | |
| r = this.readListSize(e, t); | |
| if (t = e.readByte(), t === o.STREAM_END) throw new Error("unexpected stream end " + e.debugInfo()); | |
| var n = this.readString(e, t); | |
| if (0 === r || !n) throw new Error("invalid node. 0 list or empty tag" + e.debugInfo()); | |
| var i = r - 2 + r % 2 >> 1, | |
| a = this.readAttributes(e, i); | |
| if (r % 2 === 1) return [n, a, void 0]; | |
| var s; | |
| if (t = e.readByte(), this.isListTag(t)) s = this.readList(e, t); | |
| else if (t === o.BINARY_8) { | |
| var d = e.readByte(); | |
| s = e.readBytes(d) | |
| } else if (t === o.BINARY_20) { | |
| var c = e.readInt20(); | |
| s = e.readBytes(c) | |
| } else s = this.readString(t); | |
| return [n, a, s] | |
| }, this.isListTag = function(e) { | |
| return e === o.LIST_EMPTY || e === o.LIST_8 || e === o.LIST_16 | |
| }, this.readListSize = function(e, t) { | |
| if (t === o.LIST_EMPTY) return 0; | |
| if (t === o.LIST_8) return e.readByte(); | |
| if (t === o.LIST_16) return e.readInt16(); | |
| throw new Error("invalid list size " + e.debugInfo()) | |
| }, this.readString = function(e, t) { | |
| if (-1 === t) throw new Error("invalid start token readString" + e.debugInfo()); | |
| if (t > 2 && 236 > t) { | |
| var r = this.getToken(t); | |
| return "s.whatsapp.net" === r && (r = "c.us"), r | |
| } | |
| switch (t) { | |
| case o.DICTIONARY_0: | |
| case o.DICTIONARY_1: | |
| case o.DICTIONARY_2: | |
| case o.DICTIONARY_3: | |
| var n = e.readByte(); | |
| return this.getTokenDouble(t - o.DICTIONARY_0, n); | |
| case o.LIST_EMPTY: | |
| return; | |
| case o.BINARY_8: | |
| var i = e.readByte(); | |
| return e.readString(i); | |
| case o.BINARY_20: | |
| var a = e.readInt20(); | |
| return e.readString(a); | |
| case o.JID_PAIR: | |
| var s = this.readString(e, e.readByte()), | |
| d = this.readString(e, e.readByte()); | |
| if ("undefined" != typeof s && "undefined" != typeof d) return s + "@" + d; | |
| if ("undefined" != typeof d) return d; | |
| throw new Error("invalid jid " + s + "," + d + " " + e.debugInfo()); | |
| default: | |
| throw new Error("invalid string " + e.debugInfo()) | |
| } | |
| }, this.getToken = function(e) { | |
| var r; | |
| if (e >= 0 && e < t.length && (r = t[e]), "undefined" == typeof r) throw new Error("invalid token " + e); | |
| return r | |
| }, this.getTokenDouble = function(e, t) { | |
| var n, o = 256 * e + t; | |
| if (o >= 0 && o < r.length && (n = r[o]), "undefined" == typeof n) throw new Error("invalid double byte token " + e + " " + t); | |
| return n | |
| }, this.readAttributes = function(e, t) { | |
| for (var r, n, o = t ? {} : void 0, i = 0; t > i; i++) r = this.readString(e, e.readByte()), n = this.readString(e, e.readByte()), o[r] = n; | |
| return o | |
| }, this.readList = function(e, t) { | |
| for (var r = [], n = this.readListSize(e, t), o = 0; n > o; o++) r.push(this.readNode(e)); | |
| return r | |
| } | |
| } | |
| var o = r(148); | |
| e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| var t, r = {}; | |
| for (t = 0; t < e.singleByte.length; t++) e.singleByte[t] && (r[e.singleByte[t]] = t); | |
| for (t = 0; t < e.doubleByte.length; t++) e.doubleByte[t] && (r[e.doubleByte[t]] = t + i.SINGLE_BYTE_MAX); | |
| this.writeNode = function(e, t) { | |
| if (t) { | |
| if (3 !== t.length) throw new Error("invalid node"); | |
| var r = t[1] ? 2 * Object.keys(t[1]).filter(function(e) { | |
| return !!t[1][e] | |
| }).length : 0; | |
| this.writeListStart(e, 1 + r + (t[2] ? 1 : 0)), this.writeString(e, t[0]), this.writeAttributes(e, t[1]), this.writeChildren(e, t[2]) | |
| } | |
| }, this.writeString = function(e, t) { | |
| if ("string" != typeof t) throw new Error("invalid string"); | |
| var n, o, a = r[t]; | |
| if ("undefined" == typeof a) { | |
| var s = t.indexOf("@"); | |
| if (1 > s) this.writeStringRaw(e, t); | |
| else { | |
| var d = t.substring(0, s), | |
| c = t.substring(s + 1); | |
| this.writeJid(e, d, c) | |
| } | |
| } else { | |
| if (a < i.SINGLE_BYTE_MAX) this.writeToken(e, a); | |
| else { | |
| var u = a - i.SINGLE_BYTE_MAX, | |
| l = u >> 8; | |
| switch (o = u % 256, l) { | |
| case 0: | |
| n = i.DICTIONARY_0; | |
| break; | |
| case 1: | |
| n = i.DICTIONARY_1; | |
| break; | |
| case 2: | |
| n = i.DICTIONARY_2; | |
| break; | |
| case 3: | |
| n = i.DICTIONARY_3; | |
| break; | |
| default: | |
| throw new Error("double byte dictionary token out of range: " + t + " " + a) | |
| } | |
| } | |
| this.writeToken(e, n), this.writeToken(e, o) | |
| } | |
| }, this.writeStringRaw = function(e, t) { | |
| var r = o.calculateUTF8Bytes(t); | |
| r >= 256 ? (e.pushByte(i.BINARY_20), e.pushInt20(r)) : (e.pushByte(i.BINARY_8), e.pushByte(r)), e.pushString(t) | |
| }, this.writeJid = function(e, t, r) { | |
| e.pushByte(i.JID_PAIR), t ? this.writeString(e, t) : this.writeToken(e, i.LIST_EMPTY), "c.us" === r && (r = "s.whatsapp.net"), this.writeString(e, r) | |
| }, this.writeToken = function(e, t) { | |
| if (245 > t) e.pushByte(t); | |
| else if (500 >= t) throw new Error("invalid token") | |
| }, this.writeAttributes = function(e, t) { | |
| if (t) | |
| for (var r in t) t[r] && (this.writeString(e, r), this.writeString(e, t[r])) | |
| }, this.writeChildren = function(e, t) { | |
| var r; | |
| if (t) | |
| if ("string" == typeof t) this.writeString(e, t); | |
| else if (o.isByteBuffer(t)) r = t.limit, r >= 256 ? (e.pushByte(i.BINARY_20), e.pushInt20(r)) : (e.pushByte(i.BINARY_8), e.pushByte(r)), e.pushBytes(t); | |
| else { | |
| if (!_.isArray(t)) throw new Error("invalid children"); | |
| r = t.length, this.writeListStart(e, r); | |
| for (var n = 0; r > n; n++) this.writeNode(e, t[n]) | |
| } | |
| }, this.writeListStart = function(e, t) { | |
| 0 === t ? e.pushByte(i.LIST_EMPTY) : 256 > t ? (e.pushByte(i.LIST_8), e.pushByte(t)) : (e.pushByte(i.LIST_16), e.pushInt16(t)) | |
| } | |
| } | |
| var o = r(7), | |
| i = r(148); | |
| e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(1), | |
| o = r(45), | |
| i = r(7), | |
| a = { | |
| getKeys: function() { | |
| var e = o.get().encKey.toString(CryptoJS.enc.Base64), | |
| t = o.get().macKey.toString(CryptoJS.enc.Base64); | |
| return { | |
| enc: CryptoJS.enc.Base64.parse(e), | |
| mac: CryptoJS.enc.Base64.parse(t) | |
| } | |
| }, | |
| encrypt: function(e) { | |
| var t = CryptoJS.lib.WordArray.create(e), | |
| r = new Uint32Array(4), | |
| n = this.getKeys(); | |
| window.crypto.getRandomValues(r); | |
| var o = CryptoJS.AES.encrypt(t, n.enc, { | |
| iv: CryptoJS.lib.WordArray.create(r), | |
| mode: CryptoJS.mode.CBC, | |
| padding: CryptoJS.pad.Pkcs7 | |
| }), | |
| a = o.iv.concat(o.ciphertext), | |
| s = CryptoJS.HmacSHA256(a, n.mac), | |
| d = s.concat(a); | |
| return i.fromBase64(d.toString(CryptoJS.enc.Base64)).toBuffer() | |
| }, | |
| decrypt: function(e) { | |
| var t = i.wrap(e), | |
| r = t.slice(t.offset, t.offset + 32).toBase64(), | |
| o = t.slice(t.offset + 32).toBuffer(), | |
| a = this.getKeys(), | |
| s = CryptoJS.lib.WordArray.create(o), | |
| d = CryptoJS.HmacSHA256(s, a.mac).toString(CryptoJS.enc.Base64); | |
| if (r !== d) throw n.error("bp:03:decrypt hmac dont match " + r + " " + d)(), new Error("hmac mismatch"); | |
| var c = t.slice(t.offset + 32, t.offset + 48).toBuffer(), | |
| u = t.slice(t.offset + 48).toBuffer(), | |
| l = CryptoJS.AES.decrypt({ | |
| ciphertext: CryptoJS.lib.WordArray.create(u), | |
| salt: void 0 | |
| }, a.enc, { | |
| iv: CryptoJS.lib.WordArray.create(c), | |
| mode: CryptoJS.mode.CBC, | |
| padding: CryptoJS.pad.Pkcs7 | |
| }); | |
| return i.fromBase64(l.toString(CryptoJS.enc.Base64)).toBuffer() | |
| } | |
| }; | |
| e.exports = a | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| singleByte: [void 0, void 0, void 0, "200", "400", "404", "500", "501", "502", "action", "add", "after", "archive", "author", "available", "battery", "before", "body", "broadcast", "chat", "clear", "code", "composing", "contacts", "count", "create", "debug", "delete", "demote", "duplicate", "encoding", "error", "false", "filehash", "from", "g.us", "group", "groups_v2", "height", "id", "image", "in", "index", "invis", "item", "jid", "kind", "last", "leave", "live", "log", "media", "message", "mimetype", "missing", "modify", "name", "notification", "notify", "out", "owner", "participant", "paused", "picture", "played", "presence", "preview", "promote", "query", "raw", "read", "receipt", "received", "recipient", "recording", "relay", "remove", "response", "resume", "retry", "s.whatsapp.net", "seconds", "set", "size", "status", "subject", "subscribe", "t", "text", "to", "true", "type", "unarchive", "unavailable", "url", "user", "value", "web", "width", "mute", "read_only", "admin", "creator", "short", "update", "powersave"], | |
| doubleByte: [], | |
| nibbleEncode: { | |
| 0: 0, | |
| 1: 1, | |
| 2: 2, | |
| 3: 3, | |
| 4: 4, | |
| 5: 5, | |
| 6: 6, | |
| 7: 7, | |
| 8: 8, | |
| 9: 9, | |
| "-": 10, | |
| ".": 11, | |
| "\x00": 15 | |
| }, | |
| nibbleDecode: { | |
| 0: "0", | |
| 1: "1", | |
| 2: "2", | |
| 3: "3", | |
| 4: "4", | |
| 5: "5", | |
| 6: "6", | |
| 7: "7", | |
| 8: "8", | |
| 9: "9", | |
| 10: "-", | |
| 11: ".", | |
| 15: "\x00" | |
| } | |
| }; | |
| e.exports = r | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| var t = !1, | |
| r = o.wrap(e, void 0, t); | |
| this.readByte = function() { | |
| return r.readUint8() | |
| }, this.readInt16 = function() { | |
| return r.readUint16() | |
| }, this.readInt20 = function() { | |
| var e = 15 & r.readUint8(), | |
| t = r.readUint8(), | |
| n = r.readUint8(); | |
| return (e << 16) + (t << 8) + n | |
| }, this.readInt32 = function() { | |
| return r.readUint32() | |
| }, this.readString = function(e) { | |
| return r.readString(e, o.METRICS_BYTES) | |
| }, this.readBytes = function(e) { | |
| var t = r.copy(r.offset, r.offset + e); | |
| return r.offset += e, t | |
| }, this.debugInfo = function() { | |
| return "offset: " + r.offset + " byte: " + r.readUint8(r.offset) | |
| } | |
| } | |
| var o = r(7); | |
| e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e, t) { | |
| if (!e) return "undefined"; | |
| var r = o(e[1], t), | |
| n = i(e[2], t); | |
| return "<" + e[0] + r + (n ? ">\n" + n + "\n</" + e[0] + ">" : "/>") | |
| } | |
| function o(e, t) { | |
| if (e) { | |
| var r = ""; | |
| for (var n in e) { | |
| var o = "string" == typeof e[n] ? t ? "..." : '"' + e[n] + '"' : e[n]; | |
| r += " " + n + "=" + o | |
| } | |
| return r | |
| } | |
| return "" | |
| } | |
| function i(e, t) { | |
| return a.isByteBuffer(e) ? "<<bin:" + e.limit + ">>" : "string" == typeof e ? t ? "<<string:" + e.length + ">>" : e : _.isArray(e) ? e.map(_.partial(n, _, t)).join("\n") : void 0 | |
| } | |
| var a = r(7), | |
| s = { | |
| tag: function(e) { | |
| return e && e[0] | |
| }, | |
| attr: function(e, t) { | |
| return t && t[1] ? t[1][e] : void 0 | |
| }, | |
| attrs: function(e) { | |
| return e[1] | |
| }, | |
| child: function d(e, t) { | |
| var r = t[2]; | |
| if (_.isArray(r)) | |
| for (var n = r.length, o = 0; n > o; o++) { | |
| var d = r[o]; | |
| if (_.isArray(d) && d[0] === e) return d | |
| } | |
| }, | |
| children: function(e) { | |
| return e && e[2] | |
| }, | |
| dataStr: function(e) { | |
| if (!e) return ""; | |
| var t = e[2]; | |
| return "string" == typeof t ? t : a.isByteBuffer(t) ? t.readString(t.limit, a.METRICS_BYTES, 0).string : void 0 | |
| }, | |
| toString: n | |
| }; | |
| e.exports = s | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| function e(e) { | |
| r++, n.push(e) | |
| } | |
| var t = !1, | |
| r = 0, | |
| n = []; | |
| this.pushInt16 = function(t) { | |
| if ("number" != typeof t) throw new Error("invalid int16"); | |
| e((65280 & t) >> 8), e((255 & t) >> 0) | |
| }, this.pushInt20 = function(t) { | |
| if ("number" != typeof t) throw new Error("invalid int20"); | |
| e((983040 & t) >> 16), e((65280 & t) >> 8), e((255 & t) >> 0) | |
| }, this.pushInt32 = function(t) { | |
| if ("number" != typeof t) throw new Error("invalid int32"); | |
| e((4278190080 & t) >> 24), e((16711680 & t) >> 16), e((65280 & t) >> 8), e((255 & t) >> 0) | |
| }, this.pushByte = function(t) { | |
| if ("number" != typeof t || 0 > t || t > 255) throw new Error("invalid byte value: " + t); | |
| e(t) | |
| }, this.pushBytes = function(e) { | |
| if (!o.isByteBuffer(e)) throw new Error("invalid byte buffer"); | |
| r += e.limit, n.push(e) | |
| }, this.pushUint8Array = function(e) { | |
| if ("[object Uint8Array]" !== Object.prototype.toString.call(e)) throw new Error("invalid Uint8Array"); | |
| r += e.length; | |
| for (var t = 0; t < e.length; t++) n.push(e[t]) | |
| }, this.pushString = function(e) { | |
| if ("string" != typeof e) throw new Error("invalid string"); | |
| r += o.calculateUTF8Bytes(e), n.push(e) | |
| }, this.toBuffer = function() { | |
| for (var e = new o(r, t), i = n.length, a = 0; i > a; a++) { | |
| var s = n[a]; | |
| "string" == typeof s ? e.writeString(s) : o.isByteBuffer(s) ? (s.reset(), e.append(s)) : e.writeByte(s) | |
| } | |
| return e.reset(), e.toBuffer(!0) | |
| } | |
| } | |
| var o = r(7); | |
| e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| var t = e.singleByte, | |
| r = e.doubleByte, | |
| n = e.nibbleDecode; | |
| this.readNode = function(e) { | |
| var t = e.readByte(), | |
| r = this.readListSize(e, t); | |
| if (t = e.readByte(), t === o.STREAM_END) throw new Error("unexpected stream end " + e.debugInfo()); | |
| var n = this.readString(e, t); | |
| if (0 === r || !n) throw new Error("invalid node. 0 list or empty tag" + e.debugInfo()); | |
| var i = r - 2 + r % 2 >> 1, | |
| a = this.readAttributes(e, i); | |
| if (r % 2 === 1) return [n, a, void 0]; | |
| var s; | |
| if (t = e.readByte(), this.isListTag(t)) s = this.readList(e, t); | |
| else if (t === o.BINARY_8) { | |
| var d = e.readByte(); | |
| s = e.readBytes(d) | |
| } else if (t === o.BINARY_20) { | |
| var c = e.readInt20(); | |
| s = e.readBytes(c) | |
| } else if (t === o.BINARY_32) { | |
| var u = e.readInt32(); | |
| s = e.readBytes(u) | |
| } else s = this.readString(e, t); | |
| return [n, a, s] | |
| }, this.isListTag = function(e) { | |
| return e === o.LIST_EMPTY || e === o.LIST_8 || e === o.LIST_16 | |
| }, this.readListSize = function(e, t) { | |
| if (t === o.LIST_EMPTY) return 0; | |
| if (t === o.LIST_8) return e.readByte(); | |
| if (t === o.LIST_16) return e.readInt16(); | |
| throw new Error("invalid list size " + e.debugInfo()) | |
| }, this.readString = function(e, t) { | |
| if (-1 === t) throw new Error("invalid start token readString" + e.debugInfo()); | |
| if (t > 2 && 236 > t) { | |
| var r = this.getToken(t); | |
| return "s.whatsapp.net" === r && (r = "c.us"), r | |
| } | |
| switch (t) { | |
| case o.DICTIONARY_0: | |
| case o.DICTIONARY_1: | |
| case o.DICTIONARY_2: | |
| case o.DICTIONARY_3: | |
| var n = e.readByte(); | |
| return this.getTokenDouble(t - o.DICTIONARY_0, n); | |
| case o.LIST_EMPTY: | |
| return; | |
| case o.BINARY_8: | |
| return e.readString(e.readByte()); | |
| case o.BINARY_20: | |
| return e.readString(e.readInt20()); | |
| case o.BINARY_32: | |
| return e.readString(e.readInt32()); | |
| case o.JID_PAIR: | |
| var i = this.readString(e, e.readByte()), | |
| a = this.readString(e, e.readByte()); | |
| if ("undefined" != typeof i && "undefined" != typeof a) return i + "@" + a; | |
| if ("undefined" != typeof a) return a; | |
| throw new Error("invalid jid " + i + "," + a + " " + e.debugInfo()); | |
| case o.NIBBLE_8: | |
| return this.nibblesToBytes(e); | |
| default: | |
| throw new Error("invalid string " + e.debugInfo()) | |
| } | |
| }, this.getToken = function(e) { | |
| var r; | |
| if (e >= 0 && e < t.length && (r = t[e]), "undefined" == typeof r) throw new Error("invalid token " + e); | |
| return r | |
| }, this.getTokenDouble = function(e, t) { | |
| var n, o = 256 * e + t; | |
| if (o >= 0 && o < r.length && (n = r[o]), "undefined" == typeof n) throw new Error("invalid double byte token " + e + " " + t); | |
| return n | |
| }, this.readAttributes = function(e, t) { | |
| for (var r, n, o = t ? {} : void 0, i = 0; t > i; i++) r = this.readString(e, e.readByte()), n = this.readString(e, e.readByte()), o[r] = n; | |
| return o | |
| }, this.readList = function(e, t) { | |
| for (var r = [], n = this.readListSize(e, t), o = 0; n > o; o++) r.push(this.readNode(e)); | |
| return r | |
| }, this.nibblesToBytes = function(e) { | |
| for (var t = e.readByte(), r = t >> 7, n = 127 & t, o = "", i = 0; n > i; i++) { | |
| var a = e.readByte(), | |
| s = this.unpackBytePair(a); | |
| o += s[0], o += s[1] | |
| } | |
| return r && (o = o.substring(0, o.length - 1)), o | |
| }, this.unpackBytePair = function(e) { | |
| var t = (240 & e) >> 4, | |
| r = 15 & e; | |
| if (!n.hasOwnProperty(t)) throw new Error("invalid nibble to unpack: " + t); | |
| if (!n.hasOwnProperty(r)) throw new Error("invalid nibble to unpack: " + r); | |
| var o = n[t], | |
| i = n[r]; | |
| return [o, i] | |
| }, this.bytesToString = function(e) { | |
| for (var t = "", r = 0; r < e.length; r++) t += String.fromCharCode(e[r]); | |
| return t | |
| } | |
| } | |
| var o = r(149); | |
| e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| var t, r = {}, | |
| n = e.nibbleEncode; | |
| for (t = 0; t < e.singleByte.length; t++) e.singleByte[t] && (r[e.singleByte[t]] = t); | |
| for (t = 0; t < e.doubleByte.length; t++) e.doubleByte[t] && (r[e.doubleByte[t]] = t + a.SINGLE_BYTE_MAX); | |
| this.writeNode = function(e, t) { | |
| if (t) { | |
| if (3 !== t.length) throw new Error("invalid node"); | |
| var r = t[1] ? 2 * Object.keys(t[1]).filter(function(e) { | |
| return !!t[1][e] | |
| }).length : 0; | |
| this.writeListStart(e, 1 + r + (t[2] ? 1 : 0)), this.writeString(e, t[0]), this.writeAttributes(e, t[1]), this.writeChildren(e, t[2]) | |
| } | |
| }, this.writeString = function(e, t, n) { | |
| if ("string" != typeof t) throw new Error("invalid string"); | |
| var o, i, s = r[t]; | |
| if ("c.us" !== t || n) | |
| if ("undefined" == typeof s) { | |
| var d = t.indexOf("@"); | |
| if (1 > d) this.writeStringRaw(e, t); | |
| else { | |
| var c = t.substring(0, d), | |
| u = t.substring(d + 1); | |
| this.writeJid(e, c, u) | |
| } | |
| } else { | |
| if (s < a.SINGLE_BYTE_MAX) this.writeToken(e, s); | |
| else { | |
| var l = s - a.SINGLE_BYTE_MAX, | |
| f = l >> 8; | |
| switch (i = l % 256, f) { | |
| case 0: | |
| o = a.DICTIONARY_0; | |
| break; | |
| case 1: | |
| o = a.DICTIONARY_1; | |
| break; | |
| case 2: | |
| o = a.DICTIONARY_2; | |
| break; | |
| case 3: | |
| o = a.DICTIONARY_3; | |
| break; | |
| default: | |
| throw new Error("double byte dictionary token out of range: " + t + " " + s) | |
| } | |
| } | |
| this.writeToken(e, o), this.writeToken(e, i) | |
| } | |
| else this.writeToken(e, r["s.whatsapp.net"]) | |
| }, this.writeStringRaw = function(e, t) { | |
| var r = i.calculateUTF8Bytes(t); | |
| if (r >= 4294967296) throw new Error("string too large to encode (len = " + r + "): " + t); | |
| r >= 1 << 20 ? (e.pushByte(a.BINARY_32), e.pushInt32(r)) : r >= 256 ? (e.pushByte(a.BINARY_20), e.pushInt20(r)) : (e.pushByte(a.BINARY_8), e.pushByte(r)), e.pushString(t) | |
| }, this.writeJid = function(e, t, r) { | |
| if (e.pushByte(a.JID_PAIR), t) try { | |
| this.writeNibbles(e, t) | |
| } catch (n) { | |
| o.warnVerbose("writer:encode-fallback " + n.message, t)(), this.writeString(e, t) | |
| } else this.writeToken(e, a.LIST_EMPTY); | |
| this.writeString(e, r) | |
| }, this.writeToken = function(e, t) { | |
| if (245 > t) e.pushByte(t); | |
| else if (500 >= t) throw new Error("invalid token") | |
| }, this.writeAttributes = function(e, t) { | |
| if (t) | |
| for (var r in t) t[r] && (this.writeString(e, r), this.writeString(e, t[r])) | |
| }, this.writeChildren = function(e, t) { | |
| var r; | |
| if (t) | |
| if ("string" == typeof t) this.writeString(e, t, !0); | |
| else if (i.isByteBuffer(t)) { | |
| if (r = t.limit, r >= 4294967296) throw new Error("invalid children; too long (len = " + r); | |
| r >= 1 << 20 ? (e.pushByte(a.BINARY_32), e.pushInt32(r)) : r >= 256 ? (e.pushByte(a.BINARY_20), e.pushInt20(r)) : (e.pushByte(a.BINARY_8), e.pushByte(r)), e.pushBytes(t) | |
| } else { | |
| if (!_.isArray(t)) throw new Error("invalid children"); | |
| r = t.length, this.writeListStart(e, r); | |
| for (var n = 0; r > n; n++) this.writeNode(e, t[n]) | |
| } | |
| }, this.writeListStart = function(e, t) { | |
| 0 === t ? e.pushByte(a.LIST_EMPTY) : 256 > t ? (e.pushByte(a.LIST_8), e.pushByte(t)) : (e.pushByte(a.LIST_16), e.pushInt16(t)) | |
| }, this.writeNibbles = function(e, t) { | |
| var r = i.calculateUTF8Bytes(t); | |
| if (r > a.NIBBLE_MAX) throw new Error("too many bytes to nibble-encode: len = " + r); | |
| var n, o = Math.ceil(r / 2), | |
| s = [], | |
| d = 0; | |
| r % 2 > 0 && (d = 128); | |
| var c = d | o; | |
| s.push(a.NIBBLE_8), s.push(c); | |
| for (var u = Math.floor(r / 2), l = 0; u > l; l++) n = this.packBytePair(t[2 * l], t[2 * l + 1]), s.push(n); | |
| d > 0 && (n = this.packBytePair(t[r - 1], "\x00"), s.push(n)); | |
| var f = new Uint8Array(s); | |
| e.pushUint8Array(f) | |
| }, this.packBytePair = function(e, t) { | |
| if (!n.hasOwnProperty(e)) throw new Error("invalid byte to nibble-pack: " + e); | |
| if (!n.hasOwnProperty(t)) throw new Error("invalid byte to nibble-pack: " + t); | |
| var r = n[e], | |
| o = n[t]; | |
| return r << 4 | o | |
| } | |
| } | |
| var o = r(1), | |
| i = r(7), | |
| a = r(149); | |
| e.exports = n | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| singleByte: [void 0, void 0, void 0, "200", "400", "404", "500", "501", "502", "action", "add", "after", "archive", "author", "available", "battery", "before", "body", "broadcast", "chat", "clear", "code", "composing", "contacts", "count", "create", "debug", "delete", "demote", "duplicate", "encoding", "error", "false", "filehash", "from", "g.us", "group", "groups_v2", "height", "id", "image", "in", "index", "invis", "item", "jid", "kind", "last", "leave", "live", "log", "media", "message", "mimetype", "missing", "modify", "name", "notification", "notify", "out", "owner", "participant", "paused", "picture", "played", "presence", "preview", "promote", "query", "raw", "read", "receipt", "received", "recipient", "recording", "relay", "remove", "response", "resume", "retry", "s.whatsapp.net", "seconds", "set", "size", "status", "subject", "subscribe", "t", "text", "to", "true", "type", "unarchive", "unavailable", "url", "user", "value", "web", "width", "mute", "read_only", "admin", "creator", "short", "update", "powersave", "checksum", "epoch", "block", "previous", "409", "replaced", "reason", "spam", "modify_tag"], | |
| doubleByte: [], | |
| nibbleEncode: { | |
| 0: 0, | |
| 1: 1, | |
| 2: 2, | |
| 3: 3, | |
| 4: 4, | |
| 5: 5, | |
| 6: 6, | |
| 7: 7, | |
| 8: 8, | |
| 9: 9, | |
| "-": 10, | |
| ".": 11, | |
| "\x00": 15 | |
| }, | |
| nibbleDecode: { | |
| 0: "0", | |
| 1: "1", | |
| 2: "2", | |
| 3: "3", | |
| 4: "4", | |
| 5: "5", | |
| 6: "6", | |
| 7: "7", | |
| 8: "8", | |
| 9: "9", | |
| 10: "-", | |
| 11: ".", | |
| 15: "\x00" | |
| } | |
| }; | |
| e.exports = r; | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| singleByte: [void 0, void 0, void 0, "200", "400", "404", "500", "501", "502", "action", "add", "after", "archive", "author", "available", "battery", "before", "body", "broadcast", "chat", "clear", "code", "composing", "contacts", "count", "create", "debug", "delete", "demote", "duplicate", "encoding", "error", "false", "filehash", "from", "g.us", "group", "groups_v2", "height", "id", "image", "in", "index", "invis", "item", "jid", "kind", "last", "leave", "live", "log", "media", "message", "mimetype", "missing", "modify", "name", "notification", "notify", "out", "owner", "participant", "paused", "picture", "played", "presence", "preview", "promote", "query", "raw", "read", "receipt", "received", "recipient", "recording", "relay", "remove", "response", "resume", "retry", "s.whatsapp.net", "seconds", "set", "size", "status", "subject", "subscribe", "t", "text", "to", "true", "type", "unarchive", "unavailable", "url", "user", "value", "web", "width", "mute", "read_only", "admin", "creator", "short", "update", "powersave", "checksum", "epoch", "block", "previous", "409", "replaced", "reason", "spam", "modify_tag", "message_info", "delivery", "emoji"], | |
| doubleByte: [], | |
| nibbleEncode: { | |
| 0: 0, | |
| 1: 1, | |
| 2: 2, | |
| 3: 3, | |
| 4: 4, | |
| 5: 5, | |
| 6: 6, | |
| 7: 7, | |
| 8: 8, | |
| 9: 9, | |
| "-": 10, | |
| ".": 11, | |
| "\x00": 15 | |
| }, | |
| nibbleDecode: { | |
| 0: "0", | |
| 1: "1", | |
| 2: "2", | |
| 3: "3", | |
| 4: "4", | |
| 5: "5", | |
| 6: "6", | |
| 7: "7", | |
| 8: "8", | |
| 9: "9", | |
| 10: "-", | |
| 11: ".", | |
| 15: "\x00" | |
| } | |
| }; | |
| e.exports = r | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| var t = e.singleByte, | |
| r = e.doubleByte, | |
| n = e.nibbleDecode; | |
| this.readNode = function(e) { | |
| var t = e.readByte(), | |
| r = this.readListSize(e, t); | |
| if (t = e.readByte(), t === o.STREAM_END) throw new Error("unexpected stream end " + e.debugInfo()); | |
| var n = this.readString(e, t); | |
| if (0 === r || !n) throw new Error("invalid node. 0 list or empty tag" + e.debugInfo()); | |
| var i = r - 2 + r % 2 >> 1, | |
| a = this.readAttributes(e, i); | |
| if (r % 2 === 1) return [n, a, void 0]; | |
| var s; | |
| if (t = e.readByte(), this.isListTag(t)) s = this.readList(e, t); | |
| else if (t === o.BINARY_8) { | |
| var d = e.readByte(); | |
| s = e.readBytes(d) | |
| } else if (t === o.BINARY_20) { | |
| var c = e.readInt20(); | |
| s = e.readBytes(c) | |
| } else if (t === o.BINARY_32) { | |
| var u = e.readInt32(); | |
| s = e.readBytes(u) | |
| } else s = this.readString(e, t); | |
| return [n, a, s] | |
| }, this.isListTag = function(e) { | |
| return e === o.LIST_EMPTY || e === o.LIST_8 || e === o.LIST_16 | |
| }, this.readListSize = function(e, t) { | |
| if (t === o.LIST_EMPTY) return 0; | |
| if (t === o.LIST_8) return e.readByte(); | |
| if (t === o.LIST_16) return e.readInt16(); | |
| throw new Error("invalid list size " + e.debugInfo()) | |
| }, this.readString = function(e, t) { | |
| if (-1 === t) throw new Error("invalid start token readString" + e.debugInfo()); | |
| if (t > 2 && 236 > t) { | |
| var r = this.getToken(t); | |
| return "s.whatsapp.net" === r && (r = "c.us"), r | |
| } | |
| switch (t) { | |
| case o.DICTIONARY_0: | |
| case o.DICTIONARY_1: | |
| case o.DICTIONARY_2: | |
| case o.DICTIONARY_3: | |
| var n = e.readByte(); | |
| return this.getTokenDouble(t - o.DICTIONARY_0, n); | |
| case o.LIST_EMPTY: | |
| return; | |
| case o.BINARY_8: | |
| return e.readString(e.readByte()); | |
| case o.BINARY_20: | |
| return e.readString(e.readInt20()); | |
| case o.BINARY_32: | |
| return e.readString(e.readInt32()); | |
| case o.JID_PAIR: | |
| var i = this.readString(e, e.readByte()), | |
| a = this.readString(e, e.readByte()); | |
| if ("undefined" != typeof i && "undefined" != typeof a) return i + "@" + a; | |
| if ("undefined" != typeof a) return a; | |
| throw new Error("invalid jid " + i + "," + a + " " + e.debugInfo()); | |
| case o.NIBBLE_8: | |
| case o.HEX_8: | |
| return this.readPacked8(t, e); | |
| default: | |
| throw new Error("invalid string " + e.debugInfo()) | |
| } | |
| }, this.getToken = function(e) { | |
| var r; | |
| if (e >= 0 && e < t.length && (r = t[e]), "undefined" == typeof r) throw new Error("invalid token " + e); | |
| return r | |
| }, this.getTokenDouble = function(e, t) { | |
| var n, o = 256 * e + t; | |
| if (o >= 0 && o < r.length && (n = r[o]), "undefined" == typeof n) throw new Error("invalid double byte token " + e + " " + t); | |
| return n | |
| }, this.readAttributes = function(e, t) { | |
| for (var r, n, o = t ? {} : void 0, i = 0; t > i; i++) r = this.readString(e, e.readByte()), n = this.readString(e, e.readByte()), o[r] = n; | |
| return o | |
| }, this.readList = function(e, t) { | |
| for (var r = [], n = this.readListSize(e, t), o = 0; n > o; o++) r.push(this.readNode(e)); | |
| return r | |
| }, this.readPacked8 = function(e, t) { | |
| for (var r = t.readByte(), n = r >> 7, o = 127 & r, i = "", a = 0; o > a; a++) { | |
| var s = t.readByte(); | |
| i += this.unpackByte(e, (240 & s) >> 4), i += this.unpackByte(e, 15 & s) | |
| } | |
| return n && (i = i.substring(0, i.length - 1)), i | |
| }, this.unpackByte = function(e, t) { | |
| switch (e) { | |
| case o.NIBBLE_8: | |
| return this.unpackNibble(t); | |
| case o.HEX_8: | |
| return this.unpackHex(t); | |
| default: | |
| throw new Error("unpack non-nibble/hex type: " + e) | |
| } | |
| }, this.unpackNibble = function(e) { | |
| if (!n.hasOwnProperty(e)) throw new Error("invalid nibble to unpack: " + e); | |
| return n[e] | |
| }, this.unpackHex = function(e) { | |
| if (e >= 0 && 15 >= e) return e.toString(16).toUpperCase(); | |
| throw new Error("invalid hex to unpack: " + e) | |
| } | |
| } | |
| var o = r(150); | |
| e.exports = n | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| var t, r = {}, | |
| n = e.nibbleEncode; | |
| for (t = 0; t < e.singleByte.length; t++) e.singleByte[t] && (r[e.singleByte[t]] = t); | |
| for (t = 0; t < e.doubleByte.length; t++) e.doubleByte[t] && (r[e.doubleByte[t]] = t + a.SINGLE_BYTE_MAX); | |
| this.writeNode = function(e, t) { | |
| if (t) { | |
| if (3 !== t.length) throw new Error("invalid node"); | |
| var r = t[1] ? 2 * Object.keys(t[1]).filter(function(e) { | |
| return !!t[1][e] | |
| }).length : 0; | |
| this.writeListStart(e, 1 + r + (t[2] ? 1 : 0)), this.writeString(e, t[0]), this.writeAttributes(e, t[1]), this.writeChildren(e, t[2]) | |
| } | |
| }, this.writeString = function(e, t, n) { | |
| if ("string" != typeof t) throw new Error("invalid string"); | |
| var o, i, s = r[t]; | |
| if ("c.us" !== t || n) | |
| if ("undefined" == typeof s) { | |
| var d = t.indexOf("@"); | |
| if (1 > d) this.writeStringRaw(e, t); | |
| else { | |
| var c = t.substring(0, d), | |
| u = t.substring(d + 1); | |
| this.writeJid(e, c, u) | |
| } | |
| } else { | |
| if (s < a.SINGLE_BYTE_MAX) this.writeToken(e, s); | |
| else { | |
| var l = s - a.SINGLE_BYTE_MAX, | |
| f = l >> 8; | |
| switch (i = l % 256, f) { | |
| case 0: | |
| o = a.DICTIONARY_0; | |
| break; | |
| case 1: | |
| o = a.DICTIONARY_1; | |
| break; | |
| case 2: | |
| o = a.DICTIONARY_2; | |
| break; | |
| case 3: | |
| o = a.DICTIONARY_3; | |
| break; | |
| default: | |
| throw new Error("double byte dictionary token out of range: " + t + " " + s) | |
| } | |
| } | |
| this.writeToken(e, o), this.writeToken(e, i) | |
| } | |
| else this.writeToken(e, r["s.whatsapp.net"]) | |
| }, this.writeStringRaw = function(e, t) { | |
| var r = i.calculateUTF8Bytes(t); | |
| if (r >= 4294967296) throw new Error("string too large to encode (len = " + r + "): " + t); | |
| r >= 1 << 20 ? (e.pushByte(a.BINARY_32), e.pushInt32(r)) : r >= 256 ? (e.pushByte(a.BINARY_20), e.pushInt20(r)) : (e.pushByte(a.BINARY_8), e.pushByte(r)), e.pushString(t) | |
| }, this.writeJid = function(e, t, r) { | |
| if (e.pushByte(a.JID_PAIR), t) try { | |
| this.writePackedBytes(e, t) | |
| } catch (n) { | |
| o.warnVerbose("writer:encode-fallback " + n.message, t)(), this.writeString(e, t) | |
| } else this.writeToken(e, a.LIST_EMPTY); | |
| this.writeString(e, r) | |
| }, this.writeToken = function(e, t) { | |
| if (245 > t) e.pushByte(t); | |
| else if (500 >= t) throw new Error("invalid token") | |
| }, this.writeAttributes = function(e, t) { | |
| if (t) | |
| for (var r in t) t[r] && (this.writeString(e, r), this.writeString(e, t[r])) | |
| }, this.writeChildren = function(e, t) { | |
| var r; | |
| if (t) | |
| if ("string" == typeof t) this.writeString(e, t, !0); | |
| else if (i.isByteBuffer(t)) { | |
| if (r = t.limit, r >= 4294967296) throw new Error("invalid children; too long (len = " + r); | |
| r >= 1 << 20 ? (e.pushByte(a.BINARY_32), e.pushInt32(r)) : r >= 256 ? (e.pushByte(a.BINARY_20), e.pushInt20(r)) : (e.pushByte(a.BINARY_8), e.pushByte(r)), e.pushBytes(t) | |
| } else { | |
| if (!_.isArray(t)) throw new Error("invalid children"); | |
| r = t.length, this.writeListStart(e, r); | |
| for (var n = 0; r > n; n++) this.writeNode(e, t[n]) | |
| } | |
| }, this.writeListStart = function(e, t) { | |
| 0 === t ? e.pushByte(a.LIST_EMPTY) : 256 > t ? (e.pushByte(a.LIST_8), e.pushByte(t)) : (e.pushByte(a.LIST_16), e.pushInt16(t)) | |
| }, this.writePackedBytes = function(e, t) { | |
| try { | |
| this.writePackedBytesImpl(e, t, a.NIBBLE_8) | |
| } catch (r) { | |
| o.warn("writer:enc nib fail, try hex " + r.message, t)(), this.writePackedBytesImpl(e, t, a.HEX_8) | |
| } | |
| }, this.writePackedBytesImpl = function(e, t, r) { | |
| var n = i.calculateUTF8Bytes(t); | |
| if (n > a.PACKED_MAX) throw new Error("too many bytes to nibble-encode: len = " + n); | |
| var o, s = Math.ceil(n / 2), | |
| d = [], | |
| c = 0; | |
| n % 2 > 0 && (c = 128); | |
| var u = c | s; | |
| d.push(r), d.push(u); | |
| for (var l = Math.floor(n / 2), f = 0; l > f; f++) o = this.packBytePair(r, t[2 * f], t[2 * f + 1]), d.push(o); | |
| c > 0 && (o = this.packBytePair(r, t[n - 1], "\x00"), d.push(o)); | |
| var h = new Uint8Array(d); | |
| e.pushUint8Array(h) | |
| }, this.packBytePair = function(e, t, r) { | |
| var n, o; | |
| switch (e) { | |
| case a.NIBBLE_8: | |
| n = this.packNibble(t), o = this.packNibble(r); | |
| break; | |
| case a.HEX_8: | |
| n = this.packHex(t), o = this.packHex(r); | |
| break; | |
| default: | |
| throw new Error("invalid byte pack type: " + e) | |
| } | |
| return n << 4 | o | |
| }, this.packNibble = function(e) { | |
| if (!n.hasOwnProperty(e)) throw new Error("invalid byte to nibble-pack: " + e); | |
| return n[e] | |
| }, this.packHex = function(e) { | |
| switch (e) { | |
| case "0": | |
| case "1": | |
| case "2": | |
| case "3": | |
| case "4": | |
| case "5": | |
| case "6": | |
| case "7": | |
| case "8": | |
| case "9": | |
| case "A": | |
| case "B": | |
| case "C": | |
| case "D": | |
| case "E": | |
| case "F": | |
| return parseInt(e, 16); | |
| case "\x00": | |
| return 15; | |
| default: | |
| throw new Error("packHex:invalid byte: " + e) | |
| } | |
| } | |
| } | |
| var o = r(1), | |
| i = r(7), | |
| a = r(150); | |
| e.exports = n | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| singleByte: [void 0, void 0, void 0, "200", "400", "404", "500", "501", "502", "action", "add", "after", "archive", "author", "available", "battery", "before", "body", "broadcast", "chat", "clear", "code", "composing", "contacts", "count", "create", "debug", "delete", "demote", "duplicate", "encoding", "error", "false", "filehash", "from", "g.us", "group", "groups_v2", "height", "id", "image", "in", "index", "invis", "item", "jid", "kind", "last", "leave", "live", "log", "media", "message", "mimetype", "missing", "modify", "name", "notification", "notify", "out", "owner", "participant", "paused", "picture", "played", "presence", "preview", "promote", "query", "raw", "read", "receipt", "received", "recipient", "recording", "relay", "remove", "response", "resume", "retry", "s.whatsapp.net", "seconds", "set", "size", "status", "subject", "subscribe", "t", "text", "to", "true", "type", "unarchive", "unavailable", "url", "user", "value", "web", "width", "mute", "read_only", "admin", "creator", "short", "update", "powersave", "checksum", "epoch", "block", "previous", "409", "replaced", "reason", "spam", "modify_tag", "message_info", "delivery", "emoji", "title", "description", "canonical-url", "matched-text", "star", "unstar"], | |
| doubleByte: [], | |
| nibbleEncode: { | |
| 0: 0, | |
| 1: 1, | |
| 2: 2, | |
| 3: 3, | |
| 4: 4, | |
| 5: 5, | |
| 6: 6, | |
| 7: 7, | |
| 8: 8, | |
| 9: 9, | |
| "-": 10, | |
| ".": 11, | |
| "\x00": 15 | |
| }, | |
| nibbleDecode: { | |
| 0: "0", | |
| 1: "1", | |
| 2: "2", | |
| 3: "3", | |
| 4: "4", | |
| 5: "5", | |
| 6: "6", | |
| 7: "7", | |
| 8: "8", | |
| 9: "9", | |
| 10: "-", | |
| 11: ".", | |
| 15: "\x00" | |
| } | |
| }; | |
| e.exports = r | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| singleByte: [void 0, void 0, void 0, "200", "400", "404", "500", "501", "502", "action", "add", "after", "archive", "author", "available", "battery", "before", "body", "broadcast", "chat", "clear", "code", "composing", "contacts", "count", "create", "debug", "delete", "demote", "duplicate", "encoding", "error", "false", "filehash", "from", "g.us", "group", "groups_v2", "height", "id", "image", "in", "index", "invis", "item", "jid", "kind", "last", "leave", "live", "log", "media", "message", "mimetype", "missing", "modify", "name", "notification", "notify", "out", "owner", "participant", "paused", "picture", "played", "presence", "preview", "promote", "query", "raw", "read", "receipt", "received", "recipient", "recording", "relay", "remove", "response", "resume", "retry", "s.whatsapp.net", "seconds", "set", "size", "status", "subject", "subscribe", "t", "text", "to", "true", "type", "unarchive", "unavailable", "url", "user", "value", "web", "width", "mute", "read_only", "admin", "creator", "short", "update", "powersave", "checksum", "epoch", "block", "previous", "409", "replaced", "reason", "spam", "modify_tag", "message_info", "delivery", "emoji", "title", "description", "canonical-url", "matched-text", "star", "unstar", "media_key"], | |
| doubleByte: [], | |
| nibbleEncode: { | |
| 0: 0, | |
| 1: 1, | |
| 2: 2, | |
| 3: 3, | |
| 4: 4, | |
| 5: 5, | |
| 6: 6, | |
| 7: 7, | |
| 8: 8, | |
| 9: 9, | |
| "-": 10, | |
| ".": 11, | |
| "\x00": 15 | |
| }, | |
| nibbleDecode: { | |
| 0: "0", | |
| 1: "1", | |
| 2: "2", | |
| 3: "3", | |
| 4: "4", | |
| 5: "5", | |
| 6: "6", | |
| 7: "7", | |
| 8: "8", | |
| 9: "9", | |
| 10: "-", | |
| 11: ".", | |
| 15: "\x00" | |
| } | |
| }; | |
| e.exports = r | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| singleByte: [void 0, void 0, void 0, "200", "400", "404", "500", "501", "502", "action", "add", "after", "archive", "author", "available", "battery", "before", "body", "broadcast", "chat", "clear", "code", "composing", "contacts", "count", "create", "debug", "delete", "demote", "duplicate", "encoding", "error", "false", "filehash", "from", "g.us", "group", "groups_v2", "height", "id", "image", "in", "index", "invis", "item", "jid", "kind", "last", "leave", "live", "log", "media", "message", "mimetype", "missing", "modify", "name", "notification", "notify", "out", "owner", "participant", "paused", "picture", "played", "presence", "preview", "promote", "query", "raw", "read", "receipt", "received", "recipient", "recording", "relay", "remove", "response", "resume", "retry", "s.whatsapp.net", "seconds", "set", "size", "status", "subject", "subscribe", "t", "text", "to", "true", "type", "unarchive", "unavailable", "url", "user", "value", "web", "width", "mute", "read_only", "admin", "creator", "short", "update", "powersave", "checksum", "epoch", "block", "previous", "409", "replaced", "reason", "spam", "modify_tag", "message_info", "delivery", "emoji", "title", "description", "canonical-url", "matched-text", "star", "unstar", "media_key", "filename", "identity", "unread", "page", "page_count", "search", "media_message", "security", "call_log", "profile"], | |
| doubleByte: [], | |
| nibbleEncode: { | |
| 0: 0, | |
| 1: 1, | |
| 2: 2, | |
| 3: 3, | |
| 4: 4, | |
| 5: 5, | |
| 6: 6, | |
| 7: 7, | |
| 8: 8, | |
| 9: 9, | |
| "-": 10, | |
| ".": 11, | |
| "\x00": 15 | |
| }, | |
| nibbleDecode: { | |
| 0: "0", | |
| 1: "1", | |
| 2: "2", | |
| 3: "3", | |
| 4: "4", | |
| 5: "5", | |
| 6: "6", | |
| 7: "7", | |
| 8: "8", | |
| 9: "9", | |
| 10: "-", | |
| 11: ".", | |
| 15: "\x00" | |
| } | |
| }; | |
| e.exports = r | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(10), | |
| i = r(44), | |
| a = r(337), | |
| s = n.createClass({ | |
| displayName: "Conflict", | |
| componentWillMount: function() { | |
| a.setTitleAndIcon(-1) | |
| }, | |
| render: function() { | |
| return n.createElement(i, { | |
| body: l10n.t("phone_has_another_active_webclient_session"), | |
| cancelLabel: l10n.t("menuitem_logout"), | |
| onCancel: o.logout.bind(o), | |
| defaultLabel: l10n.t("button_use_here"), | |
| onDefault: o.takeover.bind(o) | |
| }) | |
| } | |
| }); | |
| e.exports = s | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(24), | |
| i = r(72), | |
| a = r(70), | |
| s = r(139), | |
| d = r(330), | |
| c = r(92), | |
| u = { | |
| menu: null, | |
| origin: { | |
| x: 0, | |
| y: 0 | |
| }, | |
| anchor: null, | |
| event: null, | |
| menuDirection: { | |
| x: d.Direction.X.RIGHT, | |
| y: d.Direction.Y.BOTTOM | |
| }, | |
| originPosition: { | |
| x: d.Direction.X.LEFT, | |
| y: d.Direction.Y.BOTTOM | |
| }, | |
| originOffset: { | |
| x: 0, | |
| y: 0 | |
| }, | |
| onOpen: _.noop, | |
| onClose: _.noop, | |
| onDefault: _.noop, | |
| classes: null | |
| }, | |
| l = { | |
| MENU: "menu", | |
| TOOLTIP: "tooltip" | |
| }, | |
| f = n.createClass({ | |
| displayName: "ContextMenuManager", | |
| mixins: [i, s], | |
| propTypes: { | |
| type: n.PropTypes.oneOf(_.values(l)).isRequired | |
| }, | |
| getDefaultProps: function() { | |
| return { | |
| type: l.MENU | |
| } | |
| }, | |
| getInitialState: function() { | |
| return u | |
| }, | |
| componentWillMount: function() { | |
| var e = this.props.type === l.MENU ? "open_context_menu" : "open_tooltip"; | |
| this.regCmd(e, this.open) | |
| }, | |
| open: function(e, t) { | |
| this.state.menu && a.pop(this.props.type), t = _.merge(_.clone(u, !0), t), t.event && (t.origin = { | |
| x: t.event.clientX, | |
| y: t.event.clientY | |
| }, t.originOffset = { | |
| x: 10, | |
| y: 10 | |
| }, t.event.stopPropagation()), t.key = Math.random(), t.menu = e, this.replaceState(t, function() { | |
| this.setDirection() | |
| }), this.uimPush(this, this.props.type, { | |
| popable: !0, | |
| parent: t.parent | |
| }) | |
| }, | |
| uimClose: function() { | |
| _.isFunction(this.state.onClose) && this.state.onClose(), this.setState(u) | |
| }, | |
| setDirection: function() { | |
| var e = o.findDOMNode(this.refs.menu); | |
| if (!e) return null; | |
| var t = e.clientWidth, | |
| r = e.clientHeight, | |
| n = window.innerWidth, | |
| i = window.innerHeight, | |
| a = _.clone(this.state.menuDirection), | |
| s = _.clone(this.state.origin), | |
| c = s.x, | |
| u = s.x, | |
| l = s.y, | |
| f = s.y; | |
| if (this.state.anchor) { | |
| var h = this.state.anchor, | |
| p = h.getBoundingClientRect(); | |
| c = p.left, u = p.right, l = p.top, f = p.bottom | |
| } | |
| var m = a.x; | |
| m === d.Direction.X.RIGHT && c + t > n && u - t > 0 ? m = d.Direction.X.LEFT : m === d.Direction.X.LEFT && 0 > u - t && n > c + t && (m = d.Direction.X.RIGHT); | |
| var g = a.y; | |
| g === d.Direction.Y.BOTTOM && f + r > i && l - r > 0 ? g = d.Direction.Y.TOP : g === d.Direction.Y.TOP && 0 > l - r && i > f + r && (g = d.Direction.Y.BOTTOM); | |
| var v = m === d.Direction.X.RIGHT ? c : u, | |
| y = g === d.Direction.Y.TOP ? l : f; | |
| this.setState({ | |
| menuDirection: { | |
| x: m, | |
| y: g | |
| }, | |
| origin: { | |
| x: v, | |
| y: y | |
| } | |
| }) | |
| }, | |
| render: function() { | |
| var e; | |
| if (this.state.menu) { | |
| var t = { | |
| x: this.state.origin.x + this.state.originOffset.x, | |
| y: this.state.origin.y + this.state.originOffset.y | |
| }; | |
| e = n.createElement(d, { | |
| origin: t, | |
| ref: "menu", | |
| onDefault: this.state.onDefault, | |
| classes: this.state.classes, | |
| type: this.state.type, | |
| key: "key-" + this.state.key, | |
| direction: this.state.menuDirection | |
| }, this.state.menu) | |
| } | |
| var r = this.state.type === d.Type.PICKER ? "dropdown-picker" : "dropdown"; | |
| return n.createElement(c, { | |
| transitionName: r | |
| }, e) | |
| } | |
| }); | |
| e.exports = f | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e) { | |
| this.regex = new RegExp("^" + e[0] + "$"), this.formatString = e[1], this.leadins = _.map(e[2], function(e) { | |
| return new RegExp("^(?:" + e + ")") | |
| }) | |
| } | |
| function o(e) { | |
| var t = s[e]; | |
| return t ? c[e] = { | |
| lengths: t[0], | |
| formats: t[1].map(function(e) { | |
| return new n(e) | |
| }) | |
| } : null | |
| } | |
| function i(e) { | |
| var t = e.match(d); | |
| return t ? t[0] : e.length >= 3 ? e.substring(0, 3) : e | |
| } | |
| function a(e) { | |
| var t = i(e); | |
| if (!t) return e; | |
| var r = e.substring(t.length), | |
| n = c[t] || o(t); | |
| if (!n) return "+" + t + " " + r; | |
| for (var a = n.formats, s = 0; s < a.length; s++) { | |
| var d = a[s].testAndFormat(r); | |
| if (d) return "+" + t + " " + d | |
| } | |
| return "+" + t + " " + r | |
| } | |
| var s = r(460), | |
| d = /^(1|2[07]|3[0-469]|4[013-9]|5[1-8]|6[0-6]|7|8[1246]|9[0-58])/, | |
| c = {}; | |
| n.prototype = { | |
| testAndFormat: function(e) { | |
| return this.regex.test(e) && this.checkLeadins(e) && e.replace(this.regex, this.formatString) | |
| }, | |
| checkLeadins: function(e) { | |
| return 0 === this.leadins.length || _.any(this.leadins, function(t) { | |
| return t.test(e) | |
| }) | |
| } | |
| }, e.exports = { | |
| findCC: i, | |
| format: a | |
| } | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| CAPABILITY_URL: "https://web.whatsapp.com/browsers.html", | |
| PP_URL: "https://dyn.web.whatsapp.com/pp", | |
| LOGOUT_URL: "https://dyn.web.whatsapp.com/logout", | |
| STATUS_URL: "https://web.whatsapp.com/status.json", | |
| WAM_URL: "https://dyn.web.whatsapp.com/wam", | |
| COOKIE_DOMAIN: ".web.whatsapp.com", | |
| PP_TOK: "/pp", | |
| PP_REF: "/pp", | |
| UPLOAD_TO_CLB: 1, | |
| FLAVOR_TAGS: !1, | |
| WAM_ROTATE_INTERVAL: 3600, | |
| SOCKETS: ["wss://w1.web.whatsapp.com/ws", "wss://w2.web.whatsapp.com/ws", "wss://w3.web.whatsapp.com/ws", "wss://w4.web.whatsapp.com/ws", "wss://w5.web.whatsapp.com/ws", "wss://w6.web.whatsapp.com/ws", "wss://w7.web.whatsapp.com/ws", "wss://w8.web.whatsapp.com/ws"] | |
| }; | |
| e.exports = r | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = function() { | |
| window.Promise = r(317)["default"] = r(316), r(308), window.moment = r(0), window._ = r(142), window.Velocity = r(323), r(324), window.WebFont = r(325), window.CryptoJS = r(17), r(320), r(133), r(319), r(318), r(315); | |
| var e = window.performance.now(); | |
| r(312), window.applicationCache && r(311), r(314), ["getSelection", "open", "focus"].forEach(function(e) { | |
| var t = Object.getPrototypeOf(window)[e]; | |
| _.isFunction(t) && window[e] !== t && (window[e] = t) | |
| }), window.Store = { | |
| Conn: r(143), | |
| Contact: r(310), | |
| Stream: r(53), | |
| Wap: r(30) | |
| }; | |
| var t = r(40), | |
| n = r(9); | |
| window.Debug || (window.Debug = {}), window.Debug.uploadLogs = n.upload.bind(n), t.isGecko || WebFont.load({ | |
| google: { | |
| families: ["Open Sans:400,600", "Roboto:300,400,500"] | |
| } | |
| }), window.l10n = r(313), l10n.init(r(13).getLangPref()); | |
| var o = r(1); | |
| window.onerror = function(e, t, r, i, a) { | |
| var s = void 0; | |
| return s = t && "number" == typeof r ? " (" + t + ":" + r + ":" + i + ")" : t ? " (" + t + ")" : "", o.error("exe:onerror" + s + " " + e)(a), "Script error." !== e || a ? (a instanceof Error && a.stack ? (o.errorVerbose("exe:unhandled error: " + a.stack)(), n.upload(null)) : (o.error("exe:unhandled error: " + (e || "Given: " + a))(), n.upload(null)), !0) : (t && n.upload("script-error"), !1) | |
| }, Promise.onPossiblyUnhandledRejection = function(e, t) { | |
| o.error("exe:unhandled rejection: " + e)(), e && e.stack && o.error("exe:unhandled stack: " + e.stack)(), o.error("exe:unhandled promise: " + t)(t), e instanceof Error && e.stack ? (o.errorVerbose(e.stack)(), n.upload(null)) : n.upload("unhandled-rejection") | |
| }; | |
| var i = r(309), | |
| a = r(6); | |
| window.Debug.VERSION = a.VERSION_STR; | |
| var s = r(14); | |
| window.onbeforeunload = function(e) { | |
| return s.isDownloading() ? void s.clearDownloading() : (o.log("webclient close/reload triggered")(), o.log("latest hash: " + a.LATEST_HASH)(), o.log("version: " + a.VERSION_STR)(), s.promptUnloadGuards > 0 ? void 0 : i.hasPending() ? l10n.t("confirm_closing_webclient") : void 0) | |
| }, window.addEventListener("dragover", function(e) { | |
| e.preventDefault() | |
| }), window.addEventListener("drop", function(e) { | |
| e.preventDefault() | |
| }); | |
| var d = r(24), | |
| c = r(5); | |
| d.render(c.createElement(i, null), document.getElementById("app")); | |
| try { | |
| r(89).PageLoad.set({ | |
| webcExeStart: 0 | e, | |
| webcExeDone: 0 | window.performance.now() | |
| }) | |
| } catch (u) {} | |
| }; | |
| window.Exe = n, r(90) | |
| }, , function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(24), | |
| i = r(72), | |
| a = r(70), | |
| s = r(139), | |
| d = r(144), | |
| c = r(136), | |
| u = c.HotKeys, | |
| l = r(92), | |
| f = { | |
| MEDIA: "media", | |
| MAIN: "main" | |
| }, | |
| h = n.createClass({ | |
| displayName: "ModalManager", | |
| mixins: [i, s], | |
| propTypes: { | |
| type: n.PropTypes.oneOf(_.values(f)).isRequired | |
| }, | |
| statics: { | |
| DEFAULT_TRANSITION: "modal" | |
| }, | |
| getInitialState: function() { | |
| return { | |
| flow: null | |
| } | |
| }, | |
| componentWillMount: function() { | |
| this.props.type === f.MAIN ? (this.regCmd("open_modal", this.openFlow), this.regCmd("close_modal", this.closeFlow)) : (this.regCmd("open_modal_media", this.openFlow), this.regCmd("close_modal_media", this.closeFlow)) | |
| }, | |
| openFlow: function(e, t, r, n) { | |
| this.uimPush(this, this.props.type === f.MAIN ? a.MODAL : a.MODAL_MEDIA, { | |
| escapable: !n, | |
| parent: r, | |
| maintainFocus: !0 | |
| }), this.setState({ | |
| flow: e, | |
| transition: t | |
| }, this.focus) | |
| }, | |
| focus: function() { | |
| var e = o.findDOMNode(this); | |
| e.contains(document.activeElement) || a.focusNode(e) | |
| }, | |
| closeFlow: function() { | |
| this.uimPop(this.props.type === f.MAIN ? a.MODAL : a.MODAL_MEDIA) | |
| }, | |
| uimClose: function() { | |
| this.setState({ | |
| flow: null, | |
| transition: this.state.transition | |
| }) | |
| }, | |
| uimFocus: function() { | |
| this.focus() | |
| }, | |
| onKeyPress: function(e) { | |
| if (!e.metaKey && !e.ctrlKey) { | |
| var t = o.findDOMNode(this); | |
| if (t === document.activeElement) { | |
| var r = _.toArray(t.querySelectorAll("input[data-tab]")); | |
| if (r.length) { | |
| var n = _.first(r); | |
| u.flashFocus = Date.now(), n.restoreFocus ? n.restoreFocus() : a.focusNode(n) | |
| } | |
| } | |
| } | |
| }, | |
| onRotateFocus: function(e) { | |
| var t = 1; | |
| e && (e.stopPropagation(), e.preventDefault(), t = e.shiftKey ? -1 : 1, u.flashFocus = Date.now()); | |
| var r = _.toArray(o.findDOMNode(this).querySelectorAll("[data-tab]")); | |
| if (r.length) { | |
| r = _.sortBy(r, function(e) { | |
| return parseInt(e.getAttribute("data-tab"), 10) || 0 | |
| }); | |
| var n = 0, | |
| i = document.activeElement; | |
| i && (n = d.ring(_.findIndex(r, function(e) { | |
| return e.contains(i) | |
| }) + t, r)); | |
| var s = r[n]; | |
| u.flashFocus = Date.now(), s.restoreFocus ? s.restoreFocus() : a.focusNode(s) | |
| } | |
| }, | |
| render: function() { | |
| var e, t, r = this.state.transition; | |
| r = _.isBoolean(r) && !r ? void 0 : r || h.DEFAULT_TRANSITION, this.state.flow && (r ? t = this.state.flow : e = this.state.flow); | |
| var o = { | |
| tab: this.onRotateFocus, | |
| "shift+tab": this.onRotateFocus | |
| }; | |
| return n.createElement(u, { | |
| handlers: o, | |
| onKeyPress: this.onKeyPress | |
| }, e, n.createElement(l, { | |
| transitionName: r | |
| }, t)) | |
| } | |
| }); | |
| e.exports = h | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(44), | |
| i = n.createClass({ | |
| displayName: "Offline", | |
| render: function() { | |
| return n.createElement(o, { | |
| title: l10n.t("computer_not_connected"), | |
| body: l10n.t("make_sure_computer_active_internet_connection") | |
| }) | |
| } | |
| }); | |
| e.exports = i | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n() { | |
| window.open("https://www.whatsapp.com/faq/web/28080002#proxies", "_blank") | |
| } | |
| var o = r(5), | |
| i = r(44), | |
| a = o.createClass({ | |
| displayName: "Proxied", | |
| render: function() { | |
| return o.createElement(i, { | |
| title: l10n.t("cant_load_whatsapp"), | |
| body: l10n.t("computer_behind_proxy"), | |
| defaultLabel: l10n.t("learn_more"), | |
| onDefault: n | |
| }) | |
| } | |
| }); | |
| e.exports = a | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(24), | |
| i = r(10), | |
| a = r(13), | |
| s = r(91), | |
| d = r(30), | |
| c = r(137), | |
| u = r(6), | |
| l = r(8), | |
| f = r(326), | |
| h = r(98), | |
| p = r(34), | |
| m = r(45), | |
| g = r(14), | |
| v = r(39), | |
| y = r(92), | |
| b = r(338), | |
| w = n.createClass({ | |
| displayName: "QRCode", | |
| mixins: [s], | |
| getInitialState: function() { | |
| return { | |
| rememberMe: a.getRememberMe(), | |
| expired: i.state === i.STATE.UNPAIRED_IDLE, | |
| offline: !h.online, | |
| refValid: i.state === i.STATE.UNPAIRED | |
| } | |
| }, | |
| componentDidMount: function() { | |
| this.addObserver(i, "change:state change:online", this.onStateChange) | |
| }, | |
| onStateChange: function() { | |
| this.setState({ | |
| offline: !h.online, | |
| expired: i.state === i.STATE.UNPAIRED_IDLE, | |
| refValid: i.state === i.STATE.UNPAIRED | |
| }) | |
| }, | |
| onQRExpiry: function() { | |
| this.setState({ | |
| ref: void 0 | |
| }), i.poke() | |
| }, | |
| onRememberMeChange: function(e) { | |
| i.isIncognito || d.setRememberMe(e.target.checked)["catch"](_.noop), a.setRememberMe(e.target.checked), this.setState({ | |
| rememberMe: a.getRememberMe() | |
| }) | |
| }, | |
| render: function() { | |
| var e = void 0; | |
| e = this.state.offline ? n.createElement(E, null, n.createElement("button", { | |
| className: "qr-button", | |
| key: "expiry" | |
| }, n.createElement("div", { | |
| className: "icon icon-connection-l-light" | |
| }), l10n.t("check_internet_connection"))) : this.state.expired ? n.createElement(E, null, n.createElement("button", { | |
| className: "qr-button", | |
| key: "expiry", | |
| onClick: this.onQRExpiry | |
| }, n.createElement("div", { | |
| className: "qr-container" | |
| }, n.createElement("div", { | |
| className: "icon icon-refresh-l-light" | |
| }), l10n.t("click_to_reload_qr_code")))) : this.state.refValid ? n.createElement(E, null) : n.createElement("div", { | |
| className: "qrcode" | |
| }, n.createElement(c, null)); | |
| var t = this.state.rememberMe ? null : n.createElement("div", { | |
| className: "remember-me-tip" | |
| }, l10n.t("if_unchecked_you_will_be_logged_out_afterawhile")); | |
| return n.createElement("div", { | |
| id: "wrapper" | |
| }, n.createElement("div", { | |
| id: "window" | |
| }, n.createElement("div", { | |
| className: "entry-main" | |
| }, e, n.createElement("div", { | |
| className: "entry-text" | |
| }, n.createElement("div", { | |
| className: "entry-title" | |
| }, l10n.t("whatsapp_web")), n.createElement("div", { | |
| className: "entry-subtitle" | |
| }, l10n.t("scan_code_with_phone_to_login")), n.createElement("div", { | |
| className: "entry-controls" | |
| }, n.createElement("div", { | |
| className: "toggle" | |
| }, n.createElement(y, { | |
| transitionName: "fade_sifo" | |
| }, t), n.createElement("label", null, n.createElement("input", { | |
| type: "checkbox", | |
| name: "rememberMe", | |
| checked: this.state.rememberMe, | |
| onChange: this.onRememberMeChange | |
| }), l10n.t("menuitem_keep_me_signed_in"))), n.createElement("div", { | |
| className: "hint" | |
| }, l10n.t("reduce_data_usage_connect_phone_to_wifi"))))), n.createElement("div", { | |
| id: "platforms" | |
| }, n.createElement("ul", { | |
| className: "list entry-platforms" | |
| }, n.createElement(S, { | |
| platform: "android", | |
| path: l10n.t("android_login_path"), | |
| name: l10n.t("android") | |
| }), n.createElement(S, { | |
| platform: "iphone", | |
| path: l10n.t("iphone_login_path"), | |
| name: l10n.t("iphone") | |
| }), n.createElement(S, { | |
| platform: "wp", | |
| path: l10n.t("windows_phone_login_path"), | |
| name: l10n.t("windows_phone") | |
| }), n.createElement(S, { | |
| platform: "bb", | |
| path: l10n.t("blackberry_login_path"), | |
| name: l10n.t("blackberry") | |
| }), n.createElement(S, { | |
| platform: "bb10", | |
| path: l10n.t("bb10_login_path"), | |
| name: l10n.t("bb10") | |
| }), n.createElement(S, { | |
| platform: "s60", | |
| path: l10n.t("nokia_symbian_s60_login_path"), | |
| name: l10n.t("nokia_symbian_s60") | |
| }))))) | |
| } | |
| }), | |
| E = n.createClass({ | |
| displayName: "QR", | |
| mixins: [s], | |
| propTypes: { | |
| children: n.PropTypes.element | |
| }, | |
| getInitialState: function() { | |
| return { | |
| disableCursor: !1 | |
| } | |
| }, | |
| componentDidMount: function() { | |
| this.addObserverAndRun(Store.Conn, "change:ref", this.genQR) | |
| }, | |
| genQR: function() { | |
| var e = this.getData(); | |
| if (e) { | |
| var t = o.findDOMNode(this); | |
| this.qr ? this.qr.makeCode(e) : this.qr = new b(t, { | |
| text: e, | |
| colorDark: "#122e31", | |
| width: u.QR_EDGE, | |
| height: u.QR_EDGE, | |
| correctLevel: b.CorrectLevel.L | |
| }), t.removeAttribute("title"), t.setAttribute("data-ref", e) | |
| } | |
| }, | |
| getData: function() { | |
| if (!Store.Conn.connected) { | |
| var e = Store.Conn.ref, | |
| t = m.getOrGenerate(), | |
| r = g.id(); | |
| return e + "," + t + "," + r | |
| } | |
| }, | |
| copy: function() { | |
| var e = window.getSelection(); | |
| e.selectAllChildren(document.getElementById("qr-code-copy")), document.execCommand("copy"), l.closeModal() | |
| }, | |
| onMouseMove: function(e) { | |
| var t = this; | |
| this.state.disableCursor && this.setState({ | |
| disableCursor: !1 | |
| }), this.disableCursorPromise && this.disableCursorPromise.cancel(), this.disableCursorPromise = p.delay(1e3).cancellable().then(function(e) { | |
| t.isMounted() && t.setState({ | |
| disableCursor: !0 | |
| }) | |
| })["finally"](function() { | |
| t.isMounted() && (t.disableCursorPromise = void 0) | |
| })["catch"](Promise.CancellationError, _.noop) | |
| }, | |
| onMouseLeave: function(e) { | |
| this.disableCursorPromise && this.disableCursorPromise.cancel() | |
| }, | |
| onContextMenu: function(e) { | |
| e.stopPropagation(), e.preventDefault(), l.openModal(n.createElement(f, { | |
| onOK: this.copy, | |
| okText: "Copy to Clibboard" | |
| }, n.createElement("span", { | |
| id: "qr-code-copy" | |
| }, this.state.data))) | |
| }, | |
| render: function() { | |
| var e = this.props.children, | |
| t = v("qrcode", { | |
| idle: !!e | |
| }), | |
| r = {}; | |
| this.state.disableCursor && !e && (r.cursor = "none"); | |
| var o = null; | |
| return n.createElement("div", { | |
| className: t, | |
| onContextMenu: o, | |
| style: r, | |
| onMouseMove: this.onMouseMove, | |
| onMouseLeave: this.onMouseLeave | |
| }, n.createElement(y, { | |
| transitionName: "scale" | |
| }, e), n.createElement("span", { | |
| className: "icon icon-logo" | |
| })) | |
| } | |
| }), | |
| S = n.createClass({ | |
| displayName: "LoginPlatform", | |
| propTypes: { | |
| platform: n.PropTypes.oneOf(["android", "iphone", "bb", "wp", "bb10", "s60"]).isRequired, | |
| name: n.PropTypes.string.isRequired, | |
| path: n.PropTypes.string.isRequired | |
| }, | |
| render: function() { | |
| var e = "icon icon-platform icon-platform-" + this.props.platform; | |
| return n.createElement("li", { | |
| className: "list-item entry-platform" | |
| }, n.createElement("span", { | |
| className: e, | |
| title: this.props.name | |
| }), n.createElement("div", null, n.createElement("div", { | |
| className: "entry-platform-title" | |
| }, this.props.name), n.createElement("div", { | |
| className: "entry-platform-text" | |
| }, this.props.path))) | |
| } | |
| }); | |
| e.exports = w | |
| }, function(e, t, r) { | |
| "use strict"; | |
| function n(e, t) { | |
| return Promise.any(t).cancellable().then(function() { | |
| e.forceTimeout() | |
| })["finally"](function() { | |
| t.forEach(function(e) { | |
| e.cancel() | |
| }) | |
| })["catch"](Promise.CancellationError, _.noop) | |
| } | |
| function o() { | |
| return m.waitForEvent(window, "online").then(function() { | |
| return Promise.delay(y) | |
| }) | |
| } | |
| function i(e) { | |
| var t, r, n = e.data; | |
| if (n instanceof ArrayBuffer) { | |
| for (var o, i = [], a = u.wrap(n); 44 !== (o = a.readByte());) i.push(o); | |
| t = String.fromCharCode.apply(String, i), r = a | |
| } else { | |
| var s = n.indexOf(","); | |
| t = n.slice(0, s), r = n.slice(s + 1), r = r ? JSON.parse(r) : r | |
| } | |
| return { | |
| tag: t, | |
| data: r | |
| } | |
| } | |
| var a, s, d = r(6), | |
| c = r(43), | |
| u = r(7), | |
| l = r(98), | |
| f = r(8), | |
| h = r(1), | |
| p = r(9), | |
| m = r(25), | |
| g = r(153), | |
| v = r(97), | |
| y = 100, | |
| b = 3e5, | |
| w = 6e3, | |
| E = 2, | |
| S = .2, | |
| N = g.FIBONACCI(8e3, 4e3, 3e5), | |
| T = c.extend({ | |
| props: { | |
| active: { | |
| type: "boolean", | |
| "default": !0 | |
| }, | |
| socket: "object", | |
| sockets: "object", | |
| attempts: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| startId: { | |
| type: "number", | |
| "default": 0 | |
| }, | |
| controller: "object", | |
| retryTimestamp: "number", | |
| tsListener: "function", | |
| onerror: "function", | |
| _resolve: "function", | |
| _reject: "function" | |
| }, | |
| initialize: function() { | |
| var e = this; | |
| "undefined" == typeof a && (a = d.SOCKETS, s = Date.now() % a.length), this.sockets = [], new Promise(function(t, r) { | |
| e._resolve = t, e._reject = r | |
| }).then(function(t) { | |
| h.log("SocketOpener set to socket " + t.id)(), e.set({ | |
| active: !1, | |
| socket: t | |
| }), l.online = !0 | |
| })["finally"](function() { | |
| e.stopListening(), h.log("SocketOpener closing socket opener")(), e.active = !1, _.forEach(e.sockets, function(e) { | |
| e.cancel() | |
| }); | |
| var t = e.controller; | |
| t && (t.deactivate(), e.controller = null) | |
| })["catch"](Promise.CancellationError, _.noop)["catch"](function(t) { | |
| return h.error("SocketOpener deadly error! " + t)(t), e.onerror ? void e.onerror(t) : Promise.reject(t) | |
| }), this.tsListener = function(t) { | |
| e.retryTimestamp = t.ts | |
| }, this.listenTo(l, "change:online", this.onOnlineChange), this.onOnlineChange() | |
| }, | |
| attemptOpen: function() { | |
| if (!this.active) return h.log("attemptOpen called while not active!")(), void p.upload("rogue-opener"); | |
| var e = v.numSocketsAttempted, | |
| t = v.open({ | |
| url: a[(e + s) % a.length], | |
| msgParser: i | |
| }); | |
| this.attempts = this.sockets.push(t); | |
| var r = _.once(function() { | |
| l.checkOnline() | |
| }), | |
| n = _.delay(r, 6e3); | |
| t.then(this._resolve)["finally"](function() { | |
| return clearTimeout(n) | |
| })["catch"](Promise.CancellationError, _.noop)["catch"](r) | |
| }, | |
| poke: function() { | |
| this.controller && this.controller.forceTimeout() | |
| }, | |
| onOnlineChange: function() { | |
| if (this.active) { | |
| var e = this.controller, | |
| t = l.online ? this.onlineController() : this.offlineController(); | |
| e && (e.off("change:ts", this.tsListener), e.deactivate()), t.on("change:ts", this.tsListener), t.activate(), this.controller = t | |
| } | |
| }, | |
| onlineController: function() { | |
| var e = this; | |
| return h.log("SocketOpener:onlineController activating")(), new g({ | |
| waitAlgorithm: N, | |
| jitter: S, | |
| onActivated: function() { | |
| e.attemptOpen() | |
| }, | |
| onTimeout: function() { | |
| return e.attemptOpen(), !0 | |
| } | |
| }) | |
| }, | |
| offlineController: function() { | |
| var e = this; | |
| h.log("SocketOpener:offlineController activating")(); | |
| var t = 0, | |
| r = void 0, | |
| i = function(e) { | |
| return r && r.cancel(), navigator.onLine ? t++ < E ? (h.log("SocketOpener:offline... quick poll")(), r = null, w) : (h.log("SocketOpener:offline... heuristic poll")(), r = n(e, [o(), m.waitForBBEvent(f, "js_halt_detected"), m.waitForBBEvent(Store.Stream, "change:available")]), b) : (h.log("SocketOpener:offline... wait for navigator")(), t = 0, r = n(e, [o()]), b) | |
| }; | |
| return new g({ | |
| waitAlgorithm: i, | |
| jitter: S, | |
| onActivated: function() { | |
| 0 === e.pendingAttempts() && e.attemptOpen() | |
| }, | |
| onDeactivated: function() { | |
| r && r.cancel() | |
| }, | |
| onTimeout: function() { | |
| return e.attemptOpen(), !0 | |
| } | |
| }) | |
| }, | |
| deactivate: function() { | |
| this._reject(new Promise.CancellationError) | |
| }, | |
| pendingAttempts: function() { | |
| return _.sum(this.sockets, function(e) { | |
| return e.isPending() ? 1 : 0 | |
| }) | |
| } | |
| }); | |
| e.exports = T | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(137), | |
| i = r(10), | |
| a = r(53), | |
| s = r(135), | |
| d = r(91), | |
| c = r(72), | |
| u = r(44), | |
| l = 80, | |
| f = 5, | |
| h = (100 - l) / f, | |
| p = n.createClass({ | |
| displayName: "Startup", | |
| mixins: [s, d, c], | |
| getInitialState: function() { | |
| return { | |
| retriable: !1, | |
| progress: l | |
| } | |
| }, | |
| componentWillMount: function() { | |
| var e = this; | |
| this.addObserver(a, "change:displayInfo"), this.addObserver(i, "change:retryTimestamp", this.retried), this.regCmd("increment_progress", function() { | |
| var t = e.state.progress + h; | |
| e.setState({ | |
| progress: t | |
| }) | |
| }) | |
| }, | |
| retried: function() { | |
| this.clearSafeTimeout(this.timeout), delete this.timeout, this.clearSafeInterval(this.interval), delete this.interval, this.setState({ | |
| retriable: !1 | |
| }), this.startTimeout() | |
| }, | |
| componentDidMount: function() { | |
| this.startTimeout(); | |
| var e = document.getElementById("initial_startup"); | |
| e && e.parentNode.removeChild(e) | |
| }, | |
| startTimeout: function() { | |
| this.timeout = this.safeDelay(this.allowRetry, 3e3) | |
| }, | |
| allowRetry: function() { | |
| this.setState({ | |
| retriable: !0 | |
| }), this.interval = this.safeInterval(this.forceUpdate, 1e3) | |
| }, | |
| retry: function(e) { | |
| i.poke(), this.retried() | |
| }, | |
| logout: function(e) { | |
| i.logout() | |
| }, | |
| render: function() { | |
| var e, t, r, s, d, c, l = null; | |
| switch (a.displayInfo) { | |
| case a.INFO.OPENING: | |
| e = l10n.t("connecting_to_whatsapp"), t = l10n.t("make_sure_computer_active_internet_connection"), d = this.logout; | |
| break; | |
| case a.INFO.PAIRING: | |
| case a.INFO.TIMEOUT: | |
| e = l10n.t("trying_to_reach_phone"); | |
| var f = window.open.bind(window, "http://www.whatsapp.com/faq/web/28080002", "_blank"); | |
| t = n.createElement("span", null, l10n.t("make_sure_phone_active_internet_connection"), " ", n.createElement("span", { | |
| className: "action", | |
| onClick: f | |
| }, l10n.t("learn_more"))), d = this.logout; | |
| break; | |
| case a.INFO.SYNCING: | |
| case a.INFO.CONNECTING: | |
| return n.createElement("div", { | |
| id: "startup" | |
| }, n.createElement(o, { | |
| size: 50, | |
| stroke: 4 | |
| }), l); | |
| default: | |
| return null | |
| } | |
| if (c = this.state.retriable) | |
| if (r = i.retryTimestamp - Date.now(), 1 > r) s = l10n.t("retrying"), _.defer(function() { | |
| return i.poke() | |
| }); | |
| else if (6e4 > r) { | |
| var h = Math.ceil(r / 1e3); | |
| s = l10n.t("retrying_in_some_seconds", { | |
| number: h, | |
| _plural: h | |
| }) | |
| } else s = l10n.t("retrying_in", { | |
| duration: moment.duration(r).humanize() | |
| }); | |
| else s = l10n.t("retrying"); | |
| return n.createElement(u, { | |
| title: e, | |
| body: s, | |
| tip: t, | |
| defaultLabel: l10n.t("retry_now"), | |
| onDefault: c ? this.retry : _.noop, | |
| cancelLabel: d ? l10n.t("menuitem_logout") : null, | |
| onCancel: d | |
| }) | |
| } | |
| }); | |
| e.exports = p | |
| }, function(e, t) { | |
| "use strict"; | |
| function r(e, t) { | |
| d[e] || (d[e] = []), -1 === d[e].indexOf(t) && d[e].push(t) | |
| } | |
| function n(e, t) { | |
| if (d[e]) { | |
| var r = d[e].indexOf(t); - 1 !== r && d[e].splice(r, 1) | |
| } | |
| } | |
| function o(e, t, r, n) { | |
| d[e] && d[e].forEach(function(e) { | |
| return e.call(null, t, r, n) | |
| }) | |
| } | |
| function i(e, t, r, n) { | |
| if (e) { | |
| var o = void 0; | |
| if (self.MessageChannel && n) { | |
| var i = new MessageChannel; | |
| i.port1.onmessage = n, o = [i.port2] | |
| } | |
| e.postMessage({ | |
| command: t, | |
| message: r, | |
| version: "0.2.532" | |
| }, o) | |
| } | |
| } | |
| function a(e, t, r) { | |
| e.forEach(function(e) { | |
| return i(e, t, r) | |
| }) | |
| } | |
| function s(e) { | |
| if (self.window && e.source !== navigator.serviceWorker.controller) o("log", { | |
| buffer: [{ | |
| level: "error", | |
| message: ["Invalid message received from a service worker, sw origin: " + e.origin, e.data] | |
| }] | |
| }); | |
| else { | |
| var t = e.data.command || "unknown", | |
| r = void 0; | |
| e.ports && 0 !== e.ports.length && (r = function(t) { | |
| e.ports.forEach(function(e) { | |
| return e.postMessage(t) | |
| }) | |
| }), o(t, e.data.message, r, e.data.version) | |
| } | |
| } | |
| var d = { | |
| unknown: [] | |
| }, | |
| c = self.window ? self.navigator.serviceWorker : self; | |
| try { | |
| c.addEventListener("message", s) | |
| } catch (u) {} | |
| e.exports = { | |
| on: r, | |
| off: n, | |
| trigger: o, | |
| send: i, | |
| broadcast: a | |
| } | |
| }, function(e, t, r) { | |
| "use strict"; | |
| var n = r(5), | |
| o = r(10), | |
| i = r(44), | |
| a = n.createClass({ | |
| displayName: "TOS", | |
| render: function() { | |
| return n.createElement(i, { | |
| body: l10n.t("web_terms_of_service_login_block"), | |
| cancelLabel: l10n.t("menuitem_logout"), | |
| onCancel: o.logout.bind(o, !0), | |
| defaultLabel: l10n.t("login"), | |
| onDefault: o.poke.bind(o) | |
| }) | |
| } | |
| }); | |
| e.exports = a | |
| }, function(e, t) { | |
| "use strict"; | |
| function r(e, t) { | |
| if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") | |
| } | |
| var n = function() { | |
| function e(e, t) { | |
| for (var r = 0; r < t.length; r++) { | |
| var n = t[r]; | |
| n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n) | |
| } | |
| } | |
| return function(t, r, n) { | |
| return r && e(t.prototype, r), n && e(t, n), t | |
| } | |
| }(), | |
| o = function() { | |
| function e() { | |
| r(this, e), this.activeNotifications = {} | |
| } | |
| return n(e, [{ | |
| key: "showNotification", | |
| value: function(e, t, r) { | |
| this.activeNotifications[e] || (this.activeNotifications[e] = {}); | |
| var n = this.activeNotifications[e][t]; | |
| n && n.close && n.close(), this.activeNotifications[e][t] = r | |
| } | |
| }, { | |
| key: "closeNotification", | |
| value: function(e) { | |
| var t = _.findKey(this.activeNotifications, function(t) { | |
| return !!t[e] | |
| }); | |
| if (t) { | |
| var r = this.activeNotifications[t][e]; | |
| r.close && r.close(), delete this.activeNotifications[t][e], _.isEmpty(this.activeNotifications[t]) && delete this.activeNotifications[t] | |
| } | |
| } | |
| }, { | |
| key: "closeChatNotifications", | |
| value: function(e) { | |
| _.forEach(this.activeNotifications[e], function(e, t) { | |
| e && e.close && e.close() | |
| }), delete this.activeNotifications[e] | |
| } | |
| }, { | |
| key: "closeAllNotifications", | |
| value: function() { | |
| _.forEach(this.activeNotifications, function(e, t) { | |
| _.forEach(e, function(e, t) { | |
| e && e.close && e.close() | |
| }) | |
| }), this.activeNotifications = {} | |
| } | |
| }]), e | |
| }(); | |
| e.exports = o | |
| }, function(e, t) { | |
| "use strict"; | |
| e.exports = { | |
| setCookie: function(e, t) { | |
| var r = ["name", "value", "domain", "path", "secure", "session", "expirationDate"]; | |
| e.session && delete e.expirationDate; | |
| var n = []; | |
| _.forEach(r, function(t) { | |
| var r = e[t]; | |
| if (void 0 !== r && "value" !== t) switch (t) { | |
| case "expirationDate": | |
| var o = new Date(e.expirationDate); | |
| n.push("expires=" + o.toUTCString()); | |
| break; | |
| case "secure": | |
| n.push("secure"); | |
| break; | |
| case "name": | |
| var i = e.value || ""; | |
| n.push(r + "=" + i); | |
| break; | |
| default: | |
| n.push(t + "=" + r) | |
| } | |
| }), document.cookie = n.join(";") | |
| } | |
| } | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = { | |
| LOW: "low", | |
| HIGH: "high" | |
| }, | |
| n = window.matchMedia("\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and (min-device-pixel-ratio: 2),\n only screen and (min-resolution: 2dppx)\n"), | |
| o = { | |
| RES: r, | |
| currentRes: n.matches ? r.HIGH : r.LOW | |
| }, | |
| i = function(e) { | |
| var t = e.matches ? r.HIGH : r.LOW; | |
| if (t !== o.currentRes) { | |
| o.currentRes = t; | |
| var n = document.createEvent("Event"); | |
| n.initEvent("dpichange", !0, !0), window.dispatchEvent(n) | |
| } | |
| }; | |
| n.addListener(i), e.exports = o | |
| }, function(e, t) { | |
| "use strict"; | |
| function r(e) { | |
| this.styleSheet = this.createStyleSheet(e), this.rules = {} | |
| } | |
| r.prototype.createStyleSheet = function(e) { | |
| e = e || _.uniqueId("dynamic-style-"); | |
| var t = document.createElement("style"); | |
| return t.id = e, t.type = "text/css", document.head.appendChild(t), t = t.sheet | |
| }, r.prototype.addRule = function(e, t) { | |
| var r = this.styleSheet.cssRules.length; | |
| return t = _.map(t, function(e, t) { | |
| return t + ": " + e + ";" | |
| }).join(" "), this.styleSheet.insertRule(e + " { " + t + " }", r), this.rules[e] = this.styleSheet.cssRules[r], this.rules[e] | |
| }, r.prototype.updateRule = function(e, t) { | |
| var r = this.rules[e]; | |
| return _.forEach(t, function(e, t) { | |
| r.style[_.camelCase(t)] = e | |
| }), r | |
| }, r.prototype.setRule = function(e, t) { | |
| var r = this.rules[e]; | |
| return r ? this.updateRule(e, t) : this.addRule(e, t) | |
| }, e.exports = r | |
| }, function(e, t) { | |
| "use strict"; | |
| e.exports = { | |
| "": "ordered0001", | |
| "": "ordered0003", | |
| "": "ordered0004", | |
| "": "ordered0005", | |
| "": "ordered0006", | |
| "": "ordered0007", | |
| "": "ordered0008", | |
| "": "ordered0009", | |
| "": "ordered0010", | |
| "": "ordered0011", | |
| "": "ordered0012", | |
| "": "ordered0013", | |
| "": "ordered0014", | |
| "": "ordered0015", | |
| "": "ordered0016", | |
| "": "ordered0017", | |
| "": "ordered0018", | |
| "": "ordered0019", | |
| "": "ordered0020", | |
| "": "ordered0021", | |
| "": "ordered0022", | |
| "": "ordered0023", | |
| "": "ordered0024", | |
| "": "ordered0025", | |
| "": "ordered0026", | |
| "": "ordered0027", | |
| "": "ordered0028", | |
| "": "ordered0030", | |
| "": "ordered0031", | |
| "": "ordered0032", | |
| "": "ordered0033", | |
| "": "ordered0037", | |
| "": "ordered0040", | |
| "": "ordered0044", | |
| "": "ordered0045", | |
| "": "ordered0046", | |
| "": "ordered0047", | |
| "": "ordered0048", | |
| "": "ordered0049", | |
| "": "ordered0050", | |
| "": "ordered0051", | |
| "": "ordered0052", | |
| "": "ordered0053", | |
| "": "ordered0054", | |
| "": "ordered0058", | |
| "": "ordered0059", | |
| "": "ordered0060", | |
| "": "ordered0061", | |
| "": "ordered0063", | |
| "": "ordered0078", | |
| "": "ordered0079", | |
| "": "ordered0080", | |
| "": "ordered0081", | |
| "": "ordered0082", | |
| "": "ordered0083", | |
| "": "ordered0084", | |
| "": "ordered0085", | |
| "": "ordered0086", | |
| "": "ordered0087", | |
| "": "ordered0088", | |
| "": "ordered0089", | |
| "": "ordered0090", | |
| "": "ordered0091", | |
| "": "ordered0092", | |
| "": "ordered0093", | |
| "": "ordered0094", | |
| "": "ordered0095", | |
| "": "ordered0096", | |
| "": "ordered0097", | |
| "": "ordered0099", | |
| "": "ordered0106", | |
| "": "ordered0107", | |
| "": "ordered0108", | |
| "": "ordered0109", | |
| "": "ordered0112", | |
| "": "ordered0113", | |
| "": "ordered0114", | |
| "": "ordered0115", | |
| "": "ordered0117", | |
| "": "ordered0121", | |
| "": "ordered0123", | |
| "": "ordered0126", | |
| "": "ordered0127", | |
| "": "ordered0129", | |
| "": "ordered0138", | |
| "": "ordered0139", | |
| "": "ordered0140", | |
| "": "ordered0141", | |
| "": "ordered0142", | |
| "": "ordered0143", | |
| "": "ordered0144", | |
| "": "ordered0150", | |
| "": "ordered0156", | |
| "": "ordered0168", | |
| "": "ordered0169", | |
| "": "ordered0170", | |
| "": "ordered0171", | |
| "": "ordered0174", | |
| "": "ordered0175", | |
| "": "ordered0176", | |
| "": "ordered0177", | |
| "": "ordered0178", | |
| "": "ordered0179", | |
| "": "ordered0180", | |
| "": "ordered0181", | |
| "": "ordered0182", | |
| "": "ordered0183", | |
| "": "ordered0184", | |
| "": "ordered0186", | |
| "": "ordered0187", | |
| "": "ordered0188", | |
| "": "ordered0189", | |
| "": "ordered0190", | |
| "": "ordered0191", | |
| "": "ordered0192", | |
| "": "ordered0193", | |
| "": "ordered0194", | |
| "": "ordered0195", | |
| "": "ordered0196", | |
| "": "ordered0197", | |
| "": "ordered0198", | |
| "": "ordered0199", | |
| "": "ordered0200", | |
| "": "ordered0201", | |
| "": "ordered0202", | |
| "": "ordered0203", | |
| "": "ordered0204", | |
| "": "ordered0205", | |
| "": "ordered0206", | |
| "": "ordered0207", | |
| "": "ordered0208", | |
| "": "ordered0209", | |
| "": "ordered0210", | |
| "": "ordered0211", | |
| "": "ordered0212", | |
| "": "ordered0213", | |
| "": "ordered0214", | |
| "": "ordered0215", | |
| "": "ordered0216", | |
| "": "ordered0217", | |
| "": "ordered0218", | |
| "": "ordered0219", | |
| "": "ordered0220", | |
| "": "ordered0221", | |
| "": "ordered0222", | |
| "": "ordered0269", | |
| "": "ordered0278", | |
| "": "ordered0289", | |
| "": "ordered0297", | |
| "": "ordered0299", | |
| "": "ordered0332", | |
| "": "ordered0336", | |
| "": "ordered0344", | |
| "": "ordered0412", | |
| "": "ordered0452", | |
| "": "ordered0470", | |
| "": "ordered0471", | |
| "": "ordered0472", | |
| "": "ordered0473", | |
| "": "ordered0474", | |
| "": "ordered0475", | |
| "": "ordered0476", | |
| "": "ordered0477", | |
| "": "ordered0478", | |
| "": "ordered0479", | |
| "": "ordered0480", | |
| "": "ordered0481", | |
| "": "ordered0482", | |
| "": "ordered0483", | |
| "": "ordered0484", | |
| "": "ordered0485", | |
| "": "ordered0486", | |
| "": "ordered0487", | |
| "": "ordered0488", | |
| "": "ordered0489", | |
| "": "ordered0490", | |
| "": "ordered0491", | |
| "": "ordered0492", | |
| "": "ordered0493", | |
| "": "ordered0494", | |
| "": "ordered0495", | |
| "": "ordered0496", | |
| "": "ordered0497", | |
| "": "ordered0498", | |
| "": "ordered0499", | |
| "": "ordered0500", | |
| "": "ordered0501", | |
| "": "ordered0502", | |
| "": "ordered0503", | |
| "": "ordered0504", | |
| "": "ordered0505", | |
| "": "ordered0506", | |
| "": "ordered0507", | |
| "": "ordered0508", | |
| "": "ordered0509", | |
| "": "ordered0510", | |
| "": "ordered0511", | |
| "": "ordered0512", | |
| "": "ordered0513", | |
| "": "ordered0514", | |
| "": "ordered0515", | |
| "": "ordered0516", | |
| "": "ordered0517", | |
| "": "ordered0531", | |
| "": "ordered0532", | |
| "": "ordered0533", | |
| "": "ordered0534", | |
| "": "ordered0535", | |
| "": "ordered0536", | |
| "": "ordered0538", | |
| "": "ordered0539", | |
| "": "ordered0540", | |
| "": "ordered0541", | |
| "": "ordered0542", | |
| "": "ordered0543", | |
| "": "ordered0544", | |
| "": "ordered0545", | |
| "": "ordered0546", | |
| "": "ordered0547", | |
| "": "ordered0548", | |
| "": "ordered0549", | |
| "": "ordered0550", | |
| "": "ordered0551", | |
| "": "ordered0552", | |
| "": "ordered0553", | |
| "": "ordered0554", | |
| "": "ordered0555", | |
| "": "ordered0556", | |
| "": "ordered0557", | |
| "": "ordered0558", | |
| "": "ordered0559", | |
| "": "ordered0560", | |
| "": "ordered0561", | |
| "": "ordered0562", | |
| "": "ordered0563", | |
| "": "ordered0564", | |
| "": "ordered0565", | |
| "": "ordered0566", | |
| "": "ordered0567", | |
| "": "ordered0568", | |
| "": "ordered0569", | |
| "": "ordered0570", | |
| "": "ordered0571", | |
| "": "ordered0572", | |
| "": "ordered0573", | |
| "": "ordered0574", | |
| "": "ordered0575", | |
| "": "ordered0576", | |
| "": "ordered0577", | |
| "": "ordered0578", | |
| "": "ordered0579", | |
| "": "ordered0580", | |
| "": "ordered0581", | |
| "": "ordered0582", | |
| "": "ordered0583", | |
| "": "ordered0584", | |
| "": "ordered0585", | |
| "": "ordered0586", | |
| "": "ordered0587", | |
| "": "ordered0588", | |
| "": "ordered0589", | |
| "": "ordered0590", | |
| "": "ordered0591", | |
| "": "ordered0592", | |
| "": "ordered0593", | |
| "": "ordered0594", | |
| "": "ordered0595", | |
| "": "ordered0596", | |
| "": "ordered0597", | |
| "": "ordered0598", | |
| "": "ordered0599", | |
| "": "ordered0600", | |
| "": "ordered0601", | |
| "": "ordered0602", | |
| "": "ordered0603", | |
| "": "ordered0604", | |
| "": "ordered0605", | |
| "": "ordered0606", | |
| "": "ordered0607", | |
| "": "ordered0611", | |
| "": "ordered0612", | |
| "": "ordered0613", | |
| "": "ordered0614", | |
| "": "ordered0615", | |
| "": "ordered0616", | |
| "": "ordered0622", | |
| "": "ordered0623", | |
| "": "ordered0624", | |
| "": "ordered0625", | |
| "": "ordered0626", | |
| "": "ordered0627", | |
| "": "ordered0628", | |
| "": "ordered0629", | |
| "": "ordered0630", | |
| "": "ordered0631", | |
| "": "ordered0632", | |
| "": "ordered0633", | |
| "": "ordered0634", | |
| "": "ordered0635", | |
| "": "ordered0643", | |
| "": "ordered0644", | |
| "": "ordered0645", | |
| "": "ordered0646", | |
| "": "ordered0647", | |
| "": "ordered0648", | |
| "": "ordered0649", | |
| "": "ordered0650", | |
| "": "ordered0651", | |
| "": "ordered0652", | |
| "": "ordered0653", | |
| "": "ordered0654", | |
| "": "ordered0655", | |
| "": "ordered0656", | |
| "": "ordered0657", | |
| "": "ordered0658", | |
| "": "ordered0659", | |
| "": "ordered0660", | |
| "": "ordered0661", | |
| "": "ordered0662", | |
| "": "ordered0663", | |
| "": "ordered0664", | |
| "": "ordered0665", | |
| "": "ordered0666", | |
| "": "ordered0667", | |
| "": "ordered0668", | |
| "": "ordered0669", | |
| "": "ordered0670", | |
| "": "ordered0671", | |
| "": "ordered0672", | |
| "": "ordered0673", | |
| "": "ordered0674", | |
| "": "ordered0675", | |
| "": "ordered0676", | |
| "": "ordered0677", | |
| "": "ordered0678", | |
| "": "ordered0684", | |
| "": "ordered0691", | |
| "": "ordered0692", | |
| "": "ordered0698", | |
| "": "ordered0699", | |
| "": "ordered0700", | |
| "": "ordered0732", | |
| "": "ordered0733", | |
| "": "ordered0734", | |
| "": "ordered0735", | |
| "": "ordered0736", | |
| "": "ordered0737", | |
| "": "ordered0738", | |
| "": "ordered0739", | |
| "": "ordered0740", | |
| "": "ordered0741", | |
| "": "ordered0742", | |
| "": "ordered0743", | |
| "": "ordered0744", | |
| "": "ordered0745", | |
| "": "ordered0746", | |
| "": "ordered0747", | |
| "": "ordered0748", | |
| "": "ordered0761", | |
| "": "ordered0762", | |
| "": "ordered0763", | |
| "": "ordered0764", | |
| "": "ordered0765", | |
| "": "ordered0766", | |
| "": "ordered0767", | |
| "": "ordered0768", | |
| "": "ordered0769", | |
| "": "ordered0770", | |
| "": "ordered0771", | |
| "": "ordered0772", | |
| "": "ordered0773", | |
| "": "ordered0774", | |
| "": "ordered0775", | |
| "": "ordered0776", | |
| "": "ordered0777", | |
| "": "ordered0778", | |
| "": "ordered0779", | |
| "": "ordered0780", | |
| "": "ordered0781", | |
| "": "ordered0782", | |
| "": "ordered0783", | |
| "": "ordered0784", | |
| "": "ordered0785", | |
| "": "ordered0786", | |
| "": "ordered0787", | |
| "": "ordered0788", | |
| "": "ordered0789", | |
| "": "ordered0790", | |
| "": "ordered0791", | |
| "": "ordered0792", | |
| "": "ordered0793", | |
| "": "ordered0794", | |
| "": "ordered0795", | |
| "": "ordered0796", | |
| "": "ordered0797", | |
| "": "ordered0798", | |
| "": "ordered0799", | |
| "": "ordered0800", | |
| "": "ordered0801", | |
| "": "ordered0802", | |
| "": "ordered0803", | |
| "": "ordered0804", | |
| "": "ordered0805", | |
| "": "ordered0806", | |
| "": "ordered0807", | |
| "": "ordered0808", | |
| "": "ordered0809", | |
| "": "ordered0810", | |
| "": "ordered0811", | |
| "": "ordered0812", | |
| "": "ordered0813", | |
| "": "ordered0814", | |
| "": "ordered0815", | |
| "": "ordered0816", | |
| "": "ordered0817", | |
| "": "ordered0818", | |
| "": "ordered0819", | |
| "": "ordered0820", | |
| "": "ordered0821", | |
| "": "ordered0822", | |
| "": "ordered0823", | |
| "": "ordered0825", | |
| "": "ordered0828", | |
| "": "ordered0834", | |
| "": "ordered0840", | |
| "": "ordered0841", | |
| "": "ordered0842", | |
| "": "ordered0848", | |
| "": "ordered0854", | |
| "": "ordered0860", | |
| "": "ordered0866", | |
| "": "ordered0872", | |
| "": "ordered0878", | |
| "": "ordered0884", | |
| "": "ordered0890", | |
| "": "ordered0896", | |
| "": "ordered0902", | |
| "": "ordered0908", | |
| "": "ordered0909", | |
| "": "ordered0910", | |
| "": "ordered0911", | |
| "": "ordered0912", | |
| "": "ordered0913", | |
| "": "ordered0914", | |
| "": "ordered0915", | |
| "": "ordered0916", | |
| "": "ordered0917", | |
| "": "ordered0918", | |
| "": "ordered0919", | |
| "": "ordered0920", | |
| "": "ordered0921", | |
| "": "ordered0922", | |
| "": "ordered0923", | |
| "": "ordered0924", | |
| "": "ordered0925", | |
| "": "ordered0926", | |
| "": "ordered0927", | |
| "": "ordered0928", | |
| "": "ordered0929", | |
| "": "ordered0935", | |
| "": "ordered0941", | |
| "": "ordered0947", | |
| "": "ordered0953", | |
| "": "ordered0968", | |
| "": "ordered0969", | |
| "": "ordered0970", | |
| "": "ordered0971", | |
| "": "ordered0977", | |
| "": "ordered0978", | |
| "": "ordered0984", | |
| "": "ordered0990", | |
| "": "ordered0996", | |
| "": "ordered1002", | |
| "": "ordered1008", | |
| "": "ordered1014", | |
| "": "ordered1020", | |
| "": "ordered1026", | |
| "": "ordered1032", | |
| "": "ordered1033", | |
| "": "ordered1034", | |
| "": "ordered1035", | |
| "": "ordered1041", | |
| "": "ordered1042", | |
| "": "ordered1043", | |
| "": "ordered1044", | |
| "": "ordered1045", | |
| "": "ordered1051", | |
| "": "ordered1057", | |
| "": "ordered1063", | |
| "": "ordered1064", | |
| "": "ordered1070", | |
| "": "ordered1076", | |
| "": "ordered1082", | |
| "": "ordered1083", | |
| "": "ordered1084", | |
| "": "ordered1085", | |
| "": "ordered1086", | |
| "": "ordered1087", | |
| "": "ordered1088", | |
| "": "ordered1089", | |
| "": "ordered1092", | |
| "": "ordered1093", | |
| "": "ordered1096", | |
| "": "ordered1097", | |
| "": "ordered1098", | |
| "": "ordered1099", | |
| "": "ordered1100", | |
| "": "ordered1101", | |
| "": "ordered1102", | |
| "": "ordered1103", | |
| "": "ordered1104", | |
| "": "ordered1105", | |
| "": "ordered1106", | |
| "": "ordered1107", | |
| "": "ordered1108", | |
| "": "ordered1109", | |
| "": "ordered1110", | |
| "": "ordered1111", | |
| "": "ordered1112", | |
| "": "ordered1113", | |
| "": "ordered1114", | |
| "": "ordered1115", | |
| "": "ordered1116", | |
| "": "ordered1117", | |
| "": "ordered1118", | |
| "": "ordered1119", | |
| "": "ordered1120", | |
| "": "ordered1126", | |
| "": "ordered1127", | |
| "": "ordered1128", | |
| "": "ordered1129", | |
| "": "ordered1130", | |
| "": "ordered1131", | |
| "": "ordered1132", | |
| "": "ordered1133", | |
| "": "ordered1134", | |
| "": "ordered1135", | |
| "": "ordered1136", | |
| "": "ordered1137", | |
| "": "ordered1138", | |
| "": "ordered1139", | |
| "": "ordered1140", | |
| "": "ordered1141", | |
| "": "ordered1142", | |
| "": "ordered1143", | |
| "": "ordered1144", | |
| "": "ordered1145", | |
| "": "ordered1146", | |
| "": "ordered1147", | |
| "": "ordered1148", | |
| "": "ordered1149", | |
| "": "ordered1150", | |
| "": "ordered1151", | |
| "": "ordered1152", | |
| "": "ordered1153", | |
| "": "ordered1154", | |
| "": "ordered1155", | |
| "": "ordered1156", | |
| "": "ordered1157", | |
| "": "ordered1158", | |
| "": "ordered1159", | |
| "": "ordered1160", | |
| "": "ordered1161", | |
| "": "ordered1162", | |
| "": "ordered1163", | |
| "": "ordered1164", | |
| "": "ordered1165", | |
| "": "ordered1166", | |
| "": "ordered1167", | |
| "": "ordered1168", | |
| "": "ordered1169", | |
| "": "ordered1170", | |
| "": "ordered1171", | |
| "": "ordered1172", | |
| "": "ordered1173", | |
| "": "ordered1174", | |
| "": "ordered1175", | |
| "": "ordered1176", | |
| "": "ordered1177", | |
| "": "ordered1178", | |
| "": "ordered1179", | |
| "": "ordered1180", | |
| "": "ordered1181", | |
| "": "ordered1182", | |
| "": "ordered1183", | |
| "": "ordered1184", | |
| "": "ordered1185", | |
| "": "ordered1186", | |
| "": "ordered1187", | |
| "": "ordered1188", | |
| "": "ordered1189", | |
| "": "ordered1190", | |
| "": "ordered1191", | |
| "": "ordered1192", | |
| "": "ordered1193", | |
| "": "ordered1194", | |
| "": "ordered1195", | |
| "": "ordered1196", | |
| "": "ordered1197", | |
| "": "ordered1198", | |
| "": "ordered1199", | |
| "": "ordered1200", | |
| "": "ordered1201", | |
| "": "ordered1202", | |
| "": "ordered1204", | |
| "": "ordered1205", | |
| "": "ordered1206", | |
| "": "ordered1207", | |
| "": "ordered1210", | |
| "": "ordered1211", | |
| "": "ordered1212", | |
| "": "ordered1213", | |
| "": "ordered1214", | |
| "": "ordered1215", | |
| "": "ordered1216", | |
| "": "ordered1217", | |
| "": "ordered1218", | |
| "": "ordered1219", | |
| "": "ordered1220", | |
| "": "ordered1221", | |
| "": "ordered1222", | |
| "": "ordered1223", | |
| "": "ordered1224", | |
| "": "ordered1225", | |
| "": "ordered1226", | |
| "": "ordered1227", | |
| "": "ordered1228", | |
| "": "ordered1229", | |
| "": "ordered1230", | |
| "": "ordered1231", | |
| "": "ordered1232", | |
| "": "ordered1233", | |
| "": "ordered1234", | |
| "": "ordered1235", | |
| "": "ordered1236", | |
| "": "ordered1237", | |
| "": "ordered1238", | |
| "": "ordered1239", | |
| "": "ordered1240", | |
| "": "ordered1241", | |
| "": "ordered1242", | |
| "": "ordered1243", | |
| "": "ordered1244", | |
| "": "ordered1245", | |
| "": "ordered1246", | |
| "": "ordered1247", | |
| "": "ordered1248", | |
| "": "ordered1249", | |
| "": "ordered1250", | |
| "": "ordered1251", | |
| "": "ordered1252", | |
| "": "ordered1253", | |
| "": "ordered1254", | |
| "": "ordered1255", | |
| "": "ordered1256", | |
| "": "ordered1257", | |
| "": "ordered1258", | |
| "": "ordered1259", | |
| "": "ordered1260", | |
| "": "ordered1261", | |
| "": "ordered1262", | |
| "": "ordered1263", | |
| "": "ordered1264", | |
| "": "ordered1265", | |
| "": "ordered1266", | |
| "": "ordered1267", | |
| "": "ordered1268", | |
| "": "ordered1269", | |
| "": "ordered1270", | |
| "": "ordered1271", | |
| "": "ordered1278", | |
| "": "ordered1279", | |
| "": "ordered1280", | |
| "": "ordered1281", | |
| "": "ordered1282", | |
| "": "ordered1283", | |
| "": "ordered1284", | |
| "": "ordered1285", | |
| "": "ordered1286", | |
| "": "ordered1287", | |
| "": "ordered1288", | |
| "": "ordered1289", | |
| "": "ordered1290", | |
| "": "ordered1291", | |
| "": "ordered1292", | |
| "": "ordered1293", | |
| "": "ordered1294", | |
| "": "ordered1295", | |
| "": "ordered1296", | |
| "": "ordered1297", | |
| "": "ordered1298", | |
| "": "ordered1299", | |
| "": "ordered1300", | |
| "": "ordered1301", | |
| "": "ordered1322", | |
| "": "ordered1328", | |
| "": "ordered1354", | |
| "": "ordered1355", | |
| "": "ordered1356", | |
| "": "ordered1357", | |
| "": "ordered1358", | |
| "": "ordered1359", | |
| "": "ordered1360", | |
| "": "ordered1361", | |
| "": "ordered1362", | |
| "": "ordered1363", | |
| "": "ordered1364", | |
| "": "ordered1365", | |
| "": "ordered1366", | |
| "": "ordered1367", | |
| "": "ordered1368", | |
| "": "ordered1369", | |
| "": "ordered1370", | |
| "": "ordered1371", | |
| "": "ordered1372", | |
| "": "ordered1373", | |
| "": "ordered1374", | |
| "": "ordered1375", | |
| "": "ordered1376", | |
| "": "ordered1377", | |
| "": "ordered1378", | |
| "": "ordered1379", | |
| "": "ordered1380", | |
| "": "ordered1381", | |
| "": "ordered1382", | |
| "": "ordered1383", | |
| "": "ordered1384", | |
| "": "ordered1385", | |
| "": "ordered1386", | |
| "": "ordered1387", | |
| "": "ordered1388", | |
| "": "ordered1389", | |
| "": "ordered1390", | |
| "": "ordered1391", | |
| "": "ordered1392", | |
| "": "ordered1393", | |
| "": "ordered1394", | |
| "": "ordered1395", | |
| "": "ordered1396", | |
| "": "ordered1397", | |
| "": "ordered1398", | |
| "": "ordered1399", | |
| "": "ordered1400", | |
| "": "ordered1401", | |
| "": "ordered1402", | |
| "": "ordered1403", | |
| "": "ordered1404", | |
| "": "ordered1405", | |
| "": "ordered1406", | |
| "": "ordered1407", | |
| "": "ordered1408", | |
| "": "ordered1409", | |
| "": "ordered1410", | |
| "": "ordered1411", | |
| "": "ordered1412", | |
| "": "ordered1413", | |
| "": "ordered1414", | |
| "": "ordered1415", | |
| "": "ordered1416", | |
| "": "ordered1417", | |
| "": "ordered1418", | |
| "": "ordered1419", | |
| "": "ordered1420", | |
| "": "ordered1421", | |
| "": "ordered1422", | |
| "": "ordered1423", | |
| "": "ordered1428", | |
| "": "ordered1434", | |
| "": "ordered1440", | |
| "": "ordered1446", | |
| "": "ordered1447", | |
| "": "ordered1448", | |
| "": "ordered1449", | |
| "": "ordered1455", | |
| "": "ordered1461", | |
| "": "ordered1467", | |
| "": "ordered1473", | |
| "": "ordered1479", | |
| "": "ordered1480", | |
| "": "ordered1481", | |
| "": "ordered1482", | |
| "": "ordered1483", | |
| "": "ordered1484", | |
| "": "ordered1485", | |
| "": "ordered1486", | |
| "": "ordered1487", | |
| "": "ordered1488", | |
| "": "ordered1489", | |
| "": "ordered1490", | |
| "": "ordered1491", | |
| "": "ordered1492", | |
| "": "ordered1493", | |
| "": "ordered1494", | |
| "": "ordered1495", | |
| "": "ordered1496", | |
| "": "ordered1497", | |
| "": "ordered1498", | |
| "": "ordered1499", | |
| "": "ordered1500", | |
| "": "ordered1501", | |
| "": "ordered1502", | |
| "": "ordered1503", | |
| "": "ordered1504", | |
| "": "ordered1505", | |
| "": "ordered1506", | |
| "": "ordered1507", | |
| "": "ordered1508", | |
| "": "ordered1509", | |
| "": "ordered1510", | |
| "": "ordered1511", | |
| "": "ordered1512", | |
| "": "ordered1513", | |
| "": "ordered1514", | |
| "": "ordered1520", | |
| "": "ordered1521", | |
| "": "ordered1522", | |
| "": "ordered1523", | |
| "": "ordered1524", | |
| "": "ordered1525", | |
| "": "ordered1526", | |
| "": "ordered1527", | |
| "": "ordered1528", | |
| "": "ordered1529", | |
| "": "ordered1530", | |
| "": "ordered1531", | |
| "": "ordered1532", | |
| "": "ordered1533", | |
| "": "ordered1534", | |
| "": "ordered1535", | |
| "": "ordered1536", | |
| "": "ordered1542", | |
| "": "ordered1548", | |
| "": "ordered1554", | |
| "": "ordered1555", | |
| "": "ordered1556", | |
| "": "ordered1557", | |
| "": "ordered1558", | |
| "": "ordered1559", | |
| "": "ordered1560", | |
| "": "ordered1561", | |
| "": "ordered1562", | |
| "": "ordered1563", | |
| "": "ordered1569", | |
| "": "ordered1570", | |
| "": "ordered1571", | |
| "": "ordered1572", | |
| "": "ordered1573" | |
| } | |
| }, function(e, t) { | |
| "use strict"; | |
| e.exports = { | |
| "#⃣": "ordered0001", | |
| "*⃣": "ordered0002", | |
| "0⃣": "ordered0003", | |
| "1⃣": "ordered0004", | |
| "2⃣": "ordered0005", | |
| "3⃣": "ordered0006", | |
| "4⃣": "ordered0007", | |
| "5⃣": "ordered0008", | |
| "6⃣": "ordered0009", | |
| "7⃣": "ordered0010", | |
| "8⃣": "ordered0011", | |
| "9⃣": "ordered0012", | |
| "©": "ordered0013", | |
| "®": "ordered0014", | |
| "‼": "ordered0015", | |
| "⁉": "ordered0016", | |
| "™": "ordered0017", | |
| "ℹ": "ordered0018", | |
| "↔": "ordered0019", | |
| "↕": "ordered0020", | |
| "↖": "ordered0021", | |
| "↗": "ordered0022", | |
| "↘": "ordered0023", | |
| "↙": "ordered0024", | |
| "↩": "ordered0025", | |
| "↪": "ordered0026", | |
| "⌚": "ordered0027", | |
| "⌛": "ordered0028", | |
| "⌨": "ordered0029", | |
| "⏩": "ordered0030", | |
| "⏪": "ordered0031", | |
| "⏫": "ordered0032", | |
| "⏬": "ordered0033", | |
| "⏭": "ordered0034", | |
| "⏮": "ordered0035", | |
| "⏯": "ordered0036", | |
| "⏰": "ordered0037", | |
| "⏱": "ordered0038", | |
| "⏲": "ordered0039", | |
| "⏳": "ordered0040", | |
| "⏸": "ordered0041", | |
| "⏹": "ordered0042", | |
| "⏺": "ordered0043", | |
| "Ⓜ": "ordered0044", | |
| "▪": "ordered0045", | |
| "▫": "ordered0046", | |
| "▶": "ordered0047", | |
| "◀": "ordered0048", | |
| "◻": "ordered0049", | |
| "◼": "ordered0050", | |
| "◽": "ordered0051", | |
| "◾": "ordered0052", | |
| "☀": "ordered0053", | |
| "☁": "ordered0054", | |
| "☂": "ordered0055", | |
| "☃": "ordered0056", | |
| "☄": "ordered0057", | |
| "☎": "ordered0058", | |
| "☑": "ordered0059", | |
| "☔": "ordered0060", | |
| "☕": "ordered0061", | |
| "☘": "ordered0062", | |
| "☝": "ordered0063", | |
| "☝🏻": "ordered0064", | |
| "☝🏼": "ordered0065", | |
| "☝🏽": "ordered0066", | |
| "☝🏾": "ordered0067", | |
| "☝🏿": "ordered0068", | |
| "☠": "ordered0069", | |
| "☢": "ordered0070", | |
| "☣": "ordered0071", | |
| "☦": "ordered0072", | |
| "☪": "ordered0073", | |
| "☮": "ordered0074", | |
| "☯": "ordered0075", | |
| "☸": "ordered0076", | |
| "☹": "ordered0077", | |
| "☺": "ordered0078", | |
| "♈": "ordered0079", | |
| "♉": "ordered0080", | |
| "♊": "ordered0081", | |
| "♋": "ordered0082", | |
| "♌": "ordered0083", | |
| "♍": "ordered0084", | |
| "♎": "ordered0085", | |
| "♏": "ordered0086", | |
| "♐": "ordered0087", | |
| "♑": "ordered0088", | |
| "♒": "ordered0089", | |
| "♓": "ordered0090", | |
| "♠": "ordered0091", | |
| "♣": "ordered0092", | |
| "♥": "ordered0093", | |
| "♦": "ordered0094", | |
| "♨": "ordered0095", | |
| "♻": "ordered0096", | |
| "♿": "ordered0097", | |
| "⚒": "ordered0098", | |
| "⚓": "ordered0099", | |
| "⚔": "ordered0100", | |
| "⚖": "ordered0101", | |
| "⚗": "ordered0102", | |
| "⚙": "ordered0103", | |
| "⚛": "ordered0104", | |
| "⚜": "ordered0105", | |
| "⚠": "ordered0106", | |
| "⚡": "ordered0107", | |
| "⚪": "ordered0108", | |
| "⚫": "ordered0109", | |
| "⚰": "ordered0110", | |
| "⚱": "ordered0111", | |
| "⚽": "ordered0112", | |
| "⚾": "ordered0113", | |
| "⛄": "ordered0114", | |
| "⛅": "ordered0115", | |
| "⛈": "ordered0116", | |
| "⛎": "ordered0117", | |
| "⛏": "ordered0118", | |
| "⛑": "ordered0119", | |
| "⛓": "ordered0120", | |
| "⛔": "ordered0121", | |
| "⛩": "ordered0122", | |
| "⛪": "ordered0123", | |
| "⛰": "ordered0124", | |
| "⛱": "ordered0125", | |
| "⛲": "ordered0126", | |
| "⛳": "ordered0127", | |
| "⛴": "ordered0128", | |
| "⛵": "ordered0129", | |
| "⛷": "ordered0130", | |
| "⛸": "ordered0131", | |
| "⛹": "ordered0132", | |
| "⛹🏻": "ordered0133", | |
| "⛹🏼": "ordered0134", | |
| "⛹🏽": "ordered0135", | |
| "⛹🏾": "ordered0136", | |
| "⛹🏿": "ordered0137", | |
| "⛺": "ordered0138", | |
| "⛽": "ordered0139", | |
| "✂": "ordered0140", | |
| "✅": "ordered0141", | |
| "✈": "ordered0142", | |
| "✉": "ordered0143", | |
| "✊": "ordered0144", | |
| "✊🏻": "ordered0145", | |
| "✊🏼": "ordered0146", | |
| "✊🏽": "ordered0147", | |
| "✊🏾": "ordered0148", | |
| "✊🏿": "ordered0149", | |
| "✋": "ordered0150", | |
| "✋🏻": "ordered0151", | |
| "✋🏼": "ordered0152", | |
| "✋🏽": "ordered0153", | |
| "✋🏾": "ordered0154", | |
| "✋🏿": "ordered0155", | |
| "✌": "ordered0156", | |
| "✌🏻": "ordered0157", | |
| "✌🏼": "ordered0158", | |
| "✌🏽": "ordered0159", | |
| "✌🏾": "ordered0160", | |
| "✌🏿": "ordered0161", | |
| "✍": "ordered0162", | |
| "✍🏻": "ordered0163", | |
| "✍🏼": "ordered0164", | |
| "✍🏽": "ordered0165", | |
| "✍🏾": "ordered0166", | |
| "✍🏿": "ordered0167", | |
| "✏": "ordered0168", | |
| "✒": "ordered0169", | |
| "✔": "ordered0170", | |
| "✖": "ordered0171", | |
| "✝": "ordered0172", | |
| "✡": "ordered0173", | |
| "✨": "ordered0174", | |
| "✳": "ordered0175", | |
| "✴": "ordered0176", | |
| "❄": "ordered0177", | |
| "❇": "ordered0178", | |
| "❌": "ordered0179", | |
| "❎": "ordered0180", | |
| "❓": "ordered0181", | |
| "❔": "ordered0182", | |
| "❕": "ordered0183", | |
| "❗": "ordered0184", | |
| "❣": "ordered0185", | |
| "❤": "ordered0186", | |
| "➕": "ordered0187", | |
| "➖": "ordered0188", | |
| "➗": "ordered0189", | |
| "➡": "ordered0190", | |
| "➰": "ordered0191", | |
| "➿": "ordered0192", | |
| "⤴": "ordered0193", | |
| "⤵": "ordered0194", | |
| "⬅": "ordered0195", | |
| "⬆": "ordered0196", | |
| "⬇": "ordered0197", | |
| "⬛": "ordered0198", | |
| "⬜": "ordered0199", | |
| "⭐": "ordered0200", | |
| "⭕": "ordered0201", | |
| "〰": "ordered0202", | |
| "〽": "ordered0203", | |
| "㊗": "ordered0204", | |
| "㊙": "ordered0205", | |
| "🀄": "ordered0206", | |
| "🃏": "ordered0207", | |
| "🅰": "ordered0208", | |
| "🅱": "ordered0209", | |
| "🅾": "ordered0210", | |
| "🅿": "ordered0211", | |
| "🆎": "ordered0212", | |
| "🆑": "ordered0213", | |
| "🆒": "ordered0214", | |
| "🆓": "ordered0215", | |
| "🆔": "ordered0216", | |
| "🆕": "ordered0217", | |
| "🆖": "ordered0218", | |
| "🆗": "ordered0219", | |
| "🆘": "ordered0220", | |
| "🆙": "ordered0221", | |
| "🆚": "ordered0222", | |
| "🇦🇩": "ordered0223", | |
| "🇦🇪": "ordered0224", | |
| "🇦🇫": "ordered0225", | |
| "🇦🇬": "ordered0226", | |
| "🇦🇮": "ordered0227", | |
| "🇦🇱": "ordered0228", | |
| "🇦🇲": "ordered0229", | |
| "🇦🇴": "ordered0230", | |
| "🇦🇶": "ordered0231", | |
| "🇦🇷": "ordered0232", | |
| "🇦🇸": "ordered0233", | |
| "🇦🇹": "ordered0234", | |
| "🇦🇺": "ordered0235", | |
| "🇦🇼": "ordered0236", | |
| "🇦🇽": "ordered0237", | |
| "🇦🇿": "ordered0238", | |
| "🇧🇦": "ordered0239", | |
| "🇧🇧": "ordered0240", | |
| "🇧🇩": "ordered0241", | |
| "🇧🇪": "ordered0242", | |
| "🇧🇫": "ordered0243", | |
| "🇧🇬": "ordered0244", | |
| "🇧🇭": "ordered0245", | |
| "🇧🇮": "ordered0246", | |
| "🇧🇯": "ordered0247", | |
| "🇧🇱": "ordered0248", | |
| "🇧🇲": "ordered0249", | |
| "🇧🇳": "ordered0250", | |
| "🇧🇴": "ordered0251", | |
| "🇧🇶": "ordered0252", | |
| "🇧🇷": "ordered0253", | |
| "🇧🇸": "ordered0254", | |
| "🇧🇹": "ordered0255", | |
| "🇧🇼": "ordered0256", | |
| "🇧🇾": "ordered0257", | |
| "🇧🇿": "ordered0258", | |
| "🇨🇦": "ordered0259", | |
| "🇨🇨": "ordered0260", | |
| "🇨🇩": "ordered0261", | |
| "🇨🇫": "ordered0262", | |
| "🇨🇬": "ordered0263", | |
| "🇨🇭": "ordered0264", | |
| "🇨🇮": "ordered0265", | |
| "🇨🇰": "ordered0266", | |
| "🇨🇱": "ordered0267", | |
| "🇨🇲": "ordered0268", | |
| "🇨🇳": "ordered0269", | |
| "🇨🇴": "ordered0270", | |
| "🇨🇷": "ordered0271", | |
| "🇨🇺": "ordered0272", | |
| "🇨🇻": "ordered0273", | |
| "🇨🇼": "ordered0274", | |
| "🇨🇽": "ordered0275", | |
| "🇨🇾": "ordered0276", | |
| "🇨🇿": "ordered0277", | |
| "🇩🇪": "ordered0278", | |
| "🇩🇯": "ordered0279", | |
| "🇩🇰": "ordered0280", | |
| "🇩🇲": "ordered0281", | |
| "🇩🇴": "ordered0282", | |
| "🇩🇿": "ordered0283", | |
| "🇪🇨": "ordered0284", | |
| "🇪🇪": "ordered0285", | |
| "🇪🇬": "ordered0286", | |
| "🇪🇭": "ordered0287", | |
| "🇪🇷": "ordered0288", | |
| "🇪🇸": "ordered0289", | |
| "🇪🇹": "ordered0290", | |
| "🇪🇺": "ordered0291", | |
| "🇫🇮": "ordered0292", | |
| "🇫🇯": "ordered0293", | |
| "🇫🇰": "ordered0294", | |
| "🇫🇲": "ordered0295", | |
| "🇫🇴": "ordered0296", | |
| "🇫🇷": "ordered0297", | |
| "🇬🇦": "ordered0298", | |
| "🇬🇧": "ordered0299", | |
| "🇬🇩": "ordered0300", | |
| "🇬🇪": "ordered0301", | |
| "🇬🇫": "ordered0302", | |
| "🇬🇬": "ordered0303", | |
| "🇬🇭": "ordered0304", | |
| "🇬🇮": "ordered0305", | |
| "🇬🇱": "ordered0306", | |
| "🇬🇲": "ordered0307", | |
| "🇬🇳": "ordered0308", | |
| "🇬🇵": "ordered0309", | |
| "🇬🇶": "ordered0310", | |
| "🇬🇷": "ordered0311", | |
| "🇬🇸": "ordered0312", | |
| "🇬🇹": "ordered0313", | |
| "🇬🇺": "ordered0314", | |
| "🇬🇼": "ordered0315", | |
| "🇬🇾": "ordered0316", | |
| "🇭🇰": "ordered0317", | |
| "🇭🇳": "ordered0318", | |
| "🇭🇷": "ordered0319", | |
| "🇭🇹": "ordered0320", | |
| "🇭🇺": "ordered0321", | |
| "🇮🇨": "ordered0322", | |
| "🇮🇩": "ordered0323", | |
| "🇮🇪": "ordered0324", | |
| "🇮🇱": "ordered0325", | |
| "🇮🇲": "ordered0326", | |
| "🇮🇳": "ordered0327", | |
| "🇮🇴": "ordered0328", | |
| "🇮🇶": "ordered0329", | |
| "🇮🇷": "ordered0330", | |
| "🇮🇸": "ordered0331", | |
| "🇮🇹": "ordered0332", | |
| "🇯🇪": "ordered0333", | |
| "🇯🇲": "ordered0334", | |
| "🇯🇴": "ordered0335", | |
| "🇯🇵": "ordered0336", | |
| "🇰🇪": "ordered0337", | |
| "🇰🇬": "ordered0338", | |
| "🇰🇭": "ordered0339", | |
| "🇰🇮": "ordered0340", | |
| "🇰🇲": "ordered0341", | |
| "🇰🇳": "ordered0342", | |
| "🇰🇵": "ordered0343", | |
| "🇰🇷": "ordered0344", | |
| "🇰🇼": "ordered0345", | |
| "🇰🇾": "ordered0346", | |
| "🇰🇿": "ordered0347", | |
| "🇱🇦": "ordered0348", | |
| "🇱🇧": "ordered0349", | |
| "🇱🇨": "ordered0350", | |
| "🇱🇮": "ordered0351", | |
| "🇱🇰": "ordered0352", | |
| "🇱🇷": "ordered0353", | |
| "🇱🇸": "ordered0354", | |
| "🇱🇹": "ordered0355", | |
| "🇱🇺": "ordered0356", | |
| "🇱🇻": "ordered0357", | |
| "🇱🇾": "ordered0358", | |
| "🇲🇦": "ordered0359", | |
| "🇲🇨": "ordered0360", | |
| "🇲🇩": "ordered0361", | |
| "🇲🇪": "ordered0362", | |
| "🇲🇬": "ordered0363", | |
| "🇲🇭": "ordered0364", | |
| "🇲🇰": "ordered0365", | |
| "🇲🇱": "ordered0366", | |
| "🇲🇲": "ordered0367", | |
| "🇲🇳": "ordered0368", | |
| "🇲🇴": "ordered0369", | |
| "🇲🇵": "ordered0370", | |
| "🇲🇶": "ordered0371", | |
| "🇲🇷": "ordered0372", | |
| "🇲🇸": "ordered0373", | |
| "🇲🇹": "ordered0374", | |
| "🇲🇺": "ordered0375", | |
| "🇲🇻": "ordered0376", | |
| "🇲🇼": "ordered0377", | |
| "🇲🇽": "ordered0378", | |
| "🇲🇾": "ordered0379", | |
| "🇲🇿": "ordered0380", | |
| "🇳🇦": "ordered0381", | |
| "🇳🇨": "ordered0382", | |
| "🇳🇪": "ordered0383", | |
| "🇳🇫": "ordered0384", | |
| "🇳🇬": "ordered0385", | |
| "🇳🇮": "ordered0386", | |
| "🇳🇱": "ordered0387", | |
| "🇳🇴": "ordered0388", | |
| "🇳🇵": "ordered0389", | |
| "🇳🇷": "ordered0390", | |
| "🇳🇺": "ordered0391", | |
| "🇳🇿": "ordered0392", | |
| "🇴🇲": "ordered0393", | |
| "🇵🇦": "ordered0394", | |
| "🇵🇪": "ordered0395", | |
| "🇵🇫": "ordered0396", | |
| "🇵🇬": "ordered0397", | |
| "🇵🇭": "ordered0398", | |
| "🇵🇰": "ordered0399", | |
| "🇵🇱": "ordered0400", | |
| "🇵🇲": "ordered0401", | |
| "🇵🇳": "ordered0402", | |
| "🇵🇷": "ordered0403", | |
| "🇵🇸": "ordered0404", | |
| "🇵🇹": "ordered0405", | |
| "🇵🇼": "ordered0406", | |
| "🇵🇾": "ordered0407", | |
| "🇶🇦": "ordered0408", | |
| "🇷🇪": "ordered0409", | |
| "🇷🇴": "ordered0410", | |
| "🇷🇸": "ordered0411", | |
| "🇷🇺": "ordered0412", | |
| "🇷🇼": "ordered0413", | |
| "🇸🇦": "ordered0414", | |
| "🇸🇧": "ordered0415", | |
| "🇸🇨": "ordered0416", | |
| "🇸🇩": "ordered0417", | |
| "🇸🇪": "ordered0418", | |
| "🇸🇬": "ordered0419", | |
| "🇸🇭": "ordered0420", | |
| "🇸🇮": "ordered0421", | |
| "🇸🇰": "ordered0422", | |
| "🇸🇱": "ordered0423", | |
| "🇸🇲": "ordered0424", | |
| "🇸🇳": "ordered0425", | |
| "🇸🇴": "ordered0426", | |
| "🇸🇷": "ordered0427", | |
| "🇸🇸": "ordered0428", | |
| "🇸🇹": "ordered0429", | |
| "🇸🇻": "ordered0430", | |
| "🇸🇽": "ordered0431", | |
| "🇸🇾": "ordered0432", | |
| "🇸🇿": "ordered0433", | |
| "🇹🇨": "ordered0434", | |
| "🇹🇩": "ordered0435", | |
| "🇹🇫": "ordered0436", | |
| "🇹🇬": "ordered0437", | |
| "🇹🇭": "ordered0438", | |
| "🇹🇯": "ordered0439", | |
| "🇹🇰": "ordered0440", | |
| "🇹🇱": "ordered0441", | |
| "🇹🇲": "ordered0442", | |
| "🇹🇳": "ordered0443", | |
| "🇹🇴": "ordered0444", | |
| "🇹🇷": "ordered0445", | |
| "🇹🇹": "ordered0446", | |
| "🇹🇻": "ordered0447", | |
| "🇹🇼": "ordered0448", | |
| "🇹🇿": "ordered0449", | |
| "🇺🇦": "ordered0450", | |
| "🇺🇬": "ordered0451", | |
| "🇺🇸": "ordered0452", | |
| "🇺🇾": "ordered0453", | |
| "🇺🇿": "ordered0454", | |
| "🇻🇦": "ordered0455", | |
| "🇻🇨": "ordered0456", | |
| "🇻🇪": "ordered0457", | |
| "🇻🇬": "ordered0458", | |
| "🇻🇮": "ordered0459", | |
| "🇻🇳": "ordered0460", | |
| "🇻🇺": "ordered0461", | |
| "🇼🇫": "ordered0462", | |
| "🇼🇸": "ordered0463", | |
| "🇽🇰": "ordered0464", | |
| "🇾🇪": "ordered0465", | |
| "🇾🇹": "ordered0466", | |
| "🇿🇦": "ordered0467", | |
| "🇿🇲": "ordered0468", | |
| "🇿🇼": "ordered0469", | |
| "🈁": "ordered0470", | |
| "🈂": "ordered0471", | |
| "🈚": "ordered0472", | |
| "🈯": "ordered0473", | |
| "🈲": "ordered0474", | |
| "🈳": "ordered0475", | |
| "🈴": "ordered0476", | |
| "🈵": "ordered0477", | |
| "🈶": "ordered0478", | |
| "🈷": "ordered0479", | |
| "🈸": "ordered0480", | |
| "🈹": "ordered0481", | |
| "🈺": "ordered0482", | |
| "🉐": "ordered0483", | |
| "🉑": "ordered0484", | |
| "🌀": "ordered0485", | |
| "🌁": "ordered0486", | |
| "🌂": "ordered0487", | |
| "🌃": "ordered0488", | |
| "🌄": "ordered0489", | |
| "🌅": "ordered0490", | |
| "🌆": "ordered0491", | |
| "🌇": "ordered0492", | |
| "🌈": "ordered0493", | |
| "🌉": "ordered0494", | |
| "🌊": "ordered0495", | |
| "🌋": "ordered0496", | |
| "🌌": "ordered0497", | |
| "🌍": "ordered0498", | |
| "🌎": "ordered0499", | |
| "🌏": "ordered0500", | |
| "🌐": "ordered0501", | |
| "🌑": "ordered0502", | |
| "🌒": "ordered0503", | |
| "🌓": "ordered0504", | |
| "🌔": "ordered0505", | |
| "🌕": "ordered0506", | |
| "🌖": "ordered0507", | |
| "🌗": "ordered0508", | |
| "🌘": "ordered0509", | |
| "🌙": "ordered0510", | |
| "🌚": "ordered0511", | |
| "🌛": "ordered0512", | |
| "🌜": "ordered0513", | |
| "🌝": "ordered0514", | |
| "🌞": "ordered0515", | |
| "🌟": "ordered0516", | |
| "🌠": "ordered0517", | |
| "🌡": "ordered0518", | |
| "🌤": "ordered0519", | |
| "🌥": "ordered0520", | |
| "🌦": "ordered0521", | |
| "🌧": "ordered0522", | |
| "🌨": "ordered0523", | |
| "🌩": "ordered0524", | |
| "🌪": "ordered0525", | |
| "🌫": "ordered0526", | |
| "🌬": "ordered0527", | |
| "🌭": "ordered0528", | |
| "🌮": "ordered0529", | |
| "🌯": "ordered0530", | |
| "🌰": "ordered0531", | |
| "🌱": "ordered0532", | |
| "🌲": "ordered0533", | |
| "🌳": "ordered0534", | |
| "🌴": "ordered0535", | |
| "🌵": "ordered0536", | |
| "🌶": "ordered0537", | |
| "🌷": "ordered0538", | |
| "🌸": "ordered0539", | |
| "🌹": "ordered0540", | |
| "🌺": "ordered0541", | |
| "🌻": "ordered0542", | |
| "🌼": "ordered0543", | |
| "🌽": "ordered0544", | |
| "🌾": "ordered0545", | |
| "🌿": "ordered0546", | |
| "🍀": "ordered0547", | |
| "🍁": "ordered0548", | |
| "🍂": "ordered0549", | |
| "🍃": "ordered0550", | |
| "🍄": "ordered0551", | |
| "🍅": "ordered0552", | |
| "🍆": "ordered0553", | |
| "🍇": "ordered0554", | |
| "🍈": "ordered0555", | |
| "🍉": "ordered0556", | |
| "🍊": "ordered0557", | |
| "🍋": "ordered0558", | |
| "🍌": "ordered0559", | |
| "🍍": "ordered0560", | |
| "🍎": "ordered0561", | |
| "🍏": "ordered0562", | |
| "🍐": "ordered0563", | |
| "🍑": "ordered0564", | |
| "🍒": "ordered0565", | |
| "🍓": "ordered0566", | |
| "🍔": "ordered0567", | |
| "🍕": "ordered0568", | |
| "🍖": "ordered0569", | |
| "🍗": "ordered0570", | |
| "🍘": "ordered0571", | |
| "🍙": "ordered0572", | |
| "🍚": "ordered0573", | |
| "🍛": "ordered0574", | |
| "🍜": "ordered0575", | |
| "🍝": "ordered0576", | |
| "🍞": "ordered0577", | |
| "🍟": "ordered0578", | |
| "🍠": "ordered0579", | |
| "🍡": "ordered0580", | |
| "🍢": "ordered0581", | |
| "🍣": "ordered0582", | |
| "🍤": "ordered0583", | |
| "🍥": "ordered0584", | |
| "🍦": "ordered0585", | |
| "🍧": "ordered0586", | |
| "🍨": "ordered0587", | |
| "🍩": "ordered0588", | |
| "🍪": "ordered0589", | |
| "🍫": "ordered0590", | |
| "🍬": "ordered0591", | |
| "🍭": "ordered0592", | |
| "🍮": "ordered0593", | |
| "🍯": "ordered0594", | |
| "🍰": "ordered0595", | |
| "🍱": "ordered0596", | |
| "🍲": "ordered0597", | |
| "🍳": "ordered0598", | |
| "🍴": "ordered0599", | |
| "🍵": "ordered0600", | |
| "🍶": "ordered0601", | |
| "🍷": "ordered0602", | |
| "🍸": "ordered0603", | |
| "🍹": "ordered0604", | |
| "🍺": "ordered0605", | |
| "🍻": "ordered0606", | |
| "🍼": "ordered0607", | |
| "🍽": "ordered0608", | |
| "🍾": "ordered0609", | |
| "🍿": "ordered0610", | |
| "🎀": "ordered0611", | |
| "🎁": "ordered0612", | |
| "🎂": "ordered0613", | |
| "🎃": "ordered0614", | |
| "🎄": "ordered0615", | |
| "🎅": "ordered0616", | |
| "🎅🏻": "ordered0617", | |
| "🎅🏼": "ordered0618", | |
| "🎅🏽": "ordered0619", | |
| "🎅🏾": "ordered0620", | |
| "🎅🏿": "ordered0621", | |
| "🎆": "ordered0622", | |
| "🎇": "ordered0623", | |
| "🎈": "ordered0624", | |
| "🎉": "ordered0625", | |
| "🎊": "ordered0626", | |
| "🎋": "ordered0627", | |
| "🎌": "ordered0628", | |
| "🎍": "ordered0629", | |
| "🎎": "ordered0630", | |
| "🎏": "ordered0631", | |
| "🎐": "ordered0632", | |
| "🎑": "ordered0633", | |
| "🎒": "ordered0634", | |
| "🎓": "ordered0635", | |
| "🎖": "ordered0636", | |
| "🎗": "ordered0637", | |
| "🎙": "ordered0638", | |
| "🎚": "ordered0639", | |
| "🎛": "ordered0640", | |
| "🎞": "ordered0641", | |
| "🎟": "ordered0642", | |
| "🎠": "ordered0643", | |
| "🎡": "ordered0644", | |
| "🎢": "ordered0645", | |
| "🎣": "ordered0646", | |
| "🎤": "ordered0647", | |
| "🎥": "ordered0648", | |
| "🎦": "ordered0649", | |
| "🎧": "ordered0650", | |
| "🎨": "ordered0651", | |
| "🎩": "ordered0652", | |
| "🎪": "ordered0653", | |
| "🎫": "ordered0654", | |
| "🎬": "ordered0655", | |
| "🎭": "ordered0656", | |
| "🎮": "ordered0657", | |
| "🎯": "ordered0658", | |
| "🎰": "ordered0659", | |
| "🎱": "ordered0660", | |
| "🎲": "ordered0661", | |
| "🎳": "ordered0662", | |
| "🎴": "ordered0663", | |
| "🎵": "ordered0664", | |
| "🎶": "ordered0665", | |
| "🎷": "ordered0666", | |
| "🎸": "ordered0667", | |
| "🎹": "ordered0668", | |
| "🎺": "ordered0669", | |
| "🎻": "ordered0670", | |
| "🎼": "ordered0671", | |
| "🎽": "ordered0672", | |
| "🎾": "ordered0673", | |
| "🎿": "ordered0674", | |
| "🏀": "ordered0675", | |
| "🏁": "ordered0676", | |
| "🏂": "ordered0677", | |
| "🏃": "ordered0678", | |
| "🏃🏻": "ordered0679", | |
| "🏃🏼": "ordered0680", | |
| "🏃🏽": "ordered0681", | |
| "🏃🏾": "ordered0682", | |
| "🏃🏿": "ordered0683", | |
| "🏄": "ordered0684", | |
| "🏄🏻": "ordered0685", | |
| "🏄🏼": "ordered0686", | |
| "🏄🏽": "ordered0687", | |
| "🏄🏾": "ordered0688", | |
| "🏄🏿": "ordered0689", | |
| "🏅": "ordered0690", | |
| "🏆": "ordered0691", | |
| "🏇": "ordered0692", | |
| "🏇🏻": "ordered0693", | |
| "🏇🏼": "ordered0694", | |
| "🏇🏽": "ordered0695", | |
| "🏇🏾": "ordered0696", | |
| "🏇🏿": "ordered0697", | |
| "🏈": "ordered0698", | |
| "🏉": "ordered0699", | |
| "🏊": "ordered0700", | |
| "🏊🏻": "ordered0701", | |
| "🏊🏼": "ordered0702", | |
| "🏊🏽": "ordered0703", | |
| "🏊🏾": "ordered0704", | |
| "🏊🏿": "ordered0705", | |
| "🏋": "ordered0706", | |
| "🏋🏻": "ordered0707", | |
| "🏋🏼": "ordered0708", | |
| "🏋🏽": "ordered0709", | |
| "🏋🏾": "ordered0710", | |
| "🏋🏿": "ordered0711", | |
| "🏌": "ordered0712", | |
| "🏍": "ordered0713", | |
| "🏎": "ordered0714", | |
| "🏏": "ordered0715", | |
| "🏐": "ordered0716", | |
| "🏑": "ordered0717", | |
| "🏒": "ordered0718", | |
| "🏓": "ordered0719", | |
| "🏔": "ordered0720", | |
| "🏕": "ordered0721", | |
| "🏖": "ordered0722", | |
| "🏗": "ordered0723", | |
| "🏘": "ordered0724", | |
| "🏙": "ordered0725", | |
| "🏚": "ordered0726", | |
| "🏛": "ordered0727", | |
| "🏜": "ordered0728", | |
| "🏝": "ordered0729", | |
| "🏞": "ordered0730", | |
| "🏟": "ordered0731", | |
| "🏠": "ordered0732", | |
| "🏡": "ordered0733", | |
| "🏢": "ordered0734", | |
| "🏣": "ordered0735", | |
| "🏤": "ordered0736", | |
| "🏥": "ordered0737", | |
| "🏦": "ordered0738", | |
| "🏧": "ordered0739", | |
| "🏨": "ordered0740", | |
| "🏩": "ordered0741", | |
| "🏪": "ordered0742", | |
| "🏫": "ordered0743", | |
| "🏬": "ordered0744", | |
| "🏭": "ordered0745", | |
| "🏮": "ordered0746", | |
| "🏯": "ordered0747", | |
| "🏰": "ordered0748", | |
| "🏳": "ordered0749", | |
| "🏴": "ordered0750", | |
| "🏵": "ordered0751", | |
| "🏷": "ordered0752", | |
| "🏸": "ordered0753", | |
| "🏹": "ordered0754", | |
| "🏺": "ordered0755", | |
| "🏻": "ordered0756", | |
| "🏼": "ordered0757", | |
| "🏽": "ordered0758", | |
| "🏾": "ordered0759", | |
| "🏿": "ordered0760", | |
| "🐀": "ordered0761", | |
| "🐁": "ordered0762", | |
| "🐂": "ordered0763", | |
| "🐃": "ordered0764", | |
| "🐄": "ordered0765", | |
| "🐅": "ordered0766", | |
| "🐆": "ordered0767", | |
| "🐇": "ordered0768", | |
| "🐈": "ordered0769", | |
| "🐉": "ordered0770", | |
| "🐊": "ordered0771", | |
| "🐋": "ordered0772", | |
| "🐌": "ordered0773", | |
| "🐍": "ordered0774", | |
| "🐎": "ordered0775", | |
| "🐏": "ordered0776", | |
| "🐐": "ordered0777", | |
| "🐑": "ordered0778", | |
| "🐒": "ordered0779", | |
| "🐓": "ordered0780", | |
| "🐔": "ordered0781", | |
| "🐕": "ordered0782", | |
| "🐖": "ordered0783", | |
| "🐗": "ordered0784", | |
| "🐘": "ordered0785", | |
| "🐙": "ordered0786", | |
| "🐚": "ordered0787", | |
| "🐛": "ordered0788", | |
| "🐜": "ordered0789", | |
| "🐝": "ordered0790", | |
| "🐞": "ordered0791", | |
| "🐟": "ordered0792", | |
| "🐠": "ordered0793", | |
| "🐡": "ordered0794", | |
| "🐢": "ordered0795", | |
| "🐣": "ordered0796", | |
| "🐤": "ordered0797", | |
| "🐥": "ordered0798", | |
| "🐦": "ordered0799", | |
| "🐧": "ordered0800", | |
| "🐨": "ordered0801", | |
| "🐩": "ordered0802", | |
| "🐪": "ordered0803", | |
| "🐫": "ordered0804", | |
| "🐬": "ordered0805", | |
| "🐭": "ordered0806", | |
| "🐮": "ordered0807", | |
| "🐯": "ordered0808", | |
| "🐰": "ordered0809", | |
| "🐱": "ordered0810", | |
| "🐲": "ordered0811", | |
| "🐳": "ordered0812", | |
| "🐴": "ordered0813", | |
| "🐵": "ordered0814", | |
| "🐶": "ordered0815", | |
| "🐷": "ordered0816", | |
| "🐸": "ordered0817", | |
| "🐹": "ordered0818", | |
| "🐺": "ordered0819", | |
| "🐻": "ordered0820", | |
| "🐼": "ordered0821", | |
| "🐽": "ordered0822", | |
| "🐾": "ordered0823", | |
| "🐿": "ordered0824", | |
| "👀": "ordered0825", | |
| "👁": "ordered0826", | |
| "👁🗨": "ordered0827", | |
| "👂": "ordered0828", | |
| "👂🏻": "ordered0829", | |
| "👂🏼": "ordered0830", | |
| "👂🏽": "ordered0831", | |
| "👂🏾": "ordered0832", | |
| "👂🏿": "ordered0833", | |
| "👃": "ordered0834", | |
| "👃🏻": "ordered0835", | |
| "👃🏼": "ordered0836", | |
| "👃🏽": "ordered0837", | |
| "👃🏾": "ordered0838", | |
| "👃🏿": "ordered0839", | |
| "👄": "ordered0840", | |
| "👅": "ordered0841", | |
| "👆": "ordered0842", | |
| "👆🏻": "ordered0843", | |
| "👆🏼": "ordered0844", | |
| "👆🏽": "ordered0845", | |
| "👆🏾": "ordered0846", | |
| "👆🏿": "ordered0847", | |
| "👇": "ordered0848", | |
| "👇🏻": "ordered0849", | |
| "👇🏼": "ordered0850", | |
| "👇🏽": "ordered0851", | |
| "👇🏾": "ordered0852", | |
| "👇🏿": "ordered0853", | |
| "👈": "ordered0854", | |
| "👈🏻": "ordered0855", | |
| "👈🏼": "ordered0856", | |
| "👈🏽": "ordered0857", | |
| "👈🏾": "ordered0858", | |
| "👈🏿": "ordered0859", | |
| "👉": "ordered0860", | |
| "👉🏻": "ordered0861", | |
| "👉🏼": "ordered0862", | |
| "👉🏽": "ordered0863", | |
| "👉🏾": "ordered0864", | |
| "👉🏿": "ordered0865", | |
| "👊": "ordered0866", | |
| "👊🏻": "ordered0867", | |
| "👊🏼": "ordered0868", | |
| "👊🏽": "ordered0869", | |
| "👊🏾": "ordered0870", | |
| "👊🏿": "ordered0871", | |
| "👋": "ordered0872", | |
| "👋🏻": "ordered0873", | |
| "👋🏼": "ordered0874", | |
| "👋🏽": "ordered0875", | |
| "👋🏾": "ordered0876", | |
| "👋🏿": "ordered0877", | |
| "👌": "ordered0878", | |
| "👌🏻": "ordered0879", | |
| "👌🏼": "ordered0880", | |
| "👌🏽": "ordered0881", | |
| "👌🏾": "ordered0882", | |
| "👌🏿": "ordered0883", | |
| "👍": "ordered0884", | |
| "👍🏻": "ordered0885", | |
| "👍🏼": "ordered0886", | |
| "👍🏽": "ordered0887", | |
| "👍🏾": "ordered0888", | |
| "👍🏿": "ordered0889", | |
| "👎": "ordered0890", | |
| "👎🏻": "ordered0891", | |
| "👎🏼": "ordered0892", | |
| "👎🏽": "ordered0893", | |
| "👎🏾": "ordered0894", | |
| "👎🏿": "ordered0895", | |
| "👏": "ordered0896", | |
| "👏🏻": "ordered0897", | |
| "👏🏼": "ordered0898", | |
| "👏🏽": "ordered0899", | |
| "👏🏾": "ordered0900", | |
| "👏🏿": "ordered0901", | |
| "👐": "ordered0902", | |
| "👐🏻": "ordered0903", | |
| "👐🏼": "ordered0904", | |
| "👐🏽": "ordered0905", | |
| "👐🏾": "ordered0906", | |
| "👐🏿": "ordered0907", | |
| "👑": "ordered0908", | |
| "👒": "ordered0909", | |
| "👓": "ordered0910", | |
| "👔": "ordered0911", | |
| "👕": "ordered0912", | |
| "👖": "ordered0913", | |
| "👗": "ordered0914", | |
| "👘": "ordered0915", | |
| "👙": "ordered0916", | |
| "👚": "ordered0917", | |
| "👛": "ordered0918", | |
| "👜": "ordered0919", | |
| "👝": "ordered0920", | |
| "👞": "ordered0921", | |
| "👟": "ordered0922", | |
| "👠": "ordered0923", | |
| "👡": "ordered0924", | |
| "👢": "ordered0925", | |
| "👣": "ordered0926", | |
| "👤": "ordered0927", | |
| "👥": "ordered0928", | |
| "👦": "ordered0929", | |
| "👦🏻": "ordered0930", | |
| "👦🏼": "ordered0931", | |
| "👦🏽": "ordered0932", | |
| "👦🏾": "ordered0933", | |
| "👦🏿": "ordered0934", | |
| "👧": "ordered0935", | |
| "👧🏻": "ordered0936", | |
| "👧🏼": "ordered0937", | |
| "👧🏽": "ordered0938", | |
| "👧🏾": "ordered0939", | |
| "👧🏿": "ordered0940", | |
| "👨": "ordered0941", | |
| "👨🏻": "ordered0942", | |
| "👨🏼": "ordered0943", | |
| "👨🏽": "ordered0944", | |
| "👨🏾": "ordered0945", | |
| "👨🏿": "ordered0946", | |
| "👩": "ordered0947", | |
| "👩🏻": "ordered0948", | |
| "👩🏼": "ordered0949", | |
| "👩🏽": "ordered0950", | |
| "👩🏾": "ordered0951", | |
| "👩🏿": "ordered0952", | |
| "👪": "ordered0953", | |
| "👨👨👦": "ordered0954", | |
| "👨👨👦👦": "ordered0955", | |
| "👨👨👧": "ordered0956", | |
| "👨👨👧👦": "ordered0957", | |
| "👨👨👧👧": "ordered0958", | |
| "👨👩👦👦": "ordered0959", | |
| "👨👩👧": "ordered0960", | |
| "👨👩👧👦": "ordered0961", | |
| "👨👩👧👧": "ordered0962", | |
| "👩👩👦": "ordered0963", | |
| "👩👩👦👦": "ordered0964", | |
| "👩👩👧": "ordered0965", | |
| "👩👩👧👦": "ordered0966", | |
| "👩👩👧👧": "ordered0967", | |
| "👫": "ordered0968", | |
| "👬": "ordered0969", | |
| "👭": "ordered0970", | |
| "👮": "ordered0971", | |
| "👮🏻": "ordered0972", | |
| "👮🏼": "ordered0973", | |
| "👮🏽": "ordered0974", | |
| "👮🏾": "ordered0975", | |
| "👮🏿": "ordered0976", | |
| "👯": "ordered0977", | |
| "👰": "ordered0978", | |
| "👰🏻": "ordered0979", | |
| "👰🏼": "ordered0980", | |
| "👰🏽": "ordered0981", | |
| "👰🏾": "ordered0982", | |
| "👰🏿": "ordered0983", | |
| "👱": "ordered0984", | |
| "👱🏻": "ordered0985", | |
| "👱🏼": "ordered0986", | |
| "👱🏽": "ordered0987", | |
| "👱🏾": "ordered0988", | |
| "👱🏿": "ordered0989", | |
| "👲": "ordered0990", | |
| "👲🏻": "ordered0991", | |
| "👲🏼": "ordered0992", | |
| "👲🏽": "ordered0993", | |
| "👲🏾": "ordered0994", | |
| "👲🏿": "ordered0995", | |
| "👳": "ordered0996", | |
| "👳🏻": "ordered0997", | |
| "👳🏼": "ordered0998", | |
| "👳🏽": "ordered0999", | |
| "👳🏾": "ordered1000", | |
| "👳🏿": "ordered1001", | |
| "👴": "ordered1002", | |
| "👴🏻": "ordered1003", | |
| "👴🏼": "ordered1004", | |
| "👴🏽": "ordered1005", | |
| "👴🏾": "ordered1006", | |
| "👴🏿": "ordered1007", | |
| "👵": "ordered1008", | |
| "👵🏻": "ordered1009", | |
| "👵🏼": "ordered1010", | |
| "👵🏽": "ordered1011", | |
| "👵🏾": "ordered1012", | |
| "👵🏿": "ordered1013", | |
| "👶": "ordered1014", | |
| "👶🏻": "ordered1015", | |
| "👶🏼": "ordered1016", | |
| "👶🏽": "ordered1017", | |
| "👶🏾": "ordered1018", | |
| "👶🏿": "ordered1019", | |
| "👷": "ordered1020", | |
| "👷🏻": "ordered1021", | |
| "👷🏼": "ordered1022", | |
| "👷🏽": "ordered1023", | |
| "👷🏾": "ordered1024", | |
| "👷🏿": "ordered1025", | |
| "👸": "ordered1026", | |
| "👸🏻": "ordered1027", | |
| "👸🏼": "ordered1028", | |
| "👸🏽": "ordered1029", | |
| "👸🏾": "ordered1030", | |
| "👸🏿": "ordered1031", | |
| "👹": "ordered1032", | |
| "👺": "ordered1033", | |
| "👻": "ordered1034", | |
| "👼": "ordered1035", | |
| "👼🏻": "ordered1036", | |
| "👼🏼": "ordered1037", | |
| "👼🏽": "ordered1038", | |
| "👼🏾": "ordered1039", | |
| "👼🏿": "ordered1040", | |
| "👽": "ordered1041", | |
| "👾": "ordered1042", | |
| "👿": "ordered1043", | |
| "💀": "ordered1044", | |
| "💁": "ordered1045", | |
| "💁🏻": "ordered1046", | |
| "💁🏼": "ordered1047", | |
| "💁🏽": "ordered1048", | |
| "💁🏾": "ordered1049", | |
| "💁🏿": "ordered1050", | |
| "💂": "ordered1051", | |
| "💂🏻": "ordered1052", | |
| "💂🏼": "ordered1053", | |
| "💂🏽": "ordered1054", | |
| "💂🏾": "ordered1055", | |
| "💂🏿": "ordered1056", | |
| "💃": "ordered1057", | |
| "💃🏻": "ordered1058", | |
| "💃🏼": "ordered1059", | |
| "💃🏽": "ordered1060", | |
| "💃🏾": "ordered1061", | |
| "💃🏿": "ordered1062", | |
| "💄": "ordered1063", | |
| "💅": "ordered1064", | |
| "💅🏻": "ordered1065", | |
| "💅🏼": "ordered1066", | |
| "💅🏽": "ordered1067", | |
| "💅🏾": "ordered1068", | |
| "💅🏿": "ordered1069", | |
| "💆": "ordered1070", | |
| "💆🏻": "ordered1071", | |
| "💆🏼": "ordered1072", | |
| "💆🏽": "ordered1073", | |
| "💆🏾": "ordered1074", | |
| "💆🏿": "ordered1075", | |
| "💇": "ordered1076", | |
| "💇🏻": "ordered1077", | |
| "💇🏼": "ordered1078", | |
| "💇🏽": "ordered1079", | |
| "💇🏾": "ordered1080", | |
| "💇🏿": "ordered1081", | |
| "💈": "ordered1082", | |
| "💉": "ordered1083", | |
| "💊": "ordered1084", | |
| "💋": "ordered1085", | |
| "💌": "ordered1086", | |
| "💍": "ordered1087", | |
| "💎": "ordered1088", | |
| "💏": "ordered1089", | |
| "👨❤️💋👨": "ordered1090", | |
| "👩❤️💋👩": "ordered1091", | |
| "💐": "ordered1092", | |
| "💑": "ordered1093", | |
| "👨❤️👨": "ordered1094", | |
| "👩❤️👩": "ordered1095", | |
| "💒": "ordered1096", | |
| "💓": "ordered1097", | |
| "💔": "ordered1098", | |
| "💕": "ordered1099", | |
| "💖": "ordered1100", | |
| "💗": "ordered1101", | |
| "💘": "ordered1102", | |
| "💙": "ordered1103", | |
| "💚": "ordered1104", | |
| "💛": "ordered1105", | |
| "💜": "ordered1106", | |
| "💝": "ordered1107", | |
| "💞": "ordered1108", | |
| "💟": "ordered1109", | |
| "💠": "ordered1110", | |
| "💡": "ordered1111", | |
| "💢": "ordered1112", | |
| "💣": "ordered1113", | |
| "💤": "ordered1114", | |
| "💥": "ordered1115", | |
| "💦": "ordered1116", | |
| "💧": "ordered1117", | |
| "💨": "ordered1118", | |
| "💩": "ordered1119", | |
| "💪": "ordered1120", | |
| "💪🏻": "ordered1121", | |
| "💪🏼": "ordered1122", | |
| "💪🏽": "ordered1123", | |
| "💪🏾": "ordered1124", | |
| "💪🏿": "ordered1125", | |
| "💫": "ordered1126", | |
| "💬": "ordered1127", | |
| "💭": "ordered1128", | |
| "💮": "ordered1129", | |
| "💯": "ordered1130", | |
| "💰": "ordered1131", | |
| "💱": "ordered1132", | |
| "💲": "ordered1133", | |
| "💳": "ordered1134", | |
| "💴": "ordered1135", | |
| "💵": "ordered1136", | |
| "💶": "ordered1137", | |
| "💷": "ordered1138", | |
| "💸": "ordered1139", | |
| "💹": "ordered1140", | |
| "💺": "ordered1141", | |
| "💻": "ordered1142", | |
| "💼": "ordered1143", | |
| "💽": "ordered1144", | |
| "💾": "ordered1145", | |
| "💿": "ordered1146", | |
| "📀": "ordered1147", | |
| "📁": "ordered1148", | |
| "📂": "ordered1149", | |
| "📃": "ordered1150", | |
| "📄": "ordered1151", | |
| "📅": "ordered1152", | |
| "📆": "ordered1153", | |
| "📇": "ordered1154", | |
| "📈": "ordered1155", | |
| "📉": "ordered1156", | |
| "📊": "ordered1157", | |
| "📋": "ordered1158", | |
| "📌": "ordered1159", | |
| "📍": "ordered1160", | |
| "📎": "ordered1161", | |
| "📏": "ordered1162", | |
| "📐": "ordered1163", | |
| "📑": "ordered1164", | |
| "📒": "ordered1165", | |
| "📓": "ordered1166", | |
| "📔": "ordered1167", | |
| "📕": "ordered1168", | |
| "📖": "ordered1169", | |
| "📗": "ordered1170", | |
| "📘": "ordered1171", | |
| "📙": "ordered1172", | |
| "📚": "ordered1173", | |
| "📛": "ordered1174", | |
| "📜": "ordered1175", | |
| "📝": "ordered1176", | |
| "📞": "ordered1177", | |
| "📟": "ordered1178", | |
| "📠": "ordered1179", | |
| "📡": "ordered1180", | |
| "📢": "ordered1181", | |
| "📣": "ordered1182", | |
| "📤": "ordered1183", | |
| "📥": "ordered1184", | |
| "📦": "ordered1185", | |
| "📧": "ordered1186", | |
| "📨": "ordered1187", | |
| "📩": "ordered1188", | |
| "📪": "ordered1189", | |
| "📫": "ordered1190", | |
| "📬": "ordered1191", | |
| "📭": "ordered1192", | |
| "📮": "ordered1193", | |
| "📯": "ordered1194", | |
| "📰": "ordered1195", | |
| "📱": "ordered1196", | |
| "📲": "ordered1197", | |
| "📳": "ordered1198", | |
| "📴": "ordered1199", | |
| "📵": "ordered1200", | |
| "📶": "ordered1201", | |
| "📷": "ordered1202", | |
| "📸": "ordered1203", | |
| "📹": "ordered1204", | |
| "📺": "ordered1205", | |
| "📻": "ordered1206", | |
| "📼": "ordered1207", | |
| "📽": "ordered1208", | |
| "📿": "ordered1209", | |
| "🔀": "ordered1210", | |
| "🔁": "ordered1211", | |
| "🔂": "ordered1212", | |
| "🔃": "ordered1213", | |
| "🔄": "ordered1214", | |
| "🔅": "ordered1215", | |
| "🔆": "ordered1216", | |
| "🔇": "ordered1217", | |
| "🔈": "ordered1218", | |
| "🔉": "ordered1219", | |
| "🔊": "ordered1220", | |
| "🔋": "ordered1221", | |
| "🔌": "ordered1222", | |
| "🔍": "ordered1223", | |
| "🔎": "ordered1224", | |
| "🔏": "ordered1225", | |
| "🔐": "ordered1226", | |
| "🔑": "ordered1227", | |
| "🔒": "ordered1228", | |
| "🔓": "ordered1229", | |
| "🔔": "ordered1230", | |
| "🔕": "ordered1231", | |
| "🔖": "ordered1232", | |
| "🔗": "ordered1233", | |
| "🔘": "ordered1234", | |
| "🔙": "ordered1235", | |
| "🔚": "ordered1236", | |
| "🔛": "ordered1237", | |
| "🔜": "ordered1238", | |
| "🔝": "ordered1239", | |
| "🔞": "ordered1240", | |
| "🔟": "ordered1241", | |
| "🔠": "ordered1242", | |
| "🔡": "ordered1243", | |
| "🔢": "ordered1244", | |
| "🔣": "ordered1245", | |
| "🔤": "ordered1246", | |
| "🔥": "ordered1247", | |
| "🔦": "ordered1248", | |
| "🔧": "ordered1249", | |
| "🔨": "ordered1250", | |
| "🔩": "ordered1251", | |
| "🔪": "ordered1252", | |
| "🔫": "ordered1253", | |
| "🔬": "ordered1254", | |
| "🔭": "ordered1255", | |
| "🔮": "ordered1256", | |
| "🔯": "ordered1257", | |
| "🔰": "ordered1258", | |
| "🔱": "ordered1259", | |
| "🔲": "ordered1260", | |
| "🔳": "ordered1261", | |
| "🔴": "ordered1262", | |
| "🔵": "ordered1263", | |
| "🔶": "ordered1264", | |
| "🔷": "ordered1265", | |
| "🔸": "ordered1266", | |
| "🔹": "ordered1267", | |
| "🔺": "ordered1268", | |
| "🔻": "ordered1269", | |
| "🔼": "ordered1270", | |
| "🔽": "ordered1271", | |
| "🕉": "ordered1272", | |
| "🕊": "ordered1273", | |
| "🕋": "ordered1274", | |
| "🕌": "ordered1275", | |
| "🕍": "ordered1276", | |
| "🕎": "ordered1277", | |
| "🕐": "ordered1278", | |
| "🕑": "ordered1279", | |
| "🕒": "ordered1280", | |
| "🕓": "ordered1281", | |
| "🕔": "ordered1282", | |
| "🕕": "ordered1283", | |
| "🕖": "ordered1284", | |
| "🕗": "ordered1285", | |
| "🕘": "ordered1286", | |
| "🕙": "ordered1287", | |
| "🕚": "ordered1288", | |
| "🕛": "ordered1289", | |
| "🕜": "ordered1290", | |
| "🕝": "ordered1291", | |
| "🕞": "ordered1292", | |
| "🕟": "ordered1293", | |
| "🕠": "ordered1294", | |
| "🕡": "ordered1295", | |
| "🕢": "ordered1296", | |
| "🕣": "ordered1297", | |
| "🕤": "ordered1298", | |
| "🕥": "ordered1299", | |
| "🕦": "ordered1300", | |
| "🕧": "ordered1301", | |
| "🕯": "ordered1302", | |
| "🕰": "ordered1303", | |
| "🕳": "ordered1304", | |
| "🕴": "ordered1305", | |
| "🕵": "ordered1306", | |
| "🕶": "ordered1307", | |
| "🕷": "ordered1308", | |
| "🕸": "ordered1309", | |
| "🕹": "ordered1310", | |
| "🖇": "ordered1311", | |
| "🖊": "ordered1312", | |
| "🖋": "ordered1313", | |
| "🖌": "ordered1314", | |
| "🖍": "ordered1315", | |
| "🖐": "ordered1316", | |
| "🖐🏻": "ordered1317", | |
| "🖐🏼": "ordered1318", | |
| "🖐🏽": "ordered1319", | |
| "🖐🏾": "ordered1320", | |
| "🖐🏿": "ordered1321", | |
| "🖕": "ordered1322", | |
| "🖕🏻": "ordered1323", | |
| "🖕🏼": "ordered1324", | |
| "🖕🏽": "ordered1325", | |
| "🖕🏾": "ordered1326", | |
| "🖕🏿": "ordered1327", | |
| "🖖": "ordered1328", | |
| "🖖🏻": "ordered1329", | |
| "🖖🏼": "ordered1330", | |
| "🖖🏽": "ordered1331", | |
| "🖖🏾": "ordered1332", | |
| "🖖🏿": "ordered1333", | |
| "🖥": "ordered1334", | |
| "🖨": "ordered1335", | |
| "🖱": "ordered1336", | |
| "🖲": "ordered1337", | |
| "🖼": "ordered1338", | |
| "🗂": "ordered1339", | |
| "🗃": "ordered1340", | |
| "🗄": "ordered1341", | |
| "🗑": "ordered1342", | |
| "🗒": "ordered1343", | |
| "🗓": "ordered1344", | |
| "🗜": "ordered1345", | |
| "🗝": "ordered1346", | |
| "🗞": "ordered1347", | |
| "🗡": "ordered1348", | |
| "🗣": "ordered1349", | |
| "🗨": "ordered1350", | |
| "🗯": "ordered1351", | |
| "🗳": "ordered1352", | |
| "🗺": "ordered1353", | |
| "🗻": "ordered1354", | |
| "🗼": "ordered1355", | |
| "🗽": "ordered1356", | |
| "🗾": "ordered1357", | |
| "🗿": "ordered1358", | |
| "😀": "ordered1359", | |
| "😁": "ordered1360", | |
| "😂": "ordered1361", | |
| "😃": "ordered1362", | |
| "😄": "ordered1363", | |
| "😅": "ordered1364", | |
| "😆": "ordered1365", | |
| "😇": "ordered1366", | |
| "😈": "ordered1367", | |
| "😉": "ordered1368", | |
| "😊": "ordered1369", | |
| "😋": "ordered1370", | |
| "😌": "ordered1371", | |
| "😍": "ordered1372", | |
| "😎": "ordered1373", | |
| "😏": "ordered1374", | |
| "😐": "ordered1375", | |
| "😑": "ordered1376", | |
| "😒": "ordered1377", | |
| "😓": "ordered1378", | |
| "😔": "ordered1379", | |
| "😕": "ordered1380", | |
| "😖": "ordered1381", | |
| "😗": "ordered1382", | |
| "😘": "ordered1383", | |
| "😙": "ordered1384", | |
| "😚": "ordered1385", | |
| "😛": "ordered1386", | |
| "😜": "ordered1387", | |
| "😝": "ordered1388", | |
| "😞": "ordered1389", | |
| "😟": "ordered1390", | |
| "😠": "ordered1391", | |
| "😡": "ordered1392", | |
| "😢": "ordered1393", | |
| "😣": "ordered1394", | |
| "😤": "ordered1395", | |
| "😥": "ordered1396", | |
| "😦": "ordered1397", | |
| "😧": "ordered1398", | |
| "😨": "ordered1399", | |
| "😩": "ordered1400", | |
| "😪": "ordered1401", | |
| "😫": "ordered1402", | |
| "😬": "ordered1403", | |
| "😭": "ordered1404", | |
| "😮": "ordered1405", | |
| "😯": "ordered1406", | |
| "😰": "ordered1407", | |
| "😱": "ordered1408", | |
| "😲": "ordered1409", | |
| "😳": "ordered1410", | |
| "😴": "ordered1411", | |
| "😵": "ordered1412", | |
| "😶": "ordered1413", | |
| "😷": "ordered1414", | |
| "😸": "ordered1415", | |
| "😹": "ordered1416", | |
| "😺": "ordered1417", | |
| "😻": "ordered1418", | |
| "😼": "ordered1419", | |
| "😽": "ordered1420", | |
| "😾": "ordered1421", | |
| "😿": "ordered1422", | |
| "🙀": "ordered1423", | |
| "🙁": "ordered1424", | |
| "🙂": "ordered1425", | |
| "🙃": "ordered1426", | |
| "🙄": "ordered1427", | |
| "🙅": "ordered1428", | |
| "🙅🏻": "ordered1429", | |
| "🙅🏼": "ordered1430", | |
| "🙅🏽": "ordered1431", | |
| "🙅🏾": "ordered1432", | |
| "🙅🏿": "ordered1433", | |
| "🙆": "ordered1434", | |
| "🙆🏻": "ordered1435", | |
| "🙆🏼": "ordered1436", | |
| "🙆🏽": "ordered1437", | |
| "🙆🏾": "ordered1438", | |
| "🙆🏿": "ordered1439", | |
| "🙇": "ordered1440", | |
| "🙇🏻": "ordered1441", | |
| "🙇🏼": "ordered1442", | |
| "🙇🏽": "ordered1443", | |
| "🙇🏾": "ordered1444", | |
| "🙇🏿": "ordered1445", | |
| "🙈": "ordered1446", | |
| "🙉": "ordered1447", | |
| "🙊": "ordered1448", | |
| "🙋": "ordered1449", | |
| "🙋🏻": "ordered1450", | |
| "🙋🏼": "ordered1451", | |
| "🙋🏽": "ordered1452", | |
| "🙋🏾": "ordered1453", | |
| "🙋🏿": "ordered1454", | |
| "🙌": "ordered1455", | |
| "🙌🏻": "ordered1456", | |
| "🙌🏼": "ordered1457", | |
| "🙌🏽": "ordered1458", | |
| "🙌🏾": "ordered1459", | |
| "🙌🏿": "ordered1460", | |
| "🙍": "ordered1461", | |
| "🙍🏻": "ordered1462", | |
| "🙍🏼": "ordered1463", | |
| "🙍🏽": "ordered1464", | |
| "🙍🏾": "ordered1465", | |
| "🙍🏿": "ordered1466", | |
| "🙎": "ordered1467", | |
| "🙎🏻": "ordered1468", | |
| "🙎🏼": "ordered1469", | |
| "🙎🏽": "ordered1470", | |
| "🙎🏾": "ordered1471", | |
| "🙎🏿": "ordered1472", | |
| "🙏": "ordered1473", | |
| "🙏🏻": "ordered1474", | |
| "🙏🏼": "ordered1475", | |
| "🙏🏽": "ordered1476", | |
| "🙏🏾": "ordered1477", | |
| "🙏🏿": "ordered1478", | |
| "🚀": "ordered1479", | |
| "🚁": "ordered1480", | |
| "🚂": "ordered1481", | |
| "🚃": "ordered1482", | |
| "🚄": "ordered1483", | |
| "🚅": "ordered1484", | |
| "🚆": "ordered1485", | |
| "🚇": "ordered1486", | |
| "🚈": "ordered1487", | |
| "🚉": "ordered1488", | |
| "🚊": "ordered1489", | |
| "🚋": "ordered1490", | |
| "🚌": "ordered1491", | |
| "🚍": "ordered1492", | |
| "🚎": "ordered1493", | |
| "🚏": "ordered1494", | |
| "🚐": "ordered1495", | |
| "🚑": "ordered1496", | |
| "🚒": "ordered1497", | |
| "🚓": "ordered1498", | |
| "🚔": "ordered1499", | |
| "🚕": "ordered1500", | |
| "🚖": "ordered1501", | |
| "🚗": "ordered1502", | |
| "🚘": "ordered1503", | |
| "🚙": "ordered1504", | |
| "🚚": "ordered1505", | |
| "🚛": "ordered1506", | |
| "🚜": "ordered1507", | |
| "🚝": "ordered1508", | |
| "🚞": "ordered1509", | |
| "🚟": "ordered1510", | |
| "🚠": "ordered1511", | |
| "🚡": "ordered1512", | |
| "🚢": "ordered1513", | |
| "🚣": "ordered1514", | |
| "🚣🏻": "ordered1515", | |
| "🚣🏼": "ordered1516", | |
| "🚣🏽": "ordered1517", | |
| "🚣🏾": "ordered1518", | |
| "🚣🏿": "ordered1519", | |
| "🚤": "ordered1520", | |
| "🚥": "ordered1521", | |
| "🚦": "ordered1522", | |
| "🚧": "ordered1523", | |
| "🚨": "ordered1524", | |
| "🚩": "ordered1525", | |
| "🚪": "ordered1526", | |
| "🚫": "ordered1527", | |
| "🚬": "ordered1528", | |
| "🚭": "ordered1529", | |
| "🚮": "ordered1530", | |
| "🚯": "ordered1531", | |
| "🚰": "ordered1532", | |
| "🚱": "ordered1533", | |
| "🚲": "ordered1534", | |
| "🚳": "ordered1535", | |
| "🚴": "ordered1536", | |
| "🚴🏻": "ordered1537", | |
| "🚴🏼": "ordered1538", | |
| "🚴🏽": "ordered1539", | |
| "🚴🏾": "ordered1540", | |
| "🚴🏿": "ordered1541", | |
| "🚵": "ordered1542", | |
| "🚵🏻": "ordered1543", | |
| "🚵🏼": "ordered1544", | |
| "🚵🏽": "ordered1545", | |
| "🚵🏾": "ordered1546", | |
| "🚵🏿": "ordered1547", | |
| "🚶": "ordered1548", | |
| "🚶🏻": "ordered1549", | |
| "🚶🏼": "ordered1550", | |
| "🚶🏽": "ordered1551", | |
| "🚶🏾": "ordered1552", | |
| "🚶🏿": "ordered1553", | |
| "🚷": "ordered1554", | |
| "🚸": "ordered1555", | |
| "🚹": "ordered1556", | |
| "🚺": "ordered1557", | |
| "🚻": "ordered1558", | |
| "🚼": "ordered1559", | |
| "🚽": "ordered1560", | |
| "🚾": "ordered1561", | |
| "🚿": "ordered1562", | |
| "🛀": "ordered1563", | |
| "🛀🏻": "ordered1564", | |
| "🛀🏼": "ordered1565", | |
| "🛀🏽": "ordered1566", | |
| "🛀🏾": "ordered1567", | |
| "🛀🏿": "ordered1568", | |
| "🛁": "ordered1569", | |
| "🛂": "ordered1570", | |
| "🛃": "ordered1571", | |
| "🛄": "ordered1572", | |
| "🛅": "ordered1573", | |
| "🛋": "ordered1574", | |
| "🛌": "ordered1575", | |
| "🛍": "ordered1576", | |
| "🛎": "ordered1577", | |
| "🛏": "ordered1578", | |
| "🛐": "ordered1579", | |
| "🛠": "ordered1580", | |
| "🛡": "ordered1581", | |
| "🛢": "ordered1582", | |
| "🛣": "ordered1583", | |
| "🛤": "ordered1584", | |
| "🛥": "ordered1585", | |
| "🛩": "ordered1586", | |
| "🛫": "ordered1587", | |
| "🛬": "ordered1588", | |
| "🛰": "ordered1589", | |
| "🛳": "ordered1590", | |
| "🤐": "ordered1591", | |
| "🤑": "ordered1592", | |
| "🤒": "ordered1593", | |
| "🤓": "ordered1594", | |
| "🤔": "ordered1595", | |
| "🤕": "ordered1596", | |
| "🤖": "ordered1597", | |
| "🤗": "ordered1598", | |
| "🤘": "ordered1599", | |
| "🤘🏻": "ordered1600", | |
| "🤘🏼": "ordered1601", | |
| "🤘🏽": "ordered1602", | |
| "🤘🏾": "ordered1603", | |
| "🤘🏿": "ordered1604", | |
| "🦀": "ordered1605", | |
| "🦁": "ordered1606", | |
| "🦂": "ordered1607", | |
| "🦃": "ordered1608", | |
| "🦄": "ordered1609", | |
| "🧀": "ordered1610", | |
| "🇽🇪": "ordered1611" | |
| } | |
| }, function(e, t) { | |
| "use strict"; | |
| e.exports = { | |
| ach: { | |
| name: "Acholi", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| af: { | |
| name: "Afrikaans", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ak: { | |
| name: "Akan", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| am: { | |
| name: "Amharic", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| an: { | |
| name: "Aragonese", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ar: { | |
| name: "Arabic", | |
| numbers: [0, 1, 2, 3, 11, 100], | |
| plurals: function(e) { | |
| return Number(0 === e ? 0 : 1 == e ? 1 : 2 == e ? 2 : e % 100 >= 3 && 10 >= e % 100 ? 3 : e % 100 >= 11 ? 4 : 5) | |
| } | |
| }, | |
| arn: { | |
| name: "Mapudungun", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| ast: { | |
| name: "Asturian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ay: { | |
| name: "Aymará", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| az: { | |
| name: "Azerbaijani", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| be: { | |
| name: "Belarusian", | |
| numbers: [1, 2, 5], | |
| plurals: function(e) { | |
| return Number(e % 10 == 1 && e % 100 != 11 ? 0 : e % 10 >= 2 && 4 >= e % 10 && (10 > e % 100 || e % 100 >= 20) ? 1 : 2) | |
| } | |
| }, | |
| bg: { | |
| name: "Bulgarian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| bn: { | |
| name: "Bengali", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| bo: { | |
| name: "Tibetan", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| br: { | |
| name: "Breton", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| bs: { | |
| name: "Bosnian", | |
| numbers: [1, 2, 5], | |
| plurals: function(e) { | |
| return Number(e % 10 == 1 && e % 100 != 11 ? 0 : e % 10 >= 2 && 4 >= e % 10 && (10 > e % 100 || e % 100 >= 20) ? 1 : 2) | |
| } | |
| }, | |
| ca: { | |
| name: "Catalan", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| cgg: { | |
| name: "Chiga", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| cs: { | |
| name: "Czech", | |
| numbers: [1, 2, 5], | |
| plurals: function(e) { | |
| return Number(1 == e ? 0 : e >= 2 && 4 >= e ? 1 : 2) | |
| } | |
| }, | |
| csb: { | |
| name: "Kashubian", | |
| numbers: [1, 2, 5], | |
| plurals: function(e) { | |
| return Number(1 == e ? 0 : e % 10 >= 2 && 4 >= e % 10 && (10 > e % 100 || e % 100 >= 20) ? 1 : 2) | |
| } | |
| }, | |
| cy: { | |
| name: "Welsh", | |
| numbers: [1, 2, 3, 8], | |
| plurals: function(e) { | |
| return Number(1 == e ? 0 : 2 == e ? 1 : 8 != e && 11 != e ? 2 : 3) | |
| } | |
| }, | |
| da: { | |
| name: "Danish", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| de: { | |
| name: "German", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| dz: { | |
| name: "Dzongkha", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| el: { | |
| name: "Greek", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| en: { | |
| name: "English", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| eo: { | |
| name: "Esperanto", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| es: { | |
| name: "Spanish", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| es_ar: { | |
| name: "Argentinean Spanish", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| et: { | |
| name: "Estonian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| eu: { | |
| name: "Basque", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| fa: { | |
| name: "Persian", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| fi: { | |
| name: "Finnish", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| fil: { | |
| name: "Filipino", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| fo: { | |
| name: "Faroese", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| fr: { | |
| name: "French", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| fur: { | |
| name: "Friulian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| fy: { | |
| name: "Frisian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ga: { | |
| name: "Irish", | |
| numbers: [1, 2, 3, 7, 11], | |
| plurals: function(e) { | |
| return Number(1 == e ? 0 : 2 == e ? 1 : 7 > e ? 2 : 11 > e ? 3 : 4) | |
| } | |
| }, | |
| gd: { | |
| name: "Scottish Gaelic", | |
| numbers: [1, 2, 3, 20], | |
| plurals: function(e) { | |
| return Number(1 == e || 11 == e ? 0 : 2 == e || 12 == e ? 1 : e > 2 && 20 > e ? 2 : 3) | |
| } | |
| }, | |
| gl: { | |
| name: "Galician", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| gu: { | |
| name: "Gujarati", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| gun: { | |
| name: "Gun", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| ha: { | |
| name: "Hausa", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| he: { | |
| name: "Hebrew", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| hi: { | |
| name: "Hindi", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| hr: { | |
| name: "Croatian", | |
| numbers: [1, 2, 5], | |
| plurals: function(e) { | |
| return Number(e % 10 == 1 && e % 100 != 11 ? 0 : e % 10 >= 2 && 4 >= e % 10 && (10 > e % 100 || e % 100 >= 20) ? 1 : 2) | |
| } | |
| }, | |
| hu: { | |
| name: "Hungarian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| hy: { | |
| name: "Armenian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ia: { | |
| name: "Interlingua", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| id: { | |
| name: "Indonesian", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| is: { | |
| name: "Icelandic", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e % 10 != 1 || e % 100 == 11) | |
| } | |
| }, | |
| it: { | |
| name: "Italian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ja: { | |
| name: "Japanese", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| jbo: { | |
| name: "Lojban", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| jv: { | |
| name: "Javanese", | |
| numbers: [0, 1], | |
| plurals: function(e) { | |
| return Number(0 !== e) | |
| } | |
| }, | |
| ka: { | |
| name: "Georgian", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| kk: { | |
| name: "Kazakh", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| km: { | |
| name: "Khmer", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| kn: { | |
| name: "Kannada", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ko: { | |
| name: "Korean", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| ku: { | |
| name: "Kurdish", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| kw: { | |
| name: "Cornish", | |
| numbers: [1, 2, 3, 4], | |
| plurals: function(e) { | |
| return Number(1 == e ? 0 : 2 == e ? 1 : 3 == e ? 2 : 3) | |
| } | |
| }, | |
| ky: { | |
| name: "Kyrgyz", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| lb: { | |
| name: "Letzeburgesch", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ln: { | |
| name: "Lingala", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| lo: { | |
| name: "Lao", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| lt: { | |
| name: "Lithuanian", | |
| numbers: [1, 2, 10], | |
| plurals: function(e) { | |
| return Number(e % 10 == 1 && e % 100 != 11 ? 0 : e % 10 >= 2 && (10 > e % 100 || e % 100 >= 20) ? 1 : 2) | |
| } | |
| }, | |
| lv: { | |
| name: "Latvian", | |
| numbers: [0, 1, 2], | |
| plurals: function(e) { | |
| return Number(e % 10 == 1 && e % 100 != 11 ? 0 : 0 !== e ? 1 : 2) | |
| } | |
| }, | |
| mai: { | |
| name: "Maithili", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| mfe: { | |
| name: "Mauritian Creole", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| mg: { | |
| name: "Malagasy", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| mi: { | |
| name: "Maori", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| mk: { | |
| name: "Macedonian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 == e || e % 10 == 1 ? 0 : 1) | |
| } | |
| }, | |
| ml: { | |
| name: "Malayalam", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| mn: { | |
| name: "Mongolian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| mnk: { | |
| name: "Mandinka", | |
| numbers: [0, 1, 2], | |
| plurals: function(e) { | |
| return Number(0 === e ? 0 : 1 == e ? 1 : 2) | |
| } | |
| }, | |
| mr: { | |
| name: "Marathi", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ms: { | |
| name: "Malay", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| mt: { | |
| name: "Maltese", | |
| numbers: [1, 2, 11, 20], | |
| plurals: function(e) { | |
| return Number(1 == e ? 0 : 0 === e || e % 100 > 1 && 11 > e % 100 ? 1 : e % 100 > 10 && 20 > e % 100 ? 2 : 3) | |
| } | |
| }, | |
| nah: { | |
| name: "Nahuatl", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| nap: { | |
| name: "Neapolitan", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| nb: { | |
| name: "Norwegian Bokmal", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ne: { | |
| name: "Nepali", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| nl: { | |
| name: "Dutch", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| nn: { | |
| name: "Norwegian Nynorsk", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| no: { | |
| name: "Norwegian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| nso: { | |
| name: "Northern Sotho", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| oc: { | |
| name: "Occitan", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| or: { | |
| name: "Oriya", | |
| numbers: [2, 1], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| pa: { | |
| name: "Punjabi", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| pap: { | |
| name: "Papiamento", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| pl: { | |
| name: "Polish", | |
| numbers: [1, 2, 5], | |
| plurals: function(e) { | |
| return Number(1 == e ? 0 : e % 10 >= 2 && 4 >= e % 10 && (10 > e % 100 || e % 100 >= 20) ? 1 : 2) | |
| } | |
| }, | |
| pms: { | |
| name: "Piemontese", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ps: { | |
| name: "Pashto", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| pt: { | |
| name: "Portuguese", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| pt_br: { | |
| name: "Brazilian Portuguese", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| rm: { | |
| name: "Romansh", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ro: { | |
| name: "Romanian", | |
| numbers: [1, 2, 20], | |
| plurals: function(e) { | |
| return Number(1 == e ? 0 : 0 === e || e % 100 > 0 && 20 > e % 100 ? 1 : 2) | |
| } | |
| }, | |
| ru: { | |
| name: "Russian", | |
| numbers: [1, 2, 5], | |
| plurals: function(e) { | |
| return Number(e % 10 == 1 && e % 100 != 11 ? 0 : e % 10 >= 2 && 4 >= e % 10 && (10 > e % 100 || e % 100 >= 20) ? 1 : 2) | |
| } | |
| }, | |
| sah: { | |
| name: "Yakut", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| sco: { | |
| name: "Scots", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| se: { | |
| name: "Northern Sami", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| si: { | |
| name: "Sinhala", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| sk: { | |
| name: "Slovak", | |
| numbers: [1, 2, 5], | |
| plurals: function(e) { | |
| return Number(1 == e ? 0 : e >= 2 && 4 >= e ? 1 : 2) | |
| } | |
| }, | |
| sl: { | |
| name: "Slovenian", | |
| numbers: [5, 1, 2, 3], | |
| plurals: function(e) { | |
| return Number(e % 100 == 1 ? 1 : e % 100 == 2 ? 2 : e % 100 == 3 || e % 100 == 4 ? 3 : 0) | |
| } | |
| }, | |
| so: { | |
| name: "Somali", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| son: { | |
| name: "Songhay", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| sq: { | |
| name: "Albanian", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| sr: { | |
| name: "Serbian", | |
| numbers: [1, 2, 5], | |
| plurals: function(e) { | |
| return Number(e % 10 == 1 && e % 100 != 11 ? 0 : e % 10 >= 2 && 4 >= e % 10 && (10 > e % 100 || e % 100 >= 20) ? 1 : 2) | |
| } | |
| }, | |
| su: { | |
| name: "Sundanese", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| sv: { | |
| name: "Swedish", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| sw: { | |
| name: "Swahili", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| ta: { | |
| name: "Tamil", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| te: { | |
| name: "Telugu", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| tg: { | |
| name: "Tajik", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| th: { | |
| name: "Thai", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| ti: { | |
| name: "Tigrinya", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| tk: { | |
| name: "Turkmen", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| tr: { | |
| name: "Turkish", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| tt: { | |
| name: "Tatar", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| ug: { | |
| name: "Uyghur", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| uk: { | |
| name: "Ukrainian", | |
| numbers: [1, 2, 5], | |
| plurals: function(e) { | |
| return Number(e % 10 == 1 && e % 100 != 11 ? 0 : e % 10 >= 2 && 4 >= e % 10 && (10 > e % 100 || e % 100 >= 20) ? 1 : 2) | |
| } | |
| }, | |
| ur: { | |
| name: "Urdu", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| uz: { | |
| name: "Uzbek", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| vi: { | |
| name: "Vietnamese", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| wa: { | |
| name: "Walloon", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(e > 1) | |
| } | |
| }, | |
| wo: { | |
| name: "Wolof", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| }, | |
| yo: { | |
| name: "Yoruba", | |
| numbers: [1, 2], | |
| plurals: function(e) { | |
| return Number(1 != e) | |
| } | |
| }, | |
| zh: { | |
| name: "Chinese", | |
| numbers: [1], | |
| plurals: function(e) { | |
| return 0 | |
| } | |
| } | |
| } | |
| }, function(e, t) { | |
| "use strict"; | |
| var r = [.1, .82, .25, 1], | |
| n = [.69, 0, .79, .14], | |
| o = [.84, .07, .93, .46]; | |
| Velocity.RegisterEffect("attach.Down", { | |
| defaultDuration: 300, | |
| calls: [ | |
| [{ | |
| opacity: [1, 0], | |
| translateY: ["0%", "-100%"], | |
| scaleX: [1, .3], | |
| scaleY: [1, .3] | |
| }, 1, { | |
| easing: [300, 22] | |
| }] | |
| ] | |
| }), Velocity.RegisterEffect("attach.Up", { | |
| defaultDuration: 200, | |
| easing: n, | |
| calls: [ | |
| [{ | |
| opacity: [0, 1], | |
| translateY: ["-150%", "0%"], | |
| scaleX: [.3, 1], | |
| scaleY: [.3, 1] | |
| }, 1, { | |
| easing: [.33, 0, .39, .91] | |
| }] | |
| ] | |
| }), Velocity.RegisterEffect("dropdown.Down", { | |
| defaultDuration: 200, | |
| easing: r, | |
| calls: [ | |
| [{ | |
| opacity: [1, 0], | |
| translateY: ["0%", "-15px"] | |
| }, 1, { | |
| easing: r | |
| }] | |
| ] | |
| }); | |
| var i = { | |
| pop: { | |
| duration: 200, | |
| easing: o, | |
| enter: { | |
| props: { | |
| scaleX: [1, .5], | |
| scaleY: [1, .5], | |
| opacity: [1, 0] | |
| } | |
| }, | |
| leave: { | |
| props: { | |
| scaleX: [.5, 1], | |
| scaleY: [.5, 1], | |
| opacity: [0, 1] | |
| } | |
| } | |
| }, | |
| slide: { | |
| duration: 200, | |
| eaing: r, | |
| enter: { | |
| props: "slideDown" | |
| }, | |
| leave: { | |
| props: "slideUp" | |
| } | |
| }, | |
| scaleY: { | |
| duration: 200, | |
| easing: r, | |
| enter: { | |
| props: { | |
| scaleY: [1, 0], | |
| transformOrigin: "center" | |
| } | |
| }, | |
| leave: { | |
| props: { | |
| scaleY: [0, 1], | |
| transformOrigin: "center" | |
| } | |
| } | |
| }, | |
| scale: { | |
| duration: 500, | |
| easing: r, | |
| enter: { | |
| props: { | |
| scaleX: [1, 0], | |
| scaleY: [1, 0] | |
| } | |
| }, | |
| leave: { | |
| props: { | |
| scaleX: [0, 1], | |
| scaleY: [0, 1] | |
| } | |
| } | |
| }, | |
| fade: { | |
| duration: 200, | |
| easing: r, | |
| enter: { | |
| props: { | |
| opacity: [1, 0] | |
| } | |
| }, | |
| leave: { | |
| props: { | |
| opacity: [0, 1] | |
| } | |
| } | |
| }, | |
| "fade-fast": { | |
| easing: "ease", | |
| enter: { | |
| props: { | |
| opacity: [1, 0] | |
| }, | |
| duration: 150 | |
| }, | |
| leave: { | |
| props: { | |
| opacity: [0, 1] | |
| }, | |
| duration: 100 | |
| } | |
| }, | |
| fade_sifo: { | |
| enter: { | |
| props: { | |
| opacity: [1, 0] | |
| }, | |
| duration: 250 | |
| }, | |
| leave: { | |
| props: { | |
| opacity: [0, 1] | |
| }, | |
| duration: 100 | |
| } | |
| }, | |
| capture: { | |
| enter: { | |
| props: { | |
| opacity: [1, 0] | |
| }, | |
| duration: 350 | |
| }, | |
| leave: [{ | |
| selector: ".snapshot", | |
| props: "transition.bounceDownOut", | |
| duration: 700 | |
| }, { | |
| selector: ".webcam", | |
| props: { | |
| opacity: [0, 1] | |
| }, | |
| duration: 100, | |
| easing: "ease" | |
| }] | |
| }, | |
| butterbar: { | |
| enter: { | |
| props: "slideDown", | |
| easing: r, | |
| duration: 700 | |
| }, | |
| leave: { | |
| props: "slideUp", | |
| easing: n, | |
| duration: 350 | |
| } | |
| }, | |
| modal: { | |
| enter: [{ | |
| props: { | |
| opacity: [1, 0] | |
| }, | |
| duration: 300, | |
| easing: "easeOut" | |
| }, { | |
| selector: ".popup", | |
| props: { | |
| scaleX: [1, 0], | |
| scaleY: [1, 0], | |
| opacity: [1, 1] | |
| }, | |
| easing: [.19, .73, .28, 1], | |
| delay: 180, | |
| duration: 200 | |
| }, { | |
| selector: ".popup", | |
| props: { | |
| opacity: [0, 0] | |
| }, | |
| duration: 180 | |
| }], | |
| leave: [{ | |
| props: { | |
| opacity: [0, 1] | |
| }, | |
| duration: 300, | |
| easing: n, | |
| delay: 100 | |
| }, { | |
| selector: ".popup", | |
| props: { | |
| scaleX: [0, 1], | |
| scaleY: [0, 1] | |
| }, | |
| easing: n, | |
| duration: 200 | |
| }] | |
| }, | |
| "modal-flow": { | |
| enter: [{ | |
| selector: ".backdrop", | |
| props: { | |
| opacity: [1, 0] | |
| }, | |
| duration: 300, | |
| easing: "easeOut" | |
| }, { | |
| selector: ".popup", | |
| props: { | |
| scaleX: [1, 0], | |
| scaleY: [1, 0], | |
| opacity: [1, 1] | |
| }, | |
| easing: [.19, .73, .28, 1], | |
| delay: 180, | |
| duration: 200 | |
| }, { | |
| selector: ".popup", | |
| props: { | |
| opacity: [0, 0] | |
| }, | |
| duration: 180 | |
| }], | |
| leave: [{ | |
| selector: ".backdrop", | |
| props: { | |
| opacity: [0, 1] | |
| }, | |
| duration: 300, | |
| easing: n, | |
| delay: 100 | |
| }, { | |
| selector: ".popup", | |
| props: { | |
| scaleX: [0, 1], | |
| scaleY: [0, 1] | |
| }, | |
| easing: n, | |
| duration: 200 | |
| }] | |
| }, | |
| "flow-transition-modal-push": { | |
| duration: 300, | |
| easing: r, | |
| enter: { | |
| props: { | |
| opacity: [1, 0] | |
| } | |
| }, | |
| leave: { | |
| props: { | |
| opacity: [0, 1] | |
| } | |
| } | |
| }, | |
| "flow-transition-modal-pop": { | |
| duration: 300, | |
| easing: r, | |
| enter: { | |
| props: { | |
| opacity: [1, 0] | |
| } | |
| }, | |
| leave: { | |
| props: { | |
| opacity: [0, 1] | |
| } | |
| } | |
| }, | |
| "flow-transition-drawer-push": { | |
| duration: 300, | |
| easing: r, | |
| enter: { | |
| props: { | |
| translateX: ["0%", "100%"] | |
| } | |
| }, | |
| leave: { | |
| props: { | |
| translateX: ["-100%", "0%"] | |
| } | |
| } | |
| }, | |
| "flow-transition-drawer-pop": { | |
| duration: 300, | |
| easing: r, | |
| enter: { | |
| props: { | |
| translateX: ["0%", "-100%"] | |
| } | |
| }, | |
| leave: { | |
| props: { | |
| translateX: ["100%", "0%"] | |
| } | |
| } | |
| }, | |
| "drawer-left": { | |
| enter: [{ | |
| props: { | |
| translateX: ["0%", "-100%"] | |
| }, | |
| duration: 300, | |
| easing: r | |
| }, { | |
| selector: ".drawer-title", | |
| props: { | |
| translateX: [0, -50], | |
| opacity: [1, 0] | |
| }, | |
| duration: 500, | |
| easing: "easeOut" | |
| }], | |
| leave: [{ | |
| props: { | |
| translateX: ["-100%", "0%"] | |
| }, | |
| duration: 300, | |
| easing: n | |
| }] | |
| }, | |
| "drawer-left-rtl": { | |
| enter: [{ | |
| props: { | |
| translateX: ["0%", "100%"] | |
| }, | |
| duration: 300, | |
| easing: r | |
| }, { | |
| selector: ".drawer-title", | |
| props: { | |
| translateX: [0, 50], | |
| opacity: [1, 0] | |
| }, | |
| duration: 500, | |
| easing: "easeOut" | |
| }], | |
| leave: [{ | |
| props: { | |
| translateX: ["100%", "0%"] | |
| }, | |
| duration: 300, | |
| easing: n | |
| }] | |
| }, | |
| dropdown: { | |
| duration: 300, | |
| easing: r, | |
| enter: [{ | |
| selector: ".menu-item", | |
| props: "dropdown.Down", | |
| delay: 50, | |
| duration: 375, | |
| stagger: 25, | |
| drag: !0 | |
| }, { | |
| props: { | |
| scale: [1, 0] | |
| } | |
| }, { | |
| props: { | |
| opacity: [1, 0] | |
| }, | |
| duration: 100 | |
| }], | |
| leave: { | |
| props: { | |
| scaleX: [0, 1], | |
| scaleY: [0, 1], | |
| opacity: [0, 1] | |
| } | |
| } | |
| }, | |
| "dropdown-picker": { | |
| duration: 300, | |
| easing: r, | |
| enter: [{ | |
| selector: ".menu-item", | |
| props: { | |
| opacity: [1, 0] | |
| }, | |
| delay: 50, | |
| duration: 200 | |
| }, { | |
| selector: ".nib", | |
| props: { | |
| opacity: [1, 0], | |
| rotateZ: ["45deg"], | |
| translateY: ["0%", "-100%"] | |
| } | |
| }, { | |
| props: { | |
| scale: [1, 0] | |
| } | |
| }, { | |
| props: { | |
| opacity: [1, 0] | |
| }, | |
| duration: 100 | |
| }], | |
| leave: [{ | |
| selector: ".menu-item", | |
| props: { | |
| opacity: [1, 0] | |
| }, | |
| duration: 100 | |
| }, { | |
| selector: ".nib", | |
| props: { | |
| opacity: [1, 0] | |
| }, | |
| duration: 150 | |
| }, { | |
| props: { | |
| scaleX: [0, 1], | |
| scaleY: [0, 1], | |
| opacity: [0, 1] | |
| } | |
| }] | |
| }, | |
| "profile-viewer": { | |
| duration: 500, | |
| easing: [.1, 1.03, .28, .99], | |
| leave: [{ | |
| delay: 400, | |
| props: { | |
| opacity: [0, 1] | |
| } | |
| }, { | |
| selector: ".profile-viewer", | |
| props: { | |
| borderRadius: ["50%", "0%"] | |
| } | |
| }] | |
| }, | |
| "media-viewer": { | |
| duration: 300, | |
| easing: [.1, 1.03, .28, .99], | |
| leave: { | |
| selector: ".media-viewer", | |
| props: { | |
| opacity: [0, 1] | |
| } | |
| } | |
| }, | |
| menu: { | |
| enter: { | |
| selector: ".menu-icons-item", | |
| props: "attach.Down", | |
| duration: 700, | |
| stagger: 30, | |
| drag: !0 | |
| }, | |
| leave: { | |
| selector: ".menu-icons-item", | |
| props: "attach.Up", | |
| stagger: 30 | |
| } | |
| }, | |
| emoji: { | |
| duration: 300, | |
| easing: r, | |
| enter: { | |
| props: { | |
| height: [234, 0] | |
| } | |
| }, | |
| leave: { | |
| props: { | |
| height: [0, 234] | |
| } | |
| } | |
| }, | |
| ptt: { | |
| enter: [{ | |
| selector: ".btn-border", | |
| easing: "easeInOut", | |
| props: { | |
| scaleX: [1, .5], | |
| scaleY: [1, .5], | |
| opacity: [1, 0] | |
| }, | |
| duration: 250, | |
| delay: 100 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
How can I access it and use the methods ?