在你的Chrome扩展文件里面,找到 名为uglify.js的文件。
我的文件地址:
C:\Users\jin\AppData\Local\Google\Chrome\User Data\Default\Extensions\gidgenkbbabolejbgbpnhbimgjbffefm\1.7.7_0
实在不行,你手动搜索一下,然后打开之后把文件格式化一下,这个自行百度。然后找到下面这个图的地方。你可以用 Vysor subscription is 这个关键词去搜索,找到这个地方,然后去掉
var e = !1, t = !1 (原文)
改后:
var e = 1, t = 1 (改后)
改完,保存重启。谢谢。
下面的代码下载地址:
完整代码:这里展示:
/**
* Created by jin on 2017/6/27.
*/
!function (e, t) {
function n(e) {
setTimeout(e, 0)
}
function o(e) {
for (var t = e.toString(16); t.length < 4;)t = "0" + t;
return t
}
function i(e) {
return unescape(encodeURIComponent(e))
}
function r(e) {
return decodeURIComponent(escape(e))
}
function s(e) {
return "ArrayBuffer" == e.constructor.name && (e = new Uint8Array(e)), r(String.fromCharCode.apply(null, e))
}
function c(e, t, n) {
e = i(e);
var o = e.length;
n && o++, t || (t = new ArrayBuffer(o));
var r = new Uint8Array(t);
n && (r[e.length] = 0);
for (var s = 0, c = e.length; s < c; s++)r[s] = e.charCodeAt(s);
return t
}
function a(e, t, n) {
"Object" == t.constructor.name && (t = JSON.stringify(t)), u(e, t + "\n", n)
}
function d(e, t) {
function n() {
e.read(function (i) {
for (var r = 0; r < i.byteLength; r++)if (i[r] == we) {
var c = i.subarray(0, r);
o.push(c);
var a = "";
for (var d in o)d = o[d], a += s(d);
var l = i.subarray(r + 1);
return e.unshift(l), void t(a)
}
o.push(i), n()
})
}
var o = [];
n()
}
function l(e, t) {
function n(t) {
o += s(t), e.read(n)
}
var o = "";
e.onClose = function () {
t(o)
}, e.read(n)
}
function u(e, t, n) {
"Object" == t.constructor.name && (t = JSON.stringify(t)), e.write(c(t), n)
}
function h(e, t) {
var n = new Uint8Array(e.byteLength + t.byteLength);
return n.set(e, 0), n.set(t, e.byteLength), n
}
function f(e) {
for (var t = window.atob(e), n = t.length, o = new Uint8Array(n), i = 0; i < n; i++) {
var r = t.charCodeAt(i);
o[i] = r
}
return o.buffer
}
function p(e) {
var t, n, o = "";
for (t = 0; t + 3 <= e.length; t += 3)n = parseInt(e.substring(t, t + 3), 16), o += be.charAt(n >> 6) + be.charAt(63 & n);
for (t + 1 == e.length ? (n = parseInt(e.substring(t, t + 1), 16), o += be.charAt(n << 2)) : t + 2 == e.length && (n = parseInt(e.substring(t, t + 2), 16), o += be.charAt(n >> 2) + be.charAt((3 & n) << 4)); (3 & o.length) > 0;)o += ke;
return o
}
function v(e, t) {
t || (t = window.location);
for (var n = t.search.substring(1), o = n.split("&"), i = 0; i < o.length; i++) {
var r = o[i].split("=");
if (decodeURIComponent(r[0]) == e)return decodeURIComponent(r[1])
}
}
function g(e, t, n, o) {
return e || (e = {items: []}), e.items.push(t), e.timeout || (e.timeout = setTimeout(function () {
delete e.timeout, o(e.items), e.items = []
}, n)), e
}
function m(e, t) {
if (console.log("notification:", e), window.chrome && window.chrome.notifications) {
var n = chrome.runtime.getManifest(), o = n.name;
t = t || n.icons[128], chrome.notifications.create({type: "basic", iconUrl: t, title: o, message: e})
}
}
function y() {
}
function w(e, t) {
return window.chrome && window.chrome.identity ? void chrome.identity.getAuthToken({
interactive: e,
scopes: ["https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/chromewebstore.readonly"]
}, function (e) {
e || console.error("unable to get authToken", chrome.runtime.lastError), t(e)
}) : (console.error("no auth token implemented"), void process.nextTick(t))
}
function b(e) {
e && (this.dataReceived(e), this.dataReceived(null))
}
function k(e, t) {
this.promise = fetch(e).then(function (e) {
this.connected = !0, this.response = e, this.reader = this.response.body.getReader(), this.reader.closed.then(function () {
this.onClose && this.dataReceived(null)
}.bind(this)), this.onResume(), t(this)
}.bind(this), function (e) {
t(null, e)
})
}
function C(e, t, n, o, i) {
o = f(o), n = c(n), window.crypto.subtle.importKey("jwk", {
kty: "RSA",
e: e,
n: t,
alg: "RS1"
}, {name: "RSASSA-PKCS1-v1_5", hash: {name: "SHA-1"}}, !0, ["verify"]).then(function (e) {
window.crypto.subtle.verify({name: "RSASSA-PKCS1-v1_5", hash: {name: "SHA-1"}}, e, o, n).then(function (e) {
return e ? void i() : void i("invalid signature")
}).catch(function (e) {
i("failure to verify", e)
})
}).catch(function (e) {
i("key import failed", e)
})
}
function S() {
}
function A(e, t, n) {
this.adbSocketFactory = e, this.conn = n, this.conn.openSocket = this.openSocket.bind(this);
var o = t.properties.substring(t.properties.indexOf("product")).replace(/ /g, ";").replace("device", "ro.product.device").replace("model", "ro.product.model").replace("product", "ro.product.name").replace(/:/g, "=");
this.properties = "device::" + o + ";"
}
function D(e) {
chrome.storage.local.get("whitelist", function (t) {
var n = {};
return t.whitelist && "Array" == t.whitelist.constructor.name ? ($.each(t.whitelist, function (e, t) {
n[t] = !0
}), void e(n)) : void e(n)
})
}
function I(e, t) {
chrome.storage.local.set({whitelist: Object.keys(e)}, t)
}
function L(e, t) {
D(function (n) {
n[e] = !0, I(n, t)
})
}
function O(e, t) {
chrome.storage.local.get(["whitelist", "serverMode"], function (n) {
if (1 == n.serverMode)return void t(!0);
if (2 != n.serverMode) {
return n.whitelist && "Array" == n.whitelist.constructor.name ? void t(n.whitelist.indexOf(e) != -1, !0) : void t(!1, !0)
}
w(!1, function (n) {
return n ? void $.ajax({
type: "get",
url: "https://billing.vysor.io/whitelist",
headers: {Authorization: "Bearer " + n},
data: {email: e},
error: function () {
console.error("failure checking vysor enterprise whitelist", arguments), t(!1)
},
success: function (n) {
n.whitelist || console.error("access denied to", e, n), t(n.whitelist, !1)
}
}) : (console.error("unable to get token for vysor enterprise whitelist check"), void t(!1))
})
})
}
function R(e) {
return e ? (e.friendlyName && !e.friendlyName.length && delete e.friendlyName, e) : null
}
function E(e) {
window.chrome && window.chrome.storage ? chrome.storage.local.get("device-settings", function (t) {
e(t["device-settings"] || {})
}) : e({})
}
function U(e) {
e.contentWindow._lm = {
_il: We.a(),
_ilc: We.c(),
_cl: We.b.bind(We),
refresh: We.refresh.bind(We),
startPurchase: We.startPurchase.bind(We)
}, e.contentWindow._rl && e.contentWindow._rl()
}
function T(e, t) {
if (De) {
var n = De.contentWindow.shortModal;
n && n(e, t)
}
}
function W() {
T(null, Pe)
}
function P() {
De && De.contentWindow.updateVysorShareServer && De.contentWindow.updateVysorShareServer(Ae)
}
function M(e, t) {
var n = j(e);
console.log(e, n, "status", t);
var o = chrome.app.window.get(n);
o && o.contentWindow.updateWindowStatusText && o.contentWindow.updateWindowStatusText(t)
}
function N(e, t) {
M(e, "Installing Vysor APK..."), AdbUtils.installApk("/Vysor-release.apk", e, t)
}
function _(e, t, n) {
function o(o) {
var i = Math.round(Math.random() * (1 << 30)).toString(16),
r = "echo -n " + i + " > /data/local/tmp/vysor.pwd ; chmod 600 /data/local/tmp/vysor.pwd";
AdbUtils.runMain(e, o, "com.koushikdutta.vysor.Main password=" + i + " keyboard=" + Se, function (o) {
Adb.shell({serialno: e, command: 'sh -c "' + r + '"'}, function (e) {
Socket.eat(o), n(t, i)
})
}, function (e, t) {
e.command = "shell:" + e.command, Adb.sendClientCommand(e, t)
})
}
function i(t) {
M(e, "Connecting..."), AdbUtils.getApkPath(e, "com.koushikdutta.vysor", function (n) {
return n ? void AdbUtils.runMain(e, n, "com.koushikdutta.vysor.ProtocolVersionMain", function (e) {
var o = e.match(/vysor-io-.*?[\r\n]/);
return o && o.length ? (e = o[0], e && (e = e.trim()), console.log("protocol version: " + e), void t("vysor-io-45" != e ? null : n)) : void t(null)
}) : void t()
})
}
M(e, "Connecting..."), i(function (t) {
return t ? void o(t) : (console.log("installing apk"), void N(e, function (t) {
i(function (n) {
return n ? void o(n) : (t || (t = ""), m("Error installing APK:\n" + t.trim()), void x(e))
})
}))
})
}
function x(e) {
var t = j(e), n = chrome.app.window.get(t);
n && n.close()
}
function F(e, t) {
return void _(e, null, t)
}
function B(e, t, n, o) {
isElectron() ? (console.log("adb client socket factory path"), e.contentWindow.adbSocketFactory = null, e.contentWindow.adbSocketFactoryFactory = {
type: "adb-client",
arguments: {serialno: t}
}) : Le[t] ? (console.log("vysor socket fast path"), e.contentWindow.adbSocketFactory = Le[t]) : Ie.isRunning() ? (console.log("adb server socket path"), e.contentWindow.adbSocketFactory = Ie.adbDevices[t]) : (console.log("adb client socket path"), e.contentWindow.adbSocketFactory = Adb.createSocketFactory(t)), U(e), e.contentWindow.openList = G, e.contentWindow.password = o, e.contentWindow.port = n, Me && Me.socket && (e.contentWindow.httpPort = Me.socket.localPort), e.contentWindow.device = Le[t] || $e[t], e.contentWindow.tracker = Ue
}
function V() {
setTimeout(function () {
chrome.app.window.getAll().length || chrome.runtime.reload()
}, 5e3)
}
function j(e) {
var t = e;
return Le[e] && Le[e].id ? t = Le[e].id : $e[e] && $e[e].id ? t = $e[e].id : Ye[e] && (t = Ye[e]), t
}
function K(e, t, n) {
ee();
var o = j(e), i = chrome.app.window.get(o);
return i ? (i.show(), t && F(e, function (t, n) {
B(i, e, t, n), i.contentWindow.connectionReady()
}), void(n && n(i))) : void chrome.app.window.create("screen.html", {
id: o,
innerBounds: {width: 576, height: 1024}
}, function (t) {
var o;
t.onClosed.addListener(o = function () {
t.onClosed.removeListener(o), V(), t.contentWindow.h264Socket && (console.log("cleaning up h264 socket"), t.contentWindow.h264Socket.destroy(), t.contentWindow.h264Socket = null), t.contentWindow.inputWebSocket && (console.log("cleaning up input websocket"), t.contentWindow.inputWebSocket.close(), t.contentWindow.inputWebSocket = null)
}), B(t, e, null, null), t.contentWindow.onload = function () {
return n && n(t), $e[e] ? void F(e, function (n, o) {
B(t, e, n, o), t.contentWindow.connectionReady()
}) : void console.log("Vysor requested for", e, "which is not available yet")
}
})
}
function q() {
Ae = null, _e && _e.stopListen("share"), P()
}
function H(e) {
var t = Re[e];
t && t.gcmConn.destroy()
}
function J(e, t, n) {
var o = Re[e];
if (o && o.devices[t]) {
o.gcmConn.gcmConns[t] && o.gcmConn.gcmConns[t].destroy();
var i, r = o.gcmConn.gcmConns[t] = {
id: t, farm: !0, newSocket: function (e, n) {
i || o.gcmConn.newSocket(t + ":" + e, n)
}, destroy: function () {
i = !0, o.gcmConn.gcmConns[t] == r && delete o.gcmConn.gcmConns[t], delete $e[r.serialno], o.gcmConn.newSocket("close:" + t, function (e) {
e && e.destroy()
});
var e = r.onClose;
e && (delete r.onClose, e()), ue()
}
};
Q(t, function (e) {
e(r)
}, n), ue()
}
}
function Y(e, t, n) {
function o(e) {
n && n(null, e)
}
function i(e) {
return _e ? void _e.connect({
senderId: "64148182473",
registrationId: e.registration,
port: "share"
}, function (i) {
function s() {
i.newSocket("devices:", function (e) {
l(e, function (e) {
var t = JSON.parse(e), n = t.devices, o = t.sharedDevices;
h.devices ? ($.each(Object.keys(n), function (e, t) {
delete h.devices[t]
}), $.each(Object.keys(h.devices), function (e, t) {
var n = i.gcmConns[t];
n && n.destroy()
}), h.devices = n) : h.devices = n, h.sharedDevices = o, ue()
})
})
}
Ue.sendEvent("connected-device-farm");
var c, u = Re[r];
u && u.gcmConn.destroy();
var h = Re[r] = {info: e, gcmConn: i};
i.gcmConns = {}, i.openSocket = function (e, r) {
function l() {
c.read(function () {
s(), l()
})
}
if (e.startsWith("challenge:")) {
console.log("received challenge", e);
var u = e.split(":")[1];
$.ajax({
type: "post",
url: "https://billing.vysor.io/verifyauth",
headers: {Authorization: "Bearer " + t},
data: {nonce: u},
dataType: "json",
success: function (e) {
Ne = JSON.parse(e.signed_data), console.log("sending challenge response", e), a(r, e, function () {
d(r, function (e) {
return r.destroy(), "ok" == e ? (s(), void(n && n(h.info))) : void o("Access denied: " + e)
})
})
},
error: function (e, t) {
o("Unable to verify identity."), r.destroy()
}
})
} else if (e.startsWith("close:")) {
r.destroy();
var f = e.split(":")[1], p = i.gcmConns[f];
if (!p)return void console.log("can't close unknown subconn");
p.destroy()
} else e.startsWith("tracker:") ? (console.log("got tracker socket"), c = r, l()) : (console.log("got unknown socket request", e), r.destroy())
}, i.onClose = function () {
Re[r] == h && delete Re[r], $.each(Object.keys(i.gcmConns), function (e, t) {
var n = i.gcmConns[t];
n && n.destroy()
}), ue()
}, console.log("Connection to device farm established", i)
}) : void o(Pe)
}
e = new URL(e);
var r = e.hash.replace("#", "");
$.ajax({
url: "https://billing.vysor.io/gcm/" + r, dataType: "json", success: i, error: function (e, t) {
m("Unable to find server: " + t)
}
})
}
function X(e, t) {
function n(e) {
ue(), t ? t(null, e) : m(e)
}
function o() {
ue(), t && t(Ae)
}
q(), w(e, function (e) {
function t() {
console.log("registering vysor share server"), $.ajax({
type: "post",
url: "https://billing.vysor.io/gcm",
headers: {Authorization: "Bearer " + e},
data: {registration: _e.registrationId},
dataType: "json",
success: function (e) {
console.log("vysor share server", e), chrome.storage.local.set({
lastDeviceFarmRegistrationId: _e.registrationId,
lastDeviceFarmServerId: e.id
}), Ae = "https://vysor.clockworkmod.com/server#" + e.id, o(Ae)
}.bind(this),
error: function (e, t) {
q(), n("Unable to register server: " + t)
}
})
}
function i() {
r = g(r, null, 500, function () {
$.each(l, function (e, t) {
t.trackerSocket && t.trackerSocket.write(c("0000\n"), function () {
})
}), ue()
})
}
if (!e)return void n("Unable to get Auth Token.");
if (!_e)return void n(Pe);
_e.onRegistrationIdChanged = t, chrome.storage.local.get(["lastDeviceFarmRegistrationId", "lastDeviceFarmServerId"], function (e) {
return e && e.lastDeviceFarmRegistrationId == _e.registrationId && e.lastDeviceFarmServerId ? (console.log("device farm registration unchanged, not registering with server."), Ae = "https://vysor.clockworkmod.com/server#" + e.lastDeviceFarmServerId, void o(Ae)) : void t()
});
var r, s, l = [];
_e.listen("share", function (e) {
var t, n, o, r = {},
c = Math.round(Math.random() * (1 << 30)).toString(16) + Math.round(Math.random() * (1 << 30)).toString(16);
e.onClose = function () {
var t = l.indexOf(e);
t != -1 && l.splice(t, 1), e.trackerSocket && (e.trackerSocket.destroy(), delete e.trackerSocket), $.each(Object.keys(r), function (e, t) {
var n = r[t];
n.destroy()
})
}, e.newSocket("challenge:" + c, function (i) {
return i ? void d(i, function (r) {
function s(e) {
e = e || "fail", console.log("Remote user failed to authorize", e), a(i, e, function () {
i.destroy()
})
}
console.log("received challenge response", r);
var d = JSON.parse(r);
C("AQAB", "hDuGsIhbjLYXteQX3F3KNriQHwUSZurS5voCkdpA1733A65pqtGOrk9g_yLiF94_vSK0VmL-4stq7WAYEbn6nw", d.signed_data, d.signature, function (r) {
function u() {
function r() {
l.push(e), t = !0, a(i, "ok", function () {
i.destroy()
}), m("Vysor is sharing Android devices with " + n.name, o), Adb.sendHostCommand("host:track-devices", function (t) {
return t ? void e.newSocket("tracker:", function (n) {
return n ? (e.trackerSocket = n, void Socket.stream(n, t)) : (t.destroy(), void console.error("unable to open remote tracker"))
}) : void console.error("unable to track adb devices", chrome.runtime.lastError)
})
}
O(n.email, function (e, t) {
if (e)return void r();
if (!t)return void s("Denied by policy.");
var i = chrome.runtime.getManifest().name;
chrome.notifications.create({
type: "basic",
iconUrl: o,
title: i,
message: n.name + " is requesting access to Vysor shared Android devices.",
buttons: [{title: "Allow"}, {title: "Deny"}]
}, function (e) {
var t, o = function (n) {
n == e && (chrome.notifications.onClosed.removeListener(o), chrome.notifications.onButtonClicked.removeListener(i), t || s("Denied by user."))
}, i = function (o, i) {
o == e && (chrome.notifications.clear(o), t = !0, 0 == i ? (L(n.email, function () {
P()
}), r()) : s("Denied by user."))
};
chrome.notifications.onClosed.addListener(o), chrome.notifications.onButtonClicked.addListener(i)
})
})
}
return r ? void s("Identify signature verification failed.") : (n = JSON.parse(d.signed_data), n.nonce != c ? void s("Mismatched nonce in authentication.") : void(n.picture ? Ce(n.picture, function (e) {
o = e, u()
}) : (o = "/icon.png", u())))
})
}) : (console.error("challenge socket failed"), void e.destroy())
}), e.openSocket = function (o, c) {
if (!t)return void c.destroy();
if ("devices:" == o) s = g(s, c, 500, function (e) {
E(function (t) {
Adb.devices(function (n) {
n || (n = {}), $.each(Object.keys(n), function (e, o) {
Le[o] && delete n[o], R(t[o]), t[o] && t[o].friendlyName && (n[o].name = t[o].friendlyName)
});
var o = {};
$.each(Object.keys(Oe), function (e, t) {
o[t] = {userInfo: Oe[t].userInfo}
}), $(e).each(function (e, t) {
u(t, {devices: n, sharedDevices: o}, function () {
t.destroy()
})
})
})
})
}); else if (o.startsWith("close:")) {
c.destroy();
var a = o.split(":")[1], d = r[a];
d && d.destroy()
} else {
var l = o.indexOf(":");
if (l == -1)return console.error("unexpected command received by device farm server"), void c.destroy();
var a = o.substring(0, l);
if (!$e[a]) {
if (l = o.indexOf(":", l + 1), l == -1)return void c.destroy();
if (a = o.substring(0, l), !$e[a])return void console.error("request for unknown device", a)
}
var d = r[a];
if (!d) {
var h = Adb.createSocketFactory(a);
d = r[a] = new A(h, $e[a], {}), d.destroy = function () {
try {
e.newSocket("close:" + a, function (e) {
e && e.destroy()
})
} catch (e) {
}
var t = Oe[a];
t && (t.userInfo == n && delete t.userInfo, t.gcmConn == this && delete t.gcmConn, t.key || t.gcmConn || delete Oe[a]);
var o = this.onClose;
o && (delete this.onClose, o()), i()
}.bind(d)
}
var f = Oe[a];
f || (f = Oe[a] = {}), f.gcmConn != d && (te(a), f.gcmConn = d, f.userInfo = n, Oe[a] = f), i();
var p = o.substring(l + 1);
d.openSocket(p, c)
}
}
})
})
}
function z(e) {
Se = e
}
function G() {
return De ? void De.focus() : void chrome.app.window.create("list.html", {
id: "list",
innerBounds: {width: 768, height: 768, minWidth: 768, minHeight: 768}
}, function (e) {
De = e, De.contentWindow.openList = G, U(De), De.contentWindow.disconnectSharedDevice = ae, De.contentWindow.toggleShare = de, De.contentWindow.unshareDevice = ne, De.contentWindow.quietSerial = ce, De.contentWindow.openWindow = K, De.contentWindow.closeWindow = x, De.contentWindow.createDeviceFarmConnection = J, De.contentWindow.destroyDeviceFarmConnection = H, De.contentWindow.adbServer = Ie, De.contentWindow.tracker = Ue, De.contentWindow.startWireless = le, De.contentWindow.startDeviceFarm = X, De.contentWindow.stopDeviceFarm = q, De.contentWindow.updateKeyboard = z, De.contentWindow.onload = function () {
U(De), P(), ue()
}, De.onClosed.addListener(function () {
De = null, V()
})
})
}
function Q(e, t, n) {
Ie.start();
var o = new Server;
o.listen({port: 0, address: "127.0.0.1"}, function (e) {
o.destroy();
var i = new AdbDaemon(new AdbTcpTransport(e));
t(function (e) {
Ue.sendEvent("connected-shared-device");
var t = "127.0.0.1:" + o.localPort;
e.serialno = t, e.id || (e.id = t), Le[t] = e, console.log("connected gcm socket"), e.openSocket = function () {
console.log("got a new socket? this should not happen..."), e.destroy()
}, i.onClose = e.onClose = function () {
delete Le[t], i.destroy(), e.destroy()
}, e.onClose = function () {
delete Le[t], i.destroy(), e.destroy(), m("Disconnected from shared Android device.")
}, i.openSocket = function (t, n) {
e.newSocket(t, function (e) {
Socket.stream(n, e, function () {
})
})
}, e.newSocket("properties", function (o) {
l(o, function (o) {
var r = AdbDevice.parseConnectionPayload(o);
e.name = e.name || r["ro.product.model"].replace("_", " "), i.start(o), console.log("got properties", o), n(t)
})
})
})
}.bind(this), function (t) {
if (t)return void console.log("adb daemon failed to listen: " + t);
var n = "127.0.0.1:" + o.localPort;
Le[n] = {
id: e || n, destroy: function () {
}
}, console.log("mapping", n, e), ue(), Adb.sendHostCommand("host:connect:" + n, function (e, t) {
e && (e.destroy(), t = s(t), console.log("adb connect result", t))
})
}.bind(this))
}
function Z(e, t) {
if (m("Vysor is connecting to a remote Android device"), De && De.show(), console.log("attempting to connect to shared device", e), !_e)return void W();
var n = new URL(e), o = v("senderId", n), i = v("registrationId", n), r = v("channel", n);
o || (o = "64148182473"), Q(null, function (e) {
_e.connect({senderId: o, registrationId: i, port: r}, e)
}, t)
}
function ee() {
chrome.runtime.requestUpdateCheck(function (e, t) {
console.log("update check", arguments), "update_available" == e && ye()
})
}
function te(e) {
var t = Oe[e];
if (t && t.gcmConn) {
var n = t.gcmConn;
delete t.gcmConn, n.destroy()
}
}
function ne(e) {
te(e), delete Oe[e], ue()
}
function oe(e, t) {
function n(e) {
t && t(null, e)
}
var o = $e[e];
if (!_e)return void n(Pe);
var i = Math.round(Math.random() * (1 << 30)).toString(16);
Oe[e] || (Oe[e] = {}), Oe[e].key = i, ue();
var r = "https://vysor.clockworkmod.com/redirect/?registrationId=" + encodeURIComponent(_e.registrationId) + "&channel=" + i;
console.log(r), _e.listen(i, function (t) {
Ue.sendEvent("shared-device");
var n = Oe[e];
if (!n || n.key != i)return t.destroy(), void console.log("device is no longer being shared.");
n.gcmConn && n.gcmConn.destroy(), n.gcmConn = t, n.userInfo = {name: "Someone"}, ue(), console.log("accepted gcm socket");
var r = Adb.createSocketFactory(e), s = new A(r, o, t);
s.onOpenSocket = function (t, n) {
if ("webstart" == t)return _(e, null, function (e, t) {
a(n, t, function () {
console.log("sent password", t), n.destroy()
})
}), !0
}
});
var s = "https://tu3ph.app.goo.gl/?ad=0&apn=com.koushikdutta.inkwire&link=" + encodeURIComponent(r);
t(s)
}
function ie() {
return xe ? xe : (console.log("creating persistent gcm connection"), xe = new Promise(function (e, t) {
GcmRtcManager.start({
3505780036: "AIzaSyDt0GimPRhk8_d_4XjOYzQUn50UkvXhMtE",
64148182473: "AIzaSyDd7k1v017osyYbIC92fyf-36s3pv0z73U"
}, {
iceServers: [{
url: "turn:n0.clockworkmod.com",
username: "foo",
credential: "bar"
}, {url: "turn:n1.clockworkmod.com", username: "foo", credential: "bar"}]
}, function (t) {
return _e = t, console.log("persistent gcm connection created", null != t), _e ? (_e.defaultSenderId = "64148182473", void e(_e)) : (xe = null, void e())
})
}))
}
function re(e) {
return function () {
var t = arguments;
ie().then(function () {
e.apply(null, t)
})
}
}
function se(e) {
var t = ze[e];
clearTimeout(t), ze[e] = setTimeout(function () {
delete ze[e]
}, 1e4), delete Xe[e]
}
function ce(e) {
var t = Xe[e];
clearTimeout(t), Xe[e] = setTimeout(function () {
delete Xe[e]
}, 1e4), delete ze[e]
}
function ae(e) {
x(e);
var t = Le[e];
t && t.destroy()
}
function de(e, t) {
Oe[e] ? ne(e) : oe(e, t), ue()
}
function le(e) {
var t = Adb.createSocketFactory(e);
t.newSocket("shell:ifconfig wlan0", function (n) {
return n ? void l(n, function (n) {
function o(e, t) {
Adb.sendHostCommand("host:disconnect:" + a, function (n, o) {
n && n.destroy(), delete $e[a], Adb.sendHostCommand("host:connect:" + a, function (n, o) {
return n ? (n.destroy(), o = s(o), o.indexOf("unable to connect") != -1 ? (m("Unable to connect via wireless. Is your Android on the same network as your PC?"), void(t && t(o))) : (t && t(), chrome.storage.local.set({lastConnectAddress: a}), console.log("adb connect result", o), void(e && i()))) : (m("Unable to connect via wireless. Is your Android on the same network as your PC?"), void(t && t("host connect failed")))
})
})
}
function i() {
ue(), m("Vysor is connected wirelessly. You may disconnect your device."), Ue.sendEvent("go-wireless"), ce(a), K(a, !0, function (e) {
se(a), e.contentWindow.tryReconnect = function () {
se(a), o(!1)
}
})
}
console.log("ifconfig result", n);
var r = n.match("inet addr:(.*?) ");
if (r || (r = n.match("wlan0: ip (.*?) ")), !r)return void m("Unable to switch to wireless mode. Is your Android connected to Wifi?");
var c = r[1], a = c + ":5555";
Je[e] = a, Ye[a] = e;
var d = $e[a];
return d && (d.id = e), Ye[e] && (device.id = Ye[e]), d && "device" == d.status ? void i() : (ce(e), void t.newSocket("tcpip:5555", function (e) {
return e ? void l(e, function (e) {
console.log("tcpip:5555 result", e), o(!0, function (e) {
e && (console.error("host:connect failed, trying again in a few seconds", e), setTimeout(function () {
o(!0, function (e) {
e && console.err("host:connect failed again, giving up.", e)
})
}, 3e3))
})
}) : void m("Failure while switching to wireless mode.")
}))
}) : void console.log("error running tcpip:5555")
})
}
function ue() {
Be || (Be = n(function () {
Be = null, De && De.contentWindow.refreshList && De.contentWindow.refreshList($e, Le, Ne, Re, Oe, Ye, Je, _e && _e.isListening("share"), Fe, Ie.isRunning(), je)
}))
}
function he() {
chrome.storage.local.get("connect-automatically", function (e) {
var t;
t = e["connect-automatically"] === !1 ? 2 : e["connect-automatically"] === !0 ? 0 : e["connect-automatically"] || 0, Adb.devices(function (e) {
if (e) {
var n;
$.each(e, function (o, i) {
function r() {
return "unauthorized" != s.status || (m("Vysor has detected an Android device. Please Allow USB Debugging on your Android device to continue."), !1)
}
n = !0;
var s = e[o];
Ye[o] && (s.id = Ye[o]);
var c = $e[o];
if (!c || s.status != c.status) {
ne(o);
var a = s.properties.indexOf("emulator") != -1 || s.properties.indexOf("vbox") != -1, d = j(o);
if (!a && Ve && !Xe[d]) {
if (chrome.app.window.get(d) || Ie.isRunning() || ze[d])return void(r() && K(o, !0));
if (2 != t && r() && "device" == s.status) {
var l = chrome.runtime.getManifest().name;
return 1 != t ? (chrome.notifications.create("never-start-automatically", {
type: "basic",
iconUrl: "/icon.png",
title: l,
message: "Vysor has connected to an Android device and is starting.",
buttons: [{title: "Never Start Automatically"}]
}), void K(o, !0)) : void chrome.notifications.create("never-start-automatically-" + Math.random(), {
type: "basic",
iconUrl: "/icon.png",
title: l,
message: "Vysor has detected an Android device.",
buttons: [{title: "View Android with Vysor"}, {title: "Never Start Automatically"}]
}, function (e) {
var t = function (o) {
o == e && (chrome.notifications.onClosed.removeListener(t), chrome.notifications.onButtonClicked.removeListener(n))
}, n = function (t, n) {
t == e && (chrome.notifications.clear(t), 0 == n ? K(o, !0) : chrome.storage.local.set({"connect-automatically": !1}))
};
chrome.notifications.onClosed.addListener(t), chrome.notifications.onButtonClicked.addListener(n)
})
}
}
}
}), $e = e
} else $e = {};
ue(), Ve = !0
})
})
}
function fe() {
if (!Fe) {
if (isElectron()) {
var e = require("os").platform(), t = chrome.runtime.getAppDirectory(),
n = require("path").join(t, "native", e, "adb");
return "win32" == e ? n += ".exe" : require("fs").chmodSync(n, "755"), console.log("attempting to start built in adb binary", n), void require("child_process").execFile(n, ["start-server"])
}
je || window.chrome && window.chrome.runtime && window.chrome.runtime.connectNative && (je = chrome.runtime.connectNative("com.clockworkmod.adb"), je.onDisconnect.addListener(function () {
je = null
}), je.postMessage({command: "start-server"}))
}
}
function pe() {
Ke || fe(), Ke = g(Ke, null, 1e4, fe)
}
function ve() {
He = g(He, null, 300, function () {
he()
})
}
function ge() {
function e(t) {
t.read(function (n) {
ve(), e(t)
})
}
qe || (Adb.sendHostCommand("host:version", function (e, t) {
e && (e.destroy(), t = s(t), console.log("ADB Server Version: ", t))
}), Adb.sendHostCommand("host:track-devices", function (t) {
return qe ? void t.destroy() : void(t && (console.log("Connected to ADB Server"), Ie.isRunning() ? console.log("Using Vysor ADB") : console.log("Using Android SDK ADB"), Fe = !0, t.onClose = function () {
qe = null, Fe = !1, ve()
}, qe = t, e(t), ve()))
}))
}
function me() {
ge(), pe(), setTimeout(me, 1e3)
}
function ye() {
Ge = g(Ge, null, 1e4, function () {
var e = chrome.runtime.getManifest().name;
chrome.notifications.create("reload", {
type: "basic",
iconUrl: "/icon.png",
title: e,
message: "There is an update available for Vysor.",
buttons: [{title: "Reload"}]
})
})
}
var we = "\n".charCodeAt(0),
be = ((new Date).getTime(), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"), ke = "=";
String.prototype.startsWith || Object.defineProperty(String.prototype, "startsWith", {
enumerable: !1,
configurable: !1,
writable: !1,
value: function (e, t) {
return t = t || 0, this.lastIndexOf(e, t) === t
}
}), Object.fromArray = function (e) {
var t = {};
for (var n in e) {
var o = e[n];
t[o] = o
}
return t
}, $.ajaxTransport("+binary", function (e, t, n) {
if (window.FormData && (e.dataType && "binary" == e.dataType || e.data && (window.ArrayBuffer && e.data instanceof ArrayBuffer || window.Blob && e.data instanceof Blob)))return {
send: function (t, n) {
var o = new XMLHttpRequest, i = e.url, r = e.type, s = e.async || !0, c = e.responseType || "blob",
a = e.data || null, d = e.username || null, l = e.password || null;
o.addEventListener("load", function () {
var t = {};
t[e.dataType] = o.response, n(o.status, o.statusText, t, o.getAllResponseHeaders())
}), o.open(r, i, s, d, l);
for (var u in t)o.setRequestHeader(u, t[u]);
o.responseType = c, o.send(a)
}, abort: function () {
n.abort()
}
}
});
var Ce = function () {
var e = {};
return function (t, n) {
if (e[t])return void n(e[t]);
var o = new XMLHttpRequest;
o.open("GET", t, !0), o.responseType = "blob", o.onload = function (o) {
n(e[t] = window.URL.createObjectURL(this.response))
}, o.send()
}
}();
!function () {
function*e() {
}
var t = e();
t.constructor.prototype.async = function () {
function e() {
i = o.throw(new Error(arguments)), n()
}
function t() {
var e = arguments[0];
i = o.next(e), n()
}
function n(n) {
var r, s;
if (!i.done) {
if (!i.value)return void(i = o.next(t));
if (i.value.constructor == Promise)return void i.value.then(t).catch(e);
if (i.value == Error) r = !0, i = o.next(e); else {
if (i.value != y)throw new Error("Unexpected yield value for callback. Only Error and Success allowed.");
s = !0, i = o.next(t)
}
if (!i.value)throw new Error("Double yield callbacks must explicitly define both Error and Success");
if (i.value == Error && r)throw new Error("Error callback already defined");
if (i.value == y && s)throw new Error("Success callback already defined");
if (i.value != Error && i.value != y)throw new Error("Unexpected yield value for callback. Only Error and Success allowed.");
i = r ? o.next(t) : o.next(e)
}
}
var o = this, i = o.next();
i.done || n()
}
}(), window.isElectron = function () {
return navigator.userAgent.indexOf("Electron") != -1
}, isElectron() || (window.sharedGlobals = window), function () {
function e(e) {
try {
for (var t in e)e[t] && e[t].constructor != String && (e[t] = JSON.stringify(e[t]));
i += e.join(" ") + "\n"
} catch (e) {
}
}
function t(e) {
return new Promise(function (t, n) {
return e.getConsoleLog ? void e.getConsoleLog(function (e) {
t({content: e && e.length ? e : "log is empty"})
}) : void t("getConsoleLog not found")
})
}
var n = console.log, o = console.error, i = "";
console.error = function () {
o.apply(console, arguments), e(Array.prototype.slice.call(arguments))
}, console.log = function () {
n.apply(console, arguments), e(Array.prototype.slice.call(arguments))
}, sharedGlobals.getConsoleLog = function (e) {
e(i)
}, window.gistConsoleLog = function (e, n) {
chrome.runtime.getBackgroundPage(function (o) {
t(o).then(function (n) {
e["background.txt"] = n;
var o = chrome.app.window.getAll(), i = o.map(function (n) {
return t(n.contentWindow).then(function (t) {
e["window-" + n.id + ".txt"] = t
})
});
return Promise.all(i)
}).then(function () {
var t = {description: chrome.runtime.getManifest().name + " console log", public: !1, files: e};
fetch("https://api.github.com/gists", {method: "POST", body: JSON.stringify(t)}).then(function (e) {
e.json().then(function (e) {
n(e.html_url)
})
})
})
})
}
}(), function () {
function e(e) {
this.buffer = new ArrayBuffer(e), this.dataView = new DataView(this.buffer), this.uint8array = new Uint8Array(this.buffer), this.littleEndian = !1, this.position = 0, this.limit = e, this.capacity = e
}
function t(t, n) {
var o = 8 * n, i = t + o, r = "get" + i, s = "set" + i, c = "put" + i;
e.prototype[r] = function () {
if (this.position + n > this.limit)throw new Error("Not enough room in byte buffer");
var e = this.dataView[r](this.position, this.littleEndian);
return this.position += n, e
}, e.prototype[c] = function (e) {
if (this.position + n > this.limit)throw new Error("Not enough room in byte buffer");
if (null == e || void 0 == e || NaN == e || e.constructor != Number)throw new Error("no value provided");
return this.dataView[s](this.position, e, this.littleEndian), this.position += n, this
}
}
e.prototype.flip = function () {
this.limit = this.position, this.position = 0
}, e.prototype.asUint8Array = function () {
return this.uint8array.subarray(this.position, this.limit)
};
var n = {Int: [1, 2, 4], Uint: [1, 2, 4], Float: [4, 8]};
for (var o in n) {
var i = n[o];
for (var r in i) {
var r = i[r];
t(o, r)
}
}
e.prototype.put = function (e) {
if (e.constructor == Number)return this.putInt8(e);
if (e.constructor == String && (e = c(e)), e.constructor == ArrayBuffer && (e = new Uint8Array(e)), this.position + e.byteLength > this.limit)throw new Error("Not enough room in byte buffer");
return this.uint8array.set(e, this.position), this.position += e.byteLength, this
}, e.prototype.putByte = e.prototype.putInt8, e.prototype.putShort = e.prototype.putInt16, e.prototype.putInt = e.prototype.putInt32, e.prototype.putFloat = e.prototype.putFloat32, e.prototype.putDouble = e.prototype.putFloat64, window.ByteBuffer = e
}(), window.chrome && window.chrome.sockets && (chrome.sockets.tcp.onReceive.addListener(function (e) {
var t = Socket.readers[e.socketId];
null != t && t.dataReceived(new Uint8Array(e.data))
}), chrome.sockets.tcp.onReceiveError.addListener(function (e) {
var t = Socket.readers[e.socketId];
null != t && (t.destroy(), t.dataReceived(null))
}), chrome.sockets.tcpServer.onAccept.addListener(function (e) {
chrome.sockets.tcp.setPaused(e.clientSocketId, !1);
var t = Server.listeners[e.socketId];
null != t && t(new Socket({socketId: e.clientSocketId}))
})), function () {
function e(t, n) {
if (t.socketId) this.socketId = t.socketId, e.readers[this.socketId] = this; else if (window.chrome && window.chrome.sockets) chrome.sockets.tcp.create(function (o) {
this.socketId = o.socketId, chrome.sockets.tcp.connect(this.socketId, t.host, t.port, function (t) {
t ? (chrome.runtime.lastError, this.destroy(), n(null)) : (e.readers[o.socketId] = this, n(this))
}.bind(this))
}.bind(this)); else {
var o;
t.ns ? (this.ns = t.ns, o = !0) : (this.ns = new require("net").Socket(), this.ns.connect({
port: t.port,
host: t.host
}, function () {
o = !0, n(this)
}.bind(this))), this.ns.on("close", function () {
this.destroy(), o || n(null)
}.bind(this)), this.ns.on("data", function (e) {
this.dataReceived(e)
}.bind(this))
}
}
function t() {
}
e.readers = {}, e.connect = function (t, n) {
return new e(t, n)
}, e.pump = function (e, t, n) {
if (!e || !t)return console.error("Socket.pump called with null socket", e, t), void n();
var o = function () {
e.read(i)
}.bind(e), i = function (e) {
var n = e.buffer;
(e.byteOffset || e.length != n.byteLength) && (n = n.slice(e.byteOffset, e.byteOffset + e.length)), t.write(n, o)
}.bind(t);
e.read(i), e.onClose = n
}, e.stream = function (t, n, o) {
e.pump(t, n, function () {
if (n && n.destroy(), o) {
var e = o;
o = null, e()
}
}), e.pump(n, t, function () {
if (t && t.destroy(), o) {
var e = o;
o = null, e()
}
})
}, e.eat = function (e) {
function t() {
e.read(t)
}
t()
}, e.prototype.read = function () {
if (this.pendingCallback)throw new Error("double callback");
if (this.closed && !this.pending) {
var e = this.onClose;
return void(e && (delete this.onClose, e()))
}
var t = 0;
"Number" == arguments[t].constructor.name ? this.pendingLength = arguments[t++] : this.pendingLength = 0;
var e = arguments[t];
if (!this.pending || this.paused)return void(this.pendingCallback = e);
if (this.pendingLength) {
if (this.pendingLength > this.buffered())return void(this.pendingCallback = e)
} else this.pendingLength = this.buffered();
for (var n, o = 0; o < this.pendingLength;) {
var i = this.pending.shift();
this.bufferedLength -= i.length, this.pending.length || delete this.pending;
var r = i, s = Math.min(r.byteLength, this.pendingLength - o);
if (s != r.byteLength) {
var c = r.subarray(0, s), a = r.subarray(s);
this.unshift(a), r = c;
}
n || r.byteLength == this.pendingLength || (n = new Uint8Array(this.pendingLength)), n ? n.set(r, o) : n = r, o += r.byteLength
}
e(n)
}, e.prototype.write = function (e, t) {
if (this.pendingWrite && console.error("write is already in progress!"), null == t && (console.error("write callback is null?"), t = function () {
}), this.pendingWrite = t, window.chrome && window.chrome.sockets) chrome.sockets.tcp.send(this.socketId, e, function (n) {
return chrome.runtime.lastError, !n || n.resultCode ? void delete this.pendingWrite : void(n.bytesSent < e.byteLength ? this.write(e.slice(n.bytesSent), t) : (delete this.pendingWrite, t()))
}.bind(this)); else {
if (!this.ns)return;
if (!e.byteLength)return void require("process").nextTick(function () {
delete this.pendingWrite, t()
}.bind(this));
const n = window.Buffer || require("buffer").Buffer;
this.ns.write(n.from(e), function () {
delete this.pendingWrite, t()
}.bind(this))
}
}, e.prototype.destroy = function (e, t) {
window.chrome && window.chrome.sockets ? chrome.sockets.tcp.close(this.socketId, function () {
chrome.runtime.lastError
}) : (this.dataReceived(null), this.ns && (this.ns.destroy(), delete this.ns))
}, e.prototype.unshift = function (e) {
0 != e.byteLength && (this.pending ? this.pending.unshift(e) : this.pending = [e], this.bufferedLength || (this.bufferedLength = 0), this.bufferedLength += e.length)
}, e.prototype.dataReceived = function (e) {
if (e && (e.asUint8Array && (e = e.asUint8Array()), e.constructor == ArrayBuffer && (e = new Uint8Array(e))), e && e.length) {
var t = new Uint8Array(e);
this.pending ? this.pending.push(t) : this.pending = [t]
}
if (null == e ? this.closed = !0 : (this.bufferedLength || (this.bufferedLength = 0), this.bufferedLength += e.length), this.paused || !this.pending || !this.pending.length) {
var n = this.onClose;
return void(this.closed && n && (delete this.onClose, n()))
}
var o = this.pendingLength, n = this.pendingCallback;
n && (delete this.pendingCallback, this.read(o, n))
}, e.prototype.buffered = function () {
return this.bufferedLength
}, e.prototype.pause = function () {
this.paused || (this.paused = !0, this.onPause())
}, e.prototype.resume = function () {
this.paused && (this.paused = !1, this.onResume())
}, e.prototype.onResume = function () {
chrome.sockets.tcp.setPaused(this.socketId, !1, function () {
})
}, e.prototype.onPause = function () {
chrome.sockets.tcp.setPaused(this.socketId, !0, function () {
})
}, t.listeners = {}, t.prototype.__proto__ = e.prototype, t.prototype.destroy = function () {
window.chrome && window.chrome.sockets ? chrome.sockets.tcpServer.close(this.socketId, function () {
chrome.runtime.lastError
}) : this.ns && (this.ns.close(), delete this.ns)
}, t.prototype.listen = function (n, o, i) {
var r, s;
"Number" == n.constructor.name ? (r = n, s = "0.0.0.0") : (s = n.address, r = n.port), window.chrome && window.chrome.sockets ? chrome.sockets.tcpServer.create(function (e) {
this.socketId = e.socketId, t.listeners[this.socketId] = o, chrome.sockets.tcpServer.listen(e.socketId, s, r, function (e) {
return chrome.runtime.lastError, e ? (this.destroy(), void(i && i(e))) : void chrome.sockets.tcpServer.getInfo(this.socketId, function (t) {
this.localAddress = t.localAddress, this.localPort = t.localPort, i && i(e)
}.bind(this))
}.bind(this))
}.bind(this)) : (this.ns = require("net").createServer(function (t) {
o(new e({ns: t}))
}.bind(this)), this.ns.on("close", function () {
this.destroy()
}.bind(this)), this.ns.on("error", function (e) {
i && i(e)
}.bind(this)), this.ns.on("listening", function () {
var e = this.ns.address();
this.localAddress = e.address, this.localPort = e.port, i && i()
}.bind(this)), this.ns.listen({port: r, host: s}))
}, window.Socket = e, window.Server = t
}(), function () {
function e() {
}
function t(e) {
this.request = e, this.statusLine = "HTTP/1.1 200 OK", this.headers = {Date: (new Date).toUTCString()}
}
function n(e, n, o) {
this.server = e, this.socket = n, this.headers = {}, this.parseRequest(function () {
o(this, new t(this))
}.bind(this))
}
e.prototype.listen = function (e, t, n) {
this.socket = new Server, this.requestCallback = t, this.socket.listen(e, this.onSocket.bind(this), n)
}, e.prototype.onSocket = function (e) {
new n(this, e, this.requestCallback)
}, e.prototype.destroy = function () {
this.socket.destroy()
}, t.prototype.code = function (e) {
this.statusLine = "HTTP/1.1 " + e + " " + HttpResponseCodes[e]
}, t.prototype.write = function (e, t) {
if (e.constructor.name == Object.prototype.constructor.name && (e = JSON.stringify(e)), e.constructor.name == String.prototype.constructor.name && (e = c(e)), !this.hasWritten) {
this.hasWritten = !0, this.headers["Content-Length"] || "close" == this.headers.Connection || (this.headers["Content-Length"] = e.byteLength);
var n = [this.statusLine];
for (var o in this.headers)n.push(o + ": " + this.headers[o]);
var i = n.join("\r\n") + "\r\n\r\n";
return void this.request.socket.write(c(i), function () {
this.write(e, t)
}.bind(this))
}
this.request.socket.write(e, t)
}, t.prototype.end = function () {
"close" == this.headers.Connection ? this.request.socket.destroy() : this.request.server.onSocket(this.request.socket), this.request.socket = null
}, n.prototype.parseRequest = function (e) {
var t = function () {
d(this.socket, function (n) {
if (n = n.trim(), !n.length) {
var o = this.headers["content-length"];
return o ? (o = Number.parseInt(o), void this.socket.read(o, function (t) {
this.body = t, "application/json" === this.headers["content-type"] && (this.body = JSON.parse(s(this.body))), e()
}.bind(this))) : void e()
}
if (this.statusLine) {
var i = n.split(":", 2);
2 == i.length && (this.headers[i[0].toLowerCase()] = i[1].trim())
} else {
this.statusLine = n;
var i = n.split(" ");
if (i.length > 2 && (i = i[1].split("?"), this.path = i[0], this.queries = {}, i.length > 1))for (var r = this.query = i[1], c = r.split("&"), a = 0; a < c.length; a++) {
var d, l = c[a].split("="), u = l[0];
l.length > 1 && (d = l[1]), this.queries[u] = d
}
}
t()
}.bind(this))
}.bind(this);
t()
}, window.HttpRequestParser = n, window.HttpServer = e, window.HttpResponseCodes = {
200: "OK",
202: "Accepted",
206: "Partial Content",
101: "Switching Protocols",
301: "Moved Permanently",
302: "Found",
402: "Payment Required",
404: "Not Found"
}
}(), b.prototype.write = function (e, t) {
throw new Error("write not supported on dummy socket")
}, b.prototype.destroy = function () {
this.dataReceived(null)
}, b.prototype.buffered = Socket.prototype.buffered, b.prototype.unshift = Socket.prototype.unshift, b.prototype.dataReceived = Socket.prototype.dataReceived, b.prototype.read = Socket.prototype.read, b.prototype.pause = Socket.prototype.pause, b.prototype.resume = Socket.prototype.resume, b.prototype.buffered = Socket.prototype.buffered, b.prototype.onPause = function () {
}, b.prototype.onResume = function () {
}, k.connect = function (e, t) {
new k(e, t)
}, k.prototype.write = function (e, t) {
throw new Error("write not supported on fetch socket")
}, k.prototype.destroy = function () {
this.promise && this.promise.cancel && this.promise.cancel()
}, k.prototype.unshift = Socket.prototype.unshift, k.prototype.dataReceived = Socket.prototype.dataReceived, k.prototype.read = Socket.prototype.read, k.prototype.pause = Socket.prototype.pause, k.prototype.resume = Socket.prototype.resume, k.prototype.buffered = Socket.prototype.buffered, k.prototype.onPause = function () {
}, k.prototype.onResume = function () {
this.reader.read().then(function (e) {
e.value && (this.dataReceived(e.value), this.paused || this.onResume())
}.bind(this))
}, function () {
function e(e, t) {
this.conn = e, this.dc = t, this.gotEof = !1, t.onmessage = function (e) {
var t = new Uint8Array(e.data), n = 1 == t[t.byteLength - 1];
this.dataReceived(t.subarray(0, t.byteLength - 1)), n && (this.gotEof = !0, this.destroy())
}.bind(this), t.onclose = t.onerror = this.destroy.bind(this), this.needsBufferShim = !0
}
function t(e, t, n) {
this.manager = e, this.pc = t, this.key = n, this.pc.oniceconnectionstatechange = function () {
"new" != this.pc.iceConnectionState && "checking" != this.pc.iceConnectionState && delete e.gcmRtcConnections[n], "disconnected" != this.pc.iceConnectionState && "closed" != this.pc.iceConnectionState || this.destroy()
}.bind(this)
}
function n(e, t, n) {
this.senders = e, this.registrationId = t, this.rtcc = n, this.gcmRtcConnections = {}, this.gcmRtcListeners = {}
}
e.prototype.buffered = Socket.prototype.buffered, e.prototype.unshift = Socket.prototype.unshift, e.prototype.dataReceived = Socket.prototype.dataReceived, e.prototype.read = Socket.prototype.read, e.prototype.pause = Socket.prototype.pause, e.prototype.resume = Socket.prototype.resume, e.prototype.buffered = Socket.prototype.buffered, e.prototype.writeable = function () {
var e = this.writeCallback;
e && (delete this.writeCallback, e())
}, e.prototype.write = function (e, t) {
if (!this.dc || "open" != this.dc.readyState)return void this.destroy();
this.writeCallback = t;
var n = new Uint8Array(e.byteLength + 1);
if (n.set(new Uint8Array(e)), this.dc.send(n.buffer), !this.reentrantWrite)try {
for (this.reentrantWrite = !0; this.writeCallback && (0 == this.dc.bufferedAmount || this.needsBufferShim);)this.writeable()
} finally {
this.reentrantWrite = !1
}
}, e.prototype.destroy = function () {
if (this.dataReceived(null), null != this.dc) {
var e = this.dc;
if (this.dc = null, e.onclose = null, e.onerror = null, "open" == e.readyState)try {
e.send(new Uint8Array([1])), this.gotEof ? this.conn.recycleChannel(e) : this.conn.waitForEof(e)
} catch (e) {
}
}
}, t.prototype.waitForCommand = function (t) {
t.onmessage = function (n) {
if (1 != n.data.byteLength) {
this.removeChannel(t);
var o = s(n.data), i = new e(this, t);
this.openSocket(o, i)
}
}.bind(this)
}, t.prototype.compactChannels = function () {
this.inboundChannels && !this.inboundChannels.length && (this.inboundChannels = null), this.outboundChannels && !this.outboundChannels.length && (this.outboundChannels = null)
}, t.prototype.getAppropriateChannels = function (e, t) {
var n;
return e.inbound ? (!this.inboundChannels && t && (this.inboundChannels = []), n = this.inboundChannels) : (!this.outboundChannels && t && (this.outboundChannels = []), n = this.outboundChannels), n
}, t.prototype.removeChannel = function (e) {
if (channels = this.getAppropriateChannels(e), channels) {
var t = channels.indexOf(e);
t != -1 && (channels.splice(t, 1), this.compactChannels())
}
}, t.prototype.waitForEof = function (e) {
e.onmessage = function (t) {
var n = new Uint8Array(t.data), o = 1 == n[n.byteLength - 1];
o && this.recycleChannel(e)
}.bind(this)
}, t.prototype.recycleChannel = function (e) {
var t = this.getAppropriateChannels(e, !0);
t.push(e), e.onclose = e.onerror = function () {
this.removeChannel(e)
}.bind(this), this.waitForCommand(e)
}, t.prototype.addCandidates = function (e) {
for (var t in e.candidates)this.pc.addIceCandidate(new RTCIceCandidate(e.candidates[t]))
}, t.prototype.setupPinger = function (e) {
function t() {
e.send(c("ping")), n = setTimeout(t, 1e3)
}
var n;
e.onmessage = function (e) {
}, e.onclose = e.onerror = function () {
clearTimeout(n), this.destroy()
}.bind(this), t()
}, t.prototype.listenSockets = function () {
this.pc.ondatachannel = function (e) {
e.channel.inbound = !0, this.waitForCommand(e.channel)
}.bind(this)
}, t.prototype.prepareChannel = function (e) {
var t = this.pc.createDataChannel(e || "gcm", {reliable: !0, ordered: !0});
return t.binaryType = "arraybuffer", t
}, t.prototype.newSocket = function (t, n) {
if ("closed" == this.pc.signalingState)return void n();
if (this.outboundChannels) {
var o = this.outboundChannels.shift();
this.compactChannels(), o.send(c(t));
var i = new e(this, o);
return void n(i, this)
}
var o = this.prepareChannel("gcm");
o.onopen = function () {
o.send(c(t));
var i = new e(this, o);
n(i, this)
}.bind(this)
}, t.prototype.destroy = function () {
delete this.manager.gcmRtcConnections[this.key], "closed" != this.pc.signalingState && this.pc.close();
var e = this.onClose;
e && (delete this.onClose, e())
}, n.prototype.onMessage = function (e) {
var t = JSON.parse(e.message), o = e.type, i = e.senderId, r = e.src, s = e.srcPort, c = e.dstPort;
if ("offer" == o) {
var a = this.gcmRtcListeners[c];
return void(a ? a.listener.incoming(i, r, s, c, t, a.listenCallback) : console.log("not listening on " + c))
}
if ("answer" == o) {
var d = n.getKey(r, s, c), l = this.gcmRtcConnections[d];
return l ? void l.manager.incoming(i, r, s, c, t) : void console.log("pending connection not found")
}
n.onUnknownMessage ? n.onUnknownMessage(e) : console.log("unknown message " + o)
}, n.hasLoadedChannels = !1, n.start = function (e, t, o) {
if (console.log("starting GtcRtcManger"), window.chrome && window.chrome.gcm) {
var i = Object.keys(e);
chrome.gcm.register(i, function (i) {
if (chrome.runtime.lastError, !i)return void o();
var r = new n(e, i, t);
chrome.gcm.onMessage.addListener(function (e) {
r.onMessage(e.data)
}), o(r)
})
} else {
var r = new n(e, null, t);
$.getScript("https://push.clockworkmod.com/socket.io/socket.io.js", function () {
var e = io("https://push.clockworkmod.com");
e.on("registration", function (e) {
e = "web:" + e, r.registrationId ? (r.registrationId = e, r.onRegistrationIdChanged && r.onRegistrationIdChanged(e)) : (r.registrationId = e, o(r))
}), e.on("data", function (e) {
r.onMessage(e)
})
})
}
}, n.prototype.ensureChannel = function () {
function e() {
return delete n.channelPromise, n.gcmRtcConnections = {}, n.channel && (delete n.channel, !Object.keys(n.gcmRtcListeners).length) ? void console.log("not reconnecting, no listeners") : void t()
}
function t() {
console.error("scheduling gcm reconnect"), n.reconnectTimeout = g(n.reconnectTimeout, null, 3e5, function () {
console.error("reconnecting gcm"), n.ensureChannel()
})
}
if (this.channel)return Promise.resolve();
var n = this;
return this.channelPromise ? this.channelPromise : this.channelPromise = new Promise(function (o, i) {
$.ajax({
type: "GET", url: "https://vysor-1026.appspot.com/listen", error: function () {
delete n.channelPromise, console.error("error ensuring gcm channe", error), t()
}, success: function (t) {
var i = new goog.appengine.Channel(t.token), r = {
onopen: function () {
n.channel = i;
var e = "web:" + t.channel;
n.registrationId = e, n.onRegistrationIdChanged && n.onRegistrationIdChanged(e), o()
}, onmessage: function (e) {
n.onMessage(JSON.parse(e.data))
}, onerror: function () {
console.error("gcm onerror", arguments), e()
}, onclose: function () {
console.error("gcm onclose", arguments), e()
}
};
i.open(r)
}
})
})
}, n.prototype.sendGcm = function (e, t, n, o, i, r) {
e || (e = this.defaultSenderId), t.startsWith("web:") ? $.ajax({
type: "POST",
url: "https://vysor-1026.appspot.com/send",
data: JSON.stringify({
channel: t.substring(4),
data: {senderId: e, src: this.registrationId, srcPort: o, dstPort: n, type: i, message: JSON.stringify(r)}
}),
contentType: "application/json",
dataType: "json",
success: function () {
}
}) : $.ajax({
type: "POST",
url: "https://gcm-http.googleapis.com/gcm/send",
headers: {Authorization: "key=" + this.senders[e]},
data: JSON.stringify({
to: t,
data: {senderId: e, src: this.registrationId, srcPort: o, dstPort: n, type: i, message: JSON.stringify(r)}
}),
contentType: "application/json",
dataType: "json",
error: function () {
console.log("gcm error", arguments)
},
success: function () {
console.log("gcm", arguments)
}
})
}, n.getKey = function (e, t, n) {
return n + ":" + t + ":" + e
}, n.prototype.setupPeerConnection = function (e, o, i, r, s, c) {
var a, d = window.RTCPeerConnection || window.webkitRTCPeerConnection, l = new d(this.rtcc), u = function (t) {
var n = [];
for (var a in t)a = t[a], n.push(a), JSON.stringify(n).length > 3200 && (this.sendGcm(o, i, r, s, e, {
desc: c(),
candidates: n
}), n = []);
n.length > 0 && this.sendGcm(o, i, r, s, e, {desc: c(), candidates: n})
}.bind(this);
l.onicecandidate = function (e) {
null != e.candidate && (console.log(e.candidate), a = g(a, e.candidate, 500, u))
}.bind(this);
var h = n.getKey(i, r, s), f = new t(this, l, h);
return l.onsignalingstatechange = function (e) {
"stable" == l.signalingState ? this.gcmRtcConnections[h] == f : "closed" == l.signalingState && f.destroy()
}.bind(this), this.gcmRtcConnections[h] = f, f
}, n.gcmPortCount = 0, n.prototype.connect = function (e, t) {
function o(e) {
l.createOffer(e).then(function (e) {
i = e, l.setLocalDescription(e)
})
}
var i, r = e.senderId, s = e.registrationId, c = e.port, a = n.gcmPortCount++,
d = this.setupPeerConnection("offer", r, s, c, a, function () {
return i
}), l = d.pc;
if (e.audio) navigator.webkitGetUserMedia({audio: !0, video: !1}, function (e) {
l.addStream(e), l.onaddstream = function (e) {
console.log("got the remote stream"), t(d, e)
}, o({offerToReceiveAudio: !0, offerToReceiveVideo: !1, voiceActivityDetection: !1})
}, function () {
console.error("audio fail", arguments), o({
offerToReceiveAudio: !0,
offerToReceiveVideo: !1,
voiceActivityDetection: !1
})
}); else {
var u = d.prepareChannel("pinger");
u.onopen = function () {
console.log("got rtc pinger"), d.setupPinger(u), t(d)
}, d.listenSockets(), o({})
}
}, n.prototype.isListening = function (e) {
return null != this.gcmRtcListeners[e]
}, n.prototype.stopListen = function (e) {
delete this.gcmRtcListeners[e]
}, n.prototype.listen = function (e, t) {
return this.gcmRtcListeners[e] ? void console.log("already listening on gcm port " + e) : void(this.gcmRtcListeners[e] = {
listener: this,
listenCallback: t
})
}, n.prototype.incoming = function (e, t, o, i, r, s) {
var c = n.getKey(t, o, i), a = this.gcmRtcConnections[c];
if (a) {
if (!a.remoteDesc) {
a.remoteDesc = new RTCSessionDescription(r.desc);
var d = a.pc;
d.setRemoteDescription(a.remoteDesc)
}
} else {
var l;
a = this.setupPeerConnection("answer", e, t, o, i, function () {
return l
}), a.remoteDesc = new RTCSessionDescription(r.desc);
var d = a.pc;
d.ondatachannel = function (e) {
console.log("got rtc pinger"), this.setupPinger(e.channel), s(a), this.listenSockets()
}.bind(a), d.setRemoteDescription(a.remoteDesc, function () {
d.createAnswer().then(function (e) {
l = e, d.setLocalDescription(e)
}, function () {
console.error("answer error", arguments)
})
})
}
a.addCandidates(r)
}, window.GcmRtcSocket = e, window.GcmRtcManager = n
}(), function () {
function e(e, t) {
this.handle = e, this.iface = t, this.type = "usb";
for (var n in t.endpoints)n = t.endpoints[n], "bulk" == n.type && (this.zero_mask = n.maximumPacketSize - 1, "in" == n.direction ? this.in = n : this.out = n)
}
function t(e) {
this.socket = e, this.zero_mask = (1 << 30) - 1, this.type = "tcp", e.onClose = function () {
var e = this.currentRead;
e && (delete this.currentRead, e({resultCode: -1}))
}.bind(this)
}
function n(e, t) {
this.onConnected = t, this.transport = e, this.currentSocketId = 0, this.sockets = {}, this.forwards = {}, this.maxPayload = n.MAX_PAYLOAD
}
function i(e) {
var t = {};
"String" != e.constructor.name && (e = s(e));
var n = e.replace("device::", "").split(";");
for (var o in n) {
o = n[o];
var i = o.split("=");
2 == i.length && (t[i[0]] = i[1])
}
return t
}
function r(e, t, n) {
n || (n = function () {
}), this.device = e, this.localId = t, this.onConnected = n
}
function a(t, o, i) {
console.log("connecting");
var r = new n(new e(t, o), i);
console.log("sending CNXN"), r.sendMessage(n.kCommandCNXN, n.ADB_PROTOCOL_VERSION, n.MAX_PAYLOAD, "host::"), console.log("starting receive loop"), r.receiveMessages()
}
function d(e) {
var e = e || {}, t = e.port || 5037, n = e.start !== !1;
this.currentSocketId = 0, this.pendingDevices = {}, this.port = t, this.adbDevices = {}, this.clients = {}, n && this.start()
}
function u() {
return (new Date).getTime()
}
function f(e, t) {
this.server = e, this.socket = t
}
e.prototype.destroy = function () {
chrome.usb.releaseInterface(this.handle, this.iface.interfaceNumber, function () {
chrome.runtime.lastError, chrome.usb.closeDevice(this.handle, function () {
chrome.runtime.lastError
})
}.bind(this))
}, e.prototype.write = function (e, t) {
if (this.writing)return this.pendingWrites || (this.pendingWrites = []), void this.pendingWrites.push({
data: e,
callback: t
});
var n = {direction: "out", endpoint: this.out.address, data: e};
this.writing = !0, chrome.usb.bulkTransfer(this.handle, n, function (e) {
if (chrome.runtime.lastError, this.writing = !1, t(e), this.pendingWrites) {
var n = this.pendingWrites.shift();
this.pendingWrites.length || (this.pendingWrites = null), this.write(n.data, n.callback)
}
}.bind(this))
}, e.prototype.read = function (e, t) {
var n = {direction: "in", endpoint: this.in.address, length: e};
chrome.usb.bulkTransfer(this.handle, n, function (e) {
chrome.runtime.lastError, t(e)
})
}, t.prototype.destroy = function () {
this.socket.destroy()
}, t.prototype.write = function (e, t) {
return this.writing ? (this.pendingWrites || (this.pendingWrites = []), void this.pendingWrites.push({
data: e,
callback: t
})) : (this.writing = !0, void this.socket.write(e, function () {
if (this.writing = !1, t({resultCode: 0}), this.pendingWrites) {
var e = this.pendingWrites.shift();
this.pendingWrites.length || (this.pendingWrites = null), this.write(e.data, e.callback)
}
}.bind(this)))
}, t.prototype.read = function (e, t) {
this.currentRead = t, this.socket.read(e, function (e) {
delete this.currentRead, t({resultCode: 0, data: e.buffer.slice(e.byteOffset, e.byteOffset + e.byteLength)})
})
}, n.prototype.fatal = function (e) {
console.log("fatal error", JSON.stringify(e));
var t = this.onConnected;
t ? (delete this.onConnected, t()) : this.onError && (this.onError(), delete this.onError), this.destroy()
}, n.prototype.destroy = function () {
for (var e in this.sockets)e = this.sockets[e], e.dataReceived(null);
this.forwards && $.each(this.forwards, function (e, t) {
t.destroy()
}), this.transport.destroy()
}, n.kCommandSYNC = 1129208147, n.kCommandCNXN = 1314410051, n.kCommandOPEN = 1313165391, n.kCommandOKAY = 1497451343, n.kCommandCLSE = 1163086915, n.kCommandWRTE = 1163154007, n.kCommandAUTH = 1213486401, n.kAuthToken = 1, n.kAuthSignature = 2, n.kAuthRSAPublicKey = 3, n.ADB_PROTOCOL_VERSION = 16777216, n.ADB_VERSION = 39, n.MAX_PAYLOAD = 4096, n.checksum = function (e) {
e = new Uint8Array(e);
for (var t = 0, n = 0; n < e.byteLength; n++)t += e[n];
return 4294967295 & t
}, n.prototype.sendMessage = function (e, t, o, i, r) {
i || (i = ""), "String" == i.constructor.name && (i = c(i));
var s = !0;
i.byteLength || (s = !1), e == n.kCommandAUTH && t == n.kAuthSignature && (s = !1), e == n.kCommandWRTE && (s = !1);
var a = i.byteLength;
if (s && a++, s) {
var d = new ArrayBuffer(i.byteLength + 1), l = new Uint8Array(d);
l.set(new Uint8Array(i)), l[d.byteLength - 1] = 0, i = d
}
var u = new ArrayBuffer(24), l = new DataView(u);
l.setUint32(0, e, !0), l.setUint32(4, t, !0), l.setUint32(8, o, !0), l.setUint32(12, a, !0), l.setUint32(16, n.checksum(i), !0), l.setUint32(20, 4294967295 ^ e, !0), this.transport.write(u, function (e) {
e.resultCode && this.fatal(e), !i.byteLength && r && r()
}.bind(this)), i.byteLength && this.transport.write(i, function (e) {
e.resultCode && this.fatal(e), r && r()
}.bind(this))
}, n.prototype.getKey = function (e) {
chrome.storage.local.get("adbkey", function (t) {
var n = t.adbkey, o = new JSEncrypt({default_key_size: 2048});
n ? o.setPrivateKey(n) : (n = o.getPrivateKeyB64(), o.setPrivateKey(n), chrome.storage.local.set({adbkey: n})), e(o)
})
}, n.prototype._convertToMinCrypt = function (e) {
var t = 2048, n = t / 8 / 4, o = BigInteger.ONE.shiftLeft(32), i = e.n.clone(),
r = BigInteger.ONE.shiftLeft(1).pow(t), s = r.multiply(r).mod(i), c = new Uint32Array(3 + 2 * n);
c[0] = n, c[1] = o.subtract(i.modInverse(o)).intValue();
for (var a = n + 2, d = 2, l = 2 + n; d < a; ++d, ++l)c[d] = i.mod(o).intValue(), i = i.divide(o), c[l] = s.mod(o).intValue(), s = s.divide(o);
c[c.length - 1] = e.e;
for (var u = "", h = new Uint8Array(c.buffer), d = 0; d < h.length; ++d) {
var f = h[d].toString(16);
1 == f.length && (u += "0"), u += f
}
return p(u) + " adb@chrome"
}, n.prototype.sign = function (e, t) {
if (null == e)throw"AuthManager is not initialized";
var n = 256, o = new Uint8Array(n);
o[0] = 0, o[1] = 1;
for (var i = [0, 48, 33, 48, 9, 6, 5, 43, 14, 3, 2, 26, 5, 0, 4, 20], r = n - i.length - t.byteLength, s = 2; s < r; s++)o[s] = 255;
o.set(new Uint8Array(i), r), r += i.length, o.set(new Uint8Array(t), r);
var c = new BigInteger(Array.apply([], o));
return new Uint8Array(e.doPrivate(c).toByteArray()).buffer
}, n.parseConnectionPayload = i, n.prototype.handleUnknown = function (e, t) {
console.log("no idea what this socket is."), this.sendMessage(n.kCommandCLSE, e, t)
}, n.prototype.handleMessage = function (e, t) {
var o = e.getUint32(0, !0), r = e.getUint32(4, !0), c = e.getUint32(8, !0);
e.getUint32(12, !0), e.getUint32(16, !0);
switch (o) {
case n.kCommandOPEN:
this.onOpenSocket && this.onOpenSocket(t, r);
break;
case n.kCommandAUTH:
console.log("auth:", this), this.getKey(function (e) {
if (this.sentSignature) {
var o = this._convertToMinCrypt(e.getKey());
this.sendMessage(n.kCommandAUTH, n.kAuthRSAPublicKey, 0, o), m('Check your Android device and click "Allow USB Debugging".')
} else {
this.sentSignature = !0;
var i = this.sign(e.getKey(), t);
this.sendMessage(n.kCommandAUTH, n.kAuthSignature, 0, i, function () {
})
}
}.bind(this));
break;
case n.kCommandOKAY:
var a = r, d = c, l = this.sockets[d];
if (!l)return void this.handleUnknown(d, a);
var u = l.onConnected;
u && (delete l.onConnected, l.remoteId = a, u(l));
var h = l.pendingWrite;
if (h)return u = l.wrote, delete l.wrote, delete l.pendingWrite, void l.write(h, u);
u = l.wrote, u && (delete l.wrote, u());
break;
case n.kCommandCNXN:
this.rawProperties = s(t), this.properties = i(t);
var u = this.onConnected;
u && (delete this.onConnected, u(this));
break;
case n.kCommandWRTE:
var a = r, d = c, l = this.sockets[d];
if (!l)return void this.handleUnknown(d, a);
l.paused || this.sendMessage(n.kCommandOKAY, l.localId, l.remoteId), l.dataReceived(new Uint8Array(t));
break;
case n.kCommandCLSE:
var a = r, d = c, l = this.sockets[d];
if (!l)return void console.log("asked to close unknown socket?");
delete this.sockets[d], l.destroy();
var u = l.onConnected;
u && (delete l.onConnected, u());
break;
default:
console.log("unknown command: ", o.toString(16), r, c, t)
}
}, n.prototype.onReceiveMessage = function (e) {
if (e.resultCode)return void this.fatal(e);
var t = new DataView(e.data), o = t.getUint32(12, !0);
if (o) this.transport.read(o, function (e) {
if (e.resultCode)return void this.fatal(e);
var o = e.data;
if (n.checksum(o) != t.getUint32(16, !0))return void this.receiveMessages();
try {
this.handleMessage(t, o)
} finally {
this.receiveMessages()
}
}.bind(this)); else try {
this.handleMessage(t, null)
} finally {
this.receiveMessages()
}
}, n.prototype.receiveMessages = function () {
this.transport.read(24, this.onReceiveMessage.bind(this))
}, n.prototype.forwardPort = function (e) {
var t = new Server;
t.listen({port: e.fromPort, address: "127.0.0.1"}, function (t) {
this.newSocket(e.to, function (e) {
e ? Socket.stream(t, e) : t.destroy()
}.bind(this))
}.bind(this), function () {
this.forwards[e.fromPort] = t
}.bind(this))
}, n.prototype.newAdbSocket = function (e, t) {
var n;
return n = this.createSocket ? this.createSocket(e, t) : new r(this, e, t)
}, n.prototype.newSocket = function (e, t) {
var o = ++this.currentSocketId;
this.sockets[o] = this.newAdbSocket(o, t), this.sendMessage(n.kCommandOPEN, o, 0, e)
}, r.prototype.write = function (e, t) {
if (this.pendingWrite || this.wrote)throw console.log("bad adb socket state, already writing"), new Error("bad adb socket state, already writing");
var o = Math.min(this.device.transport.zero_mask, this.device.maxPayload);
o < e.byteLength ? (this.pendingWrite = e.slice(o), e = e.slice(0, o)) : this.pendingWrite = null, this.wrote = t, this.device.sendMessage(n.kCommandWRTE, this.localId, this.remoteId, e)
}, r.prototype.destroy = function () {
this.device.sendMessage(n.kCommandCLSE, this.localId, this.remoteId), this.dataReceived(null)
}, r.prototype.buffered = Socket.prototype.buffered, r.prototype.dataReceived = Socket.prototype.dataReceived, r.prototype.read = Socket.prototype.read, r.prototype.pause = Socket.prototype.pause, r.prototype.resume = Socket.prototype.resume, r.prototype.unshift = Socket.prototype.unshift, r.prototype.onPause = function () {
}, r.prototype.onResume = function () {
this.device.sendMessage(n.kCommandOKAY, this.localId, this.remoteId)
}, d.prototype.start = function () {
if (this.server)return void console.log("ADB Server started while already started");
this.clients = {}, this.adbDevices = {}, this.pendingDevices = {}, this.refreshing = {};
var e = new Server;
e.listen({port: this.port, address: "127.0.0.1"}, function (e) {
var t = new f(this, e), n = ++this.currentSocketId;
this.clients[n] = t, e.onClose = function () {
delete this.clients[n]
}.bind(this), t.receiveHeader()
}.bind(this), function (t) {
return t ? void console.log("adb server failed to listen: " + t) : (console.log("ADB Server started"), this.server = e, void this.refresh())
}.bind(this))
}, d.prototype.isRunning = function () {
return null != this.server
}, d.prototype.kill = function () {
this.server.destroy(), this.server = null, this.refreshing = {};
for (var e in this.clients)e = this.clients[e], e.socket.destroy();
this.clients = {};
for (var t in this.adbDevices)t = this.adbDevices[t], t.destroy();
this.adbDevices = {}, this.pendingDevices = {}
}, d.prototype.selectDevice = function (e) {
chrome.usb.getUserSelectedDevices({
filters: [{
interfaceClass: 255,
interfaceSubclass: 66,
interfaceProtocol: 1
}]
}, function (t) {
for (var n in t)n = t[n], this.refreshDevice(n, e)
}.bind(this))
}, d.prototype.withAdbDevice = function (e, t) {
e.onError = function () {
delete this.adbDevices[e.serialno], this.internalOnDevicesChanged()
}.bind(this);
var n = function (n) {
e.serialno = n.trim(), this.adbDevices[e.serialno] = e, console.log("found device: " + e.serialno), this.internalOnDevicesChanged(), t(e)
}.bind(this);
return e.serialno ? void n(e.serialno) : void e.newSocket("shell:getprop ro.serialno", function (e) {
l(e, function (e) {
n(e)
}.bind(this))
}.bind(this))
}, d.prototype.tryDevice = function (e, t, n) {
function o(o) {
var s = o.interfaceNumber;
return !i[s] && (i[s] = e, console.log("claiming:", JSON.stringify(e), JSON.stringify(o)), chrome.usb.claimInterface(e, o.interfaceNumber, function () {
console.log("claimed:", JSON.stringify(chrome.runtime.lastError)), a(e, o, function (e) {
return e ? (e.serialno = t, void r.withAdbDevice(e, function (e) {
delete i[s], n(e)
})) : (delete i[s], void n())
})
}), !0)
}
var i = (this.adbDevices, this.pendingDevices), r = this;
chrome.usb.listInterfaces(e, function (t) {
if (!t)return console.log("unable list interfaces", JSON.stringify(chrome.runtime.lastError)), void(n && n());
console.log("got interfaces", JSON.stringify(t));
var i = !1;
for (var r in t)r = t[r], 255 == r.interfaceClass && 66 == r.interfaceSubclass && 1 == r.interfaceProtocol && (i |= o(r));
i || chrome.usb.closeDevice(e)
})
}, d.prototype.refreshDevice = function (e, t) {
chrome.usb.openDevice(e, function (n) {
return n ? (this.start(), void this.tryDevice(n, e.serialNumber, function (n) {
n && (n.usbDevice = e), t(n)
})) : (console.log("unable to open device", JSON.stringify(chrome.runtime.lastError)), void(t && t()))
}.bind(this))
}, d.prototype.refresh = function () {
if (!this.server)return void console.log("adb server refresh requested while server killed");
var e = u();
if (!(this.server.lastRefresh && this.server.lastRefresh > e - 1e4)) {
this.server.lastRefresh = e;
var t = chrome.runtime.getManifest().permissions.pop().usbDevices;
$(t).each(function (e, t) {
var n = t.vendorId + "&" + t.productId;
this.refreshing[n] || (this.refreshing[n] = !0, chrome.usb.findDevices({
productId: t.productId,
vendorId: t.vendorId
}, function (e) {
var o = e.length;
if (!o)return void delete this.refreshing[n];
console.log("found:", t, e);
for (var i in e)console.log("trying:", e[i]), this.tryDevice(e[i], e[i].serialNumber, function () {
o--, o || delete this.refreshing[n]
}.bind(this))
}.bind(this)))
}.bind(this))
}
}, d.prototype.internalOnDevicesChanged = function () {
for (var e in this.clients)if (e = this.clients[e], e.tracking) {
var t = e.getDevicesString();
t.length || (t = "0000\n"), e.socket.write(c(t), function () {
})
}
}, d.prototype.stop = function () {
this.server.destroy()
}, f.prototype.resolveTransport = function (e, t) {
if (t) {
var n = this.server.adbDevices[t];
return n ? n : "device not found"
}
var o = Object.keys(this.server.adbDevices);
if (o > 1)return "more than one device";
if (0 == o)return "no devices connected";
for (var i in this.server.adbDevices)return this.server.adbDevices[i]
}, f.prototype.write = function (e, t, n) {
t || (t = "OKAY"), e = c(e);
var i = e.byteLength, r = o(i);
r = c(t + r);
var s = h(new Uint8Array(r), new Uint8Array(e)).buffer;
n || (n = function () {
this.socket.destroy()
}.bind(this)), this.socket.write(s, n)
}, f.prototype.getDevicesString = function (e) {
var e = e || {}, t = e.longformDevices, n = "";
for (var o in this.server.adbDevices)o = this.server.adbDevices[o], n += o.serialno + "\tdevice", t && (n += "usb" == o.transport.type ? " usb:" + o.transport.iface.interfaceNumber : " tpcip:something", n += " product:" + o.properties["ro.product.name"], n += " model:" + o.properties["ro.product.model"], n += " device:" + o.properties["ro.product.device"]), n += "\n";
return n
}, f.prototype.writeDevices = function (e, t) {
this.write(this.getDevicesString(e), null, t)
}, f.prototype.handlePayload = function (e) {
e = s(e);
var i, r = e.split(":"), a = e;
switch ("host-serial" == r[0] && (r[0] = "host", i = r.splice(1, 1)[0], Number.isInteger(parseInt(r[1])) && (i += ":" + r.splice(1, 1)[0])), r.length >= 2 && (a = r[0] + ":" + r[1]), a) {
case"host:version":
this.write(o(n.ADB_VERSION));
break;
case"host:devices-l":
case"host:devices":
var d = "host:devices-l" == e;
this.server.refresh(), this.writeDevices({longformDevices: d});
break;
case"host:features":
var l = this.resolveTransport(e, i);
if ("String" == l.constructor.name) {
this.write(l, "FAIL");
break
}
var h = l.properties.features;
h || (h = ""), this.write(o(h));
break;
case"host:transport-usb":
case"host:transport-any":
var l = this.resolveTransport(e, i);
if ("String" == l.constructor.name) {
this.write(l, "FAIL");
break
}
this.transport = l, this.socket.write(c("OKAY"), function () {
});
break;
case"host:kill":
this.server.kill();
break;
case"host:disconnect":
if (r.length > 4) {
this.write("host:disconnect only takes 1 argument", "FAIL");
break
}
if (r.length > 2) {
var f = r[2];
if (f.length) {
var p = 5555;
r.length > 3 && (p = Number.parseInt(r[3]));
var v = f + ":" + p, g = this.server.adbDevices[v];
g && "tcp" == g.transport.type && g.destroy(), this.write("disconnected");
break
}
}
for (var g in this.server.adbDevices)g = this.server.adbDevices[g], "tcp" == g.transport.type && g.destroy();
this.write("disconnected");
break;
case"host:connect":
if (r.length < 3) {
this.write("need more arguments for connect <host>[:<port>]", "FAIL");
break
}
var f = r[2], p = 5555;
r.length > 3 && (p = Number.parseInt(r[3])), Socket.connect({host: f, port: p}, function (e, o) {
if (!e)return console.error("connect failed"), this.write("unable to connect to " + f + " " + p + ": " + o, "FAIL"), this;
var i = new n(new t(e), function (e) {
this.server.withAdbDevice(e, function () {
var e = "connected to " + f + ":" + p;
console.log(e), this.write(e)
}.bind(this))
}.bind(this));
i.serialno = f + ":" + p, e.onClose = function () {
i.fatal("socket closed")
}.bind(this), i.sendMessage(n.kCommandCNXN, n.ADB_PROTOCOL_VERSION, n.MAX_PAYLOAD, "host::"), i.receiveMessages()
}.bind(this));
break;
case"host:track-devices":
this.tracking = u(), this.writeDevices({}, function () {
});
break;
case"host:forward":
var m = r.join(":").substring(a.length + 1).split(";"), y = m[0].split(":"), w = parseInt(y[1]),
l = this.resolveTransport(e, i);
if ("String" == l.constructor.name) {
this.write(l, "FAIL");
break
}
l.forwardPort({fromPort: w, to: m[1]}), this.socket.write(c("OKAYOKAY"), function () {
}.bind(this));
break;
default:
if (this.transport) {
var l = this.transport;
return void l.newSocket(e, function (e) {
return e ? (this.socket.write(c("OKAY"), function () {
}), void Socket.stream(e, this.socket)) : void this.socket.write(c("OKAY"), function () {
this.socket.destroy()
}.bind(this))
}.bind(this))
}
var b = "host:transport:";
if (e.startsWith(b)) {
var i = e.substr(b.length), g = this.server.adbDevices[i];
if (!g)return void this.write("device not found", "FAIL");
this.transport = g, this.socket.write(c("OKAY"), function () {
});
break
}
console.log("unknown request: " + e), this.write("unknown command: " + e, "FAIL");
var k = chrome.runtime.getManifest().name;
chrome.notifications.create({
type: "basic",
iconUrl: "/icon.png",
title: k,
message: k + "'s adb server encountered an unknown adb command.\nYou may want to close " + k + " and start your adb binary manually."
})
}
this.receiveHeader()
}, f.prototype.receivePayload = function (e) {
var t = parseInt(s(e), 16);
this.socket.read(t, this.handlePayload.bind(this))
}, f.prototype.receiveHeader = function () {
this.socket.read(4, this.receivePayload.bind(this))
}, window.AdbDevice = n, window.AdbServer = d, window.AdbTcpTransport = t
}(), function () {
function e() {
}
var t = {};
t.sendHostCommand = function (e, t) {
Socket.connect({host: "127.0.0.1", port: 5037}, function (n) {
if (!n)return void t();
var i = e;
e = o(e.length) + e, n.read(4, function (e) {
var o = s(e);
return "OKAY" != o ? (console.error("error in response to adb host command", i, o), n.destroy(), void t()) : void n.read(4, function (e) {
var o = s(e);
return e = parseInt(o, 16), 0 == e || "OKAY" == o ? void t(n, new ArrayBuffer(0)) : void n.read(e, function (e) {
t(n, e)
})
})
}), n.write(c(e), function () {
})
})
}, t.devices = function (e) {
function n(e) {
var t = e;
e = e.replace("\t", " ");
var n = e.indexOf(" ");
if (n != -1) {
var i = e.substring(0, n);
e = e.substring(n).trim();
for (var r; r != e;)r = e, e = e.replace(" ", " ");
var s = {}, c = e.indexOf(" ");
c == -1 && (c = e.length);
var a = e.substring(0, c);
for (e = e.substring(c + 1); e.length && (n = e.indexOf(":"), n != -1);) {
var d, l = e.substring(0, n), u = e.substring(n + 1), h = u.indexOf(" "), f = u.indexOf(":");
if (h == -1 || f == -1) d = u, e = ""; else for (; h != -1 && h < f;)d = u.substring(0, h), e = u.substring(h + 1), h = u.indexOf(" ", h + 1);
s[l] = d
}
var p;
p = s.model ? s.model.replace("_", " ") : i, o[i] = {serialno: i, name: p, status: a, properties: t}
}
}
var o = {};
t.sendHostCommand("host:devices-l", function (t, i) {
if (!t)return void e();
t.destroy(), i = s(i), console.log("ADB devices:", i), i = i.trim();
var r = i.split("\n");
for (var c in r)c = r[c], n(c);
e(o)
})
}, t.killServer = function (e) {
t.sendHostCommand("host:kill-server", function (t, n) {
return t ? (t.destroy(), n = s(n), void(e && e())) : void e()
})
}, t.sendClientCommand = function (e, t) {
var n = e.command, i = e.serialno;
Socket.connect({host: "127.0.0.1", port: 5037}, function (e) {
if (!e)return void t();
e.read(4, function (i) {
var r = s(i);
if ("OKAY" != r)return e.destroy(), void t(null);
var a = n;
a = o(a.length) + a, e.read(4, function (n) {
var o = s(n);
return "OKAY" != o ? (e.destroy(), void t(null)) : void t(e)
}), e.write(c(a), function () {
})
});
var r = "host:transport:" + i;
r = o(r.length) + r, e.write(c(r), function () {
})
})
}, t.shell = function (e, n) {
var o = e.command;
e.serialno;
t.getOrCreateSockFactory(e).newSocket("shell:" + o, function (e) {
return e ? void l(e, function (e) {
n(e)
}) : void n()
})
}, t.forward = function (e, n) {
var o = "host-serial:" + e.serialno + ":forward:" + e.from + ";" + e.to;
t.sendHostCommand(o, function (e, t) {
e && e.destroy(), n(e, t)
})
}, e.MKID = function (e, t, n, o) {
return e.charCodeAt(0) | t.charCodeAt(0) << 8 | n.charCodeAt(0) << 16 | o.charCodeAt(0) << 24
}, e.ID_RECV = e.MKID("R", "E", "C", "V"), e.ID_SEND = e.MKID("S", "E", "N", "D"), e.ID_DONE = e.MKID("D", "O", "N", "E"), e.ID_DATA = e.MKID("D", "A", "T", "A"), e.DATA_MAX = 65536, t.pull = function (n, o) {
var i = n.file, r = (n.serialno, n.fileEntry), s = n.socket;
s || !function () {
var e;
s = {
write: function (t, n) {
return e ? (e.onwriteend = n, void e.write(new Blob([t]))) : void r.createWriter(function (o) {
e = o, s.write(t, n)
})
}
}
}();
var a = new b;
Socket.pump(a, s, function () {
o(r)
}), t.getOrCreateSockFactory(n).newSocket("sync:", function (t) {
function n(e) {
t.read(e, function (e) {
a.dataReceived(e), r()
})
}
function r() {
t.read(8, function (i) {
var r = new DataView(i.buffer, i.byteOffset, i.byteLength), s = r.getUint32(0, !0);
if (s == e.ID_DATA) {
var c = r.getUint32(4, !0);
return void n(c)
}
return t.destroy(), s == e.ID_DONE ? void a.dataReceived(null) : void o()
})
}
if (!t)return void o();
var s = new ArrayBuffer(8), d = new DataView(s);
d.setUint32(0, e.ID_RECV, !0), d.setUint32(4, i.length, !0), t.write(s, function () {
t.write(c(i), function () {
r()
})
})
})
}, t.createSocketFactory = function (e) {
return {
newSocket: function (n, o) {
t.sendClientCommand({serialno: e, command: n}, o)
}
}
}, t.getOrCreateSockFactory = function (e) {
return e.socketFactory || t.createSocketFactory(e.serialno)
}, t.push = function (n, o) {
var i = n.file, r = (n.serialno, n.socket);
t.getOrCreateSockFactory(n).newSocket("sync:", function (t) {
if (!t)return void o();
var n = new ArrayBuffer(8), s = new DataView(n), a = i + ",0644";
s.setUint32(0, e.ID_SEND, !0), s.setUint32(4, a.length, !0), t.write(n, function () {
t.write(c(a), function () {
function n() {
r.read(function (t) {
if (t.byteLength > e.DATA_MAX) {
var n = t.subarray(e.DATA_MAX);
t = t.subarray(0, e.DATA_MAX), r.unshift(n)
}
i(t)
})
}
function i(o) {
var i = new ArrayBuffer(8), r = new DataView(i);
r.setUint32(0, e.ID_DATA, !0), r.setUint32(4, o.byteLength, !0), t.write(i, function () {
var e = o.buffer;
(o.byteOffset || o.length != e.byteLength) && (e = e.slice(o.byteOffset, o.byteOffset + o.byteLength)), t.write(e, function () {
n()
})
})
}
r.onClose = function () {
var n = new ArrayBuffer(8), i = new DataView(n);
i.setUint32(0, e.ID_DONE, !0), i.setUint32(4, 0, !0), t.write(n, function () {
t.read(8, function () {
o()
})
})
}, n()
})
})
})
}, window.Adb = t
}(), function () {
function e(e, t) {
this.transport = e, this.sockets = {}, this.currentSocketId = 0, this.maxPayload = t || AdbDevice.MAX_PAYLOAD
}
e.prototype.start = function (e) {
var t = c(e, void 0, !0);
this.sendMessage(AdbDevice.kCommandCNXN, AdbDevice.ADB_PROTOCOL_VERSION, this.maxPayload, t), this.receiveMessages()
}, e.prototype.fatal = function (e) {
console.log("fatal error", e);
var t = this.onClose;
t && (delete this.onClose, t())
}, e.prototype.sendMessage = AdbDevice.prototype.sendMessage, e.prototype.receiveMessages = AdbDevice.prototype.receiveMessages, e.prototype.onReceiveMessage = AdbDevice.prototype.onReceiveMessage, e.prototype.handleMessage = AdbDevice.prototype.handleMessage, e.prototype.handleUnknown = AdbDevice.prototype.handleUnknown, e.prototype.newAdbSocket = AdbDevice.prototype.newAdbSocket, e.prototype.destroy = AdbDevice.prototype.destroy, e.prototype.onOpenSocket = function (e, t) {
if (this.openSocket) {
var n = ++this.currentSocketId, o = this.newAdbSocket(n);
o.remoteId = t, this.sockets[n] = o, this.sendMessage(AdbDevice.kCommandOKAY, n, t), this.openSocket(s(e), o)
}
}, window.AdbDaemon = e
}(), function () {
function e(e, t, n) {
$.ajax({
url: e, dataType: "binary", responseType: "arraybuffer", success: function (e) {
var o = new Uint8Array(e), i = new b(o), r = "/data/local/tmp/apk" + (new Date).getTime() + ".apk";
Adb.push({serialno: t, file: r, socket: i}, function () {
Adb.shell({command: "pm install -r " + r, serialno: t}, n)
})
}, error: function (e) {
console.error("error fetching apk", e), n()
}
})
}
function t(e, t, n) {
Adb.shell({command: "pm path " + t, serialno: e}, function (e) {
if ("" == e || !e)return void n(null);
var t = e.match(/package:\/.*?[\r\n]/);
return t && t.length ? (e = t[0], e = e.replace("package:", "").trim(), void n(e)) : void n(null)
})
}
function n(e, t, n, o, i) {
i || (i = Adb.shell), Adb.shell({command: "ls -l /system/bin/app_process*", serialno: e}, function (r) {
var s = "/system/bin/app_process";
r && r.indexOf("app_process32") != -1 && (s += "32"), i({
command: 'sh -c "CLASSPATH=' + t + " " + s + " /system/bin " + n + '"',
serialno: e
}, o)
})
}
window.AdbUtils = {runMain: n, installApk: e, getApkPath: t}
}(), function () {
var e = function (e) {
this.authorization = e
};
e.prototype.shorten = function (e, t) {
$.ajax({
type: "POST",
url: "https://www.googleapis.com/urlshortener/v1/url?key=" + this.authorization,
data: JSON.stringify({longUrl: e}),
contentType: "application/json",
dataType: "json",
success: function (e) {
t(e.id)
}
})
}, window.Googl = e
}(), function () {
var e = 1, t = 1;
S.prototype.refresh = function (e, t) {
this.refreshInternal(e, t).async()
}, S.prototype.refreshInternal = function*(o, i) {
var r, s = function () {
n(function () {
if (this.a()) {
var e, t = chrome.app.window.getAll().filter(function (e) {
return e && "purchase" == e.id
});
t && t.length, e = t[0], null != e && (e.close(), m("Vysor subscription is active. Thank you for your support!"))
}
}.bind(this)), this.globalRefresh ? this.globalRefresh() : console.error("no global refresh?"), r || (r = !0, o && o(this.a()))
}.bind(this), c = !1, a = !1, d = !1, l = !1;
window.chrome && window.chrome.runtime && window.chrome.runtime.connect || (d = !0);
var u, h, f, p = function (e, t) {
return !!t.licensed && (e != t.email ? (console.log("email mismatch"), !1) : (console.log("enterprise license retrieved"), !0))
}.bind(this), v = function (e, t) {
if (t.sandbox != c)return console.log("sandbox mismatch"), !1;
if (e != t.buyer_id)return console.log("id mismatch"), !1;
if ("koushd@gmail.com" != t.seller_id)return console.log("seller mismatch"), !1;
var n = !1;
return t.subscriptions && $.each(t.subscriptions, function (e, t) {
return console.log("subscription found", t), t.remote_plan_id.startsWith("vysor") ? void(t.subscription_active && (console.log("clockwork subscription retrieved"), n = t.license_first_retrieved)) : void console.log("skipping non-vysor subscription")
}.bind(this)), $.each(t.orders, function (e, t) {
return console.log("purchase found", t), t.product_id.startsWith("vysor") ? void(t.is_purchased && (console.log("clockwork license retrieved"), n = t.order_date)) : void console.log("skipping non-vysor purchase")
}.bind(this)), n
}.bind(this), g = function (t) {
$.each(t, function (t, n) {
console.log("subscription status", n), "ACTIVE" == n.state && (console.log("chrome license retrieved"), e = !0)
}.bind(this))
}.bind(this), b = function*() {
if (l)return void console.log("skipping enterprise");
if (f && !i)return console.log("Skipping enterprise license server check."), void console.log("Use Retrieve License from the purchase page to force refresh.");
console.log("checking chrome enterprise licenses");
var n = yield w(!1, yield);
if (!n)return chrome.runtime.lastError, void console.error("No auth token for enterprise licensing");
try {
var o = yield chrome.identity.getProfileUserInfo(yield);
if (!R)return void console.log("unable to retrieve user info for enterprise");
var r = (o.id, o.email);
try {
var o = yield $.ajax({
url: "https://billing.vysor.io/license",
headers: {Authorization: "Bearer " + n},
dataType: "json",
success: yield y,
error: yield Error
}), c = JSON.parse(o.signed_data);
yield chrome.storage.local.set({cachedEnterpriseLicense: o}, yield);
var a = p(r, c);
if (!a)return void console.log("No enterprise license found on server");
e = !0, t = !0, s()
} catch (e) {
yield chrome.identity.removeCachedAuthToken({token: n}, yield), console.error("Error communicating with vysor enterprise", e)
}
} catch (e) {
yield chrome.identity.removeCachedAuthToken({token: n}, yield), console.error("Unable to get email for enterprise", e)
}
}.bind(this), k = function*() {
if (a)return void console.log("skipping clockwork");
if (h && !i)return console.log("Skipping clockwork license server check."), void console.log("Use Retrieve License from the purchase page to force refresh.");
console.log("checking clockwork purchases");
var n = yield w(!1, yield);
if (!n)return chrome.runtime.lastError, void console.error("No auth token for clockwork billing");
try {
var o = yield chrome.identity.getProfileUserInfo(yield);
if (!R)return void console.log("unable to retrieve user info for clockwork");
var r = o.id,
d = "https://billing.clockworkmod.com/api/v1/purchase/koushd@gmail.com?sandbox=" + c + "&nonce=" + Date.now();
try {
var o = yield $.ajax({
url: d,
dataType: "json",
headers: {Authorization: "Bearer " + n},
error: yield Error,
success: yield y
}), l = JSON.parse(o.signed_data);
yield chrome.storage.local.set({cachedClockworkLicense: o}, yield);
var u = v(r, l);
if (!u)return void console.log("no clockwork license found on server");
e = !0, t = !0, s()
} catch (e) {
console.error("error requesting purchases", e)
}
} catch (e) {
yield chrome.identity.removeCachedAuthToken({token: n}, yield), console.error("Unable to get buyer id for clockworkbilling", e)
}
}.bind(this), S = function*() {
if (!d) {
console.log("checking chrome store purchases");
var e;
try {
e = yield google.payments.inapp.getPurchases({
parameters: {env: "prod"},
success: yield y,
failure: yield Error
})
} catch (e) {
if (console.error("Failed to query license from chrome store.", e), !i)return console.log("Skipping Chrome license server fallback check."), void console.log("Use Retrieve License from the purchase page to force refresh.");
console.log("Falling back to server proxied query.");
try {
yield this.b(!1, yield), yield * I()
} catch (e) {
console.error("failed to do fallback server check", e)
}
return
}
if (g(e.response.details), !this.a())return void console.log("no chrome license found on server");
s(), console.log("Caching Vysor license."), yield this.b(!1, yield), this.c() && s()
}
}.bind(this), A = 4, D = A / 2, I = function*() {
if (!d) {
console.log("checking cached chrome license");
var e = yield chrome.storage.local.get("cachedLicense", yield);
if (!e)return void console.error("storage access failed?", chrome.runtime.lastError);
if (!e.cachedLicense)return void console.log("no cached chrome license found");
if (!R)return void console.log("unable to retrieve user info for cache");
var n = yield C("AQAB", "vMGBBmLcMO4lOmg-YAHq2DjZKHTaW-xs9KPNXU_zKJ7ZhFhWH3I6skF9ZO8lKeXOSwVEIW4HVMa7m16S6WTrUw", e.cachedLicense.signed_data, e.cachedLicense.signature, yield);
if (n)return void console.error("error verifying cached signature", n);
var o = JSON.parse(e.cachedLicense.signed_data);
u = !1;
var i = Date.now();
if ($.each(o.payments, function (e, t) {
"ACTIVE" == t.state && (u = !0, i = Math.min(i, t.createdTime))
}.bind(this)), o.date > Date.now())return void console.log("cached license date from future?");
var r, c = new Date - new Date(i), a = c / 1e3 / 60 / 60 / 24;
r = a < 14 ? 4 : Math.min(30, 4 + (a - 14) / 7);
var l = r / 2;
if (o.date + 24 * r * 60 * 60 * 1e3 < Date.now())return void console.log("cached license is expired.");
if (R.id != o.userinfo.id)return void console.log("id mismatch");
if (g(o.payments), !this.a())return void console.log("no chrome license found in cache");
if (console.log("cached license is valid for " + (o.date + 24 * r * 60 * 60 * 1e3 - Date.now()) / 36e5 + " hours"), t = !0, s(), o.date + 24 * l * 60 * 60 * 1e3 < Date.now()) {
console.log("Refreshing cached license");
try {
yield this.b(!1, yield)
} catch (e) {
console.warn("Failed to re-cache license.", e)
}
}
}
}.bind(this), L = function*() {
if (!a) {
console.log("Checking cached Clockwork license.");
var n = yield chrome.storage.local.get("cachedClockworkLicense", yield);
if (!n)return void console.error("storage access failed?", chrome.runtime.lastError);
if (!n.cachedClockworkLicense)return void console.log("Cached Clockwork payload not found.");
if (!R)return void console.error("Unable to retrieve user info for cached Clockwork license.");
var o = R.id,
i = yield C("AQAB", "vMGBBmLcMO4lOmg-YAHq2DjZKHTaW-xs9KPNXU_zKJ7ZhFhWH3I6skF9ZO8lKeXOSwVEIW4HVMa7m16S6WTrUw", n.cachedClockworkLicense.signed_data, n.cachedClockworkLicense.signature, yield);
if (i)return void console.error("Error verifying cached clockwork signature", i);
var r = JSON.parse(n.cachedClockworkLicense.signed_data), c = v(o, r);
if (!c)return console.log("No Clockwork license found in cache."), void(h = !0);
var d, l = new Date - new Date(c), u = l / 1e3 / 60 / 60 / 24;
d = u < 14 ? 4 : Math.min(30, 4 + (u - 14) / 7);
var f = d / 2;
if (r.timestamp + 24 * d * 60 * 60 * 1e3 < Date.now())return void console.log("Cached Clockwork license is expired. Requires server check.");
if (r.timestamp > Date.now())return void console.error("Cached Clockwork license date from future?");
e = !0, console.log("Cached Clockwork license is valid for " + (r.timestamp + 24 * d * 60 * 60 * 1e3 - Date.now()) / 36e5 + " hours"), t = !0, s(), r.timestamp + 24 * f * 60 * 60 * 1e3 < Date.now() && (h = !1, yield * k())
}
}.bind(this), O = function*() {
if (!l) {
console.log("Checking cached enterprise license.");
var n = yield chrome.storage.local.get("cachedEnterpriseLicense", yield);
if (!n)return void console.error("storage access failed?", chrome.runtime.lastError);
if (!n.cachedEnterpriseLicense)return void console.log("Cached Enterprise payload not found.");
if (!R)return void console.error("Unable to retrieve user info for cached Clockwork license.");
var o = yield C("AQAB", "hDuGsIhbjLYXteQX3F3KNriQHwUSZurS5voCkdpA1733A65pqtGOrk9g_yLiF94_vSK0VmL-4stq7WAYEbn6nw", n.cachedEnterpriseLicense.signed_data, n.cachedEnterpriseLicense.signature, yield);
if (o)return void console.error("Error verifying cached enterprise signature", o);
var i = JSON.parse(n.cachedEnterpriseLicense.signed_data), r = p(R.email, i);
if (!r)return f = !0, void console.log("No Enterprise license found in cache.");
if (i.timestamp + 24 * A * 60 * 60 * 1e3 < Date.now())return void console.log("Cached Enterprise license is expired. Requires server check.");
if (i.timestamp > Date.now())return void console.error("Cached Enterprise license date from future?");
e = !0, console.log("Cached Enterprise license is valid for " + (i.timestamp + 24 * A * 60 * 60 * 1e3 - Date.now()) / 36e5 + " hours"), t = !0, s(), i.timestamp + 24 * D * 60 * 60 * 1e3 < Date.now() && (f = !1, yield * b())
}
}.bind(this);
if (this.a())return void s();
console.log("starting license check");
var R = yield chrome.identity.getProfileUserInfo(yield);
R ? console.log("user info", R) : console.log("unable to retrieve user info"), yield * O(), this.a() || (yield * L(), this.a() || (yield * I(), this.a() || (yield * b(), this.a() || (yield * k(), this.a() || (yield * S(), this.a() || s())))))
}, S.prototype.b = function (e, n) {
console.log("caching chrome license"), w(e, function (o) {
return o ? void $.ajax({
type: "post",
url: "https://billing.clockworkmod.com/api/v1/verify/google/koushd@gmail.com",
data: {token: o, item: chrome.runtime.id, version: chrome.runtime.getManifest().version},
dataType: "json",
success: function (e) {
console.log("chrome license cached"), t = !0, chrome.storage.local.set({cachedLicense: e}, n)
}.bind(this),
error: function (e, t) {
console.error("unable to cache license", t), chrome.identity.removeCachedAuthToken({token: o}, function () {
n && n(t)
})
}
}) : (chrome.runtime.lastError, e && m("Unable to get auth token: " + chrome.runtime.lastError), console.error("Unable to get auth token while caching license", chrome.runtime.lastError), void(n && n(chrome.runtime.lastError)))
}.bind(this))
}, S.prototype.a = function () {
return e
}, S.prototype.c = function () {
return t
}, S.prototype.startPurchase = function () {
chrome.app.window.create("purchase.html", {
id: "purchase",
innerBounds: {minWidth: 800, minHeight: 860}
}, function (e) {
this.refresh(), e.contentWindow._rlm = function (e) {
chrome.storage.local.remove(["cachedLicense", "cachedClockworkLicense", "cachedEnterpriseLicense"], function () {
this.refresh(e, !0)
}.bind(this))
}.bind(this)
}.bind(this))
}
}(), A.prototype.openSocket = function (e, t) {
if (!this.onOpenSocket || !this.onOpenSocket(e, t)) {
if ("properties" == e) {
var n = this.properties;
return void t.write(c(n), function () {
console.log("sent properties", n), t.destroy()
})
}
this.adbSocketFactory.newSocket(e, function (n) {
return n ? void Socket.stream(n, t, function () {
}) : (console.log("unable to execute adb proxy command?", e), void t.destroy())
})
}
};
console.log("Vysor version", chrome.runtime.getManifest().version), console.log(navigator.userAgent), console.log("Electron", isElectron());
var Se, Ae, De, Ie = new AdbServer({start: !1}), Le = {}, Oe = {}, Re = {}, Ee = analytics.getService("vysor_app"),
Ue = Ee.getTracker("UA-4956323-6");
if (isElectron()) {
var Te = Ue;
Ue = {sendEvent: Te.sendEvent.bind(Te), sendAppView: Te.sendAppView.bind(Te)}
}
var We = new S, Pe = "Chrome GCM Service is unavailable. Try restarting Chrome?", Me = new HttpServer;
We.globalRefresh = function () {
console.log("license global refresh");
var e = chrome.app.window.getAll();
for (var t in e)t = e[t], U(t)
}, chrome.identity.onSignInChanged.addListener(function () {
console.log("onSignInChanged, refreshing license"), We.refresh(null, !0)
}), chrome.storage.local.get("keyboard", function (e) {
Se = e.keyboard
}), chrome.storage.local.get("vysorHttp", function (e) {
function t() {
Me.listen({port: n.port || 0, address: "127.0.0.1"}, function (e, t) {
console.log("http request", e.path);
var n, i;
for (var r in o)if (n = e.path.match(r), i = o[r], n)break;
return n ? void i(e, t, n) : (t.code(404), void t.write("", function () {
}))
}, function (e) {
return e ? (console.error("http server failed to listen", e), void(n.port && (console.log("trying port 0"), n.port = 0, t()))) : (n.port = Me.socket.localPort, console.log("vysor http port: " + n.port), void chrome.storage.local.set({vysorHttp: n}))
})
}
if (!e)return void console.error("unable to start vysor httpServer, no dict");
var n = e.vysorHttp || {};
n.password = n.password || Math.round(Math.random() * (1 << 30)).toString(16);
var o = {
"/device/(.*?)/screenshot.jpg": function (e, t, n) {
var o = n[1], i = chrome.app.window.get(o);
if (!i)return console.error("device window", o, "not found"), t.code(404), void t.write("", function () {
t.end()
});
var r = i.contentWindow.password, s = Adb.createSocketFactory(o);
s.newSocket("tcp:53516", function (e) {
if (!e)return console.error("no socket", o, "for screenshot"), t.code(404), void t.write("", function () {
t.end()
});
t.headers.Connection = "close", t.headers["Cache-Control"] = "no-cache";
var n = new HttpRequestParser(null, e, function () {
var e = n.body.buffer.slice(n.body.byteOffset, n.body.byteOffset + n.body.byteLength);
t.write(e, function () {
t.end()
})
});
e.write(c("GET /screenshot.jpg?password=" + r + " HTTP/1.1\r\nConnection: close\r\n\r\n"), function (e) {
})
})
}, "/device/(.*?)/sdcard-vysor/(.*)": function (e, t, n) {
var o = n[1], i = n[2];
t.headers.Connection = "close", t.headers["Cache-Control"] = "no-cache", t.headers["Content-Type"] = "application/binary", Adb.pull({
file: "/sdcard/vysor/" + i,
serialno: o,
socket: t
}, function () {
t.end()
})
}, "/device/(.*?)/video.flv": function (e, t, n) {
var o = n[1], i = chrome.app.window.get(o);
if (!We.a())return console.error("ignoring request, not licensed"), t.code(402), void t.write("This feature is only available in Vysor Pro", function () {
t.end()
});
if (!i)return console.error("device window", o, "not found"), t.code(404), void t.write("", function () {
t.end()
});
if (!i.contentWindow.siphonFlv)return console.error("siphonFlv", o, "not found"), t.code(404), void t.write("", function () {
t.end()
});
var r = new b;
if (t.headers.Connection = "close", t.headers["Content-Type"] = "video/x-flv", Socket.pump(r, t, function () {
console.log("flv source closed")
}), isElectron()) {
var s = r;
r = {
dataReceived: function (e) {
s.dataReceived(e)
}, destroy: s.destroy.bind(r)
}
}
i.contentWindow.siphonFlv(r)
}
};
t()
}), We.refresh();
var Ne;
chrome.app.runtime.onLaunched.addListener(function (e) {
G(), e && "vysor_purchase" == e.id && We.refresh(null, !0), e && "vysor_presentation" == e.id && Z(e.url, function (e) {
K(e)
}), e && "vysor_device_farm" == e.id && (console.log("device farm", e.url), De && De.show(), G(), m("Vysor is connecting to shared Android devices"), w(!0, function (t) {
return t ? void Y(e.url, t, function (e, t) {
return t ? void T("Vysor Share", "Unable to connect to shared devices. " + t) : void T("Vysor Share", "Connected to " + e.name + "'s remote devices.")
}) : void m("Unable to get auth token")
})), ee()
});
var _e, xe;
Y = re(Y), X = re(X), oe = re(oe), Z = re(Z), chrome.storage.local.get("share-all-devices", function (e) {
e["share-all-devices"] && X(!1, function () {
P()
})
});
var Fe, Be, Ve, je, Ke, qe, He, Je = {}, Ye = {}, $e = {}, Xe = {}, ze = {};
me(), ve();
var Ge;
chrome.runtime.onUpdateAvailable.addListener(function () {
V()
}), chrome.notifications.onButtonClicked.addListener(function (e, t) {
"reload" == e ? chrome.runtime.reload() : "never-start-automatically" == e && (chrome.storage.local.set({"connect-automatically": !1}), chrome.notifications.clear(e))
}), chrome.notifications.onClicked.addListener(function (e, t) {
}), t[""] = e
}({}, function () {
return this
}());