Improvements to plugin support.
Ylian Saint-Hilaire committed
Oct 10, 2019 at 11:13 UTC
dece20ac93fdcff17ebad050fb29f63942cca561
11 files changed
+15743
-556
MeshCentralServer.njsproj
+1
@@ -117,6 +117,7 @@
117
<Compile Include="meshuser.js" />
118
<Compile Include="mpsserver.js" />
119
<Compile Include="mqttbroker.js" />
120
+ <Compile Include="pluginHandler.js" />
121
<Compile Include="public\scripts\agent-redir-rtc-0.1.0.js" />
122
<Compile Include="swarmserver.js" />
123
<Compile Include="multiserver.js" />
agents/meshcore.js
+166
-184
@@ -37,12 +37,10 @@ var MESHRIGHT_NOFILES = 1024;
37
var MESHRIGHT_NOAMT = 2048;
38
var MESHRIGHT_LIMITEDINPUT = 4096;
39
40
-function createMeshCore(agent)
41
-{
40
+function createMeshCore(agent) {
41
var obj = {};
42
44
- if (process.platform == 'darwin' && !process.versions)
45
- {
43
+ if (process.platform == 'darwin' && !process.versions) {
44
// This is an older MacOS Agent, so we'll need to check the service definition so that Auto-Update will function correctly
45
var child = require('child_process').execFile('/bin/sh', ['sh']);
46
child.stdout.str = '';
@@ -51,21 +49,18 @@ function createMeshCore(agent)
49
child.stdin.write(" if(c[1]==\"dict\"){ split(a[2], d, \"</dict>\"); if(split(d[1], truval, \"<true/>\")>1) { split(truval[1], kn1, \"<key>\"); split(kn1[2], kn2, \"</key>\"); print kn2[1]; } }");
50
child.stdin.write(" else { split(c[1], ka, \"/\"); if(ka[1]==\"true\") {print \"ALWAYS\";} } }'\nexit\n");
51
child.waitExit();
54
- if (child.stdout.str.trim() == 'Crashed')
55
- {
52
+ if (child.stdout.str.trim() == 'Crashed') {
53
child = require('child_process').execFile('/bin/sh', ['sh']);
54
child.stdout.str = '';
55
child.stdout.on('data', function (chunk) { this.str += chunk.toString(); });
56
child.stdin.write("launchctl list | grep 'meshagent' | awk '{ if($3==\"meshagent\"){print $1;}}'\nexit\n");
57
child.waitExit();
58
62
- if (parseInt(child.stdout.str.trim()) == process.pid)
63
- {
59
+ if (parseInt(child.stdout.str.trim()) == process.pid) {
60
// The currently running MeshAgent is us, so we can continue with the update
61
var plist = require('fs').readFileSync('/Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist').toString();
62
var tokens = plist.split('<key>KeepAlive</key>');
67
- if (tokens[1].split('>')[0].split('<')[1] == 'dict')
68
- {
63
+ if (tokens[1].split('>')[0].split('<')[1] == 'dict') {
64
var tmp = tokens[1].split('</dict>');
65
tmp.shift();
66
tokens[1] = '\n <true/>' + tmp.join('</dict>');
@@ -125,10 +120,8 @@ function createMeshCore(agent)
120
if (process.platform != 'win32') { try { require('fs').unlinkSync(process.cwd() + '/DAIPC'); } catch (ee) { } }
121
obj.DAIPC.IPCPATH = process.platform == 'win32' ? ('\\\\.\\pipe\\' + require('_agentNodeId')() + '-DAIPC') : (process.cwd() + '/DAIPC');
122
try { obj.DAIPC.listen({ path: obj.DAIPC.IPCPATH }); } catch (e) { }
128
- obj.DAIPC.on('connection', function (c)
129
- {
130
- c._send = function (j)
131
- {
123
+ obj.DAIPC.on('connection', function (c) {
124
+ c._send = function (j) {
125
var data = JSON.stringify(j);
126
var packet = Buffer.alloc(data.length + 4);
127
packet.writeUInt32LE(data.length + 4, 0);
@@ -138,32 +131,26 @@ function createMeshCore(agent)
131
this._daipc = c;
132
c.parent = this;
133
c.on('end', function () { console.log('Connection Closed'); this.parent._daipc = null; });
141
- c.on('data', function (chunk)
142
- {
134
+ c.on('data', function (chunk) {
135
if (chunk.length < 4) { this.unshift(chunk); return; }
136
var len = chunk.readUInt32LE(0);
137
if (len > 8192) { this.parent._daipc = null; this.end(); return; }
138
if (chunk.length < len) { this.unshift(chunk); return; }
147
-
139
+
140
var data = chunk.slice(4, len);
149
- try
150
- {
141
+ try {
142
data = JSON.parse(data.toString());
143
}
153
- catch(de)
154
- {
144
+ catch (de) {
145
this.parent._daipc = null; this.end(); return;
146
}
157
-
147
+
148
if (!data.cmd) { this.parent._daipc = null; this.end(); return; }
149
160
- try
161
- {
162
- switch(data.cmd)
163
- {
150
+ try {
151
+ switch (data.cmd) {
152
case 'query':
165
- switch(data.value)
166
- {
153
+ switch (data.value) {
154
case 'connection':
155
data.result = require('MeshAgent').ConnectedServer;
156
this._send(data);
@@ -176,32 +163,26 @@ function createMeshCore(agent)
163
return;
164
}
165
}
179
- catch(xe)
180
- {
166
+ catch (xe) {
167
this.parent._daipc = null; this.end(); return;
168
}
169
});
170
});
185
- function diagnosticAgent_uninstall()
186
- {
171
+ function diagnosticAgent_uninstall() {
172
require('service-manager').manager.uninstallService('meshagentDiagnostic');
173
require('task-scheduler').delete('meshagentDiagnostic/periodicStart');
174
};
190
- function diagnosticAgent_installCheck(install)
191
- {
192
- try
193
- {
175
+ function diagnosticAgent_installCheck(install) {
176
+ try {
177
var diag = require('service-manager').manager.getService('meshagentDiagnostic');
178
return (diag);
179
}
197
- catch (e)
198
- {
180
+ catch (e) {
181
}
182
if (!install) { return (null); }
183
184
var svc = null;
203
- try
204
- {
185
+ try {
186
require('service-manager').manager.installService(
187
{
188
name: 'meshagentDiagnostic',
@@ -213,8 +194,7 @@ function createMeshCore(agent)
194
});
195
svc = require('service-manager').manager.getService('meshagentDiagnostic');
196
}
216
- catch (e)
217
- {
197
+ catch (e) {
198
return (null);
199
}
200
var proxyConfig = require('global-tunnel').proxyConfig;
@@ -227,12 +207,10 @@ function createMeshCore(agent)
207
ddb.Put('MeshServer', require('MeshAgent').ServerInfo.ServerUri);
208
if (cert.root.pfx) { ddb.Put('SelfNodeCert', cert.root.pfx); }
209
if (cert.tls) { ddb.Put('SelfNodeTlsCert', cert.tls.pfx); }
230
- if (proxyConfig)
231
- {
210
+ if (proxyConfig) {
211
ddb.Put('WebProxy', proxyConfig.host + ':' + proxyConfig.port);
212
}
234
- else
235
- {
213
+ else {
214
ddb.Put('ignoreProxyFile', '1');
215
}
216
@@ -242,7 +220,7 @@ function createMeshCore(agent)
220
delete ddb;
221
222
// Set a recurrent task, to run the Diagnostic Agent every 2 days
245
- require('task-scheduler').create({name: 'meshagentDiagnostic/periodicStart', daily: 2, time: require('tls').generateRandomInteger('0', '23') + ':' + require('tls').generateRandomInteger('0', '59').padStart(2, '0'), service: 'meshagentDiagnostic'});
223
+ require('task-scheduler').create({ name: 'meshagentDiagnostic/periodicStart', daily: 2, time: require('tls').generateRandomInteger('0', '23') + ':' + require('tls').generateRandomInteger('0', '59').padStart(2, '0'), service: 'meshagentDiagnostic' });
224
//require('task-scheduler').create({ name: 'meshagentDiagnostic/periodicStart', daily: '1', time: '17:16', service: 'meshagentDiagnostic' });
225
226
return (svc);
@@ -281,7 +259,7 @@ function createMeshCore(agent)
259
}
260
obj.borderManager = new borderController();
261
*/
284
-
262
+
263
// MeshAgent JavaScript Core Module. This code is sent to and running on the mesh agent.
264
var meshCoreObj = { "action": "coreinfo", "value": "MeshCore v6", "caps": 14 }; // Capability bitmask: 1 = Desktop, 2 = Terminal, 4 = Files, 8 = Console, 16 = JavaScript, 32 = Temporary Agent, 64 = Recovery Agent
265
@@ -397,7 +375,7 @@ function createMeshCore(agent)
375
});
376
}
377
} catch (ex) { sendConsoleText("ex1: " + ex); }
400
-
378
+
379
// Try to load up the WIFI scanner
380
try {
381
var wifiScannerLib = require('wifi-scanner');
@@ -436,7 +414,7 @@ function createMeshCore(agent)
414
}
415
catch (e) { return false; }
416
}
439
-
417
+
418
// Remove all Gateway MAC addresses for interface list. This is useful because the gateway MAC is not always populated reliably.
419
function clearGatewayMac(str) {
420
if (str == null) return null;
@@ -444,7 +422,7 @@ function createMeshCore(agent)
422
for (var i in x.netif) { if (x.netif[i].gatewaymac) { delete x.netif[i].gatewaymac } }
423
return JSON.stringify(x);
424
}
447
-
425
+
426
function getIpLocationData(func) {
427
// Get the location information for the cache if possible
428
var publicLocationInfo = db.Get('publicLocationInfo');
@@ -483,7 +461,7 @@ function createMeshCore(agent)
461
}
462
}
463
}
486
-
464
+
465
// Polyfill String.endsWith
466
if (!String.prototype.endsWith) {
467
String.prototype.endsWith = function (searchString, position) {
@@ -494,7 +472,7 @@ function createMeshCore(agent)
472
return lastIndex !== -1 && lastIndex === position;
473
};
474
}
497
-
475
+
476
// Polyfill path.join
477
obj.path = {
478
join: function () {
@@ -513,19 +491,19 @@ function createMeshCore(agent)
491
return x.join('/');
492
}
493
};
516
-
494
+
495
// Replace a string with a number if the string is an exact number
496
function toNumberIfNumber(x) { if ((typeof x == 'string') && (+parseInt(x) === x)) { x = parseInt(x); } return x; }
519
-
497
+
498
// Convert decimal to hex
499
function char2hex(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }
522
-
500
+
501
// Convert a raw string to a hex string
502
function rstr2hex(input) { var r = '', i; for (i = 0; i < input.length; i++) { r += char2hex(input.charCodeAt(i)); } return r; }
525
-
503
+
504
// Convert a buffer into a string
505
function buf2rstr(buf) { var r = ''; for (var i = 0; i < buf.length; i++) { r += String.fromCharCode(buf[i]); } return r; }
528
-
506
+
507
// Convert a hex string to a raw string // TODO: Do this using Buffer(), will be MUCH faster
508
function hex2rstr(d) {
509
if (typeof d != "string" || d.length == 0) return '';
@@ -533,7 +511,7 @@ function createMeshCore(agent)
511
while (t = m.shift()) r += String.fromCharCode('0x' + t);
512
return r
513
}
536
-
514
+
515
// Convert an object to string with all functions
516
function objToString(x, p, pad, ret) {
517
if (ret == undefined) ret = '';
@@ -548,17 +526,17 @@ function createMeshCore(agent)
526
for (var i in x) { if (i != '_ObjectID') { r += (addPad(p + 2, pad) + i + ': ' + objToString(x[i], p + 2, pad, ret) + (ret ? '\r\n' : ' ')); } }
527
return r + addPad(p, pad) + '}';
528
}
551
-
529
+
530
// Return p number of spaces
531
function addPad(p, ret) { var r = ''; for (var i = 0; i < p; i++) { r += ret; } return r; }
554
-
532
+
533
// Split a string taking into account the quoats. Used for command line parsing
534
function splitArgs(str) {
535
var myArray = [], myRegexp = /[^\s"]+|"([^"]*)"/gi;
536
do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);
537
return myArray;
538
}
561
-
539
+
540
// Parse arguments string array into an object
541
function parseArgs(argv) {
542
var results = { '_': [] }, current = null;
@@ -574,7 +552,7 @@ function createMeshCore(agent)
552
if (current != null) { results[current] = true; }
553
return results;
554
}
577
-
555
+
556
// Get server target url with a custom path
557
function getServerTargetUrl(path) {
558
var x = mesh.ServerUrl;
@@ -585,13 +563,13 @@ function createMeshCore(agent)
563
if (x == null) return null;
564
return x.protocol + '//' + x.host + ':' + x.port + '/' + path;
565
}
588
-
566
+
567
// Get server url. If the url starts with "*/..." change it, it not use the url as is.
568
function getServerTargetUrlEx(url) {
569
if (url.substring(0, 2) == '*/') { return getServerTargetUrl(url.substring(2)); }
570
return url;
571
}
594
-
572
+
573
// Send a wake-on-lan packet
574
function sendWakeOnLan(hexMac) {
575
var count = 0;
@@ -600,7 +578,7 @@ function createMeshCore(agent)
578
var magic = 'FFFFFFFFFFFF';
579
for (var x = 1; x <= 16; ++x) { magic += hexMac; }
580
var magicbin = Buffer.from(magic, 'hex');
603
-
581
+
582
for (var adapter in interfaces) {
583
if (interfaces.hasOwnProperty(adapter)) {
584
for (var i = 0; i < interfaces[adapter].length; ++i) {
@@ -618,7 +596,7 @@ function createMeshCore(agent)
596
} catch (e) { }
597
return count;
598
}
621
-
599
+
600
// Handle a mesh agent command
601
function handleServerCommand(data) {
602
if (typeof data == 'object') {
@@ -722,7 +700,7 @@ function createMeshCore(agent)
700
// Open a local web browser and return success/fail
701
MeshServerLog('Opening: ' + data.url, data);
702
sendConsoleText('OpenURL: ' + data.url);
725
- if (data.url) { mesh.SendCommand({ "action": "msg", "type":"openUrl", "url": data.url, "sessionid": data.sessionid, "success": (openUserDesktopUrl(data.url) != null) }); }
703
+ if (data.url) { mesh.SendCommand({ "action": "msg", "type": "openUrl", "url": data.url, "sessionid": data.sessionid, "success": (openUserDesktopUrl(data.url) != null) }); }
704
break;
705
}
706
case 'getclip': {
@@ -831,13 +809,25 @@ function createMeshCore(agent)
809
}
810
case 'ping': { mesh.SendCommand('{"action":"pong"}'); break; }
811
case 'pong': { break; }
812
+ case 'plugin': {
813
+ if (typeof data.pluginaction == 'string') {
814
+ try {
815
+ MeshServerLog('Plugin called', data);
816
+ // Not yet implemented
817
+ // require(data.plugin.name).serveraction(data);
818
+ } catch (e) {
819
+ MeshServerLog('Error calling plugin', data);
820
+ }
821
+ }
822
+ break;
823
+ }
824
default:
825
// Unknown action, ignore it.
826
break;
827
}
828
}
829
}
840
-
830
+
831
// Called when a file changed in the file system
832
/*
833
function onFileWatcher(a, b) {
@@ -889,8 +879,8 @@ function createMeshCore(agent)
879
pr.then(defragResult, defragResult);
880
} else {
881
*/
892
- results.hash = require('SHA384Stream').create().syncHash(JSON.stringify(results)).toString('hex');
893
- func(results);
882
+ results.hash = require('SHA384Stream').create().syncHash(JSON.stringify(results)).toString('hex');
883
+ func(results);
884
//}
885
} catch (ex) { func(null, ex); }
886
}
@@ -934,7 +924,7 @@ function createMeshCore(agent)
924
}
925
return response;
926
}
937
-
927
+
928
// Tunnel callback operations
929
function onTunnelUpgrade(response, s, head) {
930
this.s = s;
@@ -990,7 +980,7 @@ function createMeshCore(agent)
980
peerTunnel.s.first = true;
981
peerTunnel.s.resume();
982
}
993
-
983
+
984
// Called when we get data from the server for a TCP relay (We have to skip the first received 'c' and pipe the rest)
985
function onTcpRelayServerTunnelData(data) {
986
if (this.first == true) { this.first = false; this.pipe(this.tcprelay); } // Pipe Server --> Target
@@ -1000,7 +990,7 @@ function createMeshCore(agent)
990
if (tunnels[this.httprequest.index] == null) return; // Stop duplicate calls.
991
//sendConsoleText("Tunnel #" + this.httprequest.index + " closed.", this.httprequest.sessionid);
992
delete tunnels[this.httprequest.index];
1003
-
993
+
994
/*
995
// Close the watcher if required
996
if (this.httprequest.watcher != undefined) {
@@ -1032,7 +1022,7 @@ function createMeshCore(agent)
1022
function onTunnelData(data) {
1023
//console.log("OnTunnelData");
1024
//sendConsoleText('OnTunnelData, ' + data.length + ', ' + typeof data + ', ' + data);
1035
-
1025
+
1026
// If this is upload data, save it to file
1027
if (this.httprequest.uploadFile) {
1028
try { fs.writeSync(this.httprequest.uploadFile, data); } catch (e) { this.write(new Buffer(JSON.stringify({ action: 'uploaderror' }))); return; } // Write to the file, if there is a problem, error out.
@@ -1069,17 +1059,14 @@ function createMeshCore(agent)
1059
return;
1060
}
1061
1072
- this.end = function ()
1073
- {
1074
- if (process.platform == "win32")
1075
- {
1062
+ this.end = function () {
1063
+ if (process.platform == "win32") {
1064
// Unpipe the web socket
1065
this.unpipe(this.httprequest._term);
1066
if (this.httprequest._term) { this.httprequest._term.unpipe(this); }
1067
1068
// Unpipe the WebRTC channel if needed (This will also be done when the WebRTC channel ends).
1081
- if (this.rtcchannel)
1082
- {
1069
+ if (this.rtcchannel) {
1070
this.rtcchannel.unpipe(this.httprequest._term);
1071
if (this.httprequest._term) { this.httprequest._term.unpipe(this.rtcchannel); }
1072
}
@@ -1087,27 +1074,21 @@ function createMeshCore(agent)
1074
// Clean up
1075
if (this.httprequest._term) { this.httprequest._term.end(); }
1076
this.httprequest._term = null;
1090
- } else
1091
- {
1077
+ } else {
1078
// TODO!!
1079
}
1080
};
1081
1082
// Remote terminal using native pipes
1097
- if (process.platform == "win32")
1098
- {
1099
- try
1100
- {
1101
- if ((this.httprequest.protocol == 6) && (require('win-terminal').PowerShellCapable() == true))
1102
- {
1083
+ if (process.platform == "win32") {
1084
+ try {
1085
+ if ((this.httprequest.protocol == 6) && (require('win-terminal').PowerShellCapable() == true)) {
1086
this.httprequest._term = require('win-terminal').StartPowerShell(80, 25);
1104
- } else
1105
- {
1087
+ } else {
1088
this.httprequest._term = require('win-terminal').Start(80, 25);
1089
}
1090
}
1109
- catch(e)
1110
- {
1091
+ catch (e) {
1092
MeshServerLog('Failed to start remote terminal session, ' + e.toString() + ' (' + this.httprequest.remoteaddr + ')', this.httprequest);
1093
this.write(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: e.toString() }));
1094
this.end();
@@ -1116,14 +1097,11 @@ function createMeshCore(agent)
1097
this.httprequest._term.pipe(this, { dataTypeSkip: 1 });
1098
this.pipe(this.httprequest._term, { dataTypeSkip: 1, end: false });
1099
this.prependListener('end', function () { this.httprequest._term.end(function () { console.log('Terminal was closed'); }); });
1119
- } else
1120
- {
1121
- if (fs.existsSync("/bin/bash"))
1122
- {
1100
+ } else {
1101
+ if (fs.existsSync("/bin/bash")) {
1102
this.httprequest.process = childProcess.execFile("/bin/bash", ["bash", "-i"], { type: childProcess.SpawnTypes.TERM });
1103
if (process.platform == 'linux') { this.httprequest.process.stdin.write("alias ls='ls --color=auto'\nclear\n"); }
1125
- } else
1126
- {
1104
+ } else {
1105
this.httprequest.process = childProcess.execFile("/bin/sh", ["sh"], { type: childProcess.SpawnTypes.TERM });
1106
if (process.platform == 'linux') { this.httprequest.process.stdin.write("stty erase ^H\nalias ls='ls --color=auto'\nPS1='\\u@\\h:\\w\\$ '\nclear\n"); }
1107
}
@@ -1176,8 +1154,7 @@ function createMeshCore(agent)
1154
this.removeAllListeners('data');
1155
this.on('data', onTunnelControlData);
1156
//this.write('MeshCore Terminal Hello');
1179
- } else if (this.httprequest.protocol == 2)
1180
- {
1157
+ } else if (this.httprequest.protocol == 2) {
1158
// Check user access rights for desktop
1159
if (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) && ((this.httprequest.rights & MESHRIGHT_REMOTEVIEW) == 0)) {
1160
// Disengage this tunnel, user does not have the rights to do this!!
@@ -1209,7 +1186,7 @@ function createMeshCore(agent)
1186
if (this.desktop.kvm.connectionCount == 0) {
1187
// Display a toast message. This may not be supported on all platforms.
1188
// try { require('toaster').Toast('MeshCentral', 'Remote Desktop Control Ended.'); } catch (ex) { }
1212
-
1189
+
1190
this.httprequest.desktop.kvm.end();
1191
}
1192
};
@@ -1225,8 +1202,7 @@ function createMeshCore(agent)
1202
}
1203
1204
// Perform notification if needed. Toast messages may not be supported on all platforms.
1228
- if (this.httprequest.consent && (this.httprequest.consent & 8))
1229
- {
1205
+ if (this.httprequest.consent && (this.httprequest.consent & 8)) {
1206
// User Consent Prompt is required
1207
// Send a console message back using the console channel, "\n" is supported.
1208
this.write(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: 'Waiting for user to grant access...' }));
@@ -1235,8 +1211,7 @@ function createMeshCore(agent)
1211
this.pause();
1212
1213
pr.then(
1238
- function ()
1239
- {
1214
+ function () {
1215
// Success
1216
MeshServerLog('Starting remote desktop after local user accepted (' + this.ws.httprequest.remoteaddr + ')', this.ws.httprequest);
1217
this.ws.write(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: null }));
@@ -1247,15 +1222,13 @@ function createMeshCore(agent)
1222
this.ws.httprequest.desktop.kvm.pipe(this.ws, { dataTypeSkip: 1 });
1223
this.ws.resume();
1224
},
1250
- function (e)
1251
- {
1225
+ function (e) {
1226
// User Consent Denied/Failed
1227
MeshServerLog('Failed to start remote desktop after local user rejected (' + this.ws.httprequest.remoteaddr + ')', this.ws.httprequest);
1228
this.ws.end(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: e.toString() }));
1229
});
1230
}
1257
- else
1258
- {
1231
+ else {
1232
// User Consent Prompt is not required
1233
if (this.httprequest.consent && (this.httprequest.consent & 1)) {
1234
// User Notifications is required
@@ -1283,8 +1256,7 @@ function createMeshCore(agent)
1256
}
1257
1258
// Perform notification if needed. Toast messages may not be supported on all platforms.
1286
- if (this.httprequest.consent && (this.httprequest.consent & 32))
1287
- {
1259
+ if (this.httprequest.consent && (this.httprequest.consent & 32)) {
1260
// User Consent Prompt is required
1261
// Send a console message back using the console channel, "\n" is supported.
1262
this.write(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: 'Waiting for user to grant access...' }));
@@ -1361,7 +1333,7 @@ function createMeshCore(agent)
1333
var response = getDirectoryInfo(cmd.path);
1334
if (cmd.reqid != undefined) { response.reqid = cmd.reqid; }
1335
this.write(new Buffer(JSON.stringify(response)));
1364
-
1336
+
1337
/*
1338
// Start the directory watcher
1339
if ((cmd.path != '') && (samepath == false)) {
@@ -1479,6 +1451,23 @@ function createMeshCore(agent)
1451
// Unknown action, ignore it.
1452
break;
1453
}
1454
+ } else if (this.httprequest.protocol == 7) { // plugin data exchange
1455
+ var cmd = null;
1456
+ try { cmd = JSON.parse(data); } catch (e) { };
1457
+ if (cmd == null) { return; }
1458
+ if ((cmd.ctrlChannel == '102938') || ((cmd.type == 'offer') && (cmd.sdp != null))) { onTunnelControlData(cmd, this); return; } // If this is control data, handle it now.
1459
+ if (cmd.action == undefined) return;
1460
+
1461
+ switch (cmd.action) {
1462
+ case 'plugin': {
1463
+ try { require(cmd.plugin).consoleaction(cmd, null, null, this); } catch (e) { throw e; }
1464
+ break;
1465
+ }
1466
+ default: {
1467
+ // probably shouldn't happen, but just in case this feature is expanded
1468
+ }
1469
+ }
1470
+
1471
}
1472
//sendConsoleText("Got tunnel #" + this.httprequest.index + " data: " + data, this.httprequest.sessionid);
1473
}
@@ -1553,12 +1542,10 @@ function createMeshCore(agent)
1542
} else if (obj.type == 'webrtc0') { // Browser indicates we can start WebRTC switch-over.
1543
if (ws.httprequest.protocol == 1) { // Terminal
1544
// This is a terminal data stream, unpipe the terminal now and indicate to the other side that terminal data will no longer be received over WebSocket
1556
- if (process.platform == 'win32')
1557
- {
1545
+ if (process.platform == 'win32') {
1546
ws.httprequest._term.unpipe(ws);
1547
}
1560
- else
1561
- {
1548
+ else {
1549
ws.httprequest.process.stdout.unpipe(ws);
1550
ws.httprequest.process.stderr.unpipe(ws);
1551
}
@@ -1575,13 +1562,11 @@ function createMeshCore(agent)
1562
} else if (obj.type == 'webrtc1') {
1563
if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) { // Terminal
1564
// Switch the user input from websocket to webrtc at this point.
1578
- if (process.platform == 'win32')
1579
- {
1565
+ if (process.platform == 'win32') {
1566
ws.unpipe(ws.httprequest._term);
1567
ws.rtcchannel.pipe(ws.httprequest._term, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.
1568
}
1583
- else
1584
- {
1569
+ else {
1570
ws.unpipe(ws.httprequest.process.stdin);
1571
ws.rtcchannel.pipe(ws.httprequest.process.stdin, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.
1572
}
@@ -1596,12 +1581,10 @@ function createMeshCore(agent)
1581
} else if (obj.type == 'webrtc2') {
1582
// Other side received websocket end of data marker, start sending data on WebRTC channel
1583
if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) { // Terminal
1599
- if (process.platform == 'win32')
1600
- {
1584
+ if (process.platform == 'win32') {
1585
ws.httprequest._term.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.
1586
}
1603
- else
1604
- {
1587
+ else {
1588
ws.httprequest.process.stdout.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.
1589
ws.httprequest.process.stderr.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.
1590
}
@@ -1641,7 +1624,7 @@ function createMeshCore(agent)
1624
// Console state
1625
var consoleWebSockets = {};
1626
var consoleHttpRequest = null;
1644
-
1627
+
1628
// Console HTTP response
1629
function consoleHttpResponse(response) {
1630
response.data = function (data) { sendConsoleText(rstr2hex(buf2rstr(data)), this.sessionid); consoleHttpRequest = null; }
@@ -1684,7 +1667,7 @@ function createMeshCore(agent)
1667
var response = null;
1668
switch (cmd) {
1669
case 'help': { // Displays available commands
1687
- var fin = '', f = '', availcommands = 'help,info,osinfo,args,print,type,dbget,dbset,dbcompact,eval,parseuri,httpget,nwslist,wsconnect,wssend,wsclose,notify,ls,ps,kill,amt,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,sendcaps,openurl,amtreset,amtccm,amtacm,amtdeactivate,amtpolicy,getscript,getclip,setclip,log,av,cpuinfo,sysinfo,apf,scanwifi,scanamt';
1670
+ var fin = '', f = '', availcommands = 'help,info,osinfo,args,print,type,dbkeys,dbget,dbset,dbcompact,eval,parseuri,httpget,nwslist,plugin,wsconnect,wssend,wsclose,notify,ls,ps,kill,amt,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,sendcaps,openurl,amtreset,amtccm,amtacm,amtdeactivate,amtpolicy,getscript,getclip,setclip,log,av,cpuinfo,sysinfo,apf,scanwifi,scanamt';
1671
availcommands = availcommands.split(',').sort();
1672
while (availcommands.length > 0) {
1673
if (f.length > 100) { fin += (f + ',\r\n'); f = ''; }
@@ -1802,7 +1785,7 @@ function createMeshCore(agent)
1785
case 'ps': {
1786
processManager.getProcesses(function (plist) {
1787
var x = '';
1805
- for (var i in plist) { x += i + ', ' + plist[i].cmd + ((plist[i].user) ? (', ' + plist[i].user):'') + '\r\n'; }
1788
+ for (var i in plist) { x += i + ', ' + plist[i].cmd + ((plist[i].user) ? (', ' + plist[i].user) : '') + '\r\n'; }
1789
sendConsoleText(x, sessionid);
1790
});
1791
break;
@@ -1836,14 +1819,11 @@ function createMeshCore(agent)
1819
break;
1820
}
1821
case 'dump':
1839
- if (args['_'].length < 1)
1840
- {
1822
+ if (args['_'].length < 1) {
1823
response = 'Proper usage: dump [on/off/status]'; // Display correct command usage
1824
}
1843
- else
1844
- {
1845
- switch(args['_'][0].toLowerCase())
1846
- {
1825
+ else {
1826
+ switch (args['_'][0].toLowerCase()) {
1827
case 'on':
1828
process.coreDumpLocation = process.platform == 'win32' ? process.execPath.replace('.exe', '.dmp') : (process.execPath + '.dmp');
1829
response = 'enabled';
@@ -1853,12 +1833,10 @@ function createMeshCore(agent)
1833
response = 'disabled';
1834
break;
1835
case 'status':
1856
- if (process.coreDumpLocation)
1857
- {
1836
+ if (process.coreDumpLocation) {
1837
response = 'Core Dump: [ENABLED' + (require('fs').existsSync(process.coreDumpLocation) ? (', (DMP file exists)]') : (']'));
1838
}
1860
- else
1861
- {
1839
+ else {
1840
response = 'Core Dump: [DISABLED]';
1841
}
1842
break;
@@ -1878,18 +1856,14 @@ function createMeshCore(agent)
1856
}
1857
case 'uninstallagent':
1858
var agentName = process.platform == 'win32' ? 'Mesh Agent' : 'meshagent';
1881
- if (!require('service-manager').manager.getService(agentName).isMe())
1882
- {
1859
+ if (!require('service-manager').manager.getService(agentName).isMe()) {
1860
response = 'Uininstall failed, this instance is not the service instance';
1861
}
1885
- else
1886
- {
1887
- try
1888
- {
1862
+ else {
1863
+ try {
1864
diagnosticAgent_uninstall();
1865
}
1891
- catch(x)
1892
- {
1866
+ catch (x) {
1867
}
1868
var js = "require('service-manager').manager.getService('" + agentName + "').stop(); require('service-manager').manager.uninstallService('" + agentName + "'); process.exit();";
1869
this.child = require('child_process').execFile(process.execPath, [process.platform == 'win32' ? (process.execPath.split('\\').pop()) : (process.execPath.split('/').pop()), '-b64exec', Buffer.from(js).toString('base64')], { type: 4, detached: true });
@@ -2068,7 +2042,7 @@ function createMeshCore(agent)
2042
if (httprequest != null) {
2043
httprequest.upgrade = onWebSocketUpgrade;
2044
httprequest.on('error', function (e) { sendConsoleText('ERROR: ' + JSON.stringify(e)); });
2071
-
2045
+
2046
var index = 1;
2047
while (consoleWebSockets[index]) { index++; }
2048
httprequest.sessionid = sessionid;
@@ -2256,40 +2230,31 @@ function createMeshCore(agent)
2230
}
2231
case 'diagnostic':
2232
{
2259
- if (!mesh.DAIPC.listening)
2260
- {
2233
+ if (!mesh.DAIPC.listening) {
2234
response = 'Unable to bind to Diagnostic IPC, most likely because the path (' + process.cwd() + ') is not on a local file system';
2235
break;
2236
}
2237
var diag = diagnosticAgent_installCheck();
2265
- if (diag)
2266
- {
2267
- if (args['_'].length == 1 && args['_'][0] == 'uninstall')
2268
- {
2238
+ if (diag) {
2239
+ if (args['_'].length == 1 && args['_'][0] == 'uninstall') {
2240
diagnosticAgent_uninstall();
2241
response = 'Diagnostic Agent uninstalled';
2242
}
2272
- else
2273
- {
2243
+ else {
2244
response = 'Diagnostic Agent installed at: ' + diag.appLocation();
2245
}
2246
}
2277
- else
2278
- {
2279
- if (args['_'].length == 1 && args['_'][0] == 'install')
2280
- {
2247
+ else {
2248
+ if (args['_'].length == 1 && args['_'][0] == 'install') {
2249
diag = diagnosticAgent_installCheck(true);
2282
- if (diag)
2283
- {
2250
+ if (diag) {
2251
response = 'Diagnostic agent was installed at: ' + diag.appLocation();
2252
}
2286
- else
2287
- {
2253
+ else {
2254
response = 'Diagnostic agent installation failed';
2255
}
2256
}
2291
- else
2292
- {
2257
+ else {
2258
response = 'Diagnostic Agent Not installed. To install: diagnostic install';
2259
}
2260
}
@@ -2297,27 +2262,27 @@ function createMeshCore(agent)
2262
break;
2263
}
2264
case 'apf': {
2300
- if (meshCoreObj.intelamt!==null) {
2265
+ if (meshCoreObj.intelamt !== null) {
2266
if (args['_'].length == 1) {
2267
if (args['_'][0] == 'on') {
2268
response = 'Starting APF tunnel'
2269
var apfarg = {
2305
- mpsurl: mesh.ServerUrl.replace('agent.ashx','apf.ashx'),
2306
- mpsuser: Buffer.from(mesh.ServerInfo.MeshID,'hex').toString('base64').substring(0,16),
2307
- mpspass: Buffer.from(mesh.ServerInfo.MeshID,'hex').toString('base64').substring(0,16),
2270
+ mpsurl: mesh.ServerUrl.replace('agent.ashx', 'apf.ashx'),
2271
+ mpsuser: Buffer.from(mesh.ServerInfo.MeshID, 'hex').toString('base64').substring(0, 16),
2272
+ mpspass: Buffer.from(mesh.ServerInfo.MeshID, 'hex').toString('base64').substring(0, 16),
2273
mpskeepalive: 60000,
2274
clientname: require('os').hostname(),
2275
clientaddress: '127.0.0.1',
2276
clientuuid: meshCoreObj.intelamt.uuid
2277
};
2278
var tobj = { debug: false }; //
2314
- apftunnel= require('apfclient')(tobj,apfarg);
2279
+ apftunnel = require('apfclient')(tobj, apfarg);
2280
try {
2281
apftunnel.connect();
2282
response += "..success";
2283
} catch (e) {
2284
response += JSON.stringify(e);
2320
- }
2285
+ }
2286
} else if (args['_'][0] == 'off') {
2287
response = 'Stopping APF tunnel';
2288
try {
@@ -2326,19 +2291,34 @@ function createMeshCore(agent)
2291
} catch (e) {
2292
response += JSON.stringify(e);
2293
}
2329
- apftunnel=null;
2294
+ apftunnel = null;
2295
} else {
2296
response = 'Invalid command.\r\nCmd syntax: apf on|off';
2297
}
2333
- } else {
2334
- response = 'APF tunnel is '+ (apftunnel == null ? 'off': 'on' );
2298
+ } else {
2299
+ response = 'APF tunnel is ' + (apftunnel == null ? 'off' : 'on');
2300
}
2336
-
2301
+
2302
} else {
2303
response = 'APF tunnel requires Intel AMT';
2304
}
2305
break;
2306
}
2307
+ case 'plugin': {
2308
+ if (typeof args['_'][0] == 'string') {
2309
+ try {
2310
+ // Pass off the action to the plugin
2311
+ // for plugin creators, you'll want to have a plugindir/modules_meshcore/plugin.js
2312
+ // to control the output / actions here.
2313
+ response = require(args['_'][0]).consoleaction(args, rights, sessionid, mesh);
2314
+ } catch (e) {
2315
+ response = 'There was an error in the plugin (' + e + ')';
2316
+ }
2317
+ } else {
2318
+ response = 'Proper usage: plugin [pluginName] [args].';
2319
+ }
2320
+ break;
2321
+ }
2322
default: { // This is an unknown command, return an error message
2323
response = 'Unknown command \"' + cmd + '\", type \"help\" for list of avaialble commands.';
2324
break;
@@ -2347,7 +2327,7 @@ function createMeshCore(agent)
2327
} catch (e) { response = 'Command returned an exception error: ' + e; console.log(e); }
2328
if (response != null) { sendConsoleText(response, sessionid); }
2329
}
2350
-
2330
+
2331
// Send a mesh agent console command
2332
function sendConsoleText(text, sessionid) {
2333
if (typeof text == 'object') { text = JSON.stringify(text); }
@@ -2356,7 +2336,7 @@ function createMeshCore(agent)
2336
2337
// Called before the process exits
2338
//process.exit = function (code) { console.log("Exit with code: " + code.toString()); }
2359
-
2339
+
2340
// Called when the server connection state changes
2341
function handleServerConnection(state) {
2342
meshServerConnectionState = state;
@@ -2381,13 +2361,13 @@ function createMeshCore(agent)
2361
if (selfInfoUpdateTimer == null) { selfInfoUpdateTimer = setInterval(sendPeriodicServerUpdate, 1200000); } // 20 minutes
2362
}
2363
}
2384
-
2364
+
2365
// Update the server with the latest network interface information
2366
var sendNetworkUpdateNagleTimer = null;
2367
function sendNetworkUpdateNagle() { if (sendNetworkUpdateNagleTimer != null) { clearTimeout(sendNetworkUpdateNagleTimer); sendNetworkUpdateNagleTimer = null; } sendNetworkUpdateNagleTimer = setTimeout(sendNetworkUpdate, 5000); }
2368
function sendNetworkUpdate(force) {
2369
sendNetworkUpdateNagleTimer = null;
2390
-
2370
+
2371
// Update the network interfaces information data
2372
var netInfo = mesh.NetInfo;
2373
if (netInfo) {
@@ -2396,7 +2376,7 @@ function createMeshCore(agent)
2376
if ((force == true) || (clearGatewayMac(netInfoStr) != clearGatewayMac(lastNetworkInfo))) { mesh.SendCommand(netInfo); lastNetworkInfo = netInfoStr; }
2377
}
2378
}
2399
-
2379
+
2380
// Called periodically to check if we need to send updates to the server
2381
function sendPeriodicServerUpdate(flags) {
2382
if (meshServerConnectionState == 0) return; // Not connected to server, do nothing.
@@ -2451,8 +2431,10 @@ function createMeshCore(agent)
2431
//if (process.platform == 'win32') { try { pr = require('win-info').pendingReboot(); } catch (ex) { pr = null; } } // Pending reboot
2432
if ((meshCoreObj.av == null) || (JSON.stringify(meshCoreObj.av) != JSON.stringify(av))) { meshCoreObj.av = av; mesh.SendCommand(meshCoreObj); }
2433
}
2434
+
2435
+ // TODO: add plugin hook here
2436
}
2455
-
2437
+
2438
2439
// Starting function
2440
obj.start = function () {
@@ -2485,16 +2467,16 @@ function createMeshCore(agent)
2467
//userSession.on('unlocked', function (user) { sendConsoleText('[' + (user.Domain ? user.Domain + '\\' : '') + user.Username + '] has UNLOCKED the desktop'); });
2468
} catch (ex) { }
2469
}
2488
-
2470
+
2471
obj.stop = function () {
2472
mesh.AddCommandHandler(null);
2473
mesh.AddConnectHandler(null);
2474
}
2493
-
2475
+
2476
function onWebSocketClosed() { sendConsoleText("WebSocket #" + this.httprequest.index + " closed.", this.httprequest.sessionid); delete consoleWebSockets[this.httprequest.index]; }
2477
function onWebSocketData(data) { sendConsoleText("Got WebSocket #" + this.httprequest.index + " data: " + data, this.httprequest.sessionid); }
2478
function onWebSocketSendOk() { sendConsoleText("WebSocket #" + this.index + " SendOK.", this.sessionid); }
2497
-
2479
+
2480
function onWebSocketUpgrade(response, s, head) {
2481
sendConsoleText("WebSocket #" + this.index + " connected.", this.sessionid);
2482
this.s = s;
agents/meshcore.min.js
+142
-211
@@ -37,12 +37,10 @@ var MESHRIGHT_NOFILES = 1024;
37
var MESHRIGHT_NOAMT = 2048;
38
var MESHRIGHT_LIMITEDINPUT = 4096;
39
40
-function createMeshCore(agent)
41
-{
40
+function createMeshCore(agent) {
41
var obj = {};
42
44
- if (process.platform == 'darwin' && !process.versions)
45
- {
43
+ if (process.platform == 'darwin' && !process.versions) {
44
// This is an older MacOS Agent, so we'll need to check the service definition so that Auto-Update will function correctly
45
var child = require('child_process').execFile('/bin/sh', ['sh']);
46
child.stdout.str = '';
@@ -51,21 +49,18 @@ function createMeshCore(agent)
49
child.stdin.write(" if(c[1]==\"dict\"){ split(a[2], d, \"</dict>\"); if(split(d[1], truval, \"<true/>\")>1) { split(truval[1], kn1, \"<key>\"); split(kn1[2], kn2, \"</key>\"); print kn2[1]; } }");
50
child.stdin.write(" else { split(c[1], ka, \"/\"); if(ka[1]==\"true\") {print \"ALWAYS\";} } }'\nexit\n");
51
child.waitExit();
54
- if (child.stdout.str.trim() == 'Crashed')
55
- {
52
+ if (child.stdout.str.trim() == 'Crashed') {
53
child = require('child_process').execFile('/bin/sh', ['sh']);
54
child.stdout.str = '';
55
child.stdout.on('data', function (chunk) { this.str += chunk.toString(); });
56
child.stdin.write("launchctl list | grep 'meshagent' | awk '{ if($3==\"meshagent\"){print $1;}}'\nexit\n");
57
child.waitExit();
58
62
- if (parseInt(child.stdout.str.trim()) == process.pid)
63
- {
59
+ if (parseInt(child.stdout.str.trim()) == process.pid) {
60
// The currently running MeshAgent is us, so we can continue with the update
61
var plist = require('fs').readFileSync('/Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist').toString();
62
var tokens = plist.split('<key>KeepAlive</key>');
67
- if (tokens[1].split('>')[0].split('<')[1] == 'dict')
68
- {
63
+ if (tokens[1].split('>')[0].split('<')[1] == 'dict') {
64
var tmp = tokens[1].split('</dict>');
65
tmp.shift();
66
tokens[1] = '\n <true/>' + tmp.join('</dict>');
@@ -125,10 +120,8 @@ function createMeshCore(agent)
120
if (process.platform != 'win32') { try { require('fs').unlinkSync(process.cwd() + '/DAIPC'); } catch (ee) { } }
121
obj.DAIPC.IPCPATH = process.platform == 'win32' ? ('\\\\.\\pipe\\' + require('_agentNodeId')() + '-DAIPC') : (process.cwd() + '/DAIPC');
122
try { obj.DAIPC.listen({ path: obj.DAIPC.IPCPATH }); } catch (e) { }
128
- obj.DAIPC.on('connection', function (c)
129
- {
130
- c._send = function (j)
131
- {
123
+ obj.DAIPC.on('connection', function (c) {
124
+ c._send = function (j) {
125
var data = JSON.stringify(j);
126
var packet = Buffer.alloc(data.length + 4);
127
packet.writeUInt32LE(data.length + 4, 0);
@@ -138,32 +131,26 @@ function createMeshCore(agent)
131
this._daipc = c;
132
c.parent = this;
133
c.on('end', function () { console.log('Connection Closed'); this.parent._daipc = null; });
141
- c.on('data', function (chunk)
142
- {
134
+ c.on('data', function (chunk) {
135
if (chunk.length < 4) { this.unshift(chunk); return; }
136
var len = chunk.readUInt32LE(0);
137
if (len > 8192) { this.parent._daipc = null; this.end(); return; }
138
if (chunk.length < len) { this.unshift(chunk); return; }
147
-
139
+
140
var data = chunk.slice(4, len);
149
- try
150
- {
141
+ try {
142
data = JSON.parse(data.toString());
143
}
153
- catch(de)
154
- {
144
+ catch (de) {
145
this.parent._daipc = null; this.end(); return;
146
}
157
-
147
+
148
if (!data.cmd) { this.parent._daipc = null; this.end(); return; }
149
160
- try
161
- {
162
- switch(data.cmd)
163
- {
150
+ try {
151
+ switch (data.cmd) {
152
case 'query':
165
- switch(data.value)
166
- {
153
+ switch (data.value) {
154
case 'connection':
155
data.result = require('MeshAgent').ConnectedServer;
156
this._send(data);
@@ -176,32 +163,26 @@ function createMeshCore(agent)
163
return;
164
}
165
}
179
- catch(xe)
180
- {
166
+ catch (xe) {
167
this.parent._daipc = null; this.end(); return;
168
}
169
});
170
});
185
- function diagnosticAgent_uninstall()
186
- {
171
+ function diagnosticAgent_uninstall() {
172
require('service-manager').manager.uninstallService('meshagentDiagnostic');
173
require('task-scheduler').delete('meshagentDiagnostic/periodicStart');
174
};
190
- function diagnosticAgent_installCheck(install)
191
- {
192
- try
193
- {
175
+ function diagnosticAgent_installCheck(install) {
176
+ try {
177
var diag = require('service-manager').manager.getService('meshagentDiagnostic');
178
return (diag);
179
}
197
- catch (e)
198
- {
180
+ catch (e) {
181
}
182
if (!install) { return (null); }
183
184
var svc = null;
203
- try
204
- {
185
+ try {
186
require('service-manager').manager.installService(
187
{
188
name: 'meshagentDiagnostic',
@@ -213,8 +194,7 @@ function createMeshCore(agent)
194
});
195
svc = require('service-manager').manager.getService('meshagentDiagnostic');
196
}
216
- catch (e)
217
- {
197
+ catch (e) {
198
return (null);
199
}
200
var proxyConfig = require('global-tunnel').proxyConfig;
@@ -227,12 +207,10 @@ function createMeshCore(agent)
207
ddb.Put('MeshServer', require('MeshAgent').ServerInfo.ServerUri);
208
if (cert.root.pfx) { ddb.Put('SelfNodeCert', cert.root.pfx); }
209
if (cert.tls) { ddb.Put('SelfNodeTlsCert', cert.tls.pfx); }
230
- if (proxyConfig)
231
- {
210
+ if (proxyConfig) {
211
ddb.Put('WebProxy', proxyConfig.host + ':' + proxyConfig.port);
212
}
234
- else
235
- {
213
+ else {
214
ddb.Put('ignoreProxyFile', '1');
215
}
216
@@ -242,7 +220,7 @@ function createMeshCore(agent)
220
delete ddb;
221
222
// Set a recurrent task, to run the Diagnostic Agent every 2 days
245
- require('task-scheduler').create({name: 'meshagentDiagnostic/periodicStart', daily: 2, time: require('tls').generateRandomInteger('0', '23') + ':' + require('tls').generateRandomInteger('0', '59').padStart(2, '0'), service: 'meshagentDiagnostic'});
223
+ require('task-scheduler').create({ name: 'meshagentDiagnostic/periodicStart', daily: 2, time: require('tls').generateRandomInteger('0', '23') + ':' + require('tls').generateRandomInteger('0', '59').padStart(2, '0'), service: 'meshagentDiagnostic' });
224
//require('task-scheduler').create({ name: 'meshagentDiagnostic/periodicStart', daily: '1', time: '17:16', service: 'meshagentDiagnostic' });
225
226
return (svc);
@@ -281,7 +259,7 @@ function createMeshCore(agent)
259
}
260
obj.borderManager = new borderController();
261
*/
284
-
262
+
263
// MeshAgent JavaScript Core Module. This code is sent to and running on the mesh agent.
264
var meshCoreObj = { "action": "coreinfo", "value": "MeshCore v6", "caps": 14 }; // Capability bitmask: 1 = Desktop, 2 = Terminal, 4 = Files, 8 = Console, 16 = JavaScript, 32 = Temporary Agent, 64 = Recovery Agent
265
@@ -397,7 +375,7 @@ function createMeshCore(agent)
375
});
376
}
377
} catch (ex) { sendConsoleText("ex1: " + ex); }
400
-
378
+
379
// Try to load up the WIFI scanner
380
try {
381
var wifiScannerLib = require('wifi-scanner');
@@ -436,7 +414,7 @@ function createMeshCore(agent)
414
}
415
catch (e) { return false; }
416
}
439
-
417
+
418
// Remove all Gateway MAC addresses for interface list. This is useful because the gateway MAC is not always populated reliably.
419
function clearGatewayMac(str) {
420
if (str == null) return null;
@@ -444,7 +422,7 @@ function createMeshCore(agent)
422
for (var i in x.netif) { if (x.netif[i].gatewaymac) { delete x.netif[i].gatewaymac } }
423
return JSON.stringify(x);
424
}
447
-
425
+
426
function getIpLocationData(func) {
427
// Get the location information for the cache if possible
428
var publicLocationInfo = db.Get('publicLocationInfo');
@@ -483,7 +461,7 @@ function createMeshCore(agent)
461
}
462
}
463
}
486
-
464
+
465
// Polyfill String.endsWith
466
if (!String.prototype.endsWith) {
467
String.prototype.endsWith = function (searchString, position) {
@@ -494,7 +472,7 @@ function createMeshCore(agent)
472
return lastIndex !== -1 && lastIndex === position;
473
};
474
}
497
-
475
+
476
// Polyfill path.join
477
obj.path = {
478
join: function () {
@@ -513,19 +491,19 @@ function createMeshCore(agent)
491
return x.join('/');
492
}
493
};
516
-
494
+
495
// Replace a string with a number if the string is an exact number
496
function toNumberIfNumber(x) { if ((typeof x == 'string') && (+parseInt(x) === x)) { x = parseInt(x); } return x; }
519
-
497
+
498
// Convert decimal to hex
499
function char2hex(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }
522
-
500
+
501
// Convert a raw string to a hex string
502
function rstr2hex(input) { var r = '', i; for (i = 0; i < input.length; i++) { r += char2hex(input.charCodeAt(i)); } return r; }
525
-
503
+
504
// Convert a buffer into a string
505
function buf2rstr(buf) { var r = ''; for (var i = 0; i < buf.length; i++) { r += String.fromCharCode(buf[i]); } return r; }
528
-
506
+
507
// Convert a hex string to a raw string // TODO: Do this using Buffer(), will be MUCH faster
508
function hex2rstr(d) {
509
if (typeof d != "string" || d.length == 0) return '';
@@ -533,7 +511,7 @@ function createMeshCore(agent)
511
while (t = m.shift()) r += String.fromCharCode('0x' + t);
512
return r
513
}
536
-
514
+
515
// Convert an object to string with all functions
516
function objToString(x, p, pad, ret) {
517
if (ret == undefined) ret = '';
@@ -548,17 +526,17 @@ function createMeshCore(agent)
526
for (var i in x) { if (i != '_ObjectID') { r += (addPad(p + 2, pad) + i + ': ' + objToString(x[i], p + 2, pad, ret) + (ret ? '\r\n' : ' ')); } }
527
return r + addPad(p, pad) + '}';
528
}
551
-
529
+
530
// Return p number of spaces
531
function addPad(p, ret) { var r = ''; for (var i = 0; i < p; i++) { r += ret; } return r; }
554
-
532
+
533
// Split a string taking into account the quoats. Used for command line parsing
534
function splitArgs(str) {
535
var myArray = [], myRegexp = /[^\s"]+|"([^"]*)"/gi;
536
do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);
537
return myArray;
538
}
561
-
539
+
540
// Parse arguments string array into an object
541
function parseArgs(argv) {
542
var results = { '_': [] }, current = null;
@@ -574,7 +552,7 @@ function createMeshCore(agent)
552
if (current != null) { results[current] = true; }
553
return results;
554
}
577
-
555
+
556
// Get server target url with a custom path
557
function getServerTargetUrl(path) {
558
var x = mesh.ServerUrl;
@@ -585,13 +563,13 @@ function createMeshCore(agent)
563
if (x == null) return null;
564
return x.protocol + '//' + x.host + ':' + x.port + '/' + path;
565
}
588
-
566
+
567
// Get server url. If the url starts with "*/..." change it, it not use the url as is.
568
function getServerTargetUrlEx(url) {
569
if (url.substring(0, 2) == '*/') { return getServerTargetUrl(url.substring(2)); }
570
return url;
571
}
594
-
572
+
573
// Send a wake-on-lan packet
574
function sendWakeOnLan(hexMac) {
575
var count = 0;
@@ -600,7 +578,7 @@ function createMeshCore(agent)
578
var magic = 'FFFFFFFFFFFF';
579
for (var x = 1; x <= 16; ++x) { magic += hexMac; }
580
var magicbin = Buffer.from(magic, 'hex');
603
-
581
+
582
for (var adapter in interfaces) {
583
if (interfaces.hasOwnProperty(adapter)) {
584
for (var i = 0; i < interfaces[adapter].length; ++i) {
@@ -618,7 +596,7 @@ function createMeshCore(agent)
596
} catch (e) { }
597
return count;
598
}
621
-
599
+
600
// Handle a mesh agent command
601
function handleServerCommand(data) {
602
if (typeof data == 'object') {
@@ -722,7 +700,7 @@ function createMeshCore(agent)
700
// Open a local web browser and return success/fail
701
MeshServerLog('Opening: ' + data.url, data);
702
sendConsoleText('OpenURL: ' + data.url);
725
- if (data.url) { mesh.SendCommand({ "action": "msg", "type":"openUrl", "url": data.url, "sessionid": data.sessionid, "success": (openUserDesktopUrl(data.url) != null) }); }
703
+ if (data.url) { mesh.SendCommand({ "action": "msg", "type": "openUrl", "url": data.url, "sessionid": data.sessionid, "success": (openUserDesktopUrl(data.url) != null) }); }
704
break;
705
}
706
case 'getclip': {
@@ -834,11 +812,10 @@ function createMeshCore(agent)
812
case 'plugin': {
813
if (typeof data.pluginaction == 'string') {
814
try {
837
-
815
MeshServerLog('Plugin called', data);
839
- /* Not yet implmented
840
- require(data.plugin.name).serveraction(data);*/
841
- } catch(e) {
816
+ // Not yet implemented
817
+ // require(data.plugin.name).serveraction(data);
818
+ } catch (e) {
819
MeshServerLog('Error calling plugin', data);
820
}
821
}
@@ -850,7 +827,7 @@ function createMeshCore(agent)
827
}
828
}
829
}
853
-
830
+
831
// Called when a file changed in the file system
832
/*
833
function onFileWatcher(a, b) {
@@ -902,8 +879,8 @@ function createMeshCore(agent)
879
pr.then(defragResult, defragResult);
880
} else {
881
*/
905
- results.hash = require('SHA384Stream').create().syncHash(JSON.stringify(results)).toString('hex');
906
- func(results);
882
+ results.hash = require('SHA384Stream').create().syncHash(JSON.stringify(results)).toString('hex');
883
+ func(results);
884
//}
885
} catch (ex) { func(null, ex); }
886
}
@@ -947,7 +924,7 @@ function createMeshCore(agent)
924
}
925
return response;
926
}
950
-
927
+
928
// Tunnel callback operations
929
function onTunnelUpgrade(response, s, head) {
930
this.s = s;
@@ -1003,7 +980,7 @@ function createMeshCore(agent)
980
peerTunnel.s.first = true;
981
peerTunnel.s.resume();
982
}
1006
-
983
+
984
// Called when we get data from the server for a TCP relay (We have to skip the first received 'c' and pipe the rest)
985
function onTcpRelayServerTunnelData(data) {
986
if (this.first == true) { this.first = false; this.pipe(this.tcprelay); } // Pipe Server --> Target
@@ -1013,7 +990,7 @@ function createMeshCore(agent)
990
if (tunnels[this.httprequest.index] == null) return; // Stop duplicate calls.
991
//sendConsoleText("Tunnel #" + this.httprequest.index + " closed.", this.httprequest.sessionid);
992
delete tunnels[this.httprequest.index];
1016
-
993
+
994
/*
995
// Close the watcher if required
996
if (this.httprequest.watcher != undefined) {
@@ -1045,7 +1022,7 @@ function createMeshCore(agent)
1022
function onTunnelData(data) {
1023
//console.log("OnTunnelData");
1024
//sendConsoleText('OnTunnelData, ' + data.length + ', ' + typeof data + ', ' + data);
1048
-
1025
+
1026
// If this is upload data, save it to file
1027
if (this.httprequest.uploadFile) {
1028
try { fs.writeSync(this.httprequest.uploadFile, data); } catch (e) { this.write(new Buffer(JSON.stringify({ action: 'uploaderror' }))); return; } // Write to the file, if there is a problem, error out.
@@ -1082,17 +1059,14 @@ function createMeshCore(agent)
1059
return;
1060
}
1061
1085
- this.end = function ()
1086
- {
1087
- if (process.platform == "win32")
1088
- {
1062
+ this.end = function () {
1063
+ if (process.platform == "win32") {
1064
// Unpipe the web socket
1065
this.unpipe(this.httprequest._term);
1066
if (this.httprequest._term) { this.httprequest._term.unpipe(this); }
1067
1068
// Unpipe the WebRTC channel if needed (This will also be done when the WebRTC channel ends).
1094
- if (this.rtcchannel)
1095
- {
1069
+ if (this.rtcchannel) {
1070
this.rtcchannel.unpipe(this.httprequest._term);
1071
if (this.httprequest._term) { this.httprequest._term.unpipe(this.rtcchannel); }
1072
}
@@ -1100,27 +1074,21 @@ function createMeshCore(agent)
1074
// Clean up
1075
if (this.httprequest._term) { this.httprequest._term.end(); }
1076
this.httprequest._term = null;
1103
- } else
1104
- {
1077
+ } else {
1078
// TODO!!
1079
}
1080
};
1081
1082
// Remote terminal using native pipes
1110
- if (process.platform == "win32")
1111
- {
1112
- try
1113
- {
1114
- if ((this.httprequest.protocol == 6) && (require('win-terminal').PowerShellCapable() == true))
1115
- {
1083
+ if (process.platform == "win32") {
1084
+ try {
1085
+ if ((this.httprequest.protocol == 6) && (require('win-terminal').PowerShellCapable() == true)) {
1086
this.httprequest._term = require('win-terminal').StartPowerShell(80, 25);
1117
- } else
1118
- {
1087
+ } else {
1088
this.httprequest._term = require('win-terminal').Start(80, 25);
1089
}
1090
}
1122
- catch(e)
1123
- {
1091
+ catch (e) {
1092
MeshServerLog('Failed to start remote terminal session, ' + e.toString() + ' (' + this.httprequest.remoteaddr + ')', this.httprequest);
1093
this.write(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: e.toString() }));
1094
this.end();
@@ -1129,14 +1097,11 @@ function createMeshCore(agent)
1097
this.httprequest._term.pipe(this, { dataTypeSkip: 1 });
1098
this.pipe(this.httprequest._term, { dataTypeSkip: 1, end: false });
1099
this.prependListener('end', function () { this.httprequest._term.end(function () { console.log('Terminal was closed'); }); });
1132
- } else
1133
- {
1134
- if (fs.existsSync("/bin/bash"))
1135
- {
1100
+ } else {
1101
+ if (fs.existsSync("/bin/bash")) {
1102
this.httprequest.process = childProcess.execFile("/bin/bash", ["bash", "-i"], { type: childProcess.SpawnTypes.TERM });
1103
if (process.platform == 'linux') { this.httprequest.process.stdin.write("alias ls='ls --color=auto'\nclear\n"); }
1138
- } else
1139
- {
1104
+ } else {
1105
this.httprequest.process = childProcess.execFile("/bin/sh", ["sh"], { type: childProcess.SpawnTypes.TERM });
1106
if (process.platform == 'linux') { this.httprequest.process.stdin.write("stty erase ^H\nalias ls='ls --color=auto'\nPS1='\\u@\\h:\\w\\$ '\nclear\n"); }
1107
}
@@ -1189,8 +1154,7 @@ function createMeshCore(agent)
1154
this.removeAllListeners('data');
1155
this.on('data', onTunnelControlData);
1156
//this.write('MeshCore Terminal Hello');
1192
- } else if (this.httprequest.protocol == 2)
1193
- {
1157
+ } else if (this.httprequest.protocol == 2) {
1158
// Check user access rights for desktop
1159
if (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) && ((this.httprequest.rights & MESHRIGHT_REMOTEVIEW) == 0)) {
1160
// Disengage this tunnel, user does not have the rights to do this!!
@@ -1222,7 +1186,7 @@ function createMeshCore(agent)
1186
if (this.desktop.kvm.connectionCount == 0) {
1187
// Display a toast message. This may not be supported on all platforms.
1188
// try { require('toaster').Toast('MeshCentral', 'Remote Desktop Control Ended.'); } catch (ex) { }
1225
-
1189
+
1190
this.httprequest.desktop.kvm.end();
1191
}
1192
};
@@ -1238,8 +1202,7 @@ function createMeshCore(agent)
1202
}
1203
1204
// Perform notification if needed. Toast messages may not be supported on all platforms.
1241
- if (this.httprequest.consent && (this.httprequest.consent & 8))
1242
- {
1205
+ if (this.httprequest.consent && (this.httprequest.consent & 8)) {
1206
// User Consent Prompt is required
1207
// Send a console message back using the console channel, "\n" is supported.
1208
this.write(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: 'Waiting for user to grant access...' }));
@@ -1248,8 +1211,7 @@ function createMeshCore(agent)
1211
this.pause();
1212
1213
pr.then(
1251
- function ()
1252
- {
1214
+ function () {
1215
// Success
1216
MeshServerLog('Starting remote desktop after local user accepted (' + this.ws.httprequest.remoteaddr + ')', this.ws.httprequest);
1217
this.ws.write(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: null }));
@@ -1260,15 +1222,13 @@ function createMeshCore(agent)
1222
this.ws.httprequest.desktop.kvm.pipe(this.ws, { dataTypeSkip: 1 });
1223
this.ws.resume();
1224
},
1263
- function (e)
1264
- {
1225
+ function (e) {
1226
// User Consent Denied/Failed
1227
MeshServerLog('Failed to start remote desktop after local user rejected (' + this.ws.httprequest.remoteaddr + ')', this.ws.httprequest);
1228
this.ws.end(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: e.toString() }));
1229
});
1230
}
1270
- else
1271
- {
1231
+ else {
1232
// User Consent Prompt is not required
1233
if (this.httprequest.consent && (this.httprequest.consent & 1)) {
1234
// User Notifications is required
@@ -1296,8 +1256,7 @@ function createMeshCore(agent)
1256
}
1257
1258
// Perform notification if needed. Toast messages may not be supported on all platforms.
1299
- if (this.httprequest.consent && (this.httprequest.consent & 32))
1300
- {
1259
+ if (this.httprequest.consent && (this.httprequest.consent & 32)) {
1260
// User Consent Prompt is required
1261
// Send a console message back using the console channel, "\n" is supported.
1262
this.write(JSON.stringify({ ctrlChannel: '102938', type: 'console', msg: 'Waiting for user to grant access...' }));
@@ -1374,7 +1333,7 @@ function createMeshCore(agent)
1333
var response = getDirectoryInfo(cmd.path);
1334
if (cmd.reqid != undefined) { response.reqid = cmd.reqid; }
1335
this.write(new Buffer(JSON.stringify(response)));
1377
-
1336
+
1337
/*
1338
// Start the directory watcher
1339
if ((cmd.path != '') && (samepath == false)) {
@@ -1493,25 +1452,22 @@ function createMeshCore(agent)
1452
break;
1453
}
1454
} else if (this.httprequest.protocol == 7) { // plugin data exchange
1496
- var cmd = null;
1497
- try { cmd = JSON.parse(data); } catch (e) { };
1498
- if (cmd == null) { return; }
1499
- if ((cmd.ctrlChannel == '102938') || ((cmd.type == 'offer') && (cmd.sdp != null))) { onTunnelControlData(cmd, this); return; } // If this is control data, handle it now.
1500
- if (cmd.action == undefined) { return; }
1501
-
1502
- switch (cmd.action) {
1503
- case 'plugin': {
1504
- try {
1505
- require(cmd.plugin).consoleaction(cmd, null, null, this);
1506
- } catch (e) { throw e; }
1507
-
1508
- break;
1509
- }
1510
- default: {
1511
- // probably shouldn't happen, but just in case this feature is expanded
1512
- }
1513
- }
1514
-
1455
+ var cmd = null;
1456
+ try { cmd = JSON.parse(data); } catch (e) { };
1457
+ if (cmd == null) { return; }
1458
+ if ((cmd.ctrlChannel == '102938') || ((cmd.type == 'offer') && (cmd.sdp != null))) { onTunnelControlData(cmd, this); return; } // If this is control data, handle it now.
1459
+ if (cmd.action == undefined) return;
1460
+
1461
+ switch (cmd.action) {
1462
+ case 'plugin': {
1463
+ try { require(cmd.plugin).consoleaction(cmd, null, null, this); } catch (e) { throw e; }
1464
+ break;
1465
+ }
1466
+ default: {
1467
+ // probably shouldn't happen, but just in case this feature is expanded
1468
+ }
1469
+ }
1470
+
1471
}
1472
//sendConsoleText("Got tunnel #" + this.httprequest.index + " data: " + data, this.httprequest.sessionid);
1473
}
@@ -1586,12 +1542,10 @@ function createMeshCore(agent)
1542
} else if (obj.type == 'webrtc0') { // Browser indicates we can start WebRTC switch-over.
1543
if (ws.httprequest.protocol == 1) { // Terminal
1544
// This is a terminal data stream, unpipe the terminal now and indicate to the other side that terminal data will no longer be received over WebSocket
1589
- if (process.platform == 'win32')
1590
- {
1545
+ if (process.platform == 'win32') {
1546
ws.httprequest._term.unpipe(ws);
1547
}
1593
- else
1594
- {
1548
+ else {
1549
ws.httprequest.process.stdout.unpipe(ws);
1550
ws.httprequest.process.stderr.unpipe(ws);
1551
}
@@ -1608,13 +1562,11 @@ function createMeshCore(agent)
1562
} else if (obj.type == 'webrtc1') {
1563
if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) { // Terminal
1564
// Switch the user input from websocket to webrtc at this point.
1611
- if (process.platform == 'win32')
1612
- {
1565
+ if (process.platform == 'win32') {
1566
ws.unpipe(ws.httprequest._term);
1567
ws.rtcchannel.pipe(ws.httprequest._term, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.
1568
}
1616
- else
1617
- {
1569
+ else {
1570
ws.unpipe(ws.httprequest.process.stdin);
1571
ws.rtcchannel.pipe(ws.httprequest.process.stdin, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.
1572
}
@@ -1629,12 +1581,10 @@ function createMeshCore(agent)
1581
} else if (obj.type == 'webrtc2') {
1582
// Other side received websocket end of data marker, start sending data on WebRTC channel
1583
if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) { // Terminal
1632
- if (process.platform == 'win32')
1633
- {
1584
+ if (process.platform == 'win32') {
1585
ws.httprequest._term.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.
1586
}
1636
- else
1637
- {
1587
+ else {
1588
ws.httprequest.process.stdout.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.
1589
ws.httprequest.process.stderr.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.
1590
}
@@ -1674,7 +1624,7 @@ function createMeshCore(agent)
1624
// Console state
1625
var consoleWebSockets = {};
1626
var consoleHttpRequest = null;
1677
-
1627
+
1628
// Console HTTP response
1629
function consoleHttpResponse(response) {
1630
response.data = function (data) { sendConsoleText(rstr2hex(buf2rstr(data)), this.sessionid); consoleHttpRequest = null; }
@@ -1835,7 +1785,7 @@ function createMeshCore(agent)
1785
case 'ps': {
1786
processManager.getProcesses(function (plist) {
1787
var x = '';
1838
- for (var i in plist) { x += i + ', ' + plist[i].cmd + ((plist[i].user) ? (', ' + plist[i].user):'') + '\r\n'; }
1788
+ for (var i in plist) { x += i + ', ' + plist[i].cmd + ((plist[i].user) ? (', ' + plist[i].user) : '') + '\r\n'; }
1789
sendConsoleText(x, sessionid);
1790
});
1791
break;
@@ -1869,14 +1819,11 @@ function createMeshCore(agent)
1819
break;
1820
}
1821
case 'dump':
1872
- if (args['_'].length < 1)
1873
- {
1822
+ if (args['_'].length < 1) {
1823
response = 'Proper usage: dump [on/off/status]'; // Display correct command usage
1824
}
1876
- else
1877
- {
1878
- switch(args['_'][0].toLowerCase())
1879
- {
1825
+ else {
1826
+ switch (args['_'][0].toLowerCase()) {
1827
case 'on':
1828
process.coreDumpLocation = process.platform == 'win32' ? process.execPath.replace('.exe', '.dmp') : (process.execPath + '.dmp');
1829
response = 'enabled';
@@ -1886,12 +1833,10 @@ function createMeshCore(agent)
1833
response = 'disabled';
1834
break;
1835
case 'status':
1889
- if (process.coreDumpLocation)
1890
- {
1836
+ if (process.coreDumpLocation) {
1837
response = 'Core Dump: [ENABLED' + (require('fs').existsSync(process.coreDumpLocation) ? (', (DMP file exists)]') : (']'));
1838
}
1893
- else
1894
- {
1839
+ else {
1840
response = 'Core Dump: [DISABLED]';
1841
}
1842
break;
@@ -1911,18 +1856,14 @@ function createMeshCore(agent)
1856
}
1857
case 'uninstallagent':
1858
var agentName = process.platform == 'win32' ? 'Mesh Agent' : 'meshagent';
1914
- if (!require('service-manager').manager.getService(agentName).isMe())
1915
- {
1859
+ if (!require('service-manager').manager.getService(agentName).isMe()) {
1860
response = 'Uininstall failed, this instance is not the service instance';
1861
}
1918
- else
1919
- {
1920
- try
1921
- {
1862
+ else {
1863
+ try {
1864
diagnosticAgent_uninstall();
1865
}
1924
- catch(x)
1925
- {
1866
+ catch (x) {
1867
}
1868
var js = "require('service-manager').manager.getService('" + agentName + "').stop(); require('service-manager').manager.uninstallService('" + agentName + "'); process.exit();";
1869
this.child = require('child_process').execFile(process.execPath, [process.platform == 'win32' ? (process.execPath.split('\\').pop()) : (process.execPath.split('/').pop()), '-b64exec', Buffer.from(js).toString('base64')], { type: 4, detached: true });
@@ -2101,7 +2042,7 @@ function createMeshCore(agent)
2042
if (httprequest != null) {
2043
httprequest.upgrade = onWebSocketUpgrade;
2044
httprequest.on('error', function (e) { sendConsoleText('ERROR: ' + JSON.stringify(e)); });
2104
-
2045
+
2046
var index = 1;
2047
while (consoleWebSockets[index]) { index++; }
2048
httprequest.sessionid = sessionid;
@@ -2289,40 +2230,31 @@ function createMeshCore(agent)
2230
}
2231
case 'diagnostic':
2232
{
2292
- if (!mesh.DAIPC.listening)
2293
- {
2233
+ if (!mesh.DAIPC.listening) {
2234
response = 'Unable to bind to Diagnostic IPC, most likely because the path (' + process.cwd() + ') is not on a local file system';
2235
break;
2236
}
2237
var diag = diagnosticAgent_installCheck();
2298
- if (diag)
2299
- {
2300
- if (args['_'].length == 1 && args['_'][0] == 'uninstall')
2301
- {
2238
+ if (diag) {
2239
+ if (args['_'].length == 1 && args['_'][0] == 'uninstall') {
2240
diagnosticAgent_uninstall();
2241
response = 'Diagnostic Agent uninstalled';
2242
}
2305
- else
2306
- {
2243
+ else {
2244
response = 'Diagnostic Agent installed at: ' + diag.appLocation();
2245
}
2246
}
2310
- else
2311
- {
2312
- if (args['_'].length == 1 && args['_'][0] == 'install')
2313
- {
2247
+ else {
2248
+ if (args['_'].length == 1 && args['_'][0] == 'install') {
2249
diag = diagnosticAgent_installCheck(true);
2315
- if (diag)
2316
- {
2250
+ if (diag) {
2251
response = 'Diagnostic agent was installed at: ' + diag.appLocation();
2252
}
2319
- else
2320
- {
2253
+ else {
2254
response = 'Diagnostic agent installation failed';
2255
}
2256
}
2324
- else
2325
- {
2257
+ else {
2258
response = 'Diagnostic Agent Not installed. To install: diagnostic install';
2259
}
2260
}
@@ -2330,27 +2262,27 @@ function createMeshCore(agent)
2262
break;
2263
}
2264
case 'apf': {
2333
- if (meshCoreObj.intelamt!==null) {
2265
+ if (meshCoreObj.intelamt !== null) {
2266
if (args['_'].length == 1) {
2267
if (args['_'][0] == 'on') {
2268
response = 'Starting APF tunnel'
2269
var apfarg = {
2338
- mpsurl: mesh.ServerUrl.replace('agent.ashx','apf.ashx'),
2339
- mpsuser: Buffer.from(mesh.ServerInfo.MeshID,'hex').toString('base64').substring(0,16),
2340
- mpspass: Buffer.from(mesh.ServerInfo.MeshID,'hex').toString('base64').substring(0,16),
2270
+ mpsurl: mesh.ServerUrl.replace('agent.ashx', 'apf.ashx'),
2271
+ mpsuser: Buffer.from(mesh.ServerInfo.MeshID, 'hex').toString('base64').substring(0, 16),
2272
+ mpspass: Buffer.from(mesh.ServerInfo.MeshID, 'hex').toString('base64').substring(0, 16),
2273
mpskeepalive: 60000,
2274
clientname: require('os').hostname(),
2275
clientaddress: '127.0.0.1',
2276
clientuuid: meshCoreObj.intelamt.uuid
2277
};
2278
var tobj = { debug: false }; //
2347
- apftunnel= require('apfclient')(tobj,apfarg);
2279
+ apftunnel = require('apfclient')(tobj, apfarg);
2280
try {
2281
apftunnel.connect();
2282
response += "..success";
2283
} catch (e) {
2284
response += JSON.stringify(e);
2353
- }
2285
+ }
2286
} else if (args['_'][0] == 'off') {
2287
response = 'Stopping APF tunnel';
2288
try {
@@ -2359,14 +2291,14 @@ function createMeshCore(agent)
2291
} catch (e) {
2292
response += JSON.stringify(e);
2293
}
2362
- apftunnel=null;
2294
+ apftunnel = null;
2295
} else {
2296
response = 'Invalid command.\r\nCmd syntax: apf on|off';
2297
}
2366
- } else {
2367
- response = 'APF tunnel is '+ (apftunnel == null ? 'off': 'on' );
2298
+ } else {
2299
+ response = 'APF tunnel is ' + (apftunnel == null ? 'off' : 'on');
2300
}
2369
-
2301
+
2302
} else {
2303
response = 'APF tunnel requires Intel AMT';
2304
}
@@ -2375,17 +2307,16 @@ function createMeshCore(agent)
2307
case 'plugin': {
2308
if (typeof args['_'][0] == 'string') {
2309
try {
2378
- // pass off the action to the plugin
2310
+ // Pass off the action to the plugin
2311
// for plugin creators, you'll want to have a plugindir/modules_meshcore/plugin.js
2312
// to control the output / actions here.
2313
response = require(args['_'][0]).consoleaction(args, rights, sessionid, mesh);
2382
- } catch(e) {
2314
+ } catch (e) {
2315
response = 'There was an error in the plugin (' + e + ')';
2316
}
2317
} else {
2386
- response = 'Proper usage: plugin [pluginName] [args].';
2318
+ response = 'Proper usage: plugin [pluginName] [args].';
2319
}
2388
-
2320
break;
2321
}
2322
default: { // This is an unknown command, return an error message
@@ -2396,7 +2327,7 @@ function createMeshCore(agent)
2327
} catch (e) { response = 'Command returned an exception error: ' + e; console.log(e); }
2328
if (response != null) { sendConsoleText(response, sessionid); }
2329
}
2399
-
2330
+
2331
// Send a mesh agent console command
2332
function sendConsoleText(text, sessionid) {
2333
if (typeof text == 'object') { text = JSON.stringify(text); }
@@ -2405,7 +2336,7 @@ function createMeshCore(agent)
2336
2337
// Called before the process exits
2338
//process.exit = function (code) { console.log("Exit with code: " + code.toString()); }
2408
-
2339
+
2340
// Called when the server connection state changes
2341
function handleServerConnection(state) {
2342
meshServerConnectionState = state;
@@ -2430,13 +2361,13 @@ function createMeshCore(agent)
2361
if (selfInfoUpdateTimer == null) { selfInfoUpdateTimer = setInterval(sendPeriodicServerUpdate, 1200000); } // 20 minutes
2362
}
2363
}
2433
-
2364
+
2365
// Update the server with the latest network interface information
2366
var sendNetworkUpdateNagleTimer = null;
2367
function sendNetworkUpdateNagle() { if (sendNetworkUpdateNagleTimer != null) { clearTimeout(sendNetworkUpdateNagleTimer); sendNetworkUpdateNagleTimer = null; } sendNetworkUpdateNagleTimer = setTimeout(sendNetworkUpdate, 5000); }
2368
function sendNetworkUpdate(force) {
2369
sendNetworkUpdateNagleTimer = null;
2439
-
2370
+
2371
// Update the network interfaces information data
2372
var netInfo = mesh.NetInfo;
2373
if (netInfo) {
@@ -2445,7 +2376,7 @@ function createMeshCore(agent)
2376
if ((force == true) || (clearGatewayMac(netInfoStr) != clearGatewayMac(lastNetworkInfo))) { mesh.SendCommand(netInfo); lastNetworkInfo = netInfoStr; }
2377
}
2378
}
2448
-
2379
+
2380
// Called periodically to check if we need to send updates to the server
2381
function sendPeriodicServerUpdate(flags) {
2382
if (meshServerConnectionState == 0) return; // Not connected to server, do nothing.
@@ -2500,10 +2431,10 @@ function createMeshCore(agent)
2431
//if (process.platform == 'win32') { try { pr = require('win-info').pendingReboot(); } catch (ex) { pr = null; } } // Pending reboot
2432
if ((meshCoreObj.av == null) || (JSON.stringify(meshCoreObj.av) != JSON.stringify(av))) { meshCoreObj.av = av; mesh.SendCommand(meshCoreObj); }
2433
}
2503
-
2434
+
2435
// TODO: add plugin hook here
2436
}
2506
-
2437
+
2438
2439
// Starting function
2440
obj.start = function () {
@@ -2536,16 +2467,16 @@ function createMeshCore(agent)
2467
//userSession.on('unlocked', function (user) { sendConsoleText('[' + (user.Domain ? user.Domain + '\\' : '') + user.Username + '] has UNLOCKED the desktop'); });
2468
} catch (ex) { }
2469
}
2539
-
2470
+
2471
obj.stop = function () {
2472
mesh.AddCommandHandler(null);
2473
mesh.AddConnectHandler(null);
2474
}
2544
-
2475
+
2476
function onWebSocketClosed() { sendConsoleText("WebSocket #" + this.httprequest.index + " closed.", this.httprequest.sessionid); delete consoleWebSockets[this.httprequest.index]; }
2477
function onWebSocketData(data) { sendConsoleText("Got WebSocket #" + this.httprequest.index + " data: " + data, this.httprequest.sessionid); }
2478
function onWebSocketSendOk() { sendConsoleText("WebSocket #" + this.index + " SendOK.", this.sessionid); }
2548
-
2479
+
2480
function onWebSocketUpgrade(response, s, head) {
2481
sendConsoleText("WebSocket #" + this.index + " connected.", this.sessionid);
2482
this.s = s;
meshagent.js
+4
-6
@@ -1278,14 +1278,12 @@ module.exports.CreateMeshAgent = function (parent, db, ws, req, args, domain) {
1278
break;
1279
}
1280
case 'plugin': {
1281
- if (typeof command.plugin == 'string') {
1282
- try {
1281
+ if (typeof command.plugin != 'string') break;
1282
+ try {
1283
var pluginHandler = require('./pluginHandler.js').pluginHandler(parent.parent);
1284
pluginHandler.plugins[command.plugin].serveraction(command, obj, parent);
1285
- } catch (e) {
1286
-
1287
- console.log('Error loading plugin handler ('+ e + ')');
1288
- }
1285
+ } catch (e) {
1286
+ console.log('Error loading plugin handler (' + e + ')');
1287
}
1288
break;
1289
}
meshcentral.js
+11
-5
@@ -31,6 +31,7 @@ function CreateMeshCentralServer(config, args) {
31
obj.swarmserver = null;
32
obj.mailserver = null;
33
obj.amtEventHandler = null;
34
+ obj.pluginHandler = null;
35
obj.amtScanner = null;
36
obj.meshScanner = null;
37
obj.letsencrypt = null;
@@ -702,6 +703,11 @@ function CreateMeshCentralServer(config, args) {
703
return;
704
}
705
706
+ // Start plugin manager if configuration allows this.
707
+ if ((obj.config) && (obj.config.settings) && (obj.config.settings.plugins != null)) {
708
+ obj.pluginHandler = require("./pluginHandler.js").pluginHandler(obj);
709
+ }
710
+
711
// Load the default meshcore and meshcmd
712
obj.updateMeshCore();
713
obj.updateMeshCmd();
@@ -865,10 +871,8 @@ function CreateMeshCentralServer(config, args) {
871
// Dispatch an event that the server is now running
872
obj.DispatchEvent(['*'], obj, { etype: 'server', action: 'started', msg: 'Server started' });
873
868
- obj.pluginHandler = require("./pluginHandler.js").pluginHandler(obj);
869
-
874
// Plugin hook. Need to run something at server startup? This is the place.
871
- obj.pluginHandler.callHook("server_startup");
875
+ if (obj.pluginHandler) { obj.pluginHandler.callHook("server_startup"); }
876
877
// Load the login cookie encryption key from the database if allowed
878
if ((obj.config) && (obj.config.settings) && (obj.config.settings.allowlogintoken == true)) {
@@ -1352,8 +1356,10 @@ function CreateMeshCentralServer(config, args) {
1356
}
1357
}
1358
}
1355
- obj.pluginHandler = require("./pluginHandler.js").pluginHandler(obj);
1356
- obj.pluginHandler.addMeshCoreModules(modulesAdd);
1359
+
1360
+ // Add plugins to cores
1361
+ if (obj.pluginHandler) { obj.pluginHandler.addMeshCoreModules(modulesAdd); }
1362
+
1363
// Merge the cores and compute the hashes
1364
for (var i in modulesAdd) {
1365
if ((i == 'windows-recovery') || (i == 'linux-recovery')) {
meshrelay.js
+5
-1
@@ -198,7 +198,11 @@ module.exports.CreateMeshRelay = function (parent, ws, req, domain, user, cookie
198
if (xdevicename2 != null) { metadata.devicename = xdevicename2; }
199
var firstBlock = JSON.stringify(metadata);
200
recordingEntry(fd, 1, ((req.query.browser) ? 2 : 0), firstBlock, function () {
201
- relayinfo.peer1.ws.logfile = ws.logfile = { fd: fd, lock: false };
201
+ try { relayinfo.peer1.ws.logfile = ws.logfile = { fd: fd, lock: false }; } catch (ex) {
202
+ try { ws.send('c'); } catch (ex) { } // Send connect to both peers, 'cr' indicates the session is being recorded.
203
+ try { relayinfo.peer1.ws.send('c'); } catch (ex) { }
204
+ return;
205
+ }
206
try { ws.send('cr'); } catch (ex) { } // Send connect to both peers, 'cr' indicates the session is being recorded.
207
try { relayinfo.peer1.ws.send('cr'); } catch (ex) { }
208
});
package.json
+1
-1
@@ -1,6 +1,6 @@
1
{
2
"name": "meshcentral",
3
- "version": "0.4.1-y",
3
+ "version": "0.4.1-z",
4
"keywords": [
5
"Remote Management",
6
"Intel AMT",
pluginHandler.js
+121
-129
@@ -23,144 +23,136 @@ module.exports.pluginHandler = function (parent) {
23
obj.pluginPath = obj.parent.path.join(obj.parent.datapath, 'plugins');
24
obj.plugins = {};
25
obj.exports = {};
26
-
27
- try {
28
- obj.enabled = obj.parent.config.settings.plugins.enabled;
29
- obj.loadList = obj.parent.config.settings.plugins.list;
30
- } catch (e) { // Config file options not present, disable self
31
- obj.enabled = false;
32
- obj.loadList = {};
33
- console.log('Plugin options not added to the config file. Plugins disabled. Please see the documentation.');
34
- }
35
-
36
- if (obj.enabled) {
37
- obj.loadList.forEach(function(plugin, index) {
38
- if (obj.fs.existsSync(obj.pluginPath + '/' + plugin)) {
39
- try {
40
- obj.plugins[plugin] = require(obj.pluginPath + '/' + plugin + '/' + plugin + '.js')[plugin](obj);
41
- obj.exports[plugin] = obj.plugins[plugin].exports;
42
- } catch (e) {
43
- console.log("Error loading plugin: " + plugin + " (" + e + "). It has been disabled.", e.stack);
44
- }
45
- }
46
- });
26
+ obj.loadList = obj.parent.config.settings.plugins.list;
27
+
28
+ if (typeof obj.loadList != 'object') {
29
+ obj.loadList = {};
30
+ console.log('Plugin list not specified, please fix configuration file.');
31
+ return null;
32
}
48
-
49
- obj.prepExports = function() {
50
- var str = 'function() {\r\n';
51
- str += ' var obj = {};\r\n';
52
-
53
- for (const p of Object.keys(obj.plugins)) {
54
- str += ' obj.'+ p +' = {};\r\n';
55
- for (const l of Object.values(obj.exports[p])) {
56
- str += ' obj.'+ p +'.'+ l + ' = '+ obj.plugins[p][l].toString()+'\r\n';
57
- }
58
- }
59
-
60
- str += 'obj.enabled = '+ obj.enabled +';\r\n';
61
- str += `obj.onDeviceRefeshEnd = function(nodeid, panel, refresh, event) {
62
- for (const p of Object.keys(obj)) {
63
- if (typeof obj[p].onDeviceRefreshEnd == 'function') {
64
- obj[p].onDeviceRefreshEnd(nodeid, panel, refresh, event);
65
- }
66
- }
67
- };
68
- obj.registerPluginTab = function(pluginRegInfo) {
69
- var d = pluginRegInfo();
70
- if (!Q(d.tabId)) {
71
- QA('p19headers', '<span onclick="return pluginHandler.callPluginPage(\\''+d.tabId+'\\');">'+d.tabTitle+'</span>');
33
+
34
+ obj.loadList.forEach(function (plugin, index) {
35
+ if (obj.fs.existsSync(obj.pluginPath + '/' + plugin)) {
36
+ try {
37
+ obj.plugins[plugin] = require(obj.pluginPath + '/' + plugin + '/' + plugin + '.js')[plugin](obj);
38
+ obj.exports[plugin] = obj.plugins[plugin].exports;
39
+ } catch (e) {
40
+ console.log("Error loading plugin: " + plugin + " (" + e + "). It has been disabled.", e.stack);
41
+ }
42
}
73
- };
74
- obj.callPluginPage = function(id) {
75
- var pages = Q('p19pages').querySelectorAll("#p19pages>div");
76
- for (const i of pages) {
77
- i.style.display = 'none';
43
+ });
44
+
45
+ obj.prepExports = function () {
46
+ var str = 'function() {\r\n';
47
+ str += ' var obj = {};\r\n';
48
+
49
+ for (const p of Object.keys(obj.plugins)) {
50
+ str += ' obj.' + p + ' = {};\r\n';
51
+ for (const l of Object.values(obj.exports[p])) {
52
+ str += ' obj.' + p + '.' + l + ' = ' + obj.plugins[p][l].toString() + '\r\n';
53
+ }
54
}
79
- QV(id, true);
80
- };
81
- return obj; };`;
82
- return str;
55
+
56
+ str += `obj.onDeviceRefeshEnd = function(nodeid, panel, refresh, event) {
57
+ for (const p of Object.keys(obj)) {
58
+ if (typeof obj[p].onDeviceRefreshEnd == 'function') {
59
+ obj[p].onDeviceRefreshEnd(nodeid, panel, refresh, event);
60
+ }
61
+ }
62
+ };
63
+ obj.registerPluginTab = function(pluginRegInfo) {
64
+ var d = pluginRegInfo();
65
+ if (!Q(d.tabId)) {
66
+ QA('p19headers', '<span onclick="return pluginHandler.callPluginPage(\\''+d.tabId+'\\');">'+d.tabTitle+'</span>');
67
+ }
68
+ };
69
+ obj.callPluginPage = function(id) {
70
+ var pages = Q('p19pages').querySelectorAll("#p19pages>div");
71
+ for (const i of pages) { i.style.display = 'none'; }
72
+ QV(id, true);
73
+ };
74
+ return obj; };`;
75
+ return str;
76
}
84
-
85
- obj.callHook = function(hookName, ...args) {
86
- for (var p in obj.plugins) {
87
- if (typeof obj.plugins[p][hookName] == 'function') {
88
- try {
89
- obj.plugins[p][hookName](args);
90
- } catch (e) {
91
- console.log('Error ocurred while running plugin hook' + p + ':' + hookName + ' (' + e + ')');
92
- }
93
- }
94
- }
77
+
78
+ obj.callHook = function (hookName, ...args) {
79
+ for (var p in obj.plugins) {
80
+ if (typeof obj.plugins[p][hookName] == 'function') {
81
+ try {
82
+ obj.plugins[p][hookName](args);
83
+ } catch (e) {
84
+ console.log('Error ocurred while running plugin hook' + p + ':' + hookName + ' (' + e + ')');
85
+ }
86
+ }
87
+ }
88
};
96
-
97
- obj.addMeshCoreModules = function(modulesAdd) {
98
- if (obj.enabled !== true) return;
99
- for (var plugin in obj.plugins) {
100
- var moduleDirPath = null;
101
- var modulesDir = null;
102
- //if (obj.args.minifycore !== false) { try { moduleDirPath = obj.path.join(obj.pluginPath, 'modules_meshcore_min'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (e) { } } // Favor minified modules if present.
103
- if (modulesDir == null) { try { moduleDirPath = obj.path.join(obj.pluginPath, plugin + '/modules_meshcore'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (e) { } } // Use non-minified mofules.
104
- if (modulesDir != null) {
105
- for (var i in modulesDir) {
106
- if (modulesDir[i].toLowerCase().endsWith('.js')) {
107
- var moduleName = modulesDir[i].substring(0, modulesDir[i].length - 3);
108
- if (moduleName.endsWith('.min')) { moduleName = moduleName.substring(0, moduleName.length - 4); } // Remove the ".min" for ".min.js" files.
109
- var moduleData = [ 'try { addModule("', moduleName, '", "', obj.parent.escapeCodeString(obj.fs.readFileSync(obj.path.join(moduleDirPath, modulesDir[i])).toString('binary')), '"); addedModules.push("', moduleName, '"); } catch (e) { }\r\n' ];
89
111
- // Merge this module
112
- // NOTE: "smbios" module makes some non-AI Linux segfault, only include for IA platforms.
113
- if (moduleName.startsWith('amt-') || (moduleName == 'smbios')) {
114
- // Add to IA / Intel AMT cores only
115
- modulesAdd['windows-amt'].push(...moduleData);
116
- modulesAdd['linux-amt'].push(...moduleData);
117
- } else if (moduleName.startsWith('win-')) {
118
- // Add to Windows cores only
119
- modulesAdd['windows-amt'].push(...moduleData);
120
- } else if (moduleName.startsWith('linux-')) {
121
- // Add to Linux cores only
122
- modulesAdd['linux-amt'].push(...moduleData);
123
- modulesAdd['linux-noamt'].push(...moduleData);
124
- } else {
125
- // Add to all cores
126
- modulesAdd['windows-amt'].push(...moduleData);
127
- modulesAdd['linux-amt'].push(...moduleData);
128
- modulesAdd['linux-noamt'].push(...moduleData);
129
- }
130
-
131
- // Merge this module to recovery modules if needed
132
- if (modulesAdd['windows-recovery'] != null) {
133
- if ((moduleName == 'win-console') || (moduleName == 'win-message-pump') || (moduleName == 'win-terminal')) {
134
- modulesAdd['windows-recovery'].push(...moduleData);
135
- }
136
- }
90
+ obj.addMeshCoreModules = function (modulesAdd) {
91
+ for (var plugin in obj.plugins) {
92
+ var moduleDirPath = null;
93
+ var modulesDir = null;
94
+ //if (obj.args.minifycore !== false) { try { moduleDirPath = obj.path.join(obj.pluginPath, 'modules_meshcore_min'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (e) { } } // Favor minified modules if present.
95
+ if (modulesDir == null) { try { moduleDirPath = obj.path.join(obj.pluginPath, plugin + '/modules_meshcore'); modulesDir = obj.fs.readdirSync(moduleDirPath); } catch (e) { } } // Use non-minified mofules.
96
+ if (modulesDir != null) {
97
+ for (var i in modulesDir) {
98
+ if (modulesDir[i].toLowerCase().endsWith('.js')) {
99
+ var moduleName = modulesDir[i].substring(0, modulesDir[i].length - 3);
100
+ if (moduleName.endsWith('.min')) { moduleName = moduleName.substring(0, moduleName.length - 4); } // Remove the ".min" for ".min.js" files.
101
+ var moduleData = ['try { addModule("', moduleName, '", "', obj.parent.escapeCodeString(obj.fs.readFileSync(obj.path.join(moduleDirPath, modulesDir[i])).toString('binary')), '"); addedModules.push("', moduleName, '"); } catch (e) { }\r\n'];
102
+
103
+ // Merge this module
104
+ // NOTE: "smbios" module makes some non-AI Linux segfault, only include for IA platforms.
105
+ if (moduleName.startsWith('amt-') || (moduleName == 'smbios')) {
106
+ // Add to IA / Intel AMT cores only
107
+ modulesAdd['windows-amt'].push(...moduleData);
108
+ modulesAdd['linux-amt'].push(...moduleData);
109
+ } else if (moduleName.startsWith('win-')) {
110
+ // Add to Windows cores only
111
+ modulesAdd['windows-amt'].push(...moduleData);
112
+ } else if (moduleName.startsWith('linux-')) {
113
+ // Add to Linux cores only
114
+ modulesAdd['linux-amt'].push(...moduleData);
115
+ modulesAdd['linux-noamt'].push(...moduleData);
116
+ } else {
117
+ // Add to all cores
118
+ modulesAdd['windows-amt'].push(...moduleData);
119
+ modulesAdd['linux-amt'].push(...moduleData);
120
+ modulesAdd['linux-noamt'].push(...moduleData);
121
+ }
122
+
123
+ // Merge this module to recovery modules if needed
124
+ if (modulesAdd['windows-recovery'] != null) {
125
+ if ((moduleName == 'win-console') || (moduleName == 'win-message-pump') || (moduleName == 'win-terminal')) {
126
+ modulesAdd['windows-recovery'].push(...moduleData);
127
+ }
128
+ }
129
138
- // Merge this module to agent recovery modules if needed
139
- if (modulesAdd['windows-agentrecovery'] != null) {
140
- if ((moduleName == 'win-console') || (moduleName == 'win-message-pump') || (moduleName == 'win-terminal')) {
141
- modulesAdd['windows-agentrecovery'].push(...moduleData);
142
- }
143
- }
144
- }
145
- }
130
+ // Merge this module to agent recovery modules if needed
131
+ if (modulesAdd['windows-agentrecovery'] != null) {
132
+ if ((moduleName == 'win-console') || (moduleName == 'win-message-pump') || (moduleName == 'win-terminal')) {
133
+ modulesAdd['windows-agentrecovery'].push(...moduleData);
134
+ }
135
+ }
136
+ }
137
+ }
138
}
147
- }
139
+ }
140
};
149
-
150
- obj.deviceViewPanel = function() {
151
- var panel = {};
152
- for (var p in obj.plugins) {
153
- if (typeof obj.plugins[p][hookName] == 'function') {
154
- try {
155
- panel[p].header = obj.plugins[p].on_device_header();
156
- panel[p].content = obj.plugins[p].on_device_page();
157
- } catch (e) {
158
- console.log('Error ocurred while getting plugin views ' + p + ':' + ' (' + e + ')');
159
- }
160
- }
161
- }
162
- return panel;
141
+
142
+ obj.deviceViewPanel = function () {
143
+ var panel = {};
144
+ for (var p in obj.plugins) {
145
+ if (typeof obj.plugins[p][hookName] == 'function') {
146
+ try {
147
+ panel[p].header = obj.plugins[p].on_device_header();
148
+ panel[p].content = obj.plugins[p].on_device_page();
149
+ } catch (e) {
150
+ console.log('Error ocurred while getting plugin views ' + p + ':' + ' (' + e + ')');
151
+ }
152
+ }
153
+ }
154
+ return panel;
155
}
164
-
156
+
157
return obj;
158
};
\ No newline at end of file
views/default-min.handlebars
+15280
-1
@@ -1 +1,15280 @@
1
-<!DOCTYPE html> <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="text/html;charset=utf-8" http-equiv="Content-Type"> <meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="format-detection" content="telephone=no"> <link rel="shortcut icon" type="image/x-icon" href="{{{domainurl}}}favicon.ico"> <link keeplink="1" type="text/css" href="styles/style.css" media="screen" rel="stylesheet" title="CSS"> <style>.ol-box{box-sizing:border-box;border-radius:2px;border:2px solid #00f;}.ol-mouse-position{top:8px;right:8px;position:absolute;}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute;}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width;}.ol-overlay-container{will-change:left,right,top,bottom;}.ol-unsupported{display:none;}.ol-unselectable, .ol-viewport{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing;}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;}.ol-control{position:absolute;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px;}.ol-control:hover{background-color:rgba(255,255,255,.6);}.ol-zoom{top:.5em;right:.5em;}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear;}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s;}.ol-zoom-extent{top:4.643em;left:.5em;}.ol-full-screen{right:.5em;top:.5em;}@media print{.ol-control{display:none;}}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px;}.ol-control button::-moz-focus-inner{border:none;padding:0;}.ol-zoom-extent button{line-height:1.4em;}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform;}.ol-touch .ol-control button{font-size:1.5em;}.ol-touch .ol-zoom-extent{top:5.5em;}.ol-control button:focus, .ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7);}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0;}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px;}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em);}.ol-attribution ul{margin:0;padding:0 .5em;font-size:.7rem;line-height:1.375em;color:#000;text-shadow:0 0 2px #fff;}.ol-attribution li{display:inline;list-style:none;line-height:inherit;}.ol-attribution li:not(:last-child):after{content:" ";}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle;}.ol-attribution button, .ol-attribution ul{display:inline-block;}.ol-attribution.ol-collapsed ul{display:none;}.ol-attribution.ol-logo-only ul{display:block;}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8);}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0;height:1.1em;line-height:1em;}.ol-attribution.ol-logo-only{background:0 0;bottom:.4em;height:1.1em;line-height:1em;}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em;}.ol-attribution.ol-logo-only button, .ol-attribution.ol-uncollapsible button{display:none;}.ol-zoomslider{top:4.5em;left:.5em;height:200px;}.ol-zoomslider button{position:relative;height:10px;}.ol-touch .ol-zoomslider{top:5.5em;}.ol-overviewmap{left:.5em;bottom:.5em;}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0;}.ol-overviewmap .ol-overviewmap-map, .ol-overviewmap button{display:inline-block;}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px;}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute;}.ol-overviewmap.ol-collapsed .ol-overviewmap-map, .ol-overviewmap.ol-uncollapsible button{display:none;}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8);}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7);}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move;}</style> <style> .ol-ctx-menu-container{position:absolute;padding:8px;background:#fff;color:#222;font-size:13px;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,.2);box-sizing:border-box}.ol-ctx-menu-container a,.ol-ctx-menu-container div,.ol-ctx-menu-container img,.ol-ctx-menu-container li,.ol-ctx-menu-container span,.ol-ctx-menu-container ul{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}.ol-ctx-menu-container a img{border:none}.ol-ctx-menu-container *,.ol-ctx-menu-container :after,.ol-ctx-menu-container :before{box-sizing:inherit}.ol-ctx-menu-container.ol-ctx-menu-hidden{opacity:0;visibility:hidden;-webkit-transition:visibility 0s linear .3s,opacity .3s;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container ul{list-style:none}.ol-ctx-menu-container li{position:relative;line-height:20px;padding:2px 5px}.ol-ctx-menu-container li:not(.ol-ctx-menu-separator):hover{cursor:pointer;background-color:#333;color:#eee}.ol-ctx-menu-container li.ol-ctx-menu-submenu .ol-ctx-menu-container{border:1px solid #eee;padding:8px;top:0;opacity:0;visibility:hidden;-webkit-transition:visibility 0s linear .3s,opacity .3s;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container li.ol-ctx-menu-submenu:hover .ol-ctx-menu-container{opacity:1;visibility:visible;-webkit-transition-delay:0s;transition-delay:0s}.ol-ctx-menu-container li.ol-ctx-menu-submenu:after{position:absolute;top:7px;right:10px;content:"";display:inline-block;width:.6em;height:.6em;border-right:.3em solid #222;border-top:.3em solid #222;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ol-ctx-menu-container li.ol-ctx-menu-submenu:hover:after{border-color:#eee}.ol-ctx-menu-container li.ol-ctx-menu-separator{padding:0}.ol-ctx-menu-container li.ol-ctx-menu-separator hr{border:0;height:1px;background-image:-webkit-linear-gradient(right,transparent,rgba(0,0,0,.75),transparent);background-image:linear-gradient(270deg,transparent,rgba(0,0,0,.75),transparent)}.ol-ctx-menu-icon{text-indent:20px;background-size:20px auto;background-repeat:no-repeat;background-position:0}.ol-ctx-menu-zoom-in{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABaUlEQVQ4T72U7VHCQBCGn90GtAMuNGCswFiBWIFQgWMFxg6wArECsQKhArEBiB1Qwa1zgQn5IAYcxv13k71n3919L8KJQ07M47+BzgG9TRfZ/JBuWhS6BJFHRJICYrZGZIz3z5Ct2+B7gG6I6kt+wewdkQVwjtkAkR5mC8yu26A1oItR/cTsOweQBdgutD8G7jGm2PJ2n8oqUKIpIjd4HxTM8gvaT/F+AlmWnyWaIXKF95eNguFzTYFhNsdWu9kFgFlaFMANUH3D8wDLoLgSTSD2il8NCe2ZXQBxWDGwxmyUzzOMBZ7wy7Qb2K0wQfXjMOBuhlFpZtNty5sFaTQBuTusZdymeqs1SpYKcO9HkE3KbTd9WFijMHJQ5hBNEAYNq5Qd0dhyke0GiE4QzjqfW23mHT8Hl4DG4Lce3FPE7AtbBSdsbNqpoJLgYkRnNeUV+xwJDHTnUEkxHGbhBXUs5TjJjew/KPy94g+NRaIVRYmMXwAAAABJRU5ErkJggg==")}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-in{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABc0lEQVQ4T71U21ECQRDsJgGdvQDECMQIxAjECMQILCPwzAAjECIQI0AiEDPQAPaWCBhrcKHuCUcV5f7dY3v6tUscefHIePhfwBBCF8CZqRCReRs1tQxDCH1VfQLQz4EsSY4AvIjIsgm8AhhCGKrqa9zwrqoLAKckB5HtguR1E2gBMITQU9VPAD8GICIGtl3e+xHJBwBT59xtHcsCYJZlUwA3kcGHbfDep51OZywi3/acZZm9vyJ5WR5o38uACmDunNt6ZwAkUxFZDwghDFT1jeSjiJinhVUBVNVJkiTDKO8CQA+AsbNQ7s1Ps0VVn5MkSfcCtmBoDZi1Bdx4eJ7zbBolrwPy3o9J3rWSHPs3A1BbjVKlYBaIyDgvu9LDXDU2RTZmXVW1oKyLxRD+OrkOrJLy5mVM0iaftDhuhVbsvBzMglzKUNW6IV/OOWtCM8MmVvEkmbwt83LaB19fdgOtVquUZJeknaDdobTwbOcvBzPcN/AXH1DFFWP7u9oAAAAASUVORK5CYII=")}.ol-ctx-menu-zoom-out{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABU0lEQVQ4T72U7VECMRRFz3sNaAdkacC1AtcKxApcKnCsQOwAK3CtQKxAqEBsANYOqCDPyTIC+8WCw5jfybn33dxEOPGSE/P4b6BzQG89RT47ZJoWhy5B5BGRZAMxWyEyxvtnyFdt8AagS1F9KQ6YvSMyB84xGyDSw2yO2XUbtAJ0MaqfmH0XAPIA2y7tj4F7jAm2uG1yWQZKNEHkBu+Dg2njWBJNEbnC+8uaIFRuWfuG2QxbbrOrUd0A1Tc8D7AIjkur7DAAsVf8MiWMZ3ZR2m02LPIMscATfjHqBnY7TFD9OAy4zTCCPG/MUKMM5O6wkXFr9dZq7FQqqHk/hDzbFa73cFONTZFDdRyiCcKg5rrSiLaXkiI6RjjrfG6VzDs+B5eAxuDXeYpmNRGzL2wZ/wof+du4GNFpBVqqz5HA4MM5VEYYDrOs+1I6Q9u/4Q8O9wN/AGgWjBVqQjjgAAAAAElFTkSuQmCC")}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-out{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABYklEQVQ4T72U4VHCQBCF36tA91KAWIFYgViBWIFYgWMFYgdYgVCBWAFSgdiBFpAsFWSdxcDkQoBkhnF/ZjbfvX377ogjF4/Mw/8CVbUD4MynEJF5k2lqFapqz8yeAPRKkCXJEYAXEVnugm8BVXVgZq/FD+9mtgBwSrJfqF2QvN4FjYCq2jWzTwA/DhARh20qTdMRyQcA0xDCbZ3KCJhl2RTATaHgo+6HLMv8+xXJy+qB3l8FGoB5CKHsXcRV1b6ZvZF8FBH3NKotoJlNkiQZFONdlLtJ3rufbouZPSdJMjwIbKDQEzBrClx7eC4i33Uepmk6JnnXaOQifzMAtdGoRApugYiMI1uqKkrRWAfZo9MxM1+UZzFewl8mN4nYdVM83L7BkwbXLUrF3sfBLQDQBbDy08x8vOohXyEE71lVq9emuEk+3gZa3XYroCvwFyjP8yHJDsnxwaU08GxvS2uFhw78BbzWrxXgMbsHAAAAAElFTkSuQmCC")}</style> <script type="text/javascript" src="scripts/u2f-api.js"></script> <script type="text/javascript" src="scripts/charts.js"></script> <script type="text/javascript" src="scripts/filesaver.js"></script> <script type="text/javascript" src="scripts/ol.js"></script> <script type="text/javascript" src="scripts/ol3-contextmenu.js"></script> <title>{{{title}}}</title> </head> <body id="body" onload="if (typeof(startup) !== 'undefined') startup();" oncontextmenu="handleContextMenu(event)" style="display:none;min-width:495px"> <div id="contextMenu" class="contextMenu noselect" style="display:none"> <div id="cxinfo" class="cmtext" onclick="cmaction(1,event)"><b>Information</b></div> <div id="cxdesktop" class="cmtext" onclick="cmaction(3,event)">Desktop</div> <div id="cxterminal" class="cmtext" onclick="cmaction(2,event)">Terminal</div> <div id="cxfiles" class="cmtext" onclick="cmaction(4,event)">Files</div> <div id="cxevents" class="cmtext" onclick="cmaction(5,event)">Events</div> <div id="cxconsole" class="cmtext" onclick="cmaction(6,event)">Console</div> <hr id="cxmgroupsplit"> <div id="cxmdesktop" class="cmtext" onclick="cmaction(7,event)" style="display:none">Multi-Desktop</div> </div> <div id="meshContextMenu" class="contextMenu noselect" style="display:none;min-width:0px"> <div id="cxselectall" class="cmtext" onclick="cmmeshaction(1,event)">Select All</div> <div id="cxselectnone" class="cmtext" onclick="cmmeshaction(2,event)">Select None</div> </div> <div id="termShellContextMenu" class="contextMenu noselect" style="display:none;min-width:0px"> <div id="cxtermnorm" class="cmtext" onclick="cmtermaction(1,event)">Normal Connect</div> <div id="cxtermps" class="cmtext" onclick="cmtermaction(2,event)">PowerShell Connect</div> </div> <div id="container"> <div id="notifiyBox" class="notifiyBox" style="display:none"></div> <div id="masthead" class="noselect"> <div class="title">{{{title}}}</div> <div class="title2">{{{title2}}}</div> <div style="float:right"> <div id="notificationCount" onclick="clickNotificationIcon()" class="unselectable" style="display:none;" title="Click to view current notifications">0</div> </div> <p id="logoutControl">{{{logoutControl}}}<span id="idleTimeoutNotify" style="color:yellow"></span></p> </div> <div id="page_leftbar"> <div style="height:16px"></div> <div id="LeftMenuMyDevices" tabindex="0" class="lbbutton lbbuttonsel" title="My Devices" onclick="go(1,event)" onkeypress="if (event.key=='Enter') { go(1); }"> <div class="lb2"></div> </div> <div id="LeftMenuMyAccount" tabindex="0" class="lbbutton" title="My Account" onclick="go(2,event)" onkeypress="if (event.key=='Enter') { go(2); }"> <div class="lb1"></div> </div> <div id="LeftMenuMyEvents" tabindex="0" class="lbbutton" title="My Events" onclick="go(3,event)" onkeypress="if (event.key=='Enter') { go(3); }"> <div class="lb3"></div> </div> <div id="LeftMenuMyFiles" tabindex="0" class="lbbutton" style="display:none" title="My Files" onclick="go(5,event)" onkeypress="if (event.key=='Enter') { go(5); }"> <div class="lb4"></div> </div> <div id="LeftMenuMyUsers" tabindex="0" class="lbbutton" style="display:none" title="My Users" onclick="go(4,event)" onkeypress="if (event.key=='Enter') { go(4); }"> <div class="lb5"></div> </div> <div id="LeftMenuMyServer" tabindex="0" class="lbbutton" style="display:none" title="My Server" onclick="go(6,event)" onkeypress="if (event.key=='Enter') { go(6); }"> <div class="lb6"></div> </div> </div> <div id="topbar" class="noselect"> <div> <div style="position:relative"> <div tabindex="0" id="uiMenuButton" title="User interface selection" onclick="showUserInterfaceSelectMenu()" onkeypress="if (event.key == 'Enter') showUserInterfaceSelectMenu()">♦ <div id="uiMenu" style="display:none"> <div tabindex="0" id="uiViewButton1" class="uiSelector" onclick="userInterfaceSelectMenu(1)" title="Left bar interface" onkeypress="if (event.key == 'Enter') userInterfaceSelectMenu(1)"><div class="uiSelector1"></div></div> <div tabindex="0" id="uiViewButton2" class="uiSelector" onclick="userInterfaceSelectMenu(2)" title="Top bar interface" onkeypress="if (event.key == 'Enter') userInterfaceSelectMenu(2)"><div class="uiSelector2"></div></div> <div tabindex="0" id="uiViewButton3" class="uiSelector" onclick="userInterfaceSelectMenu(3)" title="Fixed width interface" onkeypress="if (event.key == 'Enter') userInterfaceSelectMenu(3)"><div class="uiSelector3"></div></div> <div tabindex="0" id="uiViewButton4" class="uiSelector" onclick="toggleNightMode()" title="Toggle night mode" onkeypress="if (event.key == 'Enter') toggleNightMode()"><div class="uiSelector4"></div></div> </div> </div> <table id="MainMenuSpan" cellpadding="0" cellspacing="0" class="style1"> <tr> <td tabindex="0" id="MainMenuMyDevices" class="topbar_td style3x" onclick="go(1,event)" onkeypress="if (event.key == 'Enter') go(1)">My Devices</td> <td tabindex="0" id="MainMenuMyAccount" class="topbar_td style3x" onclick="go(2,event)" onkeypress="if (event.key == 'Enter') go(2)">My Account</td> <td tabindex="0" id="MainMenuMyEvents" class="topbar_td style3x" onclick="go(3,event)" onkeypress="if (event.key == 'Enter') go(3)">My Events</td> <td tabindex="0" id="MainMenuMyFiles" class="topbar_td style3x" onclick="go(5,event)" onkeypress="if (event.key == 'Enter') go(5)">My Files</td> <td tabindex="0" id="MainMenuMyUsers" class="topbar_td style3x" onclick="go(4,event)" onkeypress="if (event.key == 'Enter') go(4)">My Users</td> <td tabindex="0" id="MainMenuMyServer" class="topbar_td style3x" onclick="go(6,event)" onkeypress="if (event.key == 'Enter') go(6)">My Server</td> <td class="topbar_td_end style3"> </td> </tr> </table> <div id="MainSubMenuSpan" style="display:none"> <table id="MainSubMenu" cellpadding="0" cellspacing="0" class="style1"> <tr> <td tabindex="0" id="MainDev" class="topbar_td style3x" onclick="go(10,event)" onkeypress="if (event.key == 'Enter') go(10)">General</td> <td tabindex="0" id="MainDevDesktop" class="topbar_td style3x" onclick="go(11,event)" onkeypress="if (event.key == 'Enter') go(11)">Desktop</td> <td tabindex="0" id="MainDevTerminal" class="topbar_td style3x" onclick="go(12,event)" onkeypress="if (event.key == 'Enter') go(12)">Terminal</td> <td tabindex="0" id="MainDevFiles" class="topbar_td style3x" onclick="go(13,event)" onkeypress="if (event.key == 'Enter') go(13)">Files</td> <td tabindex="0" id="MainDevEvents" class="topbar_td style3x" onclick="go(16,event)" onkeypress="if (event.key == 'Enter') go(16)">Events</td> <td tabindex="0" id="MainDevInfo" class="topbar_td style3x" onclick="go(17,event)" onkeypress="if (event.key == 'Enter') go(17)">Details</td> <td tabindex="0" id="MainDevAmt" class="topbar_td style3x" onclick="go(14,event)" onkeypress="if (event.key == 'Enter') go(14)">Intel® AMT</td> <td tabindex="0" id="MainDevConsole" class="topbar_td style3x" onclick="go(15,event)" onkeypress="if (event.key == 'Enter') go(15)">Console</td> <td class="topbar_td_end style3"> </td> </tr> </table> </div> <div id="MeshSubMenuSpan" style="display:none"> <table id="MeshSubMenu" cellpadding="0" cellspacing="0" class="style1"> <tr> <td tabindex="0" id="MeshGeneral" class="topbar_td style3x" onclick="go(20,event)" onkeypress="if (event.key == 'Enter') go(20)">General</td> <td class="topbar_td_end style3"> </td> </tr> </table> </div> <div id="UserSubMenuSpan" style="display:none"> <table id="UserSubMenu" cellpadding="0" cellspacing="0" class="style1"> <tr> <td tabindex="0" id="UserGeneral" class="topbar_td style3x" onclick="go(30,event)" onkeypress="if (event.key == 'Enter') go(30)">General</td> <td tabindex="0" id="UserEvents" class="topbar_td style3x" onclick="go(31,event)" onkeypress="if (event.key == 'Enter') go(31)">Events</td> <td class="topbar_td_end style3"> </td> </tr> </table> </div> <div id="ServerSubMenuSpan" style="display:none"> <table id="ServerSubMenu" cellpadding="0" cellspacing="0" class="style1"> <tr> <td tabindex="0" id="ServerGeneral" class="topbar_td style3x" onclick="go(6,event)" onkeypress="if (event.key == 'Enter') go(6)">General</td> <td tabindex="0" id="ServerStats" class="topbar_td style3x" onclick="go(40,event)" onkeypress="if (event.key == 'Enter') go(40)">Stats</td> <td tabindex="0" id="ServerConsole" class="topbar_td style3x" onclick="go(115,event)" onkeypress="if (event.key == 'Enter') go(115)">Console</td> <td tabindex="0" id="ServerTrace" class="topbar_td style3x" onclick="go(41,event)" onkeypress="if (event.key == 'Enter') go(41)">Trace</td> <td class="topbar_td_end style3"> </td> </tr> </table> </div> <div id="UserDummyMenuSpan"> <table id="UserDummyMenu" cellpadding="0" cellspacing="0" class="style1"> <tr><td class="style3" style=""> </td></tr> </table> </div> </div> </div> </div> <div id="column_l"> <div id="p0" style="display:none"> <div id="p0message"><span id="p0span">Server disconnected</span>, <href onclick="reload()" style="cursor:pointer"><u>click to reconnect</u></href>.</div> </div> <div id="p1" style="display:none"> <div style="display:none" id="devListToolbarViewIcons"> <div tabindex="0" id="devViewButton1" class="viewSelector" onclick="onDeviceViewChange(1)" onkeypress="if (event.key=='Enter') { onDeviceViewChange(1); }" title="Columns"><div class="viewSelector2"></div></div> <div tabindex="0" id="devViewButton2" class="viewSelector" onclick="onDeviceViewChange(2)" onkeypress="if (event.key == 'Enter') { onDeviceViewChange(2); }" title="List"><div class="viewSelector1"></div></div> <div tabindex="0" id="devViewButton3" class="viewSelector" onclick="onDeviceViewChange(3)" onkeypress="if (event.key == 'Enter') { onDeviceViewChange(3); }" title="Desktops"><div class="viewSelector3"></div></div> <div tabindex="0" id="devViewButton4" class="viewSelector" onclick="onDeviceViewChange(4)" onkeypress="if (event.key == 'Enter') { onDeviceViewChange(4); }" title="Map"><div class="viewSelector4"></div></div> </div><div><h1>My Devices</h1></div> <table id="devListToolbarSpan" class="noselect"> <tr> <td class="h1"></td> <td id="devListToolbar" class="style14" style="display:none"> <input type="button" id="SelectAllButton" onclick="selectallButtonFunction();" value="Select All"> <input type="button" id="GroupActionButton" disabled="disabled" value="Group Action" onclick="groupActionFunction()"> <input id="SearchInput" type="text" placeholder="Filter" onchange="masterUpdate(5)" onkeyup="masterUpdate(5)" autocomplete="off" onfocus="onSearchFocus(1)" onblur="onSearchFocus(0)"> <label><input type="checkbox" id="RealNameCheckBox" onclick="onRealNameCheckBox()"><span title="Show devices operating system name">OS Name</span></label> </td> <td id="kvmListToolbar" class="style14" style="display:none"> <input type="button" onclick="connectAllKvmFunction()" value="Connect All"> <input type="button" onclick="disconnectAllKvmFunction()" value="Disconnect All"> <label><input type="checkbox" id="autoConnectDesktopCheckbox" onclick="autoConnectDesktops(event)" title="Automatic connect">Auto </label> <input type="button" onclick="showMultiDesktopSettings()" value="Settings"> </td> <td id="devMapToolbar" class="style14" style="display:none"> <input type="text" id="mapSearchLocation" placeholder="Search Location" onfocus="onMapSearchFocus(1)" onblur="onMapSearchFocus(0)"> <input type="button" value="Search" title="Search for location" onclick="getSearchLocation()"> <input type="button" id="refreshmap" title="Reset map view" value="Reset" onclick="refreshMap(false,true)"> </td> <td class="auto-style1" style="height:100%"> <div style="display:none" id="devListToolbarView"> View <select id="viewselect" onchange="onDeviceViewChange()"> <option value="1">Columns <option value="2">List <option value="3">Desktops <option id="viewselectmapoption" value="4">Map </select> </div> <div style="display:none" id="devListToolbarSort"> Sort <select id="sortselect" onchange="masterUpdate(6)"> <option>Group <option>Power <option>Device <option>Tags </select> </div> <div style="display:none" id="devListToolbarSize"> Size <select id="sizeselect" onchange="onDeviceViewChange()"> <option value="0">Small <option value="1">Medium <option value="2">Large </select> </div> </td> <td class="h2"></td> </tr> </table> <div id="NoMeshesPanel" style="display:none"> <table> <tr> <td valign="top" style="width:50px"> <img src="images/info.png"> </td> <td> <div id="getStarted1">To get started, <a href="#" onclick="return account_createMesh()"><strong>click here to create a device group</strong></a>.</div> <div id="getStarted2">No device groups.</div> </td> </tr> </table> </div> <div id="xdevices" class="noselect" style="display:none"></div> <div id="xdevicesmap" style="display:none"> <div id="xmapSearchResultsDlg" style="display:none"> <div id="xmapSearchResultsBck"> <div id="xmapSearchClose" onclick="mapCloseSearchWindow()"><b>X</b></div> <div style="padding:5px">Location Results</div> <div style="width:100%;margin:6px"></div> </div> <div id="xmapSearchResults" style="margin:6px"></div> </div> </div> <div id="xmap-info-window"></div> </div> <div id="p2" style="display:none"> <h1>My Account</h1> <img id="p2AccountImage" alt="" src="images/clipboard-128.png"> <div id="p2AccountSecurity" style="display:none"> <p><strong>Account security</strong></p> <div style="margin-left:25px"> <div id="manageAuthApp"><div class="p2AccountActions"><span id="authAppSetupCheck"><strong>✓</strong></span></div><span><a href="#" onclick="return account_manageAuthApp()">Manage authenticator app</a><br></span></div> <div id="manageHardwareOtp"><div class="p2AccountActions"><span id="authKeySetupCheck"><strong>✓</strong></span></div><span><a href="#" onclick="return account_manageHardwareOtp(0)">Manage security keys</a><br></span></div> <div id="manageOtp"><div class="p2AccountActions"><span id="authCodesSetupCheck"><strong>✓</strong></span></div><span><a href="#" onclick="return account_manageOtp(0)">Manage backup codes</a><br></span></div> </div> </div> <div id="p2AccountActions"> <p><strong>Account actions</strong></p> <p class="mL"> <span id="verifyEmailId" style="display:none"><a href="#" onclick="return account_showVerifyEmail()">Verify email</a><br></span> <span id="accountEnableNotificationsSpan" style="display:none"><a href="#" onclick="return account_enableNotifications()">Enable web notifications</a><br></span> <a href="#" onclick="return account_showLocalizationSettings()">Localization Settings</a><br> <a href="#" onclick="return account_showAccountNotifySettings()">Notification Settings</a><br> <span id="accountChangeEmailAddressSpan" style="display:none"><a href="#" onclick="return account_showChangeEmail()">Change email address</a><br></span> <a href="#" onclick="return account_showChangePassword()">Change password</a><span id="p2nextPasswordUpdateTime"></span><br> <a href="#" onclick="return account_showDeleteAccount()">Delete account</a><br> </p> <br style="clear:both"> </div> <strong>Device Groups</strong> <span id="p2createMeshLink1">( <a href="#" onclick="return account_createMesh()" class="newMeshBtn"> New</a> )</span> <br><br> <div id="p2meshes"></div> <div id="p2noMeshFound" style="display:none">No device groups.<span id="p2createMeshLink2"> <a href="#" onclick="return account_createMesh()"><strong>Get started here!</strong></a></span></div> <br style="clear:both"> </div> <div id="p3" style="display:none"> <h1>My Events</h1> <table class="pTable"> <tr> <td class="h1"></td> <td class="auto-style1"> Show <select id="p3limitdropdown" onchange="refreshEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <a href="#" onclick="p3showDownloadEventsDialog(2)"><img src="images/link4.png" height="10" width="10" title="Download Events" style="cursor:pointer"></a> </td> <td class="h2"></td> </tr> </table> <div id="p3events" style=""></div> </div> <div id="p4" style="display:none"> <h1>My Users</h1> <table class="pTable"> <tr> <td class="h1"></td> <td class="style14"> <div style="float:right"> <input type="button" onclick="showUserBroadcastDialog()" style="margin-right:6px" value="Broadcast"> <a href="#" onclick="p4downloadUserInfo()"><img style="cursor:pointer" title="Download user information" src="images/link4.png"></a> <a href="#" onclick="p4batchAccountCreate()"><img id="p4UserBatchCreate" style="cursor:pointer;display:none" title="Batch create many user accounts" src="images/link6.png"></a> </div> <div> <input id="UserNewAccountButton" type="button" style="margin-left:6px" onclick="showCreateNewAccountDialog()" value="New Account..."> <input id="UserSearchInput" type="text" style="width:120px;margin-left:6px" placeholder="Filter" onchange="onUserSearchInputChanged()" onkeyup="onUserSearchInputChanged()" autocomplete="off" onfocus="onUserSearchFocus(1)" onblur="onUserSearchFocus(0)"> </div> </td> <td class="h2"></td> </tr> </table> <div id="p3users"></div> </div> <div id="p5" style="display:none"> <h1>My Files</h1> <table id="p5toolbar" cellpadding="0" cellspacing="0"> <tr> <td id="p5filehead" valign="bottom"> <div id="p5rightOfButtons"></div> <div> <input type="button" id="p5FolderUp" disabled="disabled" onclick="return p5folderup();" value="Up"> <input type="button" id="p5SelectAllButton" disabled="disabled" onclick="p5selectallfile();" value="Select All"> <input type="button" id="p5RenameFileButton" disabled="disabled" value="Rename" onclick="p5renamefile();"> <input type="button" id="p5DeleteFileButton" disabled="disabled" value="Delete" onclick="p5deletefile();"> <input type="button" id="p5NewFolderButton" disabled="disabled" value="New Folder" onclick="p5createfolder();"> <input type="button" id="p5UploadButton" disabled="disabled" value="Upload" onclick="p5uploadFile()"> <input type="button" id="p5CutButton" disabled="disabled" value="Cut" onclick="p5copyFile(1)"> <input type="button" id="p5CopyButton" disabled="disabled" value="Copy" onclick="p5copyFile(0)"> <input type="button" id="p5PasteButton" disabled="disabled" value="Paste" onclick="p5pasteFile()"> </div> </td> </tr> <tr> <td id="p5filesubhead"> <div style="float:right"> <select id="p5sortdropdown" onchange="updateFiles()"> <option value="1" selected="selected">Sort by name <option value="2">Sort by size <option value="3">Sort by date <option value="4">Descend by name <option value="5">Descend by size <option value="6">Descend by date </select> </div> <div> <span id="p5currentpath"></span></div> </td> </tr> </table> <div id="p5filetable"> <div id="p5PublicShare" style=""><div>These files are shared publicly, click "link" to get public url.</div></div> <div id="bigok" style="display:none"><b>✓</b></div> <div id="bigfail" style="display:none"><b>✗</b></div> <span id="p5files"></span> </div> <table id="p5toolbarBottom" style="width:100%" cellpadding="0" cellspacing="0"> <tr><td class="style6"> <span id="p5bottomstatus"></span></td></tr> </table> </div> <div id="p6" style="display:none"> <img id="MainMeshImage" src="serverpic.ashx"> <h1>My Server</h1> <div id="p2ServerActions"> <p><strong>Server actions</strong></p> <div class="mL"> <div id="p2ServerActionsBackup"><a href="{{{domainurl}}}backup.zip" rel="noreferrer noopener" target="_blank">Download server backup</a></div> <div id="p2ServerActionsRestore"><a href="#" onclick="return server_showRestoreDlg()">Restore server with backup</a></div> <div id="p2ServerActionsVersion"><a href="#" onclick="return server_showVersionDlg()">Check server version</a></div> <div id="p2ServerActionsErrors"><a href="#" onclick="return server_showErrorsDlg()">Show server error log</a></div> </div> </div> <br><strong>Server Statistics</strong><br><br> <div id="serverStats"> <div id="serverCpuChartView" style="display:none"> <div class="chartViewCanvas"><canvas id="serverCpuChart"></canvas></div> <div class="chartViewText" id="serverCpuChartText"></div> </div> <div id="serverMemoryChartView" style="display:none"> <div class="chartViewCanvas"><canvas id="serverMemoryChart"></canvas></div> <div class="chartViewText" id="serverMemoryChartText"></div> </div><br><br> <div id="serverStatsTable"></div> </div> </div> <div id="p10" style="display:none"> <table style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="width:auto" valign="top"> <div id="p10title"> <div id="p10BackButton"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p10deviceName"></span></h1> </div> <div id="p10html"></div> </td> <td style="width:20px"></td> <td style="width:200px"> <a href="#" onclick="p10showiconselector()"><img id="MainComputerImage"></a> <div id="MainComputerState"></div> </td> </tr> </table><br> <div id="p10html2"></div> <div id="p10html3"></div> </div> <div id="p11" class="noselect" style="display:none"> <div id="p11title"> <div id="p11deviceNameHeader"> <div id="p11BackButton"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <div id="devListToolbarViewIcons"><div class="viewSelector" onclick="deskToggleFull(event)" title="Full Screen. Hold shift to browser full screen."><div class="viewSelector5"></div></div></div> <h1>Desktop - <span id="p11deviceName"></span></h1> </div> </div> <div id="p11warning" onclick="showFeaturesDlg()"> <div class="icon2"></div> <div class="warningbox">Intel® AMT Redirection port or KVM feature is disabled<span id="p11warninga">, click here to enable it.</span></div> </div> <div id="p11warning2" onclick="showPowerActionDlg()"> <div class="icon2"></div> <div class="warningbox">Remote computer is not powered on, click here to issue a power command.</div> </div> <div id="deskarea0" cellpadding="0" cellspacing="0"> <div id="deskarea1" class="areaHead"> <div class="toright2"> <span id="p11power"></span> <div class='deskareaicon' title="Toggle View Mode" onclick="toggleAspectRatio(1)">⇲</div> <div class='deskareaicon' title="Rotate Left" onclick="drotate(-1)">↺</div> <div class='deskareaicon' title="Rotate Right" onclick="drotate(1)">↻</div> <div id="deskRecordIcon" class='deskareaicon' title="Server is recording this session" style="display:none;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px"></div> <input id="deskFocusBtn" type="button" title="Toggle focus mode, when active only the region around the mouse is updated" onkeypress="return false" onkeydown="return false" value="Focus All" onclick="deskToggleFocus()" style="margin-right:3px;display:none"> <input id="deskSaveBtn" type="button" title="Save a screenshot of the remote desktop" onkeypress="return false" onkeydown="return false" value="Save..." onclick="deskSaveImage()" class="mR"> <input id="deskActionsBtn" type="button" title="Perform power actions on the device" onkeypress="return false" onkeydown="return false" value="Actions" onclick="deviceActionFunction()" class="mR"> <input id="deskActionsSettings" type="button" value="Settings..." title="Edit remote desktop settings" onkeypress="return false" onkeydown="return false" onclick="showDesktopSettings()" class="mR"> <input type="button" title="Change the power state of the remote machine" onkeypress="return false" onkeydown="return false" value="Power Actions..." onclick="showPowerActionDlg()" style="display:none"> </div> <div> <div id="idx_deskFullBtn2" onclick="deskToggleFull(event)"> ✖</div> <input type="button" id="autoconnectbutton1" value="AutoConnect" onclick="autoConnectDesktop(event)" onkeypress="return false" onkeydown="return false" style="display:none"> <span id="connectbutton1span"><input type="button" id="connectbutton1" value="Connect" onclick="connectDesktop(event,1)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="connectbutton1hspan"> <input type="button" id="connectbutton1h" value="HW Connect" onclick="connectDesktop(event,2)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="disconnectbutton1span"> <input type="button" id="disconnectbutton1" value="Disconnect" onclick="connectDesktop(event,0)" onkeypress="return false" onkeydown="return false"></span> <span id="deskstatus">Disconnected</span> </div> </div> <div id="deskarea2" style=""> <div class="areaProgress"><div id="progressbar" style=""></div></div> </div> <div id="deskarea3x"> <div id="DeskFocus" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)"></div> <div id="DeskParent"> <canvas id="Desk" width="640" height="480" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)" onmousewheel="dmousewheel(event)"></canvas> </div> <div id="DeskTools"> <div id="deskToolsAreaTop"> <a id="DeskToolsRefreshButton" style="right:2px" onclick="refreshDeskTools()">Refresh</a> <div id="deskToolsTopTabProcess" class="deskToolsTopTab" onclick="changeDeskToolTab(0)" style="left:0px;bottom:0px">Processes</div> <div id="deskToolsTopTabService" class="deskToolsTopTab" onclick="changeDeskToolTab(1)" style="display:none;left:90px;color:gray">Services</div> </div> <div id="deskToolsArea"> <div id="DeskToolsProcessTab"> <div id="deskToolsHeader"> <a class="colmn1" title="Sort by process id" onclick="sortProcess(0)">PID</a> <a class="colmn2" title="Sort by name" onclick="sortProcess(1)">Name</a> </div> <div id="DeskToolsProcesses" style=""></div> </div> <div id="DeskToolsServiceTab" style="display:none"> <div id="deskToolsServiceHeader"> <a class="colmn1" style="width:70px" title="Sort by state" onclick="sortService(0)">State</a> <a class="colmn2" title="Sort by name" onclick="sortService(1)">Name</a> </div> <div id="DeskToolsServices" style=""></div> </div> </div> </div> <div id="p11DeskConsoleMsg" style="display:none;cursor:pointer;position:absolute;left:30px;top:17px;color:yellow;background-color:rgba(0,0,0,0.6);padding:10px;border-radius:5px" onclick="p11clearConsoleMsg()"></div> </div> <div id="deskarea4" class="areaFoot"> <div class="toright2"> <span id="DeskTimer" title="Session time"></span> <select id="termdisplays" style="display:none" onchange="deskSetDisplay(event)" onkeypress="return false" onkeydown="return false"></select> <input id="DeskToolsButton" type="button" value="Tools" title="Toggle tools view" onkeypress="return false" onkeydown="return false" onclick="toggleDeskTools()"> <span id="DeskChatButton" class="deskarea" title="Open chat window to this computer"><img src='images/icon-chat.png' onclick="deviceChat()" height="16" width="16" style="padding-top:2px"></span> <span id="DeskNotifyButton" title="Display a notification on the remote computer"><img src='images/icon-notify.png' onclick="deviceToastFunction()" height="16" width="16" style="padding-top:2px"></span> <span id="DeskOpenWebButton" title="Open a web address on remote computer"><img src='images/icon-url2.png' onclick="deviceUrlFunction()" height="16" width="16" style="padding-top:2px"></span> </div> <div> <select id="deskkeys"> <option value="10">Ctrl+Alt+Del <option value="5">Win <option value="0">Win+Down <option value="1">Win+Up <option value="2">Win+L <option value="3">Win+M <option value="4">Shift+Win+M <option value="6">Win+R <option value="7">Alt-F4 <option value="8">Ctrl-W <option value="9">Alt-Tab <option value="11">Win+Left <option value="12">Win+Right </select> <input id="DeskWD" type="button" value="Send" onkeypress="return false" onkeydown="return false" onclick="deskSendKeys()"> <input id="DeskClip" style="" type="button" value="Clipboard" onkeypress="return false" onkeydown="return false" onclick="showDeskClip()"> <input id="DeskType" style="" type="button" value="Type" onkeypress="return false" onkeydown="return false" onclick="showDeskType()"> <label><span id="DeskControlSpan" title="Toggle mouse and keyboard input"><input id="DeskControl" type="checkbox" onkeypress="return false" onkeydown="return false" onclick="toggleKvmControl()">Input</span></label> </div> </div> </div> </div> <div id="p12" style="display:none"> <div id="p12title"> <div id="p12BackButton"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>Terminal - <span id="p12deviceName"></span></h1> </div> <div id="p12warning" onclick="showFeaturesDlg()"> <div class="icon2"></div> <div class="warningbox">Intel® AMT Redirection port or KVM feature is disabled<span id="p12warninga">, click here to enable it.</span></div> </div> <div id="p12warning2" onclick="showPowerActionDlg()"> <div class="icon2"></div> <div class="warningbox">Remote computer is not powered on, click here to issue a power command.</div> </div> <div id="termTable" style="position:relative"> <table style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td class="areaHead"> <div class="toright2"> <div id="termRecordIcon" class='deskareaicon' title="Server is recording this session" style="display:none;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px;margin-left:5px"></div> <input id="termActionsBtn" type="button" title="Perform power actions on the device" onkeypress="return false" onkeydown="return false" value="Actions" onclick="deviceActionFunction()"> </div> <div> <input type="button" id="autoconnectbutton2" value="AutoConnect" onclick="autoConnectTerminal(event)" onkeypress="return false" onkeydown="return false" style="display:none"> <span id="connectbutton2span"><input type="button" id="connectbutton2" value="Connect" onclick="connectTerminal(event,1)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="connectbutton2hspan"> <input type="button" id="connectbutton2h" value="HW Connect" onclick="connectTerminal(event,2)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="disconnectbutton2span"> <input type="button" id="disconnectbutton2" value="Disconnect" onclick="connectTerminal(event,0)" onkeypress="return false" onkeydown="return false"></span> <span id="termstatus">Disconnected</span><span id="termtitle"></span> </div> </td> </tr> <tr> <td> <div class="areaProgress"><div id="termprogressbar" style=""></div></div> </td> </tr> <tr> <td id="termarea3x"> <pre id="Term"></pre> </td> </tr> <tr> <td class="areaFoot"> <div class="toright2"> <span id="TermTimer" title="Session time"></span> <span id="terminalSettingsButtons" style="display:none"> <input id="id_tcrbutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="CR+LF" title="Toggle what the return key will send" onclick="termToggleCr()"> <input id="id_tfxkeysbutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="Intel (F10 = ESC+[OM)" title="Toggle F1 to F10 keys emulation type" onclick="termToggleFx()"> <input id="id_ttypebutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="Extended Ascii" title="Toggle terminal emulation type" onclick="termToggleType()"> </span> <span id="terminalSizeDropDown"> <select id="termSizeList" onkeypress="return false"><option value="1">80x25<option value="2">100x30<option value="3" selected="">Auto</select> </span> <select id="specialkeylist" onkeypress="return false"></select> <input id="specialkeylistinput" type="button" onkeypress="return false" class="bottombutton" value="Send" title="Send the selected special key" onclick="sendSpecialKey()"> </div> <div> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="ctrlcbutton" value="Ctl-C" onclick="termSendKey(3,'ctrlcbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="ctrlxbutton" value="Ctl-X" onclick="termSendKey(24,'ctrlxbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="escbutton" value="ESC" onclick="termSendKey(27,'escbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="bsbutton" value="Backspace" onclick="termSendKey(8,'bsbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="pastebutton" value="Paste" title="Paste text into the terminal" onclick="showTermPasteDialog()"> </div> </td> </tr> </table> <div id="p12TermConsoleMsg" style="display:none;cursor:pointer;position:absolute;left:30px;top:45px;color:yellow;background-color:rgba(0,0,0,0.6);padding:10px;border-radius:5px" onclick="p12clearConsoleMsg()"></div> </div> </div> <div id="p13" style="display:none"> <div id="p13title"> <div id="p13BackButton" style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>Files - <span id="p13deviceName"></span></h1> </div> <table id="p13toolbar" cellpadding="0" cellspacing="0"> <tr> <td class="areaHead"> <div class="toright2"> <input id="filesActionsBtn" type="button" title="Perform power actions on the device" value="Actions" onclick="deviceActionFunction()"> <div id="filesRecordIcon" class='deskareaicon' title="Server is recording this session" style="display:none;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px;margin-left:5px"></div> </div> <div> <input id="p13AutoConnect" value="AutoConnect" onclick="autoConnectFiles(event)" type="button" style="display:none"> <input id="p13Connect" value="Connect" onclick="connectFiles(event)" type="button"> <span id="p13Status">Disconnected</span> </div> </td> </tr> <tr> <td class="areaHead2" valign="bottom"> <div id="p13rightOfButtons" class="toright2"></div> <div> <input type="button" id="p13FolderUp" disabled="disabled" onclick="p13folderup()" value="Up"> <input type="button" id="p13SelectAllButton" disabled="disabled" onclick="p13selectallfile()" value="Select All"> <input type="button" id="p13RenameFileButton" disabled="disabled" value="Rename" onclick="p13renamefile()"> <input type="button" id="p13DeleteFileButton" disabled="disabled" value="Delete" onclick="p13deletefile()"> <input type="button" id="p13ViewFileButton" disabled="disabled" value="Edit" onclick="p13viewfile()"> <input type="button" id="p13NewFolderButton" disabled="disabled" value="New Folder" onclick="p13createfolder()"> <input type="button" id="p13UploadButton" disabled="disabled" value="Upload" onclick="p13uploadFile()"> <input type="button" id="p13CutButton" disabled="disabled" value="Cut" onclick="p13copyFile(1)"> <input type="button" id="p13CopyButton" disabled="disabled" value="Copy" onclick="p13copyFile(0)"> <input type="button" id="p13PasteButton" disabled="disabled" value="Paste" onclick="p13pasteFile()"> <input type="button" id="p13RefreshButton" disabled="disabled" value="Refresh" onclick="p13folderup(9999)"> </div> </td> </tr> <tr> <td class="areaHead3"> <div class="toright2"> <select id="p13sortdropdown" onchange="p13updateFiles()"> <option value="1" selected="selected">Sort by name <option value="2">Sort by size <option value="3">Sort by date <option value="4">Descend by name <option value="5">Descend by size <option value="6">Descend by date </select> </div> <div> <span id="p13currentpath"></span></div> </td> </tr> </table> <div id="p13FilesConsoleMsg" style="display:none;cursor:pointer;position:absolute;left:30px;top:165px;color:yellow;background-color:rgba(0,0,0,0.6);padding:10px;border-radius:5px" onclick="p13clearConsoleMsg()"></div> <div id="p13filetable" style=""> <div id="p13bigok" style="display:none"><b>✓</b></div> <div id="p13bigfail" style="display:none"><b>✗</b></div> <span id="p13files"></span> </div> <table id="p13toolbarBottom" cellpadding="0" cellspacing="0"> <tr><td class="style6"> <span id="p13bottomstatus"></span></td></tr> </table> </div> <div id="p14" style="display:none"> <div id="p14title"> <div id="p14BackButton" style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <div id="devListToolbarViewIcons"><div class="viewSelector" onclick="deskToggleFull(event)" title="Full Screen. Hold shift to browser full screen."><div class="viewSelector5"></div></div></div> <h1>Intel® AMT - <span id="p14deviceName"></span></h1> </div> <iframe id="p14iframe" src="{{{domainurl}}}commander.htm"></iframe> </div> <div id="p15" style="display:none"> <div id="p15title"> <div id="p15BackButton" style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1><span id="p15deviceName"></span></h1> </div> <table id="consoleTable" cellpadding="0" cellspacing="0"> <tr> <td class="areaHead"> <div class="toright2"> <div id="p15coreName" title="Information about current core running on this agent"></div> <input type="button" id="p15uploadCore" value="Agent Action" onclick="p15uploadCore(event)" title="Change the agent Java Script code module"> <img onclick="p15downloadConsoleText()" style="cursor:pointer;margin-top:6px" title="Download console text" src="images/link4.png"> </div> <div id="p15statetext"></div> </td> </tr> <tr> <td> <div class="areaProgress"><div id="consoleprogressbar" style=""></div></div> </td> </tr> <tr> <td id="p15agentConsole"> <pre id="p15agentConsoleText"></pre> </td> </tr> <tr> <td class="areaFoot"> <table style="width:100%"> <tr> <td style="width:99%"> <input id="p15consoleText" style="width:100%" onkeyup="p15consoleSend(event)" onfocus="onConsoleFocus(1)" onblur="onConsoleFocus(0)"> </td> <td> </td> <td id="p15outputselecttd"> <select id="p15outputselect"> <option value="1">Agent <option value="2">MQTT </select> </td> <td style="width:1%"><input id="id_p15consoleClear" type="button" class="bottombutton" value="Clear" onclick="p15consoleClear()"></td> </tr> </table> </td> </tr> </table> </div> <div id="p16" style="display:none"> <div id="p16title"> <div id="p16BackButton" style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>Events - <span id="p16deviceName"></span></h1> </div> <table class="pTable"> <tr> <td class="h1"></td> <td class="auto-style1"> Show <select id="p16limitdropdown" onchange="refreshDeviceEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <a href="#" onclick="p3showDownloadEventsDialog(1)"><img src="images/link4.png" height="10" width="10" title="Download Events" style="cursor:pointer"></a> </td> <td class="h2"></td> </tr> </table> <div id="p16events"></div> </div> <div id="p17" style="display:none"> <div id="p17title"> <div id="p17BackButton" style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>Details - <span id="p17deviceName"></span></h1> </div> <div id="p17info"></div> </div> <div id="p20" style="display:none"> <picture id="MainMeshImage" style="border-width:0px;height:200px;width:200px;float:right"> <source type="image/webp" width="200" height="200" srcset="images/webp/mesh-256.webp"> <img alt="" width="200" height="200" src="images/mesh-256.png"> </source></picture> <div style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p20meshName"></span></h1> <p id="p20info"> </div> <div id="p30" style="display:none"> <table style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="width:auto" valign="top"> <div id="p30title"> <div style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p30userName"></span></h1> </div> <div id="p30html"></div> </td> <td style="width:20px"></td> <td style="width:200px"> <picture id="MainUserImage" style="border-width:0px;height:200px;width:200px;float:right"> <source type="image/webp" width="200" height="200" srcset="images/webp/user-256.webp"> <img alt="" width="200" height="200" src="images/user-256.png"> </source></picture> <div style="width:100%;text-align:center"><strong><span id="MainUserState"></span></strong></div> </td> </tr> </table><br> <div id="p30html2"></div> <div id="p30html3"></div> </div> <div id="p31" style="display:none"> <div style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>Events - <span id="p31userName"></span></h1> <table class="pTable"> <tr> <td class="h1"></td> <td class="auto-style1"> Show <select id="p31limitdropdown" onchange="refreshUsersEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <a href="#" onclick="p3showDownloadEventsDialog(3)"><img src="images/link4.png" height="10" width="10" title="Download Events" style="cursor:pointer"></a> </td> <td class="h2"></td> </tr> </table> <div id="p31events" style=""></div> </div> <div id="p40" style="display:none"> <h1>My Server Stats</h1> <div class="areaHead"> <div class="toright2"> <select id="p40type" onchange="updateServerTimelineStats()"> <option value="0">Connections <option value="1">Memory </select> <select id="p40time" onchange="updateServerTimelineHours()"> <option value="3">Last 3 hours <option value="8">Last 8 hours <option value="24">Last day <option value="168">Last week <option value="720">Last 30 days </select> <img src="images/link4.png" height="10" width="10" title="Download data points (.csv)" style="cursor:pointer" onclick="p40downloadEvents()"> </div> <div> <input value="Refresh" type="button" onclick="refreshServerTimelineStats()"> <label><input id="p40log" type="checkbox" onclick="updateServerTimelineHours()">Log-X</label> </div> </div> <canvas id="serverMainStats" style=""></canvas> </div> <div id="p41" style="display:none"> <h1>My Server Tracing</h1> <div class="areaHead"> <div class="toright2"> Show <select id="p41limitdropdown" onchange="displayServerTrace()"> <option value="100">Last 100 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <input value="Clear" type="button" onclick="clearServerTracing()"> <img src="images/link4.png" height="10" width="10" title="Download trace (.csv)" style="cursor:pointer" onclick="p41downloadServerTrace()"> </div> <div> <input value="Tracing" type="button" onclick="setServerTracing()"> <span id="p41traceStatus">None</span> </div> </div> <div id="p41events" style=""></div> </div> <br id="column_l_bottomgap"> </div> <div id="footer"> <div class="footer1">{{{footer}}}</div> <div class="footer2"> <a id="verifyEmailId2" style="display:none" href="#" onclick="account_showVerifyEmail()">Verify Email</a> <a href="terms">Terms & Privacy</a> </div> </div> <div id="dialog" class="noselect" style="display:none"> <div id="dialogHeader"> <div tabindex="0" id="id_dialogclose" onclick="setDialogMode()" onkeypress="if (event.key == 'Enter') setDialogMode()">✖</div> <div id="id_dialogtitle"></div> </div> <div id="dialogBody"> <div id="dialog1"> <div id="id_dialogMessage" style=""></div> </div> <div id="dialog2" style=""> <div id="id_dialogOptions"></div> </div> <div id="dialog3" style=""> <div id="d3upload"> <div>File Selection</div> <select id="d3uploadMode" onchange="d3modechange()"> <option value="1">Local file upload <option value="2">Server file selection </select> </div> <div id="d3localmode" style="display:none"> <div>Upload File</div> <form id="d3localmodeform" method="post" enctype="multipart/form-data" action="uploadfile.ashx" target="fileUploadFrame"> <input type="text" id="d3auth" name="auth" style="display:none"> <input type="text" id="d3attrib" name="attrib" style="display:none"> <input type="file" id="d3localFile" name="files" onchange="d3setActions()"> <input type="submit" id="d3submit" style="display:none"> </form> </div> <div id="d3servermode"> <div id="d3serveraction" valign="bottom"> <input type="button" id="p3FolderUp" disabled="disabled" onclick="d3folderup()" value="Up"> </div> <div id="d3serverfiles"></div> </div> </div> <div id="dialog7" style=""> <div id="d7meshkvm"> <h4>Agent Remote Desktop</h4> <div> <div>Quality</div> <select id="d7bitmapquality" dir="rtl"></select> </div> <div> <div>Scaling</div> <select id="d7bitmapscaling" style="" dir="rtl"> <option selected="selected" value="1024">100% <option value="896">87.5% <option value="768">75% <option value="640">62.5% <option value="512">50% <option value="384">37.5% <option value="256">25% <option value="128">12.5% </select> </div> <div> <div>Frame rate</div> <select id="d7framelimiter" dir="rtl"> <option selected="selected" value="50">Fast <option value="100">Medium <option value="400">Slow <option value="1000">Very slow </select> </div> </div> <div id="d7amtkvm"> <h4>Intel® AMT Hardware KVM</h4> <div> <div>Image Encoding</div> <select id="d7desktopmode"> <option value="1">RLE8, Fastest <option value="2">RLE16, Recommended <option value="3">RAW8, Slow <option value="4">RAW16, Very Slow </select> </div> <div> <div>Other Settings</div> <div id="d7otherset" style="display:block"> <label style="display:block"><input type="checkbox" id="d7showfocus">Show Focus Tool</label> <label style="display:block"><input type="checkbox" id="d7showcursor">Show Local Mouse Cursor</label> <label style="display:block"><input type="checkbox" id="d7localKeyMap">Local Keyboard Map</label> </div> </div> </div> </div> </div> <div id="idx_dlgButtonBar"> <input id="idx_dlgCancelButton" type="button" value="Cancel" style="" onclick="dialogclose(0)"> <input id="idx_dlgOkButton" type="button" value="OK" style="" onclick="dialogclose(1)"> <div><input id="idx_dlgDeleteButton" type="button" value="Delete" style="display:none" onclick="dialogclose(2)"></div> </div> </div> <iframe name="fileUploadFrame" style="display:none"></iframe> <form style="display:none" method="post" action="uploadfile.ashx" enctype="multipart/form-data" target="fileUploadFrame"><input id="p5fileDragName" name="name"><input id="p5fileDragAuthCookie" name="auth"><input id="p5fileDragSize" name="size"><input id="p5fileDragType" name="type"><input id="p5fileDragData" name="data"><input id="p5fileDragLink" name="link"><input type="submit" id="p5loginSubmit2" style="display:none"></form> <form style="display:none" method="post" action="uploadnodefile.ashx" enctype="multipart/form-data" target="fileUploadFrame"><input id="p13fileDragName" name="name"><input id="p13fileDragSize" name="size"><input id="p13fileDragType" name="type"><input id="p13fileDragData" name="data"><input id="p13fileDragLink" name="link"><input type="submit" id="p13loginSubmit2" style="display:none"></form> <audio id="chimes"><source src="sounds/chimes.mp3" type="audio/mp3"></source></audio> </div> <script>if(!String.prototype.startsWith){String.prototype.startsWith=function(a){return this.lastIndexOf(a,0)===0}}if(!String.prototype.endsWith){String.prototype.endsWith=function(a){return this.indexOf(a,this.length-a.length)!==-1}}function Q(a){return document.getElementById(a)}function QS(a){try{return Q(a).style}catch(a){}}function QE(a,b){try{Q(a).disabled=!b}catch(a){}}function QV(a,b){try{QS(a).display=(b?"":"none")}catch(a){}}function QA(a,b){Q(a).innerHTML+=b}function QH(a,b){Q(a).innerHTML=b}function QC(a){try{return Q(a).classList}catch(a){}}function inputBoxFocus(b){Q(b).focus();var a=Q(b).value;Q(b).value="";Q(b).value=a}function ReadShort(b,a){return(b.charCodeAt(a)<<8)+b.charCodeAt(a+1)}function ReadShortX(b,a){return(b.charCodeAt(a+1)<<8)+b.charCodeAt(a)}function ReadInt(b,a){return(b.charCodeAt(a)*16777216)+(b.charCodeAt(a+1)<<16)+(b.charCodeAt(a+2)<<8)+b.charCodeAt(a+3)}function ReadSInt(b,a){return(b.charCodeAt(a)<<24)+(b.charCodeAt(a+1)<<16)+(b.charCodeAt(a+2)<<8)+b.charCodeAt(a+3)}function ReadIntX(b,a){return(b.charCodeAt(a+3)*16777216)+(b.charCodeAt(a+2)<<16)+(b.charCodeAt(a+1)<<8)+b.charCodeAt(a)}function ShortToStr(a){return String.fromCharCode((a>>8)&255,a&255)}function ShortToStrX(a){return String.fromCharCode(a&255,(a>>8)&255)}function IntToStr(a){return String.fromCharCode((a>>24)&255,(a>>16)&255,(a>>8)&255,a&255)}function IntToStrX(a){return String.fromCharCode(a&255,(a>>8)&255,(a>>16)&255,(a>>24)&255)}function MakeToArray(a){if(!a||a==null||typeof a=="object"){return a}return[a]}function SplitArray(a){return a.split(",")}function Clone(a){return JSON.parse(JSON.stringify(a))}function EscapeHtml(a){if(typeof a=="string"){return a.replace(/&/g,"&").replace(/>/g,">").replace(/</g,"<").replace(/"/g,""").replace(/'/g,"'")}if(typeof a=="boolean"){return a}if(typeof a=="number"){return a}}function EscapeHtmlBreaks(a){if(typeof a=="string"){return a.replace(/&/g,"&").replace(/>/g,">").replace(/</g,"<").replace(/"/g,""").replace(/'/g,"'").replace(/\r/g,"<br />").replace(/\n/g,"").replace(/\t/g," ")}if(typeof a=="boolean"){return a}if(typeof a=="number"){return a}}function ArrayElementMove(a,b,c){a.splice(c,0,a.splice(b,1)[0])}function ObjectToStringEx(e,a){var d="";if(e!=0&&(!e||e==null)){return"(Null)"}if(e instanceof Array){for(var b in e){d+="<br />"+gap(a)+"Item #"+b+": "+ObjectToStringEx(e[b],a+1)}}else{if(e instanceof Object){for(var b in e){d+="<br />"+gap(a)+b+" = "+ObjectToStringEx(e[b],a+1)}}else{d+=EscapeHtml(e)}}return d}function ObjectToStringEx2(e,a){var d="";if(e!=0&&(!e||e==null)){return"(Null)"}if(e instanceof Array){for(var b in e){d+="\r\n"+gap2(a)+"Item #"+b+": "+ObjectToStringEx2(e[b],a+1)}}else{if(e instanceof Object){for(var b in e){d+="\r\n"+gap2(a)+b+" = "+ObjectToStringEx2(e[b],a+1)}}else{d+=EscapeHtml(e)}}return d}function gap(a){var d="";for(var b=0;b<(a*4);b++){d+=" "}return d}function gap2(a){var d="";for(var b=0;b<(a*4);b++){d+=" "}return d}function ObjectToString(a){return ObjectToStringEx(a,0)}function ObjectToString2(a){return ObjectToStringEx2(a,0)}function hex2rstr(a){if(typeof a!="string"||a.length==0){return""}var c="",b=(""+a).match(/../g),e;while(e=b.shift()){c+=String.fromCharCode("0x"+e)}return c}function char2hex(a){return(a+256).toString(16).substr(-2).toUpperCase()}function rstr2hex(b){var c="",a;for(a=0;a<b.length;a++){c+=char2hex(b.charCodeAt(a))}return c}function encode_utf8(a){return unescape(encodeURIComponent(a))}function decode_utf8(a){return decodeURIComponent(escape(a))}function data2blob(c){var b=new Array(c.length);for(var d=0;d<c.length;d++){b[d]=c.charCodeAt(d)}var a=new Blob([new Uint8Array(b)]);return a}function random(a){return Math.floor(Math.random()*a)}function trademarks(a){return a.replace(/\(R\)/g,"®").replace(/\(TM\)/g,"™")}function zeroPad(b,a){if(a==null){a=2}var d="00000000"+b;return d.substr(d.length-a)}var MeshServerCreateControl=function(b,a){var c={};c.State=0;c.connectstate=0;c.pingTimer=null;c.authCookie=a;c.trace=false;c.xxStateChange=function(e,d){if(c.State==e){return}var g=c.State;c.State=e;if(c.onStateChanged){c.onStateChanged(c,c.State,g,d)}};c.Start=function(){if(c.connectstate!=0){return}c.connectstate=0;var d=window.location.protocol.replace("http","ws")+"//"+window.location.host+b+"control.ashx";if(c.authCookie&&(c.authCookie!="")){d+="?auth="+c.authCookie}c.socket=new WebSocket(d);c.socket.onopen=function(g){c.connectstate=1};c.socket.onmessage=c.xxOnMessage;c.socket.onclose=function(g){c.Stop(g.code)};c.xxStateChange(1,0);if(c.pingTimer!=null){clearInterval(c.pingTimer)}c.pingTimer=setInterval(function(){c.send({action:"ping"})},29000)};c.Stop=function(d){c.connectstate=0;if(c.socket){c.socket.close();delete c.socket}if(c.pingTimer!=null){clearInterval(c.pingTimer);c.pingTimer=null}c.xxStateChange(0,d)};c.xxOnMessage=function(d){if(c.State==1){c.xxStateChange(2)}var g;try{g=JSON.parse(d.data)}catch(d){return}if((typeof g!="object")||(g.action=="pong")){return}if(g.action=="close"){if(g.msg){console.log(g.msg)}c.Stop(g.cause);return}if(c.trace){console.log("RECV",g)}if(c.onMessage){c.onMessage(c,g)}};c.send=function(d){if(c.socket!=null&&c.connectstate==1){if(c.trace){console.log("SEND",d)}c.socket.send(JSON.stringify(d))}};return c};function AmtStackCreateService(t){var s=new Object();s.wsman=t;s.pfx=["http://intel.com/wbem/wscim/1/amt-schema/1/","http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/","http://intel.com/wbem/wscim/1/ips-schema/1/"];s.PendingEnums=[];s.PendingBatchOperations=0;s.ActiveEnumsCount=0;s.MaxActiveEnumsCount=1;s.onProcessChanged=null;var n=0;var m=0;s.GetPendingActions=function(){return(s.PendingEnums.length*2)+(s.ActiveEnumsCount)+s.wsman.comm.PendingAjax.length+s.wsman.comm.ActiveAjaxCount+s.PendingBatchOperations};function r(){var u=s.GetPendingActions();if(n<u){n=u}if(s.onProcessChanged!=null&&m!=u){m=u;s.onProcessChanged(u,n)}if(u==0){n=0}}s.Subscribe=function(w,v,C,u,B,z,A,x,D,y){s.wsman.ExecSubscribe(s.CompleteName(w),v,C,function(G,F,E,H){r();u(s,w,E,H,B)},0,z,A,x,D,y);r()};s.UnSubscribe=function(v,u,y,w,x){s.wsman.ExecUnSubscribe(s.CompleteName(v),function(B,A,z,C){r();u(s,v,z,C,y)},0,w,x);r()};s.Get=function(v,u,x,w){s.wsman.ExecGet(s.CompleteName(v),function(A,z,y,B){r();u(s,v,y,B,x)},0,w);r()};s.Put=function(v,x,u,z,w,y){s.wsman.ExecPut(s.CompleteName(v),x,function(C,B,A,D){r();u(s,v,A,D,z)},0,w,y);r()};s.Create=function(v,x,u,y,w){s.wsman.ExecCreate(s.CompleteName(v),x,function(B,A,z,C){r();u(s,v,z,C,y)},0,w);r()};s.Delete=function(v,x,u,y,w){s.wsman.ExecDelete(s.CompleteName(v),x,function(B,A,z,C){r();u(s,v,z,C,y)},0,w);r()};s.Exec=function(x,w,u,v,A,y,z){s.wsman.ExecMethod(s.CompleteName(x),w,u,function(D,C,B,E){r();v(s,x,s.CompleteExecResponse(B),E,A)},0,y,z);r()};s.ExecWithXml=function(x,w,u,v,A,y,z){s.wsman.ExecMethodXml(s.CompleteName(x),w,execArgumentsToXml(u),function(D,C,B,E){r();v(s,x,s.CompleteExecResponse(B),E,A)},0,y,z);r()};s.Enum=function(v,u,x,w){if(s.ActiveEnumsCount<s.MaxActiveEnumsCount){s.ActiveEnumsCount++;s.wsman.ExecEnum(s.CompleteName(v),function(B,z,y,C,A){r();d(v,y,u,z,C,A)},x,w)}else{s.PendingEnums.push([v,u,x,w])}r()};function d(w,y,u,z,A,B,x){if(A!=200){u(s,w,null,A,B);c(1);return}if(y==null||y.Header.Method!="EnumerateResponse"||!y.Body.EnumerationContext){u(s,w,null,603,B);c(1);return}var v=y.Body.EnumerationContext;s.wsman.ExecPull(z,v,function(E,D,C,F){b(w,C,u,D,[],F,B,x)})}function b(z,B,u,C,x,D,E,A){if(D!=200){u(s,z,null,D,E);c(1);return}if(B==null||B.Header.Method!="PullResponse"){u(s,z,null,604,E);c(1);return}for(var w in B.Body.Items){if(B.Body.Items[w] instanceof Array){for(var y in B.Body.Items[w]){x.push(B.Body.Items[w][y])}}else{x.push(B.Body.Items[w])}}if(B.Body.EnumerationContext){var v=B.Body.EnumerationContext;s.wsman.ExecPull(C,v,function(H,G,F,I){b(z,F,u,G,x,I,E,1)})}else{c(1);u(s,z,x,D,E);r()}}function c(u){s.ActiveEnumsCount-=u;if(s.ActiveEnumsCount>=s.MaxActiveEnumsCount||s.PendingEnums.length==0){return}var v=s.PendingEnums.shift();s.Enum(v[0],v[1],v[2]);c(0)}s.BatchEnum=function(u,x,v,z,w,y){s.PendingBatchOperations+=(x.length*2);a(u,Clone(x),v,z,{},w,y);r()};function a(u,z,v,C,B,w,A){s.PendingBatchOperations-=2;var y=z.shift(),x=s.Enum;if(y[0]=="*"){x=s.Get;y=y.substring(1)}x(y,function(F,D,E,G,H){H[2][D]={response:(E==null?null:E.Body),responses:E,status:G};if(H[1].length==0||G==401||(w!=true&&G!=200&&G!=400)){s.PendingBatchOperations-=(z.length*2);r();v(s,u,H[2],G,C)}else{r();a(u,z,v,C,H[2],A)}},[u,z,B],A);r()}s.BatchGet=function(u,w,v,y,x){h({name:u,names:w,callback:v,current:0,responses:{},tag:y,pri:x});r()};function h(u){if(u.names.length<=u.current){u.callback(s,u.name,u.responses,200,u.tag)}else{s.wsman.ExecGet(s.CompleteName(u.names[u.current]),function(x,w,v,y){g(u,v,y)},u.pri);u.current++}r()}function g(u,v,w){if(v==null||w!=200){u.callback(s,u.name,null,w,u.tag)}else{u.responses[v.Header.Method]=v;h(u)}}s.CompleteName=function(u){if(u.indexOf("AMT_")==0){return s.pfx[0]+u}if(u.indexOf("CIM_")==0){return s.pfx[1]+u}if(u.indexOf("IPS_")==0){return s.pfx[2]+u}};s.CompleteExecResponse=function(u){if(u&&u!=null&&u.Body&&u.Body.ReturnValue){u.Body.ReturnValueStr=s.AmtStatusToStr(u.Body.ReturnValue)}return u};s.RequestPowerStateChange=function(v,u){s.CIM_PowerManagementService_RequestPowerStateChange(v,'<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ComputerSystem</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="CreationClassName">CIM_ComputerSystem</Selector><Selector Name="Name">ManagedSystem</Selector></SelectorSet></ReferenceParameters>',null,null,u)};s.SetBootConfigRole=function(v,u){s.CIM_BootService_SetBootConfigRole('<Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"><ResourceURI xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_BootConfigSetting</ResourceURI><SelectorSet xmlns="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd"><Selector Name="InstanceID">Intel(r) AMT: Boot Configuration 0</Selector></SelectorSet></ReferenceParameters>',v,u)};s.CancelAllQueries=function(u){s.wsman.CancelAllQueries(u)};s.AMT_AgentPresenceWatchdog_RegisterAgent=function(u){s.Exec("AMT_AgentPresenceWatchdog","RegisterAgent",{},u)};s.AMT_AgentPresenceWatchdog_AssertPresence=function(v,u){s.Exec("AMT_AgentPresenceWatchdog","AssertPresence",{SequenceNumber:v},u)};s.AMT_AgentPresenceWatchdog_AssertShutdown=function(v,u){s.Exec("AMT_AgentPresenceWatchdog","AssertShutdown",{SequenceNumber:v},u)};s.AMT_AgentPresenceWatchdog_AddAction=function(z,y,x,v,u,w,C,A,B){s.Exec("AMT_AgentPresenceWatchdog","AddAction",{OldState:z,NewState:y,EventOnTransition:x,ActionSd:v,ActionEac:u},w,C,A,B)};s.AMT_AgentPresenceWatchdog_DeleteAllActions=function(u,x,v,w){s.Exec("AMT_AgentPresenceWatchdog","DeleteAllActions",{},u,x,v,w)};s.AMT_AgentPresenceWatchdogAction_GetActionEac=function(u){s.Exec("AMT_AgentPresenceWatchdogAction","GetActionEac",{},u)};s.AMT_AgentPresenceWatchdogVA_RegisterAgent=function(u){s.Exec("AMT_AgentPresenceWatchdogVA","RegisterAgent",{},u)};s.AMT_AgentPresenceWatchdogVA_AssertPresence=function(v,u){s.Exec("AMT_AgentPresenceWatchdogVA","AssertPresence",{SequenceNumber:v},u)};s.AMT_AgentPresenceWatchdogVA_AssertShutdown=function(v,u){s.Exec("AMT_AgentPresenceWatchdogVA","AssertShutdown",{SequenceNumber:v},u)};s.AMT_AgentPresenceWatchdogVA_AddAction=function(z,y,x,v,u,w){s.Exec("AMT_AgentPresenceWatchdogVA","AddAction",{OldState:z,NewState:y,EventOnTransition:x,ActionSd:v,ActionEac:u},w)};s.AMT_AgentPresenceWatchdogVA_DeleteAllActions=function(u,v){s.Exec("AMT_AgentPresenceWatchdogVA","DeleteAllActions",{_method_dummy:u},v)};s.AMT_AuditLog_ClearLog=function(u){s.Exec("AMT_AuditLog","ClearLog",{},u)};s.AMT_AuditLog_RequestStateChange=function(v,w,u){s.Exec("AMT_AuditLog","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AMT_AuditLog_ReadRecords=function(v,u,w){s.Exec("AMT_AuditLog","ReadRecords",{StartIndex:v},u,w)};s.AMT_AuditLog_SetAuditLock=function(x,v,w,u){s.Exec("AMT_AuditLog","SetAuditLock",{LockTimeoutInSeconds:x,Flag:v,Handle:w},u)};s.AMT_AuditLog_ExportAuditLogSignature=function(v,u){s.Exec("AMT_AuditLog","ExportAuditLogSignature",{SigningMechanism:v},u)};s.AMT_AuditLog_SetSigningKeyMaterial=function(y,x,w,v,u){s.Exec("AMT_AuditLog","SetSigningKeyMaterial",{SigningMechanismType:y,SigningKey:x,LengthOfCertificates:w,Certificates:v},u)};s.AMT_AuditPolicyRule_SetAuditPolicy=function(w,u,x,y,v){s.Exec("AMT_AuditPolicyRule","SetAuditPolicy",{Enable:w,AuditedAppID:u,EventID:x,PolicyType:y},v)};s.AMT_AuditPolicyRule_SetAuditPolicyBulk=function(w,u,x,y,v){s.Exec("AMT_AuditPolicyRule","SetAuditPolicyBulk",{Enable:w,AuditedAppID:u,EventID:x,PolicyType:y},v)};s.AMT_AuthorizationService_AddUserAclEntryEx=function(x,w,y,u,z,v){s.Exec("AMT_AuthorizationService","AddUserAclEntryEx",{DigestUsername:x,DigestPassword:w,KerberosUserSid:y,AccessPermission:u,Realms:z},v)};s.AMT_AuthorizationService_EnumerateUserAclEntries=function(v,u){s.Exec("AMT_AuthorizationService","EnumerateUserAclEntries",{StartIndex:v},u)};s.AMT_AuthorizationService_GetUserAclEntryEx=function(v,u,w){s.Exec("AMT_AuthorizationService","GetUserAclEntryEx",{Handle:v},u,w)};s.AMT_AuthorizationService_UpdateUserAclEntryEx=function(y,x,w,z,u,A,v){s.Exec("AMT_AuthorizationService","UpdateUserAclEntryEx",{Handle:y,DigestUsername:x,DigestPassword:w,KerberosUserSid:z,AccessPermission:u,Realms:A},v)};s.AMT_AuthorizationService_RemoveUserAclEntry=function(v,u){s.Exec("AMT_AuthorizationService","RemoveUserAclEntry",{Handle:v},u)};s.AMT_AuthorizationService_SetAdminAclEntryEx=function(w,v,u){s.Exec("AMT_AuthorizationService","SetAdminAclEntryEx",{Username:w,DigestPassword:v},u)};s.AMT_AuthorizationService_GetAdminAclEntry=function(u){s.Exec("AMT_AuthorizationService","GetAdminAclEntry",{},u)};s.AMT_AuthorizationService_GetAdminAclEntryStatus=function(u){s.Exec("AMT_AuthorizationService","GetAdminAclEntryStatus",{},u)};s.AMT_AuthorizationService_GetAdminNetAclEntryStatus=function(u){s.Exec("AMT_AuthorizationService","GetAdminNetAclEntryStatus",{},u)};s.AMT_AuthorizationService_SetAclEnabledState=function(w,v,u,x){s.Exec("AMT_AuthorizationService","SetAclEnabledState",{Handle:w,Enabled:v},u,x)};s.AMT_AuthorizationService_GetAclEnabledState=function(v,u,w){s.Exec("AMT_AuthorizationService","GetAclEnabledState",{Handle:v},u,w)};s.AMT_EndpointAccessControlService_RequestStateChange=function(v,w,u){s.Exec("AMT_EndpointAccessControlService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AMT_EndpointAccessControlService_GetPosture=function(v,u){s.Exec("AMT_EndpointAccessControlService","GetPosture",{PostureType:v},u)};s.AMT_EndpointAccessControlService_GetPostureHash=function(v,u){s.Exec("AMT_EndpointAccessControlService","GetPostureHash",{PostureType:v},u)};s.AMT_EndpointAccessControlService_UpdatePostureState=function(v,u){s.Exec("AMT_EndpointAccessControlService","UpdatePostureState",{UpdateType:v},u)};s.AMT_EndpointAccessControlService_GetEacOptions=function(u){s.Exec("AMT_EndpointAccessControlService","GetEacOptions",{},u)};s.AMT_EndpointAccessControlService_SetEacOptions=function(v,w,u){s.Exec("AMT_EndpointAccessControlService","SetEacOptions",{EacVendors:v,PostureHashAlgorithm:w},u)};s.AMT_EnvironmentDetectionSettingData_SetSystemDefensePolicy=function(v,u){s.Exec("AMT_EnvironmentDetectionSettingData","SetSystemDefensePolicy",{Policy:v},u)};s.AMT_EnvironmentDetectionSettingData_EnableVpnRouting=function(v,u){s.Exec("AMT_EnvironmentDetectionSettingData","EnableVpnRouting",{Enable:v},u)};s.AMT_EthernetPortSettings_SetLinkPreference=function(v,w,u){s.Exec("AMT_EthernetPortSettings","SetLinkPreference",{LinkPreference:v,Timeout:w},u)};s.AMT_HeuristicPacketFilterStatistics_ResetSelectedStats=function(v,u){s.Exec("AMT_HeuristicPacketFilterStatistics","ResetSelectedStats",{SelectedStatistics:v},u)};s.AMT_KerberosSettingData_GetCredentialCacheState=function(u){s.Exec("AMT_KerberosSettingData","GetCredentialCacheState",{},u)};s.AMT_KerberosSettingData_SetCredentialCacheState=function(v,u){s.Exec("AMT_KerberosSettingData","SetCredentialCacheState",{Enable:v},u)};s.AMT_MessageLog_CancelIteration=function(v,u){s.Exec("AMT_MessageLog","CancelIteration",{IterationIdentifier:v},u)};s.AMT_MessageLog_RequestStateChange=function(v,w,u){s.Exec("AMT_MessageLog","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AMT_MessageLog_ClearLog=function(u){s.Exec("AMT_MessageLog","ClearLog",{},u)};s.AMT_MessageLog_GetRecords=function(v,w,u,x){s.Exec("AMT_MessageLog","GetRecords",{IterationIdentifier:v,MaxReadRecords:w},u,x)};s.AMT_MessageLog_GetRecord=function(v,w,u){s.Exec("AMT_MessageLog","GetRecord",{IterationIdentifier:v,PositionToNext:w},u)};s.AMT_MessageLog_PositionAtRecord=function(v,w,x,u){s.Exec("AMT_MessageLog","PositionAtRecord",{IterationIdentifier:v,MoveAbsolute:w,RecordNumber:x},u)};s.AMT_MessageLog_PositionToFirstRecord=function(u,v){s.Exec("AMT_MessageLog","PositionToFirstRecord",{},u,v)};s.AMT_MessageLog_FreezeLog=function(v,u){s.Exec("AMT_MessageLog","FreezeLog",{Freeze:v},u)};s.AMT_PublicKeyManagementService_AddCRL=function(w,v,u){s.Exec("AMT_PublicKeyManagementService","AddCRL",{Url:w,SerialNumbers:v},u)};s.AMT_PublicKeyManagementService_ResetCRLList=function(u,v){s.Exec("AMT_PublicKeyManagementService","ResetCRLList",{_method_dummy:u},v)};s.AMT_PublicKeyManagementService_AddCertificate=function(v,u){s.Exec("AMT_PublicKeyManagementService","AddCertificate",{CertificateBlob:v},u)};s.AMT_PublicKeyManagementService_AddTrustedRootCertificate=function(v,u){s.Exec("AMT_PublicKeyManagementService","AddTrustedRootCertificate",{CertificateBlob:v},u)};s.AMT_PublicKeyManagementService_AddKey=function(v,u){s.Exec("AMT_PublicKeyManagementService","AddKey",{KeyBlob:v},u)};s.AMT_PublicKeyManagementService_GeneratePKCS10Request=function(w,v,x,u){s.Exec("AMT_PublicKeyManagementService","GeneratePKCS10Request",{KeyPair:w,DNName:v,Usage:x},u)};s.AMT_PublicKeyManagementService_GeneratePKCS10RequestEx=function(v,x,w,u){s.Exec("AMT_PublicKeyManagementService","GeneratePKCS10RequestEx",{KeyPair:v,SigningAlgorithm:x,NullSignedCertificateRequest:w},u)};s.AMT_PublicKeyManagementService_GenerateKeyPair=function(v,w,u){s.Exec("AMT_PublicKeyManagementService","GenerateKeyPair",{KeyAlgorithm:v,KeyLength:w},u)};s.AMT_RedirectionService_RequestStateChange=function(v,u){s.Exec("AMT_RedirectionService","RequestStateChange",{RequestedState:v},u)};s.AMT_RedirectionService_TerminateSession=function(v,u){s.Exec("AMT_RedirectionService","TerminateSession",{SessionType:v},u)};s.AMT_RemoteAccessService_AddMpServer=function(u,z,B,v,x,C,A,y,w){s.Exec("AMT_RemoteAccessService","AddMpServer",{AccessInfo:u,InfoFormat:z,Port:B,AuthMethod:v,Certificate:x,Username:C,Password:A,CN:y},w)};s.AMT_RemoteAccessService_AddRemoteAccessPolicyRule=function(x,y,v,w,u){s.Exec("AMT_RemoteAccessService","AddRemoteAccessPolicyRule",{Trigger:x,TunnelLifeTime:y,ExtendedData:v,MpServer:w},u)};s.AMT_RemoteAccessService_CloseRemoteAccessConnection=function(u,v){s.Exec("AMT_RemoteAccessService","CloseRemoteAccessConnection",{_method_dummy:u},v)};s.AMT_SetupAndConfigurationService_CommitChanges=function(u,v){s.Exec("AMT_SetupAndConfigurationService","CommitChanges",{_method_dummy:u},v)};s.AMT_SetupAndConfigurationService_Unprovision=function(v,u){s.Exec("AMT_SetupAndConfigurationService","Unprovision",{ProvisioningMode:v},u)};s.AMT_SetupAndConfigurationService_PartialUnprovision=function(u,v){s.Exec("AMT_SetupAndConfigurationService","PartialUnprovision",{_method_dummy:u},v)};s.AMT_SetupAndConfigurationService_ResetFlashWearOutProtection=function(u,v){s.Exec("AMT_SetupAndConfigurationService","ResetFlashWearOutProtection",{_method_dummy:u},v)};s.AMT_SetupAndConfigurationService_ExtendProvisioningPeriod=function(v,u){s.Exec("AMT_SetupAndConfigurationService","ExtendProvisioningPeriod",{Duration:v},u)};s.AMT_SetupAndConfigurationService_SetMEBxPassword=function(v,u){s.Exec("AMT_SetupAndConfigurationService","SetMEBxPassword",{Password:v},u)};s.AMT_SetupAndConfigurationService_SetTLSPSK=function(v,w,u){s.Exec("AMT_SetupAndConfigurationService","SetTLSPSK",{PID:v,PPS:w},u)};s.AMT_SetupAndConfigurationService_GetProvisioningAuditRecord=function(u){s.Exec("AMT_SetupAndConfigurationService","GetProvisioningAuditRecord",{},u)};s.AMT_SetupAndConfigurationService_GetUuid=function(u){s.Exec("AMT_SetupAndConfigurationService","GetUuid",{},u)};s.AMT_SetupAndConfigurationService_GetUnprovisionBlockingComponents=function(u){s.Exec("AMT_SetupAndConfigurationService","GetUnprovisionBlockingComponents",{},u)};s.AMT_SetupAndConfigurationService_GetProvisioningAuditRecordV2=function(u){s.Exec("AMT_SetupAndConfigurationService","GetProvisioningAuditRecordV2",{},u)};s.AMT_SystemDefensePolicy_GetTimeout=function(u){s.Exec("AMT_SystemDefensePolicy","GetTimeout",{},u)};s.AMT_SystemDefensePolicy_SetTimeout=function(v,u){s.Exec("AMT_SystemDefensePolicy","SetTimeout",{Timeout:v},u)};s.AMT_SystemDefensePolicy_UpdateStatistics=function(v,x,u,z,w,y){s.Exec("AMT_SystemDefensePolicy","UpdateStatistics",{NetworkInterface:v,ResetOnRead:x},u,z,w,y)};s.AMT_SystemPowerScheme_SetPowerScheme=function(u,v,w){s.Exec("AMT_SystemPowerScheme","SetPowerScheme",{},u,w,0,{InstanceID:v})};s.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch=function(u,v){s.Exec("AMT_TimeSynchronizationService","GetLowAccuracyTimeSynch",{},u,v)};s.AMT_TimeSynchronizationService_SetHighAccuracyTimeSynch=function(v,x,y,u,w){s.Exec("AMT_TimeSynchronizationService","SetHighAccuracyTimeSynch",{Ta0:v,Tm1:x,Tm2:y},u,w)};s.AMT_UserInitiatedConnectionService_RequestStateChange=function(v,w,u){s.Exec("AMT_UserInitiatedConnectionService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AMT_WebUIService_RequestStateChange=function(v,w,u){s.Exec("AMT_WebUIService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AMT_WiFiPortConfigurationService_AddWiFiSettings=function(y,z,x,w,u,v){s.ExecWithXml("AMT_WiFiPortConfigurationService","AddWiFiSettings",{WiFiEndpoint:y,WiFiEndpointSettingsInput:z,IEEE8021xSettingsInput:x,ClientCredential:w,CACredential:u},v)};s.AMT_WiFiPortConfigurationService_UpdateWiFiSettings=function(y,z,x,w,u,v){s.ExecWithXml("AMT_WiFiPortConfigurationService","UpdateWiFiSettings",{WiFiEndpointSettings:y,WiFiEndpointSettingsInput:z,IEEE8021xSettingsInput:x,ClientCredential:w,CACredential:u},v)};s.AMT_WiFiPortConfigurationService_DeleteAllITProfiles=function(u,v){s.Exec("AMT_WiFiPortConfigurationService","DeleteAllITProfiles",{_method_dummy:u},v)};s.AMT_WiFiPortConfigurationService_DeleteAllUserProfiles=function(u,v){s.Exec("AMT_WiFiPortConfigurationService","DeleteAllUserProfiles",{_method_dummy:u},v)};s.CIM_Account_RequestStateChange=function(v,w,u){s.Exec("CIM_Account","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_AccountManagementService_CreateAccount=function(w,u,v){s.Exec("CIM_AccountManagementService","CreateAccount",{System:w,AccountTemplate:u},v)};s.CIM_BootConfigSetting_ChangeBootOrder=function(v,u){s.Exec("CIM_BootConfigSetting","ChangeBootOrder",{Source:v},u)};s.CIM_BootService_SetBootConfigRole=function(u,w,v){s.Exec("CIM_BootService","SetBootConfigRole",{BootConfigSetting:u,Role:w},v,0,1)};s.CIM_Card_ConnectorPower=function(v,w,u){s.Exec("CIM_Card","ConnectorPower",{Connector:v,PoweredOn:w},u)};s.CIM_Card_IsCompatible=function(v,u){s.Exec("CIM_Card","IsCompatible",{ElementToCheck:v},u)};s.CIM_Chassis_IsCompatible=function(v,u){s.Exec("CIM_Chassis","IsCompatible",{ElementToCheck:v},u)};s.CIM_Fan_SetSpeed=function(v,u){s.Exec("CIM_Fan","SetSpeed",{DesiredSpeed:v},u)};s.CIM_KVMRedirectionSAP_RequestStateChange=function(v,w,u){s.Exec("CIM_KVMRedirectionSAP","RequestStateChange",{RequestedState:v},u)};s.CIM_MediaAccessDevice_LockMedia=function(v,u){s.Exec("CIM_MediaAccessDevice","LockMedia",{Lock:v},u)};s.CIM_MediaAccessDevice_SetPowerState=function(v,w,u){s.Exec("CIM_MediaAccessDevice","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_MediaAccessDevice_Reset=function(u){s.Exec("CIM_MediaAccessDevice","Reset",{},u)};s.CIM_MediaAccessDevice_EnableDevice=function(v,u){s.Exec("CIM_MediaAccessDevice","EnableDevice",{Enabled:v},u)};s.CIM_MediaAccessDevice_OnlineDevice=function(v,u){s.Exec("CIM_MediaAccessDevice","OnlineDevice",{Online:v},u)};s.CIM_MediaAccessDevice_QuiesceDevice=function(v,u){s.Exec("CIM_MediaAccessDevice","QuiesceDevice",{Quiesce:v},u)};s.CIM_MediaAccessDevice_SaveProperties=function(u){s.Exec("CIM_MediaAccessDevice","SaveProperties",{},u)};s.CIM_MediaAccessDevice_RestoreProperties=function(u){s.Exec("CIM_MediaAccessDevice","RestoreProperties",{},u)};s.CIM_MediaAccessDevice_RequestStateChange=function(v,w,u){s.Exec("CIM_MediaAccessDevice","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_PhysicalFrame_IsCompatible=function(v,u){s.Exec("CIM_PhysicalFrame","IsCompatible",{ElementToCheck:v},u)};s.CIM_PhysicalPackage_IsCompatible=function(v,u){s.Exec("CIM_PhysicalPackage","IsCompatible",{ElementToCheck:v},u)};s.CIM_PowerManagementService_RequestPowerStateChange=function(w,v,x,y,u){s.Exec("CIM_PowerManagementService","RequestPowerStateChange",{PowerState:w,ManagedElement:v,Time:x,TimeoutPeriod:y},u,0,1)};s.CIM_PowerSupply_SetPowerState=function(v,w,u){s.Exec("CIM_PowerSupply","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_PowerSupply_Reset=function(u){s.Exec("CIM_PowerSupply","Reset",{},u)};s.CIM_PowerSupply_EnableDevice=function(v,u){s.Exec("CIM_PowerSupply","EnableDevice",{Enabled:v},u)};s.CIM_PowerSupply_OnlineDevice=function(v,u){s.Exec("CIM_PowerSupply","OnlineDevice",{Online:v},u)};s.CIM_PowerSupply_QuiesceDevice=function(v,u){s.Exec("CIM_PowerSupply","QuiesceDevice",{Quiesce:v},u)};s.CIM_PowerSupply_SaveProperties=function(u){s.Exec("CIM_PowerSupply","SaveProperties",{},u)};s.CIM_PowerSupply_RestoreProperties=function(u){s.Exec("CIM_PowerSupply","RestoreProperties",{},u)};s.CIM_PowerSupply_RequestStateChange=function(v,w,u){s.Exec("CIM_PowerSupply","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_Processor_SetPowerState=function(v,w,u){s.Exec("CIM_Processor","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_Processor_Reset=function(u){s.Exec("CIM_Processor","Reset",{},u)};s.CIM_Processor_EnableDevice=function(v,u){s.Exec("CIM_Processor","EnableDevice",{Enabled:v},u)};s.CIM_Processor_OnlineDevice=function(v,u){s.Exec("CIM_Processor","OnlineDevice",{Online:v},u)};s.CIM_Processor_QuiesceDevice=function(v,u){s.Exec("CIM_Processor","QuiesceDevice",{Quiesce:v},u)};s.CIM_Processor_SaveProperties=function(u){s.Exec("CIM_Processor","SaveProperties",{},u)};s.CIM_Processor_RestoreProperties=function(u){s.Exec("CIM_Processor","RestoreProperties",{},u)};s.CIM_Processor_RequestStateChange=function(v,w,u){s.Exec("CIM_Processor","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_RecordLog_ClearLog=function(u){s.Exec("CIM_RecordLog","ClearLog",{},u)};s.CIM_RecordLog_RequestStateChange=function(v,w,u){s.Exec("CIM_RecordLog","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_RedirectionService_RequestStateChange=function(v,w,u){s.Exec("CIM_RedirectionService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_Sensor_SetPowerState=function(v,w,u){s.Exec("CIM_Sensor","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_Sensor_Reset=function(u){s.Exec("CIM_Sensor","Reset",{},u)};s.CIM_Sensor_EnableDevice=function(v,u){s.Exec("CIM_Sensor","EnableDevice",{Enabled:v},u)};s.CIM_Sensor_OnlineDevice=function(v,u){s.Exec("CIM_Sensor","OnlineDevice",{Online:v},u)};s.CIM_Sensor_QuiesceDevice=function(v,u){s.Exec("CIM_Sensor","QuiesceDevice",{Quiesce:v},u)};s.CIM_Sensor_SaveProperties=function(u){s.Exec("CIM_Sensor","SaveProperties",{},u)};s.CIM_Sensor_RestoreProperties=function(u){s.Exec("CIM_Sensor","RestoreProperties",{},u)};s.CIM_Sensor_RequestStateChange=function(v,w,u){s.Exec("CIM_Sensor","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_StatisticalData_ResetSelectedStats=function(v,u){s.Exec("CIM_StatisticalData","ResetSelectedStats",{SelectedStatistics:v},u)};s.CIM_Watchdog_KeepAlive=function(u){s.Exec("CIM_Watchdog","KeepAlive",{},u)};s.CIM_Watchdog_SetPowerState=function(v,w,u){s.Exec("CIM_Watchdog","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_Watchdog_Reset=function(u){s.Exec("CIM_Watchdog","Reset",{},u)};s.CIM_Watchdog_EnableDevice=function(v,u){s.Exec("CIM_Watchdog","EnableDevice",{Enabled:v},u)};s.CIM_Watchdog_OnlineDevice=function(v,u){s.Exec("CIM_Watchdog","OnlineDevice",{Online:v},u)};s.CIM_Watchdog_QuiesceDevice=function(v,u){s.Exec("CIM_Watchdog","QuiesceDevice",{Quiesce:v},u)};s.CIM_Watchdog_SaveProperties=function(u){s.Exec("CIM_Watchdog","SaveProperties",{},u)};s.CIM_Watchdog_RestoreProperties=function(u){s.Exec("CIM_Watchdog","RestoreProperties",{},u)};s.CIM_Watchdog_RequestStateChange=function(v,w,u){s.Exec("CIM_Watchdog","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.CIM_WiFiPort_SetPowerState=function(v,w,u){s.Exec("CIM_WiFiPort","SetPowerState",{PowerState:v,Time:w},u)};s.CIM_WiFiPort_Reset=function(u){s.Exec("CIM_WiFiPort","Reset",{},u)};s.CIM_WiFiPort_EnableDevice=function(v,u){s.Exec("CIM_WiFiPort","EnableDevice",{Enabled:v},u)};s.CIM_WiFiPort_OnlineDevice=function(v,u){s.Exec("CIM_WiFiPort","OnlineDevice",{Online:v},u)};s.CIM_WiFiPort_QuiesceDevice=function(v,u){s.Exec("CIM_WiFiPort","QuiesceDevice",{Quiesce:v},u)};s.CIM_WiFiPort_SaveProperties=function(u){s.Exec("CIM_WiFiPort","SaveProperties",{},u)};s.CIM_WiFiPort_RestoreProperties=function(u){s.Exec("CIM_WiFiPort","RestoreProperties",{},u)};s.CIM_WiFiPort_RequestStateChange=function(v,w,u){s.Exec("CIM_WiFiPort","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.IPS_HostBasedSetupService_Setup=function(y,z,x,v,A,w,u){s.Exec("IPS_HostBasedSetupService","Setup",{NetAdminPassEncryptionType:y,NetworkAdminPassword:z,McNonce:x,Certificate:v,SigningAlgorithm:A,DigitalSignature:w},u)};s.IPS_HostBasedSetupService_AddNextCertInChain=function(x,v,w,u){s.Exec("IPS_HostBasedSetupService","AddNextCertInChain",{NextCertificate:x,IsLeafCertificate:v,IsRootCertificate:w},u)};s.IPS_HostBasedSetupService_AdminSetup=function(x,y,w,z,v,u){s.Exec("IPS_HostBasedSetupService","AdminSetup",{NetAdminPassEncryptionType:x,NetworkAdminPassword:y,McNonce:w,SigningAlgorithm:z,DigitalSignature:v},u)};s.IPS_HostBasedSetupService_UpgradeClientToAdmin=function(w,x,v,u){s.Exec("IPS_HostBasedSetupService","UpgradeClientToAdmin",{McNonce:w,SigningAlgorithm:x,DigitalSignature:v},u)};s.IPS_HostBasedSetupService_DisableClientControlMode=function(u,v){s.Exec("IPS_HostBasedSetupService","DisableClientControlMode",{_method_dummy:u},v)};s.IPS_KVMRedirectionSettingData_TerminateSession=function(u){s.Exec("IPS_KVMRedirectionSettingData","TerminateSession",{},u)};s.IPS_OptInService_StartOptIn=function(u){s.Exec("IPS_OptInService","StartOptIn",{},u)};s.IPS_OptInService_CancelOptIn=function(u){s.Exec("IPS_OptInService","CancelOptIn",{},u)};s.IPS_OptInService_SendOptInCode=function(v,u){s.Exec("IPS_OptInService","SendOptInCode",{OptInCode:v},u)};s.IPS_OptInService_StartService=function(u){s.Exec("IPS_OptInService","StartService",{},u)};s.IPS_OptInService_StopService=function(u){s.Exec("IPS_OptInService","StopService",{},u)};s.IPS_OptInService_RequestStateChange=function(v,w,u){s.Exec("IPS_OptInService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.IPS_ProvisioningRecordLog_RequestStateChange=function(v,w,u){s.Exec("IPS_ProvisioningRecordLog","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.IPS_ProvisioningRecordLog_ClearLog=function(u,v){s.Exec("IPS_ProvisioningRecordLog","ClearLog",{_method_dummy:u},v)};s.IPS_SecIOService_RequestStateChange=function(v,w,u){s.Exec("IPS_SecIOService","RequestStateChange",{RequestedState:v,TimeoutPeriod:w},u)};s.AmtStatusToStr=function(u){if(s.AmtStatusCodes[u]){return s.AmtStatusCodes[u]}else{return"UNKNOWN_ERROR"}};s.AmtStatusCodes={0:"SUCCESS",1:"INTERNAL_ERROR",2:"NOT_READY",3:"INVALID_PT_MODE",4:"INVALID_MESSAGE_LENGTH",5:"TABLE_FINGERPRINT_NOT_AVAILABLE",6:"INTEGRITY_CHECK_FAILED",7:"UNSUPPORTED_ISVS_VERSION",8:"APPLICATION_NOT_REGISTERED",9:"INVALID_REGISTRATION_DATA",10:"APPLICATION_DOES_NOT_EXIST",11:"NOT_ENOUGH_STORAGE",12:"INVALID_NAME",13:"BLOCK_DOES_NOT_EXIST",14:"INVALID_BYTE_OFFSET",15:"INVALID_BYTE_COUNT",16:"NOT_PERMITTED",17:"NOT_OWNER",18:"BLOCK_LOCKED_BY_OTHER",19:"BLOCK_NOT_LOCKED",20:"INVALID_GROUP_PERMISSIONS",21:"GROUP_DOES_NOT_EXIST",22:"INVALID_MEMBER_COUNT",23:"MAX_LIMIT_REACHED",24:"INVALID_AUTH_TYPE",25:"AUTHENTICATION_FAILED",26:"INVALID_DHCP_MODE",27:"INVALID_IP_ADDRESS",28:"INVALID_DOMAIN_NAME",29:"UNSUPPORTED_VERSION",30:"REQUEST_UNEXPECTED",31:"INVALID_TABLE_TYPE",32:"INVALID_PROVISIONING_STATE",33:"UNSUPPORTED_OBJECT",34:"INVALID_TIME",35:"INVALID_INDEX",36:"INVALID_PARAMETER",37:"INVALID_NETMASK",38:"FLASH_WRITE_LIMIT_EXCEEDED",39:"INVALID_IMAGE_LENGTH",40:"INVALID_IMAGE_SIGNATURE",41:"PROPOSE_ANOTHER_VERSION",42:"INVALID_PID_FORMAT",43:"INVALID_PPS_FORMAT",44:"BIST_COMMAND_BLOCKED",45:"CONNECTION_FAILED",46:"CONNECTION_TOO_MANY",47:"RNG_GENERATION_IN_PROGRESS",48:"RNG_NOT_READY",49:"CERTIFICATE_NOT_READY",1024:"DISABLED_BY_POLICY",2048:"NETWORK_IF_ERROR_BASE",2049:"UNSUPPORTED_OEM_NUMBER",2050:"UNSUPPORTED_BOOT_OPTION",2051:"INVALID_COMMAND",2052:"INVALID_SPECIAL_COMMAND",2053:"INVALID_HANDLE",2054:"INVALID_PASSWORD",2055:"INVALID_REALM",2056:"STORAGE_ACL_ENTRY_IN_USE",2057:"DATA_MISSING",2058:"DUPLICATE",2059:"EVENTLOG_FROZEN",2060:"PKI_MISSING_KEYS",2061:"PKI_GENERATING_KEYS",2062:"INVALID_KEY",2063:"INVALID_CERT",2064:"CERT_KEY_NOT_MATCH",2065:"MAX_KERB_DOMAIN_REACHED",2066:"UNSUPPORTED",2067:"INVALID_PRIORITY",2068:"NOT_FOUND",2069:"INVALID_CREDENTIALS",2070:"INVALID_PASSPHRASE",2072:"NO_ASSOCIATION",2075:"AUDIT_FAIL",2076:"BLOCKING_COMPONENT",2081:"USER_CONSENT_REQUIRED",4096:"APP_INTERNAL_ERROR",4097:"NOT_INITIALIZED",4098:"LIB_VERSION_UNSUPPORTED",4099:"INVALID_PARAM",4100:"RESOURCES",4101:"HARDWARE_ACCESS_ERROR",4102:"REQUESTOR_NOT_REGISTERED",4103:"NETWORK_ERROR",4104:"PARAM_BUFFER_TOO_SHORT",4105:"COM_NOT_INITIALIZED_IN_THREAD",4106:"URL_REQUIRED"};s.GetMessageLog=function(u,v){s.AMT_MessageLog_PositionToFirstRecord(k,[u,v,[]])};function k(w,u,v,x,y){if(x!=200||v.Body.ReturnValue!="0"){y[0](s,null,y[2]);return}s.AMT_MessageLog_GetRecords(v.Body.IterationIdentifier,390,l,y)}function l(D,A,C,E,G){if(E!=200||C.Body.ReturnValue!="0"){G[0](s,null,G[2]);return}var y,z,I,v,u=G[2],F=new Date(),H,B=C.Body.RecordArray;if(typeof B==="string"){C.Body.RecordArray=[C.Body.RecordArray]}for(y in B){v=null;try{v=window.atob(B[y])}catch(w){}if(v!=null){H=ReadIntX(v,0);if((H>0)&&(H<4294967295)){I={DeviceAddress:v.charCodeAt(4),EventSensorType:v.charCodeAt(5),EventType:v.charCodeAt(6),EventOffset:v.charCodeAt(7),EventSourceType:v.charCodeAt(8),EventSeverity:v.charCodeAt(9),SensorNumber:v.charCodeAt(10),Entity:v.charCodeAt(11),EntityInstance:v.charCodeAt(12),EventData:[],Time:new Date((H+(F.getTimezoneOffset()*60))*1000)};for(z=13;z<21;z++){I.EventData.push(v.charCodeAt(z))}I.EntityStr=o[I.Entity];I.Desc=j(I.EventSensorType,I.EventOffset,I.EventData,I.Entity);if(!I.EntityStr){I.EntityStr="Unknown"}u.push(I)}}}if(C.Body.NoMoreRecords!=true){s.AMT_MessageLog_GetRecords(C.Body.IterationIdentifier,390,l,[G[0],u,G[2]])}else{G[0](s,u,G[2])}}var e="Platform firmware (e.g. BIOS)|SMI handler|ISV system management software|Alert ASIC|IPMI|BIOS vendor|System board set vendor|System integrator|Third party add-in|OSV|NIC|System management card".split("|");var p="Unspecified.|No system memory is physically installed in the system.|No usable system memory, all installed memory has experienced an unrecoverable failure.|Unrecoverable hard-disk/ATAPI/IDE device failure.|Unrecoverable system-board failure.|Unrecoverable diskette subsystem failure.|Unrecoverable hard-disk controller failure.|Unrecoverable PS/2 or USB keyboard failure.|Removable boot media not found.|Unrecoverable video controller failure.|No video device detected.|Firmware (BIOS) ROM corruption detected.|CPU voltage mismatch (processors that share same supply have mismatched voltage requirements)|CPU speed matching failure".split("|");var q="Unspecified.|Memory initialization.|Starting hard-disk initialization and test|Secondary processor(s) initialization|User authentication|User-initiated system setup|USB resource configuration|PCI resource configuration|Option ROM initialization|Video initialization|Cache initialization|SM Bus initialization|Keyboard controller initialization|Embedded controller/management controller initialization|Docking station attachment|Enabling docking station|Docking station ejection|Disabling docking station|Calling operating system wake-up vector|Starting operating system boot process|Baseboard or motherboard initialization|reserved|Floppy initialization|Keyboard test|Pointing device test|Primary processor initialization".split("|");var o="Unspecified|Other|Unknown|Processor|Disk|Peripheral|System management module|System board|Memory module|Processor module|Power supply|Add in card|Front panel board|Back panel board|Power system board|Drive backplane|System internal expansion board|Other system board|Processor board|Power unit|Power module|Power management board|Chassis back panel board|System chassis|Sub chassis|Other chassis board|Disk drive bay|Peripheral bay|Device bay|Fan cooling|Cooling unit|Cable interconnect|Memory device|System management software|BIOS|Intel(r) ME|System bus|Group|Intel(r) ME|External environment|Battery|Processing blade|Connectivity switch|Processor/memory module|I/O module|Processor I/O module|Management controller firmware|IPMI channel|PCI bus|PCI express bus|SCSI bus|SATA/SAS bus|Processor front side bus".split("|");s.RealmNames="||Redirection|PT Administration|Hardware Asset|Remote Control|Storage|Event Manager|Storage Admin|Agent Presence Local|Agent Presence Remote|Circuit Breaker|Network Time|General Information|Firmware Update|EIT|LocalUN|Endpoint Access Control|Endpoint Access Control Admin|Event Log Reader|Audit Log|ACL Realm|||Local System".split("|");s.WatchdogCurrentStates={1:"Not Started",2:"Stopped",4:"Running",8:"Expired",16:"Suspended"};function j(x,w,v,u){if(x==15){if(v[0]==235){return"Invalid Data"}if(w==0){return p[v[1]]}return q[v[1]]}if(x==18&&v[0]==170){return"Agent watchdog "+char2hex(v[4])+char2hex(v[3])+char2hex(v[2])+char2hex(v[1])+"-"+char2hex(v[6])+char2hex(v[5])+"-... changed to "+s.WatchdogCurrentStates[v[7]]}if(x==6){return"Authentication failed "+(v[1]+(v[2]<<8))+" times. The system may be under attack."}if(x==30){return"No bootable media"}if(x==32){return"Operating system lockup or power interrupt"}if(x==35){return"System boot failure"}if(x==37){return"System firmware started (at least one CPU is properly executing)."}return"Unknown Sensor Type #"+x}return s}var md5_k=[];for(var i=0;i<64;){md5_k[i]=0|(Math.abs(Math.sin(++i))*4294967296)}function hex_md5(p){var g,k,l,o,r=[],q=unescape(encodeURI(p)),e=q.length,m=[g=1732584193,k=-271733879,~g,~k],n=0;for(;n<=e;){r[n>>2]|=(q.charCodeAt(n)||128)<<8*(n++%4)}r[p=(e+8>>6)*16+14]=e*8;n=0;for(;n<p;n+=16){e=m;o=0;for(;o<64;){e=[l=e[3],((g=e[1]|0)+((l=((e[0]+[g&(k=e[2])|~g&l,l&g|~l&k,g^k^l,k^(g|~l)][e=o>>4])+(md5_k[o]+(r[[o,5*o+1,3*o+5,7*o][e]%16+n]|0))))<<(e=[7,12,17,22,5,9,14,20,4,11,16,23,6,10,15,21][4*e+o++%4])|l>>>32-e)),g,k]}for(o=4;o;){m[--o]=m[o]+e[o]}}p="";for(;o<32;){p+=((m[o>>3]>>((1^o++&7)*4))&15).toString(16)}return p}function rstr_md5(a){return hex2rstr(hex_md5(a))}function execArgumentsToXml(c){if(c===undefined||c===null){return null}var d="";for(var b in c){var a=c[b];if(!a){continue}if(a.__parameterType==="reference"){d+=referenceToXml(b,a)}else{d+=instanceToXml(b,a)}}return d}function instanceToXml(d,c){if(c===undefined||c===null){return null}var b=!!c.__namespace;var j=b?"<q:":"<";var a=b?"</q:":"</";var e=b?(' xmlns:q="'+c.__namespace+'"'):"";var h="<r:"+d+e+">";for(var g in c){if(!c.hasOwnProperty(g)||g.indexOf("__")===0){continue}if(typeof c[g]==="function"||Array.isArray(c[g])){continue}if(typeof c[g]==="object"){console.error("only convert one level down...")}else{h+=j+g+">"+c[g].toString()+a+g+">"}}h+="</r:"+d+">";return h}function referenceToXml(b,a){if(a===undefined||a===null){return null}var c="<r:"+b+"><a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>"+a.__resourceUri+"</w:ResourceURI><w:SelectorSet>";for(var d in a){if(!a.hasOwnProperty(d)||d.indexOf("__")===0){continue}if(typeof a[d]==="function"||typeof a[d]==="object"||Array.isArray(a[d])){continue}c+='<w:Selector Name="'+d+'">'+a[d].toString()+"</w:Selector>"}c+="</w:SelectorSet></a:ReferenceParameters></r:"+b+">";return c}function GetSidString(c){var b="S-"+c.charCodeAt(0)+"-"+c.charCodeAt(7);for(var a=2;a<(c.length/4);a++){b+="-"+ReadIntX(c,a*4)}return b}function GetSidByteArray(d){if(!d||d==null){return null}var c=d.split("-");if(c.length<4||(c[0]!="s"&&c[0]!="S")){return null}for(var a=1;a<c.length;a++){var e=parseInt(c[a]);if(e!=c[a]){return null}c[a]=e}var b=String.fromCharCode(c[1])+String.fromCharCode(c.length-3)+ShortToStr(Math.floor(c[2]/Math.pow(2,32)))+IntToStr((c[2])&65535);for(var a=3;a<c.length;a++){b+=IntToStrX(c[a])}return b}var WsmanStackCreateService=function(h,l,n,k,m,g){var j={};j.NextMessageId=1;j.Address="/wsman";j.comm=CreateWsmanComm(h,l,n,k,m,g);j.PerformAjax=function(q,o,s,r,p){if(p==undefined){p=""}j.comm.PerformAjax('<?xml version="1.0" encoding="utf-8"?><Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns="http://www.w3.org/2003/05/soap-envelope" '+p+"><Header><a:Action>"+q,function(t,u,v){if(u!=200){o(j,null,{Header:{HttpError:u}},u,v);return}var w=j.ParseWsman(t);if(!w||w==null){o(j,null,{Header:{HttpError:u}},601,v)}else{o(j,w.Header.ResourceURI,w,200,v)}},s,r)};j.CancelAllQueries=function(o){j.comm.CancelAllQueries(o)};j.GetNameFromUrl=function(o){var p=o.lastIndexOf("/");return(p==-1)?o:o.substring(p+1)};j.ExecSubscribe=function(w,q,z,o,y,v,x,t,A,u){var r="",s="";if(A!=undefined&&u!=undefined){r="<t:IssuedTokens><t:RequestSecurityTokenResponse><t:TokenType>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken</t:TokenType><t:RequestedSecurityToken><se:UsernameToken><se:Username>"+A+'</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">'+u+"</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>";s='<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'}if(t!=undefined&&t!=null){t="<a:ReferenceParameters>"+t+"</a:ReferenceParameters>"}else{t=""}var p="http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+w+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+d(x)+r+'</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.dmtf.org/wbem/wsman/1/wsman/'+q+'"><e:NotifyTo><a:Address>'+z+"</a:Address></e:NotifyTo>"+s+"</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>";j.PerformAjax(p+"</Body></Envelope>",o,y,v,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing" xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:se="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:m="http://x.com"')};j.ExecUnSubscribe=function(r,o,t,q,s){var p="http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+r+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+d(s)+"</Header><Body><e:Unsubscribe/>";j.PerformAjax(p+"</Body></Envelope>",o,t,q,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"')};j.ExecPut=function(s,r,o,u,q,t){var p="http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+s+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout>"+d(t)+"</Header><Body>"+c(s,r);j.PerformAjax(p+"</Body></Envelope>",o,u,q)};j.ExecCreate=function(u,t,o,w,s,v){var r=j.GetNameFromUrl(u);var p="http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+u+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+d(v)+"</Header><Body><g:"+r+' xmlns:g="'+u+'">';for(var q in t){p+="<g:"+q+">"+t[q]+"</g:"+q+">"}j.PerformAjax(p+"</g:"+r+"></Body></Envelope>",o,w,s)};j.ExecCreateXml=function(s,o,p,u,r){var q=j.GetNameFromUrl(s),t="";j.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+s+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout></Header><Body><r:"+q+' xmlns:r="'+s+'">'+o+"</r:"+q+"></Body></Envelope>",p,u,r)};j.ExecDelete=function(s,r,o,t,q){var p="http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+s+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+d(r)+"</Header><Body /></Envelope>";j.PerformAjax(p,o,t,q)};j.ExecGet=function(q,o,r,p){j.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+q+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body /></Envelope>",o,r,p)};j.ExecMethod=function(u,s,o,q,w,t,v){var p="";for(var r in o){if(o[r]!=null){if(Array.isArray(o[r])){for(var y in o[r]){p+="<r:"+r+">"+o[r][y]+"</r:"+r+">"}}else{p+="<r:"+r+">"+o[r]+"</r:"+r+">"}}}j.ExecMethodXml(u,s,p,q,w,t,v)};j.ExecMethodXml=function(s,q,o,p,u,r,t){j.PerformAjax(s+"/"+q+"</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+s+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+d(t)+"</Header><Body><r:"+q+'_INPUT xmlns:r="'+s+'">'+o+"</r:"+q+"_INPUT></Body></Envelope>",p,u,r)};j.ExecEnum=function(q,o,r,p){j.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+q+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+'</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Enumerate xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration" /></Body></Envelope>',o,r,p)};j.ExecPull=function(r,p,o,s,q){j.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>"+j.Address+"</a:To><w:ResourceURI>"+r+"</w:ResourceURI><a:MessageID>"+(j.NextMessageId++)+'</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Pull xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration"><EnumerationContext>'+p+"</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>",o,s,q)};j.ParseWsman=function(x){try{if(!x.childNodes){x=e(x)}var v={Header:{}},s=x.getElementsByTagName("Header")[0],w;if(!s){s=x.getElementsByTagName("a:Header")[0]}if(!s){return null}for(var u=0;u<s.childNodes.length;u++){var p=s.childNodes[u];v.Header[p.localName]=p.textContent}var o=x.getElementsByTagName("Body")[0];if(!o){o=x.getElementsByTagName("a:Body")[0]}if(!o){return null}if(o.childNodes.length>0){w=o.childNodes[0].localName;if(w.indexOf("_OUTPUT")==w.length-7){w=w.substring(0,w.length-7)}v.Header.Method=w;v.Body=b(o.childNodes[0])}return v}catch(q){console.log("Unable to parse XML: "+x);return null}};function b(u){var q,v={};for(var s=0;s<u.childNodes.length;s++){var o=u.childNodes[s];if(o.childElementCount==0){q=o.textContent}else{q=b(o)}if(q=="true"){q=true}if(q=="false"){q=false}var p=q;if(o.attributes.length>0){p={Value:q};for(var t=0;t<o.attributes.length;t++){p["@"+o.attributes[t].name]=o.attributes[t].value}}if(v[o.localName] instanceof Array){v[o.localName].push(p)}else{if(v[o.localName]==undefined){v[o.localName]=p}else{v[o.localName]=[v[o.localName],p]}}}return v}function c(t,r){if(!t||r===undefined||r===null){return""}var p=j.GetNameFromUrl(t);var s="<r:"+p+' xmlns:r="'+t+'">';for(var q in r){if(!r.hasOwnProperty(q)||q.indexOf("__")===0||q.indexOf("@")===0){continue}if(r[q]===undefined||r[q]===null||typeof r[q]==="function"){continue}if(typeof r[q]==="object"&&r[q]["ReferenceParameters"]){s+="<r:"+q+"><a:Address>"+r[q].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+r[q]["ReferenceParameters"]["ResourceURI"]+"</w:ResourceURI><w:SelectorSet>";var u=r[q]["ReferenceParameters"]["SelectorSet"]["Selector"];if(Array.isArray(u)){for(var o=0;o<u.length;o++){s+="<w:Selector"+a(u[o])+">"+u[o]["Value"]+"</w:Selector>"}}else{s+="<w:Selector"+a(u)+">"+u.Value+"</w:Selector>"}s+="</w:SelectorSet></a:ReferenceParameters></r:"+q+">"}else{if(Array.isArray(r[q])){for(var o=0;o<r[q].length;o++){s+="<r:"+q+">"+r[q][o].toString()+"</r:"+q+">"}}else{s+="<r:"+q+">"+r[q].toString()+"</r:"+q+">"}}}s+="</r:"+p+">";return s}function a(o){if(!o){return""}var q=" ";for(var p in o){if(!o.hasOwnProperty(p)||p.indexOf("@")!==0){continue}q+=p.substring(1)+'="'+o[p]+'" '}return q}function d(s){if(!s){return""}if(typeof s=="string"){return s}if(s.InstanceID){return'<w:SelectorSet><w:Selector Name="InstanceID">'+s.InstanceID+"</w:Selector></w:SelectorSet>"}var q="<w:SelectorSet>";for(var p in s){if(!s.hasOwnProperty(p)){continue}q+='<w:Selector Name="'+p+'">';if(s[p]["ReferenceParameters"]){q+="<a:EndpointReference>";q+="<a:Address>"+s[p]["Address"]+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+s[p]["ReferenceParameters"]["ResourceURI"]+"</w:ResourceURI><w:SelectorSet>";var r=s[p]["ReferenceParameters"]["SelectorSet"]["Selector"];if(Array.isArray(r)){for(var o=0;o<r.length;o++){q+="<w:Selector"+a(r[o])+">"+r[o]["Value"]+"</w:Selector>"}}else{q+="<w:Selector"+a(r)+">"+r.Value+"</w:Selector>"}q+="</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>"}else{q+=s[p]}q+="</w:Selector>"}q+="</w:SelectorSet>";return q}function e(o){if(window.DOMParser){return new DOMParser().parseFromString(o,"text/xml")}else{var p=new ActiveXObject("Microsoft.XMLDOM");p.async=false;p.loadXML(o);return p}}return j};var CreateAmtRemoteDesktop=function(p,s){var r={};r.canvasid=p;r.CanvasId=Q(p);r.scrolldiv=s;r.canvas=Q(p).getContext("2d");r.protocol=2;r.state=0;r.acc="";r.ScreenWidth=960;r.ScreenHeight=700;r.width=0;r.height=0;r.rwidth=0;r.rheight=0;r.bpp=2;r.useZRLE=true;r.showmouse=true;r.buttonmask=0;r.localKeyMap=true;r.spare=null;r.sparew=0;r.spareh=0;r.sparew2=0;r.spareh2=0;r.sparecache={};r.ZRLEfirst=1;r.onScreenSizeChange=null;r.frameRateDelay=0;r.kvmDataSupported=false;r.onKvmData=null;r.onKvmDataPending=[];r.onKvmDataAck=-1;r.holding=false;r.lastKeepAlive=Date.now();r.mNagleTimer=null;r.mx=0;r.my=0;r.Debug=function(t){console.log(t)};r.xxStateChange=function(t){if(t==0){r.canvas.fillStyle="#000000";r.canvas.fillRect(0,0,r.width,r.height);r.canvas.canvas.width=r.rwidth=r.width=640;r.canvas.canvas.height=r.rheight=r.height=400;QS(r.canvasid).cursor="default"}else{QS(r.canvasid).cursor=r.showmouse?"default":"none"}};r.ProcessData=function(v){if(!v){return}r.acc+=v;while(r.acc.length>0){var t=0;if(r.state==0&&r.acc.length>=12){t=12;r.state=1;r.send("RFB 003.008\n")}else{if(r.state==1&&r.acc.length>=1){t=r.acc.charCodeAt(0)+1;r.send(String.fromCharCode(1));r.state=2}else{if(r.state==2&&r.acc.length>=4){t=4;if(ReadInt(r.acc,0)!=0){return r.Stop()}r.send(String.fromCharCode(1));r.state=3}else{if(r.state==3&&r.acc.length>=24){var G=ReadInt(r.acc,20);if(r.acc.length<24+G){return}t=24+G;r.canvas.canvas.width=r.rwidth=r.width=r.ScreenWidth=ReadShort(r.acc,0);r.canvas.canvas.height=r.rheight=r.height=r.ScreenHeight=ReadShort(r.acc,2);var J="";if(r.useZRLE){J+=IntToStr(16)}J+=IntToStr(0);J+=IntToStr(1092);r.send(String.fromCharCode(2,0)+ShortToStr((J.length/4)+1)+J+IntToStr(-223));if(r.bpp==1){r.send(String.fromCharCode(0,0,0,0,8,8,0,1)+ShortToStr(7)+ShortToStr(7)+ShortToStr(3)+String.fromCharCode(5,2,0,0,0,0))}r.state=4;if(r.parent){r.parent.xxStateChange(3)}h();if(r.onScreenSizeChange!=null){r.onScreenSizeChange(r,r.ScreenWidth,r.ScreenHeight)}}else{if(r.state==4){switch(r.acc.charCodeAt(0)){case 0:if(r.acc.length<4){return}r.state=100+ReadShort(r.acc,2);t=4;break;case 2:t=1;break;case 3:if(r.acc.length<8){return}var F=ReadInt(r.acc,4)+8;if(r.acc.length<F){return}t=q(r.acc);break}}else{if(r.state>100&&r.acc.length>=12){var L=ReadShort(r.acc,0),N=ReadShort(r.acc,2),K=ReadShort(r.acc,4),C=ReadShort(r.acc,6),I=K*C,B=ReadInt(r.acc,8);if(B<17){if(K<1||K>64||C<1||C>64){console.log("Invalid tile size ("+K+","+C+"), disconnecting.");return r.Stop()}if(r.sparew!=K||r.spareh!=C){r.sparew=r.sparew2=K;r.spareh=r.spareh2=C;var M=r.sparew2+"x"+r.spareh2;r.spare=r.sparecache[M];if(!r.spare){r.sparecache[M]=r.spare=r.canvas.createImageData(r.sparew2,r.spareh2);var E=(r.sparew2*r.spareh2)<<2;for(var D=3;D<E;D+=4){r.spare.data[D]=255}}}}if(B==4294967073){r.canvas.canvas.width=r.rwidth=r.width=K;r.canvas.canvas.height=r.rheight=r.height=C;r.send(String.fromCharCode(3,0,0,0,0,0)+ShortToStr(r.width)+ShortToStr(r.height));t=12;if(r.onScreenSizeChange!=null){r.onScreenSizeChange(r,r.ScreenWidth,r.ScreenHeight)}}else{if(B==0){var H=12,u=12+(I*r.bpp);if(r.acc.length<u){return}t=u;if(r.bpp==2){for(var D=0;D<I;D++){j(r.acc.charCodeAt(H++)+(r.acc.charCodeAt(H++)<<8),D)}}else{for(var D=0;D<I;D++){l(r.acc.charCodeAt(H++),D)}}g(r.spare,L,N)}else{if(B==16){if(r.acc.length<16){return}var w=ReadInt(r.acc,12);if(r.acc.length<(16+w)){return}var H=16,z=5,A=0;if(w>5&&r.acc.charCodeAt(H)==0&&ReadShortX(r.acc,H+1)==(w-z)){a(r.acc,H+5,L,N,K,C,I,w)}t=16+w}else{r.Debug("Unknown Encoding: "+B);return r.Stop()}}}if(--r.state==100){r.state=4;if(r.frameRateDelay==0){h()}else{setTimeout(h,r.frameRateDelay)}}}}}}}}if(t==0){return}r.acc=r.acc.substring(t)}};function a(w,E,M,N,L,A,I,z){var J=w.charCodeAt(E++),C,K,H,D={},F=0,G=0,B;if(J==0){if(r.bpp==2){for(B=0;B<I;B++){j(w.charCodeAt(E++)+(w.charCodeAt(E++)<<8),B)}}else{for(B=0;B<I;B++){l(w.charCodeAt(E++),B)}}g(r.spare,M,N)}else{if(J==1){K=w.charCodeAt(E++)+((r.bpp==2)?(w.charCodeAt(E++)<<8):0);r.canvas.fillStyle="rgb("+((r.bpp==1)?((K&224)+","+((K&28)<<3)+","+b((K&3)<<6)):(((K>>8)&248)+","+((K>>3)&252)+","+((K&31)<<3)))+")";r.canvas.fillRect(M,N,L,A)}else{if(J>1&&J<17){var u=4,t=15;if(r.bpp==2){for(B=0;B<J;B++){D[B]=w.charCodeAt(E++)+(w.charCodeAt(E++)<<8)}if(J==2){u=1;t=1}else{if(J<=4){u=2;t=3}}while(F<I&&E<w.length){K=w.charCodeAt(E++);for(B=(8-u);B>=0;B-=u){j(D[(K>>B)&t],F++)}}}else{for(B=0;B<J;B++){D[B]=w.charCodeAt(E++)}if(J==2){u=1;t=1}else{if(J<=4){u=2;t=3}}while(F<I&&E<w.length){K=w.charCodeAt(E++);for(B=(8-u);B>=0;B-=u){l(D[(K>>B)&t],F++)}}}g(r.spare,M,N)}else{if(J==128){if(r.bpp==2){while(F<I&&E<w.length){K=w.charCodeAt(E++)+(w.charCodeAt(E++)<<8);G=1;do{G+=(H=w.charCodeAt(E++))}while(H==255);if(r.rotation==0){k(K,F,G);F+=G}else{while(--G>=0){j(K,F++)}}}}else{while(F<I&&E<w.length){K=w.charCodeAt(E++);G=1;do{G+=(H=w.charCodeAt(E++))}while(H==255);if(r.rotation==0){m(K,F,G);F+=G}else{while(--G>=0){l(K,F++)}}}}g(r.spare,M,N)}else{if(J>129){if(r.bpp==2){for(B=0;B<(J-128);B++){D[B]=w.charCodeAt(E++)+(w.charCodeAt(E++)<<8)}}else{for(B=0;B<(J-128);B++){D[B]=w.charCodeAt(E++)}}while(F<I&&E<w.length){G=1;C=w.charCodeAt(E++);K=D[C%128];if(C>127){do{G+=(H=w.charCodeAt(E++))}while(H==255)}if(r.rotation==0){if(r.bpp==2){k(K,F,G);F+=G}else{m(K,F,G);F+=G}}else{if(r.bpp==2){while(--G>=0){j(K,F++)}}else{while(--G>=0){l(K,F++)}}}}g(r.spare,M,N)}}}}}}r.hold=function(t){if(r.holding==t){return}r.holding=t;r.canvas.fillStyle="#000000";r.canvas.fillRect(0,0,r.width,r.height);if(r.holding==false){if((r.canvas.canvas.width!=r.width)||(r.canvas.canvas.height!=r.height)){r.canvas.canvas.width=r.width;r.canvas.canvas.height=r.height;if(r.onScreenSizeChange!=null){r.onScreenSizeChange(r,r.ScreenWidth,r.ScreenHeight)}}r.Send(String.fromCharCode(3,0,0,0,0,0)+ShortToStr(r.width)+ShortToStr(r.height))}else{r.UnGrabMouseInput();r.UnGrabKeyInput()}};function g(t,u,v){if(r.holding==true){return}r.canvas.putImageData(t,u,v)}function l(w,t){var u=t<<2;r.spare.data[u]=w&224;r.spare.data[u+1]=(w&28)<<3;r.spare.data[u+2]=b((w&3)<<6)}function j(w,t){var u=t<<2;r.spare.data[u]=(w>>8)&248;r.spare.data[u+1]=(w>>3)&252;r.spare.data[u+2]=(w&31)<<3}function m(A,w,z){var x=(w<<2),y=(A&224),u=((A&28)<<3),t=(b((A&3)<<6));while(--z>=0){r.spare.data[x]=y;r.spare.data[x+1]=u;r.spare.data[x+2]=t;x+=4}}function k(A,w,z){var x=(w<<2),y=((A>>8)&248),u=((A>>3)&252),t=((A&31)<<3);while(--z>=0){r.spare.data[x]=y;r.spare.data[x+1]=u;r.spare.data[x+2]=t;x+=4}}function b(t){return(t>127)?(t+32):t}function h(){if(r.holding==true){return}r.send(String.fromCharCode(3,1,0,0,0,0)+ShortToStr(r.rwidth)+ShortToStr(r.rheight))}r.Start=function(){r.state=0;r.acc="";r.ZRLEfirst=1;r.onKvmDataPending=[];r.onKvmDataAck=-1;r.kvmDataSupported=false;for(var t in r.sparecache){delete r.sparecache[t]}};r.Stop=function(){r.UnGrabMouseInput();r.UnGrabKeyInput();if(r.parent){r.parent.Stop()}};r.send=function(t){if(r.parent){r.parent.send(t)}};var o={Pause:19,CapsLock:20,Space:32,Quote:39,Minus:45,NumpadMultiply:42,NumpadAdd:43,PrintScreen:44,Comma:44,NumpadSubtract:45,NumpadDecimal:46,Period:46,Slash:47,NumpadDivide:47,Semicolon:59,Equal:61,OSLeft:91,BracketLeft:91,OSRight:91,Backslash:92,BracketRight:93,ContextMenu:93,Backquote:96,NumLock:144,ScrollLock:145,Backspace:65288,Tab:65289,Enter:65293,NumpadEnter:65293,Escape:65307,Delete:65535,Home:65360,PageUp:65365,PageDown:65366,ArrowLeft:65361,ArrowUp:65362,ArrowRight:65363,ArrowDown:65364,End:65367,Insert:65379,F1:65470,F2:65471,F3:65472,F4:65473,F5:65474,F6:65475,F7:65476,F8:65477,F9:65478,F10:65479,F11:65480,F12:65481,ShiftLeft:65505,ShiftRight:65506,ControlLeft:65507,ControlRight:65508,AltLeft:65513,AltRight:65514,MetaLeft:65511,MetaRight:65512};function n(t){if(t.code.startsWith("Key")&&t.code.length==4){return t.code.charCodeAt(3)+((t.shiftKey==false)?32:0)}if(t.code.startsWith("Digit")&&t.code.length==6){return t.code.charCodeAt(5)}if(t.code.startsWith("Numpad")&&t.code.length==7){return t.code.charCodeAt(6)}return o[t.code]}function c(t,u){if(!u){u=window.event}if(u.code&&(r.localKeyMap==false)){var v=n(u);if(v!=null){r.sendkey(v,t)}}else{var v=u.keyCode,w=v;if(u.shiftKey==false&&v>=65&&v<=90){w=v+32}if(v>=112&&v<=124){w=v+65358}if(v==8){w=65288}if(v==9){w=65289}if(v==13){w=65293}if(v==16){w=65505}if(v==17){w=65507}if(v==18){w=65513}if(v==27){w=65307}if(v==33){w=65365}if(v==34){w=65366}if(v==35){w=65367}if(v==36){w=65360}if(v==37){w=65361}if(v==38){w=65362}if(v==39){w=65363}if(v==40){w=65364}if(v==45){w=65379}if(v==46){w=65535}if(v>=96&&v<=105){w=v-48}if(v==106){w=42}if(v==107){w=43}if(v==109){w=45}if(v==110){w=46}if(v==111){w=47}if(v==186){w=59}if(v==187){w=61}if(v==188){w=44}if(v==189){w=45}if(v==190){w=46}if(v==191){w=47}if(v==192){w=96}if(v==219){w=91}if(v==220){w=92}if(v==221){w=93}if(v==222){w=39}r.sendkey(w,t)}return r.haltEvent(u)}r.sendkey=function(w,u){if(typeof w=="object"){var t="";for(var v in w){t+=(String.fromCharCode(4,w[v][1],0,0)+IntToStr(w[v][0]))}r.send(t)}else{r.send(String.fromCharCode(4,u,0,0)+IntToStr(w))}};function q(t){if(t.length<8){return 0}var v=ReadInt(r.acc,4)+8;if(t.length<v){return 0}if(r.onKvmData!=null){var u=t.substring(8,v);if((u.length>=16)&&(u.substring(0,15)=="\0KvmDataChannel")){if(r.kvmDataSupported==false){r.kvmDataSupported=true;console.log("KVM Data Channel Supported.")}if(((r.onKvmDataAck==-1)&&(u.length==16))||(u.charCodeAt(15)!=0)){r.onKvmDataAck=true}if(u.length>=16){r.onKvmData(u.substring(16))}if((r.onKvmDataAck==true)&&(r.onKvmDataPending.length>0)){r.sendKvmData(r.onKvmDataPending.shift())}}}return v}r.sendKvmData=function(t){if(r.onKvmDataAck!==true){r.onKvmDataPending.push(t)}else{t="\0KvmDataChannel\0"+t;r.send(String.fromCharCode(6,0,0,0)+IntToStr(t.length)+t);r.onKvmDataAck=false}};r.sendKeepAlive=function(){if(r.lastKeepAlive<Date.now()-5000){r.lastKeepAlive=Date.now();r.send(String.fromCharCode(6,0,0,0)+IntToStr(16)+"\0KvmDataChannel\0")}};r.SendCtrlAltDelMsg=function(){r.sendcad()};r.sendcad=function(){r.sendkey([[65507,1],[65513,1],[65535,1],[65535,0],[65513,0],[65507,0]])};var e=false;var d=false;r.GrabMouseInput=function(){if(e==true){return}var t=r.canvas.canvas;t.onmouseup=r.mouseup;t.onmousedown=r.mousedown;t.onmousemove=r.mousemove;e=true};r.UnGrabMouseInput=function(){if(e==false){return}var t=r.canvas.canvas;t.onmousemove=null;t.onmouseup=null;t.onmousedown=null;e=false};r.GrabKeyInput=function(){if(d==true){return}document.onkeyup=r.handleKeyUp;document.onkeydown=r.handleKeyDown;document.onkeypress=r.handleKeys;d=true};r.UnGrabKeyInput=function(){if(d==false){return}document.onkeyup=null;document.onkeydown=null;document.onkeypress=null;d=false};r.handleKeys=function(t){return r.haltEvent(t)};r.handleKeyUp=function(t){return c(0,t)};r.handleKeyDown=function(t){return c(1,t)};r.haltEvent=function(t){if(t.preventDefault){t.preventDefault()}if(t.stopPropagation){t.stopPropagation()}return false};r.mousedblclick=function(t){};r.mousedown=function(t){r.buttonmask|=(1<<t.button);return r.mousemove(t,1)};r.mouseup=function(t){r.buttonmask&=(65535-(1<<t.button));return r.mousemove(t,1)};r.mousemove=function(t,u){if(r.state<4){return true}var w=(r.canvas.canvas.height/Q(r.canvasid).offsetHeight);var x=(r.canvas.canvas.width/Q(r.canvasid).offsetWidth);var v=r.getPositionOfControl(Q(r.canvasid));r.mx=((event.pageX-v[0])*x);r.my=((event.pageY-v[1])*w);if(event.addx){r.mx+=event.addx}if(event.addy){r.my+=event.addy}if(u==1){r.send(String.fromCharCode(5,r.buttonmask)+ShortToStr(r.mx)+ShortToStr(r.my));if(r.mNagleTimer!=null){clearTimeout(r.mNagleTimer);r.mNagleTimer=null}}else{if(r.mNagleTimer==null){r.mNagleTimer=setTimeout(function(){r.send(String.fromCharCode(5,r.buttonmask)+ShortToStr(r.mx)+ShortToStr(r.my));r.mNagleTimer=null},50)}}return r.haltEvent(t)};r.getPositionOfControl=function(t){var u=Array(2);u[0]=u[1]=0;while(t){u[0]+=t.offsetLeft;u[1]+=t.offsetTop;t=t.offsetParent}return u};return r};var CreateAmtRemoteTerminal=function(J,L){var K={};K.DivId=J;K.DivElement=document.getElementById(J);K.protocol=1;if(L.protocol){K.protocol=L.protocol}K.fxEmulation=0;K.lineFeed="\r\n";K.debugmode=0;K.width=80;K.height=25;K.heightLock=0;var x=21;var y=13;var s=["000000","BB0000","00BB00","BBBB00","0000BB","BB00BB","00BBBB","BBBBBB","555555","FF5555","55FF55","FFFF55","5555FF","FF55FF","55FFFF","FFFFFF"];var v=0;var u=7;var t=0;var z=true;var E=0;var F=0;var B=0;var C=0;var D=0;var h=[];var k=0;var j=0;var q=[];var G=[];var I=1;var H=2;var b=false;var c=true;var r;var a=false;var M=[];K.title=null;K.onTitleChange=null;K.Start=function(){};K.Init=function(O,N){K.width=O?O:80;K.height=N?N:25;for(var R=0;R<K.height;R++){G[R]=[];q[R]=[];for(var P=0;P<K.width;P++){G[R][P]=" ";q[R][P]=(7<<6)}}K.TermInit();K.TermDraw()};K.xxStateChange=function(N){if((N==3)&&(L!=null)&&(L.xterm==true)){K.TermSendKeys("stty rows "+K.height+" cols "+K.width+"\nclear\n")}};K.ProcessData=function(N){if(K.debugmode==2){console.log("TRecv("+N.length+"): "+rstr2hex(N))}if(K.capture!=null){K.capture+=N}o(N);K.TermDraw()};function o(O){for(var N=0;N<O.length;N++){n(String.fromCharCode(O.charCodeAt(N)),O.charCodeAt(N))}}function n(N,P){switch(D){case 0:switch(P){case 27:D=1;h=[];k=0;j=0;break;default:m(N);break}break;case 1:switch(N){case"[":D=2;break;case"(":D=4;break;case")":D=5;break;case"]":D=6;break;case"=":a=true;D=0;break;case">":a=false;D=0;break;case"7":B=E;C=F;D=0;break;case"8":E=B;F=C;D=0;break;case"M":var R=1;for(var S=r[1];S>=r[0]+R;S--){for(var T=0;T<K.width;T++){G[S][T]=G[S-R][T];q[S][T]=q[S-R][T]}}for(var S=r[0]+R-1;S>r[0]-1;S--){for(var T=0;T<K.width;T++){G[S][T]=" ";q[S][T]=(7<<6)}}D=0;break;default:console.log("unknown terminal short code",N);D=0;break}break;case 2:if(N>="0"&&N<="9"){if(!h[k]){h[k]=(N-"0")}else{h[k]=((h[k]*10)+(N-"0"))}break}else{if(N==";"){k++;break}else{if(N=="?"){j=1;break}else{if(!h[0]){h[0]=0}l(N,h,k+1,j);D=0}}}break;case 4:D=0;break;case 5:D=0;break;case 6:var O=N.charCodeAt(0);if(N==";"){k++}else{if(O==7){p(h);D=0}else{if(!h[k]){h[k]=N}else{h[k]+=N}}}break}}function p(N){if(N.length==0){return}var O=parseInt(N[0]);if((O==0||O==2)&&(N.length>1)&&(N[1]!="?")){if(K.onTitleChange){K.onTitleChange(K,K.title=N[1])}}}function l(R,N,O,U){if(U==1){switch(R){case"l":if(N[0]==25){c=false}break;case"h":if(N[0]==25){c=true}break}}else{if(U==0){var S;switch(R){case"c":K.TermResetScreen();break;case"A":if(O==1){if(N[0]==0){F--}else{F-=N[0]}if(F<0){F=0}}break;case"B":if(O==1){if(N[0]==0){F++}else{F+=N[0]}if(F>K.height){F=K.height}}break;case"C":if(O==1){if(N[0]==0){E++}else{E+=N[0]}if(E>K.width){E=K.width}}break;case"D":if(O==1){if(N[0]==0){E--}else{E-=N[0]}if(E<0){E=0}}break;case"d":if(O==1){F=N[0]-1;if(F>K.height){F=K.height}if(F<0){F=0}}break;case"G":if(O==1){E=N[0]-1;if(E<0){E=0}if(E>(K.width-1)){E=(K.width-1)}}break;case"P":var V=1;if(O==1){V=N[0]}for(S=E;S<K.width-V;S++){G[F][S]=G[F][S+V];q[F][S]=q[F][S+V]}for(S=(K.width-V);S<K.width;S++){G[F][S]=" ";q[F][S]=(7<<6)}break;case"L":var T=1;if(O==1){T=N[0]}if(T==0){T=1}for(W=r[1];W>=F+T;W--){G[W]=G[W-T];q[W]=q[W-T]}for(W=F;W<F+T;W++){G[W]=[];q[W]=[];for(V=0;V<K.width;V++){G[W][V]=" ";q[W][V]=(7<<6)}}break;case"J":if(O==1&&N[0]==2){K.TermClear((t<<12)+(u<<6));E=0;F=0;M=[]}else{if(O==0||O==1&&N[0]==0){e();for(S=F+1;S<K.height;S++){g(S)}}else{if(O==1&&N[0]==1){e();for(S=0;S<F-1;S++){g(S)}}}}break;case"H":if(O==2){if(N[0]<1){N[0]=1}if(N[1]<1){N[1]=1}if(N[0]>K.height){N[0]=K.height}if(N[1]>K.width){N[1]=K.width}F=N[0]-1;E=N[1]-1}else{F=0;E=0}break;case"m":for(S=0;S<O;S++){if(!N[S]||N[S]==0){t=0;u=7;v=0}else{if(N[S]==1){if(u<8){u+=8}}else{if(N[S]==2||N[S]==22){if(u>=8){u-=8}}else{if(N[S]==7){v=2}else{if(N[S]==27){v=0}else{if(N[S]>=30&&N[S]<=37){var P=(u>=8);u=(N[S]-30);if(P&&u<=8){u+=8}}else{if(N[S]>=40&&N[S]<=47){t=(N[S]-40)}else{if(N[S]>=90&&N[S]<=99){u=(N[S]-82)}else{if(N[S]>=100&&N[S]<=109){t=(N[S]-92)}}}}}}}}}}break;case"K":if(O==0||(O==1&&(!N[0]||N[0]==0))){e()}else{if(O==1){if(N[0]==1){d()}else{if(N[0]==2){g(F)}}}}break;case"h":z=true;break;case"l":z=false;break;case"r":if(O==2){r=[N[0]-1,N[1]-1]}if(r[0]<0){r[0]=0}if(r[0]>(K.height-1)){r[0]=(K.height-1)}if(r[1]<0){r[1]=0}if(r[1]>(K.height-1)){r[1]=(K.height-1)}if(r[0]>r[1]){r[0]=r[1]}break;case"S":var V=1;if(O==1){V=N[0]}for(var W=r[0];W<=r[1]-V;W++){for(var X=0;X<K.width;X++){G[W][X]=G[W+V][X];q[W][X]=q[W+V][X]}}for(var W=r[1]-V+1;W<r[1];W++){for(var X=0;X<K.width;X++){G[W][X]=" ";q[W][X]=(7<<6)}}break;case"M":var V=1;if(O==1){V=N[0]}for(var W=F;W<=r[1]-V;W++){for(var X=0;X<K.width;X++){G[W][X]=G[W+V][X];q[W][X]=q[W+V][X]}}for(var W=r[1]-V+1;W<r[1];W++){for(var X=0;X<K.width;X++){G[W][X]=" ";q[W][X]=(7<<6)}}break;case"T":var V=1;if(O==1){V=N[0]}for(var W=r[1];W>r[0]+V;W--){for(var X=0;X<K.width;X++){G[W][X]=G[W-V][X];q[W][X]=q[W-V][X]}}for(var W=r[0]+V;W>r[0];W--){for(var X=0;X<K.width;X++){G[W][X]=" ";q[W][X]=(7<<6)}}break;case"X":var V=1;if(O==1){V=N[0]}while((V>0)&&(E>0)){G[F][E]=" ";E--;V--}break;default:console.log("unknown terminal code",R,N,U);break}}}}K.ProcessVt100String=function(O){for(var N=0;N<O.length;N++){m(String.fromCharCode(O.charCodeAt(N)))}};function m(N){if(N=="\0"||N.charCodeAt()==7){return}var O=N.charCodeAt();switch(O){case 16:N=" ";break;case 24:N="?";break;case 25:N="?";break}if(E>K.width){E=K.width}if(F>(K.height-1)){F=(K.height-1)}switch(N){case"\b":if(E>0){E--;if(b){w(" ")}}break;case"\t":var P=8-(E%8);for(var R=0;R<P;R++){m(" ")}break;case"\n":F++;if(F>r[1]){K.recordLineTobackBuffer(0);A(1);F=r[1]}if(K.lineFeed="\r"){E=0}break;case"\r":E=0;break;default:if(E>=K.width){E=0;if(z){F++}if(F>=(K.height-1)){A(1);F=(K.height-1)}}w(N);E++;break}}function w(N){G[F][E]=N;q[F][E]=(u<<6)+(t<<12)+v}K.TermClear=function(N){for(var P=0;P<K.height;P++){for(var O=0;O<K.width;O++){G[P][O]=" ";q[P][O]=N}}M=[]};K.TermResetScreen=function(){v=0;u=7;t=0;z=c=true;E=F=0;b=false;r=[0,(K.height-1)];a=false;K.TermClear(7<<6)};function e(){var N=(u<<6)+(t<<12)+v;for(var O=E;O<K.width;O++){G[F][O]=" ";q[F][O]=N}}function d(){var N=(u<<6)+(t<<12)+v;for(var O=0;O<E;O++){G[F][O]=" ";q[F][O]=N}}function g(N){var O=(u<<6)+(t<<12)+v;for(var P=0;P<K.width;P++){G[N][P]=" ";q[N][P]=O}}K.TermSendKeys=function(N){if(K.debugmode==2){console.log("TSend("+N.length+"): "+rstr2hex(N),N)}K.parent.send(N)};K.TermSendKey=function(N){if(K.debugmode==2){console.log("TSend(1): "+rstr2hex(String.fromCharCode(N)),N)}K.parent.send(String.fromCharCode(N))};function A(N){var O,P;for(P=r[0];P<=r[1]-N;P++){G[P]=G[P+N];q[P]=q[P+N]}for(P=r[1]-N+1;P<=r[1];P++){G[P]=[];q[P]=[];for(O=0;O<K.width;O++){G[P][O]=" ";q[P][O]=(7<<6)}}}K.TermHandleKeys=function(N){if(!N.ctrlKey){if(N.which==127){K.TermSendKey(8)}else{if(N.which==13){K.TermSendKeys(K.lineFeed)}else{if(N.which!=0){K.TermSendKey(N.which)}}}return false}if(N.preventDefault){N.preventDefault()}if(N.stopPropagation){N.stopPropagation()}};K.TermHandleKeyUp=function(N){if((N.which!=8)&&(N.which!=32)&&(N.which!=9)){return true}if(N.preventDefault){N.preventDefault()}if(N.stopPropagation){N.stopPropagation()}return false};K.TermHandleKeyDown=function(N){if((N.which>=65)&&(N.which<=90)&&(N.ctrlKey==true)){K.TermSendKey(N.which-64);if(N.preventDefault){N.preventDefault()}if(N.stopPropagation){N.stopPropagation()}return}if(N.which==27){K.TermSendKeys(String.fromCharCode(27));return true}if(a==true){if(N.which==37){K.TermSendKeys(String.fromCharCode(27,79,68));return true}if(N.which==38){K.TermSendKeys(String.fromCharCode(27,79,65));return true}if(N.which==39){K.TermSendKeys(String.fromCharCode(27,79,67));return true}if(N.which==40){K.TermSendKeys(String.fromCharCode(27,79,66));return true}}else{if(N.which==37){K.TermSendKeys(String.fromCharCode(27,91,68));return true}if(N.which==38){K.TermSendKeys(String.fromCharCode(27,91,65));return true}if(N.which==39){K.TermSendKeys(String.fromCharCode(27,91,67));return true}if(N.which==40){K.TermSendKeys(String.fromCharCode(27,91,66));return true}}if(N.which==33){K.TermSendKeys(String.fromCharCode(27,91,53,126));return true}if(N.which==34){K.TermSendKeys(String.fromCharCode(27,91,54,126));return true}if(N.which==35){K.TermSendKeys(String.fromCharCode(27,91,70));return true}if(N.which==36){K.TermSendKeys(String.fromCharCode(27,91,72));return true}if(N.which==45){K.TermSendKeys(String.fromCharCode(27,91,50,126));return true}if(N.which==46){K.TermSendKeys(String.fromCharCode(27,91,51,126));return true}if(N.which==9){K.TermSendKeys("\t");if(N.preventDefault){N.preventDefault()}if(N.stopPropagation){N.stopPropagation()}return true}if(N.which!=8&&N.which!=32&&N.which!=9){return true}K.TermSendKey(N.which);if(N.preventDefault){N.preventDefault()}if(N.stopPropagation){N.stopPropagation()}return false};K.recordLineTobackBuffer=function(R){var O="",N="";var P=K.TermDrawLine(N,R,O);N=P[0];O=P[1];M.push(N+O+"<br>")};K.TermDrawLine=function(N,W,P){var R,O,S=1,U,V;for(var T=0;T<K.width;++T){R=q[W][T];if(E==T&&F==W&&c){R|=H}if(R!=S){N+=P;P="";U=6;V=12;if(R&H){U=12;V=6}N+='<span style="color:#'+s[(R>>U)&63]+";background-color:#"+s[(R>>V)&63];if(R&I){N+=";text-decoration:underline"}N+=';">';P="</span>"+P;S=R}O=G[W][T];switch(O){case"&":N+="&";break;case"<":N+="<";break;case">":N+=">";break;case" ":N+=" ";break;default:N+=O;break}}return[N,P]};K.TermDraw=function(){var P="",O="";for(var S=0;S<K.height;++S){var R=K.TermDrawLine(O,S,P);O=R[0];P=R[1];if(S!=(K.height-1)){O+="<br>"}}if(M.length>800){M=M.slice(M.length-800)}var N=M.join("");K.DivElement.innerHTML="<font size='4'><b>"+N+O+P+"</b></font>";K.DivElement.scrollTop=K.DivElement.scrollHeight;if(K.heightLock==0){setTimeout(K.TermLockHeight,10)}};K.TermLockHeight=function(){K.heightLock=K.DivElement.clientHeight;K.DivElement.style.height=K.DivElement.parentNode.style.height=K.heightLock+"px";K.DivElement.style["overflow-y"]="scroll"};K.TermInit=function(){K.TermResetScreen()};K.heightLock=0;K.DivElement.style.height="";if((L!=null)&&(L.width!=null)&&(L.height!=null)){K.Init(L.width,L.height)}else{K.Init()}return K};var ZLIB=(ZLIB||{});if(typeof ZLIB.common_initialized==="undefined"){ZLIB.Z_NO_FLUSH=0;ZLIB.Z_PARTIAL_FLUSH=1;ZLIB.Z_SYNC_FLUSH=2;ZLIB.Z_FULL_FLUSH=3;ZLIB.Z_FINISH=4;ZLIB.Z_BLOCK=5;ZLIB.Z_TREES=6;ZLIB.Z_OK=0;ZLIB.Z_STREAM_END=1;ZLIB.Z_NEED_DICT=2;ZLIB.Z_ERRNO=(-1);ZLIB.Z_STREAM_ERROR=(-2);ZLIB.Z_DATA_ERROR=(-3);ZLIB.Z_MEM_ERROR=(-4);ZLIB.Z_BUF_ERROR=(-5);ZLIB.Z_VERSION_ERROR=(-6);ZLIB.Z_DEFLATED=8;ZLIB.z_stream=function(){this.next_in=0;this.avail_in=0;this.total_in=0;this.next_out=0;this.avail_out=0;this.total_out=0;this.msg=null;this.state=null;this.data_type=0;this.adler=0;this.input_data="";this.output_data="";this.error=0;this.checksum_function=null};ZLIB.gz_header=function(){this.text=0;this.time=0;this.xflags=0;this.os=255;this.extra=null;this.extra_len=0;this.extra_max=0;this.name=null;this.name_max=0;this.comment=null;this.comm_max=0;this.hcrc=0;this.done=0};ZLIB.common_initialized=true}if(typeof ZLIB==="undefined"){alert("ZLIB is not defined. SRC zlib.js before zlib-inflate.js")}(function(){var o=15;var G=0;var D=1;var am=2;var af=3;var A=4;var B=5;var ac=6;var j=7;var F=8;var q=9;var p=10;var an=11;var ao=12;var aj=13;var l=14;var k=15;var al=16;var W=17;var g=18;var S=19;var R=20;var T=21;var r=22;var s=23;var aa=24;var Y=25;var d=26;var V=27;var v=28;var a=29;var ab=30;var ak=31;var z=852;var y=592;var x=(z+y);var h=0;var X=1;var u=2;var N=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0];var O=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,203,69];var L=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0];var M=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];ZLIB.inflate_copyright=" inflate 1.2.6 Copyright 1995-2012 Mark Adler ";function K(aR,aV){var aM=15;var aU=aR.next;var at=(aV==u?aR.distbits:aR.lenbits);var aX=aR.work;var aH=aR.lens;var aI=(aV==u?aR.nlen:0);var aS=aR.codes;var au;if(aV==X){au=aR.nlen}else{if(aV==u){au=aR.ndist}else{au=19}}var aG;var aT;var aN,aL;var aQ;var aw;var ax;var aF;var aW;var aD;var aE;var aB;var aJ;var aK;var aC;var aO;var aq;var ar;var az;var aA;var ay;var av=new Array(aM+1);var aP=new Array(aM+1);for(aG=0;aG<=aM;aG++){av[aG]=0}for(aT=0;aT<au;aT++){av[aH[aI+aT]]++}aQ=at;for(aL=aM;aL>=1;aL--){if(av[aL]!=0){break}}if(aQ>aL){aQ=aL}if(aL==0){aC={op:64,bits:1,val:0};aS[aU++]=aC;aS[aU++]=aC;if(aV==u){aR.distbits=1}else{aR.lenbits=1}aR.next=aU;return 0}for(aN=1;aN<aL;aN++){if(av[aN]!=0){break}}if(aQ<aN){aQ=aN}aF=1;for(aG=1;aG<=aM;aG++){aF<<=1;aF-=av[aG];if(aF<0){return -1}}if(aF>0&&(aV==h||aL!=1)){aR.next=aU;return -1}aP[1]=0;for(aG=1;aG<aM;aG++){aP[aG+1]=aP[aG]+av[aG]}for(aT=0;aT<au;aT++){if(aH[aI+aT]!=0){aX[aP[aH[aI+aT]]++]=aT}}switch(aV){case h:aq=az=aX;ar=0;aA=0;ay=19;break;case X:aq=N;ar=-257;az=O;aA=-257;ay=256;break;default:aq=L;az=M;ar=0;aA=0;ay=-1}aD=0;aT=0;aG=aN;aO=aU;aw=aQ;ax=0;aJ=-1;aW=1<<aQ;aK=aW-1;if((aV==X&&aW>=z)||(aV==u&&aW>=y)){aR.next=aU;return 1}for(;;){aC={op:0,bits:aG-ax,val:0};if(aX[aT]<ay){aC.val=aX[aT]}else{if(aX[aT]>ay){aC.op=az[aA+aX[aT]];aC.val=aq[ar+aX[aT]]}else{aC.op=32+64}}aE=1<<(aG-ax);aB=1<<aw;aN=aB;do{aB-=aE;aS[aO+(aD>>>ax)+aB]=aC}while(aB!=0);aE=1<<(aG-1);while(aD&aE){aE>>>=1}if(aE!=0){aD&=aE-1;aD+=aE}else{aD=0}aT++;if(--(av[aG])==0){if(aG==aL){break}aG=aH[aI+aX[aT]]}if(aG>aQ&&(aD&aK)!=aJ){if(ax==0){ax=aQ}aO+=aN;aw=aG-ax;aF=(1<<aw);while(aw+ax<aL){aF-=av[aw+ax];if(aF<=0){break}aw++;aF<<=1}aW+=1<<aw;if((aV==X&&aW>=z)||(aV==u&&aW>=y)){aR.next=aU;return 1}aJ=aD&aK;aS[aU+aJ]={op:aw,bits:aQ,val:aO-aU}}}if(aD!=0){aS[aO+aD]={op:64,bits:aG-ax,val:0}}aR.next=aU+aW;if(aV==u){aR.distbits=aQ}else{aR.lenbits=aQ}return 0}function H(aN,aL){var aM;var aC;var aI;var aD;var aK;var aq;var ax;var aR;var aO;var aQ;var aP;var aB;var ar;var at;var aE;var au;var aH;var aw;var aA;var aJ;var aF;var av;var az=-1;var ay=-1;aM=aN.state;aC=aN.input_data;aI=aN.next_in;aD=aI+aN.avail_in-5;aK=aN.next_out;aq=aK-(aL-aN.avail_out);ax=aK+(aN.avail_out-257);aR=aM.wsize;aO=aM.whave;aQ=aM.wnext;aP=aM.window;aB=aM.hold;ar=aM.bits;at=aM.codes;aE=aM.lencode;au=aM.distcode;aH=(1<<aM.lenbits)-1;aw=(1<<aM.distbits)-1;loop:do{if(ar<15){aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8;aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8}aA=at[aE+(aB&aH)];dolen:while(true){aJ=aA.bits;aB>>>=aJ;ar-=aJ;aJ=aA.op;if(aJ==0){aN.output_data+=String.fromCharCode(aA.val);aK++}else{if(aJ&16){aF=aA.val;aJ&=15;if(aJ){if(ar<aJ){aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8}aF+=aB&((1<<aJ)-1);aB>>>=aJ;ar-=aJ}if(ar<15){aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8;aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8}aA=at[au+(aB&aw)];dodist:while(true){aJ=aA.bits;aB>>>=aJ;ar-=aJ;aJ=aA.op;if(aJ&16){av=aA.val;aJ&=15;if(ar<aJ){aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8;if(ar<aJ){aB+=(aC.charCodeAt(aI++)&255)<<ar;ar+=8}}av+=aB&((1<<aJ)-1);aB>>>=aJ;ar-=aJ;aJ=aK-aq;if(av>aJ){aJ=av-aJ;if(aJ>aO){if(aM.sane){aN.msg="invalid distance too far back";aM.mode=a;break loop}}az=0;ay=-1;if(aQ==0){az+=aR-aJ;if(aJ<aF){aF-=aJ;aN.output_data+=aP.substring(az,az+aJ);aK+=aJ;aJ=0;az=-1;ay=aK-av}}else{az+=aQ-aJ;if(aJ<aF){aF-=aJ;aN.output_data+=aP.substring(az,az+aJ);aK+=aJ;az=-1;ay=aK-av}}}else{az=-1;ay=aK-av}if(az>=0){aN.output_data+=aP.substring(az,az+aF);aK+=aF;az+=aF}else{var aG=aF;if(aG>aK-ay){aG=aK-ay}aN.output_data+=aN.output_data.substring(ay,ay+aG);aK+=aG;aF-=aG;ay+=aG;aK+=aF;while(aF>2){aN.output_data+=aN.output_data.charAt(ay++);aN.output_data+=aN.output_data.charAt(ay++);aN.output_data+=aN.output_data.charAt(ay++);aF-=3}if(aF){aN.output_data+=aN.output_data.charAt(ay++);if(aF>1){aN.output_data+=aN.output_data.charAt(ay++)}}}}else{if((aJ&64)==0){aA=at[au+(aA.val+(aB&((1<<aJ)-1)))];continue dodist}else{aN.msg="invalid distance code";aM.mode=a;break loop}}break dodist}}else{if((aJ&64)==0){aA=at[aE+(aA.val+(aB&((1<<aJ)-1)))];continue dolen}else{if(aJ&32){aM.mode=an;break loop}else{aN.msg="invalid literal/length code";aM.mode=a;break loop}}}}break dolen}}while(aI<aD&&aK<ax);aF=ar>>>3;aI-=aF;ar-=aF<<3;aB&=(1<<ar)-1;aN.next_in=aI;aN.next_out=aK;aN.avail_in=(aI<aD?5+(aD-aI):5-(aI-aD));aN.avail_out=(aK<ax?257+(ax-aK):257-(aK-ax));aM.hold=aB;aM.bits=ar}function ae(at){var ar;var aq=new Array(at);for(ar=0;ar<at;ar++){aq[ar]=0}return aq}function E(at,ar,aq){return(at&&(ar in at))?at[ar]:aq}function e(){return 0}function J(){var ar;this.mode=0;this.last=0;this.wrap=0;this.havedict=0;this.flags=0;this.dmax=0;this.check=0;this.total=0;this.head=null;this.wbits=0;this.wsize=0;this.whave=0;this.wnext=0;this.window=null;this.hold=0;this.bits=0;this.length=0;this.offset=0;this.extra=0;this.lencode=0;this.distcode=0;this.lenbits=0;this.distbits=0;this.ncode=0;this.nlen=0;this.ndist=0;this.have=0;this.next=0;this.lens=ae(320);this.work=ae(288);this.codes=new Array(x);var aq={op:0,bits:0,val:0};for(ar=0;ar<x;ar++){this.codes[ar]=aq}this.sane=0;this.back=0;this.was=0}ZLIB.inflateResetKeep=function(ar){var aq;if(!ar||!ar.state){return ZLIB.Z_STREAM_ERROR}aq=ar.state;ar.total_in=ar.total_out=aq.total=0;ar.msg=null;if(aq.wrap){ar.adler=aq.wrap&1}aq.mode=G;aq.last=0;aq.havedict=0;aq.dmax=32768;aq.head=null;aq.hold=0;aq.bits=0;aq.lencode=0;aq.distcode=0;aq.next=0;aq.sane=1;aq.back=-1;return ZLIB.Z_OK};ZLIB.inflateReset=function(ar,at){var au;var aq;if(!ar||!ar.state){return ZLIB.Z_STREAM_ERROR}aq=ar.state;if(typeof at==="undefined"){at=o}if(at<0){au=0;at=-at}else{au=(at>>>4)+1;if(at<48){at&=15}}if(au==1&&(typeof ZLIB.adler32==="function")){ar.checksum_function=ZLIB.adler32}else{if(au==2&&(typeof ZLIB.crc32==="function")){ar.checksum_function=ZLIB.crc32}else{ar.checksum_function=e}}if(at&&(at<8||at>15)){return ZLIB.Z_STREAM_ERROR}if(aq.window&&aq.wbits!=at){aq.window=null}aq.wrap=au;aq.wbits=at;aq.wsize=0;aq.whave=0;aq.wnext=0;return ZLIB.inflateResetKeep(ar)};ZLIB.inflateInit=function(ar){var aq=new ZLIB.z_stream();aq.state=new J();ZLIB.inflateReset(aq,ar);return aq};ZLIB.inflatePrime=function(at,aq,au){var ar;if(!at||!at.state){return ZLIB.Z_STREAM_ERROR}ar=at.state;if(aq<0){ar.hold=0;ar.bits=0;return ZLIB.Z_OK}if(aq>16||ar.bits+aq>32){return ZLIB.Z_STREAM_ERROR}au&=(1<<aq)-1;ar.hold+=au<<ar.bits;ar.bits+=aq;return ZLIB.Z_OK};var U=null;var t=null;function C(ar){var aq;if(!U){U=[{op:96,bits:7,val:0},{op:0,bits:8,val:80},{op:0,bits:8,val:16},{op:20,bits:8,val:115},{op:18,bits:7,val:31},{op:0,bits:8,val:112},{op:0,bits:8,val:48},{op:0,bits:9,val:192},{op:16,bits:7,val:10},{op:0,bits:8,val:96},{op:0,bits:8,val:32},{op:0,bits:9,val:160},{op:0,bits:8,val:0},{op:0,bits:8,val:128},{op:0,bits:8,val:64},{op:0,bits:9,val:224},{op:16,bits:7,val:6},{op:0,bits:8,val:88},{op:0,bits:8,val:24},{op:0,bits:9,val:144},{op:19,bits:7,val:59},{op:0,bits:8,val:120},{op:0,bits:8,val:56},{op:0,bits:9,val:208},{op:17,bits:7,val:17},{op:0,bits:8,val:104},{op:0,bits:8,val:40},{op:0,bits:9,val:176},{op:0,bits:8,val:8},{op:0,bits:8,val:136},{op:0,bits:8,val:72},{op:0,bits:9,val:240},{op:16,bits:7,val:4},{op:0,bits:8,val:84},{op:0,bits:8,val:20},{op:21,bits:8,val:227},{op:19,bits:7,val:43},{op:0,bits:8,val:116},{op:0,bits:8,val:52},{op:0,bits:9,val:200},{op:17,bits:7,val:13},{op:0,bits:8,val:100},{op:0,bits:8,val:36},{op:0,bits:9,val:168},{op:0,bits:8,val:4},{op:0,bits:8,val:132},{op:0,bits:8,val:68},{op:0,bits:9,val:232},{op:16,bits:7,val:8},{op:0,bits:8,val:92},{op:0,bits:8,val:28},{op:0,bits:9,val:152},{op:20,bits:7,val:83},{op:0,bits:8,val:124},{op:0,bits:8,val:60},{op:0,bits:9,val:216},{op:18,bits:7,val:23},{op:0,bits:8,val:108},{op:0,bits:8,val:44},{op:0,bits:9,val:184},{op:0,bits:8,val:12},{op:0,bits:8,val:140},{op:0,bits:8,val:76},{op:0,bits:9,val:248},{op:16,bits:7,val:3},{op:0,bits:8,val:82},{op:0,bits:8,val:18},{op:21,bits:8,val:163},{op:19,bits:7,val:35},{op:0,bits:8,val:114},{op:0,bits:8,val:50},{op:0,bits:9,val:196},{op:17,bits:7,val:11},{op:0,bits:8,val:98},{op:0,bits:8,val:34},{op:0,bits:9,val:164},{op:0,bits:8,val:2},{op:0,bits:8,val:130},{op:0,bits:8,val:66},{op:0,bits:9,val:228},{op:16,bits:7,val:7},{op:0,bits:8,val:90},{op:0,bits:8,val:26},{op:0,bits:9,val:148},{op:20,bits:7,val:67},{op:0,bits:8,val:122},{op:0,bits:8,val:58},{op:0,bits:9,val:212},{op:18,bits:7,val:19},{op:0,bits:8,val:106},{op:0,bits:8,val:42},{op:0,bits:9,val:180},{op:0,bits:8,val:10},{op:0,bits:8,val:138},{op:0,bits:8,val:74},{op:0,bits:9,val:244},{op:16,bits:7,val:5},{op:0,bits:8,val:86},{op:0,bits:8,val:22},{op:64,bits:8,val:0},{op:19,bits:7,val:51},{op:0,bits:8,val:118},{op:0,bits:8,val:54},{op:0,bits:9,val:204},{op:17,bits:7,val:15},{op:0,bits:8,val:102},{op:0,bits:8,val:38},{op:0,bits:9,val:172},{op:0,bits:8,val:6},{op:0,bits:8,val:134},{op:0,bits:8,val:70},{op:0,bits:9,val:236},{op:16,bits:7,val:9},{op:0,bits:8,val:94},{op:0,bits:8,val:30},{op:0,bits:9,val:156},{op:20,bits:7,val:99},{op:0,bits:8,val:126},{op:0,bits:8,val:62},{op:0,bits:9,val:220},{op:18,bits:7,val:27},{op:0,bits:8,val:110},{op:0,bits:8,val:46},{op:0,bits:9,val:188},{op:0,bits:8,val:14},{op:0,bits:8,val:142},{op:0,bits:8,val:78},{op:0,bits:9,val:252},{op:96,bits:7,val:0},{op:0,bits:8,val:81},{op:0,bits:8,val:17},{op:21,bits:8,val:131},{op:18,bits:7,val:31},{op:0,bits:8,val:113},{op:0,bits:8,val:49},{op:0,bits:9,val:194},{op:16,bits:7,val:10},{op:0,bits:8,val:97},{op:0,bits:8,val:33},{op:0,bits:9,val:162},{op:0,bits:8,val:1},{op:0,bits:8,val:129},{op:0,bits:8,val:65},{op:0,bits:9,val:226},{op:16,bits:7,val:6},{op:0,bits:8,val:89},{op:0,bits:8,val:25},{op:0,bits:9,val:146},{op:19,bits:7,val:59},{op:0,bits:8,val:121},{op:0,bits:8,val:57},{op:0,bits:9,val:210},{op:17,bits:7,val:17},{op:0,bits:8,val:105},{op:0,bits:8,val:41},{op:0,bits:9,val:178},{op:0,bits:8,val:9},{op:0,bits:8,val:137},{op:0,bits:8,val:73},{op:0,bits:9,val:242},{op:16,bits:7,val:4},{op:0,bits:8,val:85},{op:0,bits:8,val:21},{op:16,bits:8,val:258},{op:19,bits:7,val:43},{op:0,bits:8,val:117},{op:0,bits:8,val:53},{op:0,bits:9,val:202},{op:17,bits:7,val:13},{op:0,bits:8,val:101},{op:0,bits:8,val:37},{op:0,bits:9,val:170},{op:0,bits:8,val:5},{op:0,bits:8,val:133},{op:0,bits:8,val:69},{op:0,bits:9,val:234},{op:16,bits:7,val:8},{op:0,bits:8,val:93},{op:0,bits:8,val:29},{op:0,bits:9,val:154},{op:20,bits:7,val:83},{op:0,bits:8,val:125},{op:0,bits:8,val:61},{op:0,bits:9,val:218},{op:18,bits:7,val:23},{op:0,bits:8,val:109},{op:0,bits:8,val:45},{op:0,bits:9,val:186},{op:0,bits:8,val:13},{op:0,bits:8,val:141},{op:0,bits:8,val:77},{op:0,bits:9,val:250},{op:16,bits:7,val:3},{op:0,bits:8,val:83},{op:0,bits:8,val:19},{op:21,bits:8,val:195},{op:19,bits:7,val:35},{op:0,bits:8,val:115},{op:0,bits:8,val:51},{op:0,bits:9,val:198},{op:17,bits:7,val:11},{op:0,bits:8,val:99},{op:0,bits:8,val:35},{op:0,bits:9,val:166},{op:0,bits:8,val:3},{op:0,bits:8,val:131},{op:0,bits:8,val:67},{op:0,bits:9,val:230},{op:16,bits:7,val:7},{op:0,bits:8,val:91},{op:0,bits:8,val:27},{op:0,bits:9,val:150},{op:20,bits:7,val:67},{op:0,bits:8,val:123},{op:0,bits:8,val:59},{op:0,bits:9,val:214},{op:18,bits:7,val:19},{op:0,bits:8,val:107},{op:0,bits:8,val:43},{op:0,bits:9,val:182},{op:0,bits:8,val:11},{op:0,bits:8,val:139},{op:0,bits:8,val:75},{op:0,bits:9,val:246},{op:16,bits:7,val:5},{op:0,bits:8,val:87},{op:0,bits:8,val:23},{op:64,bits:8,val:0},{op:19,bits:7,val:51},{op:0,bits:8,val:119},{op:0,bits:8,val:55},{op:0,bits:9,val:206},{op:17,bits:7,val:15},{op:0,bits:8,val:103},{op:0,bits:8,val:39},{op:0,bits:9,val:174},{op:0,bits:8,val:7},{op:0,bits:8,val:135},{op:0,bits:8,val:71},{op:0,bits:9,val:238},{op:16,bits:7,val:9},{op:0,bits:8,val:95},{op:0,bits:8,val:31},{op:0,bits:9,val:158},{op:20,bits:7,val:99},{op:0,bits:8,val:127},{op:0,bits:8,val:63},{op:0,bits:9,val:222},{op:18,bits:7,val:27},{op:0,bits:8,val:111},{op:0,bits:8,val:47},{op:0,bits:9,val:190},{op:0,bits:8,val:15},{op:0,bits:8,val:143},{op:0,bits:8,val:79},{op:0,bits:9,val:254},{op:96,bits:7,val:0},{op:0,bits:8,val:80},{op:0,bits:8,val:16},{op:20,bits:8,val:115},{op:18,bits:7,val:31},{op:0,bits:8,val:112},{op:0,bits:8,val:48},{op:0,bits:9,val:193},{op:16,bits:7,val:10},{op:0,bits:8,val:96},{op:0,bits:8,val:32},{op:0,bits:9,val:161},{op:0,bits:8,val:0},{op:0,bits:8,val:128},{op:0,bits:8,val:64},{op:0,bits:9,val:225},{op:16,bits:7,val:6},{op:0,bits:8,val:88},{op:0,bits:8,val:24},{op:0,bits:9,val:145},{op:19,bits:7,val:59},{op:0,bits:8,val:120},{op:0,bits:8,val:56},{op:0,bits:9,val:209},{op:17,bits:7,val:17},{op:0,bits:8,val:104},{op:0,bits:8,val:40},{op:0,bits:9,val:177},{op:0,bits:8,val:8},{op:0,bits:8,val:136},{op:0,bits:8,val:72},{op:0,bits:9,val:241},{op:16,bits:7,val:4},{op:0,bits:8,val:84},{op:0,bits:8,val:20},{op:21,bits:8,val:227},{op:19,bits:7,val:43},{op:0,bits:8,val:116},{op:0,bits:8,val:52},{op:0,bits:9,val:201},{op:17,bits:7,val:13},{op:0,bits:8,val:100},{op:0,bits:8,val:36},{op:0,bits:9,val:169},{op:0,bits:8,val:4},{op:0,bits:8,val:132},{op:0,bits:8,val:68},{op:0,bits:9,val:233},{op:16,bits:7,val:8},{op:0,bits:8,val:92},{op:0,bits:8,val:28},{op:0,bits:9,val:153},{op:20,bits:7,val:83},{op:0,bits:8,val:124},{op:0,bits:8,val:60},{op:0,bits:9,val:217},{op:18,bits:7,val:23},{op:0,bits:8,val:108},{op:0,bits:8,val:44},{op:0,bits:9,val:185},{op:0,bits:8,val:12},{op:0,bits:8,val:140},{op:0,bits:8,val:76},{op:0,bits:9,val:249},{op:16,bits:7,val:3},{op:0,bits:8,val:82},{op:0,bits:8,val:18},{op:21,bits:8,val:163},{op:19,bits:7,val:35},{op:0,bits:8,val:114},{op:0,bits:8,val:50},{op:0,bits:9,val:197},{op:17,bits:7,val:11},{op:0,bits:8,val:98},{op:0,bits:8,val:34},{op:0,bits:9,val:165},{op:0,bits:8,val:2},{op:0,bits:8,val:130},{op:0,bits:8,val:66},{op:0,bits:9,val:229},{op:16,bits:7,val:7},{op:0,bits:8,val:90},{op:0,bits:8,val:26},{op:0,bits:9,val:149},{op:20,bits:7,val:67},{op:0,bits:8,val:122},{op:0,bits:8,val:58},{op:0,bits:9,val:213},{op:18,bits:7,val:19},{op:0,bits:8,val:106},{op:0,bits:8,val:42},{op:0,bits:9,val:181},{op:0,bits:8,val:10},{op:0,bits:8,val:138},{op:0,bits:8,val:74},{op:0,bits:9,val:245},{op:16,bits:7,val:5},{op:0,bits:8,val:86},{op:0,bits:8,val:22},{op:64,bits:8,val:0},{op:19,bits:7,val:51},{op:0,bits:8,val:118},{op:0,bits:8,val:54},{op:0,bits:9,val:205},{op:17,bits:7,val:15},{op:0,bits:8,val:102},{op:0,bits:8,val:38},{op:0,bits:9,val:173},{op:0,bits:8,val:6},{op:0,bits:8,val:134},{op:0,bits:8,val:70},{op:0,bits:9,val:237},{op:16,bits:7,val:9},{op:0,bits:8,val:94},{op:0,bits:8,val:30},{op:0,bits:9,val:157},{op:20,bits:7,val:99},{op:0,bits:8,val:126},{op:0,bits:8,val:62},{op:0,bits:9,val:221},{op:18,bits:7,val:27},{op:0,bits:8,val:110},{op:0,bits:8,val:46},{op:0,bits:9,val:189},{op:0,bits:8,val:14},{op:0,bits:8,val:142},{op:0,bits:8,val:78},{op:0,bits:9,val:253},{op:96,bits:7,val:0},{op:0,bits:8,val:81},{op:0,bits:8,val:17},{op:21,bits:8,val:131},{op:18,bits:7,val:31},{op:0,bits:8,val:113},{op:0,bits:8,val:49},{op:0,bits:9,val:195},{op:16,bits:7,val:10},{op:0,bits:8,val:97},{op:0,bits:8,val:33},{op:0,bits:9,val:163},{op:0,bits:8,val:1},{op:0,bits:8,val:129},{op:0,bits:8,val:65},{op:0,bits:9,val:227},{op:16,bits:7,val:6},{op:0,bits:8,val:89},{op:0,bits:8,val:25},{op:0,bits:9,val:147},{op:19,bits:7,val:59},{op:0,bits:8,val:121},{op:0,bits:8,val:57},{op:0,bits:9,val:211},{op:17,bits:7,val:17},{op:0,bits:8,val:105},{op:0,bits:8,val:41},{op:0,bits:9,val:179},{op:0,bits:8,val:9},{op:0,bits:8,val:137},{op:0,bits:8,val:73},{op:0,bits:9,val:243},{op:16,bits:7,val:4},{op:0,bits:8,val:85},{op:0,bits:8,val:21},{op:16,bits:8,val:258},{op:19,bits:7,val:43},{op:0,bits:8,val:117},{op:0,bits:8,val:53},{op:0,bits:9,val:203},{op:17,bits:7,val:13},{op:0,bits:8,val:101},{op:0,bits:8,val:37},{op:0,bits:9,val:171},{op:0,bits:8,val:5},{op:0,bits:8,val:133},{op:0,bits:8,val:69},{op:0,bits:9,val:235},{op:16,bits:7,val:8},{op:0,bits:8,val:93},{op:0,bits:8,val:29},{op:0,bits:9,val:155},{op:20,bits:7,val:83},{op:0,bits:8,val:125},{op:0,bits:8,val:61},{op:0,bits:9,val:219},{op:18,bits:7,val:23},{op:0,bits:8,val:109},{op:0,bits:8,val:45},{op:0,bits:9,val:187},{op:0,bits:8,val:13},{op:0,bits:8,val:141},{op:0,bits:8,val:77},{op:0,bits:9,val:251},{op:16,bits:7,val:3},{op:0,bits:8,val:83},{op:0,bits:8,val:19},{op:21,bits:8,val:195},{op:19,bits:7,val:35},{op:0,bits:8,val:115},{op:0,bits:8,val:51},{op:0,bits:9,val:199},{op:17,bits:7,val:11},{op:0,bits:8,val:99},{op:0,bits:8,val:35},{op:0,bits:9,val:167},{op:0,bits:8,val:3},{op:0,bits:8,val:131},{op:0,bits:8,val:67},{op:0,bits:9,val:231},{op:16,bits:7,val:7},{op:0,bits:8,val:91},{op:0,bits:8,val:27},{op:0,bits:9,val:151},{op:20,bits:7,val:67},{op:0,bits:8,val:123},{op:0,bits:8,val:59},{op:0,bits:9,val:215},{op:18,bits:7,val:19},{op:0,bits:8,val:107},{op:0,bits:8,val:43},{op:0,bits:9,val:183},{op:0,bits:8,val:11},{op:0,bits:8,val:139},{op:0,bits:8,val:75},{op:0,bits:9,val:247},{op:16,bits:7,val:5},{op:0,bits:8,val:87},{op:0,bits:8,val:23},{op:64,bits:8,val:0},{op:19,bits:7,val:51},{op:0,bits:8,val:119},{op:0,bits:8,val:55},{op:0,bits:9,val:207},{op:17,bits:7,val:15},{op:0,bits:8,val:103},{op:0,bits:8,val:39},{op:0,bits:9,val:175},{op:0,bits:8,val:7},{op:0,bits:8,val:135},{op:0,bits:8,val:71},{op:0,bits:9,val:239},{op:16,bits:7,val:9},{op:0,bits:8,val:95},{op:0,bits:8,val:31},{op:0,bits:9,val:159},{op:20,bits:7,val:99},{op:0,bits:8,val:127},{op:0,bits:8,val:63},{op:0,bits:9,val:223},{op:18,bits:7,val:27},{op:0,bits:8,val:111},{op:0,bits:8,val:47},{op:0,bits:9,val:191},{op:0,bits:8,val:15},{op:0,bits:8,val:143},{op:0,bits:8,val:79},{op:0,bits:9,val:255}]}if(!t){t=[{op:16,bits:5,val:1},{op:23,bits:5,val:257},{op:19,bits:5,val:17},{op:27,bits:5,val:4097},{op:17,bits:5,val:5},{op:25,bits:5,val:1025},{op:21,bits:5,val:65},{op:29,bits:5,val:16385},{op:16,bits:5,val:3},{op:24,bits:5,val:513},{op:20,bits:5,val:33},{op:28,bits:5,val:8193},{op:18,bits:5,val:9},{op:26,bits:5,val:2049},{op:22,bits:5,val:129},{op:64,bits:5,val:0},{op:16,bits:5,val:2},{op:23,bits:5,val:385},{op:19,bits:5,val:25},{op:27,bits:5,val:6145},{op:17,bits:5,val:7},{op:25,bits:5,val:1537},{op:21,bits:5,val:97},{op:29,bits:5,val:24577},{op:16,bits:5,val:4},{op:24,bits:5,val:769},{op:20,bits:5,val:49},{op:28,bits:5,val:12289},{op:18,bits:5,val:13},{op:26,bits:5,val:3073},{op:22,bits:5,val:193},{op:64,bits:5,val:0}]}ar.lencode=0;ar.distcode=512;for(aq=0;aq<512;aq++){ar.codes[aq]=U[aq]}for(aq=0;aq<32;aq++){ar.codes[aq+512]=t[aq]}ar.lenbits=9;ar.distbits=5}function ap(at){var ar=at.state;var aq=at.output_data.length;if(ar.window===null){ar.window=""}if(ar.wsize==0){ar.wsize=1<<ar.wbits}if(aq>=ar.wsize){ar.window=at.output_data.substring(aq-ar.wsize)}else{if(ar.whave+aq<ar.wsize){ar.window+=at.output_data}else{ar.window=ar.window.substring(ar.whave-(ar.wsize-aq))+at.output_data}}ar.whave=ar.window.length;if(ar.whave<ar.wsize){ar.wnext=ar.whave}else{ar.wnext=0}return 0}function m(ar,at){var aq=[at&255,(at>>>8)&255];ar.state.check=ar.checksum_function(ar.state.check,aq,0,2)}function n(ar,at){var aq=[at&255,(at>>>8)&255,(at>>>16)&255,(at>>>24)&255];ar.state.check=ar.checksum_function(ar.state.check,aq,0,4)}function Z(ar,aq){aq.strm=ar;aq.left=ar.avail_out;aq.next=ar.next_in;aq.have=ar.avail_in;aq.hold=ar.state.hold;aq.bits=ar.state.bits;return aq}function ah(aq){var ar=aq.strm;ar.next_in=aq.next;ar.avail_out=aq.left;ar.avail_in=aq.have;ar.state.hold=aq.hold;ar.state.bits=aq.bits}function P(aq){aq.hold=0;aq.bits=0}function ag(aq){if(aq.have==0){return false}aq.have--;aq.hold+=(aq.strm.input_data.charCodeAt(aq.next++)&255)<<aq.bits;aq.bits+=8;return true}function ad(ar,aq){while(ar.bits<aq){if(!ag(ar)){return false}}return true}function b(ar,aq){return ar.hold&((1<<aq)-1)}function w(ar,aq){ar.hold>>>=aq;ar.bits-=aq}function c(aq){aq.hold>>>=aq.bits&7;aq.bits-=aq.bits&7}function ai(aq){return((aq>>>24)&255)+((aq>>>8)&65280)+((aq&65280)<<8)+((aq&255)<<24)}var I=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];ZLIB.inflate=function(aD,at){var aC;var aB;var aq,az;var ar;var av=-1;var au=-1;var aw;var ax;var ay;var aA;if(!aD||!aD.state||(!aD.input_data&&aD.avail_in!=0)){return ZLIB.Z_STREAM_ERROR}aC=aD.state;if(aC.mode==an){aC.mode=ao}aB={};Z(aD,aB);aq=aB.have;az=aB.left;aA=ZLIB.Z_OK;inf_leave:for(;;){switch(aC.mode){case G:if(aC.wrap==0){aC.mode=ao;break}if(!ad(aB,16)){break inf_leave}if((aC.wrap&2)&&aB.hold==35615){aC.check=aD.checksum_function(0,null,0,0);m(aD,aB.hold);P(aB);aC.mode=D;break}aC.flags=0;if(aC.head!==null){aC.head.done=-1}if(!(aC.wrap&1)||((b(aB,8)<<8)+(aB.hold>>>8))%31){aD.msg="incorrect header check";aC.mode=a;break}if(b(aB,4)!=ZLIB.Z_DEFLATED){aD.msg="unknown compression method";aC.mode=a;break}w(aB,4);ay=b(aB,4)+8;if(aC.wbits==0){aC.wbits=ay}else{if(ay>aC.wbits){aD.msg="invalid window size";aC.mode=a;break}}aC.dmax=1<<ay;aD.adler=aC.check=aD.checksum_function(0,null,0,0);aC.mode=aB.hold&512?q:an;P(aB);break;case D:if(!ad(aB,16)){break inf_leave}aC.flags=aB.hold;if((aC.flags&255)!=ZLIB.Z_DEFLATED){aD.msg="unknown compression method";aC.mode=a;break}if(aC.flags&57344){aD.msg="unknown header flags set";aC.mode=a;break}if(aC.head!==null){aC.head.text=(aB.hold>>>8)&1}if(aC.flags&512){m(aD,aB.hold)}P(aB);aC.mode=am;case am:if(!ad(aB,32)){break inf_leave}if(aC.head!==null){aC.head.time=aB.hold}if(aC.flags&512){n(aD,aB.hold)}P(aB);aC.mode=af;case af:if(!ad(aB,16)){break inf_leave}if(aC.head!==null){aC.head.xflags=aB.hold&255;aC.head.os=aB.hold>>>8}if(aC.flags&512){m(aD,aB.hold)}P(aB);aC.mode=A;case A:if(aC.flags&1024){if(!ad(aB,16)){break inf_leave}aC.length=aB.hold;if(aC.head!==null){aC.head.extra_len=aB.hold}if(aC.flags&512){m(aD,aB.hold)}P(aB);aC.head.extra=""}else{if(aC.head!==null){aC.head.extra=null}}aC.mode=B;case B:if(aC.flags&1024){ar=aC.length;if(ar>aB.have){ar=aB.have}if(ar){if(aC.head!==null&&aC.head.extra!==null){ay=aC.head.extra_len-aC.length;aC.head.extra+=aD.input_data.substring(aB.next,aB.next+(ay+ar>aC.head.extra_max?aC.head.extra_max-ay:ar))}if(aC.flags&512){aC.check=aD.checksum_function(aC.check,aD.input_data,aB.next,ar)}aB.have-=ar;aB.next+=ar;aC.length-=ar}if(aC.length){break inf_leave}}aC.length=0;aC.mode=ac;case ac:if(aC.flags&2048){if(aB.have==0){break inf_leave}if(aC.head!==null&&aC.head.name===null){aC.head.name=""}ar=0;do{ay=aD.input_data.charAt(aB.next+ar);ar++;if(ay==="\0"){break}if(aC.head!==null&&aC.length<aC.head.name_max){aC.head.name+=ay;aC.length++}}while(ar<aB.have);if(aC.flags&512){aC.check=aD.checksum_function(aC.check,aD.input_data,aB.next,ar)}aB.have-=ar;aB.next+=ar;if(ay!=="\0"){break inf_leave}}else{if(aC.head!==null){aC.head.name=null}}aC.length=0;aC.mode=j;case j:if(aC.flags&4096){if(aB.have==0){break inf_leave}ar=0;if(aC.head!==null&&aC.head.comment===null){aC.head.comment=""}do{ay=aD.input_data.charAt(aB.next+ar);ar++;if(ay==="\0"){break}if(aC.head!==null&&aC.length<aC.head.comm_max){aC.head.comment+=ay;aC.length++}}while(ar<aB.have);if(aC.flags&512){aC.check=aD.checksum_function(aC.check,aD.input_data,aB.next,ar)}aB.have-=ar;aB.next+=ar;if(ay!=="\0"){break inf_leave}}else{if(aC.head!==null){aC.head.comment=null}}aC.mode=F;case F:if(aC.flags&512){if(!ad(aB,16)){break inf_leave}if(aB.hold!=(aC.check&65535)){aD.msg="header crc mismatch";aC.mode=a;break}P(aB)}if(aC.head!==null){aC.head.hcrc=(aC.flags>>>9)&1;aC.head.done=1}aD.adler=aC.check=aD.checksum_function(0,null,0,0);aC.mode=an;break;case q:if(!ad(aB,32)){break inf_leave}aD.adler=aC.check=ai(aB.hold);P(aB);aC.mode=p;case p:if(aC.havedict==0){ah(aB);return ZLIB.Z_NEED_DICT}aD.adler=aC.check=aD.checksum_function(0,null,0,0);aC.mode=an;case an:if(at==ZLIB.Z_BLOCK||at==ZLIB.Z_TREES){break inf_leave}case ao:if(aC.last){c(aB);aC.mode=d;break}if(!ad(aB,3)){break inf_leave}aC.last=b(aB,1);w(aB,1);switch(b(aB,2)){case 0:aC.mode=aj;break;case 1:C(aC);aC.mode=S;if(at==ZLIB.Z_TREES){w(aB,2);break inf_leave}break;case 2:aC.mode=al;break;case 3:aD.msg="invalid block type";aC.mode=a}w(aB,2);break;case aj:c(aB);if(!ad(aB,32)){break inf_leave}if((aB.hold&65535)!=(((aB.hold>>>16)&65535)^65535)){aD.msg="invalid stored block lengths";aC.mode=a;break}aC.length=aB.hold&65535;P(aB);aC.mode=l;if(at==ZLIB.Z_TREES){break inf_leave}case l:aC.mode=k;case k:ar=aC.length;if(ar){if(ar>aB.have){ar=aB.have}if(ar>aB.left){ar=aB.left}if(ar==0){break inf_leave}aD.output_data+=aD.input_data.substring(aB.next,aB.next+ar);aD.next_out+=ar;aB.have-=ar;aB.next+=ar;aB.left-=ar;aC.length-=ar;break}aC.mode=an;break;case al:if(!ad(aB,14)){break inf_leave}aC.nlen=b(aB,5)+257;w(aB,5);aC.ndist=b(aB,5)+1;w(aB,5);aC.ncode=b(aB,4)+4;w(aB,4);if(aC.nlen>286||aC.ndist>30){aD.msg="too many length or distance symbols";aC.mode=a;break}aC.have=0;aC.mode=W;case W:while(aC.have<aC.ncode){if(!ad(aB,3)){break inf_leave}var aE=b(aB,3);aC.lens[I[aC.have++]]=aE;w(aB,3)}while(aC.have<19){aC.lens[I[aC.have++]]=0}aC.next=0;aC.lencode=0;aC.lenbits=7;aA=K(aC,h);if(aA){aD.msg="invalid code lengths set";aC.mode=a;break}aC.have=0;aC.mode=g;case g:while(aC.have<aC.nlen+aC.ndist){for(;;){aw=aC.codes[aC.lencode+b(aB,aC.lenbits)];if(aw.bits<=aB.bits){break}if(!ag(aB)){break inf_leave}}if(aw.val<16){w(aB,aw.bits);aC.lens[aC.have++]=aw.val}else{if(aw.val==16){if(!ad(aB,aw.bits+2)){break inf_leave}w(aB,aw.bits);if(aC.have==0){aD.msg="invalid bit length repeat";aC.mode=a;break}ay=aC.lens[aC.have-1];ar=3+b(aB,2);w(aB,2)}else{if(aw.val==17){if(!ad(aB,aw.bits+3)){break inf_leave}w(aB,aw.bits);ay=0;ar=3+b(aB,3);w(aB,3)}else{if(!ad(aB,aw.bits+7)){break inf_leave}w(aB,aw.bits);ay=0;ar=11+b(aB,7);w(aB,7)}}if(aC.have+ar>aC.nlen+aC.ndist){aD.msg="invalid bit length repeat";aC.mode=a;break}while(ar--){aC.lens[aC.have++]=ay}}}if(aC.mode==a){break}if(aC.lens[256]==0){aD.msg="invalid code -- missing end-of-block";aC.mode=a;break}aC.next=0;aC.lencode=aC.next;aC.lenbits=9;aA=K(aC,X);if(aA){aD.msg="invalid literal/lengths set";aC.mode=a;break}aC.distcode=aC.next;aC.distbits=6;aA=K(aC,u);if(aA){aD.msg="invalid distances set";aC.mode=a;break}aC.mode=S;if(at==ZLIB.Z_TREES){break inf_leave}case S:aC.mode=R;case R:if(aB.have>=6&&aB.left>=258){ah(aB);H(aD,az);Z(aD,aB);if(aC.mode==an){aC.back=-1}break}aC.back=0;for(;;){aw=aC.codes[aC.lencode+b(aB,aC.lenbits)];if(aw.bits<=aB.bits){break}if(!ag(aB)){break inf_leave}}if(aw.op&&(aw.op&240)==0){ax=aw;for(;;){aw=aC.codes[aC.lencode+ax.val+(b(aB,ax.bits+ax.op)>>>ax.bits)];if(ax.bits+aw.bits<=aB.bits){break}if(!ag(aB)){break inf_leave}}w(aB,ax.bits);aC.back+=ax.bits}w(aB,aw.bits);aC.back+=aw.bits;aC.length=aw.val;if(aw.op==0){aC.mode=Y;break}if(aw.op&32){aC.back=-1;aC.mode=an;break}if(aw.op&64){aD.msg="invalid literal/length code";aC.mode=a;break}aC.extra=aw.op&15;aC.mode=T;case T:if(aC.extra){if(!ad(aB,aC.extra)){break inf_leave}aC.length+=b(aB,aC.extra);w(aB,aC.extra);aC.back+=aC.extra}aC.was=aC.length;aC.mode=r;case r:for(;;){aw=aC.codes[aC.distcode+b(aB,aC.distbits)];if(aw.bits<=aB.bits){break}if(!ag(aB)){break inf_leave}}if((aw.op&240)==0){ax=aw;for(;;){aw=aC.codes[aC.distcode+ax.val+(b(aB,ax.bits+ax.op)>>>ax.bits)];if((ax.bits+aw.bits)<=aB.bits){break}if(!ag(aB)){break inf_leave}}w(aB,ax.bits);aC.back+=ax.bits}w(aB,aw.bits);aC.back+=aw.bits;if(aw.op&64){aD.msg="invalid distance code";aC.mode=a;break}aC.offset=aw.val;aC.extra=aw.op&15;aC.mode=s;case s:if(aC.extra){if(!ad(aB,aC.extra)){break inf_leave}aC.offset+=b(aB,aC.extra);w(aB,aC.extra);aC.back+=aC.extra}aC.mode=aa;case aa:if(aB.left==0){break inf_leave}ar=az-aB.left;if(aC.offset>ar){ar=aC.offset-ar;if(ar>aC.whave){if(aC.sane){aD.msg="invalid distance too far back";aC.mode=a;break}}if(ar>aC.wnext){ar-=aC.wnext;av=aC.wsize-ar;au=-1}else{av=aC.wnext-ar;au=-1}if(ar>aC.length){ar=aC.length}}else{av=-1;au=aD.next_out-aC.offset;ar=aC.length}if(ar>aB.left){ar=aB.left}aB.left-=ar;aC.length-=ar;if(av>=0){aD.output_data+=aC.window.substring(av,av+ar);aD.next_out+=ar;ar=0}else{aD.next_out+=ar;do{aD.output_data+=aD.output_data.charAt(au++)}while(--ar)}if(aC.length==0){aC.mode=R}break;case Y:if(aB.left==0){break inf_leave}aD.output_data+=String.fromCharCode(aC.length);aD.next_out++;aB.left--;aC.mode=R;break;case d:if(aC.wrap){if(!ad(aB,32)){break inf_leave}az-=aB.left;aD.total_out+=az;aC.total+=az;if(az){aD.adler=aC.check=aD.checksum_function(aC.check,aD.output_data,aD.output_data.length-az,az)}az=aB.left;if((aC.flags?aB.hold:ai(aB.hold))!=aC.check){aD.msg="incorrect data check";aC.mode=a;break}P(aB)}aC.mode=V;case V:if(aC.wrap&&aC.flags){if(!ad(aB,32)){break inf_leave}if(aB.hold!=(aC.total&4294967295)){aD.msg="incorrect length check";aC.mode=a;break}P(aB)}aC.mode=v;case v:aA=ZLIB.Z_STREAM_END;break inf_leave;case a:aA=ZLIB.Z_DATA_ERROR;break inf_leave;case ab:return ZLIB.Z_MEM_ERROR;case ak:default:return ZLIB.Z_STREAM_ERROR}}inf_leave:ah(aB);if(aC.wsize||(az!=aD.avail_out&&aC.mode<a&&(aC.mode<d||at!=ZLIB.Z_FINISH))){if(ap(aD)){aC.mode=ab;return ZLIB.Z_MEM_ERROR}}aq-=aD.avail_in;az-=aD.avail_out;aD.total_in+=aq;aD.total_out+=az;aC.total+=az;if(aC.wrap&&az){aD.adler=aC.check=aD.checksum_function(aC.check,aD.output_data,0,aD.output_data.length)}aD.data_type=aC.bits+(aC.last?64:0)+(aC.mode==an?128:0)+(aC.mode==S||aC.mode==l?256:0);if(((aq==0&&az==0)||at==ZLIB.Z_FINISH)&&aA==ZLIB.Z_OK){aA=ZLIB.Z_BUF_ERROR}return aA};ZLIB.inflateEnd=function(ar){var aq;if(!ar||!ar.state){return ZLIB.Z_STREAM_ERROR}aq=ar.state;aq.window=null;ar.state=null;return ZLIB.Z_OK};ZLIB.z_stream.prototype.inflate=function(au,av){var at;var aq;var ar=16384;this.input_data=au;this.next_in=E(av,"next_in",0);this.avail_in=E(av,"avail_in",au.length-this.next_in);at=E(av,"flush",ZLIB.Z_SYNC_FLUSH);aq=E(av,"avail_out",-1);var aw="";do{this.avail_out=(aq>=0?aq:ar);this.output_data="";this.next_out=0;this.error=ZLIB.inflate(this,at);if(aq>=0){return this.output_data}aw+=this.output_data;if(this.avail_out>0){break}}while(this.error==ZLIB.Z_OK);return aw};ZLIB.z_stream.prototype.inflateReset=function(aq){return ZLIB.inflateReset(this,aq)}}());if(typeof ZLIB==="undefined"){alert("ZLIB is not defined. SRC zlib.js before zlib-adler32.js")}(function(){var c=65521;var d=5552;function b(e,g,k,h){var l;var j;l=(e>>>16)&65535;e&=65535;if(h==1){e+=g.charCodeAt(k)&255;if(e>=c){e-=c}l+=e;if(l>=c){l-=c}return e|(l<<16)}if(g===null){return 1}if(h<16){while(h--){e+=g.charCodeAt(k++)&255;l+=e}if(e>=c){e-=c}l%=c;return e|(l<<16)}while(h>=d){h-=d;j=d>>4;do{e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e}while(--j);e%=c;l%=c}if(h){while(h>=16){h-=16;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e;e+=g.charCodeAt(k++)&255;l+=e}while(h--){e+=g.charCodeAt(k++)&255;l+=e}e%=c;l%=c}return e|(l<<16)}function a(e,g,k,h){var l;var j;l=(e>>>16)&65535;e&=65535;if(h==1){e+=g[k];if(e>=c){e-=c}l+=e;if(l>=c){l-=c}return e|(l<<16)}if(g===null){return 1}if(h<16){while(h--){e+=g[k++];l+=e}if(e>=c){e-=c}l%=c;return e|(l<<16)}while(h>=d){h-=d;j=d>>4;do{e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e}while(--j);e%=c;l%=c}if(h){while(h>=16){h-=16;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e;e+=g[k++];l+=e}while(h--){e+=g[k++];l+=e}e%=c;l%=c}return e|(l<<16)}ZLIB.adler32=function(e,g,j,h){if(typeof g==="string"){return b(e,g,j,h)}else{return a(e,g,j,h)}};ZLIB.adler32_combine=function(e,g,h){var k;var l;var j;if(h<0){return 4294967295}h%=c;j=h;k=e&65535;l=j*k;l%=c;k+=(g&65535)+c-1;l+=((e>>16)&65535)+((g>>16)&65535)+c-j;if(k>=c){k-=c}if(k>=c){k-=c}if(l>=(c<<1)){l-=(c<<1)}if(l>=c){l-=c}return k|(l<<16)}}());if(typeof ZLIB==="undefined"){alert("ZLIB is not defined. SRC zlib.js before zlib-crc32.js")}(function(){var a=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918000,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];function c(j,h,l,k){if(h==null){return 0}j=j^4294967295;while(k>=8){j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);j=a[(j^h.charCodeAt(l++))&255]^(j>>>8);k-=8}if(k){do{j=a[(j^h.charCodeAt(l++))&255]^(j>>>8)}while(--k)}return j^4294967295}function b(j,h,l,k){if(h==null){return 0}j=j^4294967295;while(k>=8){j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);j=a[(j^h[l++])&255]^(j>>>8);k-=8}if(k){do{j=a[(j^h[l++])&255]^(j>>>8)}while(--k)}return j^4294967295}ZLIB.crc32=function(j,h,l,k){if(typeof h==="string"){return c(j,h,l,k)}else{return b(j,h,l,k)}};var d=32;function g(h,l){var k;var j=0;k=0;while(l){if(l&1){k^=h[j]}l>>=1;j++}return k}function e(k,h){var j;for(j=0;j<d;j++){k[j]=g(h,h[j])}}ZLIB.crc32_combine=function(h,j,l){var m;var p;var k;var o;if(l<=0){return h}k=new Array(d);o=new Array(d);o[0]=3988292384;p=1;for(m=1;m<d;m++){o[m]=p;p<<=1}e(k,o);e(o,k);do{e(k,o);if(l&1){h=g(k,h)}l>>=1;if(l==0){break}e(o,k);if(l&1){h=g(o,h)}l>>=1}while(l!=0);h^=j;return h}}());var CreateAmtRedirect=function(e,a){var g={};g.m=e;e.parent=g;g.authCookie=a;g.State=0;g.socket=null;g.host=null;g.port=0;g.user=null;g.pass=null;g.authuri="/RedirectionService";g.tlsv1only=0;g.inDataCount=0;g.connectstate=0;g.protocol=e.protocol;g.debugmode=0;g.amtaccumulator="";g.amtsequence=1;g.amtkeepalivetimer=null;g.onStateChanged=null;g.Start=function(h,k,n,j,l){g.host=h;g.port=k;g.user=n;g.pass=j;g.connectstate=0;g.inDataCount=0;var m=window.location.protocol.replace("http","ws")+"//"+window.location.host+window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/webrelay.ashx?p=2&host="+h+"&port="+k+"&tls="+l+((n=="*")?"&serverauth=1":"")+((typeof j==="undefined")?("&serverauth=1&user="+n):"");if((a!=null)&&(a!="")){m+="&auth="+a}g.socket=new WebSocket(m);g.socket.onopen=g.xxOnSocketConnected;g.socket.onmessage=g.xxOnMessage;g.socket.onclose=g.xxOnSocketClosed;g.xxStateChange(1)};g.xxOnSocketConnected=function(){if(g.debugmode==1){console.log("onSocketConnected")}g.xxStateChange(2);if(g.protocol==1){g.xxSend(g.RedirectStartSol)}if(g.protocol==2){g.xxSend(g.RedirectStartKvm)}if(g.protocol==3){g.xxSend(g.RedirectStartIder)}};var b=new FileReader();var d=false,c=[];if(b.readAsBinaryString){b.onload=function(h){g.xxOnSocketData(h.target.result);if(c.length==0){d=false}else{b.readAsBinaryString(new Blob([c.shift()]))}}}else{if(b.readAsArrayBuffer){b.onloadend=function(h){g.xxOnSocketData(h.target.result);if(c.length==0){d=false}else{b.readAsArrayBuffer(c.shift())}}}}g.xxOnMessage=function(k){g.inDataCount++;if(typeof k.data=="object"){if(d==true){c.push(k.data);return}if(b.readAsBinaryString){d=true;b.readAsBinaryString(new Blob([k.data]))}else{if(b.readAsArrayBuffer){d=true;b.readAsArrayBuffer(k.data)}else{var h="",j=new Uint8Array(k.data),m=j.byteLength;for(var l=0;l<m;l++){h+=String.fromCharCode(j[l])}g.xxOnSocketData(h)}}}else{g.xxOnSocketData(k.data)}};g.xxOnSocketData=function(t){if(!t||g.connectstate==-1){return}if(typeof t==="object"){var m="";var o=new Uint8Array(t);var y=o.byteLength;for(var x=0;x<y;x++){m+=String.fromCharCode(o[x])}t=m}else{if(typeof t!=="string"){return}}if((g.protocol==2||g.protocol==3)&&g.connectstate==1){return g.m.ProcessData(t)}g.amtaccumulator+=t;while(g.amtaccumulator.length>=1){var p=0;switch(g.amtaccumulator.charCodeAt(0)){case 17:if(g.amtaccumulator.length<4){return}var L=g.amtaccumulator.charCodeAt(1);switch(L){case 0:if(g.amtaccumulator.length<13){return}var C=g.amtaccumulator.charCodeAt(12);if(g.amtaccumulator.length<13+C){return}g.xxSend(String.fromCharCode(19,0,0,0,0,0,0,0,0));p=(13+C);break;default:g.Stop(1);break}break;case 20:if(g.amtaccumulator.length<9){return}var k=ReadIntX(g.amtaccumulator,5);if(g.amtaccumulator.length<9+k){return}var K=g.amtaccumulator.charCodeAt(1);var l=g.amtaccumulator.charCodeAt(4);var h=[];for(x=0;x<k;x++){h.push(g.amtaccumulator.charCodeAt(9+x))}var j=g.amtaccumulator.substring(9,9+k);p=9+k;if(l==0){if(h.indexOf(4)>=0){g.xxSend(String.fromCharCode(19,0,0,0,4)+IntToStrX(g.user.length+g.authuri.length+8)+String.fromCharCode(g.user.length)+g.user+String.fromCharCode(0,0)+String.fromCharCode(g.authuri.length)+g.authuri+String.fromCharCode(0,0,0,0))}else{if(h.indexOf(3)>=0){g.xxSend(String.fromCharCode(19,0,0,0,3)+IntToStrX(g.user.length+g.authuri.length+7)+String.fromCharCode(g.user.length)+g.user+String.fromCharCode(0,0)+String.fromCharCode(g.authuri.length)+g.authuri+String.fromCharCode(0,0,0))}else{if(h.indexOf(1)>=0){g.xxSend(String.fromCharCode(19,0,0,0,1)+IntToStrX(g.user.length+g.pass.length+2)+String.fromCharCode(g.user.length)+g.user+String.fromCharCode(g.pass.length)+g.pass)}else{g.Stop(2)}}}}else{if((l==3||l==4)&&K==1){var s=0;var G=j.charCodeAt(s);var F=j.substring(s+1,s+1+G);s+=(G+1);var B=j.charCodeAt(s);var A=j.substring(s+1,s+1+B);s+=(B+1);var E=0;var D=null;var q=g.xxRandomNonce(32);var J="00000002";var v="";if(l==4){E=j.charCodeAt(s);D=j.substring(s+1,s+1+E);s+=(E+1);v=J+":"+q+":"+D+":"}var u=hex_md5(hex_md5(g.user+":"+F+":"+g.pass)+":"+A+":"+v+hex_md5("POST:"+g.authuri));var M=g.user.length+F.length+A.length+g.authuri.length+q.length+J.length+u.length+7;if(l==4){M+=(D.length+1)}var n=String.fromCharCode(19,0,0,0,l)+IntToStrX(M)+String.fromCharCode(g.user.length)+g.user+String.fromCharCode(F.length)+F+String.fromCharCode(A.length)+A+String.fromCharCode(g.authuri.length)+g.authuri+String.fromCharCode(q.length)+q+String.fromCharCode(J.length)+J+String.fromCharCode(u.length)+u;if(l==4){n+=(String.fromCharCode(D.length)+D)}g.xxSend(n)}else{if(K==0){if(g.protocol==1){var z=10000;var O=100;var N=0;var I=10000;var H=100;var w=0;g.xxSend(String.fromCharCode(32,0,0,0)+IntToStrX(g.amtsequence++)+ShortToStrX(z)+ShortToStrX(O)+ShortToStrX(N)+ShortToStrX(I)+ShortToStrX(H)+ShortToStrX(w)+IntToStrX(0))}if(g.protocol==2){g.xxSend(String.fromCharCode(64,0,0,0,0,0,0,0))}if(g.protocol==3){g.connectstate=1;g.xxStateChange(3)}}else{g.Stop(3)}}}break;case 33:if(g.amtaccumulator.length<23){break}p=23;g.xxSend(String.fromCharCode(39,0,0,0)+IntToStrX(g.amtsequence++)+String.fromCharCode(0,0,27,0,0,0));if(g.protocol==1){g.amtkeepalivetimer=setInterval(g.xxSendAmtKeepAlive,2000)}g.connectstate=1;g.xxStateChange(3);break;case 41:if(g.amtaccumulator.length<10){break}p=10;break;case 42:if(g.amtaccumulator.length<10){break}var r=(10+((g.amtaccumulator.charCodeAt(9)&255)<<8)+(g.amtaccumulator.charCodeAt(8)&255));if(g.amtaccumulator.length<r){break}g.m.ProcessData(g.amtaccumulator.substring(10,r));p=r;break;case 43:if(g.amtaccumulator.length<8){break}p=8;break;case 65:if(g.amtaccumulator.length<8){break}g.connectstate=1;g.m.Start();if(g.amtaccumulator.length>8){g.m.ProcessData(g.amtaccumulator.substring(8))}p=g.amtaccumulator.length;break;case 240:g.serverIsRecording=true;p=1;break;default:console.log("Unknown Intel AMT command: "+g.amtaccumulator.charCodeAt(0)+" acclen="+g.amtaccumulator.length);g.Stop(4);return}if(p==0){return}g.amtaccumulator=g.amtaccumulator.substring(p)}};g.xxSend=function(l){if(g.socket!=null&&g.socket.readyState==WebSocket.OPEN){if(g.debugmode==1){console.log("Send",l)}var h=new Uint8Array(l.length);for(var k=0;k<l.length;++k){h[k]=l.charCodeAt(k)}try{g.socket.send(h.buffer)}catch(j){}}};g.send=function(h){if(g.socket==null||g.connectstate!=1){return}if(g.protocol==1){g.xxSend(String.fromCharCode(40,0,0,0)+IntToStrX(g.amtsequence++)+ShortToStrX(h.length)+h)}else{g.xxSend(h)}};g.xxSendAmtKeepAlive=function(){if(g.socket==null){return}g.xxSend(String.fromCharCode(43,0,0,0)+IntToStrX(g.amtsequence++))};g.xxRandomNonceX="abcdef0123456789";g.xxRandomNonce=function(j){var k="";for(var h=0;h<j;h++){k+=g.xxRandomNonceX.charAt(Math.floor(Math.random()*g.xxRandomNonceX.length))}return k};g.xxOnSocketClosed=function(){if(g.debugmode==1){console.log("onSocketClosed")}if((g.inDataCount==0)&&(g.tlsv1only==0)){g.tlsv1only=1;g.socket=new WebSocket(window.location.protocol.replace("http","ws")+"//"+window.location.host+window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/webrelay.ashx?p=2&host="+g.host+"&port="+g.port+"&tls="+g.tls+"&tls1only=1"+((g.user=="*")?"&serverauth=1":"")+((typeof pass==="undefined")?("&serverauth=1&user="+g.user):""));g.socket.onopen=g.xxOnSocketConnected;g.socket.onmessage=g.xxOnMessage;g.socket.onclose=g.xxOnSocketClosed}else{g.Stop(5)}};g.xxStateChange=function(h){if(g.State==h){return}g.State=h;g.m.xxStateChange(g.State);if(g.onStateChanged!=null){g.onStateChanged(g,g.State)}};g.Stop=function(h){if(g.debugmode==1){console.log("onSocketStop",h)}g.xxStateChange(0);g.connectstate=-1;g.amtaccumulator="";if(g.socket!=null){g.socket.close();g.socket=null}if(g.amtkeepalivetimer!=null){clearInterval(g.amtkeepalivetimer);g.amtkeepalivetimer=null}};g.RedirectStartSol=String.fromCharCode(16,0,0,0,83,79,76,32);g.RedirectStartKvm=String.fromCharCode(16,1,0,0,75,86,77,82);g.RedirectStartIder=String.fromCharCode(16,0,0,0,73,68,69,82);return g};var CreateWsmanComm=function(l,o,q,n,p){var m={};m.PendingAjax=[];m.ActiveAjaxCount=0;m.MaxActiveAjaxCount=1;m.FailAllError=0;m.challengeParams=null;m.noncecounter=1;m.authcounter=0;m.socket=null;m.socketState=0;m.host=l;m.port=o;m.user=q;m.pass=n;m.tls=p;m.tlsv1only=1;m.cnonce=Math.random().toString(36).substring(7);m.PerformAjax=function(t,s,v,u,w,r){if(m.ActiveAjaxCount<m.MaxActiveAjaxCount&&m.PendingAjax.length==0){m.PerformAjaxEx(t,s,v,w,r)}else{if(u==1){m.PendingAjax.unshift([t,s,v,w,r])}else{m.PendingAjax.push([t,s,v,w,r])}}};m.PerformNextAjax=function(){if(m.ActiveAjaxCount>=m.MaxActiveAjaxCount||m.PendingAjax.length==0){return}var r=m.PendingAjax.shift();m.PerformAjaxEx(r[0],r[1],r[2],r[3],r[4]);m.PerformNextAjax()};m.PerformAjaxEx=function(t,s,u,v,r){if(m.FailAllError!=0){m.gotNextMessagesError({status:m.FailAllError},"error",null,[t,s,u,v,r]);return}if(!t){t=""}m.ActiveAjaxCount++;return m.PerformAjaxExNodeJS(t,s,u,v,r)};m.pendingAjaxCall=[];m.PerformAjaxExNodeJS=function(t,s,u,v,r){m.PerformAjaxExNodeJS2(t,s,u,v,r,3)};m.PerformAjaxExNodeJS2=function(t,s,v,w,r,u){if(u<=0||m.FailAllError!=0){m.ActiveAjaxCount--;if(m.FailAllError!=999){m.gotNextMessages(null,"error",{status:((m.FailAllError==0)?408:m.FailAllError)},[t,s,v,w,r])}m.PerformNextAjax();return}m.pendingAjaxCall.push([t,s,v,w,r,u]);if(m.socketState==0){m.xxConnectHttpSocket()}else{if(m.socketState==2){m.sendRequest(t,w,r)}}};m.sendRequest=function(t,v,r){v=v?v:"/wsman";r=r?r:"POST";var s=r+" "+v+" HTTP/1.1\r\n";if(m.challengeParams!=null){var u=hex_md5(hex_md5(m.user+":"+m.challengeParams.realm+":"+m.pass)+":"+m.challengeParams.nonce+":"+m.noncecounter+":"+m.cnonce+":"+m.challengeParams.qop+":"+hex_md5(r+":"+v));s+="Authorization: "+m.renderDigest({username:m.user,realm:m.challengeParams.realm,nonce:m.challengeParams.nonce,uri:v,qop:m.challengeParams.qop,response:u,nc:m.noncecounter++,cnonce:m.cnonce})+"\r\n"}s+="Host: "+m.host+":"+m.port+"\r\nTransfer-Encoding: chunked\r\n\r\n"+t.length.toString(16).toUpperCase()+"\r\n"+t+"\r\n0\r\n\r\n";g(s)};m.parseDigest=function(r){var s=r.substring(7).split(",");for(i in s){s[i]=s[i].trim()}return s.reduce(function(t,v){var u=v.split("=");t[u[0]]=u[1].replace(/"/g,"");return t},{})};m.renderDigest=function(r){var s=[];for(i in r){s.push(i)}return"Digest "+s.reduce(function(u,t){return u+","+t+'="'+r[t]+'"'},"").substring(1)};m.xxConnectHttpSocket=function(){m.socketParseState=0;m.socketAccumulator="";m.socketHeader=null;m.socketData="";m.socketState=1;console.log(m.tlsv1only);m.socket=new WebSocket(window.location.protocol.replace("http","ws")+"//"+window.location.host+window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/webrelay.ashx?p=1&host="+m.host+"&port="+m.port+"&tls="+m.tls+"&tlsv1only="+m.tlsv1only+((q=="*")?"&serverauth=1":"")+((typeof n==="undefined")?("&serverauth=1&user="+q):""));m.socket.onopen=c;m.socket.onmessage=a;m.socket.onclose=b};function c(){m.socketState=2;for(i in m.pendingAjaxCall){m.sendRequest(m.pendingAjaxCall[i][0],m.pendingAjaxCall[i][3],m.pendingAjaxCall[i][4])}}var h=new FileReader();var k=false,j=[];if(h.readAsBinaryString){h.onload=function(r){d(r.target.result);if(j.length==0){k=false}else{h.readAsBinaryString(new Blob([j.shift()]))}}}else{if(h.readAsArrayBuffer){h.onloadend=function(r){d(r.target.result);if(j.length==0){k=false}else{h.readAsArrayBuffer(j.shift())}}}}function a(t){if(typeof t.data=="object"){if(k==true){j.push(t.data);return}if(h.readAsBinaryString){k=true;h.readAsBinaryString(new Blob([t.data]))}else{if(h.readAsArrayBuffer){k=true;h.readAsArrayBuffer(t.data)}else{var r="",s=new Uint8Array(t.data),v=s.byteLength;for(var u=0;u<v;u++){r+=String.fromCharCode(s[u])}d(r)}}}else{d(t.data)}}function d(v){if(typeof v==="object"){var r="",s=new Uint8Array(v),y=s.byteLength;for(var x=0;x<y;x++){r+=String.fromCharCode(s[x])}v=r}else{if(typeof v!=="string"){return}}m.socketAccumulator+=v;while(true){if(m.socketParseState==0){var w=m.socketAccumulator.indexOf("\r\n\r\n");if(w<0){return}m.socketHeader=m.socketAccumulator.substring(0,w).split("\r\n");m.socketAccumulator=m.socketAccumulator.substring(w+4);m.socketParseState=1;m.socketData="";m.socketXHeader={Directive:m.socketHeader[0].split(" ")};for(x in m.socketHeader){if(x!=0){var z=m.socketHeader[x].indexOf(":");m.socketXHeader[m.socketHeader[x].substring(0,z).toLowerCase()]=m.socketHeader[x].substring(z+2)}}}if(m.socketParseState==1){var u=-1;if((m.socketXHeader.connection!=undefined)&&(m.socketXHeader.connection.toLowerCase()=="close")&&((m.socketXHeader["transfer-encoding"]==undefined)||(m.socketXHeader["transfer-encoding"].toLowerCase()!="chunked"))){u=0}else{if(m.socketXHeader["content-length"]!=undefined){u=parseInt(m.socketXHeader["content-length"]);if(m.socketAccumulator.length<u){return}var v=m.socketAccumulator.substring(0,u);m.socketAccumulator=m.socketAccumulator.substring(u);m.socketData=v;u=0}else{var t=m.socketAccumulator.indexOf("\r\n");if(t<0){return}u=parseInt(m.socketAccumulator.substring(0,t),16);if(isNaN(u)){if(m.websocket){m.websocket.close()}return}if(m.socketAccumulator.length<t+2+u+2){return}var v=m.socketAccumulator.substring(t+2,t+2+u);m.socketAccumulator=m.socketAccumulator.substring(t+2+u+2);m.socketData+=v}}if(u==0){e(m.socketXHeader,m.socketData);m.socketParseState=0;m.socketHeader=null}}}}function e(u,t){var w=parseInt(u.Directive[1]);if(isNaN(w)){w=602}if(w==401&&++(m.authcounter)<3){m.challengeParams=m.parseDigest(u["www-authenticate"])}else{var v=m.pendingAjaxCall.shift();m.authcounter=0;m.ActiveAjaxCount--;m.gotNextMessages(t,"success",{status:w},v);m.PerformNextAjax()}}function b(s){m.socketState=0;if(m.socket!=null){m.socket.close();m.socket=null}if(m.pendingAjaxCall.length>0){var t=m.pendingAjaxCall.shift();var u=t[5];m.PerformAjaxExNodeJS2(t[0],t[1],t[2],t[3],t[4],--u)}}function g(u){if(m.socketState==2&&m.socket!=null&&m.socket.readyState==WebSocket.OPEN){var r=new Uint8Array(u.length);for(var t=0;t<u.length;++t){r[t]=u.charCodeAt(t)}try{m.socket.send(r.buffer)}catch(s){}}}m.gotNextMessages=function(s,u,t,r){if(m.FailAllError==999){return}if(m.FailAllError!=0){r[1](null,m.FailAllError,r[2]);return}if(t.status!=200){r[1](null,t.status,r[2]);return}r[1](s,200,r[2])};m.gotNextMessagesError=function(t,u,s,r){if(m.FailAllError==999){return}if(m.FailAllError!=0){r[1](null,m.FailAllError,r[2]);return}r[1](m,null,{Header:{HttpError:t.status}},t.status,r[2])};m.CancelAllQueries=function(r){while(m.PendingAjax.length>0){var t=m.PendingAjax.shift();t[1](null,r,t[2])}if(m.websocket!=null){m.websocket.close();m.websocket=null;m.socketState=0}};return m};var CreateAgentRedirect=function(g,h,l,a,b){var j={};j.m=h;h.parent=j;j.meshserver=g;j.authCookie=a;j.State=0;j.nodeid=null;j.socket=null;j.connectstate=-1;j.tunnelid=Math.random().toString(36).substring(2);j.protocol=h.protocol;j.onStateChanged=null;j.ctrlMsgAllowed=true;j.attemptWebRTC=false;j.webRtcActive=false;j.webSwitchOk=false;j.webchannel=null;j.webrtc=null;j.debugmode=0;j.serverIsRecording=false;if(b==null){b="/"}j.consoleMessage=null;j.onConsoleMessageChange=null;j.Start=function(m){var o,n=window.location.protocol.replace("http","ws")+"//"+window.location.host+window.location.pathname.substring(0,window.location.pathname.lastIndexOf("/"))+"/meshrelay.ashx?browser=1&p="+j.protocol+"&nodeid="+m+"&id="+j.tunnelid;if((a!=null)&&(a!="")){n+="&auth="+a}j.nodeid=m;j.connectstate=0;j.socket=new WebSocket(n);j.socket.onopen=j.xxOnSocketConnected;j.socket.onmessage=j.xxOnMessage;j.socket.onerror=function(p){};j.socket.onclose=j.xxOnSocketClosed;j.xxStateChange(1);j.meshserver.send({action:"msg",type:"tunnel",nodeid:j.nodeid,value:"*"+b+"meshrelay.ashx?p="+j.protocol+"&nodeid="+m+"&id="+j.tunnelid,usage:j.protocol})};j.xxOnSocketConnected=function(){if(j.debugmode==1){console.log("onSocketConnected")}j.xxStateChange(2)};j.xxOnControlCommand=function(o){var m;try{m=JSON.parse(o)}catch(n){return}if(m.ctrlChannel!="102938"){j.xxOnSocketData(o);return}if(m.type=="console"){j.consoleMessage=m.msg;if(j.onConsoleMessageChange){j.onConsoleMessageChange(j,j.consoleMessage)}}else{if(j.webrtc!=null){if(m.type=="answer"){j.webrtc.setRemoteDescription(new RTCSessionDescription(m),function(){},j.xxCloseWebRTC)}else{if(m.type=="webrtc0"){j.webSwitchOk=true;k()}else{if(m.type=="webrtc1"){j.sendCtrlMsg('{"ctrlChannel":"102938","type":"webrtc2"}')}else{if(m.type=="webrtc2"){}}}}}}};j.sendCtrlMsg=function(n){if(j.ctrlMsgAllowed==true){if((typeof args!="undefined")&&args.redirtrace){console.log("RedirSend",typeof n,n)}try{j.socket.send(n)}catch(m){}}};function k(){if((j.webSwitchOk==true)&&(j.webRtcActive==true)){j.sendCtrlMsg('{"ctrlChannel":"102938","type":"webrtc0"}');j.sendCtrlMsg('{"ctrlChannel":"102938","type":"webrtc1"}');if(j.onStateChanged!=null){j.onStateChanged(j,j.State)}}}j.xxOnMessage=function(p){if(j.State<3){if((p.data=="c")||(p.data=="cr")){if(p.data=="cr"){j.serverIsRecording=true}try{j.socket.send(j.protocol)}catch(q){}j.xxStateChange(3);if(j.attemptWebRTC==true){var o=null;if(typeof RTCPeerConnection!=="undefined"){j.webrtc=new RTCPeerConnection(o)}else{if(typeof webkitRTCPeerConnection!=="undefined"){j.webrtc=new webkitRTCPeerConnection(o)}}if(j.webrtc!=null){j.webchannel=j.webrtc.createDataChannel("DataChannel",{});j.webchannel.onmessage=j.xxOnMessage;j.webchannel.onopen=function(){j.webRtcActive=true;k()};j.webchannel.onclose=function(t){if(j.webRtcActive){j.Stop()}};j.webrtc.onicecandidate=function(t){if(t.candidate==null){try{j.socket.send(JSON.stringify(j.webrtcoffer))}catch(u){}}else{j.webrtcoffer.sdp+=("a="+t.candidate.candidate+"\r\n")}};j.webrtc.oniceconnectionstatechange=function(){if(j.webrtc!=null){if(j.webrtc.iceConnectionState=="disconnected"){if(j.webRtcActive==true){j.Stop()}else{j.xxCloseWebRTC()}}else{if(j.webrtc.iceConnectionState=="failed"){j.xxCloseWebRTC()}}}};j.webrtc.createOffer(function(t){j.webrtcoffer=t;j.webrtc.setLocalDescription(t,function(){},j.xxCloseWebRTC)},j.xxCloseWebRTC,{mandatory:{OfferToReceiveAudio:false,OfferToReceiveVideo:false}})}}return}}if(typeof p.data=="string"){j.xxOnControlCommand(p.data);return}if(typeof p.data=="object"){if(e==true){d.push(p.data);return}if(c.readAsBinaryString){e=true;c.readAsBinaryString(new Blob([p.data]))}else{if(c.readAsArrayBuffer){e=true;c.readAsArrayBuffer(p.data)}else{var m="",n=new Uint8Array(p.data),s=n.byteLength;for(var r=0;r<s;r++){m+=String.fromCharCode(n[r])}j.xxOnSocketData(m)}}}else{j.xxOnSocketData(p.data)}};var c=new FileReader();var e=false,d=[];if(c.readAsBinaryString){c.onload=function(m){j.xxOnSocketData(m.target.result);if(d.length==0){e=false}else{c.readAsBinaryString(new Blob([d.shift()]))}}}else{if(c.readAsArrayBuffer){c.onloadend=function(m){j.xxOnSocketData(m.target.result);if(d.length==0){e=false}else{c.readAsArrayBuffer(d.shift())}}}}j.xxOnSocketData=function(o){if(!o||j.connectstate==-1){return}if(typeof o==="object"){var m="",n=new Uint8Array(o),q=n.byteLength;for(var p=0;p<q;p++){m+=String.fromCharCode(n[p])}o=m}else{if(typeof o!=="string"){return}}if((typeof args!="undefined")&&args.redirtrace){console.log("RedirRecv",typeof o,o.length,o)}return j.m.ProcessData(o)};j.sendText=function(m){if(typeof m!="string"){m=JSON.stringify(m)}j.send(encode_utf8(m))};j.send=function(q){if((typeof args!="undefined")&&args.redirtrace){console.log("RedirSend",typeof q,q.length,q)}try{if(j.socket!=null&&j.socket.readyState==WebSocket.OPEN){if(typeof q=="string"){if(j.debugmode==1){var m=new Uint8Array(q.length),n=[];for(var p=0;p<q.length;++p){m[p]=q.charCodeAt(p);n.push(q.charCodeAt(p))}if(j.webRtcActive==true){j.webchannel.send(m.buffer)}else{j.socket.send(m.buffer)}}else{var m=new Uint8Array(q.length);for(var p=0;p<q.length;++p){m[p]=q.charCodeAt(p)}if(j.webRtcActive==true){j.webchannel.send(m.buffer)}else{j.socket.send(m.buffer)}}}else{if(j.webRtcActive==true){j.webchannel.send(q)}else{j.socket.send(q)}}}}catch(o){}};j.xxOnSocketClosed=function(){j.Stop(1)};j.xxStateChange=function(m){if(j.State==m){return}j.State=m;j.m.xxStateChange(j.State);if(j.onStateChanged!=null){j.onStateChanged(j,j.State)}};j.xxCloseWebRTC=function(){if(j.webchannel!=null){try{j.webchannel.close()}catch(m){}j.webchannel=null}if(j.webrtc!=null){try{j.webrtc.close()}catch(m){}j.webrtc=null}j.webRtcActive=false};j.Stop=function(n){if(j.debugmode==1){console.log("stop",n)}j.xxCloseWebRTC();j.connectstate=-1;if(j.socket!=null){try{if(j.socket.readyState==1){j.sendCtrlMsg('{"ctrlChannel":"102938","type":"close"}');j.socket.close()}}catch(m){}j.socket=null}j.xxStateChange(0)};return j};var CreateKvmDataChannel=function(h,e,d){var g={};g.m=e;e.parent=g;g.webchannel=h;g.State=0;g.protocol=e.protocol;g.onStateChanged=null;g.onControlMsg=null;g.debugmode=0;g.keepalive=d;g.rtcKeepAlive=null;g.Start=function(){if(g.debugmode==1){console.log("start")}g.xxStateChange(3);g.webchannel.onmessage=g.xxOnMessage;g.rtcKeepAlive=setInterval(g.xxSendRtcKeepAlive,30000)};var a=new FileReader();var c=false,b=[];if(a.readAsBinaryString){a.onload=function(j){g.xxOnSocketData(j.target.result);if(b.length==0){c=false}else{a.readAsBinaryString(new Blob([b.shift()]))}}}else{if(a.readAsArrayBuffer){a.onloadend=function(j){g.xxOnSocketData(j.target.result);if(b.length==0){c=false}else{a.readAsArrayBuffer(b.shift())}}}}g.xxOnMessage=function(l){if(typeof l.data=="string"){if(g.onControlMsg!=null){g.onControlMsg(l.data)}return}if(typeof l.data=="object"){if(c==true){b.push(l.data);return}if(a.readAsBinaryString){c=true;a.readAsBinaryString(new Blob([l.data]))}else{if(f.readAsArrayBuffer){c=true;a.readAsArrayBuffer(l.data)}else{var j="",k=new Uint8Array(l.data),n=k.byteLength;for(var m=0;m<n;m++){j+=String.fromCharCode(k[m])}g.xxOnSocketData(j)}}}else{g.xxOnSocketData(l.data)}};g.xxOnSocketData=function(l){if(!l){return}if(typeof l==="object"){var j="",k=new Uint8Array(l),n=k.byteLength;for(var m=0;m<n;m++){j+=String.fromCharCode(k[m])}l=j}else{if(typeof l!=="string"){return}}return g.m.ProcessData(l)};g.sendCtrlMsg=function(j){if(typeof j=="string"){g.webchannel.send(j);if(g.keepalive!=null){g.keepalive.sendKeepAlive()}}};g.send=function(l){if(typeof l=="string"){var j=new Uint8Array(l.length);for(var k=0;k<l.length;++k){j[k]=l.charCodeAt(k)}l=j}g.webchannel.send(l)};g.xxStateChange=function(j){if(g.State==j){return}g.State=j;g.m.xxStateChange(g.State);if(g.onStateChanged!=null){g.onStateChanged(g,g.State)}};g.Stop=function(){if(g.debugmode==1){console.log("stop")}if(g.rtcKeepAlive!=null){clearInterval(g.rtcKeepAlive);g.rtcKeepAlive=null}g.xxStateChange(0)};g.xxSendRtcKeepAlive=function(){g.sendCtrlMsg(JSON.stringify({action:"ping"}))};return g};var CreateAgentRemoteDesktop=function(a,g){var e={};e.CanvasId=a;if(typeof a==="string"){e.CanvasId=Q(a)}e.Canvas=e.CanvasId.getContext("2d");e.scrolldiv=g;e.State=0;e.PendingOperations=[];e.tilesReceived=0;e.TilesDrawn=0;e.KillDraw=0;e.ipad=false;e.tabletKeyboardVisible=false;e.LastX=0;e.LastY=0;e.touchenabled=0;e.submenuoffset=0;e.touchtimer=null;e.TouchArray={};e.connectmode=0;e.connectioncount=0;e.rotation=0;e.protocol=2;e.debugmode=0;e.firstUpKeys=[];e.stopInput=false;e.localKeyMap=true;e.altPressed=false;e.ctrlPressed=false;e.shiftPressed=false;e.sessionid=0;e.username;e.oldie=false;e.CompressionLevel=50;e.ScalingLevel=1024;e.FrameRateTimer=50;e.FirstDraw=false;e.ScreenWidth=960;e.ScreenHeight=700;e.width=960;e.height=960;e.onScreenSizeChange=null;e.onMessage=null;e.onConnectCountChanged=null;e.onDebugMessage=null;e.onTouchEnabledChanged=null;e.onDisplayinfo=null;e.accumulator=null;var d=["default","progress","crosshair","pointer","help","text","no-drop","move","nesw-resize","ns-resize","nwse-resize","w-resize","alias","wait","none"];e.Start=function(){e.State=0;e.accumulator=null};e.Stop=function(){e.setRotation(0);e.UnGrabKeyInput();e.UnGrabMouseInput();e.touchenabled=0;if(e.onScreenSizeChange!=null){e.onScreenSizeChange(e,e.ScreenWidth,e.ScreenHeight,e.CanvasId)}e.Canvas.clearRect(0,0,e.CanvasId.width,e.CanvasId.height)};e.xxStateChange=function(h){if(e.State==h){return}e.State=h;e.CanvasId.style.cursor="default";switch(h){case 0:e.Stop();break;case 3:break}};e.send=function(h){if(e.debugmode>1){console.log("KSend("+h.length+"): "+rstr2hex(h))}if(e.parent!=null){e.parent.send(h)}};e.ProcessPictureMsg=function(j,l,m){var k=new Image();k.xcount=e.tilesReceived++;var h=e.tilesReceived;k.src="data:image/jpeg;base64,"+btoa(j.substring(4,j.length));k.onload=function(){if(e.Canvas!=null&&e.KillDraw<h&&e.State!=0){e.PendingOperations.push([h,2,k,l,m]);while(e.DoPendingOperations()){}}};k.error=function(){console.log("DecodeTileError")}};e.DoPendingOperations=function(){if(e.PendingOperations.length==0){return false}for(var h=0;h<e.PendingOperations.length;h++){var j=e.PendingOperations[h];if(j[0]==(e.TilesDrawn+1)){if(j[1]==1){e.ProcessCopyRectMsg(j[2])}else{if(j[1]==2){e.Canvas.drawImage(j[2],e.rotX(j[3],j[4]),e.rotY(j[3],j[4]));delete j[2]}}e.PendingOperations.splice(h,1);delete j;e.TilesDrawn++;if(e.TilesDrawn==e.tilesReceived&&e.KillDraw<e.TilesDrawn){e.KillDraw=e.TilesDrawn=e.tilesReceived=0}return true}}if(e.oldie&&e.PendingOperations.length>0){e.TilesDrawn++}return false};e.ProcessCopyRectMsg=function(l){var m=((l.charCodeAt(0)&255)<<8)+(l.charCodeAt(1)&255);var n=((l.charCodeAt(2)&255)<<8)+(l.charCodeAt(3)&255);var h=((l.charCodeAt(4)&255)<<8)+(l.charCodeAt(5)&255);var j=((l.charCodeAt(6)&255)<<8)+(l.charCodeAt(7)&255);var o=((l.charCodeAt(8)&255)<<8)+(l.charCodeAt(9)&255);var k=((l.charCodeAt(10)&255)<<8)+(l.charCodeAt(11)&255);e.Canvas.drawImage(Canvas.canvas,m,n,o,k,h,j,o,k)};e.SendUnPause=function(){e.send(String.fromCharCode(0,8,0,5,0))};e.SendPause=function(){e.send(String.fromCharCode(0,8,0,5,1))};e.SendCompressionLevel=function(l,j,k,h){if(j){e.CompressionLevel=j}if(k){e.ScalingLevel=k}if(h){e.FrameRateTimer=h}e.send(String.fromCharCode(0,5,0,10,l,e.CompressionLevel)+e.shortToStr(e.ScalingLevel)+e.shortToStr(e.FrameRateTimer))};e.SendRefresh=function(){e.send(String.fromCharCode(0,6,0,4))};e.ProcessScreenMsg=function(j,h){if(e.debugmode>0){console.log("ScreenSize: "+j+" x "+h)}e.Canvas.setTransform(1,0,0,1,0,0);e.rotation=0;e.FirstDraw=true;e.ScreenWidth=e.width=j;e.ScreenHeight=e.height=h;e.KillDraw=e.tilesReceived;while(e.PendingOperations.length>0){e.PendingOperations.shift()}e.SendCompressionLevel(1);e.SendUnPause();if(e.onScreenSizeChange!=null){e.onScreenSizeChange(e,e.ScreenWidth,e.ScreenHeight,e.CanvasId)}};e.ProcessData=function(j){var h=0;while(h<j.length){h+=e.ProcessDataEx(j.substring(h))}};e.ProcessDataEx=function(s){if(e.accumulator!=null){s=e.accumulator+s;e.accumulator=null}if(e.debugmode>1){console.log("KRecv("+s.length+"): "+rstr2hex(s.substring(0,Math.min(s.length,40))))}if(s.length<4){return}var h=null,t=0,u=0,k=ReadShort(s,0),j=ReadShort(s,2),q=0;if((k==27)&&(j==8)){if(s.length<12){return}k=ReadShort(s,8);j=ReadInt(s,4);if((j+8)>s.length){e.accumulator=s;return}s=s.substring(8);q=8}if((j!=s.length)&&(e.debugmode>0)){console.log(j,s.length,j==s.length)}if((k>=18)&&(k!=65)&&(k!=88)){console.error("Invalid KVM command "+k+" of size "+j);console.log("Invalid KVM data",s.length,rstr2hex(s.substring(0,40))+"...");return}if(j>s.length){e.accumulator=s;return}if(k==3||k==4||k==7){h=s.substring(4,j);t=((h.charCodeAt(0)&255)<<8)+(h.charCodeAt(1)&255);u=((h.charCodeAt(2)&255)<<8)+(h.charCodeAt(3)&255);if(e.debugmode>0){console.log("CMD"+k+" at X="+t+" Y="+u)}}switch(k){case 3:if(e.FirstDraw){e.onResize()}e.ProcessPictureMsg(h,t,u);break;case 4:if(e.FirstDraw){e.onResize()}if(e.TilesDrawn==e.tilesReceived){e.ProcessCopyRectMsg(h)}else{e.PendingOperations.push([++tilesReceived,1,h])}break;case 7:e.ProcessScreenMsg(t,u);e.SendKeyMsgKC(e.KeyAction.UP,16);e.SendKeyMsgKC(e.KeyAction.UP,17);e.SendKeyMsgKC(e.KeyAction.UP,18);e.SendKeyMsgKC(e.KeyAction.UP,91);e.SendKeyMsgKC(e.KeyAction.UP,92);e.SendKeyMsgKC(e.KeyAction.UP,16);e.send(String.fromCharCode(0,14,0,4));break;case 11:var r=0,o={},m=((s.charCodeAt(4)&255)<<8)+(s.charCodeAt(5)&255);if(m>0){r=((s.charCodeAt(6+(m*2))&255)<<8)+(s.charCodeAt(7+(m*2))&255);for(var p=0;p<m;p++){var n=((s.charCodeAt(6+(p*2))&255)<<8)+(s.charCodeAt(7+(p*2))&255);if(n==65535){o[n]="All Displays"}else{o[n]="Display "+n}}}if(e.onDisplayinfo!=null){e.onDisplayinfo(e,o,r)}break;case 12:break;case 14:e.touchenabled=1;e.TouchArray={};if(e.onTouchEnabledChanged!=null){e.onTouchEnabledChanged(e.touchenabled)}break;case 15:e.TouchArray={};break;case 16:e.connectioncount=ReadInt(s,4);if(e.onConnectCountChanged!=null){e.onConnectCountChanged(e.connectioncount,e)}break;case 17:if(e.onMessage!=null){e.onMessage(s.substring(4,j),e)}break;case 65:s=s.substring(4);if(s[0]!="."){console.log(s);if(e.parent!=null){e.parent.consoleMessage=s;if(e.parent.onConsoleMessageChange){e.parent.onConsoleMessageChange(e.parent,s)}}}else{console.log("KVM: "+s.substring(1))}break;case 88:if(j!=5){break}var l=s.charCodeAt(4);if(l>d.length){l=0}e.CanvasId.style.cursor=d[l];break}return j+q};e.MouseButton={NONE:0,LEFT:2,RIGHT:8,MIDDLE:32};e.KeyAction={NONE:0,DOWN:1,UP:2,SCROLL:3,EXUP:4,EXDOWN:5,DBLCLICK:6};e.InputType={KEY:1,MOUSE:2,CTRLALTDEL:10,TOUCH:15};e.Alternate=0;var c={Pause:19,CapsLock:20,Space:32,Quote:222,Minus:189,NumpadMultiply:106,NumpadAdd:107,PrintScreen:44,Comma:188,NumpadSubtract:109,NumpadDecimal:110,Period:190,Slash:191,NumpadDivide:111,Semicolon:186,Equal:187,OSLeft:91,BracketLeft:219,OSRight:91,Backslash:220,BracketRight:221,ContextMenu:93,Backquote:192,NumLock:144,ScrollLock:145,Backspace:8,Tab:9,Enter:13,NumpadEnter:13,Escape:27,Delete:46,Home:36,PageUp:33,PageDown:34,ArrowLeft:37,ArrowUp:38,ArrowRight:39,ArrowDown:40,End:35,Insert:45,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,MetaLeft:91,MetaRight:92,VolumeMute:181};function b(h){if(h.code.startsWith("Key")&&h.code.length==4){return h.code.charCodeAt(3)}if(h.code.startsWith("Digit")&&h.code.length==6){return h.code.charCodeAt(5)}if(h.code.startsWith("Numpad")&&h.code.length==7){return h.code.charCodeAt(6)+48}return c[h.code]}e.SendKeyMsg=function(h,j){if(h==null){return}if(!j){j=window.event}if(j.code&&(e.localKeyMap==false)){var k=b(j);if(k!=null){e.SendKeyMsgKC(h,k)}}else{var k=j.keyCode;if(k==59){k=186}else{if(k==173){k=189}else{if(k==61){k=187}}}e.SendKeyMsgKC(h,k)}};e.SendMessage=function(h){if(e.State==3){e.send(String.fromCharCode(0,17)+e.shortToStr(4+h.length)+h)}};e.SendKeyMsgKC=function(h,k){if(e.State!=3){return}if(typeof h=="object"){for(var j in h){e.SendKeyMsgKC(h[j][0],h[j][1])}}else{e.send(String.fromCharCode(0,e.InputType.KEY,0,6,(h-1),k))}};e.sendcad=function(){e.SendCtrlAltDelMsg()};e.SendCtrlAltDelMsg=function(){if(e.State==3){e.send(String.fromCharCode(0,e.InputType.CTRLALTDEL,0,4))}};e.SendEscKey=function(){if(e.State==3){e.send(String.fromCharCode(0,e.InputType.KEY,0,6,0,27,0,e.InputType.KEY,0,6,1,27))}};e.SendStartMsg=function(){e.SendKeyMsgKC(e.KeyAction.EXDOWN,91);e.SendKeyMsgKC(e.KeyAction.EXUP,91)};e.SendCharmsMsg=function(){e.SendKeyMsgKC(e.KeyAction.EXDOWN,91);e.SendKeyMsgKC(e.KeyAction.DOWN,67);e.SendKeyMsgKC(e.KeyAction.UP,67);e.SendKeyMsgKC(e.KeyAction.EXUP,91)};e.SendTouchMsg1=function(j,h,k,l){if(e.State==3){e.send(String.fromCharCode(0,e.InputType.TOUCH)+e.shortToStr(14)+String.fromCharCode(1,j)+e.intToStr(h)+e.shortToStr(k)+e.shortToStr(l))}};e.SendTouchMsg2=function(l,h){var n="";var j;var o="TOUCHSEND: ";for(var m in e.TouchArray){if(m==l){j=h}else{if(e.TouchArray[m].f==1){j=65536|2|4;e.TouchArray[m].f=3;o+="START"+m}else{if(e.TouchArray[m].f==2){j=262144;o+="STOP"+m}else{j=2|4|131072}}}n+=String.fromCharCode(m)+e.intToStr(j)+e.shortToStr(e.TouchArray[m].x)+e.shortToStr(e.TouchArray[m].y);if(e.TouchArray[m].f==2){delete e.TouchArray[m]}}if(e.State==3){e.send(String.fromCharCode(0,e.InputType.TOUCH)+e.shortToStr(5+n.length)+String.fromCharCode(2)+n)}if(Object.keys(e.TouchArray).length==0&&e.touchtimer!=null){clearInterval(e.touchtimer);e.touchtimer=null}};e.SendMouseMsg=function(h,l){if(e.State!=3){return}if(h!=null&&e.Canvas!=null){if(!l){var l=window.event}var o=(e.Canvas.canvas.height/e.CanvasId.clientHeight);var p=(e.Canvas.canvas.width/e.CanvasId.clientWidth);var n=e.GetPositionOfControl(e.Canvas.canvas);var q=((l.pageX-n[0])*p);var r=((l.pageY-n[1])*o);if(l.addx){q+=l.addx}if(l.addy){r+=l.addy}if(q>=0&&q<=e.Canvas.canvas.width&&r>=0&&r<=e.Canvas.canvas.height){var j=0;var k=0;if(h==e.KeyAction.UP||h==e.KeyAction.DOWN){if(l.which){((l.which==1)?(j=e.MouseButton.LEFT):((l.which==2)?(j=e.MouseButton.MIDDLE):(j=e.MouseButton.RIGHT)))}else{if(l.button){((l.button==0)?(j=e.MouseButton.LEFT):((l.button==1)?(j=e.MouseButton.MIDDLE):(j=e.MouseButton.RIGHT)))}}}else{if(h==e.KeyAction.SCROLL){if(l.detail){k=(-1*(l.detail*120))}else{if(l.wheelDelta){k=(l.wheelDelta*3)}}}}var m="";if(h==e.KeyAction.DBLCLICK){m=String.fromCharCode(0,e.InputType.MOUSE,0,10,0,136,((q/256)&255),(q&255),((r/256)&255),(r&255))}else{if(h==e.KeyAction.SCROLL){m=String.fromCharCode(0,e.InputType.MOUSE,0,12,0,0,((q/256)&255),(q&255),((r/256)&255),(r&255),((k/256)&255),(k&255))}else{m=String.fromCharCode(0,e.InputType.MOUSE,0,10,0,((h==e.KeyAction.DOWN)?j:((j*2)&255)),((q/256)&255),(q&255),((r/256)&255),(r&255))}}if(e.Action==e.KeyAction.NONE){if(e.Alternate==0||e.ipad){e.send(m);e.Alternate=1}else{e.Alternate=0}}else{e.send(m)}}}};e.GetDisplayNumbers=function(){e.send(String.fromCharCode(0,11,0,4))};e.SetDisplay=function(h){console.log("Set display",h);e.send(String.fromCharCode(0,12,0,6,h>>8,h&255))};e.intToStr=function(h){return String.fromCharCode((h>>24)&255,(h>>16)&255,(h>>8)&255,h&255)};e.shortToStr=function(h){return String.fromCharCode((h>>8)&255,h&255)};e.onResize=function(){if(e.ScreenWidth==0||e.ScreenHeight==0){return}if(e.Canvas.canvas.width==e.ScreenWidth&&e.Canvas.canvas.height==e.ScreenHeight){return}if(e.FirstDraw){e.Canvas.canvas.width=e.ScreenWidth;e.Canvas.canvas.height=e.ScreenHeight;e.Canvas.fillRect(0,0,e.ScreenWidth,e.ScreenHeight);if(e.onScreenSizeChange!=null){e.onScreenSizeChange(e,e.ScreenWidth,e.ScreenHeight,e.CanvasId)}}e.FirstDraw=false};e.xxMouseInputGrab=false;e.xxKeyInputGrab=false;e.xxMouseMove=function(h){if(e.State==3){e.SendMouseMsg(e.KeyAction.NONE,h)}if(h.preventDefault){h.preventDefault()}if(h.stopPropagation){h.stopPropagation()}return false};e.xxMouseUp=function(h){if(e.State==3){e.SendMouseMsg(e.KeyAction.UP,h)}if(h.preventDefault){h.preventDefault()}if(h.stopPropagation){h.stopPropagation()}return false};e.xxMouseDown=function(h){if(e.State==3){e.SendMouseMsg(e.KeyAction.DOWN,h)}if(h.preventDefault){h.preventDefault()}if(h.stopPropagation){h.stopPropagation()}return false};e.xxMouseDblClick=function(h){if(e.State==3){e.SendMouseMsg(e.KeyAction.DBLCLICK,h)}if(h.preventDefault){h.preventDefault()}if(h.stopPropagation){h.stopPropagation()}return false};e.xxDOMMouseScroll=function(h){if(e.State==3){e.SendMouseMsg(e.KeyAction.SCROLL,h);return false}return true};e.xxMouseWheel=function(h){if(e.State==3){e.SendMouseMsg(e.KeyAction.SCROLL,h);return false}return true};e.xxKeyUp=function(h){if(e.State==3){e.SendKeyMsg(e.KeyAction.UP,h)}if(h.preventDefault){h.preventDefault()}if(h.stopPropagation){h.stopPropagation()}return false};e.xxKeyDown=function(h){if(e.State==3){e.SendKeyMsg(e.KeyAction.DOWN,h)}if(h.preventDefault){h.preventDefault()}if(h.stopPropagation){h.stopPropagation()}return false};e.xxKeyPress=function(h){if(h.preventDefault){h.preventDefault()}if(h.stopPropagation){h.stopPropagation()}return false};e.handleKeys=function(h){if(e.stopInput==true||desktop.State!=3){return false}return e.xxKeyPress(h)};e.handleKeyUp=function(h){if(e.stopInput==true||desktop.State!=3){return false}if(e.firstUpKeys.length<5){e.firstUpKeys.push(h.keyCode);if((e.firstUpKeys.length==5)){var k=e.firstUpKeys.join(",");if((k=="16,17,91,91,16")||(k=="16,17,18,91,92")){e.stopInput=true}}}if(h.keyCode==16){e.shiftPressed=false}if(h.keyCode==17){e.ctrlPressed=false}if(h.keyCode==18){e.altPressed=false}return e.xxKeyUp(h)};e.handleKeyDown=function(h){if(e.stopInput==true||desktop.State!=3){return false}if(h.keyCode==16){e.shiftPressed=true}if(h.keyCode==17){e.ctrlPressed=true}if(h.keyCode==18){e.altPressed=true}return e.xxKeyDown(h)};e.handleReleaseKeys=function(){if(e.shiftPressed){e.SendKeyMsgKC(e.KeyAction.UP,16)}if(e.ctrlPressed){e.SendKeyMsgKC(e.KeyAction.UP,17)}if(e.altPressed){e.SendKeyMsgKC(e.KeyAction.UP,18)}e.shiftPressed=e.ctrlPressed=e.altPressed=false};e.mousedblclick=function(h){if(e.stopInput==true){return false}return e.xxMouseDblClick(h)};e.mousedown=function(h){if(e.stopInput==true){return false}return e.xxMouseDown(h)};e.mouseup=function(h){if(e.stopInput==true){return false}return e.xxMouseUp(h)};e.mousemove=function(h){if(e.stopInput==true){return false}return e.xxMouseMove(h)};e.mousewheel=function(h){if(e.stopInput==true){return false}return e.xxMouseWheel(h)};e.xxMsTouchEvent=function(h){if(h.originalEvent.pointerType==4){return}if(h.preventDefault){h.preventDefault()}if(h.stopPropagation){h.stopPropagation()}if(h.type=="MSPointerDown"||h.type=="MSPointerMove"||h.type=="MSPointerUp"){var j=0;var k=h.originalEvent.pointerId%256;var l=h.offsetX*(Canvas.canvas.width/e.CanvasId.clientWidth);var m=h.offsetY*(Canvas.canvas.height/e.CanvasId.clientHeight);if(h.type=="MSPointerDown"){j=65536|2|4}else{if(h.type=="MSPointerMove"){j=131072|2|4}else{if(h.type=="MSPointerUp"){j=262144}}}if(!e.TouchArray[k]){e.TouchArray[k]={x:l,y:m}}e.SendTouchMsg2(k,j);if(h.type=="MSPointerUp"){delete e.TouchArray[k]}}else{alert(h.type)}return true};e.xxTouchStart=function(h){if(e.State!=3){return}if(h.preventDefault){h.preventDefault()}if(e.touchenabled==0||e.touchenabled==1){if(h.originalEvent.touches.length>1){return}var m=h.originalEvent.touches[0];h.which=1;e.LastX=h.pageX=m.pageX;e.LastY=h.pageY=m.pageY;e.SendMouseMsg(KeyAction.DOWN,h)}else{var l=e.GetPositionOfControl(Canvas.canvas);for(var j in h.originalEvent.changedTouches){if(!h.originalEvent.changedTouches[j].identifier){continue}var k=h.originalEvent.changedTouches[j].identifier%256;if(!e.TouchArray[k]){e.TouchArray[k]={x:(h.originalEvent.touches[j].pageX-l[0])*(Canvas.canvas.width/e.CanvasId.clientWidth),y:(h.originalEvent.touches[j].pageY-l[1])*(Canvas.canvas.height/e.CanvasId.clientHeight),f:1}}}if(Object.keys(e.TouchArray).length>0&&touchtimer==null){e.touchtimer=setInterval(function(){e.SendTouchMsg2(256,0)},50)}}};e.xxTouchMove=function(h){if(e.State!=3){return}if(h.preventDefault){h.preventDefault()}if(e.touchenabled==0||e.touchenabled==1){if(h.originalEvent.touches.length>1){return}var m=h.originalEvent.touches[0];h.which=1;e.LastX=h.pageX=m.pageX;e.LastY=h.pageY=m.pageY;e.SendMouseMsg(e.KeyAction.NONE,h)}else{var l=e.GetPositionOfControl(Canvas.canvas);for(var j in h.originalEvent.changedTouches){if(!h.originalEvent.changedTouches[j].identifier){continue}var k=h.originalEvent.changedTouches[j].identifier%256;if(e.TouchArray[k]){e.TouchArray[k].x=(h.originalEvent.touches[j].pageX-l[0])*(e.Canvas.canvas.width/e.CanvasId.clientWidth);e.TouchArray[k].y=(h.originalEvent.touches[j].pageY-l[1])*(e.Canvas.canvas.height/e.CanvasId.clientHeight)}}}};e.xxTouchEnd=function(h){if(e.State!=3){return}if(h.preventDefault){h.preventDefault()}if(e.touchenabled==0||e.touchenabled==1){if(h.originalEvent.touches.length>1){return}h.which=1;h.pageX=LastX;h.pageY=LastY;e.SendMouseMsg(KeyAction.UP,h)}else{for(var j in h.originalEvent.changedTouches){if(!h.originalEvent.changedTouches[j].identifier){continue}var k=h.originalEvent.changedTouches[j].identifier%256;if(e.TouchArray[k]){e.TouchArray[k].f=2}}}};e.GrabMouseInput=function(){if(e.xxMouseInputGrab==true){return}var h=e.CanvasId;h.onmousemove=e.xxMouseMove;h.onmouseup=e.xxMouseUp;h.onmousedown=e.xxMouseDown;h.touchstart=e.xxTouchStart;h.touchmove=e.xxTouchMove;h.touchend=e.xxTouchEnd;h.MSPointerDown=e.xxMsTouchEvent;h.MSPointerMove=e.xxMsTouchEvent;h.MSPointerUp=e.xxMsTouchEvent;if(navigator.userAgent.match(/mozilla/i)){h.DOMMouseScroll=e.xxDOMMouseScroll}else{h.onmousewheel=e.xxMouseWheel}e.xxMouseInputGrab=true};e.UnGrabMouseInput=function(){if(e.xxMouseInputGrab==false){return}var h=e.CanvasId;h.onmousemove=null;h.onmouseup=null;h.onmousedown=null;h.touchstart=null;h.touchmove=null;h.touchend=null;h.MSPointerDown=null;h.MSPointerMove=null;h.MSPointerUp=null;if(navigator.userAgent.match(/mozilla/i)){h.DOMMouseScroll=null}else{h.onmousewheel=null}e.xxMouseInputGrab=false};e.GrabKeyInput=function(){if(e.xxKeyInputGrab==true){return}document.onkeyup=e.xxKeyUp;document.onkeydown=e.xxKeyDown;document.onkeypress=e.xxKeyPress;e.xxKeyInputGrab=true};e.UnGrabKeyInput=function(){if(e.xxKeyInputGrab==false){return}document.onkeyup=null;document.onkeydown=null;document.onkeypress=null;e.xxKeyInputGrab=false};e.GetPositionOfControl=function(h){var j=Array(2);j[0]=j[1]=0;while(h){j[0]+=h.offsetLeft;j[1]+=h.offsetTop;h=h.offsetParent}return j};e.crotX=function(h,j){if(e.rotation==0){return h}if(e.rotation==1){return j}if(e.rotation==2){return e.Canvas.canvas.width-h}if(e.rotation==3){return e.Canvas.canvas.height-j}};e.crotY=function(h,j){if(e.rotation==0){return j}if(e.rotation==1){return e.Canvas.canvas.width-h}if(e.rotation==2){return e.Canvas.canvas.height-j}if(e.rotation==3){return h}};e.rotX=function(h,j){if(e.rotation==0||e.rotation==1){return h}if(e.rotation==2){return h-e.Canvas.canvas.width}if(e.rotation==3){return h-e.Canvas.canvas.height}};e.rotY=function(h,j){if(e.rotation==0||e.rotation==3){return j}if(e.rotation==1){return j-e.Canvas.canvas.width}if(e.rotation==2){return j-e.Canvas.canvas.height}};e.tcanvas=null;e.setRotation=function(m){while(m<0){m+=4}var h=m%4;if(h==e.rotation){return true}var k=e.Canvas.canvas.width;var j=e.Canvas.canvas.height;if(e.rotation==1||e.rotation==3){k=e.Canvas.canvas.height;j=e.Canvas.canvas.width}if(e.tcanvas==null){e.tcanvas=document.createElement("canvas")}var l=e.tcanvas.getContext("2d");l.setTransform(1,0,0,1,0,0);l.canvas.width=k;l.canvas.height=j;l.rotate((e.rotation*-90)*Math.PI/180);if(e.rotation==0){l.drawImage(e.Canvas.canvas,0,0)}if(e.rotation==1){l.drawImage(e.Canvas.canvas,-e.Canvas.canvas.width,0)}if(e.rotation==2){l.drawImage(e.Canvas.canvas,-e.Canvas.canvas.width,-e.Canvas.canvas.height)}if(e.rotation==3){l.drawImage(e.Canvas.canvas,0,-e.Canvas.canvas.height)}if(e.rotation==0||e.rotation==2){e.Canvas.canvas.height=k;e.Canvas.canvas.width=j}if(e.rotation==1||e.rotation==3){e.Canvas.canvas.height=j;e.Canvas.canvas.width=k}e.Canvas.setTransform(1,0,0,1,0,0);e.Canvas.rotate((h*90)*Math.PI/180);e.rotation=h;e.Canvas.drawImage(e.tcanvas,e.rotX(0,0),e.rotY(0,0));e.ScreenWidth=e.Canvas.canvas.width;e.ScreenHeight=e.Canvas.canvas.height;if(e.onScreenSizeChange!=null){e.onScreenSizeChange(e,e.ScreenWidth,e.ScreenHeight,e.CanvasId)}return true};e.MuchTheSame=function(h,j){return(Math.abs(h-j)<4)};e.Debug=function(h){console.log(h)};e.getIEVersion=function(){var h=-1;if(navigator.appName=="Microsoft Internet Explorer"){var k=navigator.userAgent;var j=new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");if(j.exec(k)!=null){h=parseFloat(RegExp.$1)}}return h};e.haltEvent=function(h){if(h.preventDefault){h.preventDefault()}if(h.stopPropagation){h.stopPropagation()}return false};return e};var QRCode;!function(){function t(c){this.mode=v.MODE_8BIT_BYTE,this.data=c,this.parsedData=[];for(var g=[],h=0,j=this.data.length;j>h;h++){var k=this.data.charCodeAt(h);k>65536?(g[0]=240|(1835008&k)>>>18,g[1]=128|(258048&k)>>>12,g[2]=128|(4032&k)>>>6,g[3]=128|63&k):k>2048?(g[0]=224|(61440&k)>>>12,g[1]=128|(4032&k)>>>6,g[2]=128|63&k):k>128?(g[0]=192|(1984&k)>>>6,g[1]=128|63&k):g[0]=k,this.parsedData=this.parsedData.concat(g)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function u(c,d){this.typeNumber=c,this.errorCorrectLevel=d,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function B(e,g){if(void 0==e.length){throw new Error(e.length+"/"+g)}for(var h=0;h<e.length&&0==e[h];){h++}this.num=new Array(e.length-h+g);for(var j=0;j<e.length-h;j++){this.num[j]=e[j+h]}}function C(c,d){this.totalCount=c,this.dataCount=d}function D(){this.buffer=[],this.length=0}function F(){return"undefined"!=typeof CanvasRenderingContext2D}function G(){var c=!1,d=navigator.userAgent;return/android/i.test(d)&&(c=!0,aMat=d.toString().match(/android ([0-9]\.[0-9])/i),aMat&&aMat[1]&&(c=parseFloat(aMat[1]))),c}function K(d,j){for(var k=1,l=L(d),m=0,n=E.length;n>=m;m++){var o=0;switch(j){case w.L:o=E[m][0];break;case w.M:o=E[m][1];break;case w.Q:o=E[m][2];break;case w.H:o=E[m][3]}if(o>=l){break}k++}if(k>E.length){throw new Error("Too long data")}return k}function L(c){var d=encodeURI(c).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return d.length+(d.length!=c?3:0)}t.prototype={getLength:function(){return this.parsedData.length},write:function(d){for(var e=0,g=this.parsedData.length;g>e;e++){d.put(this.parsedData[e],8)}}},u.prototype={addData:function(a){var d=new t(a);this.dataList.push(d),this.dataCache=null},isDark:function(c,d){if(0>c||this.moduleCount<=c||0>d||this.moduleCount<=d){throw new Error(c+","+d)}return this.modules[c][d]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(b,g){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var h=0;h<this.moduleCount;h++){this.modules[h]=new Array(this.moduleCount);for(var j=0;j<this.moduleCount;j++){this.modules[h][j]=null}}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(b,g),this.typeNumber>=7&&this.setupTypeNumber(b),null==this.dataCache&&(this.dataCache=u.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,g)},setupPositionProbePattern:function(e,g){for(var h=-1;7>=h;h++){if(!(-1>=e+h||this.moduleCount<=e+h)){for(var j=-1;7>=j;j++){-1>=g+j||this.moduleCount<=g+j||(this.modules[e+h][g+j]=h>=0&&6>=h&&(0==j||6==j)||j>=0&&6>=j&&(0==h||6==h)||h>=2&&4>=h&&j>=2&&4>=j?!0:!1)}}}},getBestMaskPattern:function(){for(var e=0,g=0,h=0;8>h;h++){this.makeImpl(!0,h);var j=y.getLostPoint(this);(0==h||e>j)&&(e=j,g=h)}return g},createMovieClip:function(k,l,m){var n=k.createEmptyMovieClip(l,m),o=1;this.make();for(var p=0;p<this.modules.length;p++){for(var q=p*o,r=0;r<this.modules[p].length;r++){var s=r*o,M=this.modules[p][r];M&&(n.beginFill(0,100),n.moveTo(s,q),n.lineTo(s+o,q),n.lineTo(s+o,q+o),n.lineTo(s,q+o),n.endFill())}}return n},setupTimingPattern:function(){for(var c=8;c<this.moduleCount-8;c++){null==this.modules[c][6]&&(this.modules[c][6]=0==c%2)}for(var d=8;d<this.moduleCount-8;d++){null==this.modules[6][d]&&(this.modules[6][d]=0==d%2)}},setupPositionAdjustPattern:function(){for(var j=y.getPatternPosition(this.typeNumber),k=0;k<j.length;k++){for(var l=0;l<j.length;l++){var m=j[k],n=j[l];if(null==this.modules[m][n]){for(var o=-2;2>=o;o++){for(var p=-2;2>=p;p++){this.modules[m+o][n+p]=-2==o||2==o||-2==p||2==p||0==o&&0==p?!0:!1}}}}}},setupTypeNumber:function(e){for(var g=y.getBCHTypeNumber(this.typeNumber),h=0;18>h;h++){var j=!e&&1==(1&g>>h);this.modules[Math.floor(h/3)][h%3+this.moduleCount-8-3]=j}for(var h=0;18>h;h++){var j=!e&&1==(1&g>>h);this.modules[h%3+this.moduleCount-8-3][Math.floor(h/3)]=j}},setupTypeInfo:function(h,j){for(var k=this.errorCorrectLevel<<3|j,l=y.getBCHTypeInfo(k),m=0;15>m;m++){var n=!h&&1==(1&l>>m);6>m?this.modules[m][8]=n:8>m?this.modules[m+1][8]=n:this.modules[this.moduleCount-15+m][8]=n}for(var m=0;15>m;m++){var n=!h&&1==(1&l>>m);8>m?this.modules[8][this.moduleCount-m-1]=n:9>m?this.modules[8][15-m-1+1]=n:this.modules[8][15-m-1]=n}this.modules[this.moduleCount-8][8]=!h},mapData:function(l,m){for(var n=-1,o=this.moduleCount-1,p=7,q=0,r=this.moduleCount-1;r>0;r-=2){for(6==r&&r--;;){for(var s=0;2>s;s++){if(null==this.modules[o][r-s]){var M=!1;q<l.length&&(M=1==(1&l[q]>>>p));var N=y.getMask(m,o,r-s);N&&(M=!M),this.modules[o][r-s]=M,p--,-1==p&&(q++,p=7)}}if(o+=n,0>o||this.moduleCount<=o){o-=n,n=-n;break}}}}},u.PAD0=236,u.PAD1=17,u.createData=function(b,j,k){for(var m=C.getRSBlocks(b,j),n=new D,o=0;o<k.length;o++){var p=k[o];n.put(p.mode,4),n.put(p.getLength(),y.getLengthInBits(p.mode,b)),p.write(n)}for(var q=0,o=0;o<m.length;o++){q+=m[o].dataCount}if(n.getLengthInBits()>8*q){throw new Error("code length overflow. ("+n.getLengthInBits()+">"+8*q+")")}for(n.getLengthInBits()+4<=8*q&&n.put(0,4);0!=n.getLengthInBits()%8;){n.putBit(!1)}for(;;){if(n.getLengthInBits()>=8*q){break}if(n.put(u.PAD0,8),n.getLengthInBits()>=8*q){break}n.put(u.PAD1,8)}return u.createBytes(n,m)},u.createBytes=function(M,N){for(var O=0,P=0,R=0,S=new Array(N.length),T=new Array(N.length),U=0;U<N.length;U++){var V=N[U].dataCount,W=N[U].totalCount-V;P=Math.max(P,V),R=Math.max(R,W),S[U]=new Array(V);for(var X=0;X<S[U].length;X++){S[U][X]=255&M.buffer[X+O]}O+=V;var Y=y.getErrorCorrectPolynomial(W),Z=new B(S[U],Y.getLength()-1),aa=Z.mod(Y);T[U]=new Array(Y.getLength()-1);for(var X=0;X<T[U].length;X++){var ab=X+aa.getLength()-T[U].length;T[U][X]=ab>=0?aa.get(ab):0}}for(var ac=0,X=0;X<N.length;X++){ac+=N[X].totalCount}for(var ad=new Array(ac),ae=0,X=0;P>X;X++){for(var U=0;U<N.length;U++){X<S[U].length&&(ad[ae++]=S[U][X])}}for(var X=0;R>X;X++){for(var U=0;U<N.length;U++){X<T[U].length&&(ad[ae++]=T[U][X])}}return ad};for(var v={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},w={L:1,M:0,Q:3,H:2},x={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},y={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(c){for(var d=c<<10;y.getBCHDigit(d)-y.getBCHDigit(y.G15)>=0;){d^=y.G15<<y.getBCHDigit(d)-y.getBCHDigit(y.G15)}return(c<<10|d)^y.G15_MASK},getBCHTypeNumber:function(c){for(var d=c<<12;y.getBCHDigit(d)-y.getBCHDigit(y.G18)>=0;){d^=y.G18<<y.getBCHDigit(d)-y.getBCHDigit(y.G18)}return c<<12|d},getBCHDigit:function(c){for(var d=0;0!=c;){d++,c>>>=1}return d},getPatternPosition:function(b){return y.PATTERN_POSITION_TABLE[b-1]},getMask:function(d,e,g){switch(d){case x.PATTERN000:return 0==(e+g)%2;case x.PATTERN001:return 0==e%2;case x.PATTERN010:return 0==g%3;case x.PATTERN011:return 0==(e+g)%3;case x.PATTERN100:return 0==(Math.floor(e/2)+Math.floor(g/3))%2;case x.PATTERN101:return 0==e*g%2+e*g%3;case x.PATTERN110:return 0==(e*g%2+e*g%3)%2;case x.PATTERN111:return 0==(e*g%3+(e+g)%2)%2;default:throw new Error("bad maskPattern:"+d)}},getErrorCorrectPolynomial:function(d){for(var e=new B([1],0),g=0;d>g;g++){e=e.multiply(new B([1,z.gexp(g)],0))}return e},getLengthInBits:function(c,d){if(d>=1&&10>d){switch(c){case v.MODE_NUMBER:return 10;case v.MODE_ALPHA_NUM:return 9;case v.MODE_8BIT_BYTE:return 8;case v.MODE_KANJI:return 8;default:throw new Error("mode:"+c)}}else{if(27>d){switch(c){case v.MODE_NUMBER:return 12;case v.MODE_ALPHA_NUM:return 11;case v.MODE_8BIT_BYTE:return 16;case v.MODE_KANJI:return 10;default:throw new Error("mode:"+c)}}else{if(!(41>d)){throw new Error("type:"+d)}switch(c){case v.MODE_NUMBER:return 14;case v.MODE_ALPHA_NUM:return 13;case v.MODE_8BIT_BYTE:return 16;case v.MODE_KANJI:return 12;default:throw new Error("mode:"+c)}}}},getLostPoint:function(m){for(var n=m.getModuleCount(),o=0,p=0;n>p;p++){for(var q=0;n>q;q++){for(var r=0,s=m.isDark(p,q),M=-1;1>=M;M++){if(!(0>p+M||p+M>=n)){for(var N=-1;1>=N;N++){0>q+N||q+N>=n||(0!=M||0!=N)&&s==m.isDark(p+M,q+N)&&r++}}}r>5&&(o+=3+r-5)}}for(var p=0;n-1>p;p++){for(var q=0;n-1>q;q++){var O=0;m.isDark(p,q)&&O++,m.isDark(p+1,q)&&O++,m.isDark(p,q+1)&&O++,m.isDark(p+1,q+1)&&O++,(0==O||4==O)&&(o+=3)}}for(var p=0;n>p;p++){for(var q=0;n-6>q;q++){m.isDark(p,q)&&!m.isDark(p,q+1)&&m.isDark(p,q+2)&&m.isDark(p,q+3)&&m.isDark(p,q+4)&&!m.isDark(p,q+5)&&m.isDark(p,q+6)&&(o+=40)}}for(var q=0;n>q;q++){for(var p=0;n-6>p;p++){m.isDark(p,q)&&!m.isDark(p+1,q)&&m.isDark(p+2,q)&&m.isDark(p+3,q)&&m.isDark(p+4,q)&&!m.isDark(p+5,q)&&m.isDark(p+6,q)&&(o+=40)}}for(var P=0,q=0;n>q;q++){for(var p=0;n>p;p++){m.isDark(p,q)&&P++}}var R=Math.abs(100*P/n/n-50)/5;return o+=10*R}},z={glog:function(b){if(1>b){throw new Error("glog("+b+")")}return z.LOG_TABLE[b]},gexp:function(b){for(;0>b;){b+=255}for(;b>=256;){b-=255}return z.EXP_TABLE[b]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},A=0;8>A;A++){z.EXP_TABLE[A]=1<<A}for(var A=8;256>A;A++){z.EXP_TABLE[A]=z.EXP_TABLE[A-4]^z.EXP_TABLE[A-5]^z.EXP_TABLE[A-6]^z.EXP_TABLE[A-8]}for(var A=0;255>A;A++){z.LOG_TABLE[z.EXP_TABLE[A]]=A}B.prototype={get:function(b){return this.num[b]},getLength:function(){return this.num.length},multiply:function(e){for(var g=new Array(this.getLength()+e.getLength()-1),h=0;h<this.getLength();h++){for(var j=0;j<e.getLength();j++){g[h+j]^=z.gexp(z.glog(this.get(h))+z.glog(e.get(j)))}}return new B(g,0)},mod:function(e){if(this.getLength()-e.getLength()<0){return this}for(var g=z.glog(this.get(0))-z.glog(e.get(0)),h=new Array(this.getLength()),j=0;j<this.getLength();j++){h[j]=this.get(j)}for(var j=0;j<e.getLength();j++){h[j]^=z.gexp(z.glog(e.get(j))+g)}return new B(h,0).mod(e)}},C.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],C.getRSBlocks=function(j,l){var m=C.getRsBlockTable(j,l);if(void 0==m){throw new Error("bad rs block @ typeNumber:"+j+"/errorCorrectLevel:"+l)}for(var n=m.length/3,o=[],p=0;n>p;p++){for(var q=m[3*p+0],r=m[3*p+1],s=m[3*p+2],M=0;q>M;M++){o.push(new C(r,s))}}return o},C.getRsBlockTable=function(c,d){switch(d){case w.L:return C.RS_BLOCK_TABLE[4*(c-1)+0];case w.M:return C.RS_BLOCK_TABLE[4*(c-1)+1];case w.Q:return C.RS_BLOCK_TABLE[4*(c-1)+2];case w.H:return C.RS_BLOCK_TABLE[4*(c-1)+3];default:return void 0}},D.prototype={get:function(c){var d=Math.floor(c/8);return 1==(1&this.buffer[d]>>>7-c%8)},put:function(d,e){for(var g=0;e>g;g++){this.putBit(1==(1&d>>>e-g-1))}},getLengthInBits:function(){return this.length},putBit:function(c){var d=Math.floor(this.length/8);this.buffer.length<=d&&this.buffer.push(0),c&&(this.buffer[d]|=128>>>this.length%8),this.length++}};var E=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],H=function(){var b=function(c,d){this._el=c,this._htOption=d};return b.prototype.draw=function(e){function o(g,h){var j=document.createElementNS("http://www.w3.org/2000/svg",g);for(var k in h){h.hasOwnProperty(k)&&j.setAttribute(k,h[k])}return j}var l=this._htOption,m=this._el,n=e.getModuleCount();Math.floor(l.width/n),Math.floor(l.height/n),this.clear();var p=o("svg",{viewBox:"0 0 "+String(n)+" "+String(n),width:"100%",height:"100%",fill:l.colorLight});p.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),m.appendChild(p),p.appendChild(o("rect",{fill:l.colorDark,width:"1",height:"1",id:"template"}));for(var q=0;n>q;q++){for(var r=0;n>r;r++){if(e.isDark(q,r)){var s=o("use",{x:String(q),y:String(r)});s.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),p.appendChild(s)}}}},b.prototype.clear=function(){for(;this._el.hasChildNodes();){this._el.removeChild(this._el.lastChild)}},b}(),I="svg"===document.documentElement.tagName.toLowerCase(),J=I?H:F()?function(){function g(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function k(m,n){var o=this;if(o._fFail=n,o._fSuccess=m,null===o._bSupportDataURI){var p=document.createElement("img"),q=function(){o._bSupportDataURI=!1,o._fFail&&_fFail.call(o)},r=function(){o._bSupportDataURI=!0,o._fSuccess&&o._fSuccess.call(o)};return p.onabort=q,p.onerror=q,p.onload=r,p.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}o._bSupportDataURI===!0&&o._fSuccess?o._fSuccess.call(o):o._bSupportDataURI===!1&&o._fFail&&o._fFail.call(o)}if(this._android&&this._android<=2.1){var h=1/window.devicePixelRatio,j=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(b,c,m,n,o,p,q,r){if("nodeName" in b&&/img/i.test(b.nodeName)){for(var s=arguments.length-1;s>=1;s--){arguments[s]=arguments[s]*h}}else{"undefined"==typeof r&&(arguments[1]*=h,arguments[2]*=h,arguments[3]*=h,arguments[4]*=h)}j.apply(this,arguments)}}var l=function(c,d){this._bIsPainted=!1,this._android=G(),this._htOption=d,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=d.width,this._elCanvas.height=d.height,c.appendChild(this._elCanvas),this._el=c,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return l.prototype.draw=function(o){var p=this._elImage,q=this._oContext,r=this._htOption,s=o.getModuleCount(),M=r.width/s,N=r.height/s,O=Math.round(M),P=Math.round(N);p.style.display="none",this.clear();for(var R=0;s>R;R++){for(var S=0;s>S;S++){var T=o.isDark(R,S),U=S*M,V=R*N;q.strokeStyle=T?r.colorDark:r.colorLight,q.lineWidth=1,q.fillStyle=T?r.colorDark:r.colorLight,q.fillRect(U,V,M,N),q.strokeRect(Math.floor(U)+0.5,Math.floor(V)+0.5,O,P),q.strokeRect(Math.ceil(U)-0.5,Math.ceil(V)-0.5,O,P)}}this._bIsPainted=!0},l.prototype.makeImage=function(){this._bIsPainted&&k.call(this,g)},l.prototype.isPainted=function(){return this._bIsPainted},l.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},l.prototype.round=function(b){return b?Math.floor(1000*b)/1000:b},l}():function(){var b=function(c,d){this._el=c,this._htOption=d};return b.prototype.draw=function(m){for(var n=this._htOption,o=this._el,p=m.getModuleCount(),q=Math.floor(n.width/p),r=Math.floor(n.height/p),s=['<table style="border:0;border-collapse:collapse;">'],M=0;p>M;M++){s.push("<tr>");for(var N=0;p>N;N++){s.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:'+q+"px;height:"+r+"px;background-color:"+(m.isDark(M,N)?n.colorDark:n.colorLight)+';"></td>')}s.push("</tr>")}s.push("</table>"),o.innerHTML=s.join("");var O=o.childNodes[0],P=(n.width-O.offsetWidth)/2,R=(n.height-O.offsetHeight)/2;P>0&&R>0&&(O.style.margin=R+"px "+P+"px")},b.prototype.clear=function(){this._el.innerHTML=""},b}();QRCode=function(d,e){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:w.H},"string"==typeof e&&(e={text:e}),e){for(var g in e){this._htOption[g]=e[g]}}"string"==typeof d&&(d=document.getElementById(d)),this._android=G(),this._el=d,this._oQRCode=null,this._oDrawing=new J(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(b){this._oQRCode=new u(K(b,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(b),this._oQRCode.make(),this._el.title=b,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=w}();"use strict";var webState="{{{webstate}}}";if(webState!=""){webState=JSON.parse(decodeURIComponent(webState))}for(var i in webState){localStorage.setItem(i,webState[i])}if(!webState.loctag){delete localStorage.removeItem("loctag")}var args;var autoReconnect=true;var powerStatetable=["","Powered","Sleep","Sleep","Sleep","Hibernating","Power off","Present"];var StatusStrs=["Disconnected","Connecting...","Setup...","Connected","Intel® AMT Connected"];var sort=0;var searchFocus=0;var mapSearchFocus=0;var userSearchFocus=0;var consoleFocus=0;var showRealNames=false;var meshserver=null;var meshes={};var meshcount=0;var nodes=null;var filetree={};var userinfo=null;var serverinfo=null;var events=[];var users=null;var wssessions=null;var nodeShortIdent=0;var desktop;var desktopsettings={encoding:2,showfocus:false,showmouse:true,showcad:true,quality:40,scaling:1024,framerate:50,localkeymap:false};var multidesktopsettings={quality:20,scaling:128,framerate:1000};var terminal;var files;var debugLevel=parseInt("{{{debuglevel}}}");var features=parseInt("{{{features}}}");var sessionTime=parseInt("{{{sessiontime}}}");var domain="{{{domain}}}";var domainUrl="{{{domainurl}}}";var authCookie="{{{authCookie}}}";var authCookieRenewTimer=null;var multiDesktop={};var multiDesktopFilter=null;var serverPublicNamePort="{{{serverDnsName}}}:{{{serverPublicPort}}}";var amtScanResults=null;var debugmode=0;var clickOnce=(((features&256)!=0)&&detectClickOnce());var attemptWebRTC=((features&128)!=0);var passRequirements="{{{passRequirements}}}";if(passRequirements!=""){passRequirements=JSON.parse(decodeURIComponent(passRequirements))}var deskAspectRatio=0;try{deskAspectRatio=parseInt(getstore("deskAspectRatio","0"))}catch(ex){}var uiMode=parseInt(getstore("uiMode",1));var webPageStackMenu=false;var webPageFullScreen=true;var nightMode=(getstore("_nightMode","0")=="1");var sessionActivity=Date.now();var updateSessionTimer=null;var p11DeskConsoleMsgTimer=null;var p12TermConsoleMsgTimer=null;var p13FilesConsoleMsgTimer=null;function startup(){if((features&32)==0){var h=null;try{h=top.location.toString().toLowerCase()}catch(b){}if(top!=self&&(h==null||top.active==false)){top.location=self.location;return}}args=parseUriArgs();if(!args.locale){var l=getstore("loctag",0);if((l!=null)&&(l!="*")){args.locale=l}}debugmode=args.debug;if(args.webrtc!=null){attemptWebRTC=(args.webrtc==1)}QV("p13AutoConnect",debugmode);QV("autoconnectbutton2",debugmode);QV("autoconnectbutton1",debugmode);if(nightMode){QC("body").add("night")}toggleFullScreen();if(args.hide){var d=parseInt(args.hide);QV("masthead",!(d&1));QV("topbar",!(d&2));QV("footer",!(d&4));QV("p10title",!(d&8));QV("p11title",!(d&8));QV("p12title",!(d&8));QV("p13title",!(d&8));QV("p14title",!(d&8));QV("p15title",!(d&8));QV("p16title",!(d&8));QS("container")["grid-template-rows"]=((d&1)?"0":"66")+"px "+((d&2)?"0":"24")+"px auto "+((d&4)?"0":"45")+"px";QS("container")["-ms-grid-rows"]=((d&1)?"0":"66")+"px "+((d&2)?"0":"24")+"px auto "+((d&4)?"0":"45")+"px";var m=(((d&1)?0:66)+((d&2)?0:24)+((d&4)?0:45)+((d&8)?0:60));QS("p3users")["max-height"]="calc(100vh - "+(124+m)+"px)";QS("p3events")["height"]="calc(100vh - "+(124+m)+"px)";QS("deskarea3x")["height"]="calc(100vh - "+(75+m)+"px)";QS("deskarea3x")["max-height"]="calc(100vh - "+(75+m)+"px)";QS("p5filetable")["height"]="calc(100vh - "+(160+m)+"px)";QS("p13filetable")["height"]="calc(100vh - "+(124+m)+"px)";QS("serverMainStats")["height"]="calc(100vh - "+(110+m)+"px)";QS("serverMainStats")["max-height"]="calc(100vh - "+(110+m)+"px)";QS("xdevices")["max-height"]="calc(100vh - "+(124+m)+"px)";QS("xdevicesmap")["max-height"]="calc(100vh - "+(124+m)+"px)";QS("p15agentConsole")["height"]="calc(100vh - "+(84+m)+"px)";QS("p15agentConsole")["max-height"]="calc(100vh - "+(84+m)+"px)";QS("p15agentConsoleText")["height"]="calc(100vh - "+(81+m)+"px)";QS("p15agentConsoleText")["max-height"]="calc(100vh - "+(81+m)+"px)"}if("{{currentNode}}"!=""){QV("p10BackButton",false);QV("p11BackButton",false);QV("p12BackButton",false);QV("p13BackButton",false);QV("p14BackButton",false);QV("p15BackButton",false);QV("p16BackButton",false)}p1updateInfo();document.onclick=function(c){hideContextMenu()};document.onkeypress=ondockeypress;document.onkeydown=ondockeydown;document.onkeyup=ondockeyup;window.addEventListener("blur",ondocblur,false);window.onresize=function(){masterUpdate(512)};setTimeout(function(){masterUpdate(512)},200);meshserver=MeshServerCreateControl(domainUrl,authCookie);meshserver.onStateChanged=onStateChanged;meshserver.onMessage=onMessage;meshserver.trace=(args.trace==1);meshserver.Start();Q("sortselect").selectedIndex=sort=getstore("sort",0);Q("sizeselect").selectedIndex=getstore("_viewsize",1);Q("SearchInput").value=getstore("_search","");showRealNames=(getstore("showRealNames",0)==1);Q("RealNameCheckBox").checked=showRealNames;Q("viewselect").value=getstore("_deviceView",1);Q("DeskControl").checked=(getstore("DeskControl",1)==1);QV("accountChangeEmailAddressSpan",(features&2097152)==0);masterUpdate(3);for(var g=1;g<5;g++){Q("devViewButton"+g).classList.remove("viewSelectorSel")}Q("devViewButton"+Q("viewselect").value).classList.add("viewSelectorSel");Q("p5filetable").addEventListener("drop",p5fileDragDrop,false);Q("p5filetable").addEventListener("dragover",p5fileDragOver,false);Q("p5filetable").addEventListener("dragleave",p5fileDragLeave,false);Q("p13filetable").addEventListener("drop",p13fileDragDrop,false);Q("p13filetable").addEventListener("dragover",p13fileDragOver,false);Q("p13filetable").addEventListener("dragleave",p13fileDragLeave,false);setInterval(updateDeviceTimeline,120000);var k=localStorage.getItem("desktopsettings");if(k!=null){desktopsettings=JSON.parse(k)}k=localStorage.getItem("multidesktopsettings");if(k!=null){multidesktopsettings=JSON.parse(k)}applyDesktopSettings();var l="";for(var a=1;a<27;a++){l+="<option value='"+a+"'>Ctrl-"+String.fromCharCode(64+a)+" ("+a+")</option>"}QH("specialkeylist",l);setupGeneralServerStats();setupServerTimelineStats();userInterfaceSelectMenu();QV("p4UserBatchCreate",(features&524288)==0)}function toggleAspectRatio(a){if(a===1){deskAspectRatio=((deskAspectRatio+1)%3);putstore("deskAspectRatio",deskAspectRatio)}deskAdjust()}function toggleStackMenu(a){if(webPageFullScreen==true){if(a===1){webPageStackMenu=!webPageStackMenu;putstore("webPageStackMenu",webPageStackMenu)}if(webPageStackMenu==false){QC("body").remove("menu_stack")}else{QC("body").add("menu_stack");if(xxcurrentView>=10){QC("column_l").remove("room4submenu")}}deskAdjust()}}function showUserInterfaceSelectMenu(){Q("uiViewButton1").classList.remove("uiSelectorSel");Q("uiViewButton2").classList.remove("uiSelectorSel");Q("uiViewButton3").classList.remove("uiSelectorSel");Q("uiViewButton4").classList.remove("uiSelectorSel");try{Q("uiViewButton"+uiMode).classList.add("uiSelectorSel")}catch(a){}QV("uiMenu",(QS("uiMenu").display=="none"));if(nightMode){Q("uiViewButton4").classList.add("uiSelectorSel")}}function userInterfaceSelectMenu(a){if(a){uiMode=a;putstore("uiMode",uiMode)}webPageFullScreen=(uiMode<3);webPageStackMenu=(uiMode>1);toggleFullScreen(0);toggleStackMenu(0);if(webPageStackMenu&&(xxcurrentView>=10)){QC("column_l").add("room4submenu")}else{QC("column_l").remove("room4submenu")}}function toggleNightMode(){nightMode=!nightMode;if(nightMode){QC("body").add("night")}else{QC("body").remove("night")}putstore("_nightMode",nightMode?"1":"0")}function toggleFullScreen(b){if(b===1){webPageFullScreen=!webPageFullScreen;putstore("webPageFullScreen",webPageFullScreen)}var a=0;if(args.hide){a=parseInt(args.hide)}if(webPageFullScreen==false){QC("body").remove("menu_stack");QC("body").remove("fullscreen");QC("body").remove("arg_hide");if(xxcurrentView>=10){QC("column_l").add("room4submenu")}QV("UserDummyMenuSpan",false)}else{QC("body").add("fullscreen");if(a&16){QC("body").add("arg_hide")}QV("page_leftbar",!(a&16));QV("MainMenuSpan",!(a&16));if(xxcurrentView>=10){QC("column_l").remove("room4submenu")}QV("UserDummyMenuSpan",(xxcurrentView<10)&&webPageFullScreen)}masterUpdate(512);QV("body",true)}function getNodeFromId(b){if(nodes!=null){for(var a in nodes){if(nodes[a]._id==b){return nodes[a]}}}return null}function reload(){var a=window.location.href;if(a.endsWith("/#")){a=a.substring(0,a.length-2)}window.location.href=a}function onStateChanged(c,d,b,a){if(d==0){setDialogMode(0);go(0);powerTimeline=null;powerTimelineReq=null;powerTimelineNode=null;powerTimelineUpdate=null;deleteAllNotifications();hideContextMenu();QV("verifyEmailId2",false);QV("logoutControl",false);if(a=="noauth"){QH("p0span","Unable to perform authentication");return}if(b==2){if(autoReconnect){setTimeout(serverPoll,5000)}}else{QH("p0span","Unable to connect web socket")}if(authCookieRenewTimer!=null){clearInterval(authCookieRenewTimer);authCookieRenewTimer=null}}else{if(d==2){meshserver.send({action:"meshes"});meshserver.send({action:"nodes",id:"{{currentNode}}"});if("{{currentNode}}"==""){meshserver.send({action:"files"})}if("{{viewmode}}"==""){go(1)}authCookieRenewTimer=setInterval(function(){meshserver.send({action:"authcookie"})},1800000)}}}function serverPoll(){var b=null;try{b=new XDomainRequest()}catch(a){}if(!b){b=new XMLHttpRequest()}b.open("HEAD",window.location.href);b.timeout=15000;b.onload=function(){reload()};b.onerror=b.ontimeout=function(){setTimeout(serverPoll,10000)};b.send()}function detectClickOnce(){for(var a in window.navigator.mimeTypes){if(window.navigator.mimeTypes[a].type=="application/x-ms-application"){return true}}var b=window.navigator.userAgent.toUpperCase();return(b.indexOf(".NET CLR 3.5")>=0)||(b.indexOf("(WINDOWS NT ")>=0)}function updateSiteAdmin(){var a="{{{noServerBackup}}}";var b=userinfo.siteadmin;if(a==1){b&=4294967290}QV("p2AccountSecurity",((features&4)==0)&&(serverinfo.domainauth==false)&&((features&4096)!=0));QV("p2AccountActions",((features&4)==0)&&(serverinfo.domainauth==false));QV("p2AccountImage",((features&4)==0)&&(serverinfo.domainauth==false));QV("p2ServerActions",b&21);QV("LeftMenuMyServer",b&21);QV("MainMenuMyServer",b&21);QV("p2ServerActionsBackup",b&1);QV("p2ServerActionsRestore",b&4);QV("p2ServerActionsVersion",b&16);QV("MainMenuMyFiles",b&8);QV("LeftMenuMyFiles",b&8);if(((b&8)==0)&&(xxcurrentView==5)){setDialogMode(0);go(1)}if(currentNode!=null){gotoDevice(currentNode._id,xxcurrentView,true)}if((userinfo.siteadmin&2)!=0){if(users==null){meshserver.send({action:"users"})}if(wssessions==null){meshserver.send({action:"wssessioncount"})}}else{users=null;wssessions=null;updateUsers();if(xxcurrentView==4||((xxcurrentView>=30)&&(xxcurrentView<40))){setDialogMode(0);go(1);currentUser=null}}meshserver.send({action:"events",limit:parseInt(p3limitdropdown.value)});QV("ServerConsole",userinfo.siteadmin===4294967295);QV("ServerTrace",userinfo.siteadmin===4294967295);if((xxcurrentView==115)&&(userinfo.siteadmin!=4294967295)){go(6)}if((xxcurrentView==6)&&((userinfo.siteadmin&21)==0)){go(1)}if((b&21)!=0){meshserver.send({action:"serverstats",interval:10000})}}var updateNaggleTimer=null;var updateNaggleFlags=0;function masterUpdate(a){updateNaggleFlags|=a;if(updateNaggleTimer==null){updateNaggleTimer=setTimeout(function(){if(updateNaggleFlags&512){center()}if(updateNaggleFlags&1){onSearchInputChanged()}if(updateNaggleFlags&2){onSortSelectChange(false)}if(updateNaggleFlags&128){updateMeshes()}if(updateNaggleFlags&4){updateDevices()}if(updateNaggleFlags&8){drawNotifications()}if(updateNaggleFlags&16){updateMapMarkers()}if(updateNaggleFlags&32){eventsUpdate()}if(updateNaggleFlags&64){refreshMap(false,true)}if(updateNaggleFlags&256){drawDeviceTimeline()}if(updateNaggleFlags&1024){deviceEventsUpdate()}if(updateNaggleFlags&2048){userEventsUpdate()}if(updateNaggleFlags&4096){p20updateMesh()}updateNaggleTimer=null;updateNaggleFlags=0},150)}}var backupCodesWarningDone=false;function updateSelf(){QV("verifyEmailId",(userinfo.emailVerified!==true)&&(userinfo.email!=null)&&(serverinfo.emailcheck==true));QV("verifyEmailId2",(userinfo.emailVerified!==true)&&(userinfo.email!=null)&&(serverinfo.emailcheck==true));QV("manageOtp",(userinfo.otpsecret==1)||(userinfo.otphkeys>0));QV("authAppSetupCheck",userinfo.otpsecret==1);QV("authKeySetupCheck",userinfo.otphkeys>0);QV("authCodesSetupCheck",userinfo.otpkeys>0);masterUpdate(4+128+4096);if((backupCodesWarningDone==false)&&!(userinfo.otpkeys>0)&&(((userinfo.otpsecret==1)&&!(userinfo.otphkeys>0))||((userinfo.otpsecret!=1)&&(userinfo.otphkeys==1)))){var a={text:"Please add two-factor backup codes. If the current factor is lost, there is not way to recover this account.",title:"Two factor authentication"};addNotification(a);backupCodesWarningDone=true}var b=((userinfo.siteadmin==4294967295)||((userinfo.siteadmin&64)==0));QV("p2createMeshLink1",b);QV("p2createMeshLink2",b);QV("getStarted1",b);QV("getStarted2",!b);if(typeof userinfo.passchange=="number"){if(userinfo.passchange==-1){QH("p2nextPasswordUpdateTime"," - Reset on next login.")}else{if((passRequirements!=null)&&(typeof passRequirements.reset=="number")){var c=(userinfo.passchange)+(passRequirements.reset*86400)-Math.floor(Date.now()/1000);if(c<0){QH("p2nextPasswordUpdateTime"," - Reset on next login.")}else{if(c<3600){QH("p2nextPasswordUpdateTime"," - Reset in "+Math.floor(c/60)+" minute"+addLetterS(Math.floor(c/60))+".")}else{if(c<86400){QH("p2nextPasswordUpdateTime"," - Reset in "+Math.floor(c/3600)+" hour"+addLetterS(Math.floor(c/3600))+".")}else{QH("p2nextPasswordUpdateTime"," - Reset in "+Math.floor(c/86400)+" day"+addLetterS(Math.floor(c/86400))+".")}}}}}}}function addLetterS(a){return(a>1)?"s":""}function setSessionActivity(){sessionActivity=Date.now();QH("idleTimeoutNotify","")}function checkIdleSessionTimeout(){var a=(Date.now()-sessionActivity);if(a>serverinfo.timeout){window.location.href="logout"}else{var b=Math.round((serverinfo.timeout-a)/1000);if(b<=60){QH("idleTimeoutNotify","<br />"+b+" second"+addLetterS(b)+" until disconnect")}else{b=Math.round(b/60);if(b<=5){QH("idleTimeoutNotify","<br />"+b+" minute"+addLetterS(b)+" until disconnect")}}}}function onMessage(U,v){switch(v.action){case"trace":serverTrace.unshift(v);displayServerTrace();break;case"traceinfo":if(typeof v.traceSources=="object"){if((v.traceSources!=null)&&(v.traceSources.length>0)){serverTraceSources=v.traceSources;QH("p41traceStatus",EscapeHtml(v.traceSources.join(", ")))}else{serverTraceSources=[];QH("p41traceStatus","None")}}break;case"serverstats":updateGeneralServerStats(v);break;case"servertimelinestats":setServerTimelineStats(v.events);break;case"authcookie":authCookie=v.cookie;break;case"serverinfo":serverinfo=v.serverinfo;if(serverinfo.timeout){setInterval(checkIdleSessionTimeout,10000);checkIdleSessionTimeout()}if(debugmode==1){console.log("Server time: ",printDateTime(new Date(serverinfo.serverTime)))}break;case"userinfo":userinfo=v.userinfo;updateSiteAdmin();updateSelf();break;case"users":users={};for(var q in v.users){users[v.users[q]._id]=v.users[q]}updateUsers();break;case"wssessioncount":wssessions=v.wssessions;updateUsers();break;case"meshes":meshes={};for(var q in v.meshes){meshes[v.meshes[q]._id]=v.meshes[q]}masterUpdate(4+128);break;case"files":filetree=setupBackPointers(v.filetree);updateFiles();d3updatefiles();break;case"nodes":nodes=[];for(var q in v.nodes){if(!meshes[q]){console.log("Invalid mesh (1): "+q);continue}for(var w in v.nodes[q]){if(v.nodes[q][w]._id==null){console.log("Invalid node ("+w+"): "+JSON.stringify(v.nodes));continue}v.nodes[q][w].namel=v.nodes[q][w].name.toLowerCase();if(v.nodes[q][w].rname){v.nodes[q][w].rnamel=v.nodes[q][w].rname.toLowerCase()}else{v.nodes[q][w].rnamel=v.nodes[q][w].namel}v.nodes[q][w].meshnamel=meshes[q].name.toLowerCase();v.nodes[q][w].meshid=q;v.nodes[q][w].state=(v.nodes[q][w].state)?(v.nodes[q][w].state):0;v.nodes[q][w].desc=v.nodes[q][w].desc;v.nodes[q][w].ip=v.nodes[q][w].ip;if(!v.nodes[q][w].icon){v.nodes[q][w].icon=1}v.nodes[q][w].ident=++nodeShortIdent;nodes.push(v.nodes[q][w])}}masterUpdate(1|2|4|64);if(xxcurrentView==-1){if("{{viewmode}}"!=""){go(parseInt("{{viewmode}}"))}else{setDialogMode(0);go(1)}}if("{{currentNode}}"!=""){gotoDevice("{{currentNode}}",parseInt("{{viewmode}}"))}break;case"powertimeline":if(v.nodeid!=powerTimelineReq){break}powerTimelineNode=v.nodeid;powerTimeline=v.timeline;powerTimelineUpdate=Date.now()+300000;for(var g in powerTimeline){if(g%2==1){powerTimeline[g]=powerTimeline[g]*1000}}if(currentNode._id==v.nodeid){masterUpdate(256)}break;case"getsysinfo":if(v.nodeid!=powerTimelineReq){break}if(v.noinfo===true){QH("p17info","No information for this device.")}else{var ae="",S={};if(v.hardware){if(v.hardware.identifiers){var h=v.hardware.identifiers;ae+="<div class=DevSt style=margin-bottom:3px><b>BIOS</b></div>";if(h.bios_vendor){ae+=addDetailItem("Vendor",h.bios_vendor,S)}if(h.bios_version){ae+=addDetailItem("Version",h.bios_version,S)}ae+="<br />";ae+="<div class=DevSt style=margin-bottom:3px><b>Motherboard</b></div>";if(h.board_vendor){ae+=addDetailItem("Vendor",h.board_vendor,S)}if(h.board_name){ae+=addDetailItem("Name",h.board_name,S)}if(h.board_serial&&(h.board_serial!="")){ae+=addDetailItem("Serial",h.board_serial,S)}if(h.board_version){ae+=addDetailItem("Version",h.board_version,S)}if(h.product_uuid){ae+=addDetailItem("Identifier",h.product_uuid,S)}ae+="<br />"}if(v.hardware.windows){if(v.hardware.windows.memory){ae+="<div class=DevSt style=margin-bottom:3px><b>Memory</b></div>";function u(j,m){if(j.BankLabel>m.BankLabel){return 1}if(j.BankLabel<m.BankLabel){return -1}return 0}v.hardware.windows.memory.sort(u);ae+="<table style=width:100%>";for(var g in v.hardware.windows.memory){var q=v.hardware.windows.memory[g];ae+='<tr><td VALIGN=Top style=width:38px><img src="images/ram2.png" />';ae+="<td><div style=background-color:lightgray;border-radius:5px;padding:8px>";ae+="<div><b>"+q.BankLabel+"</b></div>";if(q.Capacity){ae+=addDetailItem("Capacity / Speed",(q.Capacity/1024/1024)+" Mb, "+q.Speed+" Mhz",S)}if(q.PartNumber){ae+=addDetailItem("Part Number",((q.Manufacturer&&q.Manufacturer!="Undefined")?(q.Manufacturer+", "):"")+q.PartNumber,S)}ae+="</div>"}ae+="</table><br />"}if(v.hardware.windows.osinfo){var q=v.hardware.windows.osinfo;ae+="<div class=DevSt style=margin-bottom:3px><b>Operating System</b></div>";if(q.Caption){ae+=addDetailItem("Name",q.Caption,S)}if(q.Version){ae+=addDetailItem("Version",q.Version,S)}if(q.OSArchitecture){ae+=addDetailItem("Architecture",q.OSArchitecture,S)}ae+="<br />"}}}QH("p17info",ae)}break;case"lastconnect":var D=getNodeFromId(v.nodeid);if(D!=null){D.lastconnect=v.time;D.lastaddr=v.addr;if((currentNode._id==D._id)&&(Q("MainComputerState").innerHTML=="")){QH("MainComputerState","<span>Last seen:<br />"+printDateTime(new Date(D.lastconnect))+"</span>")}}break;case"msg":if(v.nodeid!=null){var k=-1;if(nodes!=null){for(var g in nodes){if(nodes[g]._id==v.nodeid){k=g;break}}}if(k!=-1){if(v.type=="console"){p15consoleReceive(nodes[k],v.value,v.source)}else{if(v.type=="notify"){var w=getstore("notifications",0);if(((w&8)==0)&&(v.amtMessage!=null)){break}var w={text:v.value,title:v.title,icon:v.icon};if(v.nodeid!=null){w.nodeid=v.nodeid}if(v.tag!=null){w.tag=v.tag}if(v.username!=null){w.username=v.username}addNotification(w)}else{if(v.type=="ps"){showDeskToolsProcesses(v)}else{if(v.type=="services"){showDeskToolsServices(v)}else{if((v.type=="getclip")&&(xxdialogTag=="clipboard")&&(currentNode!=null)&&(currentNode._id==v.nodeid)){Q("d2clipText").value=v.data}else{if((v.type=="setclip")&&(xxdialogTag=="clipboard")&&(currentNode!=null)&&(currentNode._id==v.nodeid)){QH("dlgClipStatus",v.success?"<span style=color:green>Success</span>":"<span style=color:red>Failed</span>");setTimeout(function(){try{QH("dlgClipStatus","")}catch(j){}},2000)}}}}}}}}else{if(v.type=="notify"){var w={text:v.value,title:v.title,icon:v.icon};if(v.tag!=null){w.tag=v.tag}if(v.username!=null){w.username=v.username}addNotification(w)}}break;case"getnetworkinfo":if((currentNode._id==v.nodeid)&&(xxdialogMode==2)&&(xxdialogTag=="if"+v.nodeid)){if(v.netif==null){QH("d2netinfo","No network interface information available for this device.")}else{var ae="<div class=dialogText>";if(currentNode.lastconnect){ae+=addHtmlValue2("Last agent connection",printDateTime(new Date(currentNode.lastconnect)))}if(currentNode.lastaddr){var X=currentNode.lastaddr.split(":");if(X.length>2){ae+=addHtmlValue2("Last agent address",currentNode.lastaddr+' <img src="images/link4.png" title="Copy address to clipboard" style="cursor:pointer" onclick=copyTextToClip2("'+encodeURIComponent(currentNode.lastaddr)+'") width=10 height=10>')}else{if(isPrivateIP(currentNode.lastaddr)){ae+=addHtmlValue2("Last agent address",X[0]+' <img src="images/link4.png" title="Copy address to clipboard" style="cursor:pointer" onclick=copyTextToClip2("'+encodeURIComponent(X[0])+'") width=10 height=10>')}else{ae+=addHtmlValue2("Last agent address",'<a href="https://iplocation.com/?ip='+X[0]+'" rel="noreferrer noopener" target="MeshIPLoopup">'+X[0]+'</a> <img src="images/link4.png" title="Copy address to clipboard" style="cursor:pointer" onclick=copyTextToClip2("'+encodeURIComponent(X[0])+'") width=10 height=10>')}}}ae+=addHtmlValue2("Last interfaces update",printDateTime(new Date(v.updateTime)));for(var g in v.netif){var y=v.netif[g];ae+="<hr />";if(y.name){ae+=addHtmlValue2("Name","<b>"+EscapeHtml(y.name)+"</b>")}if(y.desc){ae+=addHtmlValue2("Description",EscapeHtml(y.desc).replace("(R)","®").replace("(r)","®"))}if(y.dnssuffix){ae+=addHtmlValue2("DNS suffix",EscapeHtml(y.dnssuffix)+' <img src="images/link4.png" title="Copy name to clipboard" style="cursor:pointer" onclick=copyTextToClip2("'+encodeURIComponent(y.dnssuffix)+'") width=10 height=10>')}if(y.mac){ae+=addHtmlValue2("MAC address",'<a href="https://dnslytics.com/mac-address-lookup/'+y.mac.substring(0,6)+'" rel="noreferrer noopener" target="MeshMACLoopup">'+EscapeHtml(y.mac.toLowerCase())+'</a> <img src="images/link4.png" title="Copy MAC address to clipboard" style="cursor:pointer" onclick=copyTextToClip2("'+encodeURIComponent(y.mac.toLowerCase())+'") width=10 height=10>')}if(y.v4addr){ae+=addHtmlValue2("IPv4 address",EscapeHtml(y.v4addr)+' <img src="images/link4.png" title="Copy address to clipboard" style="cursor:pointer" onclick=copyTextToClip2("'+encodeURIComponent(y.v4addr)+'") width=10 height=10>')}if(y.v4mask){ae+=addHtmlValue2("IPv4 mask",EscapeHtml(y.v4mask)+' <img src="images/link4.png" title="Copy address to clipboard" style="cursor:pointer" onclick=copyTextToClip2("'+encodeURIComponent(y.v4mask)+'") width=10 height=10>')}if(y.v4gateway){ae+=addHtmlValue2("IPv4 gateway",EscapeHtml(y.v4gateway)+' <img src="images/link4.png" title="Copy address to clipboard" style="cursor:pointer" onclick=copyTextToClip2("'+encodeURIComponent(y.v4gateway)+'") width=10 height=10>')}if(y.gatewaymac){ae+=addHtmlValue2("Gateway MAC",'<a href="https://dnslytics.com/mac-address-lookup/'+y.gatewaymac.substring(0,6)+'" rel="noreferrer noopener" target="MeshMACLoopup">'+EscapeHtml(y.gatewaymac.toLowerCase())+'</a> <img src="images/link4.png" title="Copy MAC address to clipboard" style="cursor:pointer" onclick=copyTextToClip2("'+encodeURIComponent(y.gatewaymac.toLowerCase())+'") width=10 height=10>')}}ae+="</div>";QH("d2netinfo",ae)}}break;case"serverversion":if((xxdialogMode==2)&&(xxdialogTag=="MeshCentralServerUpdate")){var ae="<div class=dialogText>";if(!v.current){v.current="Unknown"}if(!v.latest){v.latest="Unknown"}ae+=addHtmlValue2("Current Version","<b>"+EscapeHtml(v.current)+"</b>");ae+=addHtmlValue2("Latest Version","<b>"+EscapeHtml(v.latest)+"</b>");ae+="</div>";if((v.latest.indexOf(".")==-1)||(v.current==v.latest)||((features&2048)==0)){setDialogMode(2,"MeshCentral Version",1,null,ae)}else{setDialogMode(2,"MeshCentral Version",3,server_showVersionDlgEx,ae+"<br /><label><input id=d2updateCheck type=checkbox onclick=server_showVersionDlgUpdate() /> Check and click OK to start server self-update.</label>");server_showVersionDlgUpdate()}}break;case"servererrors":if((xxdialogMode==2)&&(xxdialogTag=="MeshCentralServerErrors")){if(v.data==null){setDialogMode(2,"MeshCentral Server Errors",1,null,"Server has no error log.")}else{var ae='<div class="dialogText dialogTextLog"><pre id=d2ServerErrorsLogPre>'+v.data+"<pre></div>";setDialogMode(2,"MeshCentral Server Errors",3,server_showErrorsDlgEx,ae+'<br /><div style=float:right><img src=images/link4.png height=10 width=10 title="Download error log" style=cursor:pointer onclick=d2CopyServerErrorsToClip()></div><div><label><input id=d2updateCheck type=checkbox onclick=server_showVersionDlgUpdate() /> Check and click OK to clear error log.</label></div>');server_showVersionDlgUpdate()}}break;case"serverconsole":p15consoleReceive("serverconsole",v.value);break;case"events":if((v.nodeid!=null)&&(v.nodeid==currentNode._id)){currentDeviceEvents=v.events;masterUpdate(1024)}else{if((v.user!=null)&&(v.user==currentUser.name)){currentUserEvents=v.events;masterUpdate(2048)}else{events=v.events;masterUpdate(32)}}break;case"getcookie":if(v.tag=="clickonce"){var a="{{{serverRedirPort}}}"==""?"{{{serverPublicPort}}}":"{{{serverRedirPort}}}";var P="http://"+window.location.hostname+":"+a+"/clickonce/minirouter/MeshMiniRouter.application?WS=wss%3A%2F%2F"+window.location.hostname+"%2Fmeshrelay.ashx%3Fauth="+v.cookie+"&CH={{{webcerthash}}}&AP="+v.protocol+((debugmode==1)?"":"&HOL=1");var B=window.open(P,"_blank");B.opener=null}break;case"getNotes":var w=Q("d2devNotes");if(w&&(v.id==decodeURIComponent(w.attributes.noteid.value))){if(v.notes){QH("d2devNotes",decodeURIComponent(v.notes))}else{QH("d2devNotes","")}var R=(w.attributes.ro.value=="true");if(R==false){w.removeAttribute("readonly");QE("idx_dlgOkButton",true);QV("idx_dlgOkButton",true);focusTextBox("d2devNotes")}}break;case"otpauth-request":if((xxdialogMode==2)&&(xxdialogTag=="otpauth-request")){var T=v.secret;if(T.length==52){T=T.split(/(.............)/).filter(Boolean).join(" ")}else{if(T.length==32){T=T.split(/(....)/).filter(Boolean).join(" ");T=T.substring(0,20)+"<br/>"+T.substring(20)}}QH("d2optinfo",'<table style=width:380px><tr><td style=vertical-align:top>Install <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2" rel="noreferrer noopener" target=_blank>Google Authenticator</a> or a compatible application and scan the barcode, use <a href="'+v.url+'" rel="noreferrer noopener" target=_blank> this link</a> or enter the secret. Then, enter the current 6 digit token below to activate 2-Step login.<br /><br />Secret<br /><tt id=d2optsecret secret="'+v.secret+'" style=font-size:12px>'+T+'</tt><br /><br /></td><td style=width:1px;vertical-align:top><a href="'+v.url+'" rel="noreferrer noopener" target=_blank><div id="qrcode"></div></a></td><tr><td colspan=2 style="text-align:center;border-top:1px solid black"><br />Enter the token here for 2-step login: <input type=text onkeypress="return (event.keyCode == 8) || (event.charCode >= 48 && event.charCode <= 57)" onkeyup=account_addOtpCheck(event) onkeydown=account_addOtpCheck() maxlength=6 id=d2otpauthinput type=text></td></table>');new QRCode(Q("qrcode"),{text:v.url,width:128,height:128,colorDark:"#000000",colorLight:"#EEE",correctLevel:QRCode.CorrectLevel.H});QV("idx_dlgOkButton",true);QE("idx_dlgOkButton",false);Q("d2otpauthinput").focus()}break;case"otpauth-setup":if(xxdialogMode){return}setDialogMode(2,"Authenticator App",1,null,v.success?"<b style=color:green>Authenticator app activation successful</b>. You will now need a valid token to login again.":"<b style=color:red>2-step login activation failed</b>. Clear the secret from the application and try again. You only have a few minutes to enter the proper code.");break;case"otpauth-clear":if(xxdialogMode){return}setDialogMode(2,"Authenticator App",1,null,v.success?"<b>Authenticator application removed</b>. You can reactivate this feature at any time.":"<b style=color:red>2-step login activation removal failed</b>. Try again.");break;case"otpauth-getpasswords":if(xxdialogMode){return}var ae="One time tokens can be used as secondary authentication. Generate a set, print them and keep them in a safe place.";ae+="<div style='border-radius:6px;border: 2px dashed #888;width:100%;margin-top:8px'><div style='padding:8px;font-family:Arial, Helvetica, sans-serif;font-size:20px;font-weight:bold'><table class=selecttext style=width:100%;text-align:center>";if(v.passwords){var l=0,b="";for(var g in v.passwords){if(++l%2){ae+="<tr>"}var L=""+v.passwords[g].p;while(L.length<8){L="0"+L}if(v.passwords[g].u===true){ae+="<td>"+L.substring(0,4)+" "+L.substring(4);if(b!=""){b+=" "}b+=L}else{ae+="<td><strike style=color:#BBB>"+L.substring(0,4)+" "+L.substring(4);+"</strike>"}}}else{ae+="<tr><td>No Active Tokens"}ae+="</table></div></div><br />";ae+="<div><input type=button value='Close' onclick=setDialogMode(0) style=float:right></input>";ae+="<input type=button value='Generate New Tokens' onclick='account_manageOtp(1);'></input>";if(v.passwords!=null){ae+="<input type=button value='Clear Tokens' onclick='account_manageOtp(2);'></input>";ae+=' <img src=images/link4.png height=10 width=10 title="Copy valid codes to clipboard" style=cursor:pointer onclick=copyTextToClip2("'+encodeURIComponent(b)+'")>'}ae+="</div><br />";setDialogMode(2,"Manage Backup Codes",8,null,ae,"otpauth-manage");break;case"otp-hkey-get":if(xxdialogMode&&(xxdialogTag!="otpauth-hardware-manage")){return}var Y="<div style='border-radius:6px;border:2px solid #CCC;background-color:#BBB;width:100%;box-sizing:border-box;margin-bottom:6px'><div style='margin:3px;font-family:Arial, Helvetica, sans-serif;font-size:16px;font-weight:bold'><table style=width:100%;text-align:left>";var d="</table></div></div>";var ae="<a href='https://www.yubico.com/' rel='noreferrer noopener' target='_blank'>Hardware keys</a> are used as secondary login authentication.";ae+="<div style='max-height:150px;overflow-y:auto;overflow-x:hidden;margin-top:6px;margin-bottom:6px'>";if(v.keys&&v.keys.length>0){for(var g in v.keys){var o=v.keys[g],ab=(o.type==2)?"OTP":"WebAuthn";ae+=Y+'<tr style=margin:5px><td style=width:30px><img width=24 height=18 src="images/hardware-key-'+ab+'-24.png" style=margin-top:4px><td style=width:250px>'+o.name+"<td><input type=button value='Remove' onclick=account_removehkey("+o.i+")></input>"+d}}else{ae+=Y+"<tr style=text-align:center><td>No Keys Configured"+d}ae+="</div>";ae+="<div><input type=button value='Close' onclick=setDialogMode(0) style=float:right></input>";if((features&131072)!=0){ae+="<input id=d2addkey3 type=button value='Add Key' onclick='account_addhkey(3);'></input>"}if((features&16384)!=0){ae+="<input id=d2addkey2 type=button value='Add YubiKey® OTP' onclick='account_addhkey(2);'></input>"}ae+="</div><br />";setDialogMode(2,"Manage Security Keys",8,null,ae,"otpauth-hardware-manage");if(u2fSupported()==false){QE("d2addkey1",false)}break;case"otp-hkey-yubikey-add":if(v.result){meshserver.send({action:"otp-hkey-get"})}else{setDialogMode(2,"Add Security Key",1,null,"<br />Error, Unable to add key.<br /><br />")}break;case"otp-hkey-setup-response":if(xxdialogMode&&(xxdialogTag!="otpauth-hardware-manage")){return}if(v.result==true){meshserver.send({action:"otp-hkey-get"})}else{setDialogMode(2,"Add Security Key",1,null,"<br />ERROR: Unable to add key.<br /><br />","otpauth-hardware-manage")}break;case"webauthn-startregister":if(xxdialogMode&&(xxdialogTag!="otpauth-hardware-manage")){return}var ae="Press the key button now.<br /><br /><div style=width:100%;text-align:center><img width=120 height=117 src='images/hardware-keypress-120.png' /></div><input id=dp1keyname style=display:none value="+v.name+" />";setDialogMode(2,"Add Security Key",2,null,ae);var N=v.request;v.request.challenge=Uint8Array.from(atob(v.request.challenge),function(j){return j.charCodeAt(0)});v.request.user.id=Uint8Array.from(atob(v.request.user.id),function(j){return j.charCodeAt(0)});navigator.credentials.create({publicKey:N}).then(function(j){var m={rawId:btoa(String.fromCharCode.apply(null,new Uint8Array(j.rawId))),response:{attestationObject:btoa(String.fromCharCode.apply(null,new Uint8Array(j.response.attestationObject))),clientDataJSON:btoa(String.fromCharCode.apply(null,new Uint8Array(j.response.clientDataJSON)))},type:j.type};meshserver.send({action:"webauthn-endregister",response:m});setDialogMode(0)},function(j){setDialogMode(2,"Add Security Key",1,null,"ERROR: "+j)});break;case"event":if(!v.event.nolog){if(currentNode&&(v.event.nodeid==currentNode._id)){currentDeviceEvents.unshift(v.event);var e=parseInt(p16limitdropdown.value);while(currentDeviceEvents.length>e){currentDeviceEvents.pop()}masterUpdate(1024)}if(currentUser&&(v.event.userid==currentUser._id)){currentUserEvents.unshift(v.event);var e=parseInt(p31limitdropdown.value);while(currentUserEvents.length>e){currentUserEvents.pop()}masterUpdate(2048)}events.unshift(v.event);var e=parseInt(p3limitdropdown.value);while(events.length>e){events.pop()}masterUpdate(32)}if(v.event.noact){break}switch(v.event.action){case"userWebState":if(localStorage!=null){var H=localStorage.getItem("showRealNames");var K=localStorage.getItem("uiMode");var J=localStorage.getItem("sort");var G=localStorage.getItem("loctag");var ad=JSON.parse(v.event.state);for(var g in ad){localStorage.setItem(g,ad[g])}if((ad.deskAspectRatio!=null)&&(ad.deskAspectRatio!=deskAspectRatio)){deskAspectRatio=ad.deskAspectRatio;deskAdjust()}if((ad.showRealNames!=null)&&(ad.showRealNames!=H)){showRealNames=Q("RealNameCheckBox").checked=(ad.showRealNames=="1");masterUpdate(6)}if((ad.uiMode!=null)&&(ad.uiMode!=K)){userInterfaceSelectMenu(parseInt(ad.uiMode))}if((ad.sort!=null)&&(ad.sort!=J)){document.getElementById("sortselect").selectedIndex=sort=parseInt(ad.sort);masterUpdate(6)}if((ad.loctag!=null)&&(ad.loctag!=G)){if(ad.loctag!=null){args.locale=ad.loctag}else{delete args.locale}masterUpdate(4294967295)}}break;case"servertimelinestats":addServerTimelineStats(v.event.data);break;case"accountcreate":case"accountchange":if(userinfo.name==v.event.account.name){var A=v.event.account.siteadmin?v.event.account.siteadmin:0;var I=userinfo.siteadmin?userinfo.siteadmin:0;if((v.event.account.quota!=userinfo.quota)||(((userinfo.siteadmin&8)==0)&&((v.event.account.siteadmin&8)!=0))){meshserver.send({action:"files"})}var F=userinfo.groups;userinfo=v.event.account;if(I!=A){updateSiteAdmin()}updateSelf();if((userinfo.siteadmin&2)!=0){var E=F?F:[];var C=userinfo.groups?userinfo.groups:[];if(E.join(",")!=C.join(",")){users=wssessions=null;meshserver.send({action:"users"});meshserver.send({action:"wssessioncount"})}}}if(users==null){break}if((userinfo.groups==null)||(userinfo.groups.length==0)||(findOne(v.event.account.groups,userinfo.groups)==true)){users[v.event.account._id]=v.event.account}else{delete users[v.event.account._id]}updateUsers();break;case"accountremove":if(users==null){break}delete users["user/"+domain+"/"+v.event.username.toLowerCase()];updateUsers();break;case"createmesh":if((meshes[v.event.meshid]==null)&&(v.event.links[userinfo._id]!=null)){meshes[v.event.meshid]={_id:v.event.meshid,name:v.event.name,mtype:v.event.mtype,desc:v.event.desc,links:v.event.links};masterUpdate(4+128);meshserver.send({action:"files"})}break;case"meshchange":if(meshes[v.event.meshid]==null){meshes[v.event.meshid]={_id:v.event.meshid,name:v.event.name,mtype:v.event.mtype,desc:v.event.desc,links:v.event.links};meshserver.send({action:"nodes"})}else{if(v.event.name!=null){meshes[v.event.meshid].name=v.event.name}if(v.event.desc!=null){meshes[v.event.meshid].desc=v.event.desc}if(v.event.flags!=null){meshes[v.event.meshid].flags=v.event.flags}if(v.event.consent!=null){meshes[v.event.meshid].consent=v.event.consent}if(v.event.links){meshes[v.event.meshid].links=v.event.links}if(v.event.amt){meshes[v.event.meshid].amt=v.event.amt}if(meshes[v.event.meshid].links[userinfo._id]==null){if((xxcurrentView==20)&&(currentMesh==meshes[v.event.meshid])){go(2)}delete meshes[v.event.meshid];var z=[];for(var g in nodes){if(nodes[g].meshid!=v.event.meshid){z.push(nodes[g])}}nodes=z;if(xxcurrentView>=10&&xxcurrentView<20&¤tNode&¤tNode.meshid==v.event.meshid){setDialogMode(0);go(1)}}}masterUpdate(4+128);if(currentNode&&(currentNode.meshid==v.event.meshid)){currentNode=null;if((xxcurrentView>=10)&&(xxcurrentView<20)){go(1)}}if(xxcurrentView==20&¤tMesh._id==v.event.meshid){masterUpdate(4096)}break;case"deletemesh":if(meshes[v.event.meshid]){delete meshes[v.event.meshid];masterUpdate(128);meshserver.send({action:"files"})}var z=[];if(nodes!=null){for(var g in nodes){if(nodes[g].meshid!=v.event.meshid){z.push(nodes[g])}}}nodes=z;masterUpdate(4);if(xxcurrentView>=20&&xxcurrentView<30&¤tMesh._id==v.event.meshid){setDialogMode(0);go(2)}if(xxcurrentView>=10&&xxcurrentView<20&¤tNode&¤tNode.meshid==v.event.meshid){setDialogMode(0);go(1)}break;case"addnode":var D=v.event.node;if(!meshes[D.meshid]){break}if(getNodeFromId(D._id)!=null){break}D.namel=D.name.toLowerCase();if(D.rname){D.rnamel=D.rname.toLowerCase()}else{D.rnamel=D.namel}D.meshnamel=meshes[D.meshid].name.toLowerCase();D.state=0;if(!D.icon){D.icon=1}D.ident=++nodeShortIdent;if(nodes==null){}nodes.push(D);masterUpdate(1|2|4|16);break;case"removenode":var k=-1;for(var g in nodes){if(nodes[g]._id==v.event.nodeid){k=g;break}}if(k!=-1){var D=nodes[k];if(currentNode==D){if(xxcurrentView>=10&&xxcurrentView<20){setDialogMode(0);go(1)}currentNode=null}nodes.splice(k,1);masterUpdate(4|16)}break;case"changenode":var k=-1;for(var g in nodes){if(nodes[g]._id==v.event.nodeid){k=g;break}}if(k!=-1){var D=nodes[k];D.name=v.event.node.name;D.rname=v.event.node.rname;D.users=v.event.node.users;D.host=v.event.node.host;D.desc=v.event.node.desc;D.ip=v.event.node.ip;D.osdesc=v.event.node.osdesc;D.publicip=v.event.node.publicip;D.iploc=v.event.node.iploc;D.wifiloc=v.event.node.wifiloc;D.gpsloc=v.event.node.gpsloc;D.tags=v.event.node.tags;D.userloc=v.event.node.userloc;if(v.event.node.agent!=null){if(D.agent==null){D.agent={}}if(v.event.node.agent.ver!=null){D.agent.ver=v.event.node.agent.ver}if(v.event.node.agent.id!=null){D.agent.id=v.event.node.agent.id}if(v.event.node.agent.caps!=null){D.agent.caps=v.event.node.agent.caps}if(v.event.node.agent.core!=null){D.agent.core=v.event.node.agent.core}else{if(D.agent.core){delete D.agent.core}}D.agent.tag=v.event.node.agent.tag}if(v.event.node.intelamt!=null){if(D.intelamt==null){D.intelamt={}}if(v.event.node.intelamt.state!=null){D.intelamt.state=v.event.node.intelamt.state}if(v.event.node.intelamt.host!=null){D.intelamt.user=v.event.node.intelamt.host}if(v.event.node.intelamt.user!=null){D.intelamt.user=v.event.node.intelamt.user}if(v.event.node.intelamt.tls!=null){D.intelamt.tls=v.event.node.intelamt.tls}if(v.event.node.intelamt.ver!=null){D.intelamt.ver=v.event.node.intelamt.ver}if(v.event.node.intelamt.tag!=null){D.intelamt.tag=v.event.node.intelamt.tag}if(v.event.node.intelamt.uuid!=null){D.intelamt.uuid=v.event.node.intelamt.uuid}if(v.event.node.intelamt.realm!=null){D.intelamt.realm=v.event.node.intelamt.realm}}if(v.event.node.av!=null){D.av=v.event.node.av}D.namel=D.name.toLowerCase();if(D.rname){D.rnamel=D.rname.toLowerCase()}else{D.rnamel=D.namel}if(v.event.node.icon){D.icon=v.event.node.icon}masterUpdate(2|4|8|16);refreshDevice(D._id);if((currentNode==D)&&(xxdialogMode!=null)&&(xxdialogTag=="@xxmap")){p10showNodeLocationDialog()}}break;case"nodemeshchange":var k=-1;for(var g in nodes){if(nodes[g]._id==v.event.nodeid){k=g;break}}if(k!=-1){var D=nodes[k];if(meshes[v.event.newMeshId]==null){if(currentNode==D){if(xxcurrentView>=10&&xxcurrentView<20){setDialogMode(0);go(1)}currentNode=null}nodes.splice(k,1);masterUpdate(4|16)}else{D.meshid=v.event.newMeshId;D.meshnamel=meshes[v.event.newMeshId].name.toLowerCase();masterUpdate(1|2|4)}refreshDevice(v.event.nodeid)}else{var D=v.event.node;if(!meshes[D.meshid]){break}D.namel=D.name.toLowerCase();if(D.rname){D.rnamel=D.rname.toLowerCase()}else{D.rnamel=D.namel}D.meshnamel=meshes[D.meshid].name.toLowerCase();D.state=0;if(!D.icon){D.icon=1}D.ident=++nodeShortIdent;if(nodes==null){}nodes.push(D);masterUpdate(1|2|4|16)}break;case"nodeconnect":var k=-1;for(var g in nodes){if(nodes[g]._id==v.event.nodeid){k=g;break}}if(k!=-1){var D=nodes[k];var w=getstore("notifications",0);if(v.event.meshid&&userinfo.links&&userinfo.links[v.event.meshid]&&userinfo.links[v.event.meshid].notify){w&=userinfo.links[v.event.meshid].notify}else{w=0}if(w&2){if(((D.conn&1)==0)&&((v.event.conn&1)!=0)){addNotification({text:"Agent connected",title:D.name,icon:D.icon,nodeid:D._id})}if(((D.conn&2)==0)&&((v.event.conn&2)!=0)){addNotification({text:"Intel AMT detected",title:D.name,icon:D.icon,nodeid:D._id})}if(((D.conn&4)==0)&&((v.event.conn&4)!=0)){addNotification({text:"Intel AMT CIRA connected",title:D.name,icon:D.icon,nodeid:D._id})}if(((D.conn&16)==0)&&((v.event.conn&16)!=0)){addNotification({text:"MQTT connected",title:D.name,icon:D.icon,nodeid:D._id})}}if(w&4){if(((D.conn&1)!=0)&&((v.event.conn&1)==0)){addNotification({text:"Agent disconnected",title:D.name,icon:D.icon,nodeid:D._id})}if(((D.conn&2)!=0)&&((v.event.conn&2)==0)){addNotification({text:"Intel AMT not detected",title:D.name,icon:D.icon,nodeid:D._id})}if(((D.conn&4)!=0)&&((v.event.conn&4)==0)){addNotification({text:"Intel AMT CIRA disconnected",title:D.name,icon:D.icon,nodeid:D._id})}if(((D.conn&16)!=0)&&((v.event.conn&16)==0)){addNotification({text:"MQTT disconnected",title:D.name,icon:D.icon,nodeid:D._id})}}D.conn=v.event.conn;D.pwr=v.event.pwr;masterUpdate(4|16);refreshDevice(D._id)}break;case"wssessioncount":if(wssessions!=null){if(v.event.count==0&&wssessions["user/"+domain+"/"+v.event.username.toLowerCase()]){delete wssessions["user/"+domain+"/"+v.event.username.toLowerCase()]}else{wssessions["user/"+domain+"/"+v.event.username.toLowerCase()]=v.event.count}updateUsers()}break;case"login":if(users!=null&&users["user/"+domain+"/"+v.event.username.toLowerCase()]){users["user/"+domain+"/"+v.event.username.toLowerCase()].login=Math.floor(new Date(v.event.time).getTime()/1000)}break;case"scanamtdevice":if((xxdialogMode==null)||(!Q("dp1range"))||(Q("dp1range").value!=v.event.range)){return}var ae="";if(v.event.results==null){ae="<div style=width:100%;text-align:center;margin-top:12px>Unable to scan this address range.</div><div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>Sample IP range values<br />192.168.0.100<br />192.168.1.0/24<br />192.167.0.1-192.168.0.100</div>"}else{amtScanResults=v.event.results;for(var g in v.event.results){var O=v.event.results[g],W=O.hostname;if(W.length>20){W=W.substring(0,20)+"..."}var Z='<b title="'+EscapeHtml(O.hostname)+'">'+EscapeHtml(W)+"</b> - v"+O.ver;if(O.state==2){if(O.tls==1){Z+=" with TLS."}else{Z+=" without TLS."}}else{Z+=" not activated."}ae+='<div style=width:100%;margin-bottom:2px;background-color:lightgray><div style=padding:4px><div style=display:inline-block;margin-right:5px><input class=DevScanCheckbox name=dp1checkbox tag="'+EscapeHtml(g)+'" type=checkbox onclick=addAmtScanToMeshCheckbox() /></div><div class=j1 style=display:inline-block></div><div style=display:inline-block;margin-left:5px;overflow-x:auto;white-space:nowrap>'+Z+"</div></div></div>"}if(ae==""){ae="<div style=width:100%;text-align:center;margin-top:12px>Scan returned no results.</div><div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>Sample IP range values<br />192.168.0.100<br />192.168.1.0/24<br />192.167.0.1-192.168.0.100</div>"}}QH("dp1results",ae);QE("dp1range",true);QE("dp1rangebutton",true);break;case"notify":var w={text:v.event.value,title:v.event.title,icon:v.event.icon};if(v.event.tag!=null){w.tag=v.event.tag}addNotification(w);break;case"traceinfo":if(typeof v.event.traceSources=="object"){if((v.event.traceSources!=null)&&(v.event.traceSources.length>0)){serverTraceSources=v.event.traceSources;QH("p41traceStatus",EscapeHtml(v.event.traceSources.join(", ")))}else{serverTraceSources=[];QH("p41traceStatus","None")}}break;case"sysinfohash":if((currentNode!=null)&&(v.event.nodeid==powerTimelineReq)){meshserver.send({action:"getsysinfo",nodeid:v.event.nodeid})}break;case"stopped":break;default:break}break;case"createInviteLink":if(xxdialogTag!=v.meshid){break}var V=serverinfo.name;if((V.indexOf(".")==-1)||((features&2)!=0)){V=window.location.hostname}var c=domainUrl.substring(0,domainUrl.length-1);var ac;if(serverinfo.https==true){var M=(serverinfo.port==443)?"":(":"+serverinfo.port);ac="https://"+V+M+domainUrl+"agentinvite?c="+v.cookie}else{var M=(serverinfo.port==80)?"":(":"+serverinfo.port);ac="http://"+V+M+domainUrl+"agentinvite?c="+v.cookie}Q("agentInvitationLink").href=ac;var aa=v.expire+" hour"+addLetterS(v.expire);if(v.expire==24){aa="1 day"}if(v.expire==168){aa="1 week"}if(v.expire==5040){aa="1 month"}if(v.expire==0){aa="Unlimited"}QH("agentInvitationLink","Invitation Link ("+aa+")");QV("agentInvitationLinkDiv",true);break;case"getmqttlogin":if((currentNode==null)||(currentNode._id!=v.nodeid)||(xxdialogMode!=null)){return}var ae="These settings can be used to connect MQTT for this device.<br /><br />";delete v.action;delete v.nodeid;ae+="<textarea readonly=readonly style=width:100%;resize:none;height:100px;overflow:auto;font-size:12px readonly>"+JSON.stringify(v)+"</textarea>";setDialogMode(2,"MQTT Credentials",1,null,ae);break;case"stopped":autoReconnect=false;QH("p0span",v.msg);break;default:break}}function onRealNameCheckBox(){showRealNames=Q("RealNameCheckBox").checked;putstore("showRealNames",showRealNames?1:0);masterUpdate(6);return}function onDeviceViewChange(a){if(a!=null){Q("viewselect").value=a}for(var b=1;b<5;b++){Q("devViewButton"+b).classList.remove("viewSelectorSel")}Q("devViewButton"+Q("viewselect").value).classList.add("viewSelectorSel");putstore("_deviceView",Q("viewselect").value);putstore("_viewsize",Q("sizeselect").value);masterUpdate(4);setTimeout(function(){masterUpdate(512)},200)}function ondockeypress(a){setSessionActivity();if(!xxdialogMode&&xxcurrentView==11&&desktop&&Q("DeskControl").checked){if(currentNode!=null){var d=meshes[currentNode.meshid];var g=d.links[userinfo._id].rights;var b=((g==4294967295)||(((g&8)!=0)&&((g&256)==0)));if(b==false){return false}var c=((g!=4294967295)&&(((g&8)!=0)&&((g&256)==0)&&((g&4096)!=0)));if(c==true){if((a.altKey==true)||(a.ctrlKey==true)||((a.keyCode<32)&&(a.keyCode!=8)&&(a.keyCode!=13))||(a.keyCode>90)){return false}}}return desktop.m.handleKeys(a)}if(!xxdialogMode&&xxcurrentView==12&&terminal&&terminal.State==3){return terminal.m.TermHandleKeys(a)}if(!xxdialogMode&&((xxcurrentView==15)||(xxcurrentView==115))){return agentConsoleHandleKeys(a)}if(!xxdialogMode&&xxcurrentView==4){if(a.ctrlKey==true||a.altKey==true||a.metaKey==true){return}var h=0;if(a.key){if(a.key.length===1&&userSearchFocus==0){Q("UserSearchInput").value=((Q("UserSearchInput").value+a.key));h=1}if(a.keyCode==8&&userSearchFocus==0){var j=Q("UserSearchInput").value;Q("UserSearchInput").value=j.substring(0,j.length-1);h=1}if(a.keyCode==27){Q("UserSearchInput").value="";h=1}}else{if(a.charCode!=0&&userSearchFocus==0){Q("UserSearchInput").value=((Q("UserSearchInput").value+String.fromCharCode(a.charCode)));h=1}}if(h>0){if(h==1){onUserSearchInputChanged()}return haltEvent(a)}}if(xxdialogMode||xxcurrentView!=1){return}if(a.ctrlKey==true&&a.charCode==96){showRealNames=!showRealNames;Q("RealNameCheckBox").value=showRealNames;putstore("showRealNames",showRealNames?1:0);masterUpdate(6);return}if(a.ctrlKey==true||a.altKey==true||a.metaKey==true){return}if(Q("viewselect").value<3){var h=0;if(a.key){if(a.key.length===1&&searchFocus==0){Q("SearchInput").value=((Q("SearchInput").value+a.key));h=1}if(a.keyCode==8&&searchFocus==0){var j=Q("SearchInput").value;Q("SearchInput").value=j.substring(0,j.length-1);h=1}if(a.keyCode==27){Q("SearchInput").value="";h=1}}else{if(a.charCode!=0&&searchFocus==0){Q("SearchInput").value=((Q("SearchInput").value+String.fromCharCode(a.charCode)));h=1}}if(h>0){if(h==1){masterUpdate(5)}return haltEvent(a)}}if(Q("viewselect").value==3){if(a.key){if(a.key.length===1&&mapSearchFocus==0){Q("mapSearchLocation").value=((Q("mapSearchLocation").value+a.key));h=1}if(a.keyCode==27){Q("mapSearchLocation").value="";mapCloseSearchWindow();h=1}if(a.keyCode==13){getSearchLocation()}}else{if(a.charCode!=0&&mapSearchFocus==0){Q("mapSearchLocation").value=((Q("mapSearchLocation").value+String.fromCharCode(a.charCode)));h=1}}}}function ondockeydown(a){setSessionActivity();if(!xxdialogMode&&xxcurrentView==11&&desktop&&Q("DeskControl").checked){if(currentNode!=null){var d=meshes[currentNode.meshid];var g=d.links[userinfo._id].rights;var b=((g==4294967295)||(((g&8)!=0)&&((g&256)==0)));if(b==false){return false}var c=((g!=4294967295)&&(((g&8)!=0)&&((g&256)==0)&&((g&4096)!=0)));if(c==true){if((a.altKey==true)||(a.ctrlKey==true)||((a.keyCode<32)&&(a.keyCode!=8)&&(a.keyCode!=13))||(a.keyCode>90)){return false}}}return desktop.m.handleKeyDown(a)}if(!xxdialogMode&&xxcurrentView==12&&terminal&&terminal.State==3){terminal.m.TermHandleKeyDown(a);if((a.keyCode>=37)&&(a.keyCode<=40)){haltEvent(a)}}if(!xxdialogMode&&xxcurrentView==13&&a.keyCode==116&&p13filetree!=null){haltEvent(a);return false}if(!xxdialogMode&&((xxcurrentView==15)||(xxcurrentView==115))){return agentConsoleHandleKeys(a)}if(!xxdialogMode&&xxcurrentView==4){if(a.keyCode===8&&userSearchFocus==0){var j=Q("UserSearchInput").value;Q("UserSearchInput").value=(j.substring(0,j.length-1));h=1}if(a.keyCode===27){Q("UserSearchInput").value="";h=1}if(h>0){if(h==1){masterUpdate(5)}return haltEvent(a)}}if(xxdialogMode||xxcurrentView!=1||a.ctrlKey==true||a.altKey==true||a.metaKey==true){return}var h=0;if(Q("viewselect").value<3){if(a.keyCode===8&&searchFocus==0){var j=Q("SearchInput").value;Q("SearchInput").value=(j.substring(0,j.length-1));h=1}if(a.keyCode===27){Q("SearchInput").value="";h=1}if(h>0){if(h==1){masterUpdate(5)}return haltEvent(a)}}if(Q("viewselect").value==3){if(a.keyCode===8&&mapSearchFocus==0){var j=Q("mapSearchLocation").value;Q("mapSearchLocation").value=(j.substring(0,j.length-1));h=1}if(a.keyCode===27){Q("mapSearchLocation").value="";mapCloseSearchWindow();h=1}}}function ondockeyup(a){setSessionActivity();if(!xxdialogMode&&xxcurrentView==11&&desktop&&Q("DeskControl").checked){if(currentNode!=null){var d=meshes[currentNode.meshid];var g=d.links[userinfo._id].rights;var b=((g==4294967295)||(((g&8)!=0)&&((g&256)==0)));if(b==false){return false}var c=((g!=4294967295)&&(((g&8)!=0)&&((g&256)==0)&&((g&4096)!=0)));if(c==true){if((a.altKey==true)||(a.ctrlKey==true)||((a.keyCode<32)&&(a.keyCode!=8)&&(a.keyCode!=13))||(a.keyCode>90)){return false}}}return desktop.m.handleKeyUp(a)}if(!xxdialogMode&&xxcurrentView==12&&terminal&&terminal.State==3){return terminal.m.TermHandleKeyUp(a)}if(!xxdialogMode&&xxcurrentView==13&&a.keyCode==116&&p13filetree!=null){p13folderup(9999);haltEvent(a);return false}if(!xxdialogMode&&xxcurrentView==4){if((a.keyCode===8&&searchFocus==0)||a.keyCode===27){return haltEvent(a)}}if(xxdialogMode&&a.keyCode==27){dialogclose(0)}if(xxdialogMode||xxcurrentView!=0||a.ctrlKey==true||a.altKey==true||a.metaKey==true){return}if(Q("viewselect").value<3){if((a.keyCode===8&&searchFocus==0)||a.keyCode===27){return haltEvent(a)}}if(Q("viewselect").value==3){if((a.keyCode===8&&mapSearchFocus==0)||a.keyCode===27){return haltEvent(a)}}}function ondocblur(){if(!xxdialogMode&&xxcurrentView==11&&desktop&&Q("DeskControl").checked&&desktop.m.handleReleaseKeys){return desktop.m.handleReleaseKeys()}}function devMouseHover(b,c){setSessionActivity();var d=Q("viewselect").value;if(d==1){var a=b.children[1].children[1];a.children[0].classList.remove("g1s");a.children[1].classList.remove("e2s");a.children[2].classList.remove("g2s");if(c==1){a.children[0].classList.add("g1s");a.children[1].classList.add("e2s");a.children[2].classList.add("g2s")}}else{if(d==2){var a=b;a.children[2].classList.remove("g1s");a.children[4].classList.remove("e2s");a.children[3].classList.remove("g2s");if(c==1){a.children[2].classList.add("g1s");a.children[4].classList.add("e2s");a.children[3].classList.add("g2s")}}}}var deviceHeaderId=0;var deviceHeaderTotal=0;var deviceHeadersTitles={};var deviceHeaderCount;var deviceHeaders={};var oldviewmode=0;function updateDevices(){if(nodes==null){return}var G="",a=0,g=null,e=0,l={},O=Q("viewselect").value,s={},p={};QV("xdevices",O<4);QV("xdevicesmap",O==4);QV("devListToolbar",O<3);QV("kvmListToolbar",O==3);QV("devMapToolbar",O==4);QV("devListToolbarSize",O==3);QV("NoMeshesPanel",meshcount==0);QV("devListToolbarViewIcons",(meshcount!=0)&&(nodes.length>0));QV("devListToolbarSort",(meshcount!=0)&&(nodes.length>0)&&(O<4));if((meshcount==0)||(nodes.length==0)){O=1;sort=0}if(O==4){setTimeout(function(){if(xxmap.map!=null){xxmap.map.updateSize()}},200)}else{deviceHeaderId=0;deviceHeaderCount={};deviceHeaderTotal=0;deviceHeaders={};deviceHeadersTitles={};var x=[];if(sort==0){nodes.sort(meshSort)}else{if(sort==1){nodes.sort(powerSort)}else{if(sort==2){if(showRealNames==true){nodes.sort(deviceHostSort)}else{nodes.sort(deviceSort)}}}}var d=[],m=document.getElementsByClassName("DeviceCheckbox"),b=0;for(var t=0;t<m.length;t++){if(m[t].checked){d.push(m[t].value)}}if((oldviewmode<3)&&(O==3)){multiDesktopFilter=d}else{if((oldviewmode==3)&&(O<3)){d=multiDesktopFilter}}var M=Q("column_l").clientWidth-60;var k=Math.floor(M/301);k=301+Math.floor((M-(k*301))/k);if((O==2)&&(sort!=3)){G+="<table style=width:100%;margin-top:4px cellpadding=0 cellspacing=0><th style=color:gray><th style=color:gray;width:120px>User<th style=color:gray;width:120px>Address<th style=color:gray;width:100px>Connectivity"}for(var t in nodes){var E=nodes[t];if(E.v==false){continue}var z=meshes[E.meshid],B=z.links[userinfo._id];if(B==null){continue}var C=B.rights;if((O==3)&&(z.mtype==1)){continue}if(sort==0){if(E.meshid!=g){deviceHeaderSet();var o="";if(O==2){G+="<tr><td colspan=5>"}if(meshes[E.meshid].mtype==1){o="<span class=devHeaderx>, Intel® AMT only</span>"}if((O==1)&&(g!=null)){if(a==2){G+="<td><div style=width:301px></div></td>"}if(G!=""){G+="</tr></table>"}}if(O==2){G+="<div>"}G+="<div class=DevSt style=width:100%;padding-top:4px><span style=float:right>";G+="<span id=DevxHeader"+deviceHeaderId+" class=devHeaderx></span>"+o;G+='</span><span id=MxMESH tabindex=0 style=cursor:pointer onclick=gotoMesh("'+E.meshid+"\") onkeypress=\"if (event.key=='Enter') gotoMesh('"+E.meshid+"')\">"+EscapeHtml(meshes[E.meshid].name)+"</span>"+getMeshActions(z,C)+"</div>";if(O==2){G+="</div>"}g=E.meshid;l[g]=1;a=0}}else{if(sort==1){var F=E.pwr?E.pwr:0;if(F!==g){deviceHeaderSet();if((O==1)&&(g!==null)){if(a==2){G+="<td><div style=width:301px></div></td>"}if(G!=""){G+="</tr></table>"}}if(O==2){G+="<tr><td>"}G+="<div class=DevSt style=width:100%;padding-top:4px><span id=DevxHeader"+deviceHeaderId+" class=devHeaderx style=float:right></span><span>"+PowerStateStr2(E.pwr)+"</span></div>";g=F;a=0}}else{if(sort==2){if(g==null){g="1"}}}}e++;var L=EscapeHtml(E.name);if(L.length==0){L="<i>None</i>"}if((E.rname!=null)&&(E.rname.length>0)){L+=" / "+EscapeHtml(E.rname)}var D=EscapeHtml(E.name);if(showRealNames==true&&E.rname!=null){D=EscapeHtml(E.rname)}if(D.length==0){D="<i>None</i>"}var u=E.icon;if((!E.conn)||(E.conn==0)){u+=" gray"}if(O==1){G+="<div id=devs onmouseover=devMouseHover(this,1) onmouseout=devMouseHover(this,0) style=display:inline-block;width:"+k+'px;height:50px;padding-top:1px;padding-bottom:1px><div style=width:22px;height:50%;float:left;padding-top:12px><input class="'+E.meshid+' DeviceCheckbox" onclick=p1updateInfo() value=devid_'+E._id+" type=checkbox></div><div style=height:100%;cursor:pointer tabindex=0 onclick=gotoDevice('"+E._id+"',null,null,event) onkeypress=\"if (event.key=='Enter') gotoDevice('"+E._id+'\',null,null,event)"><div class="i'+u+'" style=width:50px;float:left></div><div style=height:100%><div class=g1></div><div class=e2><div class=e1 style=width:'+(k-100)+'px title="'+L+'">'+D+"</div><div>"+NodeStateStr(E)+"</div></div><div class=g2></div></div></div></div>"}else{if(O==2){var J=[];if(E.conn){if((E.conn&1)!=0){J.push('<span title="Mesh agent is connected and ready for use.">Agent</span>')}if((E.conn&2)!=0){J.push('<span title="Intel® AMT CIRA is connected and ready for use.">CIRA</span>')}else{if((E.conn&4)!=0){J.push('<span title="Intel® AMT is routable.">AMT</span>')}}if((E.conn&8)!=0){J.push('<span title="Mesh agent is reachable using another agent as relay.">Relay</span>')}if((E.conn&16)!=0){J.push('<span title="MQTT connection to the device is active.">MQTT</span>')}}G+="<tr><td><div id=devs class=bar18 tabindex=0 onmouseover=devMouseHover(this,1) onmouseout=devMouseHover(this,0) style=height:18px;width:100%;font-size:medium onkeypress=\"if (event.key=='Enter') gotoDevice('"+E._id+"',null,null,event)\">";G+='<div class=deviceBarCheckbox><input class="'+E.meshid+' DeviceCheckbox" onclick=p1updateInfo() value=devid_'+E._id+" type=checkbox></div>";G+="<div class=deviceBarIcon onclick=gotoDevice('"+E._id+"',null,null,event)><div class=\"j"+u+'" style=width:16px;margin-top:1px;margin-left:2px;height:16px></div></div>';G+="<div class=g1 style=height:18px;float:left></div><div class=g2 style=height:18px;float:right></div>";G+='<div style=cursor:pointer;font-size:14px title="'+L+"\" onclick=gotoDevice('"+E._id+"',null,null,event)><span style=width:300px>"+D+"</span></div></div></td>";G+="<td style=text-align:center>"+getUserShortStr(E);G+="<td style=text-align:center>"+(E.ip!=null?E.ip:"");G+="<td style=text-align:center>"+J.join(" + ");G+="</tr>"}else{if((O==3)&&(E.conn&1)&&(((C&8)||(C&256))!=0)&&((E.agent.caps&1)!=0)){if((multiDesktopFilter)&&((multiDesktopFilter.length==0)||(multiDesktopFilter.indexOf("devid_"+E._id)>=0))){G+="<div id=devs style=display:inline-block;margin:1px;background-color:lightgray;border-radius:5px;position:relative><div tabindex=0 style=padding:3px;cursor:pointer onclick=gotoDevice('"+E._id+"',11,null,event) onkeypress=\"if (event.key=='Enter') gotoDevice('"+E._id+"',11,null,event)\">";G+='<div class="j'+u+'" style=width:16px;float:left></div> '+D+"</div>";G+="<span onclick=gotoDevice('"+E._id+"',null,null,event)></span><div id=xkvmid_"+E._id.split("/")[2]+"><div id=skvmid_"+E._id.split("/")[2]+' tabindex=0 style="position:absolute;color:white;left:5px;top:27px;text-shadow:0px 0px 5px #000;z-index:1000;cursor:default" onclick=toggleKvmDevice(\''+E._id+"') onkeypress=\"if (event.key=='Enter') toggleKvmDevice('"+E._id+"')\">Disconnected</div></div>";G+="</div>";x.push(E._id)}}}}if((sort==3)&&(G!="")){if(E.tags){for(var w in E.tags){var K=E.tags[w];if(s[K]==null){s[K]=G;p[K]=1}else{s[K]+=G;p[K]+=1}if(O==3){break}}}G=""}deviceHeaderTotal++;if(typeof deviceHeaderCount[E.state]=="undefined"){deviceHeaderCount[E.state]=1}else{deviceHeaderCount[E.state]++}}if(sort==3){if(O==2){G="<table style=width:100%;margin-top:4px cellpadding=0 cellspacing=0><th style=color:gray><th style=color:gray;width:120px>User<th style=color:gray;width:120px>Address<th style=color:gray;width:100px>Connectivity"}var q=[];for(var t in s){q.push(t)}q.sort(function(c,j){return c.toLowerCase().localeCompare(j.toLowerCase())});for(var w in q){var t=q[w];if(O==2){G+="<tr><td colspan=4><div class=DevSt style=width:100%;padding-top:4px><span class=devHeaderx style=float:right>"+p[t]+" node"+((p[t]>1)?"s":"")+"</span><span>"+t+"</span></div>"+s[t]}else{G+="<div class=DevSt style=width:100%;padding-top:4px><span class=devHeaderx style=float:right>"+p[t]+" node"+((p[t]>1)?"s":"")+"</span><span>"+t+"</span></div>"+s[t]}}}if((G=="")&&(meshcount>0)&&(Q("SearchInput").value!="")){if(sort==3){G='<div style="margin:30px">No devices are included in any groups, click on a device\'s "Groups" to add to a group.</div>'}else{G='<div style="margin:30px">No devices matching this search.</div>'}}if((O==1)&&(a==2)){G+="<td><div style=width:301px></div></td>"}if((sort==0)&&(Q("SearchInput").value=="")&&(O<3)){for(var t in meshes){var y=meshes[t],A=y.links[userinfo._id];if(A!=null){var C=A.rights;if(l[y._id]==null){if((g!="")&&(G!="")){G+="</tr></table>"}G+='<table style=width:100%;padding-top:4px cellpadding=0 cellspacing=0><tr><td colspan=3 class=DevSt><span id=MxMESH style=cursor:pointer onclick=gotoMesh("'+y._id+'")>'+EscapeHtml(y.name)+"</span><span>";G+=getMeshActions(y,C);G+="</span></td></tr><tr>";if(y.mtype==1){G+="<td><div style=padding:10px><i>No Intel® AMT devices in this mesh";if((C&4)!=0){G+=", <a href=# style=cursor:pointer onclick='return addDeviceToMesh(\""+y._id+"\")'>add one</a>"}}if(y.mtype==2){G+="<td><div style=padding:10px><i>No devices in this mesh";if((C&4)!=0){G+=", <a href=# style=cursor:pointer onclick='return addAgentToMesh(\""+y._id+"\")'>add one</a>"}}G+=".</i></div></td>";g=y._id;e++}}}}G+="</tr></table><div style=height:1px></div>";G+="<div style=border-top-style:solid;border-top-width:1px;border-top-color:#DDDDDD;cursor:pointer;font-size:10px>";if((O<3)&&(sort==0)&&(meshcount>0)&&((userinfo.siteadmin==4294967295)||((userinfo.siteadmin&64)==0))){G+='<a href=# onclick="return account_createMesh()" title="Create a new group of devices." style=cursor:pointer>Add Device Group</a> '}if((userinfo.siteadmin==4294967295)||((userinfo.siteadmin&128)==0)){G+="<a href=# onclick='return p10showMeshCmdDialog(0)' style=cursor:pointer title=\"Download MeshCmd, a command line tool that performs many functions.\">MeshCmd</a> ";if(navigator.platform.toLowerCase()=="win32"){G+="<a href=# onclick='return p10showMeshRouterDialog()' style=cursor:pointer title=\"Download MeshCentral Router, a TCP port mapping tool.\">Router</a> "}}G+="</div><br/>";QH("xdevices",G);deviceHeaderSet();var m=document.getElementsByClassName("DeviceCheckbox"),b=0;if(d){for(var t=0;t<m.length;t++){m[t].checked=(d.indexOf(m[t].value)>=0)}}for(var t in deviceHeaders){QH(t,deviceHeaders[t])}for(var t in deviceHeadersTitles){Q(t).title=deviceHeadersTitles[t]}p1updateInfo();if(O==3){var P=[{x:180,y:101},{x:302,y:169},{x:454,y:255}][Q("sizeselect").selectedIndex];var H=P.x+2,N=M-5,R=Math.floor(N/H);R=H+Math.floor((N-(R*H))/R);P.y=P.y*(R/P.x);P.x=R;for(var t in multiDesktop){multiDesktop[t].xxdelete=true}for(var t in x){var v=x[t],I=v.split("/")[2],h=multiDesktop[v];if(h!=null){h.m.CanvasId.setAttribute("style","background-color:black;width:"+P.x+"px;height:"+P.y+"px");Q("xkvmid_"+I).appendChild(h.m.CanvasId);delete h.xxdelete;QH("skvmid_"+I,["Disconnected","Connecting...","Setup...","",""][((h.m.State==null)?h.m.state:h.m.State)])}else{var E=getNodeFromId(v);if((desktopNode==E)&&(desktop!=null)){var a=desktop.m.CanvasId;a.setAttribute("id","kvmid_"+I);a.setAttribute("style","background-color:black;width:"+P.x+"px;height:"+P.y+"px");a.setAttribute("onclick","toggleKvmDevice('"+v+"')");a.removeAttribute("onmousedown");a.removeAttribute("onmouseup");a.removeAttribute("onmousemove");Q("xkvmid_"+I).appendChild(a);QH("skvmid_"+I,["Disconnected","Connecting...","Setup...","",""][((desktop.m.State==null)?desktop.m.state:desktop.m.State)]);if(desktop.m.SendCompressionLevel){desktop.m.SendCompressionLevel(1,multidesktopsettings.quality,multidesktopsettings.scaling,multidesktopsettings.framerate)}desktop.shortid=I;desktop.onStateChanged=onMultiDesktopStateChange;multiDesktop[v]=desktop;desktop=desktopNode=currentNode=null;QH("DeskParent",'<canvas id="Desk" oncontextmenu="return false" onmousedown=dmousedown(event) onmouseup=dmouseup(event) onmousemove=dmousemove(event)></canvas>')}else{var a=document.createElement("canvas");a.setAttribute("id","kvmid_"+I);a.setAttribute("width",640);a.setAttribute("height",480);a.setAttribute("oncontextmenu","return false");a.setAttribute("style","background-color:black;width:"+P.x+"px;height:"+P.y+"px");a.setAttribute("onclick","toggleKvmDevice('"+v+"')");try{Q("xkvmid_"+I).appendChild(a)}catch(n){}if(Q("autoConnectDesktopCheckbox").checked==true){setTimeout(function(){connectMultiDesktop(E,1)},100)}}}}for(var t in multiDesktop){if(multiDesktop[t].xxdelete==true){multiDesktop[t].Stop();delete multiDesktop[t]}else{if(debugmode&&multiDesktop[t].m&&multiDesktop[t].m.onScreenSizeChange){mdeskAdjust(multiDesktop[t].m,multiDesktop[t].m.ScreenWidth,multiDesktop[t].m.ScreenHeight,multiDesktop[t].m.CanvasId)}}}deskAdjust()}else{disconnectAllKvmFunction();Q("autoConnectDesktopCheckbox").checked=false}}oldviewmode=O}function toggleKvmDevice(d){var c=getNodeFromId(d),a=meshes[c.meshid],b=a.links[userinfo._id].rights;if((b&8)||(b&256)){if(c.conn&1){connectMultiDesktop(c,1)}}}function getUserShortStr(b){if(b==null||b.users==null||b.users.length==0){return""}if(b.users.length>1){return'<span title="'+EscapeHtml(b.users.join(", "))+'">'+b.users.length+" users</span>"}var d=b.users[0],c=d,a=d.indexOf("\\");if(a>0){c=d.substring(a+1)}c=EscapeHtml(c);if(c.length>15){c=c.substring(0,14)+"…"}return'<span title="'+EscapeHtml(d)+'">'+c+"</span>"}function autoConnectDesktops(){if(Q("autoConnectDesktopCheckbox").checked==true){connectAllKvmFunction()}}function connectAllKvmFunction(){for(var a in nodes){if(multiDesktop[nodes[a]._id]==null){toggleKvmDevice(nodes[a]._id)}}}function disconnectAllKvmFunction(){for(var a in multiDesktop){multiDesktop[a].Stop()}multiDesktop={}}function onMultiDesktopStateChange(a,c){try{QH("skvmid_"+a.shortid,["Disconnected","Connecting...","Setup...","",""][c])}catch(b){}}function showMultiDesktopSettings(){QV("d7amtkvm",false);QV("d7meshkvm",true);d7bitmapquality.value=multidesktopsettings.quality;d7bitmapscaling.value=multidesktopsettings.scaling;if(multidesktopsettings.framerate){d7framelimiter.value=multidesktopsettings.framerate}else{d7framelimiter.value=1000}setDialogMode(7,"Remote Desktop Settings",3,showMultiDesktopSettingsChanged)}function showMultiDesktopSettingsChanged(){multidesktopsettings.quality=d7bitmapquality.value;multidesktopsettings.scaling=d7bitmapscaling.value;multidesktopsettings.framerate=d7framelimiter.value;localStorage.setItem("multidesktopsettings",JSON.stringify(multidesktopsettings));for(var a in multiDesktop){multiDesktop[a].m.SendCompressionLevel(1,multidesktopsettings.quality,multidesktopsettings.scaling,multidesktopsettings.framerate)}}function connectMultiDesktop(c,a){var d=c._id,e=d.split("/")[2];var b=multiDesktop[d];if(b==null){if(Q("kvmid_"+e)==null){return}if(a==2){if((c.intelamt.user==null)||(c.intelamt.user=="")){return}b=CreateAmtRedirect(CreateAmtRemoteDesktop("kvmid_"+e),authCookie);b.shortid=e;b.onStateChanged=onMultiDesktopStateChange;b.m.bpp=1;b.m.useZRLE=true;b.m.showmouse=true;b.m.onKvmData=function(g){console.log("KVM Data received in multi-desktop mode, this is not supported.")};if(debugmode>0){b.m.onScreenSizeChange=mdeskAdjust}b.Start(d,16994,"*","*",0);b.contype=2;multiDesktop[d]=b}else{if(a==1){b=CreateAgentRedirect(meshserver,CreateAgentRemoteDesktop("kvmid_"+e),serverPublicNamePort,authCookie,domainUrl);b.shortid=e;b.attemptWebRTC=attemptWebRTC;b.onStateChanged=onMultiDesktopStateChange;b.m.CompressionLevel=multidesktopsettings.quality;b.m.ScalingLevel=multidesktopsettings.scaling;b.m.FrameRateTimer=multidesktopsettings.framerate;if(debugmode>0){b.m.onScreenSizeChange=mdeskAdjust}b.Start(d);b.contype=1;multiDesktop[d]=b}}}else{b.Stop();delete multiDesktop[d]}}function getMeshActions(a,b){if((b&4)==0){return""}var c="";if((features&1024)==0){c+=' <a href=# style=cursor:pointer;font-size:10px title="Add a new Intel® AMT computer that is located on the internet." onclick=\'return addCiraDeviceToMesh("'+a._id+"\")'>Add CIRA</a>"}if(a.mtype==1){if((features&1)==0){c+=' <a href=# style=cursor:pointer;font-size:10px title="Add a new Intel® AMT computer that is located on the local network." onclick=\'return addDeviceToMesh("'+a._id+"\")'>Add Local</a>";c+=' <a href=# style=cursor:pointer;font-size:10px title="Add a new Intel® AMT computer by scanning the local network." onclick=\'return addAmtScanToMesh("'+a._id+"\")'>Scan Network</a>"}if(a.amt&&(a.amt.type==2)){c+=' <a href=# style=cursor:pointer;font-size:10px title="Perform Intel AMT client control mode (CCM) activation." onclick=\'return showCcmActivation("'+a._id+"\")'>Activation</a>"}else{if(a.amt&&(a.amt.type==3)&&((features&1048576)!=0)){c+=' <a href=# style=cursor:pointer;font-size:10px title="Perform Intel AMT admin control mode (ACM) activation." onclick=\'return showAcmActivation("'+a._id+"\")'>Activation</a>"}}}if(a.mtype==2){c+=' <a href=# style=cursor:pointer;font-size:10px title="Add a new computer to this mesh by installing the mesh agent." onclick=\'return addAgentToMesh("'+a._id+"\")'>Add Agent</a>";if((features&2)==0){c+=' <a href=# style=cursor:pointer;font-size:10px title="Invite someone to install the mesh agent on this mesh." onclick=\'return inviteAgentToMesh("'+a._id+"\")'>Invite</a>"}}return c}function addDeviceToMesh(b){if(xxdialogMode){return false}var a=meshes[b];var c='Add a new Intel® AMT device to device group "'+EscapeHtml(a.name)+'".<br /><br />';c+=addHtmlValue("Device Name","<input id=dp1devicename style=width:230px maxlength=32 autocomplete=off onchange=validateDeviceToMesh() onkeyup=validateDeviceToMesh() />");c+=addHtmlValue("Hostname",'<input id=dp1hostname style=width:230px maxlength=32 autocomplete=off placeholder="Same as device name" onchange=validateDeviceToMesh() onkeyup=validateDeviceToMesh() />');c+=addHtmlValue("Username",'<input id=dp1username style=width:230px maxlength=32 autocomplete=off placeholder="admin" onchange=validateDeviceToMesh() onkeyup=validateDeviceToMesh() />');c+=addHtmlValue("Password","<input id=dp1password type=password style=width:230px autocomplete=off maxlength=32 onchange=validateDeviceToMesh() onkeyup=validateDeviceToMesh() />");c+=addHtmlValue("Security","<select id=dp1tls style=width:236px><option value=0>No TLS security</option><option value=1>TLS security required</option></select>");setDialogMode(2,"Add Intel® AMT device",3,addDeviceToMeshEx,c,b);validateDeviceToMesh();Q("dp1devicename").focus();return false}function showCcmActivation(c){if(xxdialogMode){return false}var e=serverinfo.name,b=meshes[c];if((e.indexOf(".")==-1)||((features&2)!=0)){e=window.location.hostname}var g,a=domainUrl.substring(0,domainUrl.length-1);if(serverinfo.https==true){var d=(serverinfo.port==443)?"":(":"+serverinfo.port);g="wss://"+e+d+domainUrl}else{var d=(serverinfo.port==80)?"":(":"+serverinfo.port);g="ws://"+e+d+domainUrl}var h='Perform Intel AMT client control mode (CCM) activation to group "'+EscapeHtml(b.name)+'" by downloading the MeshCMD tool and running it like this:<br /><br />';h+="<textarea readonly=readonly style=width:100%;resize:none;height:100px;overflow:auto;font-size:12px readonly>meshcmd amtccm --url "+g+"amtactivate?id="+c.split("/")[2]+" --serverhttpshash "+serverinfo.tlshash+"</textarea>";setDialogMode(2,"Intel® AMT activation",9,null,h);Q("idx_dlgOkButton").focus();return false}function showAcmActivation(c){if(xxdialogMode){return false}var e=serverinfo.name,b=meshes[c];if((e.indexOf(".")==-1)||((features&2)!=0)){e=window.location.hostname}var g,a=domainUrl.substring(0,domainUrl.length-1);if(serverinfo.https==true){var d=(serverinfo.port==443)?"":(":"+serverinfo.port);g="wss://"+e+d+domainUrl}else{var d=(serverinfo.port==80)?"":(":"+serverinfo.port);g="ws://"+e+d+domainUrl}var h='Perform Intel AMT admin control mode (ACM) activation to group "'+EscapeHtml(b.name)+'" by downloading the MeshCMD tool and running it like this:<br /><br />';h+="<textarea readonly=readonly style=width:100%;resize:none;height:100px;overflow:auto;font-size:12px readonly>meshcmd amtacm --url "+g+"amtactivate?id="+c.split("/")[2]+" --serverhttpshash "+serverinfo.tlshash+"</textarea>";if(serverinfo.amtAcmFqdn!=null){h+="<div style=margin-top:8px>Intel AMT will need to be set with a Trusted FQDN in MEBx or have a wired LAN on the network: <b>"+serverinfo.amtAcmFqdn.join(", ")+"</b></div>"}setDialogMode(2,"Intel® AMT activation",9,null,h);Q("idx_dlgOkButton").focus();return false}function addAmtScanToMesh(a){if(xxdialogMode){return false}var b="Enter a range of IP addresses to scan for Intel AMT devices.<br /><br />";b+=addHtmlValue("IP Range",'<input id=dp1range style=width:184px value="192.168.1.0/24" onkeyup=addAmtScanToMeshKeyUp(event) /><input id=dp1rangebutton type=button value=Scan onclick=addAmtScanToMeshButton()></input>');b+='<div id=dp1results style="width:100%;height:200px;background-color:white;border:1px gray solid;overflow-y:scroll"></div>';setDialogMode(2,"Scan for Intel® AMT devices",3,addAmtScanToMeshEx,b,a);QE("idx_dlgOkButton",false);QH("dp1results","<div style=width:100%;text-align:center;margin-top:12px;color:gray;line-height:1.5>Sample IP range values<br />192.168.0.100<br />192.168.1.0/24<br />192.167.0.1-192.168.0.100</div>");focusTextBox("dp1range");return false}function addAmtScanToMeshKeyUp(a){if(a.keyCode==13){haltEvent(a);addAmtScanToMeshButton()}}function addAmtScanToMeshEx(b,h){var d=document.getElementsByClassName("DevScanCheckbox"),c=0;for(var e=0;e<d.length;e++){if(d[e].checked){var g=d[e].getAttribute("tag");var a=amtScanResults[g];meshserver.send({action:"addamtdevice",meshid:h,devicename:g,hostname:a.hostname,amtusername:"",amtpassword:"",amttls:a.tls})}}}function addAmtScanToMeshButton(){QE("dp1range",false);QE("dp1rangebutton",false);QH("dp1results","<div style=width:100%;text-align:center;margin-top:12px>Scanning...</div>");meshserver.send({action:"scanamtdevice",range:Q("dp1range").value})}function addAmtScanToMeshCheckbox(){var b=document.getElementsByClassName("DevScanCheckbox"),a=0;for(var c=0;c<b.length;c++){if(b[c].checked){a++}}QE("idx_dlgOkButton",a>0)}function addCiraDeviceToMesh(b){if(xxdialogMode){return false}var a=meshes[b];var c=b.split("/")[2].replace(/\@/g,"X").replace(/\$/g,"X");var e="<select id=dlgAddCiraSel onclick=dlgAddCiraSelClick() style=width:230px><option value=0>MeshCommander Script</option><option value=1>Manual Username/Password</option>";if((features&16)==0){e+="<option value=2>Manual Certificate</option></select>"}var d="";d+=addHtmlValue("Setup Method",e);d+="<hr>";d+='<div id=dlgAddCira0>To add a new Intel® AMT device to device group "'+EscapeHtml(a.name)+"\" with CIRA, download the following script files and use <a href='http://meshcommander.com' rel='noreferrer noopener' target='_blank'>MeshCommander</a> to run the script to configure computers.<br /><br />";d+=addHtmlValue("Setup CIRA",'<a href="mescript.ashx?type=1&meshid='+b+'" download>cira_setup.mescript</a>');d+=addHtmlValue("Cleanup CIRA",'<a href="mescript.ashx?type=2" download>cira_clean.mescript</a>');d+="</div>";d+='<div id=dlgAddCira1 style=display:none>To add a new Intel® AMT device to device group "'+EscapeHtml(a.name)+'" with CIRA, load the following certificate as trusted root within Intel AMT';if(serverinfo.mpspass){d+=" and authenticate to the server using this username and password.<br /><br />"}else{d+=" and authenticate to the server using this username and any password.<br /><br />"}d+=addHtmlValue("Root Certificate",'<a href="MeshServerRootCert.cer" download>Root Certificate File</a>');d+=addHtmlValue("Username",'<input style=width:230px readonly value="'+c.substring(0,16)+'" />');if(serverinfo.mpspass){d+=addHtmlValue("Password",'<input style=width:230px readonly value="'+EscapeHtml(serverinfo.mpspass)+'" />')}if(serverinfo!=null){d+=addHtmlValue("MPS Server",'<input style=width:230px readonly value="'+EscapeHtml(serverinfo.mpsname)+":"+serverinfo.mpsport+'" />')}d+="</div>";if((features&16)==0){d+='<div id=dlgAddCira2 style=display:none>To add a new Intel® AMT device to device group "'+EscapeHtml(a.name)+'" with CIRA, load the following certificate as trusted root within Intel AMT, authenticate using a client certificate with the following common name and connect to the following server.<br /><br />';d+=addHtmlValue("Root Certificate",'<a href="MeshServerRootCert.cer" download>Root Certificate File</a>');d+=addHtmlValue("Organization",'<input style=width:230px readonly value="'+c+'" />');if(serverinfo!=null){d+=addHtmlValue("MPS Server",'<input style=width:230px readonly value="'+EscapeHtml(serverinfo.mpsname)+":"+serverinfo.mpsport+'" />')}d+="</div>"}setDialogMode(2,"Add Intel® AMT CIRA device",2,null,d,"fileDownload");Q("dlgAddCiraSel").focus();return false}function dlgAddCiraSelClick(){var a=Q("dlgAddCiraSel").value;QV("dlgAddCira0",a==0);QV("dlgAddCira1",a==1);QV("dlgAddCira2",a==2)}function checkEmail(c){var d=c.split("@");var b=((d.length==2)&&(d[0].length>0)&&(d[1].split(".").length>1)&&(d[1].length>2));if(b==true){var e=d[1].split(".");for(var a in e){if(e[a].length==0){b=false}}}return b}function inviteAgentToMesh(b){if(xxdialogMode){return false}var c="",a=meshes[b];if(features&64){c+=addHtmlValue("Invitation Type","<select id=d2InviteType onchange=d2ChangedInviteType() style=width:236px><option value=0>Link invitation</option><option value=1>Email invitation</option></select>")+"<hr />";c+='<div id=emailInviteDiv style=display:none>Invite someone to install the mesh agent. An email with be sent with the link to the mesh agent installation for the "'+EscapeHtml(a.name)+'" device group.<br /><br />';c+=addHtmlValue("Name (optional)",'<input id=agentInviteName value="" style=width:230px maxlength=64 />');c+=addHtmlValue("Email",'<input id=agentInviteEmail style=width:230px placeholder="example@email.com" onkeyup=validateAgentInvite()></input>');c+=addHtmlValue("Operating System","<select id=agentInviteNameOs onchange=d2ChangedInviteType() style=width:236px><option value=4>Send installation link</option><option value=0 selected>Any supported</option><option value=1>Windows only</option><option value=3>Apple MacOS only</option><option value=2>Linux only</option></select>");c+="<div id=d2agentexpirediv>";c+=addHtmlValue("Link Expiration","<select id=agentInviteExpire style=width:236px><option value=1>1 hour</option><option value=8>8 hours</option><option value=24>1 day</option><option value=168>1 week</option><option value=5040>1 month</option><option value=0>Unlimited</option></select>");c+="</div>";c+=addHtmlValue("Installation Type","<select id=agentInviteType style=width:236px><option value=0>Background and interactive</option><option value=2>Background only</option><option value=1>Interactive only</option></select>");c+=addHtmlValue("Message<br />(optional)",'<textarea id=agentInviteMessage value="" style=width:230px;height:100px;resize:none maxlength=1024 /></textarea>');c+="</div>"}c+='<div id=urlInviteDiv>Invite someone to install the mesh agent by sharing an invitation link. This link points the user to installation instructions for the "'+EscapeHtml(a.name)+'" device group. The link is public and no account for this server is needed.<br /><br />';c+=addHtmlValue("Link Expiration","<select id=d2inviteExpire style=width:236px onchange=d2RequestInvitationLink()><option value=1>1 hour</option><option value=8>8 hours</option><option value=24>1 day</option><option value=168>1 week</option><option value=5040>1 month</option><option value=0>Unlimited</option></select>");c+='<div id=agentInvitationLinkDiv style="text-align:center;font-size:large;margin:16px;display:none"><a href=# id=agentInvitationLink target="_blank" style=cursor:pointer></a> <img src=images/link4.png height=10 width=10 title="Copy link to clipboard" style=cursor:pointer onclick=d2CopyInviteToClip()></div></div>';setDialogMode(2,"Invite",3,performAgentInvite,c,b);if(features&64){Q("d2InviteType").focus();d2ChangedInviteType()}else{Q("d2inviteExpire").focus();validateAgentInvite()}d2RequestInvitationLink();return false}function d2RequestInvitationLink(){meshserver.send({action:"createInviteLink",meshid:xxdialogTag,expire:parseInt(Q("d2inviteExpire").value),flags:0})}function d2ChangedInviteType(){QV("urlInviteDiv",Q("d2InviteType").value==0);QV("d2agentexpirediv",Q("agentInviteNameOs").value==4);QV("emailInviteDiv",Q("d2InviteType").value==1);validateAgentInvite()}function d2CopyInviteToClip(){copyTextToClip(Q("agentInvitationLink").href)}function validateAgentInvite(){if((features&64)&&(Q("d2InviteType").value==1)){QE("idx_dlgOkButton",checkEmail(Q("agentInviteEmail").value));QV("idx_dlgCancelButton",true)}else{QE("idx_dlgOkButton",true);QV("idx_dlgCancelButton",false)}}function performAgentInvite(a,b){if((features&64)&&(Q("d2InviteType").value==1)){meshserver.send({action:"inviteAgent",meshid:b,email:Q("agentInviteEmail").value,name:Q("agentInviteName").value,os:Q("agentInviteNameOs").value,flags:Q("agentInviteType").value,msg:Q("agentInviteMessage").value,expire:parseInt(Q("agentInviteExpire").value)})}}function addAgentToMesh(e){if(xxdialogMode){return false}var c=meshes[e],j="",b=0;j+=addHtmlValue("Operating System","<select id=aginsSelect onchange=addAgentToMeshClick() style=width:236px><option value=0>Windows</option><option value=1>Linux / BSD</option><option value=2>Apple MacOS</option><option value=3>Windows (UnInstall)</option><option value=4>Linux / BSD (UnInstall)</option></select>");j+="<div id=aginsTypeDiv>";j+=addHtmlValue("Installation Type","<select id=aginsType onchange=addAgentToMeshClick() style=width:236px><option value=0>Background & interactive</option><option value=2>Background only</option><option value=1>Interactive only</option></select>");j+="</div><hr>";var d=c.name;d=d.split("\\").join("").split("/").join("").split(":").join("").split("*").join("").split("?").join("").split('"').join("").split("<").join("").split(">").join("").split("|").join("").split(" ").join("").split("'").join("");j+='<div id=agins_windows>To add a new computer to device group "'+EscapeHtml(c.name)+'", download the mesh agent and install it the computer to manage. This agent has server and device group information embedded within it.<br /><br />';j+=addHtmlValue("Mesh Agent",'<a id=aginsw32lnk href="meshagents?id=3&meshid='+e.split("/")[2]+'&installflags=0" download onclick="setDialogMode(0)" title="32bit version of the MeshAgent">Windows (.exe)</a> <img src=images/link4.png height=10 width=10 title="Copy Windows 32bit agent URL to clipboard" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=3&meshid='+e.split("/")[2]+'&installflags=",1)>');j+=addHtmlValue("Mesh Agent",'<a id=aginsw64lnk href="meshagents?id=4&meshid='+e.split("/")[2]+'&installflags=0" download onclick="setDialogMode(0)" title="64bit version of the MeshAgent">Windows x64 (.exe)</a> <img src=images/link4.png height=10 width=10 title="Copy Windows 64bit agent URL to clipboard" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=4&meshid='+e.split("/")[2]+'&installflags=",1)>');if(debugmode>0){j+=addHtmlValue("Settings File",'<a id=aginswmshlnk href="meshsettings?id='+e.split("/")[2]+'&installflags=0" rel="noreferrer noopener" target="_blank">'+EscapeHtml(c.name)+" settings (.msh)</a>")}j+="</div>";j+="<div id=agins_linux style=display:none>To add a computer to "+EscapeHtml(c.name)+" run the following command. Root credentials will be needed.<br />";j+="<textarea id=agins_linux_area rows=2 cols=20 readonly=readonly style=width:100%;resize:none;height:120px;overflow:scroll;font-size:12px readonly></textarea>";j+="<div style='font-size:x-small'>* For BSD, run \"pkg install wget sudo bash\" first.</div></div>";j+='<div id=agins_osx style=display:none>To add a new computer to device group "'+EscapeHtml(c.name)+'", download the mesh agent and install it the computer to manage. This agent installer has server and device group information embedded within it.<br /><br />';j+=addHtmlValue("Mesh Agent",'<a href="meshosxagent?id=16&meshid='+e.split("/")[2]+'" rel="noreferrer noopener" target="_blank" title="64bit version of MacOS Mesh Agent">MacOS Agent (64bit)</a> <img src=images/link4.png height=10 width=10 title="Copy MacOS agent URL to clipboard" style=cursor:pointer onclick=copyAgentUrl("meshosxagent?id=16&meshid='+e.split("/")[2]+'",0)>');j+="</div>";j+='<div id=agins_windows_un style=display:none>To remove a mesh agent, download the file below, run it and click "uninstall".<br /><br />';j+=addHtmlValue("Mesh Agent",'<a href="meshagents?id=3" download onclick="setDialogMode(0)" title="32bit version of the MeshAgent">Windows (.exe)</a>');j+=addHtmlValue("Mesh Agent",'<a href="meshagents?id=4" download onclick="setDialogMode(0)" title="64bit version of the MeshAgent">Windows x64 (.exe)</a>');j+="</div>";j+="<div id=agins_linux_un style=display:none>To remove a mesh agent, run the following command. Root credentials will be needed.<br />";j+="<textarea id=agins_linux_area_un rows=2 cols=20 readonly=readonly style=width:100%;resize:none;height:120px;overflow:scroll;font-size:12px readonly></textarea>";j+="</div>";setDialogMode(2,"Add Mesh Agent",2,null,j,"fileDownload");var h=serverinfo.name;if((h.indexOf(".")==-1)||((features&2)!=0)){h=window.location.hostname}var a=domainUrl.substring(0,domainUrl.length-1);if(serverinfo.https==true){var g=(serverinfo.port==443)?"":(":"+serverinfo.port);if((features&8192)==0){Q("agins_linux_area").value="(wget https://"+h+g+domainUrl+"meshagents?script=1 --no-check-certificate -O ./meshinstall.sh || wget https://"+h+g+domainUrl+"meshagents?script=1 --no-proxy --no-check-certificate -O ./meshinstall.sh) && chmod 755 ./meshinstall.sh && sudo -E ./meshinstall.sh https://"+h+g+a+" '"+e.split("/")[2]+"'\r\n";Q("agins_linux_area_un").value="(wget https://"+h+g+domainUrl+"meshagents?script=1 --no-check-certificate -O ./meshinstall.sh || wget https://"+h+g+domainUrl+"meshagents?script=1 --no-proxy --no-check-certificate -O ./meshinstall.sh) && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh uninstall\r\n"}else{Q("agins_linux_area").value="wget https://"+h+g+domainUrl+"meshagents?script=1 --no-proxy --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh https://"+h+g+a+" '"+e.split("/")[2]+"'\r\n";Q("agins_linux_area_un").value="wget https://"+h+g+domainUrl+"meshagents?script=1 --no-proxy --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh uninstall\r\n"}}else{var g=(serverinfo.port==80)?"":(":"+serverinfo.port);if((features&8192)==0){Q("agins_linux_area").value="(wget http://"+h+g+domainUrl+"meshagents?script=1 -O ./meshinstall.sh || wget http://"+h+g+domainUrl+"meshagents?script=1 --no-proxy -O ./meshinstall.sh) && chmod 755 ./meshinstall.sh && sudo -E ./meshinstall.sh http://"+h+g+a+" '"+e.split("/")[2]+"'\r\n";Q("agins_linux_area_un").value="(wget http://"+h+g+domainUrl+"meshagents?script=1 -O ./meshinstall.sh || wget http://"+h+g+domainUrl+"meshagents?script=1 --no-proxy -O ./meshinstall.sh) && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh uninstall\r\n"}else{Q("agins_linux_area").value="wget http://"+h+g+domainUrl+"meshagents?script=1 --no-proxy -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh http://"+h+g+a+" '"+e.split("/")[2]+"'\r\n";Q("agins_linux_area_un").value="wget http://"+h+g+domainUrl+"meshagents?script=1 --no-proxy -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh uninstall\r\n"}}Q("aginsSelect").focus();addAgentToMeshClick();return false}function copyAgentUrl(h,a){var g=serverinfo.name;if((g.indexOf(".")==-1)||((features&2)!=0)){g=window.location.hostname}var d=domainUrl.substring(0,domainUrl.length-1);var e=(serverinfo.port==443)?"":(":"+serverinfo.port);var b="https://"+g+e+domainUrl+h;if(a==1){b+=Q("aginsType").value}copyTextToClip(b)}function addAgentToMeshClick(){var a=Q("aginsSelect").value;QV("agins_windows",a==0);QV("agins_linux",a==1);QV("agins_osx",a==2);QV("agins_windows_un",a==3);QV("agins_linux_un",a==4);QV("aginsTypeDiv",a==0);Q("aginsw32lnk").href=(Q("aginsw32lnk").href.split("installflags=")[0])+"installflags="+Q("aginsType").value;Q("aginsw64lnk").href=(Q("aginsw64lnk").href.split("installflags=")[0])+"installflags="+Q("aginsType").value;if(debugmode>0){Q("aginswmshlnk").href=(Q("aginswmshlnk").href.split("installflags=")[0])+"installflags="+Q("aginsType").value}}function validateDeviceToMesh(){QE("idx_dlgOkButton",(Q("dp1devicename").value.length>0)&&(passwordcheck(Q("dp1password").value)))}function addDeviceToMeshEx(b,d){var a=Q("dp1username").value;if(a==""){a="admin"}var c=Q("dp1hostname").value;if(c==""){c=Q("dp1devicename").value}meshserver.send({action:"addamtdevice",meshid:d,devicename:Q("dp1devicename").value,hostname:c,amtusername:a,amtpassword:Q("dp1password").value,amttls:Q("dp1tls").value})}function deviceHeaderSet(){if(deviceHeaderId==0){deviceHeaderId=1;return}deviceHeaders["DevxHeader"+deviceHeaderId]=deviceHeaderTotal+((deviceHeaderTotal==1)?" node":" nodes");deviceHeaderId++;deviceHeaderCount={};deviceHeaderTotal=0}var powerStateStrings=["",'<span title="Device is powered on.">Powered</span>','<span title="Device is in sleep state (S1).">Sleeping</span>','<span title="Device is in sleep state (S2).">Sleeping</span>','<span title="Device is in deep sleep state (S3).">Deep Sleep</span>','<span title="Device is in hibernating state (S4).">Hibernating</span>','<span title="Device is in powered off state (S5).">Soft-Off</span>','<span title="Device is detected but power state could not be obtained.">Present</span>'];var powerStateStrings2=["","Device is powered","Device is in sleep state (S1)","Device is in sleep state (S2)","Device is in deep sleep state (S3)","Device is hibernating (S4)","Device is in soft-off state (S5)","Device is present, but power state cannot be determined"];var powerColorTable=["pwsTransparent","pwsBlack","pwsBlue","pwsBlue2","pwsLightblue","pwsBlueviolet","pwsDarkgreen","pwsLightseagreen","pwsLightseagreen2"];function NodeStateStr(a){var b=[];if(a.state>0&&a.state<powerStatetable.length){state.push(powerStatetable[a.state])}if(a.conn){if((a.conn&1)!=0){b.push('<span title="Mesh agent is connected and ready for use.">Agent</span>')}if((a.conn&2)!=0){b.push('<span title="Intel® AMT CIRA is connected and ready for use.">CIRA</span>')}else{if((a.conn&4)!=0){b.push('<span title="Intel® AMT is routable.">Intel® AMT</span>')}}if((a.conn&8)!=0){b.push('<span title="Mesh agent is reachable using another agent as relay.">Relay</span>')}if((a.conn&16)!=0){b.push('<span title="MQTT connection to the device is active.">MQTT</span>')}}if((a.pwr!=null)&&(a.pwr!=0)){b.push(powerStateStrings[a.pwr])}return b.join(", ")}function PowerStateStr(a){if(a<powerStatetable.length){return powerStatetable[a]}return""}function PowerStateStr2(a){if((a!=0)&&(a<powerStatetable.length)){return powerStatetable[a]}return"Unknown"}function selectallButtonFunction(){var b=document.getElementsByClassName("DeviceCheckbox"),a=0;for(var c=0;c<b.length;c++){if(b[c].checked===true){a++}}for(var c=0;c<b.length;c++){b[c].checked=(a==0)}p1updateInfo()}function p1updateInfo(){var b=document.getElementsByClassName("DeviceCheckbox"),a=0;for(var c=0;c<b.length;c++){if(b[c].checked===true){a++}}if(a>0){QE("GroupActionButton",true);Q("SelectAllButton").value="Select None";QV("cxmgroupsplit",true);QV("cxmdesktop",true)}else{QE("GroupActionButton",false);Q("SelectAllButton").value="Select All";QV("cxmgroupsplit",false);QV("cxmdesktop",false)}}function groupActionFunction(){var b="";if(features&4194304){var c=getCheckedDevices();for(var a in c){if((getNodeFromId(c[a]).conn&16)!=0){b="<option value=103>Send MQTT Message</option>"}}}var d="Select an operation to perform on all selected devices. Actions will be performed only with proper rights.<br /><br />";d+=addHtmlValue("Operation","<select id=d2groupop><option value=100>Wake-up devices</option><option value=4>Sleep devices</option><option value=3>Reset devices</option><option value=2>Power off devices</option><option value=102>Move to device group</option>"+b+"<option value=101>Delete devices</option></select>");setDialogMode(2,"Group Action",3,groupActionFunctionEx,d)}function getCheckedDevices(){var e=[],b=document.getElementsByClassName("DeviceCheckbox"),a=0;for(var c=0;c<b.length;c++){if(b[c].checked){if(b[c].value){var d=b[c].value.substring(6);if(e.indexOf(d)==-1){e.push(d)}}}}return e}function groupActionFunctionEx(){var a=Q("d2groupop").value;if(a==100){meshserver.send({action:"wakedevices",nodeids:getCheckedDevices()})}else{if(a==101){var b="Confirm delete selected devices(s)?<br /><br />";b+="<label><input id=d2check type=checkbox onchange=d2groupActionFunctionDelEx() />Confirm</label>";setDialogMode(2,"Delete Nodes",3,groupActionFunctionDelEx,b);QE("idx_dlgOkButton",false)}else{if(a==102){p10showChangeGroupDialog(getCheckedDevices())}else{if(a==103){p10showSendMqttMsgDialog(getCheckedDevices())}else{meshserver.send({action:"poweraction",nodeids:getCheckedDevices(),actiontype:parseInt(a)})}}}}}function d2groupActionFunctionDelEx(){QE("idx_dlgOkButton",Q("d2check").checked)}function groupActionFunctionDelEx(){meshserver.send({action:"removedevices",nodeids:getCheckedDevices()})}function onSortSelectChange(a){sort=document.getElementById("sortselect").selectedIndex;if(!a){putstore("sort",sort)}}function meshSort(c,d){if(c.meshnamel>d.meshnamel){return 1}if(c.meshnamel<d.meshnamel){return -1}if(c.meshid==d.meshid){if(showRealNames==true){if(c.rnamel>d.rnamel){return 1}if(c.rnamel<d.rnamel){return -1}return 0}else{if(c.namel>d.namel){return 1}if(c.namel<d.namel){return -1}return 0}}return 0}function powerSort(c,e){var d=c.pwr?c.pwr:0;var g=e.pwr?e.pwr:0;if(d>g){return -1}if(d<g){return 1}if(d==g){if(showRealNames==true){if(c.rnamel>e.rnamel){return 1}if(c.rnamel<e.rnamel){return -1}return 0}else{if(c.namel>e.namel){return 1}if(c.namel<e.namel){return -1}return 0}}return 0}function deviceSort(c,d){if(c.namel>d.namel){return 1}if(c.namel<d.namel){return -1}return 0}function deviceHostSort(c,d){if(c.rnamel>d.rnamel){return 1}if(c.rnamel<d.rnamel){return -1}return 0}function onSearchFocus(a){searchFocus=a}function onMapSearchFocus(a){mapSearchFocus=a}function onUserSearchFocus(a){userSearchFocus=a}function onConsoleFocus(a){consoleFocus=a}function onSearchInputChanged(){var m=Q("SearchInput").value.toLowerCase().trim();putstore("_search",m);var l=null,g=null,c=null;if(m.startsWith("user:")){l=m.substring(5)}else{if(m.startsWith("u:")){l=m.substring(2)}else{if(m.startsWith("ip:")){g=m.substring(3)}else{if(m.startsWith("group:")){c=m.substring(6)}else{if(m.startsWith("g:")){c=m.substring(2)}}}}}if(m==""){for(var a in nodes){nodes[a].v=true}}else{if(g!=null){for(var a in nodes){nodes[a].v=((nodes[a].ip!=null)&&(nodes[a].ip.indexOf(g)>=0))}}else{if(c!=null){for(var a in nodes){nodes[a].v=(meshes[nodes[a].meshid].name.toLowerCase().indexOf(c)>=0)}}else{if(l!=null){for(var a in nodes){nodes[a].v=false;if(nodes[a].users&&nodes[a].users.length>0){for(var e in nodes[a].users){if(nodes[a].users[e].toLowerCase().indexOf(l)>=0){nodes[a].v=true}}}}}else{try{var h=m.split(/\s+/).join("|"),j=new RegExp(h);for(var a in nodes){nodes[a].v=(j.test(nodes[a].name.toLowerCase()))||(nodes[a].rnamel!=null&&j.test(nodes[a].rnamel.toLowerCase()));if((nodes[a].v==false)&&nodes[a].tags){for(var k in nodes[a].tags){if(j.test(nodes[a].tags[k].toLowerCase())){nodes[a].v=true;break}else{nodes[a].v=false}}}}}catch(b){for(var a in nodes){nodes[a].v=true}}}}}}}var contextelement=null;function handleContextMenu(d){hideContextMenu();var m=(window.pageXOffset!==null)?window.pageXOffset:(document.documentElement||document.body.parentNode||document.body).scrollLeft;var n=(window.pageYOffset!==null)?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop;var c=document.elementFromPoint(d.pageX-m,d.pageY-n);if(c&&c!=null&&c.id=="connectbutton2"&¤tNode&¤tNode.agent&&(currentNode.agent.id>0)&&(currentNode.agent.id<5)){contextelement=c;var b=document.getElementById("termShellContextMenu");b.style.left=d.pageX+"px";b.style.top=d.pageY+"px";b.style.display="block"}else{if(c&&c!=null&&c.id=="MxMESH"){contextelement=c;var b=document.getElementById("meshContextMenu");b.style.left=d.pageX+"px";b.style.top=d.pageY+"px";b.style.display="block"}else{while(c&&c!=null&&c.id!="devs"){c=c.parentElement}if(!c||c==null){return true}contextelement=c;var b=document.getElementById("contextMenu");b.style.left=d.pageX+"px";b.style.top=d.pageY+"px";b.style.display="block";var l=contextelement.children[1].attributes.onclick.value;var k=getNodeFromId(l.substring(12,l.length-18));var g=meshes[k.meshid];var h=g.links[userinfo._id];var j=h.rights;var a=((j&16)!=0);var o=((j==4294967295)||((j&512)==0));var e=((j==4294967295)||((j&1024)==0));QV("cxdesktop",((g.mtype==1)||(k.agent==null)||(k.agent.caps==null)||((k.agent.caps&1)!=0)||(k.intelamt&&(k.intelamt.state==2)))&&((j&8)||(j&256)));QV("cxterminal",((g.mtype==1)||(k.agent==null)||(k.agent.caps==null)||((k.agent.caps&2)!=0)||(k.intelamt&&(k.intelamt.state==2)))&&(j&8)&&o);QV("cxfiles",((g.mtype==2)&&((k.agent==null)||(k.agent.caps==null)||((k.agent.caps&4)!=0)))&&(j&8)&&e);QV("cxevents",(k.intelamt!=null)&&((k.intelamt.state==2)||(k.conn&2))&&(j&8));QV("cxconsole",(a&&(g.mtype==2)&&((k.agent==null)||(k.agent.caps==null)||((k.agent.caps&8)!=0)))&&(j&8))}}return haltEvent(d)}function cmaction(a,b){var d=contextelement.children[1].attributes.onclick.value;d=d.substring(12,d.length-18);if(a==7){Q("viewselect").value=3;Q("viewselect").onchange();Q("autoConnectDesktopCheckbox").checked=true;Q("autoConnectDesktopCheckbox").onclick()}if((a>0)&&(a<7)){var e=[0,10,12,11,13,16,15][a];if(b&&(b.shiftKey==true)){window.open(window.location.origin+"?node="+d.split("/")[2]+"&viewmode="+e+"&hide=16","meshcentral:"+d)}else{gotoDevice(d,e);var c=meshes[currentNode.meshid];if((currentNode.conn&1)&&(c.mtype==2)){if((e==11)&&(desktop==null)&&(currentNode.agent.caps&1)){connectDesktop(null,1)}if((e==12)&&(terminal==null)&&(currentNode.agent.caps&2)){connectTerminal(null,1)}if((e==13)&&(files==null)){connectFiles(null)}}}}}function cmmeshaction(a){var d=contextelement.attributes.onclick.value.substring(10,contextelement.attributes.onclick.value.length-2);var b=document.getElementsByClassName("DeviceCheckbox");if((a==1)||(a==2)){for(var c=0;c<b.length;c++){if((b[c].attributes)&&(b[c].attributes["class"]["value"].split(" ")[0]==d)){b[c].checked=(a==1)}}}p1updateInfo()}function cmtermaction(a){connectTerminal(null,1,{powershell:(a==2)})}function hideContextMenu(){QV("contextMenu",false);QV("meshContextMenu",false);QV("termShellContextMenu",false);contextelement=null}var xxmap={map:null,contextmenu:null,activeInteractions:[],showindex:0,markersSource:null,markersLayer:null,mapLayer:null,mapView:null,};function updateMapMarkers(j){if((xxmap!=null)&&(xxmap.map==null)){try{loadmap()}catch(b){console.error("loadmap() exception",b)}}if(xxmap==null){return}var a=null;for(var d in nodes){try{var g=map_parseNodeLoc(nodes[d]),c=xxmap.markersSource.getFeatureById(nodes[d]._id);if((g!=null)&&((nodes[d].meshid==j)||(j==null))){var e=g[0],h=g[1],k=g[2];if(a==null){a=[e,h,e,h,0]}else{if(e<a[0]){a[0]=e}if(h<a[1]){a[1]=h}if(e>a[2]){a[2]=e}if(h>a[3]){a[3]=h}}if(c==null){addFeature(nodes[d]);a[4]=1}else{updateFeature(nodes[d],c);c.setStyle(markerStyle(nodes[d],g[2]))}}else{if(c){xxmap.markersSource.removeFeature(c)}}}catch(b){console.error("updateMapMarkers() exception",b,JSON.stringify(nodes[d]))}}return a}var map_cm_popup=new ol.Overlay({element:Q("xmap-info-window"),positioning:"bottom-center",stopEvent:false});var map_cm_editMarker={text:"Modify node location",callback:function(a){modifyMarkerloc(a.data)}};var map_cm_clearMarker={text:"Remove node location",callback:function(a){meshserver.send({action:"changedevice",nodeid:a.data.a,userloc:[]})}};var map_cm_saveMarker={text:"Save node location",callback:function(a){saveMarkerloc(a.data)}};var map_cm_nodemenu_items=[{text:"General information",callback:function(a){if(a.data!=null){gotoDevice(a.data,10)}}},{text:"Desktop",callback:function(a){if(a.data!=null){gotoDevice(a.data,11)}}},{text:"Terminal",callback:function(a){if(a.data!=null){gotoDevice(a.data,12)}}},{text:"Intel® AMT",callback:function(a){if(a.data!=null){gotoDevice(a.data,14)}}},"-",{text:"Zoom-in to extent",callback:function(b){var a=b.data.getGeometry().getCoordinates();zoomToLocation(a,19)}},{text:"Zoom-out to extent",callback:function(b){var a=b.data.getGeometry().getCoordinates();zoomToLocation(a,2)}}];var contextmenu_items=[{text:"Refresh",callback:function(){refreshMap(true,true)}},{text:"Zoom to fit extent",callback:function(){zoomToFitExtent()}},{text:"Center map here",callback:function(a){xxmap.mapView.animate({center:a.coordinate})}},{text:"Place node here",callback:function(a){placeNode(a.coordinate)}}];function stringToIntHash(c){var a=0,b;for(b=0;b<c.length;b++){a=((a<<5)-a)+c.charCodeAt(b);a|=0}return a}function map_parseNodeLoc(b){var a=null,c=0;if(b.iploc){a=b.iploc;c=1}if(b.wifiloc){a=b.wifiloc;c=2}if(b.gpsloc){a=b.gpsloc;c=3}if(b.userloc){a=b.userloc;c=4}if((a==null)||(typeof a!="string")){return null}a=a.split(",");if(c==1){return[parseFloat(a[0])+(stringToIntHash(b._id.substring(0,20))/100000000000),parseFloat(a[1])+(stringToIntHash(b._id.substring(20))/100000000000),c]}else{return[parseFloat(a[0]),parseFloat(a[1]),c]}}function loadmap(){if(xxmap==null){return}if((features&32768)==0){QV("viewselectmapoption",false);QV("devViewButton4",false);xxmap=null;return}try{xxmap.markersSource=new ol.source.Vector();xxmap.markersLayer=new ol.layer.Vector({source:xxmap.markersSource});xxmap.mapLayer=new ol.layer.Tile({source:new ol.source.OSM()});xxmap.mapView=new ol.View({center:ol.proj.transform([0,0],"EPSG:4326","EPSG:3857"),zoom:2,minZoom:2,maxZoom:20,extent:ol.proj.transformExtent([-100000,-69.55,100000,69.55],"EPSG:4326","EPSG:3857")});xxmap.map=new ol.Map({target:"xdevicesmap",layers:[xxmap.mapLayer,xxmap.markersLayer],view:xxmap.mapView});xxmap.map.addOverlay(map_cm_popup);xxmap.map.on("click",function(c){var d=xxmap.map.forEachFeatureAtPixel(c.pixel,function(h,j){return h});if(d){var g=d.getId();if(g!=null){gotoDevice(g,10)}else{var e=getCorrespondingFeature(d);gotoDevice(e.getId(),10)}}});xxmap.map.on("pointermove",function(d){var g=xxmap.map.forEachFeatureAtPixel(d.pixel,function(j,k){return j});if(g){xxmap.map.getTargetElement().style.cursor="pointer";var c=g.getGeometry().getCoordinates();map_cm_popup.setPosition(c);var e=g.getId();if(e){QH("xmap-info-window",g.get("name"))}else{var h=getCorrespondingFeature(g);QH("xmap-info-window",h.get("name"))}}else{xxmap.map.getTargetElement().style.cursor="";QH("xmap-info-window","")}});var a=new ContextMenu({width:160,defaultItems:false,items:contextmenu_items});a.on("open",function(c){var e=xxmap.map.forEachFeatureAtPixel(c.pixel,function(h,j){return h});xxmap.contextmenu.clear();if(e){var d=e.getId();if(d){addContextMenuItems(e)}else{var g=getCorrespondingFeature(e);if(g){addContextMenuItems(g)}else{xxmap.contextmenu.extend(contextmenu_items)}}}else{xxmap.contextmenu.extend(contextmenu_items)}});if(xxmap.contextmenu==null){xxmap.contextmenu=a}xxmap.map.addControl(xxmap.contextmenu)}catch(b){console.log(b);QV("viewselectmapoption",false);QV("devViewButton4",false);xxmap=null}}function addFeature(g,c,e){var a=getModifiedFeature(g._id);if(a){xxmap.markersSource.addFeature(a)}else{if(!c&&!e){var d=map_parseNodeLoc(g);c=d[0];e=d[1]}if(e>180){e=180-e;meshserver.send({action:"changedevice",nodeid:g._id,userloc:[c,e]})}if((c<90)&&(c>-90)&&(e<180)&&(e>-180)){var b=new ol.Feature({geometry:new ol.geom.Point(ol.proj.transform([e,c],"EPSG:4326","EPSG:3857")),name:g.name,status:g.conn,lat:c,lon:e});b.setId(g._id);b.setStyle(markerStyle(g));xxmap.markersSource.addFeature(b)}}}function removeFeature(b){var a=xxmap.markersSource.getFeatureById(b._id);if(a){xxmap.markersSource.removeFeature(a)}}function updateFeature(g,a){if(g.conn!=a.get("status")){a.set("status",g.conn);a.setStyle(markerStyle(g))}var c=map_parseNodeLoc(g);if(c!=null){var b=c[0],d=c[1];if((b!=a.get("lat"))||(d!=a.get("lon"))){a.set("lat",b);a.set("lon",d);var e=ol.proj.transform([parseFloat(d),parseFloat(b)],"EPSG:4326","EPSG:3857");a.getGeometry().setCoordinates(e)}}if(g.name!=a.get("name")){a.set("name",g.name)}}function modifyMarkerloc(c){var b=c.getId();if(b){c.setStyle(markerStyle(getNodeFromId(c.a),4));if(!getActiveInteractions(c)){var a=new ol.interaction.Modify({features:new ol.Collection([c]),pixelTolerance:10});xxmap.activeInteractions.push({featureid:b,feature:c,interaction:a});xxmap.map.addInteraction(a)}}}function saveMarkerloc(d){var c=d.getId();if(c){var a=getActiveInteractions(d);if(a){xxmap.map.removeInteraction(a);removeInteraction(c);var b=d.getGeometry().getCoordinates();var e=ol.proj.transform(b,"EPSG:3857","EPSG:4326");if(e[0]>180){e[0]=180-e[0]}var g=[e[1],e[0]];meshserver.send({action:"changedevice",nodeid:c,userloc:g})}}}function markerStyle(b,d){if(d==null){d=0;if(b.iploc){d=1}if(b.wifiloc){d=2}if(b.gpsloc){d=3}if(b.userloc){d=4}}var e=["","-ip","-wifi","-gps","-user"];var a=connStateColor(b);var c=new ol.style.Style({image:new ol.style.Icon({color:a,anchor:[0.5,1],src:"images/mapmarker"+e[d]+".png"})});return[c]}function connStateColor(a){if(a.conn==1||a.conn==3||a.conn==5){return"#00ffdd"}return"#C70039"}function addContextMenuItems(a){if(getActiveInteractions(a)){map_cm_saveMarker.data=a;xxmap.contextmenu.push(map_cm_saveMarker)}else{map_cm_editMarker.data=a;xxmap.contextmenu.push(map_cm_editMarker);var b=getNodeFromId(a.a);if(b.userloc){map_cm_clearMarker.data=a;xxmap.contextmenu.push(map_cm_clearMarker)}}map_cm_nodemenu_items.forEach(function(c){if(c.text=="Zoom-in to extent"||c.text=="Zoom-out to extent"){c.data=a}else{if(c!="-"){c.data=a.getId()}}});xxmap.contextmenu.extend(map_cm_nodemenu_items)}function getActiveInteractions(b){var a=b.getId();for(var c=0;c<xxmap.activeInteractions.length;c++){if(xxmap.activeInteractions[c].featureid==a){return xxmap.activeInteractions[c].interaction}}return false}function getModifiedFeature(a){if(a){for(var b=0;b<xxmap.activeInteractions.length;b++){if(xxmap.activeInteractions[b].featureid==a){return xxmap.activeInteractions[b].feature}}}return null}function removeInteraction(a){var c=-1;for(var b=0;b<xxmap.activeInteractions.length;b++){if(xxmap.activeInteractions[b].featureid===a){c=b;break}}if(c>=0){xxmap.activeInteractions.splice(c,1)}}function getCorrespondingFeature(e){var d=e.getGeometry().getCoordinates();for(var b=0;b<xxmap.activeInteractions.length;b++){var c=xxmap.activeInteractions[b].feature;var a=c.getGeometry().getCoordinates();if(a[0].toFixed(5)==d[0].toFixed(5)&&a[1].toFixed(5)==d[1].toFixed(5)){return c}}return null}function refreshMap(k,h){if(k){xxmap.map.setTarget(null);xxmap.map=null;xxmap.markersSource=null;xxmap.mapView=null;xxmap.mapLayer=null;xxmap.activeInteractions=[]}var a=updateMapMarkers();if((a!=null)&&(h||(a[4]==1))){var b=(a[0]+a[2])/2;var c=(a[1]+a[3])/2;var d=Math.max(Math.abs(a[0]-a[2]),Math.abs(a[1]-a[3]));var l=xxmap.map.getView();l.setCenter(ol.proj.transform([c,b],"EPSG:4326","EPSG:3857"));var e=360,g=-2;while(e>d){g++;e=e/2}l.setZoom(g)}}function placeNode(a){if(xxdialogMode){return}var c='<div style=margin-bottom:6px><label for=selectnode-search>Search</label>  <input type=text placeholder="Device name" id="selectnode-search" onchange=onPlaceNodeInputChange() onkeyup=onPlaceNodeInputChange() autocomplete=off style=width:120px></div><div id=placenode style="height:254px;overflow-y:auto;width:100%;margin:12px 1px 4px 1px;"><div id=noNodesMapPlace style=text-align:center;width:100%;display:none>No devices found.</div>';for(var b in nodes){c+="<div class=noselect id="+nodes[b]._id+"-rowid onclick=selectNodeToPlace(event,'"+nodes[b]._id+"') style=background-color:lightgray;margin-bottom:4px;border-radius:2px><input name=PlaceMapDeviceCheckbox id="+nodes[b]._id+"-checkid type=checkbox style=width:16px;display:inline />";c+="<div class=j"+nodes[b].icon+" style=width:16px;height:16px;margin-top:2px;margin-right:4px;display:inline-block></div><div style=width:16px;display:inline>"+nodes[b].name+"</div></div>"}setDialogMode(2,"Select a node to place",3,placeNodeEx,c+"</div>",a);onPlaceNodeInputChange()}function placeNodeEx(b,c){var d=document.getElementsByName("PlaceMapDeviceCheckbox");for(var g in d){if(d[g].checked){var h=getNodeFromId(d[g].id.substring(0,d[g].id.length-8));if(h){var e=xxmap.markersSource.getFeatureById(g);var j=ol.proj.transform(c,"EPSG:3857","EPSG:4326");var k=[j[1],j[0]];if(e){e.getGeometry().setCoordinates(c);var a=getActiveInteractions(e);if(a){saveMarkerloc(e)}else{meshserver.send({action:"changedevice",nodeid:h._id,userloc:k})}}else{meshserver.send({action:"changedevice",nodeid:h._id,userloc:k})}}}}}function onPlaceNodeInputChange(){updatePlaceNodeTable(Q("selectnode-search").value.trim().toLowerCase())}function updatePlaceNodeTable(d){var b=document.getElementsByName("PlaceMapDeviceCheckbox"),a=0;for(var c in nodes){var e=((nodes[c].namel.indexOf(d)>=0||d=="")||(nodes[c].rnamel!=null&&nodes[c].rnamel.indexOf(d)>=0));if(e){a++}QV(nodes[c]._id+"-rowid",e)}QV("noNodesMapPlace",a==0)}function selectNodeToPlace(b,g){if(b.target.name!="PlaceMapDeviceCheckbox"){var h=Q(g+"-checkid");h.checked=!h.checked}var c=document.getElementsByName("PlaceMapDeviceCheckbox"),a=0;for(var d in c){if(c[d].checked){a++}}QE("idx_dlgOkButton",a>0)}function addMeshOptions(a,b){}function meshOptionRmvMod(a,b){}function meshExists(){for(var a in meshes){if(meshes[a]){return true}}return false}function setMeshView(a){var c=Q("select-mesh");var b=c.selectedIndex;if(c[b].value==a){c[0].selected=true;onSelectMeshChange()}}function clearMeshOptions(){}function getSearchLocation(){try{var b=Q("mapSearchLocation").value.trim();if(b.length>0){var c=new XMLHttpRequest();c.onreadystatechange=function(){if(c.readyState==4&&c.status==200){formatSearchData(c.responseText)}};c.open("GET","https://nominatim.openstreetmap.org/search?q="+b+"&format=json",true);c.send()}}catch(a){}}function formatSearchData(b){try{QH("xmapSearchResults","");var c=JSON.parse(b),a=0,k='<div class="xmapItem">';for(var h=0;h<c.length;h++){if(c[h].display_name&&c[h].boundingbox[0]&&c[h].boundingbox[1]&&c[h].boundingbox[2]&&c[h].boundingbox[3]){a++;var j=(h%2==0)?"xmapItemSel1":"xmapItemSel1";k+='<div class="'+j+'" onclick=mapGotoSelectedLocation(this)><div>'+c[h].display_name+"</div><div style=display:none>"+c[h].boundingbox[0]+"!#!"+c[h].boundingbox[1]+"!#!"+c[h].boundingbox[2]+"!#!"+c[h].boundingbox[3]+"</div></div>"}}k+="</div>";if(a==1){var g=[parseFloat(c[0].boundingbox[2]),parseFloat(c[0].boundingbox[0]),parseFloat(c[0].boundingbox[3]),parseFloat(c[0].boundingbox[1])];zoomToExtent(g)}else{if(a==0){k="<div style=width:200px>No location found.<div>"}QV("xmapSearchResultsDlg",true)}QH("xmapSearchResults",k)}catch(d){}}function mapGotoSelectedLocation(c){var d=c.children;var a=d[1].innerHTML.split("!#!");var b=[parseFloat(a[2]),parseFloat(a[0]),parseFloat(a[3]),parseFloat(a[1])];zoomToExtent(b);mapCloseSearchWindow()}function mapCloseSearchWindow(){QH("xmapSearchResults","");QV("xmapSearchResultsDlg",false)}function zoomToLocation(a,c){var b=xxmap.map.getView();b.setCenter(a);b.setZoom(c)}function zoomToFitExtent(){var b=xxmap.markersSource.getFeatures();if(b.length>0){var a=xxmap.markersSource.getExtent();xxmap.map.getView().fit(a,xxmap.map.getSize())}}function zoomToExtent(b){var a=ol.proj.transformExtent(b,ol.proj.get("EPSG:4326"),ol.proj.get("EPSG:3857"));xxmap.map.getView().fit(a,xxmap.map.getSize())}function refreshDevice(a){if(!currentNode||currentNode._id!=a){return}gotoDevice(a,xxcurrentView,true)}function getNodeRights(c){var b=getNodeFromId(c),a=meshes[b.meshid];return a.links[userinfo._id].rights}var currentNode;var powerTimelineNode=null;var powerTimelineReq=null;var powerTimelineUpdate=null;var powerTimeline=null;function getCurrentNode(){return currentNode}function gotoDevice(t,v,A,k){if((userinfo.emailVerified!==true)&&(serverinfo.emailcheck==true)&&(userinfo.siteadmin!=4294967295)){setDialogMode(2,"Account Security",1,null,'Unable to access a device until a email address is verified. This is required for password recovery. Go to the "My Account" tab to change and verify an email address.');return}if((features&262144)&&!((userinfo.otpsecret==1)||(userinfo.otphkeys>0)||(userinfo.otpkeys>0))){setDialogMode(2,"Account Security",1,null,'Unable to access a device until two-factor authentication is enabled. This is required for extra security. Go to the "My Account" tab and look at the "Account Security" section.');return}if(k&&(k.shiftKey==true)){window.open(window.location.origin+"?node="+t.split("/")[2]+"&viewmode=10&hide=16","meshcentral:"+t);return}var s=getNodeFromId(t);var p=meshes[s.meshid];var q=p.links[userinfo._id].rights;if(!currentNode||currentNode._id!=s._id||A==true){currentNode=s;var r=EscapeHtml(s.name);if(r.length==0){r="<i>None</i>"}if(((q&4)!=0)&&((!p.flags)||((p.flags&2)==0))){r='<span tabindex=0 title="Click here to edit the server-side device name" onclick=showEditNodeValueDialog(0) onkeyup="if (event.key == \'Enter\') showEditNodeValueDialog(0)" style=cursor:pointer>'+r+' <img class=hoverButton src="images/link5.png" /></span>'}r+="<span style=color:#AAA;font-size:small> - "+EscapeHtml(p.name)+"</span>";QH("p10deviceName",r);QH("p11deviceName",r);QH("p12deviceName",r);QH("p13deviceName",r);QH("p14deviceName",r);QH("p15deviceName","Console - "+r);QH("p16deviceName",r);QH("p17deviceName",r);var E="<table style=width:100%>";E+=addDeviceAttribute('<span title="The name of the device group this computer belong to.">Group</span>','<a href=# title="The name of the device group this computer belong to" onclick=gotoMesh("'+s.meshid+'") style=cursor:pointer>'+EscapeHtml(meshes[s.meshid].name)+"</a>");if((s.rname!=null)&&(s.name!=s.rname)){E+=addDeviceAttribute('<span title="The name of this computer as set in the operating system">Name</span>','<span title="The name of this computer as set in the operating system">'+EscapeHtml(s.rname)+"</span>")}if((features&1)==0){if((q&4)!=0){if(s.host){E+=addDeviceAttribute("Hostname","<span onclick=showEditNodeValueDialog(1) style=cursor:pointer>"+EscapeHtml(s.host)+"</span>")}else{E+=addDeviceAttribute("Hostname","<span onclick=showEditNodeValueDialog(1) style=cursor:pointer><i>None</i></span>")}}else{E+=addDeviceAttribute("Hostname",EscapeHtml(s.host))}}var j=s.desc?EscapeHtml(s.desc):"<i>None</i>";if((q&4)!=0){E+=addDeviceAttribute("Description","<span onclick=showEditNodeValueDialog(2) style=cursor:pointer>"+j+' <img class=hoverButton src="images/link5.png" /></span>')}else{E+=addDeviceAttribute("Description",j)}var a=["Unknown","Windows 32bit console","Windows 64bit console","Windows 32bit service","Windows 64bit service","Linux 32bit","Linux 64bit","MIPS","XENx86","Android ARM","Linux ARM","MacOS 32bit","Android x86","PogoPlug ARM","Android APK","Linux Poky x86-32bit","MacOS 64bit","ChromeOS","Linux Poky x86-64bit","Linux NoKVM x86-32bit","Linux NoKVM x86-64bit","Windows MinCore console","Windows MinCore service","NodeJS","ARM-Linaro","ARMv6l / ARMv7l","ARMv8 64bit","ARMv6l / ARMv7l / NoKVM","Unknown","Unknown","FreeBSD x86-64"];if((s.agent!=null)&&(s.agent.id!=null)&&(s.agent.ver!=null)){var B="";if(s.agent.id<=a.length){B=a[s.agent.id]}else{B=a[0]}if(s.agent.ver!=0){B+=" v"+s.agent.ver}E+=addDeviceAttribute("Mesh Agent",B)}if(s.intelamt!=null){var B="";var z={0:"Not Activated (Pre)",1:"Not Activated (In)",2:"Activated"};if(s.intelamt.ver!=null&&s.intelamt.state==null){B+="<i>Unknown State</i>, v"+s.intelamt.ver}else{if((s.intelamt.ver==null)&&(s.intelamt.state==2)){B+="<i>Activated</i>"}else{if((s.intelamt.ver==null)||(s.intelamt.state==null)){B+="<i>Unknown Version & State</i>"}else{B+=z[s.intelamt.state];if((s.intelamt.state==2)&&s.intelamt.flags){if(s.intelamt.flags&2){B+=' <span title="Intel AMT is activated in Client Control Mode">CCM</span>'}else{if(s.intelamt.flags&4){B+=' <span title="Intel AMT is activated in Admin Control Mode">ACM</span>'}}}B+=(", v"+s.intelamt.ver)}}}if(s.intelamt.tls==1){B+=', <span title="Intel AMT is setup with TLS network security">TLS</span>'}if(s.intelamt.state==2){if(s.intelamt.user==null||s.intelamt.user==""){if((q&4)!=0){B+=', <i style=color:#FF0000;cursor:pointer title="Edit Intel® AMT credentials" onclick=editDeviceAmtSettings("'+s._id+'")>No Credentials</i>'}else{B+=", <i style=color:#FF0000>No Credentials</i>"}}B+=" ";if((q&4)!=0){B+='<img src=images/link4.png height=10 width=10 title="Edit Intel® AMT credentials" style=cursor:pointer onclick=editDeviceAmtSettings("'+s._id+'")>'}}var o='<span title="Intel® Manageability Engine">Intel® ME<span>';if(typeof s.intelamt.sku=="number"){if((s.intelamt.sku&8)!=0){o='<span title="Intel® Active Management Technology">Intel® AMT<span>'}else{if((s.intelamt.sku&16)!=0){o='<span title="Intel® Standard Manageability">Intel® SM<span>'}}}E+=addDeviceAttribute(o,B)}if(p.mtype==2){if((s.agent!=null)&&(s.agent.tag!=null)){var C=EscapeHtml(s.agent.tag);if(C.startsWith("mailto:")){C='<a href="'+C+'">'+C.substring(7)+"</a>"}E+=addDeviceAttribute("Agent Tag",C)}}else{if((s.intelamt!=null)&&(s.intelamt.tag!=null)){var C=EscapeHtml(s.intelamt.tag);if(C.startsWith("mailto:")){C='<a href="'+C+'">'+C.substring(7)+"</a>"}E+=addDeviceAttribute("Intel® AMT Tag",C)}}if(s.osdesc){E+=addDeviceAttribute("Operating System",s.osdesc)}if(s.av&&s.av.length>0){var F=[];for(var n in s.av){if(s.av[n].product){var d=EscapeHtml(s.av[n].product);if(s.av[n].enabled!==true){d+=" - <span style=color:red>Disabled</span>"}if(s.av[n].updated!==true){d+=" - <span style=color:red>Out of date</span>"}if((s.av[n].enabled==true)&&(s.av[n].updated==true)){d+=" - <span style=color:green>OK</span>"}F.push(d)}}E+=addDeviceAttribute("Antivirus",F.join("<br />"))}if(s.users&&s.conn&&(s.users.length>0)&&(s.conn&1)){E+=addDeviceAttribute("Active User"+((s.users.length>1)?"s":""),s.users.join(", "))}var e=s.conn;if(e&&e>1){var h=[];if((s.conn&1)!=0){h.push('<span title="Mesh agent is connected and ready for use.">Mesh Agent</span>')}if((s.conn&2)!=0){h.push('<span title="Intel® AMT CIRA is connected and ready for use.">Intel® AMT CIRA</span>')}else{if((s.conn&4)!=0){h.push('<span title="Intel® AMT is routable and ready for use.">Intel® AMT</span>')}}if((s.conn&8)!=0){h.push('<span title="Mesh agent is reachable using another agent as relay.">Mesh Relay</span>')}if((s.conn&16)!=0){h.push('<span title="MQTT connection to the device is active.">MQTT</span>')}E+=addDeviceAttribute("Connectivity",h.join(", "))}var m="<i>None</i>";if(s.tags!=null){m="";for(var n in s.tags){m+='<span class="tagSpan">'+s.tags[n]+"</span>"}}if((q&4)!=0){E+=addDeviceAttribute("Tags","<span onclick=showEditNodeValueDialog(3) style=cursor:pointer>"+m+' <img class=hoverButton src="images/link5.png" /></span>')}else{E+=addDeviceAttribute("Tags",m)}E+="</table><br />";if((q&76)!=0){E+='<input type=button value=Actions title="Perform power actions on the device" onclick=deviceActionFunction() />'}E+='<input type=button value=Notes title="View notes about this device" onclick=showNotes('+((q&128)==0)+',"'+encodeURIComponent(s._id)+'") />';QH("p10html",E);masterUpdate(256);E='<div class="p10html3right">';if((q&4)!=0){E+=' <a href=# onclick=p10showChangeGroupDialog(["'+s._id+'"]) title="Move this device to a different device group">Change Group</a>';E+=' <a href=# onclick=p10showDeleteNodeDialog("'+s._id+'") title="Remove this device">Delete Device</a>'}E+='</div><div class="p10html3left">';if(p.mtype==2){E+='<a href=# onclick=p10showNodeNetInfoDialog("'+s._id+'") title="Show device network interface information">Interfaces</a> '}if(xxmap!=null){E+='<a href=# onclick=p10showNodeLocationDialog("'+s._id+'") title="Show device locations information">Location</a> '}if(((q&8)!=0)&&(p.mtype==2)){E+='<a href=# onclick=p10showMeshCmdDialog(1,"'+s._id+'") title="Traffic router used to connect to a device thru this server.">Router</a> '}if(((e&1)!=0)&&(clickOnce==true)&&(p.mtype==2)&&((q&8)!=0)){if((s.agent.id>0)&&(s.agent.id<5)){E+='<a href=# onclick=p10clickOnce("'+s._id+'","RDP2",3389) title="Requires Microsoft ClickOnce support in your browser.">RDP</a> '}if(s.agent.id>4){E+='<a href=# onclick=p10clickOnce("'+s._id+'","PSSH",22) title="Requires Microsoft ClickOnce support in your browser.">Putty</a> ';E+='<a href=# onclick=p10clickOnce("'+s._id+'","WSCP",22) title="Requires Microsoft ClickOnce support in your browser.">WinSCP</a> '}}if((q==4294967295)&&(features&4194304)){E+='<a href=# onclick=p10showMqttLoginDialog("'+s._id+'") title="Get MQTT login credentials for this device.">MQTT Login</a> '}E+="</div><br>";QH("p10html3",E);var w=PowerStateStr(s.state);if((e&1)!=0){if(w.length>0){w+="<br/>"}w+='<span style=font-size:12px title="Agent connected">Agent connected</span>'}if((e&2)!=0){if(w.length>0){w+="<br/>"}w+='<span style=font-size:12px title="Intel® AMT connected">Intel® AMT connected</span>'}else{if((e&4)!=0){if(w.length>0){w+="<br/>"}w+='<span style=font-size:12px title="Intel® AMT detected">Intel® AMT detected</span>'}}if((e&16)!=0){if(w.length>0){w+="<br/>"}w+='<span style=font-size:12px title="MQTT connected">MQTT channel connected</span>'}if((w=="")&&s.lastconnect){w="<span style=font-size:12px>Last seen:<br />"+printDateTime(new Date(s.lastconnect))+"</span>"}QH("MainComputerState",w);Q("MainComputerImage").setAttribute("src","images/icons256-"+s.icon+"-1.png");Q("MainComputerImage").className=((!s.conn)||(s.conn==0)?"gray":"");var D=((q==4294967295)||((q&512)==0));var l=((q==4294967295)||((q&1024)==0));var b=((q==4294967295)||((q&2048)==0));if(D){setupTerminal()}if(l){setupFiles()}var g=((q&16)!=0);if(g){setupConsole()}else{if(v==15){v=10}}QV("MainDevDesktop",(((p.mtype==1)&&((typeof s.intelamt.sku!=="number")||((s.intelamt.sku&8)!=0)))||((p.mtype==2)&&((s.agent==null)||(s.agent.caps==null)||((s.agent.caps&1)!=0)||(s.intelamt&&(s.intelamt.state==2)))))&&((q&8)||(q&256)));QV("MainDevTerminal",((p.mtype==1)||(s.agent==null)||(s.agent.caps==null)||((s.agent.caps&2)!=0)||(s.intelamt&&(s.intelamt.state==2)))&&(q&8)&&D);QV("MainDevFiles",((p.mtype==2)&&((s.agent==null)||(s.agent.caps==null)||((s.agent.caps&4)!=0)))&&(q&8)&&l);QV("MainDevAmt",(s.intelamt!=null)&&((s.intelamt.state==2)||(s.conn&2))&&(q&8)&&b);QV("MainDevConsole",(g&&(p.mtype==2)&&((s.agent==null)||(s.agent.caps==null)||((s.agent.caps&8)!=0)))&&(q&8));QV("p15uploadCore",(s.agent!=null)&&(s.agent.caps!=null)&&((s.agent.caps&16)!=0));QH("p15coreName",((s.agent!=null)&&(s.agent.core!=null))?s.agent.core:"");var c=Q("p14iframe").contentWindow.getCurrentMeshNode();if((c!=null)&&(c._id!=currentNode._id)){Q("p14iframe").contentWindow.disconnect()}var u=((s.conn&6)!=0)?true:false;Q("p14iframe").contentWindow.setConnectionState(u);Q("p14iframe").contentWindow.setFrameHeight("650px");Q("p14iframe").contentWindow.setAuthCallback(updateAmtCredentials);QV("deskActionsBtn",(q&72)!=0);QV("termActionsBtn",(q&72)!=0);QV("filesActionsBtn",(q&72)!=0);if((powerTimelineNode!=currentNode._id)&&(powerTimelineReq!=currentNode._id)){QH("p10html2","");powerTimelineReq=currentNode._id;meshserver.send({action:"powertimeline",nodeid:currentNode._id});meshserver.send({action:"lastconnect",nodeid:currentNode._id});meshserver.send({action:"getsysinfo",nodeid:currentNode._id});QH("p17info","")}QV("DeskTools",false);showDeskToolsProcesses();refreshDeviceEvents();if((currentNode)&&(xxcurrentView>=10)&&(xxcurrentView<20)){document.title=decodeURIComponent("{{{extitle}}}")+" - "+currentNode.name+" - "+p.name}else{document.title=decodeURIComponent("{{{extitle}}}")}p11clearConsoleMsg();p12clearConsoleMsg();p13clearConsoleMsg()}setupDesktop();if(!v){v=10}go(v)}function showNotes(b,a){if(xxdialogMode){return}setDialogMode(2,"Notes",2,showNotesEx,"<textarea id=d2devNotes ro="+b+" noteid="+a+" readonly style=background-color:#fcf3cf;width:100%;height:200px;resize:none;overflow-y:scroll></textarea><span style=font-size:10px>Device group notes can be viewed and changed by other device group administrators.<span>",a);meshserver.send({action:"getNotes",id:decodeURIComponent(a)})}function showNotesEx(a,b){meshserver.send({action:"setNotes",id:decodeURIComponent(b),notes:encodeURIComponent(Q("d2devNotes").value)})}function deviceChat(){if(xxdialogMode){return}var a="/messenger?id=meshmessenger/"+encodeURIComponent(currentNode._id)+"/"+encodeURIComponent(userinfo._id)+"&title="+currentNode.name;if((authCookie!=null)&&(authCookie!="")){a+="&auth="+authCookie}window.open(a,"meshmessenger:"+currentNode._id);meshserver.send({action:"meshmessenger",nodeid:decodeURIComponent(currentNode._id)})}function deviceUrlFunction(){if(xxdialogMode){return}setDialogMode(2,"Open Page on Device",3,deviceUrlFunctionEx,'<input id=d2devurl placeholder="http://server.com" style=width:100%;overflow-y:scroll></input>');Q("d2devurl").focus()}function deviceUrlFunctionEx(){meshserver.send({action:"msg",type:"openUrl",nodeid:currentNode._id,url:Q("d2devurl").value})}function deviceToastFunction(){if(xxdialogMode){return}setDialogMode(2,"Device Notification",3,deviceToastFunctionEx,"<textarea id=d2devToast style=width:100%;height:80px;resize:none;overflow-y:scroll></textarea>");Q("d2devToast").focus()}function deviceToastFunctionEx(){meshserver.send({action:"toast",nodeids:[currentNode._id],title:"MeshCentral",msg:Q("d2devToast").value})}function deviceActionFunction(){if(xxdialogMode){return}var a=meshes[currentNode.meshid].links[userinfo._id].rights;var b="Select an operation to perform on this device.<br /><br />";var c="<select id=d2deviceop style=float:right;width:250px>";if((a&64)!=0){c+="<option value=100>Wake-up</option>"}if((a&8)!=0){c+="<option value=4>Sleep</option><option value=3>Reset</option><option value=2>Power off</option>"}if((currentNode.conn&16)!=0){c+="<option value=103>Send MQTT Message</option>"}c+="</select>";b+=addHtmlValue("Operation",c);setDialogMode(2,"Device Action",3,deviceActionFunctionEx,b)}function deviceActionFunctionEx(){var a=Q("d2deviceop").value;if(a==100){meshserver.send({action:"wakedevices",nodeids:[currentNode._id]})}else{if(a==103){p10showSendMqttMsgDialog([currentNode._id])}else{meshserver.send({action:"poweraction",nodeids:[currentNode._id],actiontype:parseInt(a)})}}}function updateAmtCredentials(a){var b=getNodeFromId(currentNode._id);if((a==true)||(b.intelamt.user==null)||(b.intelamt.user=="")){editDeviceAmtSettings(currentNode._id,updateAmtCredentialsEx)}else{Q("p14iframe").contentWindow.connectButtonfunctionEx()}}function updateAmtCredentialsEx(a,b){Q("p14iframe").contentWindow.connectButtonfunctionEx()}function updateDeviceTimeline(){if((meshserver.State!=2)||(powerTimelineNode==null)||(powerTimelineUpdate==null)||(currentNode==null)){return}if((powerTimelineNode==powerTimelineReq)&&(currentNode._id==powerTimelineNode)&&(powerTimelineUpdate<Date.now())){powerTimelineUpdate=null;meshserver.send({action:"powertimeline",nodeid:currentNode._id});meshserver.send({action:"lastconnect",nodeid:currentNode._id})}}function drawDeviceTimeline(){if((currentNode==null)||(xxcurrentView<10)||(xxcurrentView>19)){return}var s=null,o=Date.now();if(currentNode._id==powerTimelineNode){s=powerTimeline}var e=new Date();e.setHours(0,0,0,0);e=new Date(e.getTime()-(1000*60*60*24*6));var u=e.getTime();var t=[];if(s!=null&&s.length>1){t.push([0,s[1],s[0]]);var c=s[1];for(var m=2;m<s.length;m+=2){var p=s[m],k=o;if(s.length>(m+1)){k=s[m+1]}t.push([c,c+k,p]);c=c+k}}var A="",b=1,h=new Date();var w=Q("masthead").offsetWidth-(160+9+9+14);h.setHours(0,0,0,0);for(var m=0;m<7;m++){var g="",q=h.getTime(),l=q+(1000*60*60*24);for(var n in t){var a=t[n];if(isTimeBlockInside(q,l,a[0],a[1])==true){var y=Math.max(q,a[0]);var r=Math.min(Math.min(l,a[1]),o);var z=Math.round(((r-y)*w)/86400000);if(z>0){var v=powerStateStrings2[a[2]]+" from "+printTime(new Date(y))+" to "+printTime(new Date(r))+".";g+='<div class="pwState '+powerColor(a[2])+'" title="'+v+'" style="width:'+z+'px;"></div>'}}}A+="<tr class="+(((b%2)==0)?"altBack":"")+"><td><div> "+printDate(h)+"<div></div></div></td><td><div>"+g+"</div></td></tr>";++b;h=new Date(h.getTime()-(1000*60*60*24))}QH("p10html2",'<table cellpadding=2 cellspacing=0><thead><tr style=><th scope=col style=text-align:center;width:150px>Day</th><th scope=col style=text-align:center><a download href="devicepowerevents.ashx?id='+currentNode._id+'" onclick="setDialogMode(0)"><img title="Download power events" src="images/link4.png" /></a>7 Day Power State</th></tr></thead><tbody>'+A+"</tbody></table>")}function powerColor(a){if(a<powerColorTable.length){return powerColorTable[a]}return"pwsYellow"}function isTimeBlockInside(d,c,b,a){if((b<d)&&(a>c)){return true}if((b>d)&&(b<c)){return true}if((a>d)&&(a<c)){return true}return false}function addDeviceAttribute(a,b){return"<tr><td class=style7>"+a+"</td><td class=style9>"+b+"</td></tr>"}function editDeviceAmtSettings(g,c,a){if(xxdialogMode){return}var h="",e=getNodeFromId(g),b=3,d=getNodeRights(g);if((d&4)==0){return}h+=addHtmlValue("Username",'<input id=dp10username style=width:230px maxlength=32 autocomplete=nope placeholder="admin" onchange=validateDeviceAmtSettings() onkeyup=validateDeviceAmtSettings() />');h+=addHtmlValue("Password","<input id=dp10password type=password style=width:230px autocomplete=nope maxlength=32 onchange=validateDeviceAmtSettings() onkeyup=validateDeviceAmtSettings() />");h+=addHtmlValue("Security","<select id=dp10tls style=width:236px><option value=0>No TLS security</option><option value=1>TLS security required</option></select>");if((e.intelamt.user!=null)&&(e.intelamt.user!="")){b=7}setDialogMode(2,"Edit Intel® AMT credentials",b,editDeviceAmtSettingsEx,h,{node:e,func:c,arg:a});if((e.intelamt.user!=null)&&(e.intelamt.user!="")){Q("dp10username").value=e.intelamt.user}else{Q("dp10username").value="admin"}Q("dp10tls").value=e.intelamt.tls;validateDeviceAmtSettings()}function validateDeviceAmtSettings(){QE("idx_dlgOkButton",passwordcheck(Q("dp10password").value))}function editDeviceAmtSettingsEx(c,d){if(c==2){meshserver.send({action:"changedevice",nodeid:d.node._id,intelamt:{user:"",pass:""}})}else{var b=Q("dp10username").value;if(b==""){b="admin"}var a=Q("dp10password").value;if(a==""){b=""}meshserver.send({action:"changedevice",nodeid:d.node._id,intelamt:{user:b,pass:a,tls:Q("dp10tls").value}});d.node.intelamt.user=b;d.node.intelamt.tls=Q("dp10tls").value;if(d.func){setTimeout(function(){d.func(null,d.arg)},300)}}}function p10showSendMqttMsgDialog(a){if(xxdialogMode){return false}var b=addHtmlValue("Topic","<input id=dp2topic style=width:230px maxlength=64 onchange=p10validateSendMqttMsgDialog() onkeyup=p10validateSendMqttMsgDialog(event,1) />");b+=addHtmlValue("Message","<div style=width:230px;margin:0;padding:0><textarea id=dp2msg maxlength=4096 style=width:100%;height:150px;resize:none onchange=p10validateSendMqttMsgDialog() onkeyup=p10validateSendMqttMsgDialog(event,1)></textarea></div>");setDialogMode(2,"Send MQTT message",3,p10showSendMqttMsgDialogEx,b,a);p10validateSendMqttMsgDialog();Q("dp2topic").focus();return false}function p10validateSendMqttMsgDialog(){QE("idx_dlgOkButton",(Q("dp2topic").value.length>0)&&(Q("dp2msg").value.length>0))}function p10showSendMqttMsgDialogEx(a,c){meshserver.send({action:"sendmqttmsg",nodeids:c,topic:Q("dp2topic").value,msg:Q("dp2msg").value})}function p10showChangeGroupDialog(e){if(xxdialogMode){return false}var g=null;if(e.length==1){try{g=meshes[getNodeFromId(e[0])]._id}catch(b){}}var j="<select id=p10newGroup style=width:236px>",a=0;for(var c in meshes){var d=meshes[c].links[userinfo._id].rights;if((meshes[c]._id!=g)&&(d&4)){a++;j+="<option value='"+meshes[c]._id+"'>"+meshes[c].name+"</option>"}}j+="</select>";if(a>0){var h=(e.length==1)?"Select a new group for this device<br /><br />":"Select a new group for selected devices<br /><br />";h+=addHtmlValue("New Device Group",j);setDialogMode(2,"Change Group",3,p10showChangeGroupDialogEx,h,e)}else{setDialogMode(2,"Change Group",1,null,"No other device group of same type exists.")}return false}function p10showChangeGroupDialogEx(a,c){meshserver.send({action:"changeDeviceMesh",nodeids:c,meshid:Q("p10newGroup").value})}function p10showDeleteNodeDialog(a){if(xxdialogMode){return false}var b='Are you sure you want to delete node "'+EscapeHtml(currentNode.name)+'"?<br /><br />';b+="<label><input id=p10check type=checkbox onchange=p10validateDeleteNodeDialog() />Confirm</label>";setDialogMode(2,"Delete Node",3,p10showDeleteNodeDialogEx,b,a);p10validateDeleteNodeDialog();return false}function p10validateDeleteNodeDialog(){QE("idx_dlgOkButton",Q("p10check").checked)}function p10showDeleteNodeDialogEx(a,b){meshserver.send({action:"removedevices",nodeids:[b]})}function p10clickOnce(a,c,b){meshserver.send({action:"getcookie",nodeid:a,tcpport:b,tag:"clickonce",protocol:c});return false}var d2map=null;function p10showNodeLocationDialog(){if((xxdialogMode!=null)&&(xxdialogTag=="@xxmap")){setDialogMode(0)}else{if(xxdialogMode){return false}}var m=[],n=["iploc","wifiloc","gpsloc","userloc"],a=null;for(var k in n){if(currentNode[n[k]]!=null){var j=currentNode[n[k]].split(","),h=parseFloat(j[0]),l=parseFloat(j[1]);if((h<90)&&(h>-90)&&(l<180)&&(l>-180)){var e=new ol.Feature({geometry:new ol.geom.Point(ol.proj.fromLonLat([l,h]))});e.setStyle(markerStyle(currentNode,parseInt(k)+1));m.push(e);if(a==null){a=[h,l,h,l,0]}else{if(h<a[0]){a[0]=h}if(l<a[1]){a[1]=l}if(h>a[2]){a[2]=h}if(l>a[3]){a[3]=l}}}}}var p=new ol.source.Vector({features:m});var o=new ol.layer.Vector({source:p});var q="<div id=d2map style=width:100%;height:300px></div>";setDialogMode(2,"Device Location",1,null,q,"@xxmap");var c=0,b=0,r=8;if(a!=null){var b=(a[0]+a[2])/2;var c=(a[1]+a[3])/2;var d=Math.max(Math.abs(a[0]-a[2]),Math.abs(a[1]-a[3]));var g=360,r=-2;while(g>d){r++;g=g/2}}if(m.length==1){r=8}d2map=new ol.Map({target:"d2map",interactions:ol.interaction.defaults({dragPan:false,mouseWheelZoom:false}),layers:[new ol.layer.Tile({source:new ol.source.OSM()}),o],view:new ol.View({center:ol.proj.fromLonLat([c,b]),zoom:r})});return false}function p10showNodeNetInfoDialog(){if(xxdialogMode){return false}setDialogMode(2,"Network Interfaces",1,null,"<div id=d2netinfo>Loading...</div>","if"+currentNode._id);meshserver.send({action:"getnetworkinfo",nodeid:currentNode._id});return false}function p10showMeshRouterDialog(){if(xxdialogMode){return}var a="<div>MeshCentral Router is a Windows tool for TCP port mapping. You can, for example, RDP into a remote device thru this server.</div><br />";a+=addHtmlValue("Win32 Executable",'<a style=cursor:pointer download href="meshagents?meshaction=winrouter" onclick="setDialogMode(0)">MeshCentralRouter.exe</a>');setDialogMode(2,"MeshCentral Router",1,null,a,"fileDownload")}function p10showMqttLoginDialog(a){meshserver.send({action:"getmqttlogin",nodeid:a})}function p10showMeshCmdDialog(a,b){if(xxdialogMode){return}var d="<select id=aginsSelect onclick=meshCmdOsClick() style=width:236px>";d+="<option value=3>Windows (32bit)</option>";d+="<option value=4>Windows (64bit)</option>";d+="<option value=5>Linux x86 (32bit)</option>";d+="<option value=6>Linux x86 (64bit)</option>";d+="<option value=16>MacOS (64bit)</option>";d+="<option value=25>Linux ARM, Raspberry Pi (32bit)</option>";d+="</select>";var c="";if(a==0){c+="<div>MeshCmd is a command line tool that performs lots of different operations. The action file can optionally be downloaded and edited to provide server information and credentials.<br /><br />"}if(a==1){c+='<div>Download "meshcmd" with an action file to route traffic thru this server to this device. Make sure to edit meshaction.txt and add your account password or make any changes needed.<br /><br />'}c+=addHtmlValue("Operating System",d);c+=addHtmlValue("MeshCmd",'<a id=meshcmddownloadid href="meshagents?meshcmd=3" download></a>');if(a==0){c+=addHtmlValue("Action File",'<a href="meshagents?meshaction=generic" download>MeshAction (.txt)</a>')}if(a==1){c+=addHtmlValue("Action File",'<a href="meshagents?meshaction=route&nodeid='+b+'" download>MeshAction (.txt)</a>')}c+="</div>";setDialogMode(2,["Download MeshCmd","Network Router"][a],9,null,c,"fileDownload");meshCmdOsClick()}function meshCmdOsClick(){var a=Q("aginsSelect").value,b="",c="";if(a==3){b="MeshCmd (Win32 executable)"}if(a==4){b="MeshCmd (Win64 executable)"}if(a==5){b="MeshCmd (Linux x86, 32bit)"}if(a==6){b="MeshCmd (Linux x86, 64bit)"}if(a==16){b="MeshCmd (MacOS, 64bit)"}if(a==25){b="MeshCmd (Linux ARM, 32bit)"}QH("meshcmddownloadid",b);Q("meshcmddownloadid").setAttribute("href","meshagents?meshcmd="+a)}function p10showiconselector(){if(xxdialogMode){return}var a=meshes[currentNode.meshid];var b=a.links[userinfo._id].rights;if((b&4)==0){return}var c="<br><div style=display:inline-block;width:40px></div>";c+="<div tabindex=0 style=display:inline-block class=i1 onclick=p10setIcon(1) onkeypress=\"if (event.key=='Enter') p10setIcon(1)\"></div>";c+="<div tabindex=0 style=display:inline-block class=i2 onclick=p10setIcon(2) onkeypress=\"if (event.key=='Enter') p10setIcon(2)\"></div>";c+="<div tabindex=0 style=display:inline-block class=i3 onclick=p10setIcon(3) onkeypress=\"if (event.key=='Enter') p10setIcon(3)\"></div>";c+="<div tabindex=0 style=display:inline-block class=i4 onclick=p10setIcon(4) onkeypress=\"if (event.key=='Enter') p10setIcon(4)\"></div>";c+="<div tabindex=0 style=display:inline-block class=i5 onclick=p10setIcon(5) onkeypress=\"if (event.key=='Enter') p10setIcon(5)\"></div>";c+="<div tabindex=0 style=display:inline-block class=i6 onclick=p10setIcon(6) onkeypress=\"if (event.key=='Enter') p10setIcon(6)\"></div><br><br>";setDialogMode(2,"Icon Selection",0,null,c);QV("id_dialogclose",true)}function p10setIcon(a){setDialogMode(0);meshserver.send({action:"changedevice",nodeid:currentNode._id,icon:a})}var showEditNodeValueDialog_modes=["Device Name","Hostname","Description","Tags"];var showEditNodeValueDialog_modes2=["name","host","desc","tags"];var showEditNodeValueDialog_modes3=["","","","Tag1, Tag2, Tag3"];function showEditNodeValueDialog(a){if(xxdialogMode){return}var c=addHtmlValue(showEditNodeValueDialog_modes[a],'<input id=dp10devicevalue maxlength=64 placeholder="'+showEditNodeValueDialog_modes3[a]+'" onchange=p10editdevicevalueValidate('+a+",event) onkeyup=p10editdevicevalueValidate("+a+",event) />");setDialogMode(2,"Edit Device",3,showEditNodeValueDialogEx,c,a);var b=currentNode[showEditNodeValueDialog_modes2[a]];if(b==null){b=""}if(Array.isArray(b)){b=b.join(", ")}Q("dp10devicevalue").value=b;p10editdevicevalueValidate();Q("dp10devicevalue").focus()}function showEditNodeValueDialogEx(a,b){var c={action:"changedevice",nodeid:currentNode._id};c[showEditNodeValueDialog_modes2[b]]=Q("dp10devicevalue").value;meshserver.send(c)}function p10editdevicevalueValidate(b,a){var c=((b>1)||(Q("dp10devicevalue").value.length>0));QE("idx_dlgOkButton",c);if((a!=null)&&(c==true)&&(a.keyCode==13)){dialogclose(1)}}var desktopNode;function setupDesktop(){if((desktopNode!=currentNode)&&(desktop!=null)){desktop.Stop();desktopNode=null;desktop=null}if((desktopNode!=currentNode)||(desktop==null)){var b=multiDesktop[currentNode._id];if(b!=null){QH("DeskParent","");var a=b.m.CanvasId;a.setAttribute("id","Desk");a.setAttribute("onmousedown","dmousedown(event)");a.setAttribute("onmouseup","dmouseup(event)");a.setAttribute("onmousemove","dmousemove(event)");a.removeAttribute("onclick");Q("DeskParent").appendChild(a);desktop=b;if(desktop.m.SendCompressionLevel){desktop.m.SendCompressionLevel(1,desktopsettings.quality,desktopsettings.scaling,desktopsettings.framerate)}desktop.onStateChanged=onDesktopStateChange;desktopNode=currentNode;onDesktopStateChange(desktop,desktop.State);delete multiDesktop[currentNode._id]}else{QH("DeskParent",'<canvas id=Desk oncontextmenu="return false" onmousedown=dmousedown(event) onmouseup=dmouseup(event) onmousemove=dmousemove(event)></canvas>');desktopNode=currentNode}Q("Desk").addEventListener("DOMMouseScroll",function(c){return dmousewheel(c)});Q("Desk").addEventListener("mousewheel",function(c){return dmousewheel(c)})}desktopNode=currentNode;updateDesktopButtons();deskAdjust();if(!Q("Desk")["toBlob"]){QV("deskSaveBtn",false)}}function updateDesktopButtons(){var d=meshes[currentNode.meshid];var a=0;if(desktop!=null){a=desktop.State}var e=d.links[userinfo._id].rights;QV("disconnectbutton1span",(a!=0));QV("connectbutton1span",(a==0)&&((e&8)||(e&256))&&(d.mtype==2)&&(currentNode.agent.caps&1));QV("connectbutton1hspan",(a==0)&&(e&8)&&((d.mtype==1)||((currentNode.intelamt!=null)&&(currentNode.intelamt.state==2)&&(currentNode.intelamt.ver!=null)&&(typeof currentNode.intelamt.sku=="number")&&((currentNode.intelamt.sku&8)!=0))));QV("d7amtkvm",(currentNode.intelamt!=null&&((currentNode.intelamt.ver!=null)||(d.mtype==1)))&&((a==0)||(desktop.contype==2)));QV("d7meshkvm",(webRtcDesktop)||((d.mtype==2)&&(currentNode.agent.caps&1)&&((a==false)||(desktop.contype==1))));var c=(e==4294967295)||(((e&8)!=0)&&((e&256)==0)&&((e&4096)==0));var g=((currentNode.conn&1)!=0);QE("connectbutton1",g);var b=((currentNode.conn&6)!=0);QE("connectbutton1h",b);QE("deskSaveBtn",a==3);QV("deskFocusBtn",(desktop!=null)&&(desktop.contype==2)&&(a!=0)&&(desktopsettings.showfocus));QV("DeskClip",(currentNode.agent)&&(currentNode.agent.id!=11)&&(currentNode.agent.id!=16)&&((desktop==null)||(desktop.contype!=2)));QE("DeskClip",a==3);QE("DeskType",a==3);QV("DeskWD",c);QE("DeskWD",a==3);QV("deskkeys",c);QE("deskkeys",a==3);QV("DeskToolsButton",(c)&&(d.mtype==2)&&g);QV("DeskChatButton",(browserfullscreen==false)&&(c)&&(d.mtype==2)&&g);QV("DeskNotifyButton",(browserfullscreen==false)&&(currentNode.agent)&&(currentNode.agent.id<5)&&(c)&&(d.mtype==2)&&g);QV("DeskOpenWebButton",(browserfullscreen==false)&&(c)&&(d.mtype==2)&&g);QV("DeskControlSpan",c);QV("deskActionsBtn",(browserfullscreen==false));QV("deskActionsSettings",(browserfullscreen==false));if(e&8){Q("DeskControl").checked=(getstore("DeskControl",1)==1)}else{Q("DeskControl").checked=false}if(g==false){QV("DeskTools",false)}}var autoConnectDesktopTimer=null;function autoConnectDesktop(a){if(autoConnectDesktopTimer==null){autoConnectDesktopTimer=setInterval(connectDesktop,100)}else{clearInterval(autoConnectDesktopTimer);autoConnectDesktopTimer=null}}function connectDesktop(b,a){p11clearConsoleMsg();if(desktop==null){desktopNode=currentNode;if(a==2){if((desktopNode.intelamt.user==null)||(desktopNode.intelamt.user=="")){editDeviceAmtSettings(desktopNode._id,connectDesktop,2);return}desktop=CreateAmtRedirect(CreateAmtRemoteDesktop("Desk"),authCookie);desktop.debugmode=debugmode;desktop.onStateChanged=onDesktopStateChange;desktop.m.bpp=(desktopsettings.encoding==1||desktopsettings.encoding==3)?1:2;desktop.m.useZRLE=(desktopsettings.encoding<3);desktop.m.localKeyMap=desktopsettings.localkeymap;desktop.m.showmouse=desktopsettings.showmouse;desktop.m.onScreenSizeChange=deskAdjust;desktop.m.onKvmData=function(h){if(h.length==0){if(!desktop.m._sentPresence){desktop.m._sentPresence=true;desktop.m.sendKvmData(JSON.stringify({action:"present",ver:1}))}return}var d=null;try{d=JSON.parse(h)}catch(g){}if((d!=null)&&(d.action!=null)){if(d.action=="restart"){webRtcDesktopReset();desktop.m.sendKvmData(JSON.stringify({action:"present",ver:1}))}else{if((d.action=="present")&&(webRtcDesktop==null)){webRtcDesktop={platform:d.platform};var c=null;if(typeof RTCPeerConnection!=="undefined"){webRtcDesktop.webrtc=new RTCPeerConnection(c)}else{if(typeof webkitRTCPeerConnection!=="undefined"){webRtcDesktop.webrtc=new webkitRTCPeerConnection(c)}}webRtcDesktop.webchannel=webRtcDesktop.webrtc.createDataChannel("DataChannel",{});webRtcDesktop.webchannel.onopen=function(){console.log("WebRTC Data Channel Open");Q("deskstatus").textContent=StatusStrs[desktop.State]+", Soft-KVM";desktop.m.hold(true);webRtcDesktop.webRtcActive=true;webRtcDesktop.softdesktop=CreateKvmDataChannel(webRtcDesktop.webchannel,CreateAgentRemoteDesktop("Desk",Q("id_mainarea")),desktop.m);webRtcDesktop.softdesktop.m.setRotation(desktop.m.rotation);webRtcDesktop.softdesktop.m.onScreenSizeChange=deskAdjust;if(desktopsettings.quality){webRtcDesktop.softdesktop.m.CompressionLevel=desktopsettings.quality}if(desktopsettings.scaling){webRtcDesktop.softdesktop.m.ScalingLevel=desktopsettings.scaling}webRtcDesktop.softdesktop.Start()};webRtcDesktop.webchannel.onclose=function(e){console.log("WebRTC Data Channel Closed");webRtcDesktopReset()};webRtcDesktop.webrtc.onicecandidate=function(j){if(j.candidate==null){desktop.m.sendKvmData(JSON.stringify({action:"offer",ver:1,sdp:webRtcDesktop.webrtcoffer.sdp}))}else{webRtcDesktop.webrtcoffer.sdp+=("a="+j.candidate.candidate+"\r\n")}};webRtcDesktop.webrtc.oniceconnectionstatechange=function(){if((webRtcDesktop!=null)&&(webRtcDesktop.webrtc!=null)&&((webRtcDesktop.webrtc.iceConnectionState=="disconnected")||(webRtcDesktop.webrtc.iceConnectionState=="failed"))){webRtcDesktopReset()}};webRtcDesktop.webrtc.createOffer(function(e){webRtcDesktop.webrtcoffer=e;webRtcDesktop.webrtc.setLocalDescription(e,function(){},webRtcDesktopReset)},webRtcDesktopReset,{mandatory:{OfferToReceiveAudio:false,OfferToReceiveVideo:false}})}else{if((d.action=="answer")&&(webRtcDesktop!=null)){webRtcDesktop.webrtc.setRemoteDescription(new RTCSessionDescription({type:"answer",sdp:d.sdp}),function(){},webRtcDesktopReset)}}}}};desktop.Start(desktopNode._id,16994,"*","*",0);desktop.contype=2}else{desktop=CreateAgentRedirect(meshserver,CreateAgentRemoteDesktop("Desk"),serverPublicNamePort,authCookie,domainUrl);desktop.debugmode=debugmode;desktop.m.debugmode=debugmode;desktop.attemptWebRTC=attemptWebRTC;desktop.onStateChanged=onDesktopStateChange;desktop.onConsoleMessageChange=function(){p11clearConsoleMsg();if(desktop.consoleMessage){QH("p11DeskConsoleMsg",EscapeHtml(desktop.consoleMessage).split("\n").join("<br />"));QV("p11DeskConsoleMsg",true);p11DeskConsoleMsgTimer=setTimeout(p11clearConsoleMsg,8000)}};desktop.m.CompressionLevel=desktopsettings.quality;desktop.m.ScalingLevel=desktopsettings.scaling;desktop.m.FrameRateTimer=desktopsettings.framerate;desktop.m.onDisplayinfo=deskDisplayInfo;desktop.m.onScreenSizeChange=deskAdjust;desktop.Start(desktopNode._id);desktop.contype=1}}else{desktop.Stop();webRtcDesktopReset();desktopNode=desktop=null}}function p11clearConsoleMsg(){QV("p11DeskConsoleMsg",false);if(p11DeskConsoleMsgTimer){clearTimeout(p11DeskConsoleMsgTimer);p11DeskConsoleMsgTimer=null}}function p12clearConsoleMsg(){QV("p12TermConsoleMsg",false);if(p12TermConsoleMsgTimer){clearTimeout(p12TermConsoleMsgTimer);p12TermConsoleMsgTimer=null}}function p13clearConsoleMsg(){QV("p13FilesConsoleMsg",false);if(p13FilesConsoleMsgTimer){clearTimeout(p13FilesConsoleMsgTimer);p13FilesConsoleMsgTimer=null}}var webRtcDesktop=null;function webRtcDesktopReset(){if(webRtcDesktop==null){return}if(webRtcDesktop.softdesktop!=null){webRtcDesktop.softdesktop.Stop();webRtcDesktop.softdesktop=null}if(webRtcDesktop.webchannel!=null){try{webRtcDesktop.webchannel.close()}catch(a){}webRtcDesktop.webchannel=null}if(webRtcDesktop.webrtc!=null){try{webRtcDesktop.webrtc.close()}catch(a){}webRtcDesktop.webrtc=null}webRtcDesktop=null;if(desktop&&desktop.m){desktop.m.hold(false);Q("deskstatus").textContent=StatusStrs[desktop.State]}}function onDesktopStateChange(c,a){var d=a;if((d==3)&&(c.contype==2)){d++}var b=StatusStrs[d];if((desktop!=null)&&(desktop.webRtcActive==true)){b+=", WebRTC"}QH("deskstatus",b);switch(a){case 0:desktop.Stop();desktopNode=desktop=null;QV("DeskFocus",false);QV("termdisplays",false);QV("deskRecordIcon",false);deskFocusBtn.value="All Focus";if(fullscreen==true){deskToggleFull()}webRtcDesktopReset();deskPreferedStickyDisplay=0;break;case 2:break;case 3:if(desktop&&(desktop.serverIsRecording==true)){QV("deskRecordIcon",true)}desktop.startTime=new Date();if(updateSessionTimer==null){updateSessionTimer=setInterval(updateSessionTime,1000)}break;default:break}updateDesktopButtons();deskAdjust();setTimeout(deskAdjust,50)}function updateSessionTime(){var a=0;if(desktop&&desktop.startTime){a=Math.floor((new Date()-desktop.startTime)/1000);QH("DeskTimer",zeroPad(Math.floor(a/3600),2)+":"+zeroPad((Math.floor(a/60)%60),2)+":"+zeroPad((a%60),2))}else{QH("DeskTimer","")}a=0;if(terminal&&terminal.startTime){a=Math.floor((new Date()-terminal.startTime)/1000);QH("TermTimer",zeroPad(Math.floor(a/3600),2)+":"+zeroPad((Math.floor(a/60)%60),2)+":"+zeroPad((a%60),2))}else{QH("TermTimer","")}if((desktop==null)&&(terminal==null)){clearInterval(updateSessionTimer);updateSessionTimer=null}}function showDesktopSettings(){if(xxdialogMode){return}applyDesktopSettings();updateDesktopButtons();setDialogMode(7,"Remote Desktop Settings",3,showDesktopSettingsChanged)}function showDesktopSettingsChanged(){desktopsettings.encoding=d7desktopmode.value;desktopsettings.showfocus=d7showfocus.checked;desktopsettings.showmouse=d7showcursor.checked;desktopsettings.quality=d7bitmapquality.value;desktopsettings.scaling=d7bitmapscaling.value;desktopsettings.framerate=d7framelimiter.value;desktopsettings.localkeymap=d7localKeyMap.checked;localStorage.setItem("desktopsettings",JSON.stringify(desktopsettings));applyDesktopSettings();if(desktop){if(desktop.contype==1){if(desktop.State!=0){desktop.m.SendCompressionLevel(1,desktopsettings.quality,desktopsettings.scaling,desktopsettings.framerate)}}if(desktop.contype==2){if(desktopsettings.showfocus==false){desktop.m.focusmode=0;deskFocusBtn.value="All Focus"}if(desktop.State!=0){desktop.Stop();setTimeout(function(){connectDesktop(null,2)},50)}}}}function applyDesktopSettings(){var c="",b=(features&512)?[90,80,70,60,50,40,30,20,10,5,1]:[60,50,40,30,20,10,5,1];for(var a in b){c+="<option value="+b[a]+">"+b[a]+"%</option>"}QH("d7bitmapquality",c);d7desktopmode.value=desktopsettings.encoding;d7showfocus.checked=desktopsettings.showfocus;d7showcursor.checked=desktopsettings.showmouse;d7bitmapquality.value=40;if(b.indexOf(parseInt(desktopsettings.quality))>=0){d7bitmapquality.value=desktopsettings.quality}d7bitmapscaling.value=desktopsettings.scaling;if(desktopsettings.framerate){d7framelimiter.value=desktopsettings.framerate}if(desktopsettings.localkeymap){d7localKeyMap.checked=desktopsettings.localkeymap}QV("deskFocusBtn",(desktop!=null)&&(desktop.contype==2)&&(desktop.state!=0)&&(desktopsettings.showfocus))}function enterBrowserFullscreen(a){if(a.requestFullscreen){a.requestFullscreen()}else{if(a.msRequestFullscreen){a.msRequestFullscreen()}else{if(a.mozRequestFullScreen){a.mozRequestFullScreen()}else{if(a.webkitRequestFullscreen){a.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}}}}}function exitBrowserFullscreen(){if(document.exitFullscreen){document.exitFullscreen()}else{if(document.msExitFullscreen){document.msExitFullscreen()}else{if(document.mozCancelFullScreen){document.mozCancelFullScreen()}else{if(document.webkitExitFullscreen){document.webkitExitFullscreen()}}}}}function isBrowserFullscreen(){if(!document.fullscreenElement&&!document.mozFullScreenElement&&!document.webkitFullscreenElement&&!document.msFullscreenElement){return false}else{return true}}var fullscreen=false;var browserfullscreen=false;function deskToggleFull(a){fullscreen=!fullscreen;if(fullscreen){QC("body").add("fulldesk");QS("deskarea3x")["height"]="100%";QS("deskarea3x")["max-height"]="100%";if(a.shiftKey==true){enterBrowserFullscreen(Q("deskarea0"));browserfullscreen=true}}else{QC("body").remove("fulldesk");QS("deskarea3x")["height"]=null;QS("deskarea3x")["max-height"]=null;if(browserfullscreen==true){exitBrowserFullscreen();browserfullscreen=false}}deskAdjust();updateDesktopButtons()}function deskToggleFocus(){desktop.m.focusmode=(desktop.m.focusmode+64)%192;Q("deskFocusBtn").value=["All Focus","Small Focus","Large Focus"][desktop.m.focusmode/64]}function deskAdjust(){var d=Q("DeskParent").clientHeight,e=Q("DeskParent").clientWidth;var a=Q("Desk").height,b=Q("Desk").width;if(deskAspectRatio==2){QS("Desk")["margin-top"]=null;QS("Desk").height="100%";QS("Desk").width="100%";QS("DeskParent").overflow="hidden"}else{if(deskAspectRatio==1){QS("Desk")["margin-top"]="0px";QS("Desk").height=a+"px";QS("Desk").width=b+"px";QS("DeskParent").overflow="scroll"}else{if((d/e)>(a/b)){var c=((a*e)/b)+"px";QS("Desk").height=c;QS("Desk").width="100%"}else{var g=((b*d)/a)+"px";if(webPageFullScreen||fullscreen){QS("Desk").height=null}else{QS("Desk").height="100%"}QS("Desk").width=g}QS("Desk")["margin-top"]=null;QS("DeskParent").overflow="hidden"}}}function mdeskAdjust(c,h,g,a){if(!c||!h||!g||!a){return}if(a.id=="Desk"){deskAdjust();return}var k=[{x:180,y:101},{x:302,y:169},{x:454,y:255}][Q("sizeselect").selectedIndex];var e=k.x+2,j=Q("xdevices").clientWidth-30,l=Math.floor(j/e);l=e+Math.floor((j-(l*e))/l);k.y=k.y*(l/k.x);k.x=l;var b=k.y,d=k.x;if(c.State!=0){b=k.y;d=(h/g)*k.y}QS(a.id)["max-height"]=b+"px";QS(a.id)["max-width"]=d+"px";QS(a.id)["margin-top"]="0";QS(a.id)["margin-bottom"]="0"}function deskSendKeys(){if(xxdialogMode||desktop==null||desktop.State!=3){return}var a=Q("deskkeys").value;if(a==0){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[65364,1],[65364,0],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,40],[desktop.m.KeyAction.UP,40],[desktop.m.KeyAction.EXUP,91]])}}else{if(a==1){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[65362,1],[65362,0],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,38],[desktop.m.KeyAction.UP,38],[desktop.m.KeyAction.EXUP,91]])}}else{if(a==2){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[108,1],[108,0],[65511,0]])}else{desktop.sendCtrlMsg('{"action":"lock"}')}}else{if(a==3){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[109,1],[109,0],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,77],[desktop.m.KeyAction.UP,77],[desktop.m.KeyAction.EXUP,91]])}}else{if(a==4){if(desktop.contype==2){desktop.m.sendkey([[65505,1],[65511,1],[109,1],[109,0],[65511,0],[65505,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.DOWN,16],[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,77],[desktop.m.KeyAction.UP,77],[desktop.m.KeyAction.EXUP,91],[desktop.m.KeyAction.UP,16]])}}else{if(a==5){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.EXUP,91]])}}else{if(a==6){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[114,1],[114,0],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,82],[desktop.m.KeyAction.UP,82],[desktop.m.KeyAction.EXUP,91]])}}else{if(a==7){if(desktop.contype==2){desktop.m.sendkey([[65513,1],[65473,1],[65473,0],[65513,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,18],[desktop.m.KeyAction.DOWN,115],[desktop.m.KeyAction.UP,115],[desktop.m.KeyAction.EXUP,18]])}}else{if(a==8){if(desktop.contype==2){desktop.m.sendkey([[65507,1],[119,1],[119,0],[65507,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,17],[desktop.m.KeyAction.DOWN,87],[desktop.m.KeyAction.UP,87],[desktop.m.KeyAction.EXUP,17]])}}else{if(a==9){if(desktop.contype==2){desktop.m.sendkey([[65513,1],[65289,1],[65289,0],[65513,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,18],[desktop.m.KeyAction.DOWN,9],[desktop.m.KeyAction.UP,9],[desktop.m.KeyAction.EXUP,18]])}}else{if(a==10){desktop.m.sendcad()}else{if(a==11){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[65361,1],[65361,0],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,37],[desktop.m.KeyAction.UP,37],[desktop.m.KeyAction.EXUP,91]])}}else{if(a==12){if(desktop.contype==2){desktop.m.sendkey([[65511,1],[65363,1],[65363,0],[65511,0]])}else{desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN,91],[desktop.m.KeyAction.DOWN,39],[desktop.m.KeyAction.UP,39],[desktop.m.KeyAction.EXUP,91]])}}}}}}}}}}}}}}}function showDeskType(){if(xxdialogMode||desktop==null||desktop.State!=3){return}Q("DeskType").blur();var a="<div>Enter text and click OK to remotely type it using a US english keyboard. Make sure to place the remote cursor at the correct position before proceeding.<div>";a+='<textarea id=d2typeText style="margin-top:5px;width:100%;height:184px;resize:none" maxlength=2000></textarea>';setDialogMode(2,"Remote Keyboard Entry",3,showDeskTypeEx,a);Q("d2typeText").focus()}var AmtDeskTypeTimer=null;var AmtDeskTypeContent=null;var DeskTypeTranslate={39:222,42:106,43:107,44:188,45:189,46:190,47:191,59:186,61:187,91:219,92:220,93:221,96:192,191:111};var DeskTypeShiftTranslate={33:49,34:222,35:51,36:52,37:53,38:55,40:57,41:48,58:186,60:188,62:190,63:191,64:50,94:54,95:189,106:56,107:187,123:219,124:220,125:221,126:192};function showDeskTypeEx(){var j=Q("d2typeText").value,g=Q("d2typeText").value.toUpperCase(),k=[],h=false;if(desktop.contype==2){for(var e in j){var c=j.charCodeAt(e);k.push([c,1],[c,0])}AmtDeskTypeContent=k;AmtDeskTypeTimer=setInterval(function(){var a=AmtDeskTypeContent.shift();if(desktop){desktop.m.sendkey(a[0],a[1])}if((desktop==null)||(AmtDeskTypeContent.length==0)){clearInterval(AmtDeskTypeTimer);AmtDeskTypeContent=null}},10)}else{for(var e in j){var c=j.charCodeAt(e),d=g.charCodeAt(e);if(((c>=65)&&(c<=90))||((c>=97)&&(c<=122))){if((c==d)&&(h==false)){k.push([desktop.m.KeyAction.DOWN,16]);h=true}if((c!=d)&&(h==true)){k.push([desktop.m.KeyAction.UP,16]);h=false}}else{if((c>=48)&&(c<=57)){if(h==true){k.push([desktop.m.KeyAction.UP,16]);h=false}}else{if(DeskTypeTranslate[c]){if(h==true){k.push([desktop.m.KeyAction.UP,16]);h=false}d=DeskTypeTranslate[c]}else{if(DeskTypeShiftTranslate[c]){if(h==false){k.push([desktop.m.KeyAction.DOWN,16]);h=true}d=DeskTypeShiftTranslate[c]}}}}k.push([desktop.m.KeyAction.DOWN,d],[desktop.m.KeyAction.UP,d])}if(h==true){k.push([desktop.m.KeyAction.UP,16]);h=false}desktop.m.SendKeyMsgKC(k)}}function showDeskClip(){if(xxdialogMode||desktop==null||desktop.State!=3){return}Q("DeskClip").blur();var a="";a+='<input id=dlgClipGet type=button value="Get Clipboard" style=width:120px onclick=showDeskClipGet()>';a+='<input id=dlgClipSet type=button value="Set Clipboard" style=width:120px onclick=showDeskClipSet()>';a+='<div id=dlgClipStatus style="display:inline-block;margin-left:8px" ></div>';a+='<textarea id=d2clipText style="width:100%;height:184px;resize:none" maxlength=65535></textarea>';a+='<input type=button value="Close" style=width:80px;float:right onclick=dialogclose(0)><div style=height:26px;margin-top:3px><span id=linuxClipWarn style=display:none>Remote clipboard is valid for 60 seconds.</span> </div><div></div>';setDialogMode(2,"Remote Clipboard",8,null,a,"clipboard");Q("d2clipText").focus()}function showDeskClipGet(){if(desktop==null||desktop.State!=3){return}meshserver.send({action:"msg",type:"getclip",nodeid:currentNode._id})}function showDeskClipSet(){if(desktop==null||desktop.State!=3){return}meshserver.send({action:"msg",type:"setclip",nodeid:currentNode._id,data:Q("d2clipText").value});QV("linuxClipWarn",currentNode&¤tNode.agent&&(currentNode.agent.id>4)&&(currentNode.agent.id!=21)&&(currentNode.agent.id!=22))}function sendCAD(){if(xxdialogMode||desktop==null||desktop.State!=3){return}desktop.m.sendcad()}function toggleDeskTools(){if(xxdialogMode){return}if(QS("DeskTools").display=="none"){QV("DeskTools",true);Q("DeskTools").nodeid=currentNode._id;QH("DeskToolsProcesses","");QH("DeskToolsServices","");QV("deskToolsTopTabService",false);changeDeskToolTab(0);refreshDeskTools(0);refreshDeskTools(1)}else{QV("DeskTools",false)}}var deskToolTabSelection=0;function changeDeskToolTab(a){deskToolTabSelection=a;QV("DeskToolsProcessTab",a==0);QV("DeskToolsServiceTab",a==1);QS("deskToolsTopTabProcess")["bottom"]=(a==0)?"0px":"3px";QS("deskToolsTopTabService")["bottom"]=(a==1)?"0px":"3px";QS("deskToolsTopTabProcess")["color"]=(a==0)?"black":"gray";QS("deskToolsTopTabService")["color"]=(a==1)?"black":"gray"}function refreshDeskTools(b){var a=(b==null)?deskToolTabSelection:b;QV("DeskToolsRefreshButton",false);setTimeout(refreshDeskToolsEx,500);if(a==0){meshserver.send({action:"msg",type:"ps",nodeid:currentNode._id})}if(a==1){meshserver.send({action:"msg",type:"services",nodeid:currentNode._id})}}function refreshDeskToolsEx(){QV("DeskToolsRefreshButton",true)}var deskTools={sort:1,ssort:1,msg:null,smsg:null};function sortProcess(a){deskTools.sort=a;showDeskToolsProcesses(deskTools.msg)}function sortService(a){deskTools.ssort=a;showDeskToolsServices(deskTools.smsg)}function sortProcessPid(c,d){if(c.p>d.p){return 1}if(c.p<d.p){return(-1)}return sortProcessName(c,d)}function sortProcessName(c,d){if(c.d>d.d){return 1}if(c.d<d.d){return(-1)}return 0}function showDeskToolsProcesses(g){deskTools.msg=g;if(g==null){QH("DeskToolsProcesses","");return}if(Q("DeskTools").nodeid!=g.nodeid){return}var h=[],k=null;try{k=JSON.parse(g.value)}catch(b){}if(k!=null){for(var j in k){h.push({p:parseInt(j),c:k[j].cmd,d:k[j].cmd.toLowerCase(),u:k[j].user})}if(deskTools.sort==0){h.sort(sortProcessPid)}else{if(deskTools.sort==1){h.sort(sortProcessName)}}var l="";for(var d in h){if(h[d].p!=0){var a=h[d].c;if(a.length>30){a='<span title="'+a+'">'+a.substring(0,30)+"...</span>"}l+="<div class=deskToolsBar><div style=width:50px;float:left;text-align:right;padding-right:5px>"+h[d].p+'</div><a href=# style=float:right;padding-right:5px;cursor:pointer title="Stop process" onclick=\'return stopProcess('+h[d].p+',"'+h[d].c+'")\'><img width=10 height=10 src="images/trash.png"></a><div style=float:right;padding-right:5px>'+(h[d].u?h[d].u:"")+"</div><div>"+a+"</div></div>"}}QH("DeskToolsProcesses",l)}}function showDeskToolsServices(g){deskTools.smsg=g;if(g==null){QH("DeskToolsProcesses","");return}if(Q("DeskTools").nodeid!=g.nodeid){return}QV("deskToolsTopTabService",true);var h=[],j=null;try{j=JSON.parse(g.value)}catch(b){}deskTools.services=j;if(j!=null){for(var d in j){if(j[d].status){h.push({p:capitalizeFirstLetter(j[d].status.state.toLowerCase()),d:j[d].displayName,i:d})}else{if(j[d].serviceType){h.push({p:j[d].serviceType,d:j[d].name,i:d})}}}if(deskTools.ssort==0){h.sort(sortProcessPid)}else{if(deskTools.ssort==1){h.sort(sortProcessName)}}var k="";for(var d in h){if(h[d].p!=0){var a=h[d].d;if(a.length>30){a='<span title="'+a+'">'+a.substring(0,30)+"...</span>"}k+="<div onclick=showServiceDetailsDialog("+h[d].i+") class=deskToolsBar><div style=width:70px;float:left;padding-right:5px>"+h[d].p+"</div><div>"+a+"</div></div>"}}QH("DeskToolsServices",k)}}function showServiceDetailsDialog(a){if(xxdialogMode){return}var b=deskTools.services[a];if(b!=null){var d="";if(b.name){d+=addHtmlValue("Name",b.name)}if(b.displayName){d+=addHtmlValue("Display name",b.displayName)}if(b.status){if(b.status.state){d+=addHtmlValue("State",capitalizeFirstLetter(b.status.state.toLowerCase()))}if(b.status.pid){d+=addHtmlValue("PID",b.status.pid)}var c=[];if(b.status.isFileSystemDriver===true){c.push("FileSystemDriver")}if(b.status.isInteractive===true){c.push("Interactive")}if(b.status.isKernelDriver===true){c.push("KernelDriver")}if(b.status.isOwnProcess===true){c.push("OwnProcess")}if(b.status.isSharedProcess===true){c.push("SharedProcess")}if(c.length>0){d+=addHtmlValue("Type",c.join(", "))}}d+='<br/><div style=float:right;margin-bottom:12px><input type=button value="Close" onclick=showServiceDetailsDialogEx(0,'+a+')></div><div style=margin-bottom:12px><input type=button value="Start" onclick=showServiceDetailsDialogEx(1,'+a+')><input type=button value="Stop" onclick=showServiceDetailsDialogEx(2,'+a+')><input type=button value="Restart" onclick=showServiceDetailsDialogEx(3,'+a+")></div>";setDialogMode(2,"Service Details",8,null,d,name)}}function showServiceDetailsDialogEx(a,b){setDialogMode(0);if(a==0){return}var c=deskTools.services[b];if(c!=null){if(a==1){meshserver.send({action:"msg",type:"serviceStart",nodeid:currentNode._id,serviceName:c.name})}if(a==2){meshserver.send({action:"msg",type:"serviceStop",nodeid:currentNode._id,serviceName:c.name})}if(a==3){meshserver.send({action:"msg",type:"serviceRestart",nodeid:currentNode._id,serviceName:c.name})}setTimeout(function(){refreshDeskTools(1)},1000)}}function toggleKvmControl(){putstore("DeskControl",(Q("DeskControl").checked?1:0))}function deskSaveImage(){if(xxdialogMode||desktop==null||desktop.State!=3){return}var a=new Date(),b="Desktop-"+currentNode.name+"-"+a.getFullYear()+"-"+("0"+(a.getMonth()+1)).slice(-2)+"-"+("0"+a.getDate()).slice(-2)+"-"+("0"+a.getHours()).slice(-2)+"-"+("0"+a.getMinutes()).slice(-2);Q("Desk")["toBlob"](function(c){saveAs(c,b+".jpg")})}function deskDisplayInfo(g,b,e){var a=0,c="";for(var d in b){a++;c+="<option"+((e==d)?" selected":"")+" value="+d+">"+b[d]+"</option>";if((deskPreferedStickyDisplay==d)&&(e!=deskPreferedStickyDisplay)){desktop.m.SetDisplay(d)}}QH("termdisplays",c);QV("termdisplays",a>1)}function deskGetDisplayNumbers(a){desktop.m.GetDisplayNumbers()}var deskPreferedStickyDisplay=0;function deskSetDisplay(a){desktop.m.SetDisplay(deskPreferedStickyDisplay=parseInt(Q("termdisplays").value));Q("termdisplays").blur()}var dblClickDetectArgs={t:0,x:0,y:0};function dblClickDetect(a){if(a.buttons!=1){return}var b=Date.now();if(((b-dblClickDetectArgs.t)<250)&&(Math.abs(a.clientX-dblClickDetectArgs.x)<2)&&(Math.abs(a.clientY-dblClickDetectArgs.y)<2)){if(!xxdialogMode&&desktop!=null&&Q("DeskControl").checked){if((webRtcDesktop!=null)&&(webRtcDesktop.softdesktop!=null)){webRtcDesktop.softdesktop.m.mousedblclick(a);desktop.m.sendKeepAlive()}else{desktop.m.mousedblclick(a)}}}dblClickDetectArgs.t=b;dblClickDetectArgs.x=a.clientX;dblClickDetectArgs.y=a.clientY}function dmousedown(a){setSessionActivity();a.addx=Q("DeskParent").scrollLeft;a.addy=Q("DeskParent").scrollTop;if(!xxdialogMode&&desktop!=null&&Q("DeskControl").checked){if((webRtcDesktop!=null)&&(webRtcDesktop.softdesktop!=null)){webRtcDesktop.softdesktop.m.mousedown(a);desktop.m.sendKeepAlive()}else{desktop.m.mousedown(a)}}dblClickDetect(a)}function dmouseup(a){setSessionActivity();a.addx=Q("DeskParent").scrollLeft;a.addy=Q("DeskParent").scrollTop;if(!xxdialogMode&&desktop!=null&&Q("DeskControl").checked){if((webRtcDesktop!=null)&&(webRtcDesktop.softdesktop!=null)){webRtcDesktop.softdesktop.m.mouseup(a);desktop.m.sendKeepAlive()}else{desktop.m.mouseup(a)}}}function dmousemove(a){setSessionActivity();a.addx=Q("DeskParent").scrollLeft;a.addy=Q("DeskParent").scrollTop;if(!xxdialogMode&&desktop!=null&&Q("DeskControl").checked){if((webRtcDesktop!=null)&&(webRtcDesktop.softdesktop!=null)){webRtcDesktop.softdesktop.m.mousemove(a);desktop.m.sendKeepAlive()}else{desktop.m.mousemove(a)}}}function dmousewheel(a){setSessionActivity();a.addx=Q("DeskParent").scrollLeft;a.addy=Q("DeskParent").scrollTop;if(!xxdialogMode&&desktop!=null&&Q("DeskControl").checked){if((webRtcDesktop!=null)&&(webRtcDesktop.softdesktop!=null)){webRtcDesktop.softdesktop.m.mousewheel(a);desktop.m.sendKeepAlive()}else{if(desktop.m.mousewheel){desktop.m.mousewheel(a)}}haltEvent(a);return true}return false}function drotate(a){if(!xxdialogMode&&desktop!=null){desktop.m.setRotation(desktop.m.rotation+a);deskAdjust();deskAdjust()}}function stopProcess(a,b){setDialogMode(2,"Process Control",3,stopProcessEx,"Stop process #"+a+' "'+b+'"?',a);return false}function stopProcessEx(a,b){meshserver.send({action:"msg",type:"pskill",nodeid:currentNode._id,value:b});setTimeout(refreshDeskTools,300)}var terminalNode;function setupTerminal(){if((terminalNode!=currentNode)&&(terminal!=null)){terminal.Stop();terminal=null}terminalNode=currentNode;updateTerminalButtons()}function updateTerminalButtons(){var b=meshes[terminalNode.meshid];var d=((terminal!=null)&&(terminal.state!=0));QV("disconnectbutton2span",(d==true));QV("connectbutton2span",(d==false)&&(b.mtype==2)&&(currentNode.agent.caps&2));QV("connectbutton2hspan",(d==false)&&((terminalNode.intelamt!=null)&&(b.mtype==1||terminalNode.intelamt.state==2)&&((terminalNode.intelamt.ver!=null)||(b.mtype==1))));var c=((terminalNode.conn&1)!=0);QE("connectbutton2",c);var a=((terminalNode.conn&6)!=0);QE("connectbutton2h",a);QE("ctrlcbutton",d);QE("ctrlxbutton",d);QE("escbutton",d);QE("bsbutton",d);QE("pastebutton",d);QE("specialkeylist",d);QE("specialkeylistinput",d);QV("terminalSettingsButtons",(terminal)&&(terminal.contype==2));if(terminal){Q("id_ttypebutton").value=terminalEmulations[terminal.m.terminalEmulation];Q("id_tfxkeysbutton").value=fxEmulations[terminal.m.fxEmulation];Q("id_tcrbutton").value=(terminal.m.lineFeed=="\r\n")?"CR+LF":"LF"}}function onTerminalStateChange(d,a){var c=a;if((c==3)&&(d.contype==2)){c++}var b=StatusStrs[c];if(terminal.webRtcActive==true){b+=", WebRTC"}QH("termstatus",b);switch(a){case 0:QE("termSizeList",true);QH("termtitle","");QV("termRecordIcon",false);d.m.TermResetScreen();d.m.TermDraw();if(terminal!=null){terminal.Stop();terminal=null}break;case 3:QE("termSizeList",false);if(d&&(d.serverIsRecording==true)){QV("termRecordIcon",true)}terminal.startTime=new Date();if(updateSessionTimer==null){updateSessionTimer=setInterval(updateSessionTime,1000)}break;default:QE("termSizeList",false);break}updateTerminalButtons()}var autoConnectTerminalTimer=null;function autoConnectTerminal(a){if(autoConnectTerminalTimer==null){autoConnectTerminalTimer=setInterval(connectTerminal,100)}else{clearInterval(autoConnectTerminalTimer);autoConnectTerminalTimer=null}}function connectTerminal(b,a,c){p12clearConsoleMsg();if(!terminal){if(a==2){if((terminalNode.intelamt.user==null)||(terminalNode.intelamt.user=="")){editDeviceAmtSettings(terminalNode._id,connectTerminal,2);return}var d={};if(Q("termSizeList").value==2){d.width=100;d.height=30}terminal=CreateAmtRedirect(CreateAmtRemoteTerminal("Term",d),authCookie);terminal.debugmode=debugmode;terminal.m.debugmode=debugmode;terminal.m.onTitleChange=function(e,g){QH("termtitle"," - "+EscapeHtml(g))};terminal.onStateChanged=onTerminalStateChange;terminal.Start(terminalNode._id,16994,"*","*",0);terminal.contype=2;Q("id_ttypebutton").value=terminalEmulations[terminal.m.terminalEmulation]}else{var d={};if([1,2,3,4,21,22].indexOf(currentNode.agent.id)==-1){if(Q("termSizeList").value==2){d.width=100;d.height=30;d.xterm=true}if(Q("termSizeList").value==3){d.width=Math.floor((Q("column_l").clientWidth-60)/10);d.height=Math.floor((Q("column_l").clientHeight-120)/20);d.xterm=true}}if((b&&(b.shiftKey==true))||(c&&(c.powershell))){d.protocol=6}terminal=CreateAgentRedirect(meshserver,CreateAmtRemoteTerminal("Term",d),serverPublicNamePort,authCookie,domainUrl);terminal.debugmode=debugmode;terminal.m.debugmode=debugmode;terminal.m.onTitleChange=function(e,g){QH("termtitle"," - "+EscapeHtml(g))};terminal.m.lineFeed=([1,2,3,4,21,22].indexOf(currentNode.agent.id)>=0)?"\r\n":"\r";terminal.attemptWebRTC=attemptWebRTC;terminal.onStateChanged=onTerminalStateChange;terminal.onConsoleMessageChange=function(){p12clearConsoleMsg();if(terminal.consoleMessage){QH("p12TermConsoleMsg",EscapeHtml(terminal.consoleMessage).split("\n").join("<br />"));QV("p12TermConsoleMsg",true);p12TermConsoleMsgTimer=setTimeout(p12clearConsoleMsg,8000)}};terminal.Start(terminalNode._id);terminal.contype=1;terminal.m.terminalEmulation=0;terminal.m.fxEmulation=0;Q("id_ttypebutton").value=terminalEmulations[0]}}else{terminal.Stop();terminal=null}Q("connectbutton2").blur()}var terminalEmulations=["UTF8 Terminal","Extended ASCII","Intel ASCII"];function termToggleType(){if(!terminal||xxdialogMode){return}terminal.m.terminalEmulation=(terminal.m.terminalEmulation+1)%3;Q("id_ttypebutton").value=terminalEmulations[terminal.m.terminalEmulation];Q("id_ttypebutton").blur()}var fxEmulations=["Intel (F10 = ESC+[OM)","Alternate (F10 = ESC+0)","VT100+ (F10 = ESC+[OY)"];function termToggleFx(){if(!terminal||xxdialogMode){return}terminal.m.fxEmulation=(terminal.m.fxEmulation+1)%3;Q("id_tfxkeysbutton").value=fxEmulations[terminal.m.fxEmulation];Q("id_tfxkeysbutton").blur()}function termToggleCr(){if(!terminal||xxdialogMode){return}if(terminal.m.lineFeed=="\n"){terminal.m.lineFeed="\r\n"}else{terminal.m.lineFeed="\n"}Q("id_tcrbutton").value=(terminal.m.lineFeed=="\r\n")?"CR+LF":"LF"}function termSendKey(b,a){if(!terminal||xxdialogMode){return}terminal.m.TermSendKey(b);Q(a).blur()}function showTermPasteDialog(){if(!terminal||xxdialogMode){return}Q("pastebutton").blur();setDialogMode(2,"Paste",3,showTermPasteDialogEx,'<textarea id=d2pasteText style="width:100%;height:184px;resize:none"></textarea>');Q("d2pasteText").focus()}function showTermPasteDialogEx(){if(!terminal){return}terminal.m.TermSendKeys(Q("d2pasteText").value)}function sendSpecialKey(){terminal.m.TermSendKey(Q("specialkeylist").value);Q("specialkeylist").blur();Q("specialkeylistinput").blur()}var filesNode;function setupFiles(){var b=(filesNode==currentNode);filesNode=currentNode;var a=((filesNode.conn&1)!=0)?true:false;QE("p13Connect",a);if(((b==false)||(a==false))&&files){files.Stop();files=null}}function onFilesStateChange(c,a){p13Connect.value=(a==0)?"Connect":"Disconnect";var b=StatusStrs[a];if(files.webRtcActive==true){b+=", WebRTC"}Q("p13Status").textContent=b;switch(a){case 0:QH("p13files","");p13filetree=null;p13filetreelocation=[];QH("p13currentpath","");QE("p13FolderUp",false);QV("filesRecordIcon",false);p13setActions();if(files!=null){files.Stop();files=null}break;case 3:p13targetpath="";if(files){files.sendText({action:"ls",reqid:1,path:""});if(files.serverIsRecording==true){QV("filesRecordIcon",true)}}break;default:break}}function CreateRemoteFiles(b){var a={protocol:5};a.onFileUpdate=b;a.xxStateChange=function(c){};a.ProcessData=function(c){a.onFileUpdate(c)};return a}var autoConnectFilesTimer=null;function autoConnectFiles(a){if(autoConnectFilesTimer==null){autoConnectFilesTimer=setInterval(connectFiles,100)}else{clearInterval(autoConnectFilesTimer);autoConnectFilesTimer=null}}function connectFiles(a){p13clearConsoleMsg();if(!files){files=CreateAgentRedirect(meshserver,CreateRemoteFiles(p13gotFiles),serverPublicNamePort,authCookie,domainUrl);files.attemptWebRTC=attemptWebRTC;files.onStateChanged=onFilesStateChange;files.onConsoleMessageChange=function(){p13clearConsoleMsg();if(files.consoleMessage){QH("p13FilesConsoleMsg",EscapeHtml(files.consoleMessage).split("\n").join("<br />"));QV("p13FilesConsoleMsg",true);p13FilesConsoleMsgTimer=setTimeout(p13clearConsoleMsg,8000)}};files.Start(filesNode._id)}else{files.Stop();files=null}p13clipboard=p13clipboardFolder=null;p13clipboardCut=0;p13updateClipview()}var p13filetree=null;var p13targetpath=null;var p13filetreelocation=[];function p13gotFiles(b){if((b.length>0)&&(b.charCodeAt(0)!=123)){p13gotDownloadBinaryData(b);return}b=JSON.parse(decode_utf8(b));if(b.action=="download"){p13gotDownloadCommand(b);return}b.path=b.path.replace(/\//g,"\\");if((p13filetree!=null)&&(b.path==p13filetree.path)){var a=p13getCheckedNames();p13filetree=b;p13updateFiles(a)}else{var c=b.path.replace(/\//g,"\\"),d=p13targetpath.replace(/\//g,"\\");while((c.length>0)&&(c[0]=="\\")){c=c.substring(1)}while((d.length>0)&&(d[0]=="\\")){d=d.substring(1)}if((c==d)||((b.path=="\\")&&(p13targetpath==""))){p13filetree=b;p13updateFiles()}}}function p13getCheckedNames(){var b=[],a=document.getElementsByName("fd");for(var c=0;c<a.length;c++){if(a[c].checked){b.push(p13filetree.dir[a[c].value].n)}}return b}function p13updateFiles(b){var n="",o="",c='<a href=# style=cursor:pointer onclick="return p13folderup(0)">Root</a>',l="Root";var w=p13filetree.path.split("\\");p13filetreelocation=[];for(var p in w){if(w[p]!=""){p13filetreelocation.push(w[p])}}for(var p in p13filetreelocation){c+=' / <a href=# style=cursor:pointer onclick="return p13folderup('+(parseInt(p)+1)+')">'+p13filetreelocation[p]+"</a>"}var s=p13filetreelocation.join("/");var j=p13sort_files(p13filetree.dir);for(var p in j){var d=j[p],r=d.n,u;u=r;if(r.length>70){u='<span title="'+EscapeHtml(r)+'">'+EscapeHtml(r.substring(0,70))+"...</span>"}else{u=EscapeHtml(r)}r=EscapeHtml(r);var g="";if(d.d!=null){var e=new Date(d.d),g=printDateTime(e)+" "}var k="";if(d.s!=null){k=getFileSizeStr(d.s)}var m="";if(d.t<3){var t="",v="";m="<div class=filelist file=999><input file=999 style=float:left name=fd class=fcb type=checkbox onchange=p13setActions() value='"+d.nx+"'> <span style=float:right title=\""+v+'">'+t+"</span><span><div class=fileIcon"+d.t+' onclick=p13folderset("'+encodeURIComponent(d.nx)+'")></div><a href=# style=cursor:pointer onclick=\'return p13folderset("'+encodeURIComponent(d.nx)+"\")'>"+u+"</a></span></div>"}else{var q=u;if(d.s>0){q='<a hrf=# rel="noreferrer noopener" target="_blank" style=cursor:pointer onclick="return p13downloadfile(\''+encodeURIComponent(s+"/"+r)+"','"+encodeURIComponent(r)+"',"+d.s+')">'+u+"</a>"}m="<div class=filelist file=3><input file=3 style=float:left name=fd class=fcb type=checkbox onchange=p13setActions() value='"+d.nx+"'> <span class=fsize>"+g+"</span><span style=float:right>"+k+"</span><span><div class=fileIcon"+d.t+"></div>"+q+"</span></div>"}if(d.t<3){n+=m}else{o+=m}}QH("p13files",n+o);QH("p13currentpath",c);QE("p13FolderUp",p13filetreelocation.length!=0);if(b!=null){var a=document.getElementsByName("fd");for(var p=0;p<a.length;p++){if(b.indexOf(p13filetree.dir[a[p].value].n)>=0){a[p].checked=true}}}p13setActions()}function p13folderset(a){p13targetpath=joinPaths(p13filetree.path,p13filetree.dir[a].n).split("\\").join("/");files.sendText({action:"ls",reqid:1,path:p13targetpath})}function p13folderup(a){if(a==null){p13filetreelocation.pop()}else{while(p13filetreelocation.length>a){p13filetreelocation.pop()}}p13targetpath=p13filetreelocation.join("/");files.sendText({action:"ls",reqid:1,path:p13targetpath});return false}var p13sortorder;function p13sort_filename(c,d){if(c.ln>d.ln){return(1*p13sortorder)}if(c.ln<d.ln){return(-1*p13sortorder)}return 0}function p13sort_timestamp(c,d){if(c.d>d.d){return(1*p13sortorder)}if(c.d<d.d){return(-1*p13sortorder)}return 0}function p13sort_bysize(c,d){if(c.s==d.s){return p13sort_filename(c,d)}return(((c.s-d.s))*p13sortorder)}function p13sort_files(a){var c=[],d=Q("p13sortdropdown").value;for(var b in a){a[b].nx=b;if(a[b].s==null){a[b].s=0}if(a[b].n==null){a[b].n=b}a[b].ln=a[b].n.toLowerCase();c.push(a[b])}p13sortorder=1;if(d>3){p13sortorder=-1;d-=3}if(d==1){c.sort(p13sort_filename)}else{if(d==2){c.sort(p13sort_bysize)}else{if(d==3){c.sort(p13sort_timestamp)}}}return c}function p13setActions(){if(p13filetree==null){QE("p13DeleteFileButton",false);QE("p13NewFolderButton",false);QE("p13UploadButton",false);QE("p13RenameFileButton",false);QE("p13ViewFileButton",false);QE("p13SelectAllButton",false);Q("p13SelectAllButton").value="Select All";QE("p13RefreshButton",false);QE("p13CutButton",false);QE("p13CopyButton",false);QE("p13PasteButton",false)}else{var a=p13getFileSelCount(),c=p13getFileCount(),b=p13getFileSelCount(false);var d=((currentNode.agent.id>0)&&(currentNode.agent.id<5));QE("p13DeleteFileButton",(a>0)&&((p13filetreelocation.length>0)||(d==false)));QE("p13NewFolderButton",((p13filetreelocation.length>0)||(d==false)));QE("p13UploadButton",((p13filetreelocation.length>0)||(d==false)));QE("p13RenameFileButton",(a==1)&&((p13filetreelocation.length>0)||(d==false)));QE("p13ViewFileButton",(a==1)&&(b==1)&&((p13filetreelocation.length>0)||(d==false)));QE("p13SelectAllButton",c>0);Q("p13SelectAllButton").value=(a>0?"Select None":"Select All");QE("p13RefreshButton",true);QE("p13CutButton",(a>0)&&(a==b)&&((p13filetreelocation.length>0)||(d==false)));QE("p13CopyButton",(a>0)&&(a==b)&&((p13filetreelocation.length>0)||(d==false)));QE("p13PasteButton",((p13filetreelocation.length>0)||(d==false))&&((p13clipboard!=null)&&(p13clipboard.length>0)))}}function p13getFileSelCount(d){var a=0;var b=document.getElementsByName("fd");for(var c=0;c<b.length;c++){if((b[c].checked)&&((d!=false)||(b[c].attributes.file.value=="3"))){a++}}return a}function p13getFileSelDirCount(){var a=0,b=document.getElementsByName("fd");for(var c=0;c<b.length;c++){if((b[c].checked)&&(b[c].attributes.file.value=="999")){a++}}return a}function p13getFileCount(){var a=0;var b=document.getElementsByName("fd");return b.length}function p13selectallfile(){var c=(p13getFileSelCount()==0),a=document.getElementsByName("fd");for(var b=0;b<a.length;b++){a[b].checked=c}p13setActions()}function p13createfolder(){setDialogMode(2,"New Folder",3,p13createfolderEx,"<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% />");focusTextBox("p13renameinput");p13fileNameCheck()}function p13createfolderEx(){files.sendText({action:"mkdir",reqid:1,path:p13filetreelocation.join("/")+"/"+Q("p13renameinput").value});p13folderup(999)}function p13deletefile(){var a=p13getFileSelCount(),b=(p13getFileSelDirCount()>0)?"<br /><br /><label><input type=checkbox id=p13recdeleteinput>Recursive delete</label><br>":"<input type=checkbox id=p13recdeleteinput style='display:none'>";setDialogMode(2,"Delete",3,p13deletefileEx,(a>1)?("Delete "+a+" selected items?"+b):("Delete selected item?"+b))}function p13deletefileEx(){var b=[],a=document.getElementsByName("fd");for(var c=0;c<a.length;c++){if(a[c].checked){b.push(p13filetree.dir[a[c].value].n)}}files.sendText({action:"rm",reqid:1,path:p13filetreelocation.join("/"),delfiles:b,rec:Q("p13recdeleteinput").checked});p13folderup(999)}function p13renamefile(){var c,a=document.getElementsByName("fd");for(var b=0;b<a.length;b++){if(a[b].checked){c=p13filetree.dir[a[b].value].n}}setDialogMode(2,"Rename",3,p13renamefileEx,'<input type=text id=p13renameinput maxlength=64 onkeyup=p13fileNameCheck(event) style=width:100% value="'+c+'" />',{action:"rename",path:p13filetreelocation.join("/"),oldname:c});focusTextBox("p13renameinput");p13fileNameCheck()}function p13renamefileEx(a,c){c.newname=Q("p13renameinput").value;files.sendText(c);p13folderup(999)}function p13fileNameCheck(a){var b=isFilenameValid(Q("p13renameinput").value);QE("idx_dlgOkButton",b);if((b==true)&&(a!=null)&&(a.keyCode==13)){dialogclose(1)}}function p13uploadFile(){setDialogMode(2,"Upload File",3,p13uploadFileEx,"<input type=file name=files id=p13uploadinput style=width:100% multiple=multiple onchange=\"updateUploadDialogOk('p13uploadinput')\" />");updateUploadDialogOk("p13uploadinput")}function p13uploadFileEx(){p13doUploadFiles(Q("p13uploadinput").files)}function p13viewfile(){var a=document.getElementsByName("fd");for(var b=0;b<a.length;b++){if(a[b].checked){if(p13filetree.dir[a[b].value].s<=204800){p13downloadfile(encodeURIComponent(p13filetreelocation.join("/")+"/"+p13filetree.dir[a[b].value].n),encodeURIComponent(p13filetree.dir[a[b].value].n),p13filetree.dir[a[b].value].s,"viewer")}else{messagebox("File Editor","Only files less than 200k can be edited.")}break}}}var p13clipboard=null,p13clipboardFolder=null,p13clipboardCut=0;function p13copyFile(b){var a=document.getElementsByName("fd");p13clipboard=[];p13clipboardCut=b,p13clipboardFolder=p13targetpath;for(var c=0;c<a.length;c++){if((a[c].checked)&&(a[c].attributes.file.value=="3")){p13clipboard.push(p13filetree.dir[a[c].value].n)}}p13updateClipview()}function p13pasteFile(){var a="";if((p13clipboard!=null)&&(p13clipboard.length>0)){a="Confim "+(p13clipboardCut==0?"copy":"move")+" of "+p13clipboard.length+" entrie"+((p13clipboard.length>1)?"s":"")+" to this location?"}setDialogMode(2,"Paste",3,p13pasteFileEx,a)}function p13pasteFileEx(){files.sendText({action:(p13clipboardCut==0?"copy":"move"),reqid:1,scpath:p13clipboardFolder,dspath:p13targetpath,names:p13clipboard});p13folderup(999);if(p13clipboardCut==1){p13clipboard=null,p13clipboardFolder=null,p13clipboardCut=0;p13updateClipview()}}function p13updateClipview(){var a="";if((p13clipboard!=null)&&(p13clipboard.length>0)){a="Holding "+p13clipboard.length+" entrie"+((p13clipboard.length>1)?"s":"")+" for "+(p13clipboardCut==0?"copy":"move")+', <a href=# onclick="return p13clearClip()" style=cursor:pointer>Clear</a>.'}QH("p13bottomstatus",a);p13setActions()}function p13clearClip(){p13clipboard=null;p13clipboardFolder=null;p13clipboardCut=0;p13updateClipview();return false}function p13fileDragDrop(a){haltEvent(a);QV("p13bigfail",false);QV("p13bigok",false);if(a.dataTransfer==null||a.dataTransfer.files.length==0||p13filetree==null){return}var b=[];for(var c in a.dataTransfer.files){if((a.dataTransfer.files[c].size!=null)&&(a.dataTransfer.files[c].size!=0)){b.push(a.dataTransfer.files[c])}}if(b.length==0){return}p13doUploadFiles(b)}var p13dragtimer=null;function p13fileDragOver(b){haltEvent(b);if(p13dragtimer!=null){clearTimeout(p13dragtimer);p13dragtimer=null}var a=(p13filetree!=null);QV("p13bigok",a);QV("p13bigfail",!a)}function p13fileDragLeave(a){haltEvent(a);if(a.target.id!="p13filetable"){QV("p13bigfail",false);QV("p13bigok",false)}else{p13dragtimer=setTimeout(function(){QV("p13bigfail",false);QV("p13bigok",false);p13dragtimer=null},10)}}var downloadFile;function p13downloadfile(b,c,d,a){if(xxdialogMode||downloadFile||!files){return}downloadFile={path:decodeURIComponent(b),file:decodeURIComponent(c),size:d,tsize:0,data:"",state:0,id:Math.random(),tag:a};files.sendText({action:"download",sub:"start",id:downloadFile.id,path:downloadFile.path});setDialogMode(2,"Download File",10,p13downloadFileCancel,"<div>"+downloadFile.file+"</div><br /><progress id=d2progressBar style=width:100% value=0 max="+d+" />")}function p13downloadFileCancel(){setDialogMode(0);files.sendText({action:"download",sub:"cancel",id:downloadFile.id});downloadFile=null}function p13gotDownloadCommand(a){if((downloadFile==null)||(a.id!=downloadFile.id)){return}if(a.sub=="start"){downloadFile.state=1;files.sendText({action:"download",sub:"startack",id:downloadFile.id})}else{if(a.sub=="cancel"){downloadFile=null;setDialogMode(0)}}}function p13gotDownloadBinaryData(a){if(!downloadFile||downloadFile.state==0){return}if(a.length>4){downloadFile.tsize+=(a.length-4);downloadFile.data+=a.substring(4);Q("d2progressBar").value=downloadFile.tsize}if((ReadInt(a,0)&1)!=0){if(downloadFile.tag=="viewer"){setDialogMode(2,EscapeHtml(downloadFile.file),3,p13editSaveBack,'<textarea id=p13fileeditarea style="height:400px;max-height:400px;width:100%;overflow:auto;resize:none">'+EscapeHtml(downloadFile.data)+"</textarea>",downloadFile.file);QS("dialog").width="auto";QS("dialog").left="100px";QS("dialog").right="100px";downloadFile=null}else{saveAs(data2blob(downloadFile.data),downloadFile.file);downloadFile=null;setDialogMode(0)}}else{files.sendText({action:"download",sub:"ack",id:downloadFile.id})}}function p13editSaveBack(a,d){var c=new TextEncoder().encode(Q("p13fileeditarea").value);p13uploadFileContinue(1,[{name:d,size:c.byteLength,type:"text/plain",xdata:c}])}var uploadFile;function p13doUploadFiles(a){if(xxdialogMode){return}var e=((currentNode.agent.id>0)&&(currentNode.agent.id<5));var d=[],c=0;for(var b in p13filetree.dir){if(e){d.push(p13filetree.dir[b].n.toLowerCase())}else{d.push(p13filetree.dir[b].n)}}for(var b=0;b<a.length;b++){if(e){if(d.indexOf(a[b].name.toLowerCase())>=0){c++}}else{if(d.indexOf(a[b].name)>=0){c++}}}if(c==0){p13uploadFileContinue(1,a)}else{setDialogMode(2,"Upload File",3,p13uploadFileContinue,"Upload will overwrite "+c+" file"+addLetterS(c)+". Continue?",a)}}function p13uploadFileContinue(a,c){uploadFile={};uploadFile.xpath=p13filetreelocation.join("/");uploadFile.xfiles=c;uploadFile.xfilePtr=-1;setDialogMode(2,"Upload File",10,p13uploadFileCancel,"<div id=p13dfileName>Connecting...</div><br /><progress id=d2progressBar style=width:100% value=0 max=0 />");p13uploadReconnect()}function onFileUploadStateChange(b,a){switch(a){case 0:setTimeout(function(){p13folderup(9999)},200);break;case 3:p13uploadNextFile();break;default:break}}function p13uploadReconnect(){uploadFile.ws=CreateAgentRedirect(meshserver,CreateRemoteFiles(p13gotUploadData),serverPublicNamePort,authCookie,domainUrl);uploadFile.ws.attemptWebRTC=false;uploadFile.ws.ctrlMsgAllowed=false;uploadFile.ws.onStateChanged=onFileUploadStateChange;uploadFile.ws.Start(filesNode._id)}function p13uploadNextFile(){uploadFile.xfilePtr++;if(uploadFile.xfiles.length>uploadFile.xfilePtr){uploadFile.xptr=0;var a=uploadFile.xfiles[uploadFile.xfilePtr];QH("p13dfileName",a.name);Q("d2progressBar").max=a.size;Q("d2progressBar").value=0;if(a.xdata==null){uploadFile.xreader=new FileReader();uploadFile.xreader.onload=function(){uploadFile.xdata=uploadFile.xreader.result;uploadFile.ws.sendText(JSON.stringify({action:"upload",reqid:uploadFile.xfilePtr,path:uploadFile.xpath,name:a.name,size:uploadFile.xdata.byteLength}))};uploadFile.xreader.readAsArrayBuffer(a)}else{uploadFile.xdata=a.xdata;uploadFile.ws.sendText(JSON.stringify({action:"upload",reqid:uploadFile.xfilePtr,path:uploadFile.xpath,name:a.name,size:uploadFile.xdata.byteLength}))}}else{p13uploadFileCancel()}}function p13uploadFileCancel(a,b){if(uploadFile!=null){if(uploadFile.ws!=null){uploadFile.ws.Stop();uploadFile.ws=null}uploadFile=null}setDialogMode(0)}function p13gotUploadData(b){var a=JSON.parse(b);if((uploadFile==null)||(parseInt(uploadFile.xfilePtr)!=parseInt(a.reqid))){return}if(a.action=="uploadstart"){p13uploadNextPart(false);for(var c=0;c<8;c++){p13uploadNextPart(true)}}else{if(a.action=="uploadack"){p13uploadNextPart(false)}else{if(a.action=="uploaderror"){p13uploadFileCancel()}}}}function p13uploadNextPart(c){var a=uploadFile.xdata;var e=uploadFile.xptr;var d=uploadFile.xptr+4096;if(d>a.byteLength){if(c==true){return}d=a.byteLength}if(e==a.byteLength){if(uploadFile.ws!=null){uploadFile.ws.Stop();uploadFile.ws=null}if(uploadFile.xfiles.length>uploadFile.xfilePtr+1){p13uploadReconnect()}else{p13uploadFileCancel()}}else{var b=a.slice(e,d);uploadFile.ws.send(b);uploadFile.xptr=d;Q("d2progressBar").value=d}}var currentDeviceEvents=null;function deviceEventsUpdate(){var h="",a=null;for(var c in currentDeviceEvents){var b=currentDeviceEvents[c],g=new Date(b.time);if(b.msg){if(b.h==null){b.h=Math.random()}if(printDate(g)!=a){if(a!=null){h+="</table>"}a=printDate(g);h+="<table class=p3eventsTable cellpadding=0 cellspacing=0><tr><td colspan=4 class=DevSt>"+a+"</td></tr>"}var d="si3";if(b.etype=="user"){d="m2"}if(b.etype=="server"){d="si3"}var e=EscapeHtml(b.msg).split("(R)").join("®");if(b.username){if((userinfo.siteadmin&2)&&(b.userid)){e="<a href=# onclick='gotoUser(\""+encodeURIComponent(b.userid)+"\");haltEvent(event);'>"+EscapeHtml(b.username)+"</a> → "+e}else{e=EscapeHtml(b.username)+" → "+e}}if(b.etype=="relay"||b.action=="relaylog"){d="relayIcon16"}h+="<tr onclick=showEventDetails("+b.h+",1) onmouseover=eventMouseHover(this,1) onmouseout=eventMouseHover(this,0) style=cursor:pointer><td style=width:18px><div class="+d+"></div></td><td class=g1> </td><td class=style10>"+printTime(g)+" - "+e+"</td><td class=g2> </td></tr><tr style=height:2px></tr>"}}if(a!=null){h+="</table>"}if(h==""){h="<br><i>No Events Found</i><br><br>"}QH("p16events",h)}function refreshDeviceEvents(){meshserver.send({action:"events",nodeid:currentNode._id,limit:parseInt(p16limitdropdown.value)})}function showEventDetails(b,d){var a,g;if(d==1){a=currentDeviceEvents}if(d==2){a=events}if(d==3){a=currentUserEvents}for(var c in a){if(a[c].h==b){g=a[c];break}}if(g){if(xxdialogMode){return false}var e="<div style=overflow-y:auto>";for(var c in g){if((c=="h")||(c=="_id")||(c=="ids")||(c=="domain")||(g[c]==null)||(typeof g[c]=="object")){continue}e+=addHtmlValue3(EscapeHtml(c),EscapeHtml(g[c]))}e+="</div>";setDialogMode(2,"Event Details",9,null,e)}}function agentConsoleHandleKeys(b){if((b.ctrlKey)||(b.altKey)){return true}var d=0,a=Q("p15consoleText");if(b.key){if(b.keyCode==13&&consoleFocus==0){p15consoleSend(b);d=1}else{if(b.keyCode==8&&consoleFocus==0){var g=a.value;a.value=g.substring(0,g.length-1);d=1}else{if(b.keyCode==27){a.value="";d=1}else{if((b.keyCode==38)||(b.keyCode==40)){var c=consoleHistory.indexOf(a.value);if((b.keyCode==38)&&((consoleHistory.length-1)>c)){a.value=consoleHistory[c+1]}else{if((b.keyCode==40)&&(c>0)){a.value=consoleHistory[c-1]}else{if((b.keyCode==40)&&(c==0)){a.value=""}}}d=1}else{if(b.key.length===1){insertTextAtCursor(a,b.key);d=1}}}}}}else{if(b.charCode!=0&&consoleFocus==0){a.value=((a.value+String.fromCharCode(b.charCode)));d=1}}if(d>0){return haltEvent(b)}}function insertTextAtCursor(a,d){if(document.selection){a.focus();sel=document.selection.createRange();sel.text=d}else{if(a.selectionStart||a.selectionStart=="0"){var c=a.selectionStart,b=a.selectionEnd;a.value=a.value.substring(0,c)+d+a.value.substring(b,a.value.length);a.setSelectionRange(b+1,b+1)}else{a.value+=myValue}}}var consoleNode;var consoleServerText="";function setupConsole(){if(xxcurrentView==115){var e=(consoleNode=="server");consoleNode="server";QH("p15deviceName","My Server Console");QE("p15consoleText",true);QH("p15statetext","");QH("p15coreName","");QV("p15outputselecttd",false);if(e==false){QH("p15agentConsoleText",consoleServerText);Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight}}else{var e=(consoleNode==currentNode);consoleNode=currentNode;var a=meshes[consoleNode.meshid];var b=a.links[userinfo._id].rights;if((b&16)!=0){if(consoleNode.consoleText==null){consoleNode.consoleText=""}if(e==false){QH("p15agentConsoleText",consoleNode.consoleText);Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight}var c=(((consoleNode.conn&1)!=0)||((consoleNode.conn&16)!=0))?true:false;var d=((consoleNode.conn&1)!=0)?"Agent is online":"Agent is offline";if((consoleNode.conn&16)!=0){d+=", MQTT is online"}QH("p15statetext",d);QE("p15consoleText",c);QE("p15uploadCore",((consoleNode.conn&1)!=0));QV("p15outputselecttd",(consoleNode.conn&17)==17)}else{QH("p15statetext","Access Denied");QE("p15consoleText",false);QE("p15uploadCore",false);QV("p15outputselecttd",false)}}}function p15consoleClear(){QH("p15agentConsoleText","");Q("id_p15consoleClear").blur();if(xxcurrentView==115){consoleServerText=""}else{consoleNode.consoleText=""}}var consoleHistory=[];function p15consoleSend(a){if(a&&a.keyCode!=13){return}var d=Q("p15consoleText").value,c="<div style=color:green>> "+EscapeHtml(d)+"<br/></div>";if(xxcurrentView==115){consoleServerText+=c;meshserver.send({action:"serverconsole",value:d})}else{if(((consoleNode.conn&16)!=0)&&((Q("p15outputselect").value==2)||((consoleNode.conn&1)==0))){c="<div style=color:orange>MQTT> "+EscapeHtml(d)+"<br/></div>";consoleNode.consoleText+=c;meshserver.send({action:"sendmqttmsg",topic:"console",nodeids:[consoleNode._id],msg:d})}else{consoleNode.consoleText+=c;meshserver.send({action:"msg",type:"console",nodeid:consoleNode._id,value:d})}}Q("p15agentConsoleText").innerHTML+=c;Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight;Q("p15consoleText").value="";if(d.length>0){var b=consoleHistory.indexOf(d);if(b>=0){consoleHistory.splice(b,1)}consoleHistory.unshift(d);consoleHistory.splice(10)}}function p15consoleReceive(b,a,c){if(b==="serverconsole"){a="<div>"+a+"</div>";consoleServerText+=a;if(consoleNode=="server"){Q("p15agentConsoleText").innerHTML+=a;Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight}}else{if(c=="MQTT"){a="<div style=color:red>MQTT> "+EscapeHtml(a)+"<br/></div>"}else{a="<div>"+a+"</div>"}if(b.consoleText==null){b.consoleText=a}else{b.consoleText+=a}if(consoleNode==b){Q("p15agentConsoleText").innerHTML+=a;Q("p15agentConsoleText").scrollTop=Q("p15agentConsoleText").scrollHeight}}}function p15downloadConsoleText(){saveAs(new Blob([Q("p15agentConsoleText").innerText],{type:"application/octet-stream"}),"console.txt")}function p15uploadCore(a){if(xxdialogMode){return}if(a.shiftKey==true){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"default"})}else{if(a.altKey==true){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"clear"})}else{if(a.ctrlKey==true){p15uploadCore2()}else{setDialogMode(2,"Perform Agent Action",3,p15uploadCoreEx,addHtmlValue("Action","<select id=d3coreMode style=width:230px><option value=1>Upload default server core</option><option value=2>Clear the core</option><option value=6>Upload recovery core</option><option value=3>Upload a core file</option><option value=4>Soft disconnect agent</option><option value=5>Hard disconnect agent</option></select>"))}}}}function p15uploadCoreEx(){if(Q("d3coreMode").value==1){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"default"})}else{if(Q("d3coreMode").value==2){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"clear"})}else{if(Q("d3coreMode").value==3){p15uploadCore2()}else{if(Q("d3coreMode").value==4){meshserver.send({action:"agentdisconnect",nodeid:consoleNode._id,disconnectMode:1})}else{if(Q("d3coreMode").value==5){meshserver.send({action:"agentdisconnect",nodeid:consoleNode._id,disconnectMode:2})}else{if(Q("d3coreMode").value==6){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"recovery"})}}}}}}}function p15uploadCore2(){if(xxdialogMode){return}Q("d3localmodeform").action="uploadmeshcorefile.ashx";Q("d3auth").value=authCookie;Q("d3attrib").value=currentNode._id;setDialogMode(3,"Upload Mesh Agent Core",3,p15uploadCoreEx2);d3init()}function p15uploadCoreEx2(){var b=Q("d3uploadMode").value;if(b==1){Q("d3submit").click()}else{var a=d3getFileSel();if(a.length==1){meshserver.send({action:"uploadagentcore",nodeid:consoleNode._id,type:"custom",path:d3filetreelocation.join("/")+"/"+a[0]})}}}function account_manageAuthApp(){if(xxdialogMode||((features&4096)==0)){return}if(userinfo.otpsecret==1){account_removeOtp()}else{account_addOtp()}return false}function account_addOtp(){if(xxdialogMode||(userinfo.otpsecret==1)||((features&4096)==0)){return}setDialogMode(2,"Authenticator App",2,function(){meshserver.send({action:"otpauth-setup",secret:Q("d2optsecret").attributes.secret.value,token:Q("d2otpauthinput").value})},"<div id=d2optinfo>Loading...</div>","otpauth-request");meshserver.send({action:"otpauth-request"})}function account_addOtpCheck(a){var b=(Q("d2otpauthinput").value.length==6);QE("idx_dlgOkButton",b);if(a&&(a.keyCode==13)&&b){dialogclose(1)}}function account_removeOtp(){if(xxdialogMode||(userinfo.otpsecret!=1)||((features&4096)==0)){return}setDialogMode(2,"Authenticator App",3,function(){meshserver.send({action:"otpauth-clear"})},"Confirm removal of authenticator application 2-step login?")}function account_manageOtp(a){if((xxdialogMode==2)&&(xxdialogTag=="otpauth-manage")){dialogclose(0)}if(xxdialogMode||((features&4096)==0)){return false}if((userinfo.otpsecret==1)||(userinfo.otphkeys>0)){meshserver.send({action:"otpauth-getpasswords",subaction:a})}return false}function account_manageHardwareOtp(){if((xxdialogMode==2)&&(xxdialogTag=="otpauth-hardware-manage")){dialogclose(0)}if(xxdialogMode||((features&4096)==0)){return false}meshserver.send({action:"otp-hkey-get"});return false}function account_addhkey(a){if(a==3){var b="Type in the name of the key to add.<br /><br />";b+=addHtmlValue("Key Name",'<input id=dp1keyname style=width:230px maxlength=20 autocomplete=off placeholder="MyKey" onkeyup=account_addhkeyValidate(event,2) />')}else{if(a==2){var b="Type in a key name, select the OTP box and press the button on the YubiKey™.<br /><br />";b+=addHtmlValue("Key Name",'<input id=dp1keyname style=width:230px maxlength=20 autocomplete=off placeholder="MyKey" onkeyup=account_addhkeyValidate(event,1) />');b+=addHtmlValue("YubiKey™ OTP","<input id=dp1key style=width:230px autocomplete=off onkeyup=account_addhkeyValidate(event,2) />")}}setDialogMode(2,"Add Security Key",3,account_addhkeyEx,b,a);Q("dp1keyname").focus()}function account_addhkeyValidate(b,a){if((b!=null)&&(b.keyCode==13)){if(a==2){dialogclose(1)}else{Q("dp1key").focus()}}}function account_addhkeyEx(a,c){var b=Q("dp1keyname").value;if(b==""){b="MyKey"}if(c==2){meshserver.send({action:"otp-hkey-yubikey-add",name:b,otp:Q("dp1key").value});setDialogMode(2,"Add Security Key",0,null,"<br />Checking...<br /><br /><br />","otpauth-hardware-manage")}else{if(c==3){meshserver.send({action:"webauthn-startregister",name:b})}}}function account_removehkey(a){meshserver.send({action:"otp-hkey-remove",index:a});meshserver.send({action:"otp-hkey-get"})}var loclist={af:"Afrikaans",sq:"Albanian",ar:"Arabic (Standard)","ar-dz":"Arabic (Algeria)","ar-bh":"Arabic (Bahrain)","ar-eg":"Arabic (Egypt)","ar-iq":"Arabic (Iraq)","ar-jo":"Arabic (Jordan)","ar-kw":"Arabic (Kuwait)","ar-lb":"Arabic (Lebanon)","ar-ly":"Arabic (Libya)","ar-ma":"Arabic (Morocco)","ar-om":"Arabic (Oman)","ar-qa":"Arabic (Qatar)","ar-sa":"Arabic (Saudi Arabia)","ar-sy":"Arabic (Syria)","ar-tn":"Arabic (Tunisia)","ar-ae":"Arabic (U.A.E.)","ar-ye":"Arabic (Yemen)",an:"Aragonese",hy:"Armenian",as:"Assamese",ast:"Asturian",az:"Azerbaijani",eu:"Basque",bg:"Bulgarian",be:"Belarusian",bn:"Bengali",bs:"Bosnian",br:"Breton",my:"Burmese",ca:"Catalan",ch:"Chamorro",ce:"Chechen",zh:"Chinese","zh-hk":"Chinese (Hong Kong)","zh-cn":"Chinese (PRC)","zh-sg":"Chinese (Singapore)","zh-tw":"Chinese (Taiwan)",cv:"Chuvash",co:"Corsican",cr:"Cree",hr:"Croatian",cs:"Czech",da:"Danish",nl:"Dutch (Standard)","nl-be":"Dutch (Belgian)",en:"English","en-au":"English (Australia)","en-bz":"English (Belize)","en-ca":"English (Canada)","en-ie":"English (Ireland)","en-jm":"English (Jamaica)","en-nz":"English (New Zealand)","en-ph":"English (Philippines)","en-za":"English (South Africa)","en-tt":"English (Trinidad & Tobago)","en-gb":"English (United Kingdom)","en-us":"English (United States)","en-zw":"English (Zimbabwe)",eo:"Esperanto",et:"Estonian",fo:"Faeroese",fa:"Farsi (Persian)",fj:"Fijian",fi:"Finnish",fr:"French (Standard)","fr-be":"French (Belgium)","fr-ca":"French (Canada)","fr-fr":"French (France)","fr-lu":"French (Luxembourg)","fr-mc":"French (Monaco)","fr-ch":"French (Switzerland)",fy:"Frisian",fur:"Friulian",gd:"Gaelic (Scots)","gd-ie":"Gaelic (Irish)",gl:"Galacian",ka:"Georgian",de:"German (Standard)","de-at":"German (Austria)","de-de":"German (Germany)","de-li":"German (Liechtenstein)","de-lu":"German (Luxembourg)","de-ch":"German (Switzerland)",el:"Greek",gu:"Gujurati",ht:"Haitian",he:"Hebrew",hi:"Hindi",hu:"Hungarian",is:"Icelandic",id:"Indonesian",iu:"Inuktitut",ga:"Irish",it:"Italian (Standard)","it-ch":"Italian (Switzerland)",ja:"Japanese",kn:"Kannada",ks:"Kashmiri",kk:"Kazakh",km:"Khmer",ky:"Kirghiz",tlh:"Klingon",ko:"Korean","ko-kp":"Korean (North Korea)","ko-kr":"Korean (South Korea)",la:"Latin",lv:"Latvian",lt:"Lithuanian",lb:"Luxembourgish",mk:"FYRO Macedonian",ms:"Malay",ml:"Malayalam",mt:"Maltese",mi:"Maori",mr:"Marathi",mo:"Moldavian",nv:"Navajo",ng:"Ndonga",ne:"Nepali",no:"Norwegian",nb:"Norwegian (Bokmal)",nn:"Norwegian (Nynorsk)",oc:"Occitan",or:"Oriya",om:"Oromo","fa-ir":"Persian/Iran",pl:"Polish",pt:"Portuguese","pt-br":"Portuguese (Brazil)",pa:"Punjabi","pa-in":"Punjabi (India)","pa-pk":"Punjabi (Pakistan)",qu:"Quechua",rm:"Rhaeto-Romanic",ro:"Romanian","ro-mo":"Romanian (Moldavia)",ru:"Russian","ru-mo":"Russian (Moldavia)",sz:"Sami (Lappish)",sg:"Sango",sa:"Sanskrit",sc:"Sardinian",sd:"Sindhi",si:"Singhalese",sr:"Serbian",sk:"Slovak",sl:"Slovenian",so:"Somani",sb:"Sorbian",es:"Spanish","es-ar":"Spanish (Argentina)","es-bo":"Spanish (Bolivia)","es-cl":"Spanish (Chile)","es-co":"Spanish (Colombia)","es-cr":"Spanish (Costa Rica)","es-do":"Spanish (Dominican Republic)","es-ec":"Spanish (Ecuador)","es-sv":"Spanish (El Salvador)","es-gt":"Spanish (Guatemala)","es-hn":"Spanish (Honduras)","es-mx":"Spanish (Mexico)","es-ni":"Spanish (Nicaragua)","es-pa":"Spanish (Panama)","es-py":"Spanish (Paraguay)","es-pe":"Spanish (Peru)","es-pr":"Spanish (Puerto Rico)","es-es":"Spanish (Spain)","es-uy":"Spanish (Uruguay)","es-ve":"Spanish (Venezuela)",sx:"Sutu",sw:"Swahili",sv:"Swedish","sv-fi":"Swedish (Finland)","sv-sv":"Swedish (Sweden)",ta:"Tamil",tt:"Tatar",te:"Teluga",th:"Thai",tig:"Tigre",ts:"Tsonga",tn:"Tswana",tr:"Turkish",tk:"Turkmen",uk:"Ukrainian",hsb:"Upper Sorbian",ur:"Urdu",ve:"Venda",vi:"Vietnamese",vo:"Volapuk",wa:"Walloon",cy:"Welsh",xh:"Xhosa",ji:"Yiddish",zu:"Zulu"};function account_showLocalizationSettings(){if(xxdialogMode){return false}var b=getstore("loctag",0);var c='<select id=d2locselect style=width:100%><option value="*">User browser value</option>';for(var a in loclist){c+='<option value="'+a+'"'+((b==a)?" selected":"")+">"+a+" - "+loclist[a]+"</option>"}c+="</select>";var d=addHtmlValue("Localization",c);setDialogMode(2,"Localization Settings",3,account_showLocalizationSettingsEx,d);return false}function account_showLocalizationSettingsEx(){var b=getstore("loctag",0);var a=Q("d2locselect").value;if(b!=a){if(a!="*"){args.locale=a}else{delete args.locale}putstore("loctag",args.locale);masterUpdate(4294967295)}}function account_enableNotifications(){if(Notification){Notification.requestPermission().then(function(a){QV("accountEnableNotificationsSpan",a!="granted")})}return false}function account_showAccountNotifySettings(){if(xxdialogMode){return false}var b="";b+="<div><label><input id=p2notifyPlayNotifySound type=checkbox />Notification sound.</label></div>";b+="<div><label><input id=p2notifyIntelDeviceConnect type=checkbox />Device connections.</label></div>";b+="<div><label><input id=p2notifyIntelDeviceDisconnect type=checkbox />Device disconnections.</label></div>";b+="<div><label><input id=p2notifyIntelAmtKvmActions type=checkbox />Intel® AMT desktop and serial events.</label></div>";setDialogMode(2,"Notification Settings",3,account_showAccountNotifySettingsEx,b);var a=getstore("notifications",0);Q("p2notifyPlayNotifySound").checked=(a&1);Q("p2notifyIntelDeviceConnect").checked=(a&2);Q("p2notifyIntelDeviceDisconnect").checked=(a&4);Q("p2notifyIntelAmtKvmActions").checked=(a&8);return false}function account_showAccountNotifySettingsEx(){var a=0;a+=Q("p2notifyPlayNotifySound").checked?1:0;a+=Q("p2notifyIntelDeviceConnect").checked?2:0;a+=Q("p2notifyIntelDeviceDisconnect").checked?4:0;a+=Q("p2notifyIntelAmtKvmActions").checked?8:0;putstore("notifications",a)}function account_showVerifyEmail(){if(xxdialogMode||(userinfo.emailVerified==true)||(serverinfo.emailcheck!=true)){return false}var a="Click ok to send a verification mail to:<br /><div style=padding:8px><b>"+EscapeHtml(userinfo.email)+"</b></div>Please wait a few minute to receive the verification.";setDialogMode(2,"Email Verification",3,account_showVerifyEmailEx,a);return false}function account_showVerifyEmailEx(){meshserver.send({action:"verifyemail",email:userinfo.email})}function account_showChangeEmail(){if(xxdialogMode){return false}var a="Change your account email address here.<br /><br />";a+=addHtmlValue("Email","<input id=dp2email style=width:230px maxlength=256 onchange=account_validateEmail() onkeyup=account_validateEmail(event) />");setDialogMode(2,"Email Address Change",3,account_changeEmail,a);if(userinfo.email!=null){Q("dp2email").value=userinfo.email}account_validateEmail();Q("dp2email").focus();return false}function account_validateEmail(a,b){QE("idx_dlgOkButton",validateEmail(Q("dp2email").value)&&(Q("dp2email").value!=userinfo.email));if((a!=null)&&(a.keyCode==13)){dialogclose(1)}}function account_changeEmail(){meshserver.send({action:"changeemail",email:Q("dp2email").value})}function account_showDeleteAccount(){if(xxdialogMode){return false}var a="To delete this account, type in the account password in both boxes below and hit ok.<br /><br />";a+="<form method=post><input type=hidden name=action value=deleteaccount /><input type=hidden name=authcookie value="+authCookie+" /><table style=margin-left:80px><tr>";a+="<td align=right>Password:</td><td><input id=apassword1 type=password name=apassword1 autocomplete=off onchange=account_validateDeleteAccount() onkeyup=account_validateDeleteAccount() /></td>";a+="</tr><tr><td align=right>Password:</td><td><input id=apassword2 type=password name=apassword2 autocomplete=off onchange=account_validateDeleteAccount() onkeyup=account_validateDeleteAccount() /></td>";a+="</tr></table><br /><div style=padding:10px;margin-bottom:4px>";a+="<input id=account_dlgCancelButton type=button value=Cancel style=float:right;width:80px;margin-left:5px onclick=dialogclose(0)>";a+='<input id=account_dlgOkButton type=submit value=OK style="float:right;width:80px" onclick=dialogclose(1)>';a+="</div><br /></form>";setDialogMode(2,"Delete Account",0,null,a);account_validateDeleteAccount();Q("apassword1").focus();return false}function account_showChangePassword(){if(xxdialogMode){return false}var d="Change your account password by entering the old password and new password twice in the boxes below.";if(features&65536){" Password hint can be used but is not recommanded."}d+="<br /><br />";d+="<table style=margin-left:60px>";d+="<tr><td align=right>Old password:</td><td><input id=apassword0 type=password name=apassword0 autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /> <b></b></td></tr>";d+="<tr><td align=right>New password:</td><td><input id=apassword1 type=password name=apassword1 autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /> <b><span id=dxPassWarn></span></b></td></tr>";d+="<tr><td align=right>New password:</td><td><input id=apassword2 type=password name=apassword2 autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /></td></tr>";if(features&65536){d+="<tr><td align=right>Password hint:</td><td><input id=apasswordhint name=apasswordhint maxlength=250 type=text autocomplete=off onchange=account_validateNewPassword() onkeyup=account_validateNewPassword() onkeydown=account_validateNewPassword() /></td></tr>"}d+="</table>";if(passRequirements){var b=[],c=0;for(var a in passRequirements){if((a!="reset")&&(a!="hint")){b.push(a+":"+passRequirements[a]);c++}}if(c>0){d+="<br /><span style=font-size:x-small>Requirements: "+b.join(", ")+".</span>"}}d+="<br />";setDialogMode(2,"Change Password",3,account_showChangePasswordEx,d);Q("apassword0").focus();account_validateNewPassword();return false}function account_showChangePasswordEx(){if(Q("apassword1").value==Q("apassword2").value){var a={action:"changepassword",oldpass:Q("apassword0").value,newpass:Q("apassword1").value};if(features&65536){a.hint=Q("apasswordhint").value}meshserver.send(a)}}function account_createMesh(){if(xxdialogMode){return false}if((userinfo.siteadmin!=4294967295)&&((userinfo.siteadmin&64)!=0)){setDialogMode(2,"New Device Group",1,null,"This account does not have the rights to create a new device group.");return false}if((userinfo.emailVerified!==true)&&(serverinfo.emailcheck==true)&&(userinfo.siteadmin!=4294967295)){setDialogMode(2,"Account Security",1,null,'Unable to access a device until a email address is verified. This is required for password recovery. Go to the "My Account" tab to change and verify an email address.');return false}if((features&262144)&&!((userinfo.otpsecret==1)||(userinfo.otphkeys>0)||(userinfo.otpkeys>0))){setDialogMode(2,"Account Security",1,null,'Unable to access a device until two-factor authentication is enabled. This is required for extra security. Go to the "My Account" tab and look at the "Account Security" section.');return false}var a="Create a new device group using the options below.<br /><br />";a+=addHtmlValue("Name","<input id=dp2meshname style=width:230px maxlength=64 onchange=account_validateMeshCreate() onkeyup=account_validateMeshCreate(event,1) />");a+=addHtmlValue("Type","<div style=width:230px;margin:0;padding:0><select id=dp2meshtype style=width:100% onchange=account_validateMeshCreate() onkeyup=account_validateMeshCreate(event,2) ><option value=2>Manage using a software agent</option><option value=1>Intel® AMT only, no agent</option></select></div>");a+=addHtmlValue("Description","<div style=width:230px;margin:0;padding:0><textarea id=dp2meshdesc maxlength=1024 style=width:100%;resize:none></textarea></div>");setDialogMode(2,"New Device Group",3,account_createMeshEx,a);account_validateMeshCreate();Q("dp2meshname").focus();return false}function account_validateMeshCreate(a,b){if((b==1)&&(a!=null)&&(a.key=="Enter")&&(Q("dp2meshname").value.length>0)){Q("dp2meshtype").focus()}if((b==2)&&(a!=null)&&(a.key=="Enter")){Q("dp2meshdesc").focus()}QE("idx_dlgOkButton",Q("dp2meshname").value.length>0)}function account_createMeshEx(a,b){meshserver.send({action:"createmesh",meshname:Q("dp2meshname").value,meshtype:Q("dp2meshtype").value,desc:Q("dp2meshdesc").value})}function account_validateDeleteAccount(){QE("account_dlgOkButton",(Q("apassword1").value.length>0)&&(Q("apassword1").value==Q("apassword2").value))}function account_validateNewPassword(){var d="",a=(Q("apassword0").value.length>0)&&(Q("apassword1").value.length>0)&&(Q("apassword1").value==Q("apassword2").value)&&(Q("apassword0").value!=Q("apassword1").value);if((features&65536)&&(Q("apasswordhint").value==Q("apassword1").value)){a=false}if(Q("apassword1").value!=""){if(passRequirements==null||passRequirements==""){var c=checkPasswordStrength(Q("apassword1").value);if(c>=80){d="<span style=color:green>Strong<span>"}else{if(c>=60){d="<span style=color:blue>Good<span>"}else{d="<span style=color:red>Weak<span>"}}}else{var b=checkPasswordRequirements(Q("apassword1").value,passRequirements);if(b==false){a=false;d="<span style=color:red>Policy<span>"}}}QH("dxPassWarn",d);QE("idx_dlgOkButton",a)}function checkPasswordStrength(e){var g=0,d={},h=0,j={digits:/\d/.test(e),lower:/[a-z]/.test(e),upper:/[A-Z]/.test(e),nonWords:/\W/.test(e)};if(!e){return 0}for(var b=0;b<e.length;b++){d[e[b]]=(d[e[b]]||0)+1;g+=5/d[e[b]]}for(var a in j){h+=(j[a]==true)?1:0}return parseInt(g+(h-1)*10)}function checkPasswordRequirements(e,g){if((g==null)||(g=="")||(typeof g!="object")){return true}if(g.min){if(e.length<g.min){return false}}if(g.max){if(e.length>g.max){return false}}var d=0,b=0,h=0,c=0;for(var a=0;a<e.length;a++){if(/\d/.test(e[a])){d++}if(/[a-z]/.test(e[a])){b++}if(/[A-Z]/.test(e[a])){h++}if(/\W/.test(e[a])){c++}}if(g.num&&(d<g.num)){return false}if(g.lower&&(b<g.lower)){return false}if(g.upper&&(h<g.upper)){return false}if(g.nonalpha&&(c<g.nonalpha)){return false}return true}function updateMeshes(){var e="";var a=0,b=0;for(i in meshes){if(a>1){e+="</tr><tr>";a=0}a++;b++;var d=0;if(meshes[i].links[userinfo._id]){d=meshes[i].links[userinfo._id].rights}var g="Partial Rights";if(d==4294967295){g="Full Administrator"}else{if(d==0){g="No Rights"}}e+="<div onmouseover=devMouseHover(this,1) onmouseout=devMouseHover(this,0) style=display:inline-block;width:431px;height:50px;padding-top:1px;padding-bottom:1px;float:left><div style=float:left;width:30px;height:100%></div><div tabindex=0 style=height:100%;cursor:pointer onclick=gotoMesh('"+i+"') onkeypress=\"if (event.key=='Enter') gotoMesh('"+i+"')\"><div class=mi style=float:left;width:50px;height:50px></div><div style=height:100%><div class=g1></div><div class=e2 style=width:300px><div class=e1>"+EscapeHtml(meshes[i].name)+"</div><div>"+g+"</div></div><div class=g2 style=float:left></div></div></div></div>"}meshcount=b;QH("p2meshes",e);QV("p2noMeshFound",b==0)}function gotoMesh(a){currentMesh=meshes[a];p20updateMesh();go(20);return false}function server_showRestoreDlg(){if(xxdialogMode){return false}var a="Restore the server using a backup, <span style=color:red>this will delete the existing server data</span>. Only do this if you know what you are doing.<br /><br />";a+='<form action="/restoreserver.ashx" enctype="multipart/form-data" method="post"><div>';a+="<input type=hidden name=auth value="+authCookie+">";a+='<input id=account_dlgFileInput type=file name=datafile style=width:100% accept=".zip,application/octet-stream,application/zip,application/x-zip,application/x-zip-compressed" onchange=account_validateServerRestore()>';a+="<input id=account_dlgCancelButton type=button value=Cancel style=float:right;width:80px;margin-left:5px onclick=dialogclose(0)>";a+="<input id=account_dlgOkButton type=submit value=OK style=float:right;width:80px onclick=dialogclose(1)>";a+="</div><br /><br /></form>";setDialogMode(2,"Restore Server",0,null,a);account_validateServerRestore();return false}function account_validateServerRestore(){QE("account_dlgOkButton",Q("account_dlgFileInput").files.length==1)}function server_showVersionDlg(){if(xxdialogMode){return false}setDialogMode(2,"MeshCentral Version",1,null,"Loading...","MeshCentralServerUpdate");meshserver.send({action:"serverversion"});return false}function server_showVersionDlgUpdate(){QE("idx_dlgOkButton",Q("d2updateCheck").checked)}function server_showVersionDlgEx(){meshserver.send({action:"serverupdate"})}function server_showErrorsDlg(){if(xxdialogMode){return false}setDialogMode(2,"MeshCentral Errors",1,null,"Loading...","MeshCentralServerErrors");meshserver.send({action:"servererrors"});return false}function server_showErrorsDlgUpdate(){QE("idx_dlgOkButton",Q("d2updateCheck").checked)}function server_showErrorsDlgEx(){meshserver.send({action:"serverclearerrorlog"})}function d2CopyServerErrorsToClip(){saveAs(new Blob([Q("d2ServerErrorsLogPre").innerText],{type:"application/octet-stream"}),"servererrors.txt")}var currentMesh;function p20updateMesh(){if(currentMesh==null){return}QH("p20meshName",EscapeHtml(currentMesh.name));var m="Unknown #"+currentMesh.mtype;var l=0;try{l=currentMesh.links[userinfo._id].rights}catch(d){}if(currentMesh.mtype==1){m="Intel® AMT only, no agent"}if(currentMesh.mtype==2){m="Managed using a software agent"}var t="";t+=addHtmlValue("Name",addLinkConditional(EscapeHtml(currentMesh.name),"p20editmesh(1)",(l&1)!=0));t+=addHtmlValue("Description",addLinkConditional(((currentMesh.desc&¤tMesh.desc!="")?EscapeHtml(currentMesh.desc):"<i>None</i>"),"p20editmesh(2)",(l&1)!=0));t+=addHtmlValue("Type",m);if(currentMesh.mtype==2){var h=[];if(currentMesh.flags){if(currentMesh.flags&1){h.push("Auto-Remove")}if(currentMesh.flags&2){h.push("Hostname Sync")}}h=h.join(", ");if(h==""){h="<i>None</i>"}t+=addHtmlValue("Features",addLinkConditional(h,"p20editmeshfeatures()",l&1))}if(currentMesh.mtype==2){h=[];var a=0;if(currentMesh.consent){a=currentMesh.consent}if(serverinfo.consent){a|=serverinfo.consent}if((a&64)&&(a&8)){h.push("Desktop Prompt+Toolbar")}else{if(a&64){h.push("Desktop Toolbar")}else{if(a&8){h.push("Desktop Prompt")}else{if(a&1){h.push("Desktop Notify")}}}}if(a&16){h.push("Terminal Prompt")}else{if(a&2){h.push("Terminal Notify")}}if(a&32){h.push("Files Prompt")}else{if(a&4){h.push("Files Notify")}}if(a==7){h=["Always Notify"]}if((a&56)==56){h=["Always Prompt"]}h=h.join(", ");if(h==""){h="<i>None</i>"}t+=addHtmlValue("User Consent",addLinkConditional(h,"p20editmeshconsent()",l&1))}var j=0,k=[];if(userinfo.links&&userinfo.links[currentMesh._id]&&userinfo.links[currentMesh._id].notify){j=userinfo.links[currentMesh._id].notify}if(j&2){k.push("Connect")}if(j&4){k.push("Disconnect")}if(j&8){k.push("Intel® AMT")}if(k.length==0){k.push("None")}t+=addHtmlValue("Notifications",addLink(k.join(", "),"p20editMeshNotify()"));var g="No Policy";if(currentMesh.amt){if(currentMesh.amt.type==1){g="Deactivate Client Control Mode (CCM)"}else{if(currentMesh.amt.type==2){g="Simple Client Control Mode (CCM)";if(currentMesh.amt.cirasetup==2){g+=" + CIRA"}}else{if(currentMesh.amt.type==3){g="Simple Admin Control Mode (ACM)";if(currentMesh.amt.cirasetup==2){g+=" + CIRA"}}}}}t+=addHtmlValue("Intel® AMT",addLinkConditional(g,"p20editMeshAmt()",l&1));if(l&1){t+='<br><input type=button value=Notes title="View notes about this device group" onclick=showNotes(false,"'+encodeURIComponent(currentMesh._id)+'") />'}t+="<br style=clear:both><br>";var c=currentMesh.links[userinfo._id];if(c&&((c.rights&2)!=0)){t+='<a href=# onclick="return p20showAddMeshUserDialog()" style=cursor:pointer;margin-right:10px><img src=images/icon-addnew.png border=0 height=12 width=12> Add Users</a>'}if((l&4)!=0){if(currentMesh.mtype==1){t+="<a href=# onclick='return addCiraDeviceToMesh(\""+currentMesh._id+'")\' style=cursor:pointer;margin-right:10px title="Add a new Intel® AMT computer that is located on the internet."><img src=images/icon-installmesh.png border=0 height=12 width=12> Install CIRA</a>';t+="<a href=# onclick='return addDeviceToMesh(\""+currentMesh._id+'")\' style=cursor:pointer;margin-right:10px title="Add a new Intel® AMT computer that is located on the local network."><img src=images/icon-installmesh.png border=0 height=12 width=12> Install local</a>';if(currentMesh.amt&&(currentMesh.amt.type==2)){t+="<a href=# onclick='return showCcmActivation(\""+currentMesh._id+'")\' style=cursor:pointer;margin-right:10px title="Perform Intel AMT client control mode (CCM) activation."><img src=images/icon-installmesh.png border=0 height=12 width=12> Activation</a>'}else{if(currentMesh.amt&&(currentMesh.amt.type==3)&&((features&1048576)!=0)){t+="<a href=# onclick='return showAcmActivation(\""+currentMesh._id+'")\' style=cursor:pointer;margin-right:10px title="Perform Intel AMT admin control mode (ACM) activation."><img src=images/icon-installmesh.png border=0 height=12 width=12> Activation</a>'}}}if(currentMesh.mtype==2){t+="<a href=# onclick='return addAgentToMesh(\""+currentMesh._id+'")\' style=cursor:pointer;margin-right:10px title="Add a new computer to this mesh by installing the mesh agent."><img src=images/icon-addnew.png border=0 height=12 width=12> Install</a>';t+="<a href=# onclick='return inviteAgentToMesh(\""+currentMesh._id+'")\' style=cursor:pointer;margin-right:10px title="Invite someone to install the mesh agent on this mesh."><img src=images/icon-addnew.png border=0 height=12 width=12> Invite</a>'}}t+='<table style="color:black;background-color:#EEE;border-color:#AAA;border-width:1px;border-style:solid;border-collapse:collapse" border=0 cellpadding=2 cellspacing=0 width=100%><tbody><tr style=background-color:#AAAAAA;font-weight:bold><th scope=col style=text-align:left;width:430px>User Authorizations</th><th scope=col style=text-align:left></th></tr>';var b=1,p=[];for(var e in currentMesh.links){var s=e.split("/")[2];if(currentMesh.links[e].name){s=currentMesh.links[e].name}if(e==userinfo._id){s=userinfo.name}p.push({id:e,name:s,rights:currentMesh.links[e].rights})}p.sort(function(r,u){if(r.name>u.name){return 1}if(r.name<u.name){return -1}return 0});for(var e in p){var q="",o="Partial Rights",n=p[e].rights;if(n==4294967295){o="Full Administrator"}else{if(n==0){o="No Rights"}}if((p[e].id!=userinfo._id)&&(l==4294967295||(((l&2)!=0)))){q="<a href=# onclick='return p20deleteUser(event,\""+encodeURIComponent(p[e].id)+'")\' title="Remote user rights to this mesh" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'}t+='<tr tabindex=0 onclick=p20viewuser("'+encodeURIComponent(p[e].id)+"\") onkeypress=\"if (event.key=='Enter') p20viewuser('"+encodeURIComponent(p[e].id)+"')\" style=cursor:pointer"+(((b%2)==0)?";background-color:#DDD":"")+'><td><div title="User" class=m2></div><div> '+EscapeHtml(decodeURIComponent(p[e].name))+"<div></div></div></td><td><div style=float:right>"+q+"</div><div>"+o+"</div></td></tr>";++b}t+="</tbody></table>";if(l==4294967295){t+="<div style=font-size:x-small;text-align:right><span><a href=# onclick=p20showDeleteMeshDialog() style=cursor:pointer>Delete Group</a></span></div>"}QH("p20info",t)}function p20editMeshAmt(){if(xxdialogMode){return}var b="",a="";if((features&1048576)!=0){a="<option value=3>Simple Admin Control Mode (ACM)</option>"}if(currentMesh.mtype==1){b+=addHtmlValue("Type","<select id=dp20amtpolicy style=width:230px onchange=p20editMeshAmtChange()><option value=0>No Policy</option><option value=2>Simple Client Control Mode (CCM)</option>"+a+"</select>")}else{b+=addHtmlValue("Type","<select id=dp20amtpolicy style=width:230px onchange=p20editMeshAmtChange()><option value=0>No Policy</option><option value=1>Deactivate Client Control Mode (CCM)</option><option value=2>Simple Client Control Mode (CCM)</option>"+a+"</select>")}b+="<div id=dp20amtpolicydiv></div>";setDialogMode(2,"Intel® AMT Policy",3,p20editMeshAmtEx,b);if(currentMesh.amt){Q("dp20amtpolicy").value=currentMesh.amt.type}p20editMeshAmtChange();if(currentMesh.amt&&(currentMesh.amt.type==2)||(currentMesh.amt.type==3)){Q("dp20amtpolicypass").value=currentMesh.amt.password;if((currentMesh.amt.type==2)&&(currentMesh.amt.badpass!=null)){Q("dp20amtbadpass").value=currentMesh.amt.badpass}if((features&1024)==0){Q("dp20amtcira").value=currentMesh.amt.cirasetup}}dp20amtValidatePolicy()}function p20editMeshAmtChange(){var a=Q("dp20amtpolicy").value,b="";if(a>=2){b=addHtmlValue("Password*","<input id=dp20amtpolicypass type=password style=width:230px maxlength=32 onchange=dp20amtValidatePolicy() onkeyup=dp20amtValidatePolicy() autocomplete=off />");b+=addHtmlValue("Password*","<input id=dp20amtpolicypass2 type=password style=width:230px maxlength=32 onchange=dp20amtValidatePolicy() onkeyup=dp20amtValidatePolicy() autocomplete=off />");if((a==2)&&(currentMesh.mtype==2)){b+=addHtmlValue("Password mismatch","<select id=dp20amtbadpass style=width:230px><option value=0>Do nothing</option><option value=1>Reactivate Intel® AMT</option></select>")}if((features&1024)==0){if(a==2){b+=addHtmlValue('<span title="Client Initiated Remote Access">CIRA</span>',"<select id=dp20amtcira style=width:230px><option value=0>Don't configure</option><option value=1>Don't connect to server</option><option value=2>Connect to server</option></select>")}else{b+=addHtmlValue('<span title="Client Initiated Remote Access">CIRA</span>',"<select id=dp20amtcira style=width:230px><option value=0>Don't configure</option><option value=2>Connect to server</option></select>")}}b+='<br/><span style="font-size:10px">* Leave blank to assign a random password to each device.</span><br/>';if(currentMesh.mtype==2){if(a==2){b+='<span style="font-size:10px">This policy will not impact devices with Intel® AMT in ACM mode.</span><br/>';b+='<span style="font-size:10px">This is not a secure policy as agents will be performing activation.</span>'}else{b+='<span style="font-size:10px">During activation, the agent will have access to admin password infomation.</span>'}}}QH("dp20amtpolicydiv",b);setTimeout(dp20amtValidatePolicy,1)}function dp20amtValidatePolicy(){var a=true,d=Q("dp20amtpolicy").value;if((d==2)||(d==3)){var b=Q("dp20amtpolicypass").value,c=Q("dp20amtpolicypass2").value;a=((b===c)&&((b==="")?true:passwordcheck(b)))}QE("idx_dlgOkButton",a)}function p20editMeshAmtEx(){var b=parseInt(Q("dp20amtpolicy").value),a={type:b};if(b==2){a={type:b,password:Q("dp20amtpolicypass").value};if(currentMesh.mtype==2){a.badpass=parseInt(Q("dp20amtbadpass").value)}if((features&1024)==0){a.cirasetup=parseInt(Q("dp20amtcira").value)}else{a.cirasetup=1}}else{if(b==3){a={type:b,password:Q("dp20amtpolicypass").value};if((features&1024)==0){a.cirasetup=parseInt(Q("dp20amtcira").value)}else{a.cirasetup=1}}}meshserver.send({action:"meshamtpolicy",meshid:currentMesh._id,amtpolicy:a})}function p20showDeleteMeshDialog(){if(xxdialogMode){return false}var a='Are you sure you want to delete group "'+EscapeHtml(currentMesh.name)+'"? Deleting the device group will also delete all information about devices within this group.<br /><br />';a+="<label><input id=p20check type=checkbox onchange=p20validateDeleteMeshDialog() />Confirm</label>";setDialogMode(2,"Delete Group",3,p20showDeleteMeshDialogEx,a);p20validateDeleteMeshDialog();return false}function p20validateDeleteMeshDialog(){QE("idx_dlgOkButton",Q("p20check").checked)}function p20showDeleteMeshDialogEx(a,b){meshserver.send({action:"deletemesh",meshid:currentMesh._id,meshname:currentMesh.name})}function p20editmesh(a){if(xxdialogMode){return}var b=addHtmlValue("Name","<input id=dp20meshname style=width:230px maxlength=32 onchange=p20editmeshValidate() onkeyup=p20editmeshValidate(event) />");b+=addHtmlValue("Description","<div style=width:230px;margin:0;padding:0><textarea id=dp20meshdesc maxlength=1024 style=width:100%;resize:none></textarea></div>");setDialogMode(2,"Edit Device Group",3,p20editmeshEx,b);Q("dp20meshname").value=currentMesh.name;if(currentMesh.desc){Q("dp20meshdesc").value=currentMesh.desc}p20editmeshValidate();if(a==2){Q("dp20meshdesc").focus()}else{Q("dp20meshname").focus()}}function p20editmeshEx(){meshserver.send({action:"editmesh",meshid:currentMesh._id,meshname:Q("dp20meshname").value,desc:Q("dp20meshdesc").value})}function p20editmeshValidate(a){QE("idx_dlgOkButton",Q("dp20meshname").value.length>0);if(a&&a.key=="Enter"){Q("dp20meshdesc").focus()}}function p20editmeshconsent(){if(xxdialogMode){return}var b="",a=(currentMesh.consent)?currentMesh.consent:0;b+='<div style="width:100%;border-bottom:1px solid gray;margin-bottom:5px"><b>Desktop</b></div>';b+="<div><label><input type=checkbox id=d20flag1 "+((a&1)?"checked":"")+">Notify user</label></div>";b+="<div><label><input type=checkbox id=d20flag2 "+((a&8)?"checked":"")+">Prompt for user consent</label></div>";if(debugmode){b+="<div><label><input type=checkbox id=d20flag7 "+((a&64)?"checked":"")+">Show connection toolbar</label></div>"}b+='<div style="width:100%;border-bottom:1px solid gray;margin-bottom:5px;margin-top:8px"><b>Terminal</b></div>';b+="<div><label><input type=checkbox id=d20flag3 "+((a&2)?"checked":"")+">Notify user</label></div>";b+="<div><label><input type=checkbox id=d20flag4 "+((a&16)?"checked":"")+">Prompt for user consent</label></div>";b+='<div style="width:100%;border-bottom:1px solid gray;margin-bottom:5px;margin-top:8px"><b>Files</b></div>';b+="<div><label><input type=checkbox id=d20flag5 "+((a&4)?"checked":"")+">Notify user</label></div>";b+="<div><label><input type=checkbox id=d20flag6 "+((a&32)?"checked":"")+">Prompt for user consent</label></div>";setDialogMode(2,"Edit Device Group User Consent",3,p20editmeshconsentEx,b);if(serverinfo.consent){if(serverinfo.consent&1){Q("d20flag1").checked=true}if(serverinfo.consent&8){Q("d20flag2").checked=true}if(serverinfo.consent&2){Q("d20flag3").checked=true}if(serverinfo.consent&16){Q("d20flag4").checked=true}if(serverinfo.consent&4){Q("d20flag5").checked=true}if(serverinfo.consent&32){Q("d20flag6").checked=true}if(debugmode){if(serverinfo.consent&64){Q("d20flag7").checked=true}}QE("d20flag1",!(serverinfo.consent&1));QE("d20flag2",!(serverinfo.consent&8));QE("d20flag3",!(serverinfo.consent&2));QE("d20flag4",!(serverinfo.consent&16));QE("d20flag5",!(serverinfo.consent&4));QE("d20flag6",!(serverinfo.consent&32));if(debugmode){QE("d20flag7",!(serverinfo.consent&64))}}}function p20editmeshconsentEx(){var a=0;if(Q("d20flag1").checked){a+=1}if(Q("d20flag2").checked){a+=8}if(Q("d20flag3").checked){a+=2}if(Q("d20flag4").checked){a+=16}if(Q("d20flag5").checked){a+=4}if(Q("d20flag6").checked){a+=32}if(debugmode){if(Q("d20flag7").checked){a+=64}}meshserver.send({action:"editmesh",meshid:currentMesh._id,consent:a})}function p20editmeshfeatures(){if(xxdialogMode){return}var a=(currentMesh.flags)?currentMesh.flags:0;var b="<div><label><input type=checkbox id=d20flag1 "+((a&1)?"checked":"")+">Remove device on disconnect</label><br></div>";b+="<div><label><input type=checkbox id=d20flag2 "+((a&2)?"checked":"")+">Sync server device name to hostname</label><br></div>";setDialogMode(2,"Edit Device Group Features",3,p20editmeshfeaturesEx,b)}function p20editmeshfeaturesEx(){var a=0;if(Q("d20flag1").checked){a+=1}if(Q("d20flag2").checked){a+=2}meshserver.send({action:"editmesh",meshid:currentMesh._id,flags:a})}function p20showAddMeshUserDialog(d){if(xxdialogMode){return false}var e="";if(d==null){e+="Allow users to manage this device group and devices in this group.";if(features&524288){e+=" Users need to login to this server once before they can be added to a device group."}e+="<br /><br /><div style='position:relative'>";e+=addHtmlValue("User Names",'<input id=dp20username style=width:230px maxlength=32 onchange=p20validateAddMeshUserDialog() onkeyup=p20validateAddMeshUserDialog() placeholder="user1, user2, user3" />');e+="<div id=dp20usersuggest class=suggestionBox style='top:30px;left:130px;display:none'></div>";e+="</div><br>"}else{d=decodeURIComponent(d);var c=d.split("/")[2];if(users&&users[d]){c=users[d].name}if(userinfo._id==d){c=userinfo.name}e+="Group permissions for user "+c+".<br /><br />"}e+='<div style="height:120px;overflow-y:scroll;border:1px solid gray">';e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20fulladmin>Full Administrator</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20editmesh>Edit Device Group</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20manageusers>Manage Device Group Users</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20managecomputers>Manage Device Group Computers</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20remotecontrol>Remote Control</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20remoteview style=margin-left:12px>Remote View Only</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20remotelimitedinput style=margin-left:12px>Limited Input Only</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20noterminal style=margin-left:12px>No Terminal Access</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20nofiles style=margin-left:12px>No File Access</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20noamt style=margin-left:12px>No Intel® AMT</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20meshagentconsole>Mesh Agent Console</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20meshserverfiles>Server Files</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20wakedevices>Wake Devices</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20editnotes>Edit Device Notes</label><br>";e+="<label><input type=checkbox onchange=p20validateAddMeshUserDialog() id=p20limitevents>Show Only Own Events</label><br>";e+="</div>";if(d==null){setDialogMode(2,"Add Users to Device Group",3,p20showAddMeshUserDialogEx,e);Q("dp20username").focus()}else{setDialogMode(2,"Edit User Device Group Permissions",7,p20showAddMeshUserDialogEx,e,d);var a=currentMesh.links[userinfo._id].rights,b=currentMesh.links[d].rights;if(b==4294967295){Q("p20fulladmin").checked=true}else{if(b&1){Q("p20editmesh").checked=true}if(b&2){Q("p20manageusers").checked=true}if(b&4){Q("p20managecomputers").checked=true}if(b&8){Q("p20remotecontrol").checked=true;if(b&256){Q("p20remoteview").checked=true}if(b&512){Q("p20remotelimitedinput").checked=true}if(b&1024){Q("p20noterminal").checked=true}if(b&2048){Q("p20nofiles").checked=true}if(b&4096){Q("p20noamt").checked=true}}if(b&16){Q("p20meshagentconsole").checked=true}if(b&32){Q("p20meshserverfiles").checked=true}if(b&64){Q("p20wakedevices").checked=true}if(b&128){Q("p20editnotes").checked=true}if(b&8192){Q("p20limitevents").checked=true}}}p20validateAddMeshUserDialog();return false}function p20setname(b){b=decodeURIComponent(b);var c=Q("dp20username").value.split(",");for(var a in c){c[a]=c[a].trim()}c[c.length-1]=b;Q("dp20username").value=c.join(", ");p20validateAddMeshUserDialog();return false}function p20validateAddMeshUserDialog(){var g=currentMesh.links[userinfo._id].rights;var h=true;if(Q("dp20username")){var m=Q("dp20username").value.split(",");for(var b in m){var l=m[b]=m[b].trim();if(l.length==0){h=false}else{if(l.indexOf('"')>=0){h=false}}}var j=false,a=false;if(users!=null){var c=m[m.length-1].trim(),d=c.toLowerCase(),e=[];if(c.length>0){for(var b in users){if(users[b].name===c){a=true;break}if(users[b].name.toLowerCase().indexOf(d)>=0){e.push(users[b].name);if(e.length>=8){break}}}if((a==false)&&(e.length>0)){var k="";for(var b in e){k+="<a href=# onclick='p20setname(\""+encodeURIComponent(e[b])+"\")'>"+e[b]+"</a><br />"}QH("dp20usersuggest",k);j=true}}}QV("dp20usersuggest",j)}QE("idx_dlgOkButton",h);QE("p20fulladmin",g==4294967295);QE("p20editmesh",(!Q("p20fulladmin").checked)&&(g==4294967295));QE("p20manageusers",!Q("p20fulladmin").checked);QE("p20managecomputers",!Q("p20fulladmin").checked);QE("p20remotecontrol",!Q("p20fulladmin").checked);QE("p20meshagentconsole",!Q("p20fulladmin").checked);QE("p20meshserverfiles",!Q("p20fulladmin").checked);QE("p20wakedevices",!Q("p20fulladmin").checked);QE("p20editnotes",!Q("p20fulladmin").checked);QE("p20limitevents",!Q("p20fulladmin").checked);QE("p20remoteview",!Q("p20fulladmin").checked&&Q("p20remotecontrol").checked);QE("p20remotelimitedinput",!Q("p20fulladmin").checked&&Q("p20remotecontrol").checked&&!Q("p20remoteview").checked);QE("p20noterminal",!Q("p20fulladmin").checked&&Q("p20remotecontrol").checked);QE("p20nofiles",!Q("p20fulladmin").checked&&Q("p20remotecontrol").checked);QE("p20noamt",!Q("p20fulladmin").checked&&Q("p20remotecontrol").checked)}function p20showAddMeshUserDialogEx(a,e){if(a==2){p20viewuserEx(a,e)}else{var d=0;if(Q("p20fulladmin").checked==true){d=4294967295}else{if(Q("p20editmesh").checked==true){d+=1}if(Q("p20manageusers").checked==true){d+=2}if(Q("p20managecomputers").checked==true){d+=4}if(Q("p20remotecontrol").checked==true){d+=8}if(Q("p20meshagentconsole").checked==true){d+=16}if(Q("p20meshserverfiles").checked==true){d+=32}if(Q("p20wakedevices").checked==true){d+=64}if(Q("p20editnotes").checked==true){d+=128}if(Q("p20remoteview").checked==true){d+=256}if(Q("p20noterminal").checked==true){d+=512}if(Q("p20nofiles").checked==true){d+=1024}if(Q("p20noamt").checked==true){d+=2048}if(Q("p20remotelimitedinput").checked==true){d+=4096}if(Q("p20limitevents").checked==true){d+=8192}}if(e==null){var g=Q("dp20username").value.split(","),h=[];for(var c in g){h.push(g[c].trim())}meshserver.send({action:"addmeshuser",meshid:currentMesh._id,meshname:currentMesh.name,usernames:h,meshadmin:d})}else{meshserver.send({action:"addmeshuser",meshid:currentMesh._id,meshname:currentMesh.name,usernames:[e.split("/")[2]],meshadmin:d})}}}function p20viewuser(g){if(xxdialogMode){return}var j=decodeURIComponent(g);var b=currentMesh.links[userinfo._id].rights,c=currentMesh.links[j].rights;if(((userinfo._id)!=j)&&(b==4294967295||(((b&2)!=0)&&(c!=4294967295)))){p20showAddMeshUserDialog(g)}else{var d="";if(c==4294967295){d=", Full Administrator (all rights)"}else{if((c&1)!=0){d+=", Edit Device Group"}if((c&2)!=0){d+=", Manage Device Group Users"}if((c&4)!=0){d+=", Manage Device Group Computers"}if((c&8)!=0){d+=", Remote Control"}if((c&16)!=0){d+=", Agent Console"}if((c&32)!=0){d+=", Server Files"}if((c&64)!=0){d+=", Wake Devices"}if((c&128)!=0){d+=", Edit Notes"}if(((c&8)!=0)&&(c&256)!=0){d+=", Remote View Only"}if(((c&8)!=0)&&(c&512)!=0){d+=", No Terminal"}if(((c&8)!=0)&&(c&1024)!=0){d+=", No Files"}if(((c&8)!=0)&&(c&2048)!=0){d+=", No Intel® AMT"}if(((c&8)!=0)&&((c&4096)!=0)&&((c&256)==0)){d+=", Limited Input"}if((c&8192)!=0){d+=", Self Events Only"}}d=d.substring(2);if(d==""){d="No Rights"}var e=j.split("/")[2];if(users&&users[j]){e=users[j].name}if(userinfo._id==j){e=userinfo.name}var a=1,h=addHtmlValue("User Name",EscapeHtml(decodeURIComponent(e)));if(j.split("/")[2]!=e){h+=addHtmlValue("User Identifier",EscapeHtml(j.split("/")[2]))}h+=addHtmlValue("Permissions",d);if(((userinfo._id)!=j)&&(b==4294967295||(((b&2)!=0)&&(c!=4294967295)))){a+=4}setDialogMode(2,"Device Group User",a,p20viewuserEx,h,j)}}function p20viewuserEx(a,c){if(a!=2){return}var b=c.split("/")[2];if(users&&users[c]){b=users[c].name}if(userinfo._id==c){b=userinfo.name}setDialogMode(2,"Remote Mesh User",3,p20viewuserEx2,"Confirm removal of user "+EscapeHtml(decodeURIComponent(b))+"?",c)}function p20deleteUser(a,b){haltEvent(a);p20viewuserEx(2,decodeURIComponent(b));return false}function p20viewuserEx2(a,b){meshserver.send({action:"removemeshuser",meshid:currentMesh._id,meshname:currentMesh.name,userid:b})}function p20editMeshNotify(){if(xxdialogMode){return false}var a=0;if(userinfo.links&&userinfo.links[currentMesh._id]&&userinfo.links[currentMesh._id].notify){a=userinfo.links[currentMesh._id].notify}var b="Notification settings must also be turned on in account settings.<br /><br />";b+="<div><label><input id=p20notifyIntelDeviceConnect type=checkbox />Device connections.</label></div>";b+="<div><label><input id=p20notifyIntelDeviceDisconnect type=checkbox />Device disconnections.</label></div>";b+="<div><label><input id=p20notifyIntelAmtKvmActions type=checkbox />Intel® AMT desktop and serial events.</label></div>";setDialogMode(2,"Notification Settings",3,p20editMeshNotifyEx,b);Q("p20notifyIntelDeviceConnect").checked=(a&2);Q("p20notifyIntelDeviceDisconnect").checked=(a&4);Q("p20notifyIntelAmtKvmActions").checked=(a&8);return false}function p20editMeshNotifyEx(){var a=0;a+=Q("p20notifyIntelDeviceConnect").checked?2:0;a+=Q("p20notifyIntelDeviceDisconnect").checked?4:0;a+=Q("p20notifyIntelAmtKvmActions").checked?8:0;meshserver.send({action:"changemeshnotify",meshid:currentMesh._id,notify:a})}var filetreelinkpath;var filetreelocation=[];function updateFiles(){QV("MainMenuMyFiles",((features&8)==0));if((features&8)!=0){return}var q="",r="",c='<a href=# style=cursor:pointer onclick="return p5folderup(0)">Root</a>',o="Root",y,k=filetree,m=1;var j=[],v=filetreelinkpath,b=[],a=document.getElementsByName("fc");for(var s=0;s<a.length;s++){if(a[s].checked){b.push(a[s].value)}}filetreelinkpath="";for(var s in filetreelocation){if((k.f!=null)&&(k.f[filetreelocation[s]]!=null)){j.push(filetreelocation[s]);o+=" / "+filetreelocation[s];if((m==1)){var B=filetreelocation[s].split("/");y=window.location+B[0]+"files/"+B[2];filetreelinkpath+=filetreelocation[s]}else{if(filetreelinkpath!=""){filetreelinkpath+="/"+filetreelocation[s];if(m>2){y+="/"+filetreelocation[s]}}}k=k.f[filetreelocation[s]];c+=' / <a href=# style=cursor:pointer onclick="return p5folderup('+m+')">'+(k.n!=null?k.n:filetreelocation[s])+"</a>";m++}else{break}}filetreelocation=j;var w=o.toLowerCase().startsWith("root / "+userinfo._id+" / public");var l=p5sort_files(k.f);for(var s in l){var d=l[s],u=d.n,A;A=u;if(u.length>70){A='<span title="'+EscapeHtml(u)+'">'+EscapeHtml(u.substring(0,70))+"...</span>"}else{A=EscapeHtml(u)}u=EscapeHtml(u);var g="";if(d.d!=null){var e=new Date(d.d),g=printDateTime(e)+" "}var n="";if(d.s!=null){n=getFileSizeStr(d.s)}var p="";if(d.t<3||d.t==4){var z=(d.t==1||d.t==4)?p5getQuotabar(d):"",C="";p="<div class=filelist file=999><input file=999 style=float:left name=fc class=fcb type=checkbox onchange=p5setActions() value='"+u+"'> <span style=float:right title=\""+C+'">'+z+"</span><span><div class=fileIcon"+d.t+' onclick=p5folderset("'+encodeURIComponent(d.nx)+'")></div><a href=# style=cursor:pointer onclick=\'return p5folderset("'+encodeURIComponent(d.nx)+"\")'>"+A+"</a></span></div>"}else{var t=A,x="";if(w){x=' (<a style=cursor:pointer title="Display public link" onclick=\'return p5showPublicLink("'+y+"/"+d.nx+"\")'>Link</a>)"}if(d.s>0){t='<a rel="noreferrer noopener" target="_blank" download href="downloadfile.ashx?link='+encodeURIComponent(filetreelinkpath+"/"+d.nx)+'">'+A+"</a>"+x}p="<div class=filelist file=3><input file=3 style=float:left name=fc class=fcb type=checkbox onchange=p5setActions() value='"+d.nx+"'> <span class=fsize>"+g+"</span><span style=float:right>"+n+"</span><span><div class=fileIcon"+d.t+"></div>"+t+"</span></div>"}if(d.t<3){q+=p}else{r+=p}}QH("p5rightOfButtons",p5getQuotabar(k));QH("p5files",q+r);QH("p5currentpath",c);QE("p5FolderUp",filetreelocation.length!=0);QV("p5PublicShare",w);if(v==filetreelinkpath){a=document.getElementsByName("fc");for(var s=0;s<a.length;s++){a[s].checked=(b.indexOf(a[s].value)>=0)}}p5setActions()}function getNiceSize(a){if(a<=0){return"Storage limit exceed"}if(a<2048){return a+" bytes remaining"}if(a<2097152){return Math.round(a/1024)+" kilobytes remaining"}if(a<2147483648){return Math.round(a/1024/1024)+" megabytes remaining"}return Math.round(a/1024/1024/1024)+" gigabytes remaining"}function getNiceSize2(a){if(a<=0){return"None"}if(a<2048){return a+" b"}if(a<2097152){return Math.round(a/1024)+" Kb"}if(a<2147483648){return Math.round(a/1024/1024)+" Mb"}return Math.round(a/1024/1024/1024)+" Gb"}function p5getQuotabar(a){while(a.t>1&&a.t!=4){a=a.parent}if((a.t!=1&&a.t!=4)||(a.maxbytes==null)){return""}var b=Math.floor(a.s/1024),c=(a.maxbytes-a.s);return'<span title="'+b+"k in "+a.c+" file"+(a.c>1?"s":"")+". "+(Math.floor(a.maxbytes/1024/1024))+'k maxinum">'+getNiceSize(c)+" <progress style=height:10px;width:100px value="+a.s+" max="+a.maxbytes+" /></span>"}function p5showPublicLink(a){setDialogMode(2,"Public Link",1,null,'<input type=text style=width:100% value="'+a+'" readonly />');return false}var sortorder;function p5sort_filename(c,d){if(c.ln>d.ln){return(1*sortorder)}if(c.ln<d.ln){return(-1*sortorder)}return 0}function p5sort_timestamp(c,d){if(c.d>d.d){return(1*sortorder)}if(c.d<d.d){return(-1*sortorder)}return 0}function p5sort_bysize(c,d){if(c.s==d.s){return p5sort_filename(c,d)}return(((c.s-d.s))*sortorder)}function p5sort_files(a){var c=[],d=Q("p5sortdropdown").value;for(var b in a){a[b].nx=b;if(a[b].n==null){a[b].n=b}a[b].ln=a[b].n.toLowerCase();c.push(a[b])}sortorder=1;if(d>3){sortorder=-1;d-=3}if(d==1){c.sort(p5sort_filename)}else{if(d==2){c.sort(p5sort_bysize)}else{if(d==3){c.sort(p5sort_timestamp)}}}return c}function p5setActions(){var a=getFileSelCount(),c=getFileCount(),b=getFileSelCount(false);QE("p5DeleteFileButton",(a>0)&&(filetreelocation.length>0));QE("p5NewFolderButton",filetreelocation.length>0);QE("p5UploadButton",filetreelocation.length>0);QE("p5RenameFileButton",(a==1)&&(filetreelocation.length>0));QE("p5SelectAllButton",c>0);Q("p5SelectAllButton").value=(a>0?"Select None":"Select All");QE("p5CutButton",(b>0)&&(a==b));QE("p5CopyButton",(b>0)&&(a==b));QE("p5PasteButton",(p5clipboard!=null)&&(p5clipboard.length>0)&&(filetreelocation.length>0))}function getFileSelCount(d){var a=0,b=document.getElementsByName("fc");for(var c=0;c<b.length;c++){if((b[c].checked)&&((d!=false)||(b[c].attributes.file.value=="3"))){a++}}return a}function getFileSelDirCount(){var a=0,b=document.getElementsByName("fc");for(var c=0;c<b.length;c++){if((b[c].checked)&&(b[c].attributes.file.value=="999")){a++}}return a}function getFileCount(){var a=0;var b=document.getElementsByName("fc");return b.length}function p5selectallfile(){var c=(getFileSelCount()==0),a=document.getElementsByName("fc");for(var b=0;b<a.length;b++){a[b].checked=c}p5setActions()}function setupBackPointers(d){if(d.f!=null){var b=0,a=0;for(var c in d.f){setupBackPointers(d.f[c]);d.f[c].parent=d;if(d.f[c].s){b+=d.f[c].s}if(d.f[c].c){a+=d.f[c].c}if(d.f[c].t==3){a++}}d.s=b;d.c=a}return d}function getFileSizeStr(a){if(a==1){return"1 byte"}return""+a+" bytes"}function p5folderup(a){if(a==null){filetreelocation.pop()}else{while(filetreelocation.length>a){filetreelocation.pop()}}updateFiles();return false}function p5folderset(a){filetreelocation.push(decodeURIComponent(a));updateFiles();return false}function p5createfolder(){setDialogMode(2,"New Folder",3,p5createfolderEx,"<input type=text id=p5renameinput maxlength=64 onkeyup=p5fileNameCheck(event) style=width:100% />");focusTextBox("p5renameinput");p5fileNameCheck()}function p5createfolderEx(){meshserver.send({action:"fileoperation",fileop:"createfolder",path:filetreelocation,newfolder:Q("p5renameinput").value})}function p5deletefile(){var a=getFileSelCount(),b=(getFileSelDirCount()>0)?"<br /><br /><label><input type=checkbox id=p5recdeleteinput>Recursive delete</label><br>":"<input type=checkbox id=p5recdeleteinput style='display:none'>";setDialogMode(2,"Delete",3,p5deletefileEx,(a>1)?("Delete "+a+" selected items?"+b):("Delete selected item?"+b))}function p5deletefileEx(){var b=[],a=document.getElementsByName("fc");for(var c=0;c<a.length;c++){if(a[c].checked){b.push(a[c].value)}}meshserver.send({action:"fileoperation",fileop:"delete",path:filetreelocation,delfiles:b,rec:Q("p5recdeleteinput").checked})}function p5renamefile(){var c,a=document.getElementsByName("fc");for(var b=0;b<a.length;b++){if(a[b].checked){c=a[b].value}}setDialogMode(2,"Rename",3,p5renamefileEx,'<input type=text id=p5renameinput maxlength=64 onkeyup=p5fileNameCheck(event) style=width:100% value="'+c+'" />',{action:"fileoperation",fileop:"rename",path:filetreelocation,oldname:c});focusTextBox("p5renameinput");p5fileNameCheck()}function p5renamefileEx(a,c){c.newname=Q("p5renameinput").value;meshserver.send(c)}function p5fileNameCheck(a){var b=isFilenameValid(Q("p5renameinput").value);QE("idx_dlgOkButton",b);if((b==true)&&(a&&a.keyCode==13)){dialogclose(1)}}var isFilenameValid=(function(){var b=/^[^\\/:\*\?"<>\|]+$/,c=/^\./,d=/^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i;return function a(e){return b.test(e)&&!c.test(e)&&!d.test(e)&&(e[0]!=".")}})();function p5uploadFile(){setDialogMode(2,"Upload File",3,p5uploadFileEx,'<form method=post enctype=multipart/form-data action=uploadfile.ashx target=fileUploadFrame><input type=text name=link style=display:none id=p5uploadpath value="'+encodeURIComponent(filetreelinkpath)+'" /><input type=file name=files id=p5uploadinput style=width:100% multiple=multiple onchange="updateUploadDialogOk(\'p5uploadinput\')" /><input type=hidden name=authCookie value='+authCookie+" /><input type=submit id=p5loginSubmit style=display:none /></form>");updateUploadDialogOk("p5uploadinput")}function p5uploadFileEx(){Q("p5loginSubmit").click()}function updateUploadDialogOk(a){QE("idx_dlgOkButton",Q(a).value!="")}var p5clipboard=null,p5clipboardFolder=null,p5clipboardCut=0;function p5copyFile(b){var a=document.getElementsByName("fc");p5clipboard=[];p5clipboardCut=b,p5clipboardFolder=Clone(filetreelocation);for(var c=0;c<a.length;c++){if((a[c].checked)&&(a[c].attributes.file.value=="3")){p5clipboard.push(a[c].value)}}p5updateClipview()}function p5pasteFile(){var a="";if((p5clipboard!=null)&&(p5clipboard.length>0)){a="Confim "+(p5clipboardCut==0?"copy":"move")+" of "+p5clipboard.length+" entrie"+((p5clipboard.length>1)?"s":"")+" to this location?"}setDialogMode(2,"Paste",3,p5pasteFileEx,a)}function p5pasteFileEx(){meshserver.send({action:"fileoperation",fileop:(p5clipboardCut==0?"copy":"move"),scpath:p5clipboardFolder,path:filetreelocation,names:p5clipboard});p5folderup(999);if(p5clipboardCut==1){p5clipboard=null,p5clipboardFolder=null,p5clipboardCut=0;p5updateClipview()}}function p5updateClipview(){var a="";if((p5clipboard!=null)&&(p5clipboard.length>0)){a="Holding "+p5clipboard.length+" entrie"+((p5clipboard.length>1)?"s":"")+" for "+(p5clipboardCut==0?"copy":"move")+', <a href=# onclick="return p5clearClip()" style=cursor:pointer>Clear</a>.'}QH("p5bottomstatus",a);p5setActions()}function p5clearClip(){p5clipboard=null;p5clipboardFolder=null;p5clipboardCut=0;p5updateClipview();return false}function p5fileDragDrop(b){if(xxdialogMode){return}haltEvent(b);QV("bigfail",false);QV("bigok",false);if(b.dataTransfer==null){return}var c=[];for(var g in b.dataTransfer.files){if((b.dataTransfer.files[g].size!=null)&&(b.dataTransfer.files[g].size!=0)){c.push(b.dataTransfer.files[g])}}if(c.length==0){return}var d=filetree,a=[],h=0;for(var g in filetreelocation){if((d.f!=null)&&(d.f[filetreelocation[g]]!=null)){d=d.f[filetreelocation[g]]}}if(d.f!=null){for(var g in d.f){a.push(g)}for(var g=0;g<b.dataTransfer.files.length;g++){if(a.indexOf(b.dataTransfer.files[g].name)>=0){h++}}}if(h==0){p5PerformUpload(1,c)}else{setDialogMode(2,"Upload File",3,p5PerformUpload,"Upload will overwrite "+h+" file"+addLetterS(h)+". Continue?",c)}}function p5PerformUpload(a,h){var d=0;p5uploadFile();try{Q("p5uploadinput").files=h}catch(e){d=1}if(d==0){p5uploadFileEx()}setDialogMode(0);if(d==1){if(filetreelocation.length==0){return}var k=[],n=[],p=[],c=[],m=h.length,o=0;for(var j=0;j<h.length;j++){o+=h[j].size}if(o>1300000){p5uploadFile();return}for(var j=0;j<h.length;j++){var l=new FileReader(),g=h[j];k.push(g.name);n.push(g.size);p.push(g.type);l.onload=function(b){c.push(b.target.result);if(--m==0){Q("p5fileDragName").value=k.join("*");Q("p5fileDragSize").value=n.join("*");Q("p5fileDragType").value=p.join("*");Q("p5fileDragData").value=c.join("*");Q("p5fileDragLink").value=encodeURIComponent(filetreelinkpath);Q("p5fileDragAuthCookie").value=authCookie;Q("p5loginSubmit2").click()}};l.readAsDataURL(g)}}}var p5dragtimer=null;function p5fileDragOver(b){if(xxdialogMode){return}haltEvent(b);if(p5dragtimer!=null){clearTimeout(p5dragtimer);p5dragtimer=null}var a=true;if(filetreelocation.length==0){a=false}QV("bigok",a);QV("bigfail",!a)}function p5fileDragLeave(a){if(xxdialogMode){return}haltEvent(a);if(a.target.id!="p5filetable"){QV("bigfail",false);QV("bigok",false)}else{p5dragtimer=setTimeout(function(){QV("bigfail",false);QV("bigok",false);p5dragtimer=null},10)}}function eventMouseHover(a,b){a.children[1].classList.remove("g1s");a.children[2].style["background-color"]=((b==0)?"#c9c9c9":"#b9b9b9");a.children[3].classList.remove("g2s");if(b==1){a.children[1].classList.add("g1s");a.children[3].classList.add("g2s")}}function eventsUpdate(){var j="",a=null;for(var c in events){var b=events[c],h=new Date(b.time);if(b.msg){if(b.h==null){b.h=Math.random()}if(printDate(h)!=a){if(a!=null){j+="</table>"}a=printDate(h);j+="<table class=p3eventsTable cellpadding=0 cellspacing=0><tr><td colspan=4 class=DevSt>"+a+"</td></tr>"}var d="si3";if(b.etype=="user"){d="m2"}if(b.etype=="server"){d="si3"}var e=EscapeHtml(b.msg).split("(R)").join("®");if(b.nodeid){var g=getNodeFromId(b.nodeid);if(g!=null){d="si"+g.icon;e="<a href=# onclick='gotoDevice(\""+b.nodeid+"\",10);haltEvent(event);'>"+EscapeHtml(g.name)+"</a> → "+e}}if(b.username){if((userinfo.siteadmin&2)&&(b.userid)){e="<a href=# onclick='gotoUser(\""+encodeURIComponent(b.userid)+"\");haltEvent(event);'>"+EscapeHtml(b.username)+"</a> → "+e}else{e=EscapeHtml(b.username)+" → "+e}}if(b.etype=="relay"||b.action=="relaylog"){d="relayIcon16"}j+="<tr onclick=showEventDetails("+b.h+",2) onmouseover=eventMouseHover(this,1) onmouseout=eventMouseHover(this,0) style=cursor:pointer><td style=width:18px><div class="+d+"></div></td><td class=g1> </td><td class=style10>"+printTime(h)+" - "+e+"</td><td class=g2> </td></tr><tr style=height:2px></tr>"}}if(a!=null){j+="</table>"}if(j==""){j="<br><i>No Events Found</i><br><br>"}QH("p3events",j)}function refreshEvents(){meshserver.send({action:"events",limit:parseInt(p3limitdropdown.value)})}function p3showDownloadEventsDialog(a){if(xxdialogMode){return}var b="Download the list of events with one of the file formats below.<br /><br />";b+=addHtmlValue("CSV Format",'<a href=# style=cursor:pointer onclick="return p3downloadEventsDialogCSV('+a+')">eventslist.csv</a>');b+=addHtmlValue("JSON Format",'<a href=# style=cursor:pointer onclick="return p3downloadEventsDialogJSON('+a+')">eventslist.json</a>');setDialogMode(2,"Event List Export",1,null,b,a)}function p3downloadEventsDialogCSV(d){var a,b;if(d==1){b=currentDeviceEvents}if(d==2){b=events}if(d==3){b=currentUserEvents}a="time, type, action, user, message\r\n";for(var c in b){a+='"'+b[c].time+'","'+b[c].etype+'","'+((b[c].action!=null)?b[c].action:"")+'","'+((b[c].username!=null)?b[c].username:"")+'","'+((b[c].msg!=null)?b[c].msg:"")+'"\r\n'}saveAs(new Blob([a],{type:"application/octet-stream"}),"eventslist.csv");return false}function p3downloadEventsDialogJSON(c){var d=[],a;if(c==1){a=currentDeviceEvents}if(c==2){a=events}if(c==3){a=currentUserEvents}for(var b in a){d.push(events[b])}saveAs(new Blob([JSON.stringify(d)],{type:"application/octet-stream"}),"eventslist.json");return false}function updateUsers(){QV("MainMenuMyUsers",(users!=null)&&((features&4)==0));QV("LeftMenuMyUsers",(users!=null)&&((features&4)==0));QV("UserNewAccountButton",((features&4)==0)&&(serverinfo.domainauth==false));if((users==null)||((features&4)!=0)){QH("p3users","");return}var h=[],e=100,c=0;for(var d in users){h.push(d)}h.sort();var k=Q("UserSearchInput").value.toLowerCase();var b=k;if(k.startsWith("email:")){k=null;b=b.substring(6)}else{if(k.startsWith("name:")){b=null;k=k.substring(5)}else{if(k.startsWith("e:")){k=null;b=b.substring(2)}else{if(k.startsWith("n:")){b=null;k=k.substring(2)}}}}var l="<table class=p3usersTable cellpadding=0 cellspacing=0>",a=true;l+="<th>Name<th style=width:80px>Groups<th style=width:120px>Last Access<th style=width:120px>Permissions";for(var d in h){var j=users[h[d]],g=null;if(wssessions!=null){g=wssessions[j._id]}if((g!=null)&&((k!=null)&&((k=="")||(j.name.toLowerCase().indexOf(k)>=0))||((b!=null)&&((j.email!=null)&&(j.email.toLowerCase().indexOf(b)>=0))))){if(e>0){if(a){l+="<tr><td class=userTableHeader colspan=4>Online Users";a=false}l+=addUserHtml(j,g);e--}else{c++}}}a=true;for(var d in h){var j=users[h[d]],g=null;if(wssessions!=null){g=wssessions[j._id]}if((g==null)&&((k!=null)&&((k=="")||(j.name.toLowerCase().indexOf(k)>=0))||((b!=null)&&((j.email!=null)&&(j.email.toLowerCase().indexOf(b)>=0))))){if(e>0){if(a){l+="<tr><td class=userTableHeader colspan=4>Offline Users";a=false}l+=addUserHtml(j,g);e--}else{c++}}}l+="</table>";if(c==1){l+="<br />1 more user not shown, use search box to look for users...<br />"}else{if(c>1){l+="<br />"+c+" more users not shown, use search box to look for users...<br />"}}if(e==100){l+="<br />No users found.<br />"}QH("p3users",l);if((currentUser!=null)&&(xxcurrentView==30)){gotoUser(encodeURIComponent(currentUser._id),true)}}function addUserHtml(n,l){var p="",b=" gray",e="m2",h="",k=(n.name!=userinfo.name),g="",j="";if(l!=null){b="";if(k){h='<span style=float:right;margin-top:1px;margin-right:4px title=Chat><a href=# onclick=userChat(event,"'+encodeURIComponent(n._id)+'","'+encodeURIComponent(n.name)+"\")><img src='images/icon-chat.png' height=16 width=16 style=padding-top:2px /></a></span>";h+="<span style=float:right;margin-top:1px;margin-left:4px;margin-right:4px title=Notify><a href=# onclick='return showUserAlertDialog(event,\""+encodeURIComponent(n._id)+"\")'><img src='images/icon-notify.png' height=16 width=16 style=padding-top:2px /></a></span>"}if(l==1){g+="1 session"}else{g+=l+" sessions"}}else{if(n.login){g+='<span title="Last login: '+printDateTime(new Date(n.login*1000))+'">'+printDate(new Date(n.login*1000))+"</span>"}}if(k){j+="<a href=# style=cursor:pointer onclick='return showUserAdminDialog(event,\""+encodeURIComponent(n._id)+"\")'>"}if((n.siteadmin!=null)&&((n.siteadmin&32)!=0)&&(n.siteadmin!=4294967295)){j+="Locked, "}j+="<span title='Server Permissions'>";var m=n.siteadmin&(4294967295-224);if((n.siteadmin==null)||(m==0)){j+="User"}else{if(m==8){j+="User + Files"}else{if(n.siteadmin==4294967295){j+="Administrator"}else{if((m&2)!=0){j+="Manager"}else{j+="Partial"}}}}if((n.siteadmin!=null)&&(n.siteadmin!=4294967295)&&((n.siteadmin&(64+128))!=0)){j+="*"}j+="</span>";if(k){j+="</a>"}var c=0;if(n.links){for(var d in n.links){c++}}var o=EscapeHtml(n.name),a="";if(serverinfo.emailcheck==true){a=((n.emailVerified!=true)?' <b style=color:red title="Email is not verified">✗</b>':' <b style=color:green title="Email is verified">✓</b>')}if(n.email!=null){if(((features&2097152)==0)||(n.email.toLowerCase()!=n.name.toLowerCase())){o+=", <a href=# onclick='return doemail(event,\""+n.email+"\")'>"+n.email+"</a>"+a}else{o+=" <a href=# onclick='return doemail(event,\""+n.email+'")\'><img src="images/mail12.png" height=9 width=12 title="Send email to user" style="margin-top:2px" /></a>'+a}}if((n.otpsecret>0)||(n.otphkeys>0)){o+=' <img src="images/key12.png" height=12 width=11 title="2nd factor authentication enabled" style="margin-top:2px" />'}if((n.siteadmin!=null)&&((n.siteadmin&32)!=0)&&(n.siteadmin!=4294967295)){o+=' <img src="images/padlock12.png" height=12 width=8 title="Account is locked" style="margin-top:2px" />'}p+="<tr tabindex=0 onmouseover=userMouseHover(this,1) onmouseout=userMouseHover(this,0) onkeypress=\"if (event.key=='Enter') gotoUser('"+encodeURIComponent(n._id)+'\')"><td style=cursor:pointer onclick=gotoUser("'+encodeURIComponent(n._id)+'")>';p+="<div class=bar>";p+='<div class=baricon><div class="'+e+b+'"></div></div>';p+="<div class=g1></div><div class=g2></div>";p+="<div><span>"+o+"</span>"+h+"</div></div><td style=text-align:center>"+c+"<td style=text-align:center>"+g+"<td style=text-align:center>"+j;return p}function userMouseHover(b,c){var a=b.children[0].children[0];a.children[1].classList.remove("g1s");a.children[2].classList.remove("g2s");if(c==1){a.children[1].classList.add("g1s");a.children[2].classList.add("g2s")}b.children[0].children[0].style["background-color"]=((c==0)?"#c9c9c9":"#b9b9b9")}function userChat(a,d,b){haltEvent(a);var c="/messenger?id=meshmessenger/"+d+"/"+encodeURIComponent(userinfo._id)+"&title="+b;if((authCookie!=null)&&(authCookie!="")){c+="&auth="+authCookie}window.open(c,"meshmessenger:"+d);meshserver.send({action:"meshmessenger",userid:decodeURIComponent(d)});return false}function showUserAlertDialog(a,b){if(xxdialogMode){return}haltEvent(a);setDialogMode(2,"Notify "+EscapeHtml(users[decodeURIComponent(b)].name),3,showUserAlertDialogEx,'Send a text notification to this user.<textarea id=d2notifyText maxlength=2048 style="width:100%;height:184px;resize:none"></textarea>',b);Q("d2notifyText").focus();return false}function showUserAlertDialogEx(a,b){meshserver.send({action:"notifyuser",userid:decodeURIComponent(b),msg:Q("d2notifyText").value})}function doemail(b,a){if(xxdialogMode){return false}haltEvent(b);window.open("mailto:"+a);return false}function p4batchAccountCreate(){if(xxdialogMode){return}var a='Create many accounts at once by importing a JSON file with the following format:<br /><pre>[\r\n {"user":"x1","pass":"x","email":"x1@x"},\r\n {"user":"x2","pass":"x","resetNextLogin":true}\r\n]</pre><input style=width:370px type=file id=d4importFile accept=".json" onchange=p4batchAccountCreateValidate() />';setDialogMode(2,"User Account Import",3,p4batchAccountCreateEx,a);QE("idx_dlgOkButton",false)}function p4batchAccountCreateValidate(){QE("idx_dlgOkButton",Q("d4importFile").value!=null)}function p4batchAccountCreateEx(){var a=new FileReader();a.onload=function(g){var d=null;try{d=JSON.parse(g.target.result)}catch(b){setDialogMode(2,"User Account Import",1,null,"Invalid JSON file: "+b+".");return}if((d!=null)&&(Array.isArray(d))){var e=true;for(var c in d){if((typeof d[c].user!="string")||(d[c].user.length<1)||(d[c].user.length>64)){e=false}if((typeof d[c].pass!="string")||(d[c].pass.length<1)||(d[c].pass.length>256)){e=false}if(checkPasswordRequirements(d[c].pass,passRequirements)==false){e=false}if((d[c].email!=null)&&((typeof d[c].email!="string")||(d[c].email.length<1)||(d[c].email.length>128))){e=false}}if(e==false){setDialogMode(2,"User Account Import",1,null,"Invalid JSON file format.")}else{meshserver.send({action:"adduserbatch",users:d})}}else{setDialogMode(2,"User Account Import",1,null,"Invalid JSON file format.")}};a.readAsText(Q("d4importFile").files[0])}function p4downloadUserInfo(){if(xxdialogMode){return}var a="Download the list of users with one of the file formats below.<br /><br />";a+=addHtmlValue("CSV Format","<a href=# style=cursor:pointer onclick='return p4downloadUserInfoCSV()'>userlist.csv</a>");a+=addHtmlValue("JSON Format","<a href=# style=cursor:pointer onclick='return p4downloadUserInfoJSON()'>userlist.json</a>");setDialogMode(2,"User List Export",1,null,a)}function p4downloadUserInfoCSV(){var a="id, name, email, creation, lastlogin, groups, authfactors\r\n";for(var c in users){var d=false,b=[];if((users[c].otpsecret>0)||(users[c].otphkeys>0)){d=true;if(users[c].otpsecret>0){b.push("AuthApp")}if(users[c].otphkeys>0){b.push("SecurityKey")}if(users[c].otpkeys>0){b.push("BackupCodes")}}a+='"'+users[c]._id+'","'+users[c].name+'","'+(users[c].email?users[c].email:"")+'","'+(users[c].creation?new Date(users[c].creation*1000):"")+'","'+(users[c].login?new Date(users[c].login*1000):"")+'","'+(users[c].groups?users[c].groups.join(","):"")+'","'+(d?b.join(","):"")+'"\r\n'}saveAs(new Blob([a],{type:"application/octet-stream"}),"userlist.csv");return false}function p4downloadUserInfoJSON(){var b=[];for(var a in users){b.push(users[a])}saveAs(new Blob([JSON.stringify(b)],{type:"application/octet-stream"}),"userlist.json");return false}function showUserBroadcastDialog(){if(xxdialogMode){return}var a='Broadcast a message to all connected users.<textarea id=broadcastMessage value="" maxlength="256"/></textarea>';setDialogMode(2,"Broadcast Message",3,showUserBroadcastDialogEx,a);Q("broadcastMessage").focus()}function showUserBroadcastDialogEx(){meshserver.send({action:"userbroadcast",msg:Q("broadcastMessage").value})}function showCreateNewAccountDialog(){if(xxdialogMode){return}var d="";if((features&2097152)==0){d+=addHtmlValue("Name","<input id=p4name maxlength=64 onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />")}d+=addHtmlValue("Email","<input id=p4email maxlength=256 onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />");d+=addHtmlValue("Password","<input id=p4pass1 type=password maxlength=256 onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />");d+=addHtmlValue("Password","<input id=p4pass2 type=password maxlength=256 onchange=showCreateNewAccountDialogValidate() onkeyup=showCreateNewAccountDialogValidate() />");d+="<div><label><input id=p4randomPassword onchange=showCreateNewAccountDialogValidate() type=checkbox />Randomize the password.</label></div>";d+="<div><label><input id=p4resetNextLogin onchange=showCreateNewAccountDialogValidate() type=checkbox />Force password reset on next login.</label></div>";if(serverinfo.emailcheck){d+="<div><label><input id=p4verifiedEmail onchange=showCreateNewAccountDialogValidate() type=checkbox />Email is verified.</label></div>";d+="<div><label><input id=p4invitationEmail type=checkbox />Send invitation email.</label></div>"}if(passRequirements){var b=[],c=0;for(var a in passRequirements){if((a!="reset")&&(a!="hint")){b.push(a+":"+passRequirements[a]);c++}}if(c>0){d+="<div style=font-size:x-small;padding:6px>Requirements: "+b.join(", ")+".</div>"}}setDialogMode(2,"Create Account",3,showCreateNewAccountDialogEx,d);showCreateNewAccountDialogValidate();if((features&2097152)==0){Q("p4name").focus()}else{Q("p4email").focus()}}function showCreateNewAccountDialogValidate(c){var b=validateEmail(Q("p4email").value);if(serverinfo.emailcheck){QE("p4verifiedEmail",b);QE("p4invitationEmail",b&&Q("p4resetNextLogin").checked&&Q("p4verifiedEmail").checked);if(b==false){Q("p4verifiedEmail").checked=false}if((Q("p4resetNextLogin").checked==false)||(Q("p4verifiedEmail").checked==false)){Q("p4invitationEmail").checked=false}}QE("p4pass1",!Q("p4randomPassword").checked);QE("p4pass2",!Q("p4randomPassword").checked);if((c==null)&&(Q("p4email").value.length>0)&&(b==false)){QE("idx_dlgOkButton",false);return}var a=true;if((features&2097152)==0){a&=(!Q("p4name")||((Q("p4name").value.length>0)&&(Q("p4name").value.indexOf(" ")==-1)))}if(Q("p4randomPassword").checked==false){a&=(Q("p4pass1").value.length>0&&Q("p4pass1").value==Q("p4pass2").value&&checkPasswordRequirements(Q("p4pass1").value,passRequirements))}if(a&&passRequirements){if(checkPasswordRequirements(Q("p4pass1").value,passRequirements)==false){a=false}}QE("idx_dlgOkButton",a)}function showCreateNewAccountDialogEx(){var a=((features&2097152)==0)?Q("p4name").value:Q("p4email").value;var b={action:"adduser",username:a,email:Q("p4email").value,pass:Q("p4pass1").value,resetNextLogin:Q("p4resetNextLogin").checked,randomPassword:Q("p4randomPassword").checked};if(serverinfo.emailcheck){b.emailVerified=Q("p4verifiedEmail").checked;b.emailInvitation=Q("p4invitationEmail").checked}meshserver.send(b)}function showUserGroupDialog(a,d){if(xxdialogMode){return}haltEvent(a);d=decodeURIComponent(d);var c=users[d.toLowerCase()],b="";if(c.groups!=null){b=c.groups.join(", ")}var g="Enter a comma seperate list of administrative realms names.<br /><br />";g+=addHtmlValue("Realms",'<input id=dp4usergroups style=width:230px value="'+b+'" placeholder="Name1, Name2, Name3" maxlength=256 onchange=p4validateUserGroups() onkeyup=p4validateUserGroups() />');setDialogMode(2,"Administrative Realms",3,showUserGroupDialogEx,g,c);focusTextBox("dp4usergroups");p4validateUserGroups();return false}function p4validateUserGroups(){var b=Q("dp4usergroups").value;var e=0,c=b.indexOf('"')+b.indexOf("/")+b.indexOf(">")+b.indexOf("<")+b.indexOf("'");var a=b.split(",");for(var d in a){if(a[d].trim().length==0){e++}}QE("idx_dlgOkButton",(b=="")||((c==-5)&&(e<1)))}function showUserGroupDialogEx(a,h){var d=Q("dp4usergroups").value,b=d.split(","),c=[];for(var e in b){var k=b[e].trim();if(k.length>0){c.push(k)}}meshserver.send({action:"edituser",id:h._id,groups:c})}function showUserAdminDialog(a,c){if(xxdialogMode){return}haltEvent(a);c=decodeURIComponent(c);var d="<div><div id=d2AdminPermissions>";d+="<label><input type=checkbox onchange=showUserAdminDialogValidate() id=ua_fileaccess>Server Files</label>, <input type=number onchange=showUserAdminDialogValidate() maxlength=10 id=ua_fileaccessquota>k max, blank for default<br><hr/>";d+="<label><input type=checkbox onchange=showUserAdminDialogValidate() id=ua_fulladmin>Full Administrator</label><br>";d+="<label><input type=checkbox onchange=showUserAdminDialogValidate() id=ua_serverbackup>Server Backup</label><br>";d+="<label><input type=checkbox onchange=showUserAdminDialogValidate() id=ua_serverrestore>Server Restore</label><br>";d+="<label><input type=checkbox onchange=showUserAdminDialogValidate() id=ua_serverupdate>Server Updates</label><br>";d+="<label><input type=checkbox onchange=showUserAdminDialogValidate() id=ua_manageusers>Manage Users</label><br>";d+="<hr/></div><label><input type=checkbox onchange=showUserAdminDialogValidate() id=ua_lockedaccount>Lock Account</label><br>";d+="<label><input type=checkbox onchange=showUserAdminDialogValidate() id=ua_nonewgroups>No New Device Groups</label><br>";d+="<label><input type=checkbox onchange=showUserAdminDialogValidate() id=ua_nomeshcmd>No Tools (MeshCmd/Router)</label><br>";d+="</div>";var b=users[c.toLowerCase()];setDialogMode(2,"Server Permissions",3,showUserAdminDialogEx,d,b);if(b.siteadmin&&b.siteadmin!=0){Q("ua_fulladmin").checked=(b.siteadmin==4294967295);Q("ua_serverbackup").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&1)!=0));Q("ua_manageusers").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&2)!=0));Q("ua_serverrestore").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&4)!=0));Q("ua_fileaccess").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&8)!=0));Q("ua_serverupdate").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&16)!=0));Q("ua_lockedaccount").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&32)!=0));Q("ua_nonewgroups").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&64)!=0));Q("ua_nomeshcmd").checked=((b.siteadmin!=4294967295)&&((b.siteadmin&128)!=0))}QE("ua_fulladmin",userinfo.siteadmin==4294967295);QE("ua_serverbackup",userinfo.siteadmin==4294967295);QE("ua_manageusers",userinfo.siteadmin==4294967295);QE("ua_serverrestore",userinfo.siteadmin==4294967295);QE("ua_fileaccess",userinfo.siteadmin==4294967295);QE("ua_fileaccessquota",userinfo.siteadmin==4294967295);QE("ua_serverupdate",userinfo.siteadmin==4294967295);QV("d2AdminPermissions",userinfo.siteadmin==4294967295);QE("ua_lockedaccount",(userinfo.siteadmin&2)&&(b.siteadmin!=4294967295)&&(userinfo._id!=b._id));QE("ua_nonewgroups",(userinfo.siteadmin&2)&&(b.siteadmin!=4294967295)&&(userinfo._id!=b._id));QE("ua_nomeshcmd",(userinfo.siteadmin&2)&&(b.siteadmin!=4294967295)&&(userinfo._id!=b._id));Q("ua_fileaccessquota").value=(b.quota!=null)?(b.quota/1024):"";showUserAdminDialogValidate();return false}function showUserAdminDialogValidate(){if(userinfo.siteadmin==4294967295){QE("ua_serverbackup",!Q("ua_fulladmin").checked);QE("ua_manageusers",!Q("ua_fulladmin").checked);QE("ua_serverrestore",!Q("ua_fulladmin").checked);QE("ua_fileaccess",!Q("ua_fulladmin").checked);QE("ua_serverupdate",!Q("ua_fulladmin").checked);QE("ua_lockedaccount",!Q("ua_fulladmin").checked);QE("ua_nonewgroups",!Q("ua_fulladmin").checked);QE("ua_nomeshcmd",!Q("ua_fulladmin").checked);QE("ua_fileaccessquota",Q("ua_fileaccess").checked&&!Q("ua_fulladmin").checked)}}function showUserAdminDialogEx(a,d){var c=0,b=parseInt(Q("ua_fileaccessquota").value);if(Q("ua_fulladmin").checked==true){c=4294967295}else{if(Q("ua_serverbackup").checked==true){c+=1}if(Q("ua_manageusers").checked==true){c+=2}if(Q("ua_serverrestore").checked==true){c+=4}if(Q("ua_fileaccess").checked==true){c+=8}if(Q("ua_serverupdate").checked==true){c+=16}if(Q("ua_lockedaccount").checked==true){c+=32}if(Q("ua_nonewgroups").checked==true){c+=64}if(Q("ua_nomeshcmd").checked==true){c+=128}}var e={action:"edituser",id:d._id,siteadmin:c};if(isNaN(b)==false){e.quota=(b*1024)}meshserver.send(e)}function onUserSearchInputChanged(){updateUsers()}var currentUser=null;function gotoUser(r,g){if(xxdialogMode&&!g){return}var p=currentUser=users[decodeURIComponent(r)];if(p==null){setDialogMode(0);go(4);return}QH("p30userName",p.name);QH("p31userName",p.name);var o=(p.name==userinfo.name),a=0;if(wssessions!=null&&wssessions[p._id]){a=wssessions[p._id]}Q("MainUserImage").classList.remove("gray");if(a==0){Q("MainUserImage").classList.add("gray")}var l=[],n="";if((p.siteadmin!=null)&&((p.siteadmin&32)!=0)&&(p.siteadmin!=4294967295)){n='<img src="images/padlock12.png" height=12 width=8 title="Account is locked" style="margin-top:2px" /> ';l.push("Locked account")}if((p.siteadmin==null)||((p.siteadmin&(4294967295-224))==0)){l.push("No server rights")}else{if(p.siteadmin==8){l.push("Access to server files")}else{if(p.siteadmin==4294967295){l.push("Full administrator")}else{l.push("Partial rights")}}}if((p.siteadmin!=null)&&(p.siteadmin!=4294967295)&&((p.siteadmin&(64+128))!=0)){l.push("Restrictions")}var s="<div style=min-height:80px><table style=width:100%>";var c=p.email?EscapeHtml(p.email):"<i>Not set</i>",d="";if(serverinfo.emailcheck){d=((p.emailVerified==true)?'<b style=color:green;cursor:pointer title="Email is verified">✓</b> ':'<b style=color:red;cursor:pointer title="Email not verified">✗</b> ')}if(p.name.toLowerCase()!=p._id.split("/")[2]){s+=addDeviceAttribute("User Identifier",p._id.split("/")[2])}if(((features&2097152)==0)&&((p.siteadmin!=4294967295)||(userinfo.siteadmin==4294967295))){s+=addDeviceAttribute("Email",d+'<a href=# style=cursor:pointer onclick=p30showUserEmailChangeDialog(event,"'+r+'")>'+c+"</a> <a href=# style=cursor:pointer onclick='return doemail(event,\""+p.email+'")\'><img class=hoverButton src="images/link1.png" /></a>')}else{s+=addDeviceAttribute("Email",d+c+" <a href=# style=cursor:pointer onclick='return doemail(event,\""+p.email+'")\'><img class=hoverButton src="images/link1.png" /></a>')}s+=addDeviceAttribute("Server Rights",n+"<a href=# style=cursor:pointer onclick='return showUserAdminDialog(event,\""+r+"\")'>"+l.join(", ")+"</a>");if(p.quota){s+=addDeviceAttribute("Server Quota",EscapeHtml(parseInt(p.quota)/1024)+" k")}s+=addDeviceAttribute("Creation",printDateTime(new Date(p.creation*1000)));if(p.login){s+=addDeviceAttribute("Last Login",printDateTime(new Date(p.login*1000)))}if(p.passchange==-1){s+=addDeviceAttribute("Password","Will be changed on next login.")}else{if(p.passchange){s+=addDeviceAttribute("Password","Last changed: "+printDateTime(new Date(p.passchange*1000)))}}var j=0,k="<i>None<i>";if(p.links){for(var h in p.links){j++}if(j==1){k="1 group"}else{if(j>1){k=j+" groups"}}}s+=addDeviceAttribute("Device Groups",k);if((userinfo.siteadmin==4294967295)||(userinfo.siteadmin&2)){var q="<i>None</i>";if(p.groups){q="";for(var h in p.groups){q+='<span class="tagSpan">'+p.groups[h]+"</span>"}}s+=addDeviceAttribute("Admin Realms",addLinkConditional(q,'showUserGroupDialog(event,"'+r+'")',(userinfo.siteadmin==4294967295)||((userinfo.groups==null)&&(userinfo._id!=p._id)&&(p.siteadmin!=4294967295))))}var m=0;if((p.otpsecret>0)||(p.otphkeys>0)){m=1;var e=[];if(p.otpsecret>0){e.push("Authentication App")}if(p.otphkeys>0){e.push("Security Key")}if(p.otpkeys>0){e.push("Backup Codes")}s+=addDeviceAttribute("Security",'<img src="images/key12.png" height=12 width=11 title="2nd factor authentication enabled" style="margin-top:2px" /> '+e.join(", "))}s+="</table></div><br />";s+='<input type=button value=Notes title="View notes about this user" onclick=showNotes(false,"'+r+'") />';if(!o&&(a>0)){s+='<input type=button value=Notify title="Send user notification" onclick=showUserAlertDialog(event,"'+r+'") />'}QH("p30html",s);drawUserTimeline();var b=true;if(p._id==userinfo._id){b=false}if(p.siteadmin&&p.siteadmin>0&&userinfo.siteadmin!=4294967295){b=false}s="<div style=float:right;font-size:x-small>";if(b){s+="<a href=# style=cursor:pointer onclick='return p30showDeleteUserDialog()' title=\"Remove this user\">Delete User</a>"}s+="</div><div style=font-size:x-small>";if(userinfo.siteadmin==4294967295){s+="<a href=# style=cursor:pointer onclick='return p30showUserChangePassDialog("+m+')\' title="Change the password for this user">Change Password</a>'}s+="</div><br>";QH("p30html3",s);s="";if(a==1){s="1 active session"}else{if(a>1){s=a+" active sessions"}}QH("MainUserState",s);go(30);QH("p31events","");refreshUsersEvents()}function p30showUserEmailChangeDialog(a){if(xxdialogMode){return false}var b="";b+=addHtmlValue("Email","<input id=dp30email style=width:230px maxlength=32 onchange=p30validateEmail() onkeyup=p30validateEmail() />");if(serverinfo.emailcheck){b+=addHtmlValue("Status","<select id=dp30verified style=width:230px onchange=p30validateEmail()><option value=0>Not verified</option><option value=1>Verified</option></select>")}setDialogMode(2,"Change Email for "+EscapeHtml(currentUser.name),3,p30showUserEmailChangeDialogEx,b);Q("dp30email").focus();Q("dp30email").value=(currentUser.email?currentUser.email:"");if(serverinfo.emailcheck){Q("dp30verified").value=currentUser.emailVerified?1:0}p30validateEmail();return false}function p30validateEmail(){var a=Q("dp30email").value,b=a.split("@");b=(b.length==2)&&(b[0].length>0)&&(b[1].split(".").length>1)&&(b[1].length>2)&&(a.length<1024)&&((a!=userinfo.email)||((serverinfo.emailcheck==true)&&(Q("dp30verified").value!=(userinfo.emailVerified?1:0))));QE("idx_dlgOkButton",b)}function p30showUserEmailChangeDialogEx(){var a={action:"edituser",id:currentUser._id,email:Q("dp30email").value};if(serverinfo.emailcheck){a.emailVerified=(Q("dp30verified").value==1)}meshserver.send(a)}function p30showUserChangePassDialog(b){if(xxdialogMode){return}var e="";e+=addHtmlValue("Password","<input id=p4pass1 type=password style=width:230px maxlength=256 onchange=showCreateNewAccountDialogValidate(1) onkeyup=p30showUserChangePassDialogValidate(1)></input>");e+=addHtmlValue("Password","<input id=p4pass2 type=password style=width:230px maxlength=256 onchange=showCreateNewAccountDialogValidate(1) onkeyup=p30showUserChangePassDialogValidate(1)></input>");if(features&65536){e+=addHtmlValue("Password hint","<input id=p4hint type=text style=width:230px maxlength=256></input>")}if(passRequirements){var c=[],d=0;for(var a in passRequirements){if((a!="reset")&&(a!="hint")){c.push(a+":"+passRequirements[a]);d++}}if(d>0){e+="<div style=font-size:x-small;padding:6px>Requirements: "+c.join(", ")+".</div>"}}e+="<div><label><input id=p4resetNextLogin type=checkbox />Force password reset on next login.</label></div>";if(b==1){e+="<div><label><input id=p4twoFactorRemove type=checkbox />Remove all 2nd factor authentication.</label></div>"}setDialogMode(2,"Change Password for "+EscapeHtml(currentUser.name),3,p30showUserChangePassDialogEx,e,b);p30showUserChangePassDialogValidate();Q("p4pass1").focus();if(currentUser.passchange==-1){Q("p4resetNextLogin").checked=true}}function p30showUserChangePassDialogValidate(){var a=true;if((Q("p4pass1").value!="")||(Q("p4pass2").value!="")){if(Q("p4pass1").value!=Q("p4pass2").value){a=false}else{if(passRequirements){if(checkPasswordRequirements(Q("p4pass1").value,passRequirements)==false){a=false}}}}QE("idx_dlgOkButton",a)}function p30showUserChangePassDialogEx(a,e){var d=false;if((e==1)&&(Q("p4twoFactorRemove").checked==true)){d=true}if(Q("p4pass1").value==Q("p4pass2").value){var c={action:"changeuserpass",userid:currentUser._id,pass:Q("p4pass1").value,removeMultiFactor:d,resetNextLogin:Q("p4resetNextLogin").checked};if(features&65536){c.hint=Q("p4hint").value}meshserver.send(c)}}function p30showDeleteUserDialog(){if(xxdialogMode){return}setDialogMode(2,"Delete User "+EscapeHtml(currentUser.name),3,p30showDeleteUserDialogEx,"Confirm deletion of user "+EscapeHtml(currentUser.name)+"?")}function p30showDeleteUserDialogEx(){meshserver.send({action:"deleteuser",userid:currentUser._id,username:currentUser.name})}function drawUserTimeline(){var s=null,o=Date.now();s=[];var e=new Date();e.setHours(0,0,0,0);e=new Date(e.getTime()-(1000*60*60*24*6));var u=e.getTime();var t=[];if(s!=null&&s.length>1){t.push([0,s[1],s[0]]);var c=s[1];for(var m=2;m<s.length;m+=2){var p=s[m],k=o;if(s.length>(m+1)){k=s[m+1]}t.push([c,c+k,p]);c=c+k}}var z="",b=1,h=new Date();h.setHours(0,0,0,0);for(var m=0;m<7;m++){var g="",q=h.getTime(),l=q+(1000*60*60*24);for(var n in t){var a=t[n];if(isTimeBlockInside(q,l,a[0],a[1])==true){var w=Math.max(q,a[0]);var r=Math.min(Math.min(l,a[1]),o);var y=Math.round((r-w)/112794);if(y>0){var v=powerStateStrings2[a[2]]+" from "+printTime(new Date(w))+" to "+printTime(new Date(r))+".";g+='<div title="'+v+'" style=display:table-cell;width:'+y+"px;background-color:"+powerColor(a[2])+";height:16px></div>"}}}z+="<tr style="+(((b%2)==0)?"background-color:#DDD":"")+"><td><div> "+printDate(h)+"<div></div></div></td><td><div>"+g+"</div></td></tr>";++b;h=new Date(h.getTime()-(1000*60*60*24))}QH("p30html2",'<table style="color:black;background-color:#EEE;border-color:#AAA;border-width:1px;border-style:solid;border-collapse:collapse" border=0 cellpadding=2 cellspacing=0 width=100%><tbody><tr style=background-color:#AAAAAA;font-weight:bold><th scope=col style=text-align:center;width:150px>Day</th><th scope=col style=text-align:center>7 Day Login State</th></tr>'+z+"</tbody></table>")}var currentUserEvents=null;function userEventsUpdate(){var j="",a=null;for(var c in currentUserEvents){var b=currentUserEvents[c],h=new Date(b.time);if(b.msg){if(b.h==null){b.h=Math.random()}if(printDate(h)!=a){if(a!=null){j+="</table>"}a=printDate(h);j+="<table class=p3eventsTable cellpadding=0 cellspacing=0><tr><td colspan=4 class=DevSt>"+a+"</td></tr>"}var d="si3";if(b.etype=="user"){d="m2"}if(b.etype=="server"){d="si3"}var e=EscapeHtml(b.msg).split("(R)").join("®");if(b.nodeid){var g=getNodeFromId(b.nodeid);if(g!=null){d="si"+g.icon;e="<a href=# onclick='gotoDevice(\""+b.nodeid+"\",10);haltEvent(event);'>"+EscapeHtml(g.name)+"</a> → "+e}}if(b.username&&(b.username!=currentUser.name)){if((userinfo.siteadmin&2)&&(b.userid)){e="<a href=# onclick='gotoUser(\""+encodeURIComponent(b.userid)+"\");haltEvent(event);'>"+EscapeHtml(b.username)+"</a> → "+e}else{e=EscapeHtml(b.username)+" → "+e}}if(b.etype=="relay"||b.action=="relaylog"){d="relayIcon16"}j+="<tr onclick=showEventDetails("+b.h+",3) onmouseover=eventMouseHover(this,1) onmouseout=eventMouseHover(this,0) style=cursor:pointer><td style=width:18px><div class="+d+"></div></td><td class=g1> </td><td class=style10>"+printTime(h)+" - "+e+"</td><td class=g2> </td></tr><tr style=height:2px></tr>"}}if(a!=null){j+="</table>"}if(j==""){j="<br><i>No Events Found</i><br><br>"}QH("p31events",j)}function refreshUsersEvents(){meshserver.send({action:"events",limit:parseInt(p31limitdropdown.value),user:currentUser.name})}function d3init(){Q("d3localFile").value="";d3modechange()}function d3modechange(){var a=Q("d3uploadMode").value;QV("d3localmode",a==1);QV("d3servermode",a==2);if(a==1){d3setActions()}else{d3updatefiles()}}var d3filetreelinkpath;var d3filetreelocation=[];function d3updatefiles(){if(Q("d3uploadMode").value==1){return}var m="",n="",e=filetree,j=1;var c=[],r=d3filetreelinkpath,b=[],a=document.getElementsByName("fc");for(var o=0;o<a.length;o++){if(a[o].checked){b.push(a[o].value)}}d3filetreelinkpath="";for(var o in d3filetreelocation){if((e.f!=null)&&(e.f[d3filetreelocation[o]]!=null)){c.push(d3filetreelocation[o]);if((j==1)){var t=d3filetreelocation[o].split("/");publicPath=window.location+t[0]+"files/"+t[2];if(d3filetreelocation[o]===userinfo._id){d3filetreelinkpath+="self"}else{d3filetreelinkpath+=(t[0]+"/"+t[2])}}else{if(d3filetreelinkpath!=""){d3filetreelinkpath+="/"+d3filetreelocation[o];if(j>2){publicPath+="/"+d3filetreelocation[o]}}}e=e.f[d3filetreelocation[o]];j++}else{break}}d3filetreelocation=c;var g=p5sort_files(e.f);for(var o in g){var d=g[o],q=d.n,s;s=q;if(q.length>70){s='<span title="'+EscapeHtml(q)+'">'+EscapeHtml(q.substring(0,70))+"...</span>"}else{s=EscapeHtml(q)}q=EscapeHtml(q);var k="";if(d.s!=null){k=getFileSizeStr(d.s)}var l="";if(d.t<3){var u="";l='<div class=filelist file=999><span style=float:right title="'+u+'"></span><span><div class=fileIcon'+d.t+' onclick=d3folderset("'+encodeURIComponent(d.nx)+'")></div> <a href=# style=cursor:pointer onclick=\'return d3folderset("'+encodeURIComponent(d.nx)+"\")'>"+s+"</a></span></div>"}else{var p=s;l="<div class=filelist file=3><input style=float:left name=fcx class=fcb type=checkbox onchange=d3setActions() value='"+d.nx+"'> <span style=float:right>"+k+"</span><span><div class=fileIcon"+d.t+"></div>"+p+"</span></div>"}if(d.t<3){m+=l}else{n+=l}}QH("d3serverfiles",m+n);QE("p3FolderUp",d3filetreelocation.length>0);d3setActions()}function d3folderset(a){d3filetreelocation.push(decodeURIComponent(a));d3updatefiles();return false}function d3folderup(a){if(a==null){d3filetreelocation.pop()}else{while(d3filetreelocation.length>a){d3filetreelocation.pop()}}d3updatefiles()}function d3getFileSel(){var a=[];var b=document.getElementsByName("fcx");for(var c=0;c<b.length;c++){if(b[c].checked){a.push(b[c].value)}}return a}function d3setActions(){var a=Q("d3uploadMode").value;if(a==1){QE("idx_dlgOkButton",Q("d3localFile").value.length>0)}else{QE("idx_dlgOkButton",d3getFileSel().length==1)}}var notifications=[];function clickNotificationIcon(a){if(a==true){QV("notifiyBox",true)}else{if(a==false){QV("notifiyBox",false)}else{QV("notifiyBox",QS("notifiyBox")["display"]=="none")}}drawNotifications()}function setNotificationCount(a){if(parseInt(Q("notificationCount").innerHTML)==a){return}QH("notificationCount",a);QS("notificationCount")["background-color"]=(a==0)?"lightblue":"orange";QV("notificationCount",a>0)}function drawNotifications(){var j="";if(notifications.length==0){j="<div style=margin:5px>There are currently no notifications</div>"}else{for(var c in notifications){var g=notifications[c];var k="";if(g.title!=null){k="<b>"+g.title+"</b>: "}var a=new Date(g.time);var e=0;if(g.nodeid!=null){var h=getNodeFromId(g.nodeid);if(h!=null){e=h.icon;k="<b>"+h.name+"</b>: "}}j+='<div title="Occured at '+printDateTime(a)+'" id="notifyx'+g.id+'" class=notification style="cursor:pointer;border-top:1px solid '+((j=="")?"transparent":"orange")+'">';if(e){j+="<div class=j"+e+' onclick="notificationSelected('+g.id+')" style=margin:5px;float:left></div>'}j+='<div onclick="notificationDelete('+g.id+')" class=unselectable title="Clear this notification" style=margin:5px;float:right;color:orange><b>X</b></div><div onclick="notificationSelected('+g.id+')" style=margin:5px>'+k+g.text+"</div></div>"}}var b="";if(notifications.length>1){b='<div id="notifyRemoveAll" onclick="deleteAllNotifications()" style="cursor:pointer;border-top:1px solid orange;margin:5px;color:orange;text-align:right;padding-right:3px">Clear all</div>'}QH("notifiyBox",'<div class=customScroll style="max-height:170px;overflow-y:auto;margin:5px">'+j+"</div>"+b)}function notificationSelected(c,a){var d=-1;for(var b in notifications){if(notifications[b].id==c){d=b}}if(d!=-1){notificationSelectedEx(notifications[d],c);if(a&¬ifications[d]){if(notifications[d].notification){notifications[d].notification.close();delete notifications[d].notification}notificationDelete(c)}}}function notificationSelectedEx(b,a){if(b.nodeid!=null){if(b.tag=="desktop"){gotoDevice(b.nodeid,12)}else{if(b.tag=="terminal"){gotoDevice(b.nodeid,11)}else{if(b.tag=="files"){gotoDevice(b.nodeid,13)}else{if(b.tag=="intelamt"){gotoDevice(b.nodeid,14)}else{if(b.tag=="console"){gotoDevice(b.nodeid,15)}else{gotoDevice(b.nodeid,10)}}}}}}else{if((b.tag!=null)&&b.tag.startsWith("meshmessenger/")){window.open("/messenger?id="+b.tag+"&title="+encodeURIComponent(b.username),b.tag.split("/")[2]);notificationDelete(a)}}}function notificationDelete(c){var d=-1,a=Q("notifyx"+c);if(a!=null){for(var b in notifications){if(notifications[b].id==c){d=b}}if(d!=-1){if(notifications[d].notification){notifications[d].notification.close();delete notifications[d].notification}notifications.splice(d,1);a.parentNode.removeChild(a);setNotificationCount(notifications.length);if(notifications.length==0){QV("notifiyBox",false)}if(notifications.length==1){QV("notifyRemoveAll",false)}if((notifications.length>0)&&(d==0)){var g=notifications[0];QS("notifyx"+g.id)["border-top"]="1px solid transparent"}}}}function addNotification(a){if(a.time==null){a.time=Date.now()}if(a.id==null){a.id=Math.random()}notifications.unshift(a);setNotificationCount(notifications.length);clickNotificationIcon(true);var d=getstore("notifications",0);if(d&1){Q("chimes").play()}var c=null;if(Notification&&(Notification.permission=="granted")){var e=a.text.split("®").join("").split("<b>").join("").split("</b>").join("").split("<br />").join("\r\n");if(a.nodeid){var b=getNodeFromId(a.nodeid);if(b){c=new Notification("{{{title}}} - "+b.name,{tag:a.tag,body:e,icon:"/images/notify/icons128-"+b.icon+".png"})}}else{if(a.icon==null){a.icon=0}var g=a.title;if(g==null){g=""}else{g=" - "+a.title}c=new Notification("{{{title}}}"+g,{tag:a.tag,body:e,icon:"/images/notify/icons128-"+a.icon+".png"})}c.id=a.id;c.xtag=a.tag;c.nodeid=a.nodeid;c.username=a.username;c.onclick=function(h){notificationSelected(h.target.id,true)};a.notification=c}}function deleteAllNotifications(){notifications=[];setNotificationCount(0);drawNotifications();QV("notifiyBox",false)}function setupGeneralServerStats(){window.serverStatCpu=new Chart(document.getElementById("serverCpuChart").getContext("2d"),{type:"doughnut",data:{datasets:[{data:[0,0],backgroundColor:["#AAAAAA","#00AA00"]}],labels:["Used","Free"]},options:{responsive:true,legend:{position:"none",},animation:{animateScale:true,animateRotate:true},width:"60px"}});window.serverStatMemory=new Chart(document.getElementById("serverMemoryChart").getContext("2d"),{type:"doughnut",data:{datasets:[{data:[0,0],backgroundColor:["#AAAAAA","#00AA00"]}],labels:["Used","Free"]},options:{responsive:true,legend:{position:"none",},animation:{animateScale:true,animateRotate:true},width:"60px"}})}var lastServerStats=null;function updateGeneralServerStats(d){if(d!=null){lastServerStats=d}else{d=lastServerStats}if(d==null){return}if(typeof d.cpuavg=="object"){var c=Math.min(d.cpuavg[0],1);window.serverStatCpu.config.data.datasets[0].data=[c,1-c];QH("serverCpuChartText",'<div style=margin-bottom:5px>CPU Load</div><div><b title="CPU load in the last minute">'+(Math.round(d.cpuavg[0]*100)/100)+'</b>, <b title="CPU load in the last 5 minutes">'+(Math.round(d.cpuavg[1]*100)/100)+'</b>, <b title="CPU load in the 15 minutes">'+(Math.round(d.cpuavg[2]*100)/100)+"</b></div>");QS("serverCpuChartView")["display"]="inline-block";window.serverStatCpu.update()}if((typeof d.totalmem=="number")&&(typeof d.freemem=="number")){window.serverStatMemory.config.data.datasets[0].data=[d.totalmem-d.freemem,d.freemem];QH("serverMemoryChartText","<div style=margin-bottom:5px>Memory</div><div><b>"+getNiceSize2(d.freemem)+"</b> free, <b>"+getNiceSize2(d.totalmem)+"</b> total</div>");QS("serverMemoryChartView")["display"]="inline-block";window.serverStatMemory.update()}var e="<div style=width:100% cellpadding=0 cellspacing=0>";if(typeof d.values=="object"){for(var a in d.values){e+="<div class=userTableHeader style=margin-bottom:4px;width:200px>"+a+"</div>";for(var b in d.values[a]){e+="<div style=display:inline-block><table class=serverStateTableCell><tr><td class=h1></td><td><span>"+b+"</span><span style=float:right>"+d.values[a][b]+"</span></td><td class=h2></td></tr></table></div>"}}}e+="</div>";QH("serverStatsTable",e)}var serverTimelineStats=null;var serverTimelineConfig={type:"line",data:{labels:[],datasets:[{label:"",backgroundColor:"rgba(255, 99, 132, .5)",borderColor:"rgb(255, 99, 132)",data:[],fill:true}]},options:{responsive:true,maintainAspectRatio:false,elements:{line:{cubicInterpolationMode:"monotone"}},scales:{xAxes:[{type:"time",time:{tooltipFormat:"ll HH:mm"},display:true,scaleLabel:{display:false,labelString:""}}],yAxes:[{type:"linear",display:true,scaleLabel:{display:true,labelString:""}}]}}};function refreshServerTimelineStats(a){meshserver.send({action:"servertimelinestats",hours:24*30})}function pastDate(a){var b=new Date();b.setTime(b.getTime()-(60*60*1000*a));return b}function setServerTimelineStats(a){serverTimelineStats=a;updateServerTimelineStats()}function addServerTimelineStats(b){if(serverTimelineStats==null){return}serverTimelineStats.push(b);var a=Q("p40type").value;if(a==0){serverTimelineConfig.data.datasets[0].data.push({x:b.time,y:b.conn.ca});serverTimelineConfig.data.datasets[1].data.push({x:b.time,y:b.conn.cu});serverTimelineConfig.data.datasets[2].data.push({x:b.time,y:b.conn.us});serverTimelineConfig.data.datasets[3].data.push({x:b.time,y:b.conn.rs});if(b.conn.am!=null){serverTimelineConfig.data.datasets[4].data.push({x:b.time,y:b.conn.am})}}else{if(a==1){serverTimelineConfig.data.datasets[0].data.push({x:b.time,y:b.mem.external/(1024*1024)});serverTimelineConfig.data.datasets[1].data.push({x:b.time,y:b.mem.heapUsed/(1024*1024)});serverTimelineConfig.data.datasets[2].data.push({x:b.time,y:b.mem.heapTotal/(1024*1024)});serverTimelineConfig.data.datasets[3].data.push({x:b.time,y:b.mem.rss/(1024*1024)})}}updateServerTimelineHours()}function updateServerTimelineHours(){serverTimelineConfig.options.scales.yAxes[0].type=(Q("p40log").checked?"logarithmic":"linear");serverTimelineConfig.options.scales.xAxes[0].time={min:pastDate(Q("p40time").value)};window.serverMainStats.update()}function setupServerTimelineStats(){window.serverMainStats=new Chart(document.getElementById("serverMainStats").getContext("2d"),serverTimelineConfig)}function updateServerTimelineStats(){var b,a=Q("p40type").value,e=pastDate(Q("p40time").value);serverTimelineConfig.options.scales.xAxes[0].time={min:e};if(a==0){serverTimelineConfig.options.scales.yAxes[0].scaleLabel.labelString="Connection Count";b={labels:[pastDate(0),e],datasets:[{label:"Agents",data:[],backgroundColor:"rgba(158, 151, 16, .1)",borderColor:"rgb(158, 151, 16)",fill:true},{label:"Users",data:[],backgroundColor:"rgba(16, 84, 158, .1)",borderColor:"rgb(16, 84, 158)",fill:true},{label:"User Sessions",data:[],backgroundColor:"rgba(255, 99, 132, .1)",borderColor:"rgb(255, 99, 132)",fill:true},{label:"Relay Sessions",data:[],backgroundColor:"rgba(39, 158, 16, .1)",borderColor:"rgb(39, 158, 16)",fill:true},{label:"Intel AMT",data:[],backgroundColor:"rgba(134, 16, 158, .1)",borderColor:"rgb(134, 16, 158)",fill:true}]};for(var c=0;c<serverTimelineStats.length;c++){var d=new Date(serverTimelineStats[c].time);if(serverTimelineStats[c].conn){b.datasets[0].data.push({x:serverTimelineStats[c].time,y:serverTimelineStats[c].conn.ca});b.datasets[1].data.push({x:serverTimelineStats[c].time,y:serverTimelineStats[c].conn.cu});b.datasets[2].data.push({x:serverTimelineStats[c].time,y:serverTimelineStats[c].conn.us});b.datasets[3].data.push({x:serverTimelineStats[c].time,y:serverTimelineStats[c].conn.rs});if(serverTimelineStats[c].conn.am!=null){b.datasets[4].data.push({x:serverTimelineStats[c].time,y:serverTimelineStats[c].conn.am})}}}}else{if(a==1){serverTimelineConfig.options.scales.yAxes[0].scaleLabel.labelString="Megabytes";b={labels:[pastDate(0),e],datasets:[{label:"External",data:[],backgroundColor:"rgba(158, 151, 16, .1)",borderColor:"rgb(158, 151, 16)",fill:true},{label:"Heap Used",data:[],backgroundColor:"rgba(16, 84, 158, .1)",borderColor:"rgb(16, 84, 158)",fill:true},{label:"Heap Total",data:[],backgroundColor:"rgba(255, 99, 132, .1)",borderColor:"rgb(255, 99, 132)",fill:true},{label:"RSS",data:[],backgroundColor:"rgba(39, 158, 16, .1)",borderColor:"rgb(39, 158, 16)",fill:true}]};for(var c=0;c<serverTimelineStats.length;c++){b.datasets[0].data.push({x:serverTimelineStats[c].time,y:serverTimelineStats[c].mem.external/(1024*1024)});b.datasets[1].data.push({x:serverTimelineStats[c].time,y:serverTimelineStats[c].mem.heapUsed/(1024*1024)});b.datasets[2].data.push({x:serverTimelineStats[c].time,y:serverTimelineStats[c].mem.heapTotal/(1024*1024)});b.datasets[3].data.push({x:serverTimelineStats[c].time,y:serverTimelineStats[c].mem.rss/(1024*1024)})}}}serverTimelineConfig.data=b;window.serverMainStats.update()}function p40downloadEvents(){var a="time, conn.agent, conn.users, conn.usersessions, conn.relaysession, conn.intelamt, mem.external, mem.heapused, mem.heaptotal, mem.rss\r\n";for(var b=0;b<serverTimelineStats.length;b++){if(serverTimelineStats[b].conn&&serverTimelineStats[b].mem){a+=new Date(serverTimelineStats[b].time)+", "+serverTimelineStats[b].conn.ca+", "+serverTimelineStats[b].conn.cu+", "+serverTimelineStats[b].conn.us+", "+serverTimelineStats[b].conn.rs+", "+(serverTimelineStats[b].conn.am?serverTimelineStats[b].conn.am:"")+", "+serverTimelineStats[b].mem.external+", "+serverTimelineStats[b].mem.heapUsed+", "+serverTimelineStats[b].mem.heapTotal+", "+serverTimelineStats[b].mem.rss+"\r\n"}}saveAs(new Blob([a],{type:"application/octet-stream"}),"ServerStats.csv")}var serverTrace=[];var serverTraceSources=[];function displayServerTrace(){var c="",b=parseInt(Q("p41limitdropdown").value);if(serverTrace.length>b){serverTrace.splice(b)}for(var a in serverTrace){c+="<div class=traceEvent>"+EscapeHtml(new Date(serverTrace[a].time).toLocaleTimeString())+" - <b>"+EscapeHtml(serverTrace[a].source.toUpperCase())+"</b>: "+EscapeHtml(serverTrace[a].args.join(", "))+"</div>"}QH("p41events",c)}function clearServerTracing(){serverTrace=[];displayServerTrace()}function setServerTracing(){var a="";a+='<div style="width:100%;border-bottom:1px solid gray;margin-bottom:5px;margin-top:5px"><b>Core Server</b></div>';a+="<div><label><input type=checkbox id=p41c1 "+((serverTraceSources.indexOf("cookie")>=0)?"checked":"")+">Cookie encoder</label></div>";a+="<div><label><input type=checkbox id=p41c2 "+((serverTraceSources.indexOf("dispatch")>=0)?"checked":"")+">Message Dispatcher</label></div>";a+="<div><label><input type=checkbox id=p41c3 "+((serverTraceSources.indexOf("main")>=0)?"checked":"")+">Main Server Messages</label></div>";a+="<div><label><input type=checkbox id=p41c4 "+((serverTraceSources.indexOf("peer")>=0)?"checked":"")+">MeshCentral Server Peering</label></div>";a+='<div style="width:100%;border-bottom:1px solid gray;margin-bottom:5px;margin-top:5px"><b>Web Server</b></div>';a+="<div><label><input type=checkbox id=p41c5 "+((serverTraceSources.indexOf("web")>=0)?"checked":"")+">Web Server</label></div>";a+="<div><label><input type=checkbox id=p41c6 "+((serverTraceSources.indexOf("webrequest")>=0)?"checked":"")+">Web Server Requests</label></div>";a+="<div><label><input type=checkbox id=p41c7 "+((serverTraceSources.indexOf("relay")>=0)?"checked":"")+">Web Socket Relay</label></div>";a+='<div style="width:100%;border-bottom:1px solid gray;margin-bottom:5px;margin-top:5px"><b>Intel AMT</b></div>';a+="<div><label><input type=checkbox id=p41c9 "+((serverTraceSources.indexOf("webrelay")>=0)?"checked":"")+">Connection Relay</label></div>";a+="<div><label><input type=checkbox id=p41c10 "+((serverTraceSources.indexOf("mps")>=0)?"checked":"")+">CIRA Server</label></div>";a+="<div><label><input type=checkbox id=p41c11 "+((serverTraceSources.indexOf("mpscmd")>=0)?"checked":"")+">CIRA Server Commands</label></div>";setDialogMode(2,"Server Tracing",7,setServerTracingEx,a)}function setServerTracingEx(c){var g=[],a=["cookie","dispatch","main","peer","web","webrequest","relay","webrelaydata","webrelay","mps","mpscmd","swarm","swarmcmd"];if(c==1){for(var e=1;e<13;e++){try{if(Q("p41c"+e).checked){g.push(a[e-1])}}catch(d){}}}meshserver.send({action:"traceinfo",traceSources:g})}function p41downloadServerTrace(){var a="time, source, message\r\n";for(var b in serverTrace){a+='"'+new Date(serverTrace[b].time).toLocaleTimeString()+'","'+serverTrace[b].source+'","'+serverTrace[b].args.join(", ")+'"\r\n'}saveAs(new Blob([a],{type:"application/octet-stream"}),"servertrace.csv");return false}var xxdialogMode;var xxdialogFunc;var xxdialogButtons;var xxdialogTag;var xxcurrentView=-1;function setDialogMode(j,k,a,e,d,h){setSessionActivity();QV("uiMenu",false);xxdialogMode=j;xxdialogFunc=e;xxdialogButtons=a;xxdialogTag=h;QS("dialog").width=null;QS("dialog").left=null;QS("dialog").right=null;QE("idx_dlgOkButton",true);QV("idx_dlgOkButton",a&1);QV("idx_dlgCancelButton",a&2);QV("id_dialogclose",(a&2)||(a&8));QV("idx_dlgDeleteButton",a&4);QV("idx_dlgButtonBar",a&7);if(k){QH("id_dialogtitle",k)}for(var g=1;g<24;g++){QV("dialog"+g,g==j)}QV("dialog",j);if(d){if(j==2){QH("id_dialogOptions",d)}else{QH("id_dialogMessage",d)}}}function dialogclose(e){setSessionActivity();var c=xxdialogFunc,a=xxdialogButtons,d=xxdialogTag;setDialogMode();if(((a&8)||e)&&c){c(e,d)}}function center(){setSessionActivity();if(xxcurrentView==11){deskAdjust()}else{if(xxcurrentView==10){masterUpdate(256)}else{if(xxcurrentView==1){masterUpdate(4)}}}}function messagebox(b,a){setSessionActivity();QH("id_dialogMessage",a);setDialogMode(1,b,1)}function statusbox(b,a){setSessionActivity();QH("id_dialogMessage",a);setDialogMode(1,b)}function goBack(){setSessionActivity();if(xxdialogMode){return}if(fullscreen){deskToggleFull()}if((xxcurrentView>=10)&&(xxcurrentView<20)){go(1)}if((xxcurrentView>=20)&&(xxcurrentView<30)){go(2)}if((xxcurrentView>=30)&&(xxcurrentView<40)){go(4)}}function go(j,a){setSessionActivity();if(xxdialogMode){return}QV("uiMenu",false);if(a&&(a.shiftKey==true)&&(j!=15)&&("{{currentNode}}"=="")){if((j>=10)&&(j<=19)){if(currentNode){window.open(window.location.origin+"?node="+currentNode._id.split("/")[2]+"&viewmode="+j+"&hide=16","meshcentral:"+currentNode._id)}}else{if(j<10){window.open(window.location.origin+"?viewmode="+j+"&hide=0","meshcentral:"+j)}}return}if(xxcurrentView==j){return}for(var b=0;b<42;b++){QV("p"+b,b==j)}xxcurrentView=j;var e=["MainMenuMyDevices","MainMenuMyAccount","MainMenuMyEvents","MainMenuMyFiles","MainMenuMyUsers","MainMenuMyServer"];for(var b in e){QC(e[b]).remove("fullselect");QC(e[b]).remove("semiselect")}var c=["LeftMenuMyDevices","LeftMenuMyAccount","LeftMenuMyEvents","LeftMenuMyFiles","LeftMenuMyUsers","LeftMenuMyServer"];for(var b in c){QC(c[b]).remove("lbbuttonsel");QC(c[b]).remove("lbbuttonsel2")}var g=(j<9?"fullselect":"semiselect");var d=(j<9?"lbbuttonsel2":"lbbuttonsel");if(j==1||(j>=10&&j<20)){QC("MainMenuMyDevices").add(g)}if(j==1||(j>=10&&j<20)){QC("LeftMenuMyDevices").add(d)}if(j==2||(j>=20&&j<30)){QC("MainMenuMyAccount").add(g)}if(j==2||(j>=20&&j<30)){QC("LeftMenuMyAccount").add(d)}if(j==3){QC("MainMenuMyEvents").add(g)}if(j==3){QC("LeftMenuMyEvents").add(d)}if(j==4||(j>=30&&j<40)){QC("MainMenuMyUsers").add(g)}if(j==4||(j>=30&&j<40)){QC("LeftMenuMyUsers").add(d)}if(j==5){QC("MainMenuMyFiles").add(g)}if(j==5){QC("LeftMenuMyFiles").add(d)}if((j==6)||(j==115)){QC("MainMenuMyServer").add(g)}if((j==6)||(j==115)||(j==40)){QC("LeftMenuMyServer").add(d)}if(webPageStackMenu&&(j>=10)){QC("column_l").add("room4submenu")}else{QC("column_l").remove("room4submenu")}QV("topbar",j!=0);if((j==0)&&(webPageFullScreen)){QC("body").add("arg_hide")}QV("MainSubMenuSpan",j>=10&&j<20);QV("UserDummyMenuSpan",(j<10)&&(j!=6)&&webPageFullScreen);QV("MeshSubMenuSpan",j>=20&&j<30);QV("UserSubMenuSpan",j>=30&&j<40);QV("ServerSubMenuSpan",j==6||j==115||j==40||j==41);var h={10:"MainDev",11:"MainDevDesktop",12:"MainDevTerminal",13:"MainDevFiles",14:"MainDevAmt",15:"MainDevConsole",16:"MainDevEvents",17:"MainDevInfo",20:"MeshGeneral",30:"UserGeneral",31:"UserEvents",6:"ServerGeneral",40:"ServerStats",41:"ServerTrace",115:"ServerConsole"};for(var b in h){QC(h[b]).remove("style3x");QC(h[b]).remove("style3sel");QC(h[b]).add((j==b)?"style3sel":"style3x")}if(j==11){deskAdjust()}if(j==115){QV("p15",true)}QV("p15uploadCore",j!=115);QV("p15BackButton",j!=115);if((j==15)||(j==115)){setupConsole()}if(j==1){masterUpdate(4)}if((j==2)&&Notification){QV("accountEnableNotificationsSpan",Notification.permission!="granted")}if((j==40)&&(serverTimelineStats==null)){refreshServerTimelineStats()}if((currentNode)&&(j>=10)&&(j<20)){document.title=decodeURIComponent("{{{extitle}}}")+" - "+currentNode.name+" - "+meshes[currentNode.meshid].name}else{document.title=decodeURIComponent("{{{extitle}}}")}}function joinPaths(){var c=[];for(var a in arguments){var b=arguments[a];if((b!=null)&&(b!="")){while(b.endsWith("/")||b.endsWith("\\")){b=b.substring(0,b.length-1)}while(b.startsWith("/")||b.startsWith("\\")){b=b.substring(1)}c.push(b)}}return c.join("/")}function putstore(g,j){try{if((typeof(localStorage)==="undefined")||(localStorage.getItem(g)==j)){return}if(j==null){localStorage.removeItem(g)}else{localStorage.setItem(g,j)}}catch(a){}if(g[0]!="_"){var h={};for(var b=0,d=localStorage.length;b<d;++b){var c=localStorage.key(b);if(c[0]!="_"){h[c]=localStorage.getItem(c)}}meshserver.send({action:"userWebState",state:JSON.stringify(h)})}}function getstore(b,d){try{if(typeof(localStorage)==="undefined"){return d}var c=localStorage.getItem(b);if((c==null)||(c==null)){return d}return c}catch(a){return d}}function addLink(b,a){return"<span tabindex=0 style=cursor:pointer;text-decoration:none onclick='"+a+"' onkeypress=\"if (event.key=='Enter') {"+a+'} ">'+b+" <img class=hoverButton src=images/link5.png></span>"}function addLinkConditional(d,b,a){if(a){return addLink(d,b)}return d}function haltEvent(a){if(a.preventDefault){a.preventDefault()}if(a.stopPropagation){a.stopPropagation()}return false}function addOption(c,d,a){var b=document.createElement("option");b.text=d;b.value=a;Q(c).add(b)}function passwordcheck(a){return(a.length>7)&&(/\d/.test(a))&&(/[a-z]/.test(a))&&(/[A-Z]/.test(a))&&(/\W/.test(a))}function methodcheck(a){if(a&&a!=null&&a.Body&&a.Body.ReturnValueStr!="SUCCESS"){messagebox("Call Error",a.Header.Method+": "+a.Body.ReturnValueStr.replace("_"," "));return true}return false}function TableStart(){return"<table cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td width=200px><p><td>"}function TableStart2(){return"<table cellpadding=0 cellspacing=0 style=width:100%;border-radius:8px><tr><td><p><td>"}function TableEntry(a,b){return"<tr><td><p>"+a+"<td>"+b}function FullTable(c,a){var b=TableStart();for(i in c){if(i&&c[i]){b+=TableEntry(i,c[i])}}return b+TableEnd(a)}function TableEnd(a){return"<tr><td colspan=2><p>"+(a?a:"")+"</table>"}function AddButton(b,a){return"<input type=button value='"+b+"' onclick='"+a+"' style=margin:4px>"}function AddButton2(b,a){return"<input type=button value='"+b+"' onclick='"+a+"'>"}function AddRefreshButton(a){return"<input type=button name=refreshbtn value=Refresh onclick='refreshButtons(false);"+a+"' style=margin:4px "+(refreshButtonsState==false?"disabled":"")+">"}function MoreStart(){return'<a href=# style=cursor:pointer;color:blue id=morexxx1 onclick=QV("morexxx1",false);QV("morexxx2",true)>▼ More</a><div id=morexxx2 style=display:none><br><hr>'}function MoreEnd(){return'<a href=# style=cursor:pointer;color:blue onclick=QV("morexxx2",false);QV("morexxx1",true)>▲ Less</a></div>'}function getSelectedOptions(e){var d=[],c;for(var a=0,b=e.options.length;a<b;a++){c=e.options[a];if(c.selected){d.push(c.value)}}return d}function getInstance(b,c){for(var a in b){if(b[a]["InstanceID"]==c){return b[a]}}return null}function getItem(b,c,d){for(var a in b){if(b[a][c]==d){return b[a]}}return null}function guidToStr(a){return a.substring(6,8)+a.substring(4,6)+a.substring(2,4)+a.substring(0,2)+"-"+a.substring(10,12)+a.substring(8,10)+"-"+a.substring(14,16)+a.substring(12,14)+"-"+a.substring(16,20)+"-"+a.substring(20)}function getUrlVars(){var d,a,e=[],b=window.location.href.slice(window.location.href.indexOf("?")+1).split("&");for(var c=0;c<b.length;c++){d=b[c].indexOf("=");if(d>0){e[b[c].substring(0,d)]=b[c].substring(d+1,b[c].length)}}return e}function addHtmlValue(a,b){return"<table><td style=width:120px>"+a+"<td><b>"+b+"</b></table>"}function addHtmlValue2(a,b){return"<div><div style=display:inline-block;float:right>"+b+"</div><div style=display:inline-block>"+a+"</div></div>"}function addHtmlValue3(a,b){return"<div><b>"+a+"</b></div><div style=margin-left:16px>"+b+"</div>"}function parseUriArgs(){var a,c={},b=window.document.location.href.split(/[\?&|\=]/);b.splice(0,1);for(d in b){switch(d%2){case 0:a=decodeURIComponent(b[d]);break;case 1:c[a]=decodeURIComponent(b[d]);var d=parseInt(c[a]);if(d==c[a]){c[a]=d}break;default:break}}return c}function focusTextBox(a){setTimeout(function(){Q(a).selectionStart=Q(a).selectionEnd=65535;Q(a).focus()},0)}function validateEmail(b){var a=/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;return a.test(b)}function isPrivateIP(b){return(b.startsWith("10.")||b.startsWith("172.16.")||b.startsWith("192.168."))}function u2fSupported(){return(window.u2f&&((navigator.userAgent.indexOf("Chrome/")>0)||(navigator.userAgent.indexOf("Firefox/")>0)||(navigator.userAgent.indexOf("Opera/")>0)||(navigator.userAgent.indexOf("Safari/")>0)))}function findOne(a,b){if((a==null)||(b==null)){return false}return b.some(function(c){return a.indexOf(c)>=0})}function copyTextToClip(c){function b(d){if(document.selection){var g=document.body.createTextRange();g.moveToElementText(d);g.select()}else{if(window.getSelection){var g=document.createRange();g.selectNode(d);window.getSelection().removeAllRanges();window.getSelection().addRange(g)}}}var a=document.createElement("DIV");a.textContent=c;document.body.appendChild(a);b(a);document.execCommand("copy");a.remove()}function copyTextToClip2(c){function b(d){if(document.selection){var g=document.body.createTextRange();g.moveToElementText(d);g.select()}else{if(window.getSelection){var g=document.createRange();g.selectNode(d);window.getSelection().removeAllRanges();window.getSelection().addRange(g)}}}var a=document.createElement("DIV");a.textContent=decodeURIComponent(c);document.body.appendChild(a);b(a);document.execCommand("copy");a.remove()}function capitalizeFirstLetter(a){return a.charAt(0).toUpperCase()+a.slice(1)}function printDate(a){return a.toLocaleDateString(args.locale)}function printTime(a){return a.toLocaleTimeString(args.locale)}function printDateTime(a){return a.toLocaleString(args.locale)}function addDetailItem(b,c,a){return"<div><span style=float:right>"+c+"</span><span>"+b+"</span></div>"};</script></body></html>
\ No newline at end of file
1
+<!DOCTYPE html> <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="text/html;charset=utf-8" http-equiv="Content-Type"> <meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="format-detection" content="telephone=no"> <link rel="shortcut icon" type="image/x-icon" href="{{{domainurl}}}favicon.ico"> <link keeplink="1" type="text/css" href="styles/style.css" media="screen" rel="stylesheet" title="CSS"> <style>.ol-box{box-sizing:border-box;border-radius:2px;border:2px solid #00f;}.ol-mouse-position{top:8px;right:8px;position:absolute;}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute;}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width;}.ol-overlay-container{will-change:left,right,top,bottom;}.ol-unsupported{display:none;}.ol-unselectable, .ol-viewport{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing;}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;}.ol-control{position:absolute;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px;}.ol-control:hover{background-color:rgba(255,255,255,.6);}.ol-zoom{top:.5em;right:.5em;}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear;}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s;}.ol-zoom-extent{top:4.643em;left:.5em;}.ol-full-screen{right:.5em;top:.5em;}@media print{.ol-control{display:none;}}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px;}.ol-control button::-moz-focus-inner{border:none;padding:0;}.ol-zoom-extent button{line-height:1.4em;}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform;}.ol-touch .ol-control button{font-size:1.5em;}.ol-touch .ol-zoom-extent{top:5.5em;}.ol-control button:focus, .ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7);}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0;}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px;}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em);}.ol-attribution ul{margin:0;padding:0 .5em;font-size:.7rem;line-height:1.375em;color:#000;text-shadow:0 0 2px #fff;}.ol-attribution li{display:inline;list-style:none;line-height:inherit;}.ol-attribution li:not(:last-child):after{content:" ";}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle;}.ol-attribution button, .ol-attribution ul{display:inline-block;}.ol-attribution.ol-collapsed ul{display:none;}.ol-attribution.ol-logo-only ul{display:block;}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8);}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0;height:1.1em;line-height:1em;}.ol-attribution.ol-logo-only{background:0 0;bottom:.4em;height:1.1em;line-height:1em;}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em;}.ol-attribution.ol-logo-only button, .ol-attribution.ol-uncollapsible button{display:none;}.ol-zoomslider{top:4.5em;left:.5em;height:200px;}.ol-zoomslider button{position:relative;height:10px;}.ol-touch .ol-zoomslider{top:5.5em;}.ol-overviewmap{left:.5em;bottom:.5em;}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0;}.ol-overviewmap .ol-overviewmap-map, .ol-overviewmap button{display:inline-block;}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px;}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute;}.ol-overviewmap.ol-collapsed .ol-overviewmap-map, .ol-overviewmap.ol-uncollapsible button{display:none;}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8);}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7);}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move;}</style> <style> .ol-ctx-menu-container{position:absolute;padding:8px;background:#fff;color:#222;font-size:13px;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,.2);box-sizing:border-box}.ol-ctx-menu-container a,.ol-ctx-menu-container div,.ol-ctx-menu-container img,.ol-ctx-menu-container li,.ol-ctx-menu-container span,.ol-ctx-menu-container ul{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}.ol-ctx-menu-container a img{border:none}.ol-ctx-menu-container *,.ol-ctx-menu-container :after,.ol-ctx-menu-container :before{box-sizing:inherit}.ol-ctx-menu-container.ol-ctx-menu-hidden{opacity:0;visibility:hidden;-webkit-transition:visibility 0s linear .3s,opacity .3s;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container ul{list-style:none}.ol-ctx-menu-container li{position:relative;line-height:20px;padding:2px 5px}.ol-ctx-menu-container li:not(.ol-ctx-menu-separator):hover{cursor:pointer;background-color:#333;color:#eee}.ol-ctx-menu-container li.ol-ctx-menu-submenu .ol-ctx-menu-container{border:1px solid #eee;padding:8px;top:0;opacity:0;visibility:hidden;-webkit-transition:visibility 0s linear .3s,opacity .3s;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container li.ol-ctx-menu-submenu:hover .ol-ctx-menu-container{opacity:1;visibility:visible;-webkit-transition-delay:0s;transition-delay:0s}.ol-ctx-menu-container li.ol-ctx-menu-submenu:after{position:absolute;top:7px;right:10px;content:"";display:inline-block;width:.6em;height:.6em;border-right:.3em solid #222;border-top:.3em solid #222;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ol-ctx-menu-container li.ol-ctx-menu-submenu:hover:after{border-color:#eee}.ol-ctx-menu-container li.ol-ctx-menu-separator{padding:0}.ol-ctx-menu-container li.ol-ctx-menu-separator hr{border:0;height:1px;background-image:-webkit-linear-gradient(right,transparent,rgba(0,0,0,.75),transparent);background-image:linear-gradient(270deg,transparent,rgba(0,0,0,.75),transparent)}.ol-ctx-menu-icon{text-indent:20px;background-size:20px auto;background-repeat:no-repeat;background-position:0}.ol-ctx-menu-zoom-in{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABaUlEQVQ4T72U7VHCQBCGn90GtAMuNGCswFiBWIFQgWMFxg6wArECsQKhArEBiB1Qwa1zgQn5IAYcxv13k71n3919L8KJQ07M47+BzgG9TRfZ/JBuWhS6BJFHRJICYrZGZIz3z5Ct2+B7gG6I6kt+wewdkQVwjtkAkR5mC8yu26A1oItR/cTsOweQBdgutD8G7jGm2PJ2n8oqUKIpIjd4HxTM8gvaT/F+AlmWnyWaIXKF95eNguFzTYFhNsdWu9kFgFlaFMANUH3D8wDLoLgSTSD2il8NCe2ZXQBxWDGwxmyUzzOMBZ7wy7Qb2K0wQfXjMOBuhlFpZtNty5sFaTQBuTusZdymeqs1SpYKcO9HkE3KbTd9WFijMHJQ5hBNEAYNq5Qd0dhyke0GiE4QzjqfW23mHT8Hl4DG4Lce3FPE7AtbBSdsbNqpoJLgYkRnNeUV+xwJDHTnUEkxHGbhBXUs5TjJjew/KPy94g+NRaIVRYmMXwAAAABJRU5ErkJggg==")}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-in{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABc0lEQVQ4T71U21ECQRDsJgGdvQDECMQIxAjECMQILCPwzAAjECIQI0AiEDPQAPaWCBhrcKHuCUcV5f7dY3v6tUscefHIePhfwBBCF8CZqRCReRs1tQxDCH1VfQLQz4EsSY4AvIjIsgm8AhhCGKrqa9zwrqoLAKckB5HtguR1E2gBMITQU9VPAD8GICIGtl3e+xHJBwBT59xtHcsCYJZlUwA3kcGHbfDep51OZywi3/acZZm9vyJ5WR5o38uACmDunNt6ZwAkUxFZDwghDFT1jeSjiJinhVUBVNVJkiTDKO8CQA+AsbNQ7s1Ps0VVn5MkSfcCtmBoDZi1Bdx4eJ7zbBolrwPy3o9J3rWSHPs3A1BbjVKlYBaIyDgvu9LDXDU2RTZmXVW1oKyLxRD+OrkOrJLy5mVM0iaftDhuhVbsvBzMglzKUNW6IV/OOWtCM8MmVvEkmbwt83LaB19fdgOtVquUZJeknaDdobTwbOcvBzPcN/AXH1DFFWP7u9oAAAAASUVORK5CYII=")}.ol-ctx-menu-zoom-out{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABU0lEQVQ4T72U7VECMRRFz3sNaAdkacC1AtcKxApcKnCsQOwAK3CtQKxAqEBsANYOqCDPyTIC+8WCw5jfybn33dxEOPGSE/P4b6BzQG89RT47ZJoWhy5B5BGRZAMxWyEyxvtnyFdt8AagS1F9KQ6YvSMyB84xGyDSw2yO2XUbtAJ0MaqfmH0XAPIA2y7tj4F7jAm2uG1yWQZKNEHkBu+Dg2njWBJNEbnC+8uaIFRuWfuG2QxbbrOrUd0A1Tc8D7AIjkur7DAAsVf8MiWMZ3ZR2m02LPIMscATfjHqBnY7TFD9OAy4zTCCPG/MUKMM5O6wkXFr9dZq7FQqqHk/hDzbFa73cFONTZFDdRyiCcKg5rrSiLaXkiI6RjjrfG6VzDs+B5eAxuDXeYpmNRGzL2wZ/wof+du4GNFpBVqqz5HA4MM5VEYYDrOs+1I6Q9u/4Q8O9wN/AGgWjBVqQjjgAAAAAElFTkSuQmCC")}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-out{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABYklEQVQ4T72U4VHCQBCF36tA91KAWIFYgViBWIFYgWMFYgdYgVCBWAFSgdiBFpAsFWSdxcDkQoBkhnF/ZjbfvX377ogjF4/Mw/8CVbUD4MynEJF5k2lqFapqz8yeAPRKkCXJEYAXEVnugm8BVXVgZq/FD+9mtgBwSrJfqF2QvN4FjYCq2jWzTwA/DhARh20qTdMRyQcA0xDCbZ3KCJhl2RTATaHgo+6HLMv8+xXJy+qB3l8FGoB5CKHsXcRV1b6ZvZF8FBH3NKotoJlNkiQZFONdlLtJ3rufbouZPSdJMjwIbKDQEzBrClx7eC4i33Uepmk6JnnXaOQifzMAtdGoRApugYiMI1uqKkrRWAfZo9MxM1+UZzFewl8mN4nYdVM83L7BkwbXLUrF3sfBLQDQBbDy08x8vOohXyEE71lVq9emuEk+3gZa3XYroCvwFyjP8yHJDsnxwaU08GxvS2uFhw78BbzWrxXgMbsHAAAAAElFTkSuQmCC")}</style> <script type="text/javascript" src="scripts/u2f-api.js"></script> <script type="text/javascript" src="scripts/charts.js"></script> <script type="text/javascript" src="scripts/filesaver.js"></script> <script type="text/javascript" src="scripts/ol.js"></script> <script type="text/javascript" src="scripts/ol3-contextmenu.js"></script> <title>{{{title}}}</title> </head> <body id="body" onload="if (typeof(startup) !== 'undefined') startup();" oncontextmenu="handleContextMenu(event)" style="display:none;min-width:495px"> <div id="contextMenu" class="contextMenu noselect" style="display:none"> <div id="cxinfo" class="cmtext" onclick="cmaction(1,event)"><b>Information</b></div> <div id="cxdesktop" class="cmtext" onclick="cmaction(3,event)">Desktop</div> <div id="cxterminal" class="cmtext" onclick="cmaction(2,event)">Terminal</div> <div id="cxfiles" class="cmtext" onclick="cmaction(4,event)">Files</div> <div id="cxevents" class="cmtext" onclick="cmaction(5,event)">Events</div> <div id="cxconsole" class="cmtext" onclick="cmaction(6,event)">Console</div> <hr id="cxmgroupsplit"> <div id="cxmdesktop" class="cmtext" onclick="cmaction(7,event)" style="display:none">Multi-Desktop</div> </div> <div id="meshContextMenu" class="contextMenu noselect" style="display:none;min-width:0px"> <div id="cxselectall" class="cmtext" onclick="cmmeshaction(1,event)">Select All</div> <div id="cxselectnone" class="cmtext" onclick="cmmeshaction(2,event)">Select None</div> </div> <div id="termShellContextMenu" class="contextMenu noselect" style="display:none;min-width:0px"> <div id="cxtermnorm" class="cmtext" onclick="cmtermaction(1,event)">Normal Connect</div> <div id="cxtermps" class="cmtext" onclick="cmtermaction(2,event)">PowerShell Connect</div> </div> <div id="container"> <div id="notifiyBox" class="notifiyBox" style="display:none"></div> <div id="masthead" class="noselect"> <div class="title">{{{title}}}</div> <div class="title2">{{{title2}}}</div> <div style="float:right"> <div id="notificationCount" onclick="clickNotificationIcon()" class="unselectable" style="display:none;" title="Click to view current notifications">0</div> </div> <p id="logoutControl">{{{logoutControl}}}<span id="idleTimeoutNotify" style="color:yellow"></span></p> </div> <div id="page_leftbar"> <div style="height:16px"></div> <div id="LeftMenuMyDevices" tabindex="0" class="lbbutton lbbuttonsel" title="My Devices" onclick="go(1,event)" onkeypress="if (event.key=='Enter') { go(1); }"> <div class="lb2"></div> </div> <div id="LeftMenuMyAccount" tabindex="0" class="lbbutton" title="My Account" onclick="go(2,event)" onkeypress="if (event.key=='Enter') { go(2); }"> <div class="lb1"></div> </div> <div id="LeftMenuMyEvents" tabindex="0" class="lbbutton" title="My Events" onclick="go(3,event)" onkeypress="if (event.key=='Enter') { go(3); }"> <div class="lb3"></div> </div> <div id="LeftMenuMyFiles" tabindex="0" class="lbbutton" style="display:none" title="My Files" onclick="go(5,event)" onkeypress="if (event.key=='Enter') { go(5); }"> <div class="lb4"></div> </div> <div id="LeftMenuMyUsers" tabindex="0" class="lbbutton" style="display:none" title="My Users" onclick="go(4,event)" onkeypress="if (event.key=='Enter') { go(4); }"> <div class="lb5"></div> </div> <div id="LeftMenuMyServer" tabindex="0" class="lbbutton" style="display:none" title="My Server" onclick="go(6,event)" onkeypress="if (event.key=='Enter') { go(6); }"> <div class="lb6"></div> </div> </div> <div id="topbar" class="noselect"> <div> <div style="position:relative"> <div tabindex="0" id="uiMenuButton" title="User interface selection" onclick="showUserInterfaceSelectMenu()" onkeypress="if (event.key == 'Enter') showUserInterfaceSelectMenu()">♦ <div id="uiMenu" style="display:none"> <div tabindex="0" id="uiViewButton1" class="uiSelector" onclick="userInterfaceSelectMenu(1)" title="Left bar interface" onkeypress="if (event.key == 'Enter') userInterfaceSelectMenu(1)"><div class="uiSelector1"></div></div> <div tabindex="0" id="uiViewButton2" class="uiSelector" onclick="userInterfaceSelectMenu(2)" title="Top bar interface" onkeypress="if (event.key == 'Enter') userInterfaceSelectMenu(2)"><div class="uiSelector2"></div></div> <div tabindex="0" id="uiViewButton3" class="uiSelector" onclick="userInterfaceSelectMenu(3)" title="Fixed width interface" onkeypress="if (event.key == 'Enter') userInterfaceSelectMenu(3)"><div class="uiSelector3"></div></div> <div tabindex="0" id="uiViewButton4" class="uiSelector" onclick="toggleNightMode()" title="Toggle night mode" onkeypress="if (event.key == 'Enter') toggleNightMode()"><div class="uiSelector4"></div></div> </div> </div> <table id="MainMenuSpan" cellpadding="0" cellspacing="0" class="style1"> <tr> <td tabindex="0" id="MainMenuMyDevices" class="topbar_td style3x" onclick="go(1,event)" onkeypress="if (event.key == 'Enter') go(1)">My Devices</td> <td tabindex="0" id="MainMenuMyAccount" class="topbar_td style3x" onclick="go(2,event)" onkeypress="if (event.key == 'Enter') go(2)">My Account</td> <td tabindex="0" id="MainMenuMyEvents" class="topbar_td style3x" onclick="go(3,event)" onkeypress="if (event.key == 'Enter') go(3)">My Events</td> <td tabindex="0" id="MainMenuMyFiles" class="topbar_td style3x" onclick="go(5,event)" onkeypress="if (event.key == 'Enter') go(5)">My Files</td> <td tabindex="0" id="MainMenuMyUsers" class="topbar_td style3x" onclick="go(4,event)" onkeypress="if (event.key == 'Enter') go(4)">My Users</td> <td tabindex="0" id="MainMenuMyServer" class="topbar_td style3x" onclick="go(6,event)" onkeypress="if (event.key == 'Enter') go(6)">My Server</td> <td class="topbar_td_end style3"> </td> </tr> </table> <div id="MainSubMenuSpan" style="display:none"> <table id="MainSubMenu" cellpadding="0" cellspacing="0" class="style1"> <tr> <td tabindex="0" id="MainDev" class="topbar_td style3x" onclick="go(10,event)" onkeypress="if (event.key == 'Enter') go(10)">General</td> <td tabindex="0" id="MainDevDesktop" class="topbar_td style3x" onclick="go(11,event)" onkeypress="if (event.key == 'Enter') go(11)">Desktop</td> <td tabindex="0" id="MainDevTerminal" class="topbar_td style3x" onclick="go(12,event)" onkeypress="if (event.key == 'Enter') go(12)">Terminal</td> <td tabindex="0" id="MainDevFiles" class="topbar_td style3x" onclick="go(13,event)" onkeypress="if (event.key == 'Enter') go(13)">Files</td> <td tabindex="0" id="MainDevEvents" class="topbar_td style3x" onclick="go(16,event)" onkeypress="if (event.key == 'Enter') go(16)">Events</td> <td tabindex="0" id="MainDevInfo" class="topbar_td style3x" onclick="go(17,event)" onkeypress="if (event.key == 'Enter') go(17)">Details</td> <td tabindex="0" id="MainDevAmt" class="topbar_td style3x" onclick="go(14,event)" onkeypress="if (event.key == 'Enter') go(14)">Intel® AMT</td> <td tabindex="0" id="MainDevConsole" class="topbar_td style3x" onclick="go(15,event)" onkeypress="if (event.key == 'Enter') go(15)">Console</td> <td tabindex="0" id="MainDevPlugins" class="topbar_td style3x" onclick="go(19,event)" onkeypress="if (event.key == 'Enter') go(19)">Plugins</td> <td class="topbar_td_end style3"> </td> </tr> </table> </div> <div id="MeshSubMenuSpan" style="display:none"> <table id="MeshSubMenu" cellpadding="0" cellspacing="0" class="style1"> <tr> <td tabindex="0" id="MeshGeneral" class="topbar_td style3x" onclick="go(20,event)" onkeypress="if (event.key == 'Enter') go(20)">General</td> <td class="topbar_td_end style3"> </td> </tr> </table> </div> <div id="UserSubMenuSpan" style="display:none"> <table id="UserSubMenu" cellpadding="0" cellspacing="0" class="style1"> <tr> <td tabindex="0" id="UserGeneral" class="topbar_td style3x" onclick="go(30,event)" onkeypress="if (event.key == 'Enter') go(30)">General</td> <td tabindex="0" id="UserEvents" class="topbar_td style3x" onclick="go(31,event)" onkeypress="if (event.key == 'Enter') go(31)">Events</td> <td class="topbar_td_end style3"> </td> </tr> </table> </div> <div id="ServerSubMenuSpan" style="display:none"> <table id="ServerSubMenu" cellpadding="0" cellspacing="0" class="style1"> <tr> <td tabindex="0" id="ServerGeneral" class="topbar_td style3x" onclick="go(6,event)" onkeypress="if (event.key == 'Enter') go(6)">General</td> <td tabindex="0" id="ServerStats" class="topbar_td style3x" onclick="go(40,event)" onkeypress="if (event.key == 'Enter') go(40)">Stats</td> <td tabindex="0" id="ServerConsole" class="topbar_td style3x" onclick="go(115,event)" onkeypress="if (event.key == 'Enter') go(115)">Console</td> <td tabindex="0" id="ServerTrace" class="topbar_td style3x" onclick="go(41,event)" onkeypress="if (event.key == 'Enter') go(41)">Trace</td> <td class="topbar_td_end style3"> </td> </tr> </table> </div> <div id="UserDummyMenuSpan"> <table id="UserDummyMenu" cellpadding="0" cellspacing="0" class="style1"> <tr><td class="style3" style=""> </td></tr> </table> </div> </div> </div> </div> <div id="column_l"> <div id="p0" style="display:none"> <div id="p0message"><span id="p0span">Server disconnected</span>, <href onclick="reload()" style="cursor:pointer"><u>click to reconnect</u></href>.</div> </div> <div id="p1" style="display:none"> <div style="display:none" id="devListToolbarViewIcons"> <div tabindex="0" id="devViewButton1" class="viewSelector" onclick="onDeviceViewChange(1)" onkeypress="if (event.key=='Enter') { onDeviceViewChange(1); }" title="Columns"><div class="viewSelector2"></div></div> <div tabindex="0" id="devViewButton2" class="viewSelector" onclick="onDeviceViewChange(2)" onkeypress="if (event.key == 'Enter') { onDeviceViewChange(2); }" title="List"><div class="viewSelector1"></div></div> <div tabindex="0" id="devViewButton3" class="viewSelector" onclick="onDeviceViewChange(3)" onkeypress="if (event.key == 'Enter') { onDeviceViewChange(3); }" title="Desktops"><div class="viewSelector3"></div></div> <div tabindex="0" id="devViewButton4" class="viewSelector" onclick="onDeviceViewChange(4)" onkeypress="if (event.key == 'Enter') { onDeviceViewChange(4); }" title="Map"><div class="viewSelector4"></div></div> </div><div><h1>My Devices</h1></div> <table id="devListToolbarSpan" class="noselect"> <tr> <td class="h1"></td> <td id="devListToolbar" class="style14" style="display:none"> <input type="button" id="SelectAllButton" onclick="selectallButtonFunction();" value="Select All"> <input type="button" id="GroupActionButton" disabled="disabled" value="Group Action" onclick="groupActionFunction()"> <input id="SearchInput" type="text" placeholder="Filter" onchange="masterUpdate(5)" onkeyup="masterUpdate(5)" autocomplete="off" onfocus="onSearchFocus(1)" onblur="onSearchFocus(0)"> <label><input type="checkbox" id="RealNameCheckBox" onclick="onRealNameCheckBox()"><span title="Show devices operating system name">OS Name</span></label> </td> <td id="kvmListToolbar" class="style14" style="display:none"> <input type="button" onclick="connectAllKvmFunction()" value="Connect All"> <input type="button" onclick="disconnectAllKvmFunction()" value="Disconnect All"> <label><input type="checkbox" id="autoConnectDesktopCheckbox" onclick="autoConnectDesktops(event)" title="Automatic connect">Auto </label> <input type="button" onclick="showMultiDesktopSettings()" value="Settings"> </td> <td id="devMapToolbar" class="style14" style="display:none"> <input type="text" id="mapSearchLocation" placeholder="Search Location" onfocus="onMapSearchFocus(1)" onblur="onMapSearchFocus(0)"> <input type="button" value="Search" title="Search for location" onclick="getSearchLocation()"> <input type="button" id="refreshmap" title="Reset map view" value="Reset" onclick="refreshMap(false,true)"> </td> <td class="auto-style1" style="height:100%"> <div style="display:none" id="devListToolbarView"> View <select id="viewselect" onchange="onDeviceViewChange()"> <option value="1">Columns <option value="2">List <option value="3">Desktops <option id="viewselectmapoption" value="4">Map </select> </div> <div style="display:none" id="devListToolbarSort"> Sort <select id="sortselect" onchange="masterUpdate(6)"> <option>Group <option>Power <option>Device <option>Tags </select> </div> <div style="display:none" id="devListToolbarSize"> Size <select id="sizeselect" onchange="onDeviceViewChange()"> <option value="0">Small <option value="1">Medium <option value="2">Large </select> </div> </td> <td class="h2"></td> </tr> </table> <div id="NoMeshesPanel" style="display:none"> <table> <tr> <td valign="top" style="width:50px"> <img src="images/info.png"> </td> <td> <div id="getStarted1">To get started, <a href="#" onclick="return account_createMesh()"><strong>click here to create a device group</strong></a>.</div> <div id="getStarted2">No device groups.</div> </td> </tr> </table> </div> <div id="xdevices" class="noselect" style="display:none"></div> <div id="xdevicesmap" style="display:none"> <div id="xmapSearchResultsDlg" style="display:none"> <div id="xmapSearchResultsBck"> <div id="xmapSearchClose" onclick="mapCloseSearchWindow()"><b>X</b></div> <div style="padding:5px">Location Results</div> <div style="width:100%;margin:6px"></div> </div> <div id="xmapSearchResults" style="margin:6px"></div> </div> </div> <div id="xmap-info-window"></div> </div> <div id="p2" style="display:none"> <h1>My Account</h1> <img id="p2AccountImage" alt="" src="images/clipboard-128.png"> <div id="p2AccountSecurity" style="display:none"> <p><strong>Account security</strong></p> <div style="margin-left:25px"> <div id="manageAuthApp"><div class="p2AccountActions"><span id="authAppSetupCheck"><strong>✓</strong></span></div><span><a href="#" onclick="return account_manageAuthApp()">Manage authenticator app</a><br></span></div> <div id="manageHardwareOtp"><div class="p2AccountActions"><span id="authKeySetupCheck"><strong>✓</strong></span></div><span><a href="#" onclick="return account_manageHardwareOtp(0)">Manage security keys</a><br></span></div> <div id="manageOtp"><div class="p2AccountActions"><span id="authCodesSetupCheck"><strong>✓</strong></span></div><span><a href="#" onclick="return account_manageOtp(0)">Manage backup codes</a><br></span></div> </div> </div> <div id="p2AccountActions"> <p><strong>Account actions</strong></p> <p class="mL"> <span id="verifyEmailId" style="display:none"><a href="#" onclick="return account_showVerifyEmail()">Verify email</a><br></span> <span id="accountEnableNotificationsSpan" style="display:none"><a href="#" onclick="return account_enableNotifications()">Enable web notifications</a><br></span> <a href="#" onclick="return account_showLocalizationSettings()">Localization Settings</a><br> <a href="#" onclick="return account_showAccountNotifySettings()">Notification Settings</a><br> <span id="accountChangeEmailAddressSpan" style="display:none"><a href="#" onclick="return account_showChangeEmail()">Change email address</a><br></span> <a href="#" onclick="return account_showChangePassword()">Change password</a><span id="p2nextPasswordUpdateTime"></span><br> <a href="#" onclick="return account_showDeleteAccount()">Delete account</a><br> </p> <br style="clear:both"> </div> <strong>Device Groups</strong> <span id="p2createMeshLink1">( <a href="#" onclick="return account_createMesh()" class="newMeshBtn"> New</a> )</span> <br><br> <div id="p2meshes"></div> <div id="p2noMeshFound" style="display:none">No device groups.<span id="p2createMeshLink2"> <a href="#" onclick="return account_createMesh()"><strong>Get started here!</strong></a></span></div> <br style="clear:both"> </div> <div id="p3" style="display:none"> <h1>My Events</h1> <table class="pTable"> <tr> <td class="h1"></td> <td class="auto-style1"> Show <select id="p3limitdropdown" onchange="refreshEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <a href="#" onclick="p3showDownloadEventsDialog(2)"><img src="images/link4.png" height="10" width="10" title="Download Events" style="cursor:pointer"></a> </td> <td class="h2"></td> </tr> </table> <div id="p3events" style=""></div> </div> <div id="p4" style="display:none"> <h1>My Users</h1> <table class="pTable"> <tr> <td class="h1"></td> <td class="style14"> <div style="float:right"> <input type="button" onclick="showUserBroadcastDialog()" style="margin-right:6px" value="Broadcast"> <a href="#" onclick="p4downloadUserInfo()"><img style="cursor:pointer" title="Download user information" src="images/link4.png"></a> <a href="#" onclick="p4batchAccountCreate()"><img id="p4UserBatchCreate" style="cursor:pointer;display:none" title="Batch create many user accounts" src="images/link6.png"></a> </div> <div> <input id="UserNewAccountButton" type="button" style="margin-left:6px" onclick="showCreateNewAccountDialog()" value="New Account..."> <input id="UserSearchInput" type="text" style="width:120px;margin-left:6px" placeholder="Filter" onchange="onUserSearchInputChanged()" onkeyup="onUserSearchInputChanged()" autocomplete="off" onfocus="onUserSearchFocus(1)" onblur="onUserSearchFocus(0)"> </div> </td> <td class="h2"></td> </tr> </table> <div id="p3users"></div> </div> <div id="p5" style="display:none"> <h1>My Files</h1> <table id="p5toolbar" cellpadding="0" cellspacing="0"> <tr> <td id="p5filehead" valign="bottom"> <div id="p5rightOfButtons"></div> <div> <input type="button" id="p5FolderUp" disabled="disabled" onclick="return p5folderup();" value="Up"> <input type="button" id="p5SelectAllButton" disabled="disabled" onclick="p5selectallfile();" value="Select All"> <input type="button" id="p5RenameFileButton" disabled="disabled" value="Rename" onclick="p5renamefile();"> <input type="button" id="p5DeleteFileButton" disabled="disabled" value="Delete" onclick="p5deletefile();"> <input type="button" id="p5NewFolderButton" disabled="disabled" value="New Folder" onclick="p5createfolder();"> <input type="button" id="p5UploadButton" disabled="disabled" value="Upload" onclick="p5uploadFile()"> <input type="button" id="p5CutButton" disabled="disabled" value="Cut" onclick="p5copyFile(1)"> <input type="button" id="p5CopyButton" disabled="disabled" value="Copy" onclick="p5copyFile(0)"> <input type="button" id="p5PasteButton" disabled="disabled" value="Paste" onclick="p5pasteFile()"> </div> </td> </tr> <tr> <td id="p5filesubhead"> <div style="float:right"> <select id="p5sortdropdown" onchange="updateFiles()"> <option value="1" selected="selected">Sort by name <option value="2">Sort by size <option value="3">Sort by date <option value="4">Descend by name <option value="5">Descend by size <option value="6">Descend by date </select> </div> <div> <span id="p5currentpath"></span></div> </td> </tr> </table> <div id="p5filetable"> <div id="p5PublicShare" style=""><div>These files are shared publicly, click "link" to get public url.</div></div> <div id="bigok" style="display:none"><b>✓</b></div> <div id="bigfail" style="display:none"><b>✗</b></div> <span id="p5files"></span> </div> <table id="p5toolbarBottom" style="width:100%" cellpadding="0" cellspacing="0"> <tr><td class="style6"> <span id="p5bottomstatus"></span></td></tr> </table> </div> <div id="p6" style="display:none"> <img id="MainMeshImage" src="serverpic.ashx"> <h1>My Server</h1> <div id="p2ServerActions"> <p><strong>Server actions</strong></p> <div class="mL"> <div id="p2ServerActionsBackup"><a href="{{{domainurl}}}backup.zip" rel="noreferrer noopener" target="_blank">Download server backup</a></div> <div id="p2ServerActionsRestore"><a href="#" onclick="return server_showRestoreDlg()">Restore server with backup</a></div> <div id="p2ServerActionsVersion"><a href="#" onclick="return server_showVersionDlg()">Check server version</a></div> <div id="p2ServerActionsErrors"><a href="#" onclick="return server_showErrorsDlg()">Show server error log</a></div> </div> </div> <br><strong>Server Statistics</strong><br><br> <div id="serverStats"> <div id="serverCpuChartView" style="display:none"> <div class="chartViewCanvas"><canvas id="serverCpuChart"></canvas></div> <div class="chartViewText" id="serverCpuChartText"></div> </div> <div id="serverMemoryChartView" style="display:none"> <div class="chartViewCanvas"><canvas id="serverMemoryChart"></canvas></div> <div class="chartViewText" id="serverMemoryChartText"></div> </div><br><br> <div id="serverStatsTable"></div> </div> </div> <div id="p10" style="display:none"> <table style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="width:auto" valign="top"> <div id="p10title"> <div id="p10BackButton"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p10deviceName"></span></h1> </div> <div id="p10html"></div> </td> <td style="width:20px"></td> <td style="width:200px"> <a href="#" onclick="p10showiconselector()"><img id="MainComputerImage"></a> <div id="MainComputerState"></div> </td> </tr> </table><br> <div id="p10html2"></div> <div id="p10html3"></div> </div> <div id="p11" class="noselect" style="display:none"> <div id="p11title"> <div id="p11deviceNameHeader"> <div id="p11BackButton"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <div id="devListToolbarViewIcons"><div class="viewSelector" onclick="deskToggleFull(event)" title="Full Screen. Hold shift to browser full screen."><div class="viewSelector5"></div></div></div> <h1>Desktop - <span id="p11deviceName"></span></h1> </div> </div> <div id="p11warning" onclick="showFeaturesDlg()"> <div class="icon2"></div> <div class="warningbox">Intel® AMT Redirection port or KVM feature is disabled<span id="p11warninga">, click here to enable it.</span></div> </div> <div id="p11warning2" onclick="showPowerActionDlg()"> <div class="icon2"></div> <div class="warningbox">Remote computer is not powered on, click here to issue a power command.</div> </div> <div id="deskarea0" cellpadding="0" cellspacing="0"> <div id="deskarea1" class="areaHead"> <div class="toright2"> <span id="p11power"></span> <div class='deskareaicon' title="Toggle View Mode" onclick="toggleAspectRatio(1)">⇲</div> <div class='deskareaicon' title="Rotate Left" onclick="drotate(-1)">↺</div> <div class='deskareaicon' title="Rotate Right" onclick="drotate(1)">↻</div> <div id="deskRecordIcon" class='deskareaicon' title="Server is recording this session" style="display:none;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px"></div> <input id="deskFocusBtn" type="button" title="Toggle focus mode, when active only the region around the mouse is updated" onkeypress="return false" onkeydown="return false" value="Focus All" onclick="deskToggleFocus()" style="margin-right:3px;display:none"> <input id="deskSaveBtn" type="button" title="Save a screenshot of the remote desktop" onkeypress="return false" onkeydown="return false" value="Save..." onclick="deskSaveImage()" class="mR"> <input id="deskActionsBtn" type="button" title="Perform power actions on the device" onkeypress="return false" onkeydown="return false" value="Actions" onclick="deviceActionFunction()" class="mR"> <input id="deskActionsSettings" type="button" value="Settings..." title="Edit remote desktop settings" onkeypress="return false" onkeydown="return false" onclick="showDesktopSettings()" class="mR"> <input type="button" title="Change the power state of the remote machine" onkeypress="return false" onkeydown="return false" value="Power Actions..." onclick="showPowerActionDlg()" style="display:none"> </div> <div> <div id="idx_deskFullBtn2" onclick="deskToggleFull(event)"> ✖</div> <input type="button" id="autoconnectbutton1" value="AutoConnect" onclick="autoConnectDesktop(event)" onkeypress="return false" onkeydown="return false" style="display:none"> <span id="connectbutton1span"><input type="button" id="connectbutton1" value="Connect" onclick="connectDesktop(event,1)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="connectbutton1hspan"> <input type="button" id="connectbutton1h" value="HW Connect" onclick="connectDesktop(event,2)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="disconnectbutton1span"> <input type="button" id="disconnectbutton1" value="Disconnect" onclick="connectDesktop(event,0)" onkeypress="return false" onkeydown="return false"></span> <span id="deskstatus">Disconnected</span> </div> </div> <div id="deskarea2" style=""> <div class="areaProgress"><div id="progressbar" style=""></div></div> </div> <div id="deskarea3x"> <div id="DeskFocus" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)"></div> <div id="DeskParent"> <canvas id="Desk" width="640" height="480" oncontextmenu="return false" onmousedown="dmousedown(event)" onmouseup="dmouseup(event)" onmousemove="dmousemove(event)" onmousewheel="dmousewheel(event)"></canvas> </div> <div id="DeskTools"> <div id="deskToolsAreaTop"> <a id="DeskToolsRefreshButton" style="right:2px" onclick="refreshDeskTools()">Refresh</a> <div id="deskToolsTopTabProcess" class="deskToolsTopTab" onclick="changeDeskToolTab(0)" style="left:0px;bottom:0px">Processes</div> <div id="deskToolsTopTabService" class="deskToolsTopTab" onclick="changeDeskToolTab(1)" style="display:none;left:90px;color:gray">Services</div> </div> <div id="deskToolsArea"> <div id="DeskToolsProcessTab"> <div id="deskToolsHeader"> <a class="colmn1" title="Sort by process id" onclick="sortProcess(0)">PID</a> <a class="colmn2" title="Sort by name" onclick="sortProcess(1)">Name</a> </div> <div id="DeskToolsProcesses" style=""></div> </div> <div id="DeskToolsServiceTab" style="display:none"> <div id="deskToolsServiceHeader"> <a class="colmn1" style="width:70px" title="Sort by state" onclick="sortService(0)">State</a> <a class="colmn2" title="Sort by name" onclick="sortService(1)">Name</a> </div> <div id="DeskToolsServices" style=""></div> </div> </div> </div> <div id="p11DeskConsoleMsg" style="display:none;cursor:pointer;position:absolute;left:30px;top:17px;color:yellow;background-color:rgba(0,0,0,0.6);padding:10px;border-radius:5px" onclick="p11clearConsoleMsg()"></div> </div> <div id="deskarea4" class="areaFoot"> <div class="toright2"> <span id="DeskTimer" title="Session time"></span> <select id="termdisplays" style="display:none" onchange="deskSetDisplay(event)" onkeypress="return false" onkeydown="return false"></select> <input id="DeskToolsButton" type="button" value="Tools" title="Toggle tools view" onkeypress="return false" onkeydown="return false" onclick="toggleDeskTools()"> <span id="DeskChatButton" class="deskarea" title="Open chat window to this computer"><img src='images/icon-chat.png' onclick="deviceChat()" height="16" width="16" style="padding-top:2px"></span> <span id="DeskNotifyButton" title="Display a notification on the remote computer"><img src='images/icon-notify.png' onclick="deviceToastFunction()" height="16" width="16" style="padding-top:2px"></span> <span id="DeskOpenWebButton" title="Open a web address on remote computer"><img src='images/icon-url2.png' onclick="deviceUrlFunction()" height="16" width="16" style="padding-top:2px"></span> </div> <div> <select id="deskkeys"> <option value="10">Ctrl+Alt+Del <option value="5">Win <option value="0">Win+Down <option value="1">Win+Up <option value="2">Win+L <option value="3">Win+M <option value="4">Shift+Win+M <option value="6">Win+R <option value="7">Alt-F4 <option value="8">Ctrl-W <option value="9">Alt-Tab <option value="11">Win+Left <option value="12">Win+Right </select> <input id="DeskWD" type="button" value="Send" onkeypress="return false" onkeydown="return false" onclick="deskSendKeys()"> <input id="DeskClip" style="" type="button" value="Clipboard" onkeypress="return false" onkeydown="return false" onclick="showDeskClip()"> <input id="DeskType" style="" type="button" value="Type" onkeypress="return false" onkeydown="return false" onclick="showDeskType()"> <label><span id="DeskControlSpan" title="Toggle mouse and keyboard input"><input id="DeskControl" type="checkbox" onkeypress="return false" onkeydown="return false" onclick="toggleKvmControl()">Input</span></label> </div> </div> </div> </div> <div id="p12" style="display:none"> <div id="p12title"> <div id="p12BackButton"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>Terminal - <span id="p12deviceName"></span></h1> </div> <div id="p12warning" onclick="showFeaturesDlg()"> <div class="icon2"></div> <div class="warningbox">Intel® AMT Redirection port or KVM feature is disabled<span id="p12warninga">, click here to enable it.</span></div> </div> <div id="p12warning2" onclick="showPowerActionDlg()"> <div class="icon2"></div> <div class="warningbox">Remote computer is not powered on, click here to issue a power command.</div> </div> <div id="termTable" style="position:relative"> <table style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td class="areaHead"> <div class="toright2"> <div id="termRecordIcon" class='deskareaicon' title="Server is recording this session" style="display:none;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px;margin-left:5px"></div> <input id="termActionsBtn" type="button" title="Perform power actions on the device" onkeypress="return false" onkeydown="return false" value="Actions" onclick="deviceActionFunction()"> </div> <div> <input type="button" id="autoconnectbutton2" value="AutoConnect" onclick="autoConnectTerminal(event)" onkeypress="return false" onkeydown="return false" style="display:none"> <span id="connectbutton2span"><input type="button" id="connectbutton2" value="Connect" onclick="connectTerminal(event,1)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="connectbutton2hspan"> <input type="button" id="connectbutton2h" value="HW Connect" onclick="connectTerminal(event,2)" onkeypress="return false" onkeydown="return false" disabled="disabled"></span> <span id="disconnectbutton2span"> <input type="button" id="disconnectbutton2" value="Disconnect" onclick="connectTerminal(event,0)" onkeypress="return false" onkeydown="return false"></span> <span id="termstatus">Disconnected</span><span id="termtitle"></span> </div> </td> </tr> <tr> <td> <div class="areaProgress"><div id="termprogressbar" style=""></div></div> </td> </tr> <tr> <td id="termarea3x"> <pre id="Term"></pre> </td> </tr> <tr> <td class="areaFoot"> <div class="toright2"> <span id="TermTimer" title="Session time"></span> <span id="terminalSettingsButtons" style="display:none"> <input id="id_tcrbutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="CR+LF" title="Toggle what the return key will send" onclick="termToggleCr()"> <input id="id_tfxkeysbutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="Intel (F10 = ESC+[OM)" title="Toggle F1 to F10 keys emulation type" onclick="termToggleFx()"> <input id="id_ttypebutton" type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" value="Extended Ascii" title="Toggle terminal emulation type" onclick="termToggleType()"> </span> <span id="terminalSizeDropDown"> <select id="termSizeList" onkeypress="return false"><option value="1">80x25<option value="2">100x30<option value="3" selected="">Auto</select> </span> <select id="specialkeylist" onkeypress="return false"></select> <input id="specialkeylistinput" type="button" onkeypress="return false" class="bottombutton" value="Send" title="Send the selected special key" onclick="sendSpecialKey()"> </div> <div> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="ctrlcbutton" value="Ctl-C" onclick="termSendKey(3,'ctrlcbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="ctrlxbutton" value="Ctl-X" onclick="termSendKey(24,'ctrlxbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="escbutton" value="ESC" onclick="termSendKey(27,'escbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="bsbutton" value="Backspace" onclick="termSendKey(8,'bsbutton')"> <input type="button" onkeypress="return false" onkeydown="return false" class="bottombutton" id="pastebutton" value="Paste" title="Paste text into the terminal" onclick="showTermPasteDialog()"> </div> </td> </tr> </table> <div id="p12TermConsoleMsg" style="display:none;cursor:pointer;position:absolute;left:30px;top:45px;color:yellow;background-color:rgba(0,0,0,0.6);padding:10px;border-radius:5px" onclick="p12clearConsoleMsg()"></div> </div> </div> <div id="p13" style="display:none"> <div id="p13title"> <div id="p13BackButton" style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>Files - <span id="p13deviceName"></span></h1> </div> <table id="p13toolbar" cellpadding="0" cellspacing="0"> <tr> <td class="areaHead"> <div class="toright2"> <input id="filesActionsBtn" type="button" title="Perform power actions on the device" value="Actions" onclick="deviceActionFunction()"> <div id="filesRecordIcon" class='deskareaicon' title="Server is recording this session" style="display:none;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px;margin-left:5px"></div> </div> <div> <input id="p13AutoConnect" value="AutoConnect" onclick="autoConnectFiles(event)" type="button" style="display:none"> <input id="p13Connect" value="Connect" onclick="connectFiles(event)" type="button"> <span id="p13Status">Disconnected</span> </div> </td> </tr> <tr> <td class="areaHead2" valign="bottom"> <div id="p13rightOfButtons" class="toright2"></div> <div> <input type="button" id="p13FolderUp" disabled="disabled" onclick="p13folderup()" value="Up"> <input type="button" id="p13SelectAllButton" disabled="disabled" onclick="p13selectallfile()" value="Select All"> <input type="button" id="p13RenameFileButton" disabled="disabled" value="Rename" onclick="p13renamefile()"> <input type="button" id="p13DeleteFileButton" disabled="disabled" value="Delete" onclick="p13deletefile()"> <input type="button" id="p13ViewFileButton" disabled="disabled" value="Edit" onclick="p13viewfile()"> <input type="button" id="p13NewFolderButton" disabled="disabled" value="New Folder" onclick="p13createfolder()"> <input type="button" id="p13UploadButton" disabled="disabled" value="Upload" onclick="p13uploadFile()"> <input type="button" id="p13CutButton" disabled="disabled" value="Cut" onclick="p13copyFile(1)"> <input type="button" id="p13CopyButton" disabled="disabled" value="Copy" onclick="p13copyFile(0)"> <input type="button" id="p13PasteButton" disabled="disabled" value="Paste" onclick="p13pasteFile()"> <input type="button" id="p13RefreshButton" disabled="disabled" value="Refresh" onclick="p13folderup(9999)"> </div> </td> </tr> <tr> <td class="areaHead3"> <div class="toright2"> <select id="p13sortdropdown" onchange="p13updateFiles()"> <option value="1" selected="selected">Sort by name <option value="2">Sort by size <option value="3">Sort by date <option value="4">Descend by name <option value="5">Descend by size <option value="6">Descend by date </select> </div> <div> <span id="p13currentpath"></span></div> </td> </tr> </table> <div id="p13FilesConsoleMsg" style="display:none;cursor:pointer;position:absolute;left:30px;top:165px;color:yellow;background-color:rgba(0,0,0,0.6);padding:10px;border-radius:5px" onclick="p13clearConsoleMsg()"></div> <div id="p13filetable" style=""> <div id="p13bigok" style="display:none"><b>✓</b></div> <div id="p13bigfail" style="display:none"><b>✗</b></div> <span id="p13files"></span> </div> <table id="p13toolbarBottom" cellpadding="0" cellspacing="0"> <tr><td class="style6"> <span id="p13bottomstatus"></span></td></tr> </table> </div> <div id="p14" style="display:none"> <div id="p14title"> <div id="p14BackButton" style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <div id="devListToolbarViewIcons"><div class="viewSelector" onclick="deskToggleFull(event)" title="Full Screen. Hold shift to browser full screen."><div class="viewSelector5"></div></div></div> <h1>Intel® AMT - <span id="p14deviceName"></span></h1> </div> <iframe id="p14iframe" src="{{{domainurl}}}commander.htm"></iframe> </div> <div id="p15" style="display:none"> <div id="p15title"> <div id="p15BackButton" style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1><span id="p15deviceName"></span></h1> </div> <table id="consoleTable" cellpadding="0" cellspacing="0"> <tr> <td class="areaHead"> <div class="toright2"> <div id="p15coreName" title="Information about current core running on this agent"></div> <input type="button" id="p15uploadCore" value="Agent Action" onclick="p15uploadCore(event)" title="Change the agent Java Script code module"> <img onclick="p15downloadConsoleText()" style="cursor:pointer;margin-top:6px" title="Download console text" src="images/link4.png"> </div> <div id="p15statetext"></div> </td> </tr> <tr> <td> <div class="areaProgress"><div id="consoleprogressbar" style=""></div></div> </td> </tr> <tr> <td id="p15agentConsole"> <pre id="p15agentConsoleText"></pre> </td> </tr> <tr> <td class="areaFoot"> <table style="width:100%"> <tr> <td style="width:99%"> <input id="p15consoleText" style="width:100%" onkeyup="p15consoleSend(event)" onfocus="onConsoleFocus(1)" onblur="onConsoleFocus(0)"> </td> <td> </td> <td id="p15outputselecttd"> <select id="p15outputselect"> <option value="1">Agent <option value="2">MQTT </select> </td> <td style="width:1%"><input id="id_p15consoleClear" type="button" class="bottombutton" value="Clear" onclick="p15consoleClear()"></td> </tr> </table> </td> </tr> </table> </div> <div id="p16" style="display:none"> <div id="p16title"> <div id="p16BackButton" style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>Events - <span id="p16deviceName"></span></h1> </div> <table class="pTable"> <tr> <td class="h1"></td> <td class="auto-style1"> Show <select id="p16limitdropdown" onchange="refreshDeviceEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <a href="#" onclick="p3showDownloadEventsDialog(1)"><img src="images/link4.png" height="10" width="10" title="Download Events" style="cursor:pointer"></a> </td> <td class="h2"></td> </tr> </table> <div id="p16events"></div> </div> <div id="p17" style="display:none"> <div id="p17title"> <div id="p17BackButton" style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>Details - <span id="p17deviceName"></span></h1> </div> <div id="p17info"></div> </div> <div id="p20" style="display:none"> <picture id="MainMeshImage" style="border-width:0px;height:200px;width:200px;float:right"> <source type="image/webp" width="200" height="200" srcset="images/webp/mesh-256.webp"> <img alt="" width="200" height="200" src="images/mesh-256.png"> </source></picture> <div style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p20meshName"></span></h1> <p id="p20info"> </div> <div id="p30" style="display:none"> <table style="width:100%" cellpadding="0" cellspacing="0"> <tr> <td style="width:auto" valign="top"> <div id="p30title"> <div style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>General - <span id="p30userName"></span></h1> </div> <div id="p30html"></div> </td> <td style="width:20px"></td> <td style="width:200px"> <picture id="MainUserImage" style="border-width:0px;height:200px;width:200px;float:right"> <source type="image/webp" width="200" height="200" srcset="images/webp/user-256.webp"> <img alt="" width="200" height="200" src="images/user-256.png"> </source></picture> <div style="width:100%;text-align:center"><strong><span id="MainUserState"></span></strong></div> </td> </tr> </table><br> <div id="p30html2"></div> <div id="p30html3"></div> </div> <div id="p31" style="display:none"> <div style="float:left"><div class="backButton" tabindex="0" onclick="goBack()" title="Back" onkeypress="if (event.key == 'Enter') goBack()"><div class="backButtonEx"></div></div></div> <h1>Events - <span id="p31userName"></span></h1> <table class="pTable"> <tr> <td class="h1"></td> <td class="auto-style1"> Show <select id="p31limitdropdown" onchange="refreshUsersEvents()"> <option value="60">Last 60 <option value="120">Last 120 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <a href="#" onclick="p3showDownloadEventsDialog(3)"><img src="images/link4.png" height="10" width="10" title="Download Events" style="cursor:pointer"></a> </td> <td class="h2"></td> </tr> </table> <div id="p31events" style=""></div> </div> <div id="p40" style="display:none"> <h1>My Server Stats</h1> <div class="areaHead"> <div class="toright2"> <select id="p40type" onchange="updateServerTimelineStats()"> <option value="0">Connections <option value="1">Memory </select> <select id="p40time" onchange="updateServerTimelineHours()"> <option value="3">Last 3 hours <option value="8">Last 8 hours <option value="24">Last day <option value="168">Last week <option value="720">Last 30 days </select> <img src="images/link4.png" height="10" width="10" title="Download data points (.csv)" style="cursor:pointer" onclick="p40downloadEvents()"> </div> <div> <input value="Refresh" type="button" onclick="refreshServerTimelineStats()"> <label><input id="p40log" type="checkbox" onclick="updateServerTimelineHours()">Log-X</label> </div> </div> <canvas id="serverMainStats" style=""></canvas> </div> <div id="p41" style="display:none"> <h1>My Server Tracing</h1> <div class="areaHead"> <div class="toright2"> Show <select id="p41limitdropdown" onchange="displayServerTrace()"> <option value="100">Last 100 <option value="250">Last 250 <option value="500">Last 500 <option value="1000">Last 1000 </select> <input value="Clear" type="button" onclick="clearServerTracing()"> <img src="images/link4.png" height="10" width="10" title="Download trace (.csv)" style="cursor:pointer" onclick="p41downloadServerTrace()"> </div> <div> <input value="Tracing" type="button" onclick="setServerTracing()"> <span id="p41traceStatus">None</span> </div> </div> <div id="p41events" style=""></div> </div> <div id="p19" style="display:none"> <h1>Plugins - <span id="p19deviceName"></span></h1> <style> #p19headers{padding-right:7px;padding-bottom:10px;font-weight:bold;border-bottom:1px dotted blue;}#p19headers > span:nth-child(n+2){border-left:1px solid black;}#p19headers > span{padding-left:4px;padding-right:4px;}</style> <div id="p19headers"></div> <div id="p19pages"></div> </div> <br id="column_l_bottomgap"> </div> <div id="footer"> <div class="footer1">{{{footer}}}</div> <div class="footer2"> <a id="verifyEmailId2" style="display:none" href="#" onclick="account_showVerifyEmail()">Verify Email</a> <a href="terms">Terms & Privacy</a> </div> </div> <div id="dialog" class="noselect" style="display:none"> <div id="dialogHeader"> <div tabindex="0" id="id_dialogclose" onclick="setDialogMode()" onkeypress="if (event.key == 'Enter') setDialogMode()">✖</div> <div id="id_dialogtitle"></div> </div> <div id="dialogBody"> <div id="dialog1"> <div id="id_dialogMessage" style=""></div> </div> <div id="dialog2" style=""> <div id="id_dialogOptions"></div> </div> <div id="dialog3" style=""> <div id="d3upload"> <div>File Selection</div> <select id="d3uploadMode" onchange="d3modechange()"> <option value="1">Local file upload <option value="2">Server file selection </select> </div> <div id="d3localmode" style="display:none"> <div>Upload File</div> <form id="d3localmodeform" method="post" enctype="multipart/form-data" action="uploadfile.ashx" target="fileUploadFrame"> <input type="text" id="d3auth" name="auth" style="display:none"> <input type="text" id="d3attrib" name="attrib" style="display:none"> <input type="file" id="d3localFile" name="files" onchange="d3setActions()"> <input type="submit" id="d3submit" style="display:none"> </form> </div> <div id="d3servermode"> <div id="d3serveraction" valign="bottom"> <input type="button" id="p3FolderUp" disabled="disabled" onclick="d3folderup()" value="Up"> </div> <div id="d3serverfiles"></div> </div> </div> <div id="dialog7" style=""> <div id="d7meshkvm"> <h4>Agent Remote Desktop</h4> <div> <div>Quality</div> <select id="d7bitmapquality" dir="rtl"></select> </div> <div> <div>Scaling</div> <select id="d7bitmapscaling" style="" dir="rtl"> <option selected="selected" value="1024">100% <option value="896">87.5% <option value="768">75% <option value="640">62.5% <option value="512">50% <option value="384">37.5% <option value="256">25% <option value="128">12.5% </select> </div> <div> <div>Frame rate</div> <select id="d7framelimiter" dir="rtl"> <option selected="selected" value="50">Fast <option value="100">Medium <option value="400">Slow <option value="1000">Very slow </select> </div> </div> <div id="d7amtkvm"> <h4>Intel® AMT Hardware KVM</h4> <div> <div>Image Encoding</div> <select id="d7desktopmode"> <option value="1">RLE8, Fastest <option value="2">RLE16, Recommended <option value="3">RAW8, Slow <option value="4">RAW16, Very Slow </select> </div> <div> <div>Other Settings</div> <div id="d7otherset" style="display:block"> <label style="display:block"><input type="checkbox" id="d7showfocus">Show Focus Tool</label> <label style="display:block"><input type="checkbox" id="d7showcursor">Show Local Mouse Cursor</label> <label style="display:block"><input type="checkbox" id="d7localKeyMap">Local Keyboard Map</label> </div> </div> </div> </div> </div> <div id="idx_dlgButtonBar"> <input id="idx_dlgCancelButton" type="button" value="Cancel" style="" onclick="dialogclose(0)"> <input id="idx_dlgOkButton" type="button" value="OK" style="" onclick="dialogclose(1)"> <div><input id="idx_dlgDeleteButton" type="button" value="Delete" style="display:none" onclick="dialogclose(2)"></div> </div> </div> <iframe name="fileUploadFrame" style="display:none"></iframe> <form style="display:none" method="post" action="uploadfile.ashx" enctype="multipart/form-data" target="fileUploadFrame"><input id="p5fileDragName" name="name"><input id="p5fileDragAuthCookie" name="auth"><input id="p5fileDragSize" name="size"><input id="p5fileDragType" name="type"><input id="p5fileDragData" name="data"><input id="p5fileDragLink" name="link"><input type="submit" id="p5loginSubmit2" style="display:none"></form> <form style="display:none" method="post" action="uploadnodefile.ashx" enctype="multipart/form-data" target="fileUploadFrame"><input id="p13fileDragName" name="name"><input id="p13fileDragSize" name="size"><input id="p13fileDragType" name="type"><input id="p13fileDragData" name="data"><input id="p13fileDragLink" name="link"><input type="submit" id="p13loginSubmit2" style="display:none"></form> <audio id="chimes"><source src="sounds/chimes.mp3" type="audio/mp3"></source></audio> </div> <script>/**
2
+* @description Set of short commonly used methods for handling HTML elements
3
+* @author Ylian Saint-Hilaire
4
+* @version v0.0.1b
5
+*/
6
+
7
+// Add startsWith for IE browser
8
+if (!String.prototype.startsWith) { String.prototype.startsWith = function (str) { return this.lastIndexOf(str, 0) === 0; }; }
9
+if (!String.prototype.endsWith) { String.prototype.endsWith = function (str) { return this.indexOf(str, this.length - str.length) !== -1; }; }
10
+
11
+// Quick UI functions, a bit of a replacement for jQuery
12
+//function Q(x) { if (document.getElementById(x) == null) { console.log('Invalid element: ' + x); } return document.getElementById(x); } // "Q"
13
+function Q(x) { return document.getElementById(x); } // "Q"
14
+function QS(x) { try { return Q(x).style; } catch (x) { } } // "Q" style
15
+function QE(x, y) { try { Q(x).disabled = !y; } catch (x) { } } // "Q" enable
16
+function QV(x, y) { try { QS(x).display = (y ? '' : 'none'); } catch (x) { } } // "Q" visible
17
+function QA(x, y) { Q(x).innerHTML += y; } // "Q" append
18
+function QH(x, y) { Q(x).innerHTML = y; } // "Q" html
19
+function QC(x) { try { return Q(x).classList; } catch (x) { } } // "Q" class
20
+
21
+// Move cursor to end of input box
22
+function inputBoxFocus(x) { Q(x).focus(); var v = Q(x).value; Q(x).value = ''; Q(x).value = v; }
23
+
24
+// Binary encoding and decoding functions
25
+function ReadShort(v, p) { return (v.charCodeAt(p) << 8) + v.charCodeAt(p + 1); }
26
+function ReadShortX(v, p) { return (v.charCodeAt(p + 1) << 8) + v.charCodeAt(p); }
27
+function ReadInt(v, p) { return (v.charCodeAt(p) * 0x1000000) + (v.charCodeAt(p + 1) << 16) + (v.charCodeAt(p + 2) << 8) + v.charCodeAt(p + 3); } // We use "*0x1000000" instead of "<<24" because the shift converts the number to signed int32.
28
+function ReadSInt(v, p) { return (v.charCodeAt(p) << 24) + (v.charCodeAt(p + 1) << 16) + (v.charCodeAt(p + 2) << 8) + v.charCodeAt(p + 3); }
29
+function ReadIntX(v, p) { return (v.charCodeAt(p + 3) * 0x1000000) + (v.charCodeAt(p + 2) << 16) + (v.charCodeAt(p + 1) << 8) + v.charCodeAt(p); }
30
+function ShortToStr(v) { return String.fromCharCode((v >> 8) & 0xFF, v & 0xFF); }
31
+function ShortToStrX(v) { return String.fromCharCode(v & 0xFF, (v >> 8) & 0xFF); }
32
+function IntToStr(v) { return String.fromCharCode((v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF); }
33
+function IntToStrX(v) { return String.fromCharCode(v & 0xFF, (v >> 8) & 0xFF, (v >> 16) & 0xFF, (v >> 24) & 0xFF); }
34
+function MakeToArray(v) { if (!v || v == null || typeof v == 'object') return v; return [v]; }
35
+function SplitArray(v) { return v.split(','); }
36
+function Clone(v) { return JSON.parse(JSON.stringify(v)); }
37
+function EscapeHtml(x) { if (typeof x == "string") return x.replace(/&/g, '&').replace(/>/g, '>').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, '''); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
38
+function EscapeHtmlBreaks(x) { if (typeof x == "string") return x.replace(/&/g, '&').replace(/>/g, '>').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, ''').replace(/\r/g, '<br />').replace(/\n/g, '').replace(/\t/g, ' '); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
39
+
40
+// Move an element from one position in an array to a new position
41
+function ArrayElementMove(arr, from, to) { arr.splice(to, 0, arr.splice(from, 1)[0]); };
42
+
43
+// Print object for HTML
44
+function ObjectToStringEx(x, c) {
45
+ var r = "";
46
+ if (x != 0 && (!x || x == null)) return "(Null)";
47
+ if (x instanceof Array) { for (var i in x) { r += '<br />' + gap(c) + "Item #" + i + ": " + ObjectToStringEx(x[i], c + 1); } }
48
+ else if (x instanceof Object) { for (var i in x) { r += '<br />' + gap(c) + i + " = " + ObjectToStringEx(x[i], c + 1); } }
49
+ else { r += EscapeHtml(x); }
50
+ return r;
51
+}
52
+
53
+// Print object for console
54
+function ObjectToStringEx2(x, c) {
55
+ var r = "";
56
+ if (x != 0 && (!x || x == null)) return "(Null)";
57
+ if (x instanceof Array) { for (var i in x) { r += '\r\n' + gap2(c) + "Item #" + i + ": " + ObjectToStringEx2(x[i], c + 1); } }
58
+ else if (x instanceof Object) { for (var i in x) { r += '\r\n' + gap2(c) + i + " = " + ObjectToStringEx2(x[i], c + 1); } }
59
+ else { r += EscapeHtml(x); }
60
+ return r;
61
+}
62
+
63
+// Create an ident gap
64
+function gap(c) { var x = ''; for (var i = 0; i < (c * 4) ; i++) { x += ' '; } return x; }
65
+function gap2(c) { var x = ''; for (var i = 0; i < (c * 4) ; i++) { x += ' '; } return x; }
66
+
67
+// Print an object in html
68
+function ObjectToString(x) { return ObjectToStringEx(x, 0); }
69
+function ObjectToString2(x) { return ObjectToStringEx2(x, 0); }
70
+
71
+// Convert a hex string to a raw string
72
+function hex2rstr(d) {
73
+ if (typeof d != "string" || d.length == 0) return '';
74
+ var r = '', m = ('' + d).match(/../g), t;
75
+ while (t = m.shift()) r += String.fromCharCode('0x' + t);
76
+ return r
77
+}
78
+
79
+// Convert decimal to hex
80
+function char2hex(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }
81
+
82
+// Convert a raw string to a hex string
83
+function rstr2hex(input) { var r = '', i; for (i = 0; i < input.length; i++) { r += char2hex(input.charCodeAt(i)); } return r; }
84
+
85
+// UTF-8 encoding & decoding functions
86
+function encode_utf8(s) { return unescape(encodeURIComponent(s)); }
87
+function decode_utf8(s) { return decodeURIComponent(escape(s)); }
88
+
89
+// Convert a string into a blob
90
+function data2blob(data) {
91
+ var bytes = new Array(data.length);
92
+ for (var i = 0; i < data.length; i++) bytes[i] = data.charCodeAt(i);
93
+ var blob = new Blob([new Uint8Array(bytes)]);
94
+ return blob;
95
+}
96
+
97
+// Generate random numbers
98
+function random(max) { return Math.floor(Math.random() * max); }
99
+
100
+// Trademarks
101
+function trademarks(x) { return x.replace(/\(R\)/g, '®').replace(/\(TM\)/g, '™'); }
102
+
103
+// Pad a number with zeros on the left
104
+function zeroPad(num, c) { if (c == null) { c = 2; } var s = "00000000" + num; return s.substr(s.length - c); }/**
105
+* @fileoverview Meshcentral.js
106
+* @author Ylian Saint-Hilaire
107
+* @version v0.0.1
108
+*/
109
+
110
+var MeshServerCreateControl = function (domain, authCookie) {
111
+ var obj = {};
112
+ obj.State = 0;
113
+ obj.connectstate = 0;
114
+ obj.pingTimer = null;
115
+ obj.authCookie = authCookie;
116
+ obj.trace = false;
117
+
118
+ obj.xxStateChange = function (newstate, errCode) {
119
+ if (obj.State == newstate) return;
120
+ var previousState = obj.State;
121
+ obj.State = newstate;
122
+ if (obj.onStateChanged) obj.onStateChanged(obj, obj.State, previousState, errCode);
123
+ }
124
+
125
+ obj.Start = function () {
126
+ if (obj.connectstate != 0) return;
127
+ obj.connectstate = 0;
128
+ var url = window.location.protocol.replace("http", "ws") + "//" + window.location.host + domain + "control.ashx";
129
+ if (obj.authCookie && (obj.authCookie != '')) { url += '?auth=' + obj.authCookie; }
130
+ obj.socket = new WebSocket(url);
131
+ obj.socket.onopen = function (e) { obj.connectstate = 1; }
132
+ obj.socket.onmessage = obj.xxOnMessage;
133
+ obj.socket.onclose = function(e) { obj.Stop(e.code); }
134
+ obj.xxStateChange(1, 0);
135
+ if (obj.pingTimer != null) { clearInterval(obj.pingTimer); }
136
+ obj.pingTimer = setInterval(function () { obj.send({ action: 'ping' }); }, 29000); // Ping the server every 29 seconds, stops corporate proxies from disconnecting.
137
+ }
138
+
139
+ obj.Stop = function (errCode) {
140
+ obj.connectstate = 0;
141
+ if (obj.socket) { obj.socket.close(); delete obj.socket; }
142
+ if (obj.pingTimer != null) { clearInterval(obj.pingTimer); obj.pingTimer = null; }
143
+ obj.xxStateChange(0, errCode);
144
+ }
145
+
146
+ obj.xxOnMessage = function (e) {
147
+ if (obj.State == 1) { obj.xxStateChange(2); }
148
+ //console.log('xxOnMessage', e.data);
149
+ var message;
150
+ try { message = JSON.parse(e.data); } catch (e) { return; }
151
+ if ((typeof message != 'object') || (message.action == 'pong')) { return; }
152
+ if (message.action == 'close') { if (message.msg) { console.log(message.msg); } obj.Stop(message.cause); return; }
153
+ if (obj.trace) { console.log('RECV', message); }
154
+ if (obj.onMessage) obj.onMessage(obj, message);
155
+ };
156
+
157
+ obj.send = function (x) {
158
+ if (obj.socket != null && obj.connectstate == 1) {
159
+ if (obj.trace) { console.log('SEND', x); }
160
+ obj.socket.send(JSON.stringify(x));
161
+ }
162
+ }
163
+
164
+ return obj;
165
+}
166
+/**
167
+* @fileoverview Intel(r) AMT Communication Stack
168
+* @author Ylian Saint-Hilaire
169
+* @version v0.2.0b
170
+*/
171
+
172
+/**
173
+ * Construct a AmtStackCreateService object, this ia the main Intel AMT communication stack.
174
+ * @constructor
175
+ */
176
+function AmtStackCreateService(wsmanStack) {
177
+ var obj = new Object();
178
+ obj.wsman = wsmanStack;
179
+ obj.pfx = ["http://intel.com/wbem/wscim/1/amt-schema/1/", "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/", "http://intel.com/wbem/wscim/1/ips-schema/1/"];
180
+ obj.PendingEnums = [];
181
+ obj.PendingBatchOperations = 0;
182
+ obj.ActiveEnumsCount = 0;
183
+ obj.MaxActiveEnumsCount = 1; // Maximum number of enumerations that can be done at the same time.
184
+ obj.onProcessChanged = null;
185
+ var _MaxProcess = 0;
186
+ var _LastProcess = 0;
187
+
188
+ // Return the number of pending actions
189
+ obj.GetPendingActions = function () { return (obj.PendingEnums.length * 2) + (obj.ActiveEnumsCount) + obj.wsman.comm.PendingAjax.length + obj.wsman.comm.ActiveAjaxCount + obj.PendingBatchOperations; }
190
+
191
+ // Private Method, Update the current processing status, this gives the application an idea of what progress is being done by the WSMAN stack
192
+ function _up() {
193
+ var x = obj.GetPendingActions();
194
+ if (_MaxProcess < x) _MaxProcess = x;
195
+ if (obj.onProcessChanged != null && _LastProcess != x) {
196
+ //console.log("Process Old=" + _LastProcess + ", New=" + x + ", PEnums=" + obj.PendingEnums.length + ", AEnums=" + obj.ActiveEnumsCount + ", PAjax=" + obj.wsman.comm.PendingAjax.length + ", AAjax=" + obj.wsman.comm.ActiveAjaxCount + ", PBatch=" + obj.PendingBatchOperations);
197
+ _LastProcess = x;
198
+ obj.onProcessChanged(x, _MaxProcess);
199
+ }
200
+ if (x == 0) _MaxProcess = 0;
201
+ }
202
+
203
+ // Perform a WSMAN "SUBSCRIBE" operation.
204
+ obj.Subscribe = function (name, delivery, url, callback, tag, pri, selectors, opaque, user, pass) { obj.wsman.ExecSubscribe(obj.CompleteName(name), delivery, url, function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri, selectors, opaque, user, pass); _up(); }
205
+
206
+ // Perform a WSMAN "UNSUBSCRIBE" operation.
207
+ obj.UnSubscribe = function (name, callback, tag, pri, selectors) { obj.wsman.ExecUnSubscribe(obj.CompleteName(name), function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri, selectors); _up(); }
208
+
209
+ // Perform a WSMAN "GET" operation.
210
+ obj.Get = function (name, callback, tag, pri) { obj.wsman.ExecGet(obj.CompleteName(name), function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri); _up(); }
211
+
212
+ // Perform a WSMAN "PUT" operation.
213
+ obj.Put = function (name, putobj, callback, tag, pri, selectors) { obj.wsman.ExecPut(obj.CompleteName(name), putobj, function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri, selectors); _up(); }
214
+
215
+ // Perform a WSMAN "CREATE" operation.
216
+ obj.Create = function (name, putobj, callback, tag, pri) { obj.wsman.ExecCreate(obj.CompleteName(name), putobj, function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri); _up(); }
217
+
218
+ // Perform a WSMAN "DELETE" operation.
219
+ obj.Delete = function (name, putobj, callback, tag, pri) { obj.wsman.ExecDelete(obj.CompleteName(name), putobj, function (ws, resuri, response, xstatus) { _up(); callback(obj, name, response, xstatus, tag); }, 0, pri); _up(); }
220
+
221
+ // Perform a WSMAN method call operation.
222
+ obj.Exec = function (name, method, args, callback, tag, pri, selectors) { obj.wsman.ExecMethod(obj.CompleteName(name), method, args, function (ws, resuri, response, xstatus) { _up(); callback(obj, name, obj.CompleteExecResponse(response), xstatus, tag); }, 0, pri, selectors); _up(); }
223
+
224
+ // Perform a WSMAN method call operation.
225
+ obj.ExecWithXml = function (name, method, args, callback, tag, pri, selectors) { obj.wsman.ExecMethodXml(obj.CompleteName(name), method, execArgumentsToXml(args), function (ws, resuri, response, xstatus) { _up(); callback(obj, name, obj.CompleteExecResponse(response), xstatus, tag); }, 0, pri, selectors); _up(); }
226
+
227
+ // Perform a WSMAN "ENUMERATE" operation.
228
+ obj.Enum = function (name, callback, tag, pri) {
229
+ if (obj.ActiveEnumsCount < obj.MaxActiveEnumsCount) {
230
+ obj.ActiveEnumsCount++; obj.wsman.ExecEnum(obj.CompleteName(name), function (ws, resuri, response, xstatus, tag0) { _up(); _EnumStartSink(name, response, callback, resuri, xstatus, tag0); }, tag, pri);
231
+ } else {
232
+ obj.PendingEnums.push([name, callback, tag, pri]);
233
+ }
234
+ _up();
235
+ }
236
+
237
+ // Private method
238
+ function _EnumStartSink(name, response, callback, resuri, status, tag, pri) {
239
+ if (status != 200) { callback(obj, name, null, status, tag); _EnumDoNext(1); return; }
240
+ if (response == null || response.Header["Method"] != "EnumerateResponse" || !response.Body["EnumerationContext"]) { callback(obj, name, null, 603, tag); _EnumDoNext(1); return; }
241
+ var enumctx = response.Body["EnumerationContext"];
242
+ obj.wsman.ExecPull(resuri, enumctx, function (ws, resuri, response, xstatus) { _EnumContinueSink(name, response, callback, resuri, [], xstatus, tag, pri); });
243
+ }
244
+
245
+ // Private method
246
+ function _EnumContinueSink(name, response, callback, resuri, items, status, tag, pri) {
247
+ if (status != 200) { callback(obj, name, null, status, tag); _EnumDoNext(1); return; }
248
+ if (response == null || response.Header["Method"] != "PullResponse") { callback(obj, name, null, 604, tag); _EnumDoNext(1); return; }
249
+ for (var i in response.Body["Items"]) {
250
+ if (response.Body["Items"][i] instanceof Array) {
251
+ for (var j in response.Body["Items"][i]) { items.push(response.Body["Items"][i][j]); }
252
+ } else {
253
+ items.push(response.Body["Items"][i]);
254
+ }
255
+ }
256
+ if (response.Body["EnumerationContext"]) {
257
+ var enumctx = response.Body["EnumerationContext"];
258
+ obj.wsman.ExecPull(resuri, enumctx, function (ws, resuri, response, xstatus) { _EnumContinueSink(name, response, callback, resuri, items, xstatus, tag, 1); });
259
+ } else {
260
+ _EnumDoNext(1);
261
+ callback(obj, name, items, status, tag);
262
+ _up();
263
+ }
264
+ }
265
+
266
+ // Private method
267
+ function _EnumDoNext(dec) {
268
+ obj.ActiveEnumsCount -= dec;
269
+ if (obj.ActiveEnumsCount >= obj.MaxActiveEnumsCount || obj.PendingEnums.length == 0) return;
270
+ var x = obj.PendingEnums.shift();
271
+ obj.Enum(x[0], x[1], x[2]);
272
+ _EnumDoNext(0);
273
+ }
274
+
275
+ // Perform a batch of WSMAN "ENUM" operations.
276
+ obj.BatchEnum = function (batchname, names, callback, tag, continueOnError, pri) {
277
+ obj.PendingBatchOperations += (names.length * 2);
278
+ _BatchNextEnum(batchname, Clone(names), callback, tag, {}, continueOnError, pri); _up();
279
+ }
280
+
281
+ // Request each enum in the batch, stopping if something does not return status 200
282
+ function _BatchNextEnum(batchname, names, callback, tag, results, continueOnError, pri) {
283
+ obj.PendingBatchOperations -= 2;
284
+ var n = names.shift(), f = obj.Enum;
285
+ if (n[0] == '*') { f = obj.Get; n = n.substring(1); } // If the name starts with a star, do a GET instead of an ENUM. This will reduce round trips.
286
+ //console.log((f == obj.Get?'Get ':'Enum ') + n);
287
+ // Perform a GET/ENUM action
288
+ f(n, function (stack, name, responses, status, tag0) {
289
+ tag0[2][name] = { response: (responses==null?null:responses.Body), responses: responses, status: status };
290
+ if (tag0[1].length == 0 || status == 401 || (continueOnError != true && status != 200 && status != 400)) { obj.PendingBatchOperations -= (names.length * 2); _up(); callback(obj, batchname, tag0[2], status, tag); }
291
+ else { _up(); _BatchNextEnum(batchname, names, callback, tag, tag0[2], pri); }
292
+ }, [batchname, names, results], pri);
293
+ _up();
294
+ }
295
+
296
+ // Perform a batch of WSMAN "GET" operations.
297
+ obj.BatchGet = function (batchname, names, callback, tag, pri) {
298
+ _FetchNext({ name: batchname, names: names, callback: callback, current: 0, responses: {}, tag: tag, pri: pri }); _up();
299
+ }
300
+
301
+ // Private method
302
+ function _FetchNext(batch) {
303
+ if (batch.names.length <= batch.current) {
304
+ batch.callback(obj, batch.name, batch.responses, 200, batch.tag);
305
+ } else {
306
+ obj.wsman.ExecGet(obj.CompleteName(batch.names[batch.current]), function (ws, resuri, response, xstatus) { _Fetched(batch, response, xstatus); }, batch.pri);
307
+ batch.current++;
308
+ }
309
+ _up();
310
+ }
311
+
312
+ // Private method
313
+ function _Fetched(batch, response, status) {
314
+ if (response == null || status != 200) {
315
+ batch.callback(obj, batch.name, null, status, batch.tag);
316
+ } else {
317
+ batch.responses[response.Header["Method"]] = response;
318
+ _FetchNext(batch);
319
+ }
320
+ }
321
+
322
+ // Private method
323
+ obj.CompleteName = function(name) {
324
+ if (name.indexOf("AMT_") == 0) return obj.pfx[0] + name;
325
+ if (name.indexOf("CIM_") == 0) return obj.pfx[1] + name;
326
+ if (name.indexOf("IPS_") == 0) return obj.pfx[2] + name;
327
+ }
328
+
329
+ obj.CompleteExecResponse = function (resp) {
330
+ if (resp && resp != null && resp.Body && resp.Body["ReturnValue"]) resp.Body.ReturnValueStr = obj.AmtStatusToStr(resp.Body["ReturnValue"]);
331
+ return resp;
332
+ }
333
+
334
+ obj.RequestPowerStateChange = function (PowerState, callback_func) {
335
+ obj.CIM_PowerManagementService_RequestPowerStateChange(PowerState, "<Address xmlns=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\"><ResourceURI xmlns=\"http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd\">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ComputerSystem</ResourceURI><SelectorSet xmlns=\"http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd\"><Selector Name=\"CreationClassName\">CIM_ComputerSystem</Selector><Selector Name=\"Name\">ManagedSystem</Selector></SelectorSet></ReferenceParameters>", null, null, callback_func);
336
+ }
337
+
338
+ obj.SetBootConfigRole = function (Role, callback_func) {
339
+ obj.CIM_BootService_SetBootConfigRole("<Address xmlns=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\">http://schemas.xmlsoap.org/ws/2004/08/addressing</Address><ReferenceParameters xmlns=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\"><ResourceURI xmlns=\"http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd\">http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_BootConfigSetting</ResourceURI><SelectorSet xmlns=\"http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd\"><Selector Name=\"InstanceID\">Intel(r) AMT: Boot Configuration 0</Selector></SelectorSet></ReferenceParameters>", Role, callback_func);
340
+ }
341
+
342
+ // Cancel all pending queries with given status
343
+ obj.CancelAllQueries = function (s) {
344
+ obj.wsman.CancelAllQueries(s);
345
+ }
346
+
347
+ // Auto generated methods
348
+ obj.AMT_AgentPresenceWatchdog_RegisterAgent = function (callback_func) { obj.Exec("AMT_AgentPresenceWatchdog", "RegisterAgent", {}, callback_func); }
349
+ obj.AMT_AgentPresenceWatchdog_AssertPresence = function (SequenceNumber, callback_func) { obj.Exec("AMT_AgentPresenceWatchdog", "AssertPresence", { "SequenceNumber": SequenceNumber }, callback_func); }
350
+ obj.AMT_AgentPresenceWatchdog_AssertShutdown = function (SequenceNumber, callback_func) { obj.Exec("AMT_AgentPresenceWatchdog", "AssertShutdown", { "SequenceNumber": SequenceNumber }, callback_func); }
351
+ obj.AMT_AgentPresenceWatchdog_AddAction = function (OldState, NewState, EventOnTransition, ActionSd, ActionEac, callback_func, tag, pri, selectors) { obj.Exec("AMT_AgentPresenceWatchdog", "AddAction", { "OldState": OldState, "NewState": NewState, "EventOnTransition": EventOnTransition, "ActionSd": ActionSd, "ActionEac": ActionEac }, callback_func, tag, pri, selectors); }
352
+ obj.AMT_AgentPresenceWatchdog_DeleteAllActions = function (callback_func, tag, pri, selectors) { obj.Exec("AMT_AgentPresenceWatchdog", "DeleteAllActions", {}, callback_func, tag, pri, selectors); }
353
+ obj.AMT_AgentPresenceWatchdogAction_GetActionEac = function (callback_func) { obj.Exec("AMT_AgentPresenceWatchdogAction", "GetActionEac", {}, callback_func); }
354
+ obj.AMT_AgentPresenceWatchdogVA_RegisterAgent = function (callback_func) { obj.Exec("AMT_AgentPresenceWatchdogVA", "RegisterAgent", {}, callback_func); }
355
+ obj.AMT_AgentPresenceWatchdogVA_AssertPresence = function (SequenceNumber, callback_func) { obj.Exec("AMT_AgentPresenceWatchdogVA", "AssertPresence", { "SequenceNumber": SequenceNumber }, callback_func); }
356
+ obj.AMT_AgentPresenceWatchdogVA_AssertShutdown = function (SequenceNumber, callback_func) { obj.Exec("AMT_AgentPresenceWatchdogVA", "AssertShutdown", { "SequenceNumber": SequenceNumber }, callback_func); }
357
+ obj.AMT_AgentPresenceWatchdogVA_AddAction = function (OldState, NewState, EventOnTransition, ActionSd, ActionEac, callback_func) { obj.Exec("AMT_AgentPresenceWatchdogVA", "AddAction", { "OldState": OldState, "NewState": NewState, "EventOnTransition": EventOnTransition, "ActionSd": ActionSd, "ActionEac": ActionEac }, callback_func); }
358
+ obj.AMT_AgentPresenceWatchdogVA_DeleteAllActions = function (_method_dummy, callback_func) { obj.Exec("AMT_AgentPresenceWatchdogVA", "DeleteAllActions", { "_method_dummy": _method_dummy }, callback_func); }
359
+ obj.AMT_AuditLog_ClearLog = function (callback_func) { obj.Exec("AMT_AuditLog", "ClearLog", {}, callback_func); }
360
+ obj.AMT_AuditLog_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("AMT_AuditLog", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
361
+ obj.AMT_AuditLog_ReadRecords = function (StartIndex, callback_func, tag) { obj.Exec("AMT_AuditLog", "ReadRecords", { "StartIndex": StartIndex }, callback_func, tag); }
362
+ obj.AMT_AuditLog_SetAuditLock = function (LockTimeoutInSeconds, Flag, Handle, callback_func) { obj.Exec("AMT_AuditLog", "SetAuditLock", { "LockTimeoutInSeconds": LockTimeoutInSeconds, "Flag": Flag, "Handle": Handle }, callback_func); }
363
+ obj.AMT_AuditLog_ExportAuditLogSignature = function (SigningMechanism, callback_func) { obj.Exec("AMT_AuditLog", "ExportAuditLogSignature", { "SigningMechanism": SigningMechanism }, callback_func); }
364
+ obj.AMT_AuditLog_SetSigningKeyMaterial = function (SigningMechanismType, SigningKey, LengthOfCertificates, Certificates, callback_func) { obj.Exec("AMT_AuditLog", "SetSigningKeyMaterial", { "SigningMechanismType": SigningMechanismType, "SigningKey": SigningKey, "LengthOfCertificates": LengthOfCertificates, "Certificates": Certificates }, callback_func); }
365
+ obj.AMT_AuditPolicyRule_SetAuditPolicy = function (Enable, AuditedAppID, EventID, PolicyType, callback_func) { obj.Exec("AMT_AuditPolicyRule", "SetAuditPolicy", { "Enable": Enable, "AuditedAppID": AuditedAppID, "EventID": EventID, "PolicyType": PolicyType }, callback_func); }
366
+ obj.AMT_AuditPolicyRule_SetAuditPolicyBulk = function (Enable, AuditedAppID, EventID, PolicyType, callback_func) { obj.Exec("AMT_AuditPolicyRule", "SetAuditPolicyBulk", { "Enable": Enable, "AuditedAppID": AuditedAppID, "EventID": EventID, "PolicyType": PolicyType }, callback_func); }
367
+ obj.AMT_AuthorizationService_AddUserAclEntryEx = function (DigestUsername, DigestPassword, KerberosUserSid, AccessPermission, Realms, callback_func) { obj.Exec("AMT_AuthorizationService", "AddUserAclEntryEx", { "DigestUsername": DigestUsername, "DigestPassword": DigestPassword, "KerberosUserSid": KerberosUserSid, "AccessPermission": AccessPermission, "Realms": Realms }, callback_func); }
368
+ obj.AMT_AuthorizationService_EnumerateUserAclEntries = function (StartIndex, callback_func) { obj.Exec("AMT_AuthorizationService", "EnumerateUserAclEntries", { "StartIndex": StartIndex }, callback_func); }
369
+ obj.AMT_AuthorizationService_GetUserAclEntryEx = function (Handle, callback_func, tag) { obj.Exec("AMT_AuthorizationService", "GetUserAclEntryEx", { "Handle": Handle }, callback_func, tag); }
370
+ obj.AMT_AuthorizationService_UpdateUserAclEntryEx = function (Handle, DigestUsername, DigestPassword, KerberosUserSid, AccessPermission, Realms, callback_func) { obj.Exec("AMT_AuthorizationService", "UpdateUserAclEntryEx", { "Handle": Handle, "DigestUsername": DigestUsername, "DigestPassword": DigestPassword, "KerberosUserSid": KerberosUserSid, "AccessPermission": AccessPermission, "Realms": Realms }, callback_func); }
371
+ obj.AMT_AuthorizationService_RemoveUserAclEntry = function (Handle, callback_func) { obj.Exec("AMT_AuthorizationService", "RemoveUserAclEntry", { "Handle": Handle }, callback_func); }
372
+ obj.AMT_AuthorizationService_SetAdminAclEntryEx = function (Username, DigestPassword, callback_func) { obj.Exec("AMT_AuthorizationService", "SetAdminAclEntryEx", { "Username": Username, "DigestPassword": DigestPassword }, callback_func); }
373
+ obj.AMT_AuthorizationService_GetAdminAclEntry = function (callback_func) { obj.Exec("AMT_AuthorizationService", "GetAdminAclEntry", {}, callback_func); }
374
+ obj.AMT_AuthorizationService_GetAdminAclEntryStatus = function (callback_func) { obj.Exec("AMT_AuthorizationService", "GetAdminAclEntryStatus", {}, callback_func); }
375
+ obj.AMT_AuthorizationService_GetAdminNetAclEntryStatus = function (callback_func) { obj.Exec("AMT_AuthorizationService", "GetAdminNetAclEntryStatus", {}, callback_func); }
376
+ obj.AMT_AuthorizationService_SetAclEnabledState = function (Handle, Enabled, callback_func, tag) { obj.Exec("AMT_AuthorizationService", "SetAclEnabledState", { "Handle": Handle, "Enabled": Enabled }, callback_func, tag); }
377
+ obj.AMT_AuthorizationService_GetAclEnabledState = function (Handle, callback_func, tag) { obj.Exec("AMT_AuthorizationService", "GetAclEnabledState", { "Handle": Handle }, callback_func, tag); }
378
+ obj.AMT_EndpointAccessControlService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("AMT_EndpointAccessControlService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
379
+ obj.AMT_EndpointAccessControlService_GetPosture = function (PostureType, callback_func) { obj.Exec("AMT_EndpointAccessControlService", "GetPosture", { "PostureType": PostureType }, callback_func); }
380
+ obj.AMT_EndpointAccessControlService_GetPostureHash = function (PostureType, callback_func) { obj.Exec("AMT_EndpointAccessControlService", "GetPostureHash", { "PostureType": PostureType }, callback_func); }
381
+ obj.AMT_EndpointAccessControlService_UpdatePostureState = function (UpdateType, callback_func) { obj.Exec("AMT_EndpointAccessControlService", "UpdatePostureState", { "UpdateType": UpdateType }, callback_func); }
382
+ obj.AMT_EndpointAccessControlService_GetEacOptions = function (callback_func) { obj.Exec("AMT_EndpointAccessControlService", "GetEacOptions", {}, callback_func); }
383
+ obj.AMT_EndpointAccessControlService_SetEacOptions = function (EacVendors, PostureHashAlgorithm, callback_func) { obj.Exec("AMT_EndpointAccessControlService", "SetEacOptions", { "EacVendors": EacVendors, "PostureHashAlgorithm": PostureHashAlgorithm }, callback_func); }
384
+ obj.AMT_EnvironmentDetectionSettingData_SetSystemDefensePolicy = function (Policy, callback_func) { obj.Exec("AMT_EnvironmentDetectionSettingData", "SetSystemDefensePolicy", { "Policy": Policy }, callback_func); }
385
+ obj.AMT_EnvironmentDetectionSettingData_EnableVpnRouting = function (Enable, callback_func) { obj.Exec("AMT_EnvironmentDetectionSettingData", "EnableVpnRouting", { "Enable": Enable }, callback_func); }
386
+ obj.AMT_EthernetPortSettings_SetLinkPreference = function (LinkPreference, Timeout, callback_func) { obj.Exec("AMT_EthernetPortSettings", "SetLinkPreference", { "LinkPreference": LinkPreference, "Timeout": Timeout }, callback_func); }
387
+ obj.AMT_HeuristicPacketFilterStatistics_ResetSelectedStats = function (SelectedStatistics, callback_func) { obj.Exec("AMT_HeuristicPacketFilterStatistics", "ResetSelectedStats", { "SelectedStatistics": SelectedStatistics }, callback_func); }
388
+ obj.AMT_KerberosSettingData_GetCredentialCacheState = function (callback_func) { obj.Exec("AMT_KerberosSettingData", "GetCredentialCacheState", {}, callback_func); }
389
+ obj.AMT_KerberosSettingData_SetCredentialCacheState = function (Enable, callback_func) { obj.Exec("AMT_KerberosSettingData", "SetCredentialCacheState", { "Enable": Enable }, callback_func); }
390
+ obj.AMT_MessageLog_CancelIteration = function (IterationIdentifier, callback_func) { obj.Exec("AMT_MessageLog", "CancelIteration", { "IterationIdentifier": IterationIdentifier }, callback_func); }
391
+ obj.AMT_MessageLog_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("AMT_MessageLog", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
392
+ obj.AMT_MessageLog_ClearLog = function (callback_func) { obj.Exec("AMT_MessageLog", "ClearLog", { }, callback_func); }
393
+ obj.AMT_MessageLog_GetRecords = function (IterationIdentifier, MaxReadRecords, callback_func, tag) { obj.Exec("AMT_MessageLog", "GetRecords", { "IterationIdentifier": IterationIdentifier, "MaxReadRecords": MaxReadRecords }, callback_func, tag); }
394
+ obj.AMT_MessageLog_GetRecord = function (IterationIdentifier, PositionToNext, callback_func) { obj.Exec("AMT_MessageLog", "GetRecord", { "IterationIdentifier": IterationIdentifier, "PositionToNext": PositionToNext }, callback_func); }
395
+ obj.AMT_MessageLog_PositionAtRecord = function (IterationIdentifier, MoveAbsolute, RecordNumber, callback_func) { obj.Exec("AMT_MessageLog", "PositionAtRecord", { "IterationIdentifier": IterationIdentifier, "MoveAbsolute": MoveAbsolute, "RecordNumber": RecordNumber }, callback_func); }
396
+ obj.AMT_MessageLog_PositionToFirstRecord = function (callback_func, tag) { obj.Exec("AMT_MessageLog", "PositionToFirstRecord", {}, callback_func, tag); }
397
+ obj.AMT_MessageLog_FreezeLog = function (Freeze, callback_func) { obj.Exec("AMT_MessageLog", "FreezeLog", { "Freeze": Freeze }, callback_func); }
398
+ obj.AMT_PublicKeyManagementService_AddCRL = function (Url, SerialNumbers, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "AddCRL", { "Url": Url, "SerialNumbers": SerialNumbers }, callback_func); }
399
+ obj.AMT_PublicKeyManagementService_ResetCRLList = function (_method_dummy, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "ResetCRLList", { "_method_dummy": _method_dummy }, callback_func); }
400
+ obj.AMT_PublicKeyManagementService_AddCertificate = function (CertificateBlob, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "AddCertificate", { "CertificateBlob": CertificateBlob }, callback_func); }
401
+ obj.AMT_PublicKeyManagementService_AddTrustedRootCertificate = function (CertificateBlob, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "AddTrustedRootCertificate", { "CertificateBlob": CertificateBlob }, callback_func); }
402
+ obj.AMT_PublicKeyManagementService_AddKey = function (KeyBlob, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "AddKey", { "KeyBlob": KeyBlob }, callback_func); }
403
+ obj.AMT_PublicKeyManagementService_GeneratePKCS10Request = function (KeyPair, DNName, Usage, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "GeneratePKCS10Request", { "KeyPair": KeyPair, "DNName": DNName, "Usage": Usage }, callback_func); }
404
+ obj.AMT_PublicKeyManagementService_GeneratePKCS10RequestEx = function (KeyPair, SigningAlgorithm, NullSignedCertificateRequest, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "GeneratePKCS10RequestEx", { "KeyPair": KeyPair, "SigningAlgorithm": SigningAlgorithm, "NullSignedCertificateRequest": NullSignedCertificateRequest }, callback_func); }
405
+ obj.AMT_PublicKeyManagementService_GenerateKeyPair = function (KeyAlgorithm, KeyLength, callback_func) { obj.Exec("AMT_PublicKeyManagementService", "GenerateKeyPair", { "KeyAlgorithm": KeyAlgorithm, "KeyLength": KeyLength }, callback_func); }
406
+ obj.AMT_RedirectionService_RequestStateChange = function (RequestedState, callback_func) { obj.Exec("AMT_RedirectionService", "RequestStateChange", { "RequestedState": RequestedState }, callback_func); }
407
+ obj.AMT_RedirectionService_TerminateSession = function (SessionType, callback_func) { obj.Exec("AMT_RedirectionService", "TerminateSession", { "SessionType": SessionType }, callback_func); }
408
+ obj.AMT_RemoteAccessService_AddMpServer = function (AccessInfo, InfoFormat, Port, AuthMethod, Certificate, Username, Password, CN, callback_func) { obj.Exec("AMT_RemoteAccessService", "AddMpServer", { "AccessInfo": AccessInfo, "InfoFormat": InfoFormat, "Port": Port, "AuthMethod": AuthMethod, "Certificate": Certificate, "Username": Username, "Password": Password, "CN": CN }, callback_func); }
409
+ obj.AMT_RemoteAccessService_AddRemoteAccessPolicyRule = function (Trigger, TunnelLifeTime, ExtendedData, MpServer, callback_func) { obj.Exec("AMT_RemoteAccessService", "AddRemoteAccessPolicyRule", { "Trigger": Trigger, "TunnelLifeTime": TunnelLifeTime, "ExtendedData": ExtendedData, "MpServer": MpServer }, callback_func); }
410
+ obj.AMT_RemoteAccessService_CloseRemoteAccessConnection = function (_method_dummy, callback_func) { obj.Exec("AMT_RemoteAccessService", "CloseRemoteAccessConnection", { "_method_dummy": _method_dummy }, callback_func); }
411
+ obj.AMT_SetupAndConfigurationService_CommitChanges = function (_method_dummy, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "CommitChanges", { "_method_dummy": _method_dummy }, callback_func); }
412
+ obj.AMT_SetupAndConfigurationService_Unprovision = function (ProvisioningMode, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "Unprovision", { "ProvisioningMode": ProvisioningMode }, callback_func); }
413
+ obj.AMT_SetupAndConfigurationService_PartialUnprovision = function (_method_dummy, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "PartialUnprovision", { "_method_dummy": _method_dummy }, callback_func); }
414
+ obj.AMT_SetupAndConfigurationService_ResetFlashWearOutProtection = function (_method_dummy, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "ResetFlashWearOutProtection", { "_method_dummy": _method_dummy }, callback_func); }
415
+ obj.AMT_SetupAndConfigurationService_ExtendProvisioningPeriod = function (Duration, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "ExtendProvisioningPeriod", { "Duration": Duration }, callback_func); }
416
+ obj.AMT_SetupAndConfigurationService_SetMEBxPassword = function (Password, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "SetMEBxPassword", { "Password": Password }, callback_func); }
417
+ obj.AMT_SetupAndConfigurationService_SetTLSPSK = function (PID, PPS, callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "SetTLSPSK", { "PID": PID, "PPS": PPS }, callback_func); }
418
+ obj.AMT_SetupAndConfigurationService_GetProvisioningAuditRecord = function (callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "GetProvisioningAuditRecord", {}, callback_func); }
419
+ obj.AMT_SetupAndConfigurationService_GetUuid = function (callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "GetUuid", {}, callback_func); }
420
+ obj.AMT_SetupAndConfigurationService_GetUnprovisionBlockingComponents = function (callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "GetUnprovisionBlockingComponents", {}, callback_func); }
421
+ obj.AMT_SetupAndConfigurationService_GetProvisioningAuditRecordV2 = function (callback_func) { obj.Exec("AMT_SetupAndConfigurationService", "GetProvisioningAuditRecordV2", {}, callback_func); }
422
+ obj.AMT_SystemDefensePolicy_GetTimeout = function (callback_func) { obj.Exec("AMT_SystemDefensePolicy", "GetTimeout", {}, callback_func); }
423
+ obj.AMT_SystemDefensePolicy_SetTimeout = function (Timeout, callback_func) { obj.Exec("AMT_SystemDefensePolicy", "SetTimeout", { "Timeout": Timeout }, callback_func); }
424
+ obj.AMT_SystemDefensePolicy_UpdateStatistics = function (NetworkInterface, ResetOnRead, callback_func, tag, pri, selectors) { obj.Exec("AMT_SystemDefensePolicy", "UpdateStatistics", { "NetworkInterface": NetworkInterface, "ResetOnRead": ResetOnRead }, callback_func, tag, pri, selectors); }
425
+ obj.AMT_SystemPowerScheme_SetPowerScheme = function (callback_func, schemeInstanceId, tag) { obj.Exec("AMT_SystemPowerScheme", "SetPowerScheme", {}, callback_func, tag, 0, { "InstanceID": schemeInstanceId }); }
426
+ obj.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch = function (callback_func, tag) { obj.Exec("AMT_TimeSynchronizationService", "GetLowAccuracyTimeSynch", {}, callback_func, tag); }
427
+ obj.AMT_TimeSynchronizationService_SetHighAccuracyTimeSynch = function (Ta0, Tm1, Tm2, callback_func, tag) { obj.Exec("AMT_TimeSynchronizationService", "SetHighAccuracyTimeSynch", { "Ta0": Ta0, "Tm1": Tm1, "Tm2": Tm2 }, callback_func, tag); }
428
+ obj.AMT_UserInitiatedConnectionService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("AMT_UserInitiatedConnectionService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
429
+ obj.AMT_WebUIService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("AMT_WebUIService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
430
+ obj.AMT_WiFiPortConfigurationService_AddWiFiSettings = function (WiFiEndpoint, WiFiEndpointSettingsInput, IEEE8021xSettingsInput, ClientCredential, CACredential, callback_func) { obj.ExecWithXml("AMT_WiFiPortConfigurationService", "AddWiFiSettings", { "WiFiEndpoint": WiFiEndpoint, "WiFiEndpointSettingsInput": WiFiEndpointSettingsInput, "IEEE8021xSettingsInput": IEEE8021xSettingsInput, "ClientCredential": ClientCredential, "CACredential": CACredential }, callback_func); }
431
+ obj.AMT_WiFiPortConfigurationService_UpdateWiFiSettings = function (WiFiEndpointSettings, WiFiEndpointSettingsInput, IEEE8021xSettingsInput, ClientCredential, CACredential, callback_func) { obj.ExecWithXml("AMT_WiFiPortConfigurationService", "UpdateWiFiSettings", { "WiFiEndpointSettings": WiFiEndpointSettings, "WiFiEndpointSettingsInput": WiFiEndpointSettingsInput, "IEEE8021xSettingsInput": IEEE8021xSettingsInput, "ClientCredential": ClientCredential, "CACredential": CACredential }, callback_func); }
432
+ obj.AMT_WiFiPortConfigurationService_DeleteAllITProfiles = function (_method_dummy, callback_func) { obj.Exec("AMT_WiFiPortConfigurationService", "DeleteAllITProfiles", { "_method_dummy": _method_dummy }, callback_func); }
433
+ obj.AMT_WiFiPortConfigurationService_DeleteAllUserProfiles = function (_method_dummy, callback_func) { obj.Exec("AMT_WiFiPortConfigurationService", "DeleteAllUserProfiles", { "_method_dummy": _method_dummy }, callback_func); }
434
+ obj.CIM_Account_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_Account", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
435
+ obj.CIM_AccountManagementService_CreateAccount = function (System, AccountTemplate, callback_func) { obj.Exec("CIM_AccountManagementService", "CreateAccount", { "System": System, "AccountTemplate": AccountTemplate }, callback_func); }
436
+ obj.CIM_BootConfigSetting_ChangeBootOrder = function (Source, callback_func) { obj.Exec("CIM_BootConfigSetting", "ChangeBootOrder", { "Source": Source }, callback_func); }
437
+ obj.CIM_BootService_SetBootConfigRole = function (BootConfigSetting, Role, callback_func) { obj.Exec("CIM_BootService", "SetBootConfigRole", { "BootConfigSetting": BootConfigSetting, "Role": Role }, callback_func, 0, 1); }
438
+ obj.CIM_Card_ConnectorPower = function (Connector, PoweredOn, callback_func) { obj.Exec("CIM_Card", "ConnectorPower", { "Connector": Connector, "PoweredOn": PoweredOn }, callback_func); }
439
+ obj.CIM_Card_IsCompatible = function (ElementToCheck, callback_func) { obj.Exec("CIM_Card", "IsCompatible", { "ElementToCheck": ElementToCheck }, callback_func); }
440
+ obj.CIM_Chassis_IsCompatible = function (ElementToCheck, callback_func) { obj.Exec("CIM_Chassis", "IsCompatible", { "ElementToCheck": ElementToCheck }, callback_func); }
441
+ obj.CIM_Fan_SetSpeed = function (DesiredSpeed, callback_func) { obj.Exec("CIM_Fan", "SetSpeed", { "DesiredSpeed": DesiredSpeed }, callback_func); }
442
+ obj.CIM_KVMRedirectionSAP_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_KVMRedirectionSAP", "RequestStateChange", { "RequestedState": RequestedState/*, "TimeoutPeriod": TimeoutPeriod */}, callback_func); }
443
+ obj.CIM_MediaAccessDevice_LockMedia = function (Lock, callback_func) { obj.Exec("CIM_MediaAccessDevice", "LockMedia", { "Lock": Lock }, callback_func); }
444
+ obj.CIM_MediaAccessDevice_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_MediaAccessDevice", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
445
+ obj.CIM_MediaAccessDevice_Reset = function (callback_func) { obj.Exec("CIM_MediaAccessDevice", "Reset", {}, callback_func); }
446
+ obj.CIM_MediaAccessDevice_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_MediaAccessDevice", "EnableDevice", { "Enabled": Enabled }, callback_func); }
447
+ obj.CIM_MediaAccessDevice_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_MediaAccessDevice", "OnlineDevice", { "Online": Online }, callback_func); }
448
+ obj.CIM_MediaAccessDevice_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_MediaAccessDevice", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
449
+ obj.CIM_MediaAccessDevice_SaveProperties = function (callback_func) { obj.Exec("CIM_MediaAccessDevice", "SaveProperties", {}, callback_func); }
450
+ obj.CIM_MediaAccessDevice_RestoreProperties = function (callback_func) { obj.Exec("CIM_MediaAccessDevice", "RestoreProperties", {}, callback_func); }
451
+ obj.CIM_MediaAccessDevice_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_MediaAccessDevice", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
452
+ obj.CIM_PhysicalFrame_IsCompatible = function (ElementToCheck, callback_func) { obj.Exec("CIM_PhysicalFrame", "IsCompatible", { "ElementToCheck": ElementToCheck }, callback_func); }
453
+ obj.CIM_PhysicalPackage_IsCompatible = function (ElementToCheck, callback_func) { obj.Exec("CIM_PhysicalPackage", "IsCompatible", { "ElementToCheck": ElementToCheck }, callback_func); }
454
+ obj.CIM_PowerManagementService_RequestPowerStateChange = function (PowerState, ManagedElement, Time, TimeoutPeriod, callback_func) { obj.Exec("CIM_PowerManagementService", "RequestPowerStateChange", { "PowerState": PowerState, "ManagedElement": ManagedElement, "Time": Time, "TimeoutPeriod": TimeoutPeriod }, callback_func, 0, 1); }
455
+ obj.CIM_PowerSupply_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_PowerSupply", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
456
+ obj.CIM_PowerSupply_Reset = function (callback_func) { obj.Exec("CIM_PowerSupply", "Reset", {}, callback_func); }
457
+ obj.CIM_PowerSupply_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_PowerSupply", "EnableDevice", { "Enabled": Enabled }, callback_func); }
458
+ obj.CIM_PowerSupply_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_PowerSupply", "OnlineDevice", { "Online": Online }, callback_func); }
459
+ obj.CIM_PowerSupply_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_PowerSupply", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
460
+ obj.CIM_PowerSupply_SaveProperties = function (callback_func) { obj.Exec("CIM_PowerSupply", "SaveProperties", {}, callback_func); }
461
+ obj.CIM_PowerSupply_RestoreProperties = function (callback_func) { obj.Exec("CIM_PowerSupply", "RestoreProperties", {}, callback_func); }
462
+ obj.CIM_PowerSupply_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_PowerSupply", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
463
+ obj.CIM_Processor_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_Processor", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
464
+ obj.CIM_Processor_Reset = function (callback_func) { obj.Exec("CIM_Processor", "Reset", {}, callback_func); }
465
+ obj.CIM_Processor_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_Processor", "EnableDevice", { "Enabled": Enabled }, callback_func); }
466
+ obj.CIM_Processor_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_Processor", "OnlineDevice", { "Online": Online }, callback_func); }
467
+ obj.CIM_Processor_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_Processor", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
468
+ obj.CIM_Processor_SaveProperties = function (callback_func) { obj.Exec("CIM_Processor", "SaveProperties", {}, callback_func); }
469
+ obj.CIM_Processor_RestoreProperties = function (callback_func) { obj.Exec("CIM_Processor", "RestoreProperties", {}, callback_func); }
470
+ obj.CIM_Processor_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_Processor", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
471
+ obj.CIM_RecordLog_ClearLog = function (callback_func) { obj.Exec("CIM_RecordLog", "ClearLog", {}, callback_func); }
472
+ obj.CIM_RecordLog_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_RecordLog", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
473
+ obj.CIM_RedirectionService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_RedirectionService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
474
+ obj.CIM_Sensor_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_Sensor", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
475
+ obj.CIM_Sensor_Reset = function (callback_func) { obj.Exec("CIM_Sensor", "Reset", {}, callback_func); }
476
+ obj.CIM_Sensor_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_Sensor", "EnableDevice", { "Enabled": Enabled }, callback_func); }
477
+ obj.CIM_Sensor_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_Sensor", "OnlineDevice", { "Online": Online }, callback_func); }
478
+ obj.CIM_Sensor_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_Sensor", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
479
+ obj.CIM_Sensor_SaveProperties = function (callback_func) { obj.Exec("CIM_Sensor", "SaveProperties", {}, callback_func); }
480
+ obj.CIM_Sensor_RestoreProperties = function (callback_func) { obj.Exec("CIM_Sensor", "RestoreProperties", {}, callback_func); }
481
+ obj.CIM_Sensor_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_Sensor", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
482
+ obj.CIM_StatisticalData_ResetSelectedStats = function (SelectedStatistics, callback_func) { obj.Exec("CIM_StatisticalData", "ResetSelectedStats", { "SelectedStatistics": SelectedStatistics }, callback_func); }
483
+ obj.CIM_Watchdog_KeepAlive = function (callback_func) { obj.Exec("CIM_Watchdog", "KeepAlive", {}, callback_func); }
484
+ obj.CIM_Watchdog_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_Watchdog", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
485
+ obj.CIM_Watchdog_Reset = function (callback_func) { obj.Exec("CIM_Watchdog", "Reset", {}, callback_func); }
486
+ obj.CIM_Watchdog_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_Watchdog", "EnableDevice", { "Enabled": Enabled }, callback_func); }
487
+ obj.CIM_Watchdog_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_Watchdog", "OnlineDevice", { "Online": Online }, callback_func); }
488
+ obj.CIM_Watchdog_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_Watchdog", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
489
+ obj.CIM_Watchdog_SaveProperties = function (callback_func) { obj.Exec("CIM_Watchdog", "SaveProperties", {}, callback_func); }
490
+ obj.CIM_Watchdog_RestoreProperties = function (callback_func) { obj.Exec("CIM_Watchdog", "RestoreProperties", {}, callback_func); }
491
+ obj.CIM_Watchdog_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_Watchdog", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
492
+ obj.CIM_WiFiPort_SetPowerState = function (PowerState, Time, callback_func) { obj.Exec("CIM_WiFiPort", "SetPowerState", { "PowerState": PowerState, "Time": Time }, callback_func); }
493
+ obj.CIM_WiFiPort_Reset = function (callback_func) { obj.Exec("CIM_WiFiPort", "Reset", {}, callback_func); }
494
+ obj.CIM_WiFiPort_EnableDevice = function (Enabled, callback_func) { obj.Exec("CIM_WiFiPort", "EnableDevice", { "Enabled": Enabled }, callback_func); }
495
+ obj.CIM_WiFiPort_OnlineDevice = function (Online, callback_func) { obj.Exec("CIM_WiFiPort", "OnlineDevice", { "Online": Online }, callback_func); }
496
+ obj.CIM_WiFiPort_QuiesceDevice = function (Quiesce, callback_func) { obj.Exec("CIM_WiFiPort", "QuiesceDevice", { "Quiesce": Quiesce }, callback_func); }
497
+ obj.CIM_WiFiPort_SaveProperties = function (callback_func) { obj.Exec("CIM_WiFiPort", "SaveProperties", {}, callback_func); }
498
+ obj.CIM_WiFiPort_RestoreProperties = function (callback_func) { obj.Exec("CIM_WiFiPort", "RestoreProperties", {}, callback_func); }
499
+ obj.CIM_WiFiPort_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("CIM_WiFiPort", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
500
+ obj.IPS_HostBasedSetupService_Setup = function (NetAdminPassEncryptionType, NetworkAdminPassword, McNonce, Certificate, SigningAlgorithm, DigitalSignature, callback_func) { obj.Exec("IPS_HostBasedSetupService", "Setup", { "NetAdminPassEncryptionType": NetAdminPassEncryptionType, "NetworkAdminPassword": NetworkAdminPassword, "McNonce": McNonce, "Certificate": Certificate, "SigningAlgorithm": SigningAlgorithm, "DigitalSignature": DigitalSignature }, callback_func); }
501
+ obj.IPS_HostBasedSetupService_AddNextCertInChain = function (NextCertificate, IsLeafCertificate, IsRootCertificate, callback_func) { obj.Exec("IPS_HostBasedSetupService", "AddNextCertInChain", { "NextCertificate": NextCertificate, "IsLeafCertificate": IsLeafCertificate, "IsRootCertificate": IsRootCertificate }, callback_func); }
502
+ obj.IPS_HostBasedSetupService_AdminSetup = function (NetAdminPassEncryptionType, NetworkAdminPassword, McNonce, SigningAlgorithm, DigitalSignature, callback_func) { obj.Exec("IPS_HostBasedSetupService", "AdminSetup", { "NetAdminPassEncryptionType": NetAdminPassEncryptionType, "NetworkAdminPassword": NetworkAdminPassword, "McNonce": McNonce, "SigningAlgorithm": SigningAlgorithm, "DigitalSignature": DigitalSignature }, callback_func); }
503
+ obj.IPS_HostBasedSetupService_UpgradeClientToAdmin = function (McNonce, SigningAlgorithm, DigitalSignature, callback_func) { obj.Exec("IPS_HostBasedSetupService", "UpgradeClientToAdmin", { "McNonce": McNonce, "SigningAlgorithm": SigningAlgorithm, "DigitalSignature": DigitalSignature }, callback_func); }
504
+ obj.IPS_HostBasedSetupService_DisableClientControlMode = function (_method_dummy, callback_func) { obj.Exec("IPS_HostBasedSetupService", "DisableClientControlMode", { "_method_dummy": _method_dummy }, callback_func); }
505
+ obj.IPS_KVMRedirectionSettingData_TerminateSession = function (callback_func) { obj.Exec("IPS_KVMRedirectionSettingData", "TerminateSession", {}, callback_func); }
506
+ obj.IPS_OptInService_StartOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "StartOptIn", {}, callback_func); }
507
+ obj.IPS_OptInService_CancelOptIn = function (callback_func) { obj.Exec("IPS_OptInService", "CancelOptIn", {}, callback_func); }
508
+ obj.IPS_OptInService_SendOptInCode = function (OptInCode, callback_func) { obj.Exec("IPS_OptInService", "SendOptInCode", { "OptInCode": OptInCode }, callback_func); }
509
+ obj.IPS_OptInService_StartService = function (callback_func) { obj.Exec("IPS_OptInService", "StartService", {}, callback_func); }
510
+ obj.IPS_OptInService_StopService = function (callback_func) { obj.Exec("IPS_OptInService", "StopService", {}, callback_func); }
511
+ obj.IPS_OptInService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("IPS_OptInService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
512
+ obj.IPS_ProvisioningRecordLog_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("IPS_ProvisioningRecordLog", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
513
+ obj.IPS_ProvisioningRecordLog_ClearLog = function (_method_dummy, callback_func) { obj.Exec("IPS_ProvisioningRecordLog", "ClearLog", { "_method_dummy": _method_dummy }, callback_func); }
514
+ obj.IPS_SecIOService_RequestStateChange = function (RequestedState, TimeoutPeriod, callback_func) { obj.Exec("IPS_SecIOService", "RequestStateChange", { "RequestedState": RequestedState, "TimeoutPeriod": TimeoutPeriod }, callback_func); }
515
+
516
+ obj.AmtStatusToStr = function (code) { if (obj.AmtStatusCodes[code]) return obj.AmtStatusCodes[code]; else return "UNKNOWN_ERROR" }
517
+ obj.AmtStatusCodes = {
518
+ 0x0000: "SUCCESS",
519
+ 0x0001: "INTERNAL_ERROR",
520
+ 0x0002: "NOT_READY",
521
+ 0x0003: "INVALID_PT_MODE",
522
+ 0x0004: "INVALID_MESSAGE_LENGTH",
523
+ 0x0005: "TABLE_FINGERPRINT_NOT_AVAILABLE",
524
+ 0x0006: "INTEGRITY_CHECK_FAILED",
525
+ 0x0007: "UNSUPPORTED_ISVS_VERSION",
526
+ 0x0008: "APPLICATION_NOT_REGISTERED",
527
+ 0x0009: "INVALID_REGISTRATION_DATA",
528
+ 0x000A: "APPLICATION_DOES_NOT_EXIST",
529
+ 0x000B: "NOT_ENOUGH_STORAGE",
530
+ 0x000C: "INVALID_NAME",
531
+ 0x000D: "BLOCK_DOES_NOT_EXIST",
532
+ 0x000E: "INVALID_BYTE_OFFSET",
533
+ 0x000F: "INVALID_BYTE_COUNT",
534
+ 0x0010: "NOT_PERMITTED",
535
+ 0x0011: "NOT_OWNER",
536
+ 0x0012: "BLOCK_LOCKED_BY_OTHER",
537
+ 0x0013: "BLOCK_NOT_LOCKED",
538
+ 0x0014: "INVALID_GROUP_PERMISSIONS",
539
+ 0x0015: "GROUP_DOES_NOT_EXIST",
540
+ 0x0016: "INVALID_MEMBER_COUNT",
541
+ 0x0017: "MAX_LIMIT_REACHED",
542
+ 0x0018: "INVALID_AUTH_TYPE",
543
+ 0x0019: "AUTHENTICATION_FAILED",
544
+ 0x001A: "INVALID_DHCP_MODE",
545
+ 0x001B: "INVALID_IP_ADDRESS",
546
+ 0x001C: "INVALID_DOMAIN_NAME",
547
+ 0x001D: "UNSUPPORTED_VERSION",
548
+ 0x001E: "REQUEST_UNEXPECTED",
549
+ 0x001F: "INVALID_TABLE_TYPE",
550
+ 0x0020: "INVALID_PROVISIONING_STATE",
551
+ 0x0021: "UNSUPPORTED_OBJECT",
552
+ 0x0022: "INVALID_TIME",
553
+ 0x0023: "INVALID_INDEX",
554
+ 0x0024: "INVALID_PARAMETER",
555
+ 0x0025: "INVALID_NETMASK",
556
+ 0x0026: "FLASH_WRITE_LIMIT_EXCEEDED",
557
+ 0x0027: "INVALID_IMAGE_LENGTH",
558
+ 0x0028: "INVALID_IMAGE_SIGNATURE",
559
+ 0x0029: "PROPOSE_ANOTHER_VERSION",
560
+ 0x002A: "INVALID_PID_FORMAT",
561
+ 0x002B: "INVALID_PPS_FORMAT",
562
+ 0x002C: "BIST_COMMAND_BLOCKED",
563
+ 0x002D: "CONNECTION_FAILED",
564
+ 0x002E: "CONNECTION_TOO_MANY",
565
+ 0x002F: "RNG_GENERATION_IN_PROGRESS",
566
+ 0x0030: "RNG_NOT_READY",
567
+ 0x0031: "CERTIFICATE_NOT_READY",
568
+ 0x0400: "DISABLED_BY_POLICY",
569
+ 0x0800: "NETWORK_IF_ERROR_BASE",
570
+ 0x0801: "UNSUPPORTED_OEM_NUMBER",
571
+ 0x0802: "UNSUPPORTED_BOOT_OPTION",
572
+ 0x0803: "INVALID_COMMAND",
573
+ 0x0804: "INVALID_SPECIAL_COMMAND",
574
+ 0x0805: "INVALID_HANDLE",
575
+ 0x0806: "INVALID_PASSWORD",
576
+ 0x0807: "INVALID_REALM",
577
+ 0x0808: "STORAGE_ACL_ENTRY_IN_USE",
578
+ 0x0809: "DATA_MISSING",
579
+ 0x080A: "DUPLICATE",
580
+ 0x080B: "EVENTLOG_FROZEN",
581
+ 0x080C: "PKI_MISSING_KEYS",
582
+ 0x080D: "PKI_GENERATING_KEYS",
583
+ 0x080E: "INVALID_KEY",
584
+ 0x080F: "INVALID_CERT",
585
+ 0x0810: "CERT_KEY_NOT_MATCH",
586
+ 0x0811: "MAX_KERB_DOMAIN_REACHED",
587
+ 0x0812: "UNSUPPORTED",
588
+ 0x0813: "INVALID_PRIORITY",
589
+ 0x0814: "NOT_FOUND",
590
+ 0x0815: "INVALID_CREDENTIALS",
591
+ 0x0816: "INVALID_PASSPHRASE",
592
+ 0x0818: "NO_ASSOCIATION",
593
+ 0x081B: "AUDIT_FAIL",
594
+ 0x081C: "BLOCKING_COMPONENT",
595
+ 0x0821: "USER_CONSENT_REQUIRED",
596
+ 0x1000: "APP_INTERNAL_ERROR",
597
+ 0x1001: "NOT_INITIALIZED",
598
+ 0x1002: "LIB_VERSION_UNSUPPORTED",
599
+ 0x1003: "INVALID_PARAM",
600
+ 0x1004: "RESOURCES",
601
+ 0x1005: "HARDWARE_ACCESS_ERROR",
602
+ 0x1006: "REQUESTOR_NOT_REGISTERED",
603
+ 0x1007: "NETWORK_ERROR",
604
+ 0x1008: "PARAM_BUFFER_TOO_SHORT",
605
+ 0x1009: "COM_NOT_INITIALIZED_IN_THREAD",
606
+ 0x100A: "URL_REQUIRED"
607
+ }
608
+
609
+ //
610
+ // Methods used for getting the event log
611
+ //
612
+
613
+ obj.GetMessageLog = function (func, tag) {
614
+ obj.AMT_MessageLog_PositionToFirstRecord(_GetMessageLog0, [func, tag, []]);
615
+ }
616
+ function _GetMessageLog0(stack, name, responses, status, tag) {
617
+ if (status != 200 || responses.Body["ReturnValue"] != '0') { tag[0](obj, null, tag[2]); return; }
618
+ obj.AMT_MessageLog_GetRecords(responses.Body["IterationIdentifier"], 390, _GetMessageLog1, tag);
619
+ }
620
+ function _GetMessageLog1(stack, name, responses, status, tag) {
621
+ if (status != 200 || responses.Body["ReturnValue"] != '0') { tag[0](obj, null, tag[2]); return; }
622
+ var i, j, x, e, AmtMessages = tag[2], t = new Date(), TimeStamp, ra = responses.Body["RecordArray"];
623
+ if (typeof ra === 'string') { responses.Body["RecordArray"] = [responses.Body["RecordArray"]]; }
624
+
625
+ for (i in ra) {
626
+ e = null;
627
+ try { e = window.atob(ra[i]); } catch (ex) { }
628
+ if (e != null) {
629
+ TimeStamp = ReadIntX(e, 0);
630
+ if ((TimeStamp > 0) && (TimeStamp < 0xFFFFFFFF)) {
631
+ x = { 'DeviceAddress': e.charCodeAt(4), 'EventSensorType': e.charCodeAt(5), 'EventType': e.charCodeAt(6), 'EventOffset': e.charCodeAt(7), 'EventSourceType': e.charCodeAt(8), 'EventSeverity': e.charCodeAt(9), 'SensorNumber': e.charCodeAt(10), 'Entity': e.charCodeAt(11), 'EntityInstance': e.charCodeAt(12), 'EventData': [], 'Time': new Date((TimeStamp + (t.getTimezoneOffset() * 60)) * 1000) };
632
+ for (j = 13; j < 21; j++) { x['EventData'].push(e.charCodeAt(j)); }
633
+ x['EntityStr'] = _SystemEntityTypes[x['Entity']];
634
+ x['Desc'] = _GetEventDetailStr(x['EventSensorType'], x['EventOffset'], x['EventData'], x['Entity']);
635
+ if (!x['EntityStr']) x['EntityStr'] = "Unknown";
636
+ AmtMessages.push(x);
637
+ }
638
+ }
639
+ }
640
+
641
+ if (responses.Body["NoMoreRecords"] != true) { obj.AMT_MessageLog_GetRecords(responses.Body["IterationIdentifier"], 390, _GetMessageLog1, [tag[0], AmtMessages, tag[2]]); } else { tag[0](obj, AmtMessages, tag[2]); }
642
+ }
643
+
644
+ var _EventTrapSourceTypes = "Platform firmware (e.g. BIOS)|SMI handler|ISV system management software|Alert ASIC|IPMI|BIOS vendor|System board set vendor|System integrator|Third party add-in|OSV|NIC|System management card".split('|');
645
+ var _SystemFirmwareError = "Unspecified.|No system memory is physically installed in the system.|No usable system memory, all installed memory has experienced an unrecoverable failure.|Unrecoverable hard-disk/ATAPI/IDE device failure.|Unrecoverable system-board failure.|Unrecoverable diskette subsystem failure.|Unrecoverable hard-disk controller failure.|Unrecoverable PS/2 or USB keyboard failure.|Removable boot media not found.|Unrecoverable video controller failure.|No video device detected.|Firmware (BIOS) ROM corruption detected.|CPU voltage mismatch (processors that share same supply have mismatched voltage requirements)|CPU speed matching failure".split('|');
646
+ var _SystemFirmwareProgress = "Unspecified.|Memory initialization.|Starting hard-disk initialization and test|Secondary processor(s) initialization|User authentication|User-initiated system setup|USB resource configuration|PCI resource configuration|Option ROM initialization|Video initialization|Cache initialization|SM Bus initialization|Keyboard controller initialization|Embedded controller/management controller initialization|Docking station attachment|Enabling docking station|Docking station ejection|Disabling docking station|Calling operating system wake-up vector|Starting operating system boot process|Baseboard or motherboard initialization|reserved|Floppy initialization|Keyboard test|Pointing device test|Primary processor initialization".split('|');
647
+ var _SystemEntityTypes = "Unspecified|Other|Unknown|Processor|Disk|Peripheral|System management module|System board|Memory module|Processor module|Power supply|Add in card|Front panel board|Back panel board|Power system board|Drive backplane|System internal expansion board|Other system board|Processor board|Power unit|Power module|Power management board|Chassis back panel board|System chassis|Sub chassis|Other chassis board|Disk drive bay|Peripheral bay|Device bay|Fan cooling|Cooling unit|Cable interconnect|Memory device|System management software|BIOS|Intel(r) ME|System bus|Group|Intel(r) ME|External environment|Battery|Processing blade|Connectivity switch|Processor/memory module|I/O module|Processor I/O module|Management controller firmware|IPMI channel|PCI bus|PCI express bus|SCSI bus|SATA/SAS bus|Processor front side bus".split('|');
648
+ obj.RealmNames = "||Redirection|PT Administration|Hardware Asset|Remote Control|Storage|Event Manager|Storage Admin|Agent Presence Local|Agent Presence Remote|Circuit Breaker|Network Time|General Information|Firmware Update|EIT|LocalUN|Endpoint Access Control|Endpoint Access Control Admin|Event Log Reader|Audit Log|ACL Realm|||Local System".split('|');
649
+ obj.WatchdogCurrentStates = { 1: 'Not Started', 2: 'Stopped', 4: 'Running', 8: 'Expired', 16: 'Suspended' };
650
+
651
+ function _GetEventDetailStr(eventSensorType, eventOffset, eventDataField, entity) {
652
+
653
+ if (eventSensorType == 15)
654
+ {
655
+ if (eventDataField[0] == 235) return "Invalid Data";
656
+ if (eventOffset == 0) return _SystemFirmwareError[eventDataField[1]];
657
+ return _SystemFirmwareProgress[eventDataField[1]];
658
+ }
659
+
660
+ if (eventSensorType == 18 && eventDataField[0] == 170) // System watchdog event
661
+ {
662
+ return "Agent watchdog " + char2hex(eventDataField[4]) + char2hex(eventDataField[3]) + char2hex(eventDataField[2]) + char2hex(eventDataField[1]) + "-" + char2hex(eventDataField[6]) + char2hex(eventDataField[5]) + "-... changed to " + obj.WatchdogCurrentStates[eventDataField[7]];
663
+ }
664
+
665
+ /*
666
+ if (eventSensorType == 5 && eventOffset == 0) // System chassis
667
+ {
668
+ return "Case intrusion";
669
+ }
670
+
671
+ if (eventSensorType == 192 && eventOffset == 0 && eventDataField[0] == 170 && eventDataField[1] == 48)
672
+ {
673
+ if (eventDataField[2] == 0) return "A remote Serial Over LAN session was established.";
674
+ if (eventDataField[2] == 1) return "Remote Serial Over LAN session finished. User control was restored.";
675
+ if (eventDataField[2] == 2) return "A remote IDE-Redirection session was established.";
676
+ if (eventDataField[2] == 3) return "Remote IDE-Redirection session finished. User control was restored.";
677
+ }
678
+
679
+ if (eventSensorType == 36)
680
+ {
681
+ long handle = ((long)(eventDataField[1]) << 24) + ((long)(eventDataField[2]) << 16) + ((long)(eventDataField[3]) << 8) + (long)(eventDataField[4]);
682
+ string nic = string.Format("#{0}", eventDataField[0]);
683
+ if (eventDataField[0] == 0xAA) nic = "wired"; // TODO: Add wireless *****
684
+ //if (eventDataField[0] == 0xAA) nic = "wireless";
685
+
686
+ if (handle == 4294967293) { return string.Format("All received packet filter was matched on {0} interface.", nic); }
687
+ if (handle == 4294967292) { return string.Format("All outbound packet filter was matched on {0} interface.", nic); }
688
+ if (handle == 4294967290) { return string.Format("Spoofed packet filter was matched on {0} interface.", nic); }
689
+ return string.Format("Filter {0} was matched on {1} interface.", handle, nic);
690
+ }
691
+
692
+ if (eventSensorType == 192)
693
+ {
694
+ if (eventDataField[2] == 0) return "Security policy invoked. Some or all network traffic (TX) was stopped.";
695
+ if (eventDataField[2] == 2) return "Security policy invoked. Some or all network traffic (RX) was stopped.";
696
+ return "Security policy invoked.";
697
+ }
698
+
699
+ if (eventSensorType == 193)
700
+ {
701
+ if (eventDataField[0] == 0xAA && eventDataField[1] == 0x30 && eventDataField[2] == 0x00 && eventDataField[3] == 0x00) { return "User request for remote connection."; }
702
+ if (eventDataField[0] == 0xAA && eventDataField[1] == 0x20 && eventDataField[2] == 0x03 && eventDataField[3] == 0x01) { return "EAC error: attempt to get posture while NAC in Intel� AMT is disabled."; // eventDataField = 0xAA20030100000000 }
703
+ if (eventDataField[0] == 0xAA && eventDataField[1] == 0x20 && eventDataField[2] == 0x04 && eventDataField[3] == 0x00) { return "Certificate revoked. "; }
704
+ }
705
+ */
706
+
707
+ if (eventSensorType == 6) return "Authentication failed " + (eventDataField[1] + (eventDataField[2] << 8)) + " times. The system may be under attack.";
708
+ if (eventSensorType == 30) return "No bootable media";
709
+ if (eventSensorType == 32) return "Operating system lockup or power interrupt";
710
+ if (eventSensorType == 35) return "System boot failure";
711
+ if (eventSensorType == 37) return "System firmware started (at least one CPU is properly executing).";
712
+ return "Unknown Sensor Type #" + eventSensorType;
713
+ }
714
+
715
+
716
+ return obj;
717
+}
718
+
719
+
720
+
721
+
722
+
723
+// TinyMD5 from https://github.com/jbt/js-crypto
724
+
725
+// Perform MD5 setup
726
+var md5_k = [];
727
+for (var i = 0; i < 64;) { md5_k[i] = 0 | (Math.abs(Math.sin(++i)) * 4294967296); }
728
+
729
+// Perform MD5 on raw string and return hex
730
+function hex_md5(str) {
731
+ var b, c, d, j,
732
+ x = [],
733
+ str2 = unescape(encodeURI(str)),
734
+ a = str2.length,
735
+ h = [b = 1732584193, c = -271733879, ~b, ~c],
736
+ i = 0;
737
+
738
+ for (; i <= a;) x[i >> 2] |= (str2.charCodeAt(i) || 128) << 8 * (i++ % 4);
739
+
740
+ x[str = (a + 8 >> 6) * 16 + 14] = a * 8;
741
+ i = 0;
742
+
743
+ for (; i < str; i += 16) {
744
+ a = h; j = 0;
745
+ for (; j < 64;) {
746
+ a = [
747
+ d = a[3],
748
+ ((b = a[1] | 0) +
749
+ ((d = (
750
+ (a[0] +
751
+ [
752
+ b & (c = a[2]) | ~b & d,
753
+ d & b | ~d & c,
754
+ b ^ c ^ d,
755
+ c ^ (b | ~d)
756
+ ][a = j >> 4]
757
+ ) +
758
+ (md5_k[j] +
759
+ (x[[
760
+ j,
761
+ 5 * j + 1,
762
+ 3 * j + 5,
763
+ 7 * j
764
+ ][a] % 16 + i] | 0)
765
+ )
766
+ )) << (a = [
767
+ 7, 12, 17, 22,
768
+ 5, 9, 14, 20,
769
+ 4, 11, 16, 23,
770
+ 6, 10, 15, 21
771
+ ][4 * a + j++ % 4]) | d >>> 32 - a)
772
+ ),
773
+ b,
774
+ c
775
+ ];
776
+ }
777
+ for (j = 4; j;) h[--j] = h[j] + a[j];
778
+ }
779
+
780
+ str = '';
781
+ for (; j < 32;) str += ((h[j >> 3] >> ((1 ^ j++ & 7) * 4)) & 15).toString(16);
782
+ return str;
783
+}
784
+
785
+
786
+// Perform MD5 on raw string and return raw string result
787
+function rstr_md5(str) { return hex2rstr(hex_md5(str)); }
788
+
789
+/*
790
+Convert arguments into selector set and body XML. Used by AMT_WiFiPortConfigurationService_UpdateWiFiSettings.
791
+args = {
792
+ "WiFiEndpoint": {
793
+ __parameterType: 'reference',
794
+ __resourceUri: 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_WiFiEndpoint',
795
+ Name: 'WiFi Endpoint 0'
796
+ },
797
+ "WiFiEndpointSettingsInput":
798
+ {
799
+ __parameterType: 'instance',
800
+ __namespace: 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_WiFiEndpointSettings',
801
+ ElementName: document.querySelector('#editProfile-profileName').value,
802
+ InstanceID: 'Intel(r) AMT:WiFi Endpoint Settings ' + document.querySelector('#editProfile-profileName').value,
803
+ AuthenticationMethod: document.querySelector('#editProfile-networkAuthentication').value,
804
+ //BSSType: 3, // Intel(r) AMT supports only infrastructure networks
805
+ EncryptionMethod: document.querySelector('#editProfile-encryption').value,
806
+ SSID: document.querySelector('#editProfile-networkName').value,
807
+ Priority: 100,
808
+ PSKPassPhrase: document.querySelector('#editProfile-passPhrase').value
809
+ },
810
+ "IEEE8021xSettingsInput": null,
811
+ "ClientCredential": null,
812
+ "CACredential": null
813
+},
814
+*/
815
+function execArgumentsToXml(args) {
816
+ if(args === undefined || args === null) return null;
817
+
818
+ var result = '';
819
+ for(var argName in args) {
820
+ var arg = args[argName];
821
+ if(!arg) continue;
822
+ if(arg['__parameterType'] === 'reference') result += referenceToXml(argName, arg);
823
+ else result += instanceToXml(argName, arg);
824
+ //if(arg['__isInstance']) result += instanceToXml(argName, arg);
825
+ }
826
+ return result;
827
+}
828
+
829
+/**
830
+ * Convert JavaScript object into XML
831
+
832
+ <r:WiFiEndpointSettingsInput xmlns:q="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_WiFiEndpointSettings">
833
+ <q:ElementName>Wireless-Profile-Admin</q:ElementName>
834
+ <q:InstanceID>Intel(r) AMT:WiFi Endpoint Settings Wireless-Profile-Admin</q:InstanceID>
835
+ <q:AuthenticationMethod>6</q:AuthenticationMethod>
836
+ <q:EncryptionMethod>4</q:EncryptionMethod>
837
+ <q:Priority>100</q:Priority>
838
+ <q:PSKPassPhrase>P@ssw0rd</q:PSKPassPhrase>
839
+ </r:WiFiEndpointSettingsInput>
840
+ */
841
+function instanceToXml(instanceName, inInstance) {
842
+ if(inInstance === undefined || inInstance === null) return null;
843
+
844
+ var hasNamespace = !!inInstance['__namespace'];
845
+ var startTag = hasNamespace ? '<q:' : '<';
846
+ var endTag = hasNamespace ? '</q:' : '</';
847
+ var namespaceDef = hasNamespace ? (' xmlns:q="' + inInstance['__namespace'] + '"' ): '';
848
+ var result = '<r:' + instanceName + namespaceDef + '>';
849
+ for(var prop in inInstance) {
850
+ if (!inInstance.hasOwnProperty(prop) || prop.indexOf('__') === 0) continue;
851
+
852
+ if (typeof inInstance[prop] === 'function' || Array.isArray(inInstance[prop]) ) continue;
853
+
854
+ if (typeof inInstance[prop] === 'object') {
855
+ //result += startTag + prop +'>' + instanceToXml('prop', inInstance[prop]) + endTag + prop +'>';
856
+ console.error('only convert one level down...');
857
+ }
858
+ else {
859
+ result += startTag + prop +'>' + inInstance[prop].toString() + endTag + prop +'>';
860
+ }
861
+ }
862
+ result += '</r:' + instanceName + '>';
863
+ return result;
864
+}
865
+
866
+
867
+/**
868
+ * Convert a selector set into XML. Expect no nesting.
869
+ * {
870
+ * selectorName : selectorValue,
871
+ * selectorName : selectorValue,
872
+ * ... ...
873
+ * }
874
+
875
+ <r:WiFiEndpoint>
876
+ <a:Address>http://192.168.1.103:16992/wsman</a:Address>
877
+ <a:ReferenceParameters>
878
+ <w:ResourceURI>http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_WiFiEndpoint</w:ResourceURI>
879
+ <w:SelectorSet>
880
+ <w:Selector Name="Name">WiFi Endpoint 0</w:Selector>
881
+ </w:SelectorSet>
882
+ </a:ReferenceParameters>
883
+ </r:WiFiEndpoint>
884
+
885
+ */
886
+function referenceToXml(referenceName, inReference) {
887
+ if(inReference === undefined || inReference === null ) return null;
888
+
889
+ var result = '<r:' + referenceName + '><a:Address>/wsman</a:Address><a:ReferenceParameters><w:ResourceURI>'+ inReference['__resourceUri']+'</w:ResourceURI><w:SelectorSet>';
890
+ for(var selectorName in inReference) {
891
+ if (!inReference.hasOwnProperty(selectorName) || selectorName.indexOf('__') === 0) continue;
892
+
893
+ if (typeof inReference[selectorName] === 'function' ||
894
+ typeof inReference[selectorName] === 'object' ||
895
+ Array.isArray(inReference[selectorName]) )
896
+ continue;
897
+
898
+ result += '<w:Selector Name="' + selectorName +'">' + inReference[selectorName].toString() + '</w:Selector>';
899
+ }
900
+
901
+ result += '</w:SelectorSet></a:ReferenceParameters></r:' + referenceName + '>';
902
+ return result;
903
+}
904
+
905
+// Convert a byte array of SID into string
906
+function GetSidString(sid) {
907
+ var r = "S-" + sid.charCodeAt(0) + "-" + sid.charCodeAt(7);
908
+ for (var i = 2; i < (sid.length / 4) ; i++) r += "-" + ReadIntX(sid, i * 4);
909
+ return r;
910
+}
911
+
912
+// Convert a SID readable string into bytes
913
+function GetSidByteArray(sidString) {
914
+ if (!sidString || sidString == null) return null;
915
+ var sidParts = sidString.split('-');
916
+
917
+ // Make sure the SID has at least 4 parts and starts with 'S'
918
+ if (sidParts.length < 4 || (sidParts[0] != 's' && sidParts[0] != 'S')) return null;
919
+
920
+ // Check that each part of the SID is really an integer
921
+ for (var i = 1; i < sidParts.length; i++) { var y = parseInt(sidParts[i]); if (y != sidParts[i]) return null; sidParts[i] = y; }
922
+
923
+ // Version (8 bit) + Id count (8 bit) + 48 bit in big endian -- DO NOT use bitwise right shift operator. JavaScript converts the number into a 32 bit integer before shifting. In real world, it's highly likely this part is always 0.
924
+ var r = String.fromCharCode(sidParts[1]) + String.fromCharCode(sidParts.length - 3) + ShortToStr(Math.floor(sidParts[2] / Math.pow(2, 32))) + IntToStr((sidParts[2]) & 0xFFFF);
925
+
926
+ // the rest are in 32 bit in little endian
927
+ for (var i = 3; i < sidParts.length; i++) r += IntToStrX(sidParts[i]);
928
+ return r;
929
+}
930
+/**
931
+* @description Intel(r) AMT WSMAN Stack
932
+* @author Ylian Saint-Hilaire
933
+* @version v0.2.0
934
+*/
935
+
936
+// Construct a MeshServer object
937
+var WsmanStackCreateService = function (host, port, user, pass, tls, extra) {
938
+ var obj = {};
939
+ //obj.onDebugMessage = null; // Set to a function if you want to get debug messages.
940
+ obj.NextMessageId = 1; // Next message number, used to label WSMAN calls.
941
+ obj.Address = '/wsman';
942
+ obj.comm = CreateWsmanComm(host, port, user, pass, tls, extra);
943
+
944
+ obj.PerformAjax = function (postdata, callback, tag, pri, namespaces) {
945
+ if (namespaces == undefined) namespaces = '';
946
+ obj.comm.PerformAjax('<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns=\"http://www.w3.org/2003/05/soap-envelope\" ' + namespaces + '><Header><a:Action>' + postdata, function (data, status, tag) {
947
+ if (status != 200) { callback(obj, null, { Header: { HttpError: status } }, status, tag); return; }
948
+ var wsresponse = obj.ParseWsman(data);
949
+ if (!wsresponse || wsresponse == null) { callback(obj, null, { Header: { HttpError: status } }, 601, tag); } else { callback(obj, wsresponse.Header["ResourceURI"], wsresponse, 200, tag); }
950
+ }, tag, pri);
951
+ }
952
+
953
+ // Private method
954
+ //obj.Debug = function (msg) { /*console.log(msg);*/ }
955
+
956
+ // Cancel all pending queries with given status
957
+ obj.CancelAllQueries = function (s) { obj.comm.CancelAllQueries(s); }
958
+
959
+ // Get the last element of a URI string
960
+ obj.GetNameFromUrl = function (resuri) {
961
+ var x = resuri.lastIndexOf("/");
962
+ return (x == -1)?resuri:resuri.substring(x + 1);
963
+ }
964
+
965
+ // Perform a WSMAN Subscribe operation
966
+ obj.ExecSubscribe = function (resuri, delivery, url, callback, tag, pri, selectors, opaque, user, pass) {
967
+ var digest = "", digest2 = "";
968
+ if (user != undefined && pass != undefined) { digest = '<t:IssuedTokens><t:RequestSecurityTokenResponse><t:TokenType>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken</t:TokenType><t:RequestedSecurityToken><se:UsernameToken><se:Username>' + user + '</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">' + pass + '</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>'; digest2 = '<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'; }
969
+ if (opaque != undefined && opaque != null) { opaque = '<a:ReferenceParameters>' + opaque + '</a:ReferenceParameters>'; } else { opaque = ""; }
970
+ var data = "http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>" + _PutObjToSelectorsXml(selectors) + digest + '</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.dmtf.org/wbem/wsman/1/wsman/' + delivery + '"><e:NotifyTo><a:Address>' + url + '</a:Address></e:NotifyTo>' + digest2 + '</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>';
971
+ obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri, 'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing" xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:se="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:m="http://x.com"');
972
+ }
973
+
974
+ // Perform a WSMAN UnSubscribe operation
975
+ obj.ExecUnSubscribe = function (resuri, callback, tag, pri, selectors) {
976
+ var data = "http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>" + _PutObjToSelectorsXml(selectors) + '</Header><Body><e:Unsubscribe/>';
977
+ obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri, 'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"');
978
+ }
979
+
980
+ // Perform a WSMAN PUT operation
981
+ obj.ExecPut = function (resuri, putobj, callback, tag, pri, selectors) {
982
+ var data = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout>" + _PutObjToSelectorsXml(selectors) + '</Header><Body>' + _PutObjToBodyXml(resuri, putobj);
983
+ obj.PerformAjax(data + "</Body></Envelope>", callback, tag, pri);
984
+ }
985
+
986
+ // Perform a WSMAN CREATE operation
987
+ obj.ExecCreate = function (resuri, putobj, callback, tag, pri, selectors) {
988
+ var objname = obj.GetNameFromUrl(resuri);
989
+ var data = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>" + _PutObjToSelectorsXml(selectors) + "</Header><Body><g:" + objname + " xmlns:g=\"" + resuri + "\">";
990
+ for (var n in putobj) { data += "<g:" + n + ">" + putobj[n] + "</g:" + n + ">" }
991
+ obj.PerformAjax(data + "</g:" + objname + "></Body></Envelope>", callback, tag, pri);
992
+ }
993
+
994
+ // Perform a WSMAN CREATE operation
995
+ obj.ExecCreateXml = function (resuri, argsxml, callback, tag, pri) {
996
+ var objname = obj.GetNameFromUrl(resuri), selector = "";
997
+ obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout></Header><Body><r:" + objname + " xmlns:r=\"" + resuri + "\">" + argsxml + "</r:" + objname + "></Body></Envelope>", callback, tag, pri);
998
+ }
999
+
1000
+ // Perform a WSMAN DELETE operation
1001
+ obj.ExecDelete = function (resuri, putobj, callback, tag, pri) {
1002
+ var data = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>" + _PutObjToSelectorsXml(putobj) + "</Header><Body /></Envelope>";
1003
+ obj.PerformAjax(data, callback, tag, pri);
1004
+ }
1005
+
1006
+ // Perform a WSMAN GET operation
1007
+ obj.ExecGet = function (resuri, callback, tag, pri) {
1008
+ obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body /></Envelope>", callback, tag, pri);
1009
+ }
1010
+
1011
+ // Perform a WSMAN method call operation
1012
+ obj.ExecMethod = function (resuri, method, args, callback, tag, pri, selectors) {
1013
+ var argsxml = "";
1014
+ for (var i in args) { if (args[i] != null) { if (Array.isArray(args[i])) { for (var x in args[i]) { argsxml += "<r:" + i + ">" + args[i][x] + "</r:" + i + ">"; } } else { argsxml += "<r:" + i + ">" + args[i] + "</r:" + i + ">"; } } }
1015
+ obj.ExecMethodXml(resuri, method, argsxml, callback, tag, pri, selectors);
1016
+ }
1017
+
1018
+ // Perform a WSMAN method call operation. The arguments are already formatted in XML.
1019
+ obj.ExecMethodXml = function (resuri, method, argsxml, callback, tag, pri, selectors) {
1020
+ obj.PerformAjax(resuri + "/" + method + "</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>" + _PutObjToSelectorsXml(selectors) + "</Header><Body><r:" + method + '_INPUT' + " xmlns:r=\"" + resuri + "\">" + argsxml + "</r:" + method + "_INPUT></Body></Envelope>", callback, tag, pri);
1021
+ }
1022
+
1023
+ // Perform a WSMAN ENUM operation
1024
+ obj.ExecEnum = function (resuri, callback, tag, pri) {
1025
+ obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Enumerate xmlns=\"http://schemas.xmlsoap.org/ws/2004/09/enumeration\" /></Body></Envelope>", callback, tag, pri);
1026
+ }
1027
+
1028
+ // Perform a WSMAN PULL operation
1029
+ obj.ExecPull = function (resuri, enumctx, callback, tag, pri) {
1030
+ obj.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>" + obj.Address + "</a:To><w:ResourceURI>" + resuri + "</w:ResourceURI><a:MessageID>" + (obj.NextMessageId++) + "</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Pull xmlns=\"http://schemas.xmlsoap.org/ws/2004/09/enumeration\"><EnumerationContext>" + enumctx + "</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>", callback, tag, pri);
1031
+ }
1032
+
1033
+ // Private method
1034
+ obj.ParseWsman = function (xml) {
1035
+ try {
1036
+ if (!xml.childNodes) xml = _turnToXml(xml);
1037
+ var r = { Header:{} }, header = xml.getElementsByTagName("Header")[0], t;
1038
+ if (!header) header = xml.getElementsByTagName("a:Header")[0];
1039
+ if (!header) return null;
1040
+ for (var i = 0; i < header.childNodes.length; i++) {
1041
+ var child = header.childNodes[i];
1042
+ r.Header[child.localName] = child.textContent;
1043
+ }
1044
+ var body = xml.getElementsByTagName("Body")[0];
1045
+ if (!body) body = xml.getElementsByTagName("a:Body")[0];
1046
+ if (!body) return null;
1047
+ if (body.childNodes.length > 0) {
1048
+ t = body.childNodes[0].localName;
1049
+ if (t.indexOf("_OUTPUT") == t.length - 7) { t = t.substring(0, t.length - 7); }
1050
+ r.Header['Method'] = t;
1051
+ r.Body = _ParseWsmanRec(body.childNodes[0]);
1052
+ }
1053
+ return r;
1054
+ } catch (e) {
1055
+ console.log("Unable to parse XML: " + xml);
1056
+ return null;
1057
+ }
1058
+ }
1059
+
1060
+ // Private method
1061
+ function _ParseWsmanRec(node) {
1062
+ var data, r = {};
1063
+ for (var i = 0; i < node.childNodes.length; i++) {
1064
+ var child = node.childNodes[i];
1065
+ if (child.childElementCount == 0) { data = child.textContent; } else { data = _ParseWsmanRec(child); }
1066
+ if (data == 'true') data = true; // Convert 'true' into true
1067
+ if (data == 'false') data = false; // Convert 'false' into false
1068
+
1069
+ var childObj = data;
1070
+ if (child.attributes.length > 0) {
1071
+ childObj = {'Value': data };
1072
+ for(var j = 0; j < child.attributes.length; j++) {
1073
+ childObj['@' + child.attributes[j].name] = child.attributes[j].value;
1074
+ }
1075
+ }
1076
+
1077
+ if (r[child.localName] instanceof Array) { r[child.localName].push(childObj); }
1078
+ else if (r[child.localName] == undefined) { r[child.localName] = childObj; }
1079
+ else { r[child.localName] = [r[child.localName], childObj]; }
1080
+ }
1081
+ return r;
1082
+ }
1083
+
1084
+ function _PutObjToBodyXml(resuri, putObj) {
1085
+ if(!resuri || putObj === undefined || putObj === null) return '';
1086
+ var objname = obj.GetNameFromUrl(resuri);
1087
+ var result = '<r:' + objname + ' xmlns:r="' + resuri + '">';
1088
+
1089
+ for (var prop in putObj) {
1090
+ if (!putObj.hasOwnProperty(prop) || prop.indexOf('__') === 0 || prop.indexOf('@') === 0) continue;
1091
+ if (putObj[prop] === undefined || putObj[prop] === null || typeof putObj[prop] === 'function') continue;
1092
+ if (typeof putObj[prop] === 'object' && putObj[prop]['ReferenceParameters']) {
1093
+ result += '<r:' + prop + '><a:Address>' + putObj[prop].Address + '</a:Address><a:ReferenceParameters><w:ResourceURI>' + putObj[prop]['ReferenceParameters']["ResourceURI"] + '</w:ResourceURI><w:SelectorSet>';
1094
+ var selectorArray = putObj[prop]['ReferenceParameters']['SelectorSet']['Selector'];
1095
+ if (Array.isArray(selectorArray)) {
1096
+ for (var i=0; i< selectorArray.length; i++) {
1097
+ result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray[i]) + '>' + selectorArray[i]['Value'] + '</w:Selector>';
1098
+ }
1099
+ }
1100
+ else {
1101
+ result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray) + '>' + selectorArray['Value'] + '</w:Selector>';
1102
+ }
1103
+ result += '</w:SelectorSet></a:ReferenceParameters></r:' + prop + '>';
1104
+ }
1105
+ else {
1106
+ if (Array.isArray(putObj[prop])) {
1107
+ for (var i = 0; i < putObj[prop].length; i++) {
1108
+ result += '<r:' + prop + '>' + putObj[prop][i].toString() + '</r:' + prop + '>';
1109
+ }
1110
+ } else {
1111
+ result += '<r:' + prop + '>' + putObj[prop].toString() + '</r:' + prop + '>';
1112
+ }
1113
+ }
1114
+ }
1115
+
1116
+ result += '</r:' + objname + '>';
1117
+ return result;
1118
+ }
1119
+
1120
+ /*
1121
+ convert
1122
+ { @Name: 'InstanceID', @AttrName: 'Attribute Value'}
1123
+ into
1124
+ ' Name="InstanceID" AttrName="Attribute Value" '
1125
+ */
1126
+ function _ObjectToXmlAttributes(objWithAttributes) {
1127
+ if(!objWithAttributes) return '';
1128
+ var result = ' ';
1129
+ for (var propName in objWithAttributes) {
1130
+ if (!objWithAttributes.hasOwnProperty(propName) || propName.indexOf('@') !== 0) continue;
1131
+ result += propName.substring(1) + '="' + objWithAttributes[propName] + '" ';
1132
+ }
1133
+ return result;
1134
+ }
1135
+
1136
+ function _PutObjToSelectorsXml(selectorSet) {
1137
+ if (!selectorSet) return '';
1138
+ if (typeof selectorSet == 'string') return selectorSet;
1139
+ if (selectorSet['InstanceID']) return "<w:SelectorSet><w:Selector Name=\"InstanceID\">" + selectorSet['InstanceID'] + "</w:Selector></w:SelectorSet>";
1140
+ var result = '<w:SelectorSet>';
1141
+ for(var propName in selectorSet) {
1142
+ if (!selectorSet.hasOwnProperty(propName)) continue;
1143
+ result += '<w:Selector Name="' + propName + '">';
1144
+ if (selectorSet[propName]['ReferenceParameters']) {
1145
+ result += '<a:EndpointReference>';
1146
+ result += '<a:Address>' + selectorSet[propName]['Address'] + '</a:Address><a:ReferenceParameters><w:ResourceURI>' + selectorSet[propName]['ReferenceParameters']['ResourceURI'] + '</w:ResourceURI><w:SelectorSet>';
1147
+ var selectorArray = selectorSet[propName]['ReferenceParameters']['SelectorSet']['Selector'];
1148
+ if (Array.isArray(selectorArray)) {
1149
+ for (var i = 0; i < selectorArray.length; i++) {
1150
+ result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray[i]) + '>' + selectorArray[i]['Value'] + '</w:Selector>';
1151
+ }
1152
+ }
1153
+ else {
1154
+ result += '<w:Selector' + _ObjectToXmlAttributes(selectorArray) + '>' + selectorArray['Value'] + '</w:Selector>';
1155
+ }
1156
+ result += '</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>';
1157
+ } else {
1158
+ result += selectorSet[propName];
1159
+ }
1160
+ result += '</w:Selector>';
1161
+ }
1162
+ result += '</w:SelectorSet>';
1163
+ return result;
1164
+ }
1165
+
1166
+ function _turnToXml(text) {
1167
+ if (window.DOMParser) {
1168
+ return new DOMParser().parseFromString(text, "text/xml");
1169
+ }
1170
+ else // Internet Explorer
1171
+ {
1172
+ var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
1173
+ xmlDoc.async = false;
1174
+ xmlDoc.loadXML(text);
1175
+ return xmlDoc;
1176
+ }
1177
+ }
1178
+
1179
+ return obj;
1180
+}
1181
+/**
1182
+* @description Remote Desktop
1183
+* @author Ylian Saint-Hilaire
1184
+* @version v0.0.2g
1185
+*/
1186
+
1187
+// Construct a MeshServer object
1188
+var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
1189
+ var obj = {};
1190
+ obj.canvasid = divid;
1191
+ obj.CanvasId = Q(divid);
1192
+ obj.scrolldiv = scrolldiv;
1193
+ obj.canvas = Q(divid).getContext("2d");
1194
+ obj.protocol = 2; // KVM
1195
+ obj.state = 0;
1196
+ obj.acc = "";
1197
+ obj.ScreenWidth = 960;
1198
+ obj.ScreenHeight = 700;
1199
+ obj.width = 0;
1200
+ obj.height = 0;
1201
+ obj.rwidth = 0;
1202
+ obj.rheight = 0;
1203
+ obj.bpp = 2; // Bytes per pixel (1 or 2 supported)
1204
+ obj.useZRLE = true;
1205
+ obj.showmouse = true;
1206
+ obj.buttonmask = 0;
1207
+ obj.localKeyMap = true;
1208
+ //obj.inbytes = 0;
1209
+ //obj.outbytes = 0;
1210
+ obj.spare = null;
1211
+ obj.sparew = 0;
1212
+ obj.spareh = 0;
1213
+ obj.sparew2 = 0;
1214
+ obj.spareh2 = 0;
1215
+ obj.sparecache = {};
1216
+ obj.ZRLEfirst = 1;
1217
+ obj.onScreenSizeChange = null;
1218
+ obj.frameRateDelay = 0;
1219
+ // ###BEGIN###{DesktopInband}
1220
+ obj.kvmDataSupported = false;
1221
+ obj.onKvmData = null;
1222
+ obj.onKvmDataPending = [];
1223
+ obj.onKvmDataAck = -1;
1224
+ obj.holding = false;
1225
+ obj.lastKeepAlive = Date.now();
1226
+ // ###END###{DesktopInband}
1227
+
1228
+ obj.mNagleTimer = null; // Mouse motion slowdown timer
1229
+ obj.mx = 0; // Last mouse x position
1230
+ obj.my = 0; // Last mouse y position
1231
+
1232
+ // Private method
1233
+ obj.Debug = function (msg) { console.log(msg); }
1234
+
1235
+ obj.xxStateChange = function (newstate) {
1236
+ if (newstate == 0) {
1237
+ obj.canvas.fillStyle = '#000000';
1238
+ obj.canvas.fillRect(0, 0, obj.width, obj.height);
1239
+ obj.canvas.canvas.width = obj.rwidth = obj.width = 640;
1240
+ obj.canvas.canvas.height = obj.rheight = obj.height = 400;
1241
+ QS(obj.canvasid).cursor = 'default';
1242
+ } else {
1243
+ QS(obj.canvasid).cursor = obj.showmouse ?'default':'none';
1244
+ }
1245
+ }
1246
+
1247
+ obj.ProcessData = function (data) {
1248
+ if (!data) return;
1249
+ //obj.Debug("KRecv(" + data.length + "): " + rstr2hex(data));
1250
+ //obj.inbytes += data.length;
1251
+ //obj.Debug("KRecv(" + obj.inbytes + ")");
1252
+ obj.acc += data;
1253
+ while (obj.acc.length > 0) {
1254
+ //obj.Debug("KAcc(" + obj.acc.length + "): " + rstr2hex(obj.acc));
1255
+ var cmdsize = 0;
1256
+ if (obj.state == 0 && obj.acc.length >= 12) {
1257
+ // Getting handshake & version
1258
+ cmdsize = 12;
1259
+ //if (obj.acc.substring(0, 4) != "RFB ") { return obj.Stop(); }
1260
+ //var version = parseFloat(obj.acc.substring(4, 11));
1261
+ //obj.Debug("KVersion: " + version);
1262
+ obj.state = 1;
1263
+ obj.send("RFB 003.008\n");
1264
+ }
1265
+ else if (obj.state == 1 && obj.acc.length >= 1) {
1266
+ // Getting security options
1267
+ cmdsize = obj.acc.charCodeAt(0) + 1;
1268
+ obj.send(String.fromCharCode(1)); // Send the "None" security type. Since we already authenticated using redirection digest auth, we don't need to do this again.
1269
+ obj.state = 2;
1270
+ }
1271
+ else if (obj.state == 2 && obj.acc.length >= 4) {
1272
+ // Getting security response
1273
+ cmdsize = 4;
1274
+ if (ReadInt(obj.acc, 0) != 0) { return obj.Stop(); }
1275
+ obj.send(String.fromCharCode(1)); // Send share desktop flag
1276
+ obj.state = 3;
1277
+ }
1278
+ else if (obj.state == 3 && obj.acc.length >= 24) {
1279
+ // Getting server init
1280
+ var namelen = ReadInt(obj.acc, 20);
1281
+ if (obj.acc.length < 24 + namelen) return;
1282
+ cmdsize = 24 + namelen;
1283
+ obj.canvas.canvas.width = obj.rwidth = obj.width = obj.ScreenWidth = ReadShort(obj.acc, 0);
1284
+ obj.canvas.canvas.height = obj.rheight = obj.height = obj.ScreenHeight = ReadShort(obj.acc, 2);
1285
+
1286
+ // These are all values we don't really need, we are going to only run in RGB565 or RGB332 and not use the flexibility provided by these settings.
1287
+ // Makes the javascript code smaller and maybe a bit faster.
1288
+ /*
1289
+ obj.xbpp = obj.acc.charCodeAt(4);
1290
+ obj.depth = obj.acc.charCodeAt(5);
1291
+ obj.bigend = obj.acc.charCodeAt(6);
1292
+ obj.truecolor = obj.acc.charCodeAt(7);
1293
+ obj.rmax = ReadShort(obj.acc, 8);
1294
+ obj.gmax = ReadShort(obj.acc, 10);
1295
+ obj.bmax = ReadShort(obj.acc, 12);
1296
+ obj.rsh = obj.acc.charCodeAt(14);
1297
+ obj.gsh = obj.acc.charCodeAt(15);
1298
+ obj.bsh = obj.acc.charCodeAt(16);
1299
+ var name = obj.acc.substring(24, 24 + namelen);
1300
+ obj.Debug("name: " + name);
1301
+ obj.Debug("width: " + obj.width + ", height: " + obj.height);
1302
+ obj.Debug("bits-per-pixel: " + obj.xbpp);
1303
+ obj.Debug("depth: " + obj.depth);
1304
+ obj.Debug("big-endian-flag: " + obj.bigend);
1305
+ obj.Debug("true-colour-flag: " + obj.truecolor);
1306
+ obj.Debug("rgb max: " + obj.rmax + "," + obj.gmax + "," + obj.bmax);
1307
+ obj.Debug("rgb shift: " + obj.rsh + "," + obj.gsh + "," + obj.bsh);
1308
+ */
1309
+
1310
+ // SetEncodings, with AMT we can't omit RAW, must be specified.
1311
+ // Intel AMT supports encodings: RAW (0), ZRLE (16), Desktop Size (0xFFFFFF21, -223)
1312
+
1313
+ var supportedEncodings = '';
1314
+ if (obj.useZRLE) supportedEncodings += IntToStr(16);
1315
+ supportedEncodings += IntToStr(0);
1316
+ // ###BEGIN###{DesktopInband}
1317
+ supportedEncodings += IntToStr(1092);
1318
+ // ###END###{DesktopInband}
1319
+
1320
+ obj.send(String.fromCharCode(2, 0) + ShortToStr((supportedEncodings.length / 4) + 1) + supportedEncodings + IntToStr(-223)); // Supported Encodings + Desktop Size
1321
+
1322
+ // Set the pixel encoding to something much smaller
1323
+ // obj.send(String.fromCharCode(0, 0, 0, 0, 16, 16, 0, 1) + ShortToStr(31) + ShortToStr(63) + ShortToStr(31) + String.fromCharCode(11, 5, 0, 0, 0, 0)); // Setup 16 bit color RGB565 (This is the default, so we don't need to set it)
1324
+ if (obj.bpp == 1) obj.send(String.fromCharCode(0, 0, 0, 0, 8, 8, 0, 1) + ShortToStr(7) + ShortToStr(7) + ShortToStr(3) + String.fromCharCode(5, 2, 0, 0, 0, 0)); // Setup 8 bit color RGB332
1325
+
1326
+ obj.state = 4;
1327
+ if (obj.parent) { obj.parent.xxStateChange(3); }
1328
+ _SendRefresh();
1329
+ //obj.timer = setInterval(obj.xxOnTimer, 50);
1330
+
1331
+
1332
+ if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); }
1333
+ }
1334
+ else if (obj.state == 4) {
1335
+ switch (obj.acc.charCodeAt(0)) {
1336
+ case 0: // FramebufferUpdate
1337
+ if (obj.acc.length < 4) return;
1338
+ obj.state = 100 + ReadShort(obj.acc, 2); // Read the number of tiles that are going to be sent, add 100 and use that as our protocol state.
1339
+ cmdsize = 4;
1340
+ break;
1341
+ case 2: // This is the bell, do nothing.
1342
+ cmdsize = 1;
1343
+ break;
1344
+ case 3: // This is ServerCutText
1345
+ if (obj.acc.length < 8) return;
1346
+ var len = ReadInt(obj.acc, 4) + 8;
1347
+ if (obj.acc.length < len) return;
1348
+ cmdsize = handleServerCutText(obj.acc);
1349
+ break;
1350
+ }
1351
+ }
1352
+ else if (obj.state > 100 && obj.acc.length >= 12) {
1353
+ var x = ReadShort(obj.acc, 0),
1354
+ y = ReadShort(obj.acc, 2),
1355
+ width = ReadShort(obj.acc, 4),
1356
+ height = ReadShort(obj.acc, 6),
1357
+ s = width * height,
1358
+ encoding = ReadInt(obj.acc, 8);
1359
+
1360
+ if (encoding < 17) {
1361
+ if (width < 1 || width > 64 || height < 1 || height > 64) { console.log("Invalid tile size (" + width + "," + height + "), disconnecting."); return obj.Stop(); }
1362
+
1363
+ // Set the spare bitmap to the rigth size if it's not already. This allows us to recycle the spare most if not all the time.
1364
+ if (obj.sparew != width || obj.spareh != height) {
1365
+ obj.sparew = obj.sparew2 = width;
1366
+ obj.spareh = obj.spareh2 = height;
1367
+ var xspacecachename = obj.sparew2 + 'x' + obj.spareh2;
1368
+ obj.spare = obj.sparecache[xspacecachename];
1369
+ if (!obj.spare) {
1370
+ obj.sparecache[xspacecachename] = obj.spare = obj.canvas.createImageData(obj.sparew2, obj.spareh2);
1371
+ var j = (obj.sparew2 * obj.spareh2) << 2;
1372
+ for (var i = 3; i < j; i += 4) { obj.spare.data[i] = 0xFF; } // Set alpha channel to opaque.
1373
+ }
1374
+ }
1375
+ }
1376
+
1377
+ if (encoding == 0xFFFFFF21) {
1378
+ // Desktop Size (0xFFFFFF21, -223)
1379
+ obj.canvas.canvas.width = obj.rwidth = obj.width = width;
1380
+ obj.canvas.canvas.height = obj.rheight = obj.height = height;
1381
+ obj.send(String.fromCharCode(3, 0, 0, 0, 0, 0) + ShortToStr(obj.width) + ShortToStr(obj.height)); // FramebufferUpdateRequest
1382
+ cmdsize = 12;
1383
+ if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); }
1384
+ // obj.Debug("New desktop width: " + obj.width + ", height: " + obj.height);
1385
+ }
1386
+ else if (encoding == 0) {
1387
+ // RAW encoding
1388
+ var ptr = 12, cs = 12 + (s * obj.bpp);
1389
+ if (obj.acc.length < cs) return; // Check we have all the data needed and we can only draw 64x64 tiles.
1390
+ cmdsize = cs;
1391
+
1392
+ // CRITICAL LOOP, optimize this as much as possible
1393
+ if (obj.bpp == 2) {
1394
+ for (var i = 0; i < s; i++) { _setPixel16(obj.acc.charCodeAt(ptr++) + (obj.acc.charCodeAt(ptr++) << 8), i); }
1395
+ } else {
1396
+ for (var i = 0; i < s; i++) { _setPixel8(obj.acc.charCodeAt(ptr++), i); }
1397
+ }
1398
+ _putImage(obj.spare, x, y);
1399
+ }
1400
+ else if (encoding == 16) {
1401
+ // ZRLE encoding
1402
+ if (obj.acc.length < 16) return;
1403
+ var datalen = ReadInt(obj.acc, 12);
1404
+ if (obj.acc.length < (16 + datalen)) return;
1405
+ //obj.Debug("RECT ZRLE (" + x + "," + y + "," + width + "," + height + ") LEN = " + datalen);
1406
+ //obj.Debug("RECT ZRLE LEN: " + ReadShortX(obj.acc, 17) + ", DATA: " + rstr2hex(obj.acc.substring(16)));
1407
+
1408
+ // Process the ZLib header if this is the first block
1409
+ var ptr = 16, delta = 5, dx = 0;
1410
+
1411
+ if (datalen > 5 && obj.acc.charCodeAt(ptr) == 0 && ReadShortX(obj.acc, ptr + 1) == (datalen - delta)) {
1412
+ // This is an uncompressed ZLib data block
1413
+ _decodeLRE(obj.acc, ptr + 5, x, y, width, height, s, datalen);
1414
+ }
1415
+
1416
+ cmdsize = 16 + datalen;
1417
+ }
1418
+ else {
1419
+ obj.Debug("Unknown Encoding: " + encoding);
1420
+ return obj.Stop();
1421
+ }
1422
+ if (--obj.state == 100) {
1423
+ obj.state = 4;
1424
+ if (obj.frameRateDelay == 0) {
1425
+ _SendRefresh(); // Ask for new frame
1426
+ } else {
1427
+ setTimeout(_SendRefresh, obj.frameRateDelay); // Hold x miliseconds before asking for a new frame
1428
+ }
1429
+ }
1430
+ }
1431
+
1432
+ if (cmdsize == 0) return;
1433
+ obj.acc = obj.acc.substring(cmdsize);
1434
+ }
1435
+ }
1436
+
1437
+ function _decodeLRE(data, ptr, x, y, width, height, s, datalen) {
1438
+ var subencoding = data.charCodeAt(ptr++), index, v, runlengthdecode, palette = {}, rlecount = 0, runlength = 0, i;
1439
+ // obj.Debug("RECT RLE (" + (datalen - 5) + ", " + subencoding + "):" + rstr2hex(data.substring(21, 21 + (datalen - 5))));
1440
+ if (subencoding == 0) {
1441
+ // RAW encoding
1442
+ if (obj.bpp == 2) {
1443
+ for (i = 0; i < s; i++) { _setPixel16(data.charCodeAt(ptr++) + (data.charCodeAt(ptr++) << 8), i); }
1444
+ } else {
1445
+ for (i = 0; i < s; i++) { _setPixel8(data.charCodeAt(ptr++), i); }
1446
+ }
1447
+ _putImage(obj.spare, x, y);
1448
+ }
1449
+ else if (subencoding == 1) {
1450
+ // Solid color tile
1451
+ v = data.charCodeAt(ptr++) + ((obj.bpp == 2) ? (data.charCodeAt(ptr++) << 8) : 0);
1452
+ obj.canvas.fillStyle = 'rgb(' + ((obj.bpp == 1) ? ((v & 224) + ',' + ((v & 28) << 3) + ',' + _fixColor((v & 3) << 6)) : (((v >> 8) & 248) + ',' + ((v >> 3) & 252) + ',' + ((v & 31) << 3))) + ')';
1453
+
1454
+
1455
+ obj.canvas.fillRect(x, y, width, height);
1456
+ }
1457
+ else if (subencoding > 1 && subencoding < 17) { // Packed palette encoded tile
1458
+ // Read the palette
1459
+ var br = 4, bm = 15; // br is BitRead and bm is BitMask. By adjusting these two we can support all the variations in this encoding.
1460
+ if (obj.bpp == 2) {
1461
+ for (i = 0; i < subencoding; i++) { palette[i] = data.charCodeAt(ptr++) + (data.charCodeAt(ptr++) << 8); }
1462
+ if (subencoding == 2) { br = 1; bm = 1; } else if (subencoding <= 4) { br = 2; bm = 3; } // Compute bits to read & bit mark
1463
+ while (rlecount < s && ptr < data.length) { v = data.charCodeAt(ptr++); for (i = (8 - br) ; i >= 0; i -= br) { _setPixel16(palette[(v >> i) & bm], rlecount++); } } // Display all the bits
1464
+ } else {
1465
+ for (i = 0; i < subencoding; i++) { palette[i] = data.charCodeAt(ptr++); }
1466
+ if (subencoding == 2) { br = 1; bm = 1; } else if (subencoding <= 4) { br = 2; bm = 3; } // Compute bits to read & bit mark
1467
+ while (rlecount < s && ptr < data.length) { v = data.charCodeAt(ptr++); for (i = (8 - br) ; i >= 0; i -= br) { _setPixel8(palette[(v >> i) & bm], rlecount++); } } // Display all the bits
1468
+ }
1469
+ _putImage(obj.spare, x, y);
1470
+ }
1471
+ else if (subencoding == 128) { // RLE encoded tile
1472
+ if (obj.bpp == 2) {
1473
+ while (rlecount < s && ptr < data.length) {
1474
+ // Get the run color
1475
+ v = data.charCodeAt(ptr++) + (data.charCodeAt(ptr++) << 8);
1476
+
1477
+ // Decode the run length. This is the fastest and most compact way I found to do this.
1478
+ runlength = 1; do { runlength += (runlengthdecode = data.charCodeAt(ptr++)); } while (runlengthdecode == 255);
1479
+
1480
+ // Draw a run
1481
+ if (obj.rotation == 0) {
1482
+ _setPixel16run(v, rlecount, runlength); rlecount += runlength;
1483
+ } else {
1484
+ while (--runlength >= 0) { _setPixel16(v, rlecount++); }
1485
+ }
1486
+ }
1487
+ } else {
1488
+ while (rlecount < s && ptr < data.length) {
1489
+ // Get the run color
1490
+ v = data.charCodeAt(ptr++);
1491
+
1492
+ // Decode the run length. This is the fastest and most compact way I found to do this.
1493
+ runlength = 1; do { runlength += (runlengthdecode = data.charCodeAt(ptr++)); } while (runlengthdecode == 255);
1494
+
1495
+ // Draw a run
1496
+ if (obj.rotation == 0) {
1497
+ _setPixel8run(v, rlecount, runlength); rlecount += runlength;
1498
+ } else {
1499
+ while (--runlength >= 0) { _setPixel8(v, rlecount++); }
1500
+ }
1501
+ }
1502
+ }
1503
+ _putImage(obj.spare, x, y);
1504
+ }
1505
+ else if (subencoding > 129) { // Palette RLE encoded tile
1506
+ // Read the palette
1507
+ if (obj.bpp == 2) {
1508
+ for (i = 0; i < (subencoding - 128) ; i++) { palette[i] = data.charCodeAt(ptr++) + (data.charCodeAt(ptr++) << 8); }
1509
+ } else {
1510
+ for (i = 0; i < (subencoding - 128) ; i++) { palette[i] = data.charCodeAt(ptr++); }
1511
+ }
1512
+
1513
+ // Decode RLE on palette
1514
+ while (rlecount < s && ptr < data.length) {
1515
+ // Setup the run, get the color index and get the color from the palette.
1516
+ runlength = 1; index = data.charCodeAt(ptr++); v = palette[index % 128];
1517
+
1518
+ // If the index starts with high order bit 1, this is a run and decode the run length.
1519
+ if (index > 127) { do { runlength += (runlengthdecode = data.charCodeAt(ptr++)); } while (runlengthdecode == 255); }
1520
+
1521
+ // Draw a run
1522
+ if (obj.rotation == 0) {
1523
+ if (obj.bpp == 2) {
1524
+ _setPixel16run(v, rlecount, runlength); rlecount += runlength;
1525
+ } else {
1526
+ _setPixel8run(v, rlecount, runlength); rlecount += runlength;
1527
+ }
1528
+ } else {
1529
+ if (obj.bpp == 2) {
1530
+ while (--runlength >= 0) { _setPixel16(v, rlecount++); }
1531
+ } else {
1532
+ while (--runlength >= 0) { _setPixel8(v, rlecount++); }
1533
+ }
1534
+ }
1535
+ }
1536
+ _putImage(obj.spare, x, y);
1537
+ }
1538
+ }
1539
+
1540
+ // ###BEGIN###{DesktopInband}
1541
+ obj.hold = function (holding) {
1542
+ if (obj.holding == holding) return;
1543
+ obj.holding = holding;
1544
+ obj.canvas.fillStyle = '#000000';
1545
+ obj.canvas.fillRect(0, 0, obj.width, obj.height); // Paint black
1546
+ if (obj.holding == false) {
1547
+ // Go back to normal operations
1548
+ // Set canvas size and ask for full screen refresh
1549
+ if ((obj.canvas.canvas.width != obj.width) || (obj.canvas.canvas.height != obj.height)) {
1550
+ obj.canvas.canvas.width = obj.width; obj.canvas.canvas.height = obj.height;
1551
+ if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); } // ???
1552
+ }
1553
+ obj.Send(String.fromCharCode(3, 0, 0, 0, 0, 0) + ShortToStr(obj.width) + ShortToStr(obj.height)); // FramebufferUpdateRequest
1554
+ } else {
1555
+ obj.UnGrabMouseInput();
1556
+ obj.UnGrabKeyInput();
1557
+ }
1558
+ }
1559
+ // ###END###{DesktopInband}
1560
+
1561
+ function _putImage(i, x, y) {
1562
+ // ###BEGIN###{DesktopInband}
1563
+ if (obj.holding == true) return;
1564
+ // ###END###{DesktopInband}
1565
+ obj.canvas.putImageData(i, x, y);
1566
+ }
1567
+
1568
+ // Set 8bit color RGB332
1569
+ function _setPixel8(v, p) {
1570
+ var pp = p << 2;
1571
+
1572
+
1573
+ obj.spare.data[pp] = v & 224;
1574
+ obj.spare.data[pp + 1] = (v & 28) << 3;
1575
+ obj.spare.data[pp + 2] = _fixColor((v & 3) << 6);
1576
+ }
1577
+
1578
+ // Set 16bit color RGB565
1579
+ function _setPixel16(v, p) {
1580
+ var pp = p << 2;
1581
+
1582
+
1583
+ obj.spare.data[pp] = (v >> 8) & 248;
1584
+ obj.spare.data[pp + 1] = (v >> 3) & 252;
1585
+ obj.spare.data[pp + 2] = (v & 31) << 3;
1586
+ }
1587
+
1588
+ // Set a run of 8bit color RGB332
1589
+ function _setPixel8run(v, p, run) {
1590
+ var pp = (p << 2), r = (v & 224), g = ((v & 28) << 3), b = (_fixColor((v & 3) << 6));
1591
+ while (--run >= 0) { obj.spare.data[pp] = r; obj.spare.data[pp + 1] = g; obj.spare.data[pp + 2] = b; pp += 4; }
1592
+ }
1593
+
1594
+ // Set a run of 16bit color RGB565
1595
+ function _setPixel16run(v, p, run) {
1596
+ var pp = (p << 2), r = ((v >> 8) & 248), g = ((v >> 3) & 252), b = ((v & 31) << 3);
1597
+ while (--run >= 0) { obj.spare.data[pp] = r; obj.spare.data[pp + 1] = g; obj.spare.data[pp + 2] = b; pp += 4; }
1598
+ }
1599
+
1600
+
1601
+ function _fixColor(c) { return (c > 127) ? (c + 32) : c; }
1602
+
1603
+ function _SendRefresh() {
1604
+ // ###BEGIN###{DesktopInband}
1605
+ if (obj.holding == true) return;
1606
+ // ###END###{DesktopInband}
1607
+ // Request the entire screen
1608
+ obj.send(String.fromCharCode(3, 1, 0, 0, 0, 0) + ShortToStr(obj.rwidth) + ShortToStr(obj.rheight)); // FramebufferUpdateRequest
1609
+ }
1610
+
1611
+ obj.Start = function () {
1612
+ //obj.Debug("KVM-Start");
1613
+ obj.state = 0;
1614
+ obj.acc = "";
1615
+ obj.ZRLEfirst = 1;
1616
+ //obj.inbytes = 0;
1617
+ //obj.outbytes = 0;
1618
+ // ###BEGIN###{DesktopInband}
1619
+ obj.onKvmDataPending = [];
1620
+ obj.onKvmDataAck = -1;
1621
+ obj.kvmDataSupported = false;
1622
+ // ###END###{DesktopInband}
1623
+ for (var i in obj.sparecache) { delete obj.sparecache[i]; }
1624
+ }
1625
+
1626
+ obj.Stop = function () {
1627
+ obj.UnGrabMouseInput();
1628
+ obj.UnGrabKeyInput();
1629
+ if (obj.parent) { obj.parent.Stop(); }
1630
+ }
1631
+
1632
+ obj.send = function (x) {
1633
+ //obj.Debug("KSend(" + x.length + "): " + rstr2hex(x));
1634
+ //obj.outbytes += x.length;
1635
+ if (obj.parent) { obj.parent.send(x); }
1636
+ }
1637
+
1638
+ var convertAmtKeyCodeTable = {
1639
+ "Pause": 19,
1640
+ "CapsLock": 20,
1641
+ "Space": 32,
1642
+ "Quote": 39,
1643
+ "Minus": 45,
1644
+ "NumpadMultiply": 42,
1645
+ "NumpadAdd": 43,
1646
+ "PrintScreen": 44,
1647
+ "Comma": 44,
1648
+ "NumpadSubtract": 45,
1649
+ "NumpadDecimal": 46,
1650
+ "Period": 46,
1651
+ "Slash": 47,
1652
+ "NumpadDivide": 47,
1653
+ "Semicolon": 59,
1654
+ "Equal": 61,
1655
+ "OSLeft": 91,
1656
+ "BracketLeft": 91,
1657
+ "OSRight": 91,
1658
+ "Backslash": 92,
1659
+ "BracketRight": 93,
1660
+ "ContextMenu": 93,
1661
+ "Backquote": 96,
1662
+ "NumLock": 144,
1663
+ "ScrollLock": 145,
1664
+ "Backspace": 0xff08,
1665
+ "Tab": 0xff09,
1666
+ "Enter": 0xff0d,
1667
+ "NumpadEnter": 0xff0d,
1668
+ "Escape": 0xff1b,
1669
+ "Delete": 0xffff,
1670
+ "Home": 0xff50,
1671
+ "PageUp": 0xff55,
1672
+ "PageDown": 0xff56,
1673
+ "ArrowLeft": 0xff51,
1674
+ "ArrowUp": 0xff52,
1675
+ "ArrowRight": 0xff53,
1676
+ "ArrowDown": 0xff54,
1677
+ "End": 0xff57,
1678
+ "Insert": 0xff63,
1679
+ "F1": 0xffbe,
1680
+ "F2": 0xffbf,
1681
+ "F3": 0xffc0,
1682
+ "F4": 0xffc1,
1683
+ "F5": 0xffc2,
1684
+ "F6": 0xffc3,
1685
+ "F7": 0xffc4,
1686
+ "F8": 0xffc5,
1687
+ "F9": 0xffc6,
1688
+ "F10": 0xffc7,
1689
+ "F11": 0xffc8,
1690
+ "F12": 0xffc9,
1691
+ "ShiftLeft": 0xffe1,
1692
+ "ShiftRight": 0xffe2,
1693
+ "ControlLeft": 0xffe3,
1694
+ "ControlRight": 0xffe4,
1695
+ "AltLeft": 0xffe9,
1696
+ "AltRight": 0xffea,
1697
+ "MetaLeft": 0xffe7,
1698
+ "MetaRight": 0xffe8
1699
+ }
1700
+ function convertAmtKeyCode(e) {
1701
+ if (e.code.startsWith('Key') && e.code.length == 4) { return e.code.charCodeAt(3) + ((e.shiftKey == false) ? 32 : 0); }
1702
+ if (e.code.startsWith('Digit') && e.code.length == 6) { return e.code.charCodeAt(5); }
1703
+ if (e.code.startsWith('Numpad') && e.code.length == 7) { return e.code.charCodeAt(6); }
1704
+ return convertAmtKeyCodeTable[e.code];
1705
+ }
1706
+
1707
+ /*
1708
+ Intel AMT only recognizes a small subset of keysym characters defined in the keysymdef.h so you don�t need to
1709
+ implement all the languages (this is taken care by the USB Scancode Extension in RFB4.0 protocol).
1710
+ The only subset recognized by the FW is the defined by the following sets : XK_LATIN1 , XK_MISCELLANY, XK_3270, XK_XKB_KEYS, XK_KATAKANA.
1711
+ In addition to keysymdef.h symbols there are 6 japanese extra keys that we do support:
1712
+
1713
+ #define XK_Intel_EU_102kbd_backslash_pipe_45 0x17170056 // European 102-key: 45 (backslash/pipe), usb Usage: 0x64
1714
+ #define XK_Intel_JP_106kbd_yen_pipe 0x1717007d // Japanese 106-key: 14 (Yen/pipe), usb Usage: 0x89
1715
+ #define XK_Intel_JP_106kbd_backslash_underbar 0x17170073 // Japanese 106-key: 56 (backslash/underbar), usb Usage: 0x87
1716
+ #define XK_Intel_JP_106kbd_NoConvert 0x1717007b // Japanese 106-key: 131 (NoConvert), usb Usage: 0x8b
1717
+ #define XK_Intel_JP_106kbd_Convert 0x17170079 // Japanese 106-key: 132 (Convert), usb Usage: 0x8a
1718
+ #define XK_Intel_JP_106kbd_Hirigana_Katakana 0x17170070 // Japanese 106-key: 133 (Hirigana/Katakana), usb Usage: 0x88
1719
+ */
1720
+
1721
+ function _keyevent(d, e) {
1722
+ if (!e) { e = window.event; }
1723
+
1724
+ if (e.code && (obj.localKeyMap == false)) {
1725
+ // For new browsers, this mapping is keyboard language independent
1726
+ var k = convertAmtKeyCode(e);
1727
+ if (k != null) { obj.sendkey(k, d); }
1728
+ } else {
1729
+ // For older browsers, this mapping works best for EN-US keyboard
1730
+ var k = e.keyCode, kk = k;
1731
+ if (e.shiftKey == false && k >= 65 && k <= 90) kk = k + 32;
1732
+ if (k >= 112 && k <= 124) kk = k + 0xFF4E;
1733
+ if (k == 8) kk = 0xff08; // Backspace
1734
+ if (k == 9) kk = 0xff09; // Tab
1735
+ if (k == 13) kk = 0xff0d; // Return
1736
+ if (k == 16) kk = 0xffe1; // Shift (Left)
1737
+ if (k == 17) kk = 0xffe3; // Ctrl (Left)
1738
+ if (k == 18) kk = 0xffe9; // Alt (Left)
1739
+ if (k == 27) kk = 0xff1b; // ESC
1740
+ if (k == 33) kk = 0xff55; // PageUp
1741
+ if (k == 34) kk = 0xff56; // PageDown
1742
+ if (k == 35) kk = 0xff57; // End
1743
+ if (k == 36) kk = 0xff50; // Home
1744
+ if (k == 37) kk = 0xff51; // Left
1745
+ if (k == 38) kk = 0xff52; // Up
1746
+ if (k == 39) kk = 0xff53; // Right
1747
+ if (k == 40) kk = 0xff54; // Down
1748
+ if (k == 45) kk = 0xff63; // Insert
1749
+ if (k == 46) kk = 0xffff; // Delete
1750
+ if (k >= 96 && k <= 105) kk = k - 48; // Key pad numbers
1751
+ if (k == 106) kk = 42; // Pad *
1752
+ if (k == 107) kk = 43; // Pad +
1753
+ if (k == 109) kk = 45; // Pad -
1754
+ if (k == 110) kk = 46; // Pad .
1755
+ if (k == 111) kk = 47; // Pad /
1756
+ if (k == 186) kk = 59; // ;
1757
+ if (k == 187) kk = 61; // =
1758
+ if (k == 188) kk = 44; // ,
1759
+ if (k == 189) kk = 45; // -
1760
+ if (k == 190) kk = 46; // .
1761
+ if (k == 191) kk = 47; // /
1762
+ if (k == 192) kk = 96; // `
1763
+ if (k == 219) kk = 91; // [
1764
+ if (k == 220) kk = 92; // \
1765
+ if (k == 221) kk = 93; // ]
1766
+ if (k == 222) kk = 39; // '
1767
+ //console.log('Key' + d + ": " + k + " = " + kk);
1768
+ obj.sendkey(kk, d);
1769
+ }
1770
+ return obj.haltEvent(e);
1771
+ }
1772
+
1773
+ obj.sendkey = function (k, d) {
1774
+ if (typeof k == 'object') {
1775
+ //for (var i in k) { obj.sendkey(k[i][0], k[i][1]); }
1776
+ var buf = ''; for (var i in k) { buf += (String.fromCharCode(4, k[i][1], 0, 0) + IntToStr(k[i][0])); } obj.send(buf);
1777
+ } else {
1778
+ obj.send(String.fromCharCode(4, d, 0, 0) + IntToStr(k));
1779
+ }
1780
+ }
1781
+
1782
+ function handleServerCutText(acc) {
1783
+ if (acc.length < 8) return 0;
1784
+ var len = ReadInt(obj.acc, 4) + 8;
1785
+ if (acc.length < len) return 0;
1786
+ // ###BEGIN###{DesktopInband}
1787
+ if (obj.onKvmData != null) {
1788
+ var d = acc.substring(8, len);
1789
+ if ((d.length >= 16) && (d.substring(0, 15) == '\0KvmDataChannel')) {
1790
+ if (obj.kvmDataSupported == false) { obj.kvmDataSupported = true; console.log('KVM Data Channel Supported.'); }
1791
+ if (((obj.onKvmDataAck == -1) && (d.length == 16)) || (d.charCodeAt(15) != 0)) { obj.onKvmDataAck = true; }
1792
+ //if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-Recv(' + (d.length - 16) + '): ' + d.substring(16)); }
1793
+ if (d.length >= 16) { obj.onKvmData(d.substring(16)); } // Event the data and ack
1794
+ if ((obj.onKvmDataAck == true) && (obj.onKvmDataPending.length > 0)) { obj.sendKvmData(obj.onKvmDataPending.shift()); } // Send pending data
1795
+ }
1796
+ }
1797
+ // ###END###{DesktopInband}
1798
+ return len;
1799
+ }
1800
+
1801
+ // ###BEGIN###{DesktopInband}
1802
+ obj.sendKvmData = function (x) {
1803
+ if (obj.onKvmDataAck !== true) {
1804
+ obj.onKvmDataPending.push(x);
1805
+ } else {
1806
+ //if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-Send(' + x.length + '): ' + x); }
1807
+ x = '\0KvmDataChannel\0' + x;
1808
+ obj.send(String.fromCharCode(6, 0, 0, 0) + IntToStr(x.length) + x);
1809
+ obj.onKvmDataAck = false;
1810
+ }
1811
+ }
1812
+
1813
+ // Send a HWKVM keep alive if it's not been sent in the last 5 seconds.
1814
+ obj.sendKeepAlive = function () {
1815
+ if (obj.lastKeepAlive < Date.now() - 5000) { obj.lastKeepAlive = Date.now(); obj.send(String.fromCharCode(6, 0, 0, 0) + IntToStr(16) + '\0KvmDataChannel\0'); }
1816
+ }
1817
+ // ###END###{DesktopInband}
1818
+
1819
+ obj.SendCtrlAltDelMsg = function () { obj.sendcad(); }
1820
+ obj.sendcad = function () { obj.sendkey([[0xFFE3, 1], [0xFFE9, 1], [0xFFFF, 1], [0xFFFF, 0], [0xFFE9, 0], [0xFFE3, 0]]); } // Control down, Alt down, Delete down, Delete up , Alt up , Control up
1821
+
1822
+ var _MouseInputGrab = false;
1823
+ var _KeyInputGrab = false;
1824
+
1825
+ obj.GrabMouseInput = function () {
1826
+ if (_MouseInputGrab == true) return;
1827
+ var c = obj.canvas.canvas;
1828
+ c.onmouseup = obj.mouseup;
1829
+ c.onmousedown = obj.mousedown;
1830
+ c.onmousemove = obj.mousemove;
1831
+ //if (navigator.userAgent.match(/mozilla/i)) c.DOMMouseScroll = obj.xxDOMMouseScroll; else c.onmousewheel = obj.xxMouseWheel;
1832
+ _MouseInputGrab = true;
1833
+ }
1834
+
1835
+ obj.UnGrabMouseInput = function () {
1836
+ if (_MouseInputGrab == false) return;
1837
+ var c = obj.canvas.canvas;
1838
+ c.onmousemove = null;
1839
+ c.onmouseup = null;
1840
+ c.onmousedown = null;
1841
+ //if (navigator.userAgent.match(/mozilla/i)) c.DOMMouseScroll = null; else c.onmousewheel = null;
1842
+ _MouseInputGrab = false;
1843
+ }
1844
+
1845
+ obj.GrabKeyInput = function () {
1846
+ if (_KeyInputGrab == true) return;
1847
+ document.onkeyup = obj.handleKeyUp;
1848
+ document.onkeydown = obj.handleKeyDown;
1849
+ document.onkeypress = obj.handleKeys;
1850
+ _KeyInputGrab = true;
1851
+ }
1852
+
1853
+ obj.UnGrabKeyInput = function () {
1854
+ if (_KeyInputGrab == false) return;
1855
+ document.onkeyup = null;
1856
+ document.onkeydown = null;
1857
+ document.onkeypress = null;
1858
+ _KeyInputGrab = false;
1859
+ }
1860
+
1861
+ obj.handleKeys = function (e) { return obj.haltEvent(e); }
1862
+ obj.handleKeyUp = function (e) { return _keyevent(0, e); }
1863
+ obj.handleKeyDown = function (e) { return _keyevent(1, e); }
1864
+ obj.haltEvent = function (e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; }
1865
+
1866
+ // RFB "PointerEvent" and mouse handlers
1867
+ obj.mousedblclick = function (e) { }
1868
+ obj.mousedown = function (e) { obj.buttonmask |= (1 << e.button); return obj.mousemove(e, 1); }
1869
+ obj.mouseup = function (e) { obj.buttonmask &= (0xFFFF - (1 << e.button)); return obj.mousemove(e, 1); }
1870
+ obj.mousemove = function (e, force) {
1871
+ if (obj.state < 4) return true;
1872
+ var ScaleFactorHeight = (obj.canvas.canvas.height / Q(obj.canvasid).offsetHeight);
1873
+ var ScaleFactorWidth = (obj.canvas.canvas.width / Q(obj.canvasid).offsetWidth);
1874
+ var Offsets = obj.getPositionOfControl(Q(obj.canvasid));
1875
+ obj.mx = ((event.pageX - Offsets[0]) * ScaleFactorWidth);
1876
+ obj.my = ((event.pageY - Offsets[1]) * ScaleFactorHeight);
1877
+ if (event.addx) { obj.mx += event.addx; }
1878
+ if (event.addy) { obj.my += event.addy; }
1879
+
1880
+
1881
+ // This is the mouse motion nagle timer. Slow down the mouse motion event rate.
1882
+ if (force == 1) {
1883
+ obj.send(String.fromCharCode(5, obj.buttonmask) + ShortToStr(obj.mx) + ShortToStr(obj.my));
1884
+ if (obj.mNagleTimer != null) { clearTimeout(obj.mNagleTimer); obj.mNagleTimer = null; }
1885
+ } else {
1886
+ if (obj.mNagleTimer == null) {
1887
+ obj.mNagleTimer = setTimeout(function () {
1888
+ obj.send(String.fromCharCode(5, obj.buttonmask) + ShortToStr(obj.mx) + ShortToStr(obj.my));
1889
+ obj.mNagleTimer = null;
1890
+ }, 50);
1891
+ }
1892
+ }
1893
+
1894
+
1895
+ return obj.haltEvent(e);
1896
+ }
1897
+
1898
+ obj.getPositionOfControl = function (Control) {
1899
+ var Position = Array(2);
1900
+ Position[0] = Position[1] = 0;
1901
+ while (Control) {
1902
+ Position[0] += Control.offsetLeft;
1903
+ Position[1] += Control.offsetTop;
1904
+ Control = Control.offsetParent;
1905
+ }
1906
+ return Position;
1907
+ }
1908
+
1909
+ return obj;
1910
+}
1911
+/**
1912
+* @description Remote Terminal
1913
+* @author Ylian Saint-Hilaire
1914
+* @version v0.0.2c
1915
+*/
1916
+
1917
+// https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
1918
+// https://www.x.org/docs/xterm/ctlseqs.pdf
1919
+
1920
+// Construct a MeshServer object
1921
+var CreateAmtRemoteTerminal = function (divid, options) {
1922
+ var obj = {};
1923
+ obj.DivId = divid;
1924
+ obj.DivElement = document.getElementById(divid);
1925
+ obj.protocol = 1; // SOL
1926
+ if (options.protocol) { obj.protocol = options.protocol; } // 1 = Normal, 6 = PowerShell
1927
+ obj.fxEmulation = 0;
1928
+ obj.lineFeed = '\r\n';
1929
+ obj.debugmode = 0;
1930
+
1931
+ obj.width = 80; // 80 or 100
1932
+ obj.height = 25; // 25 or 30
1933
+ obj.heightLock = 0;
1934
+
1935
+ var _Terminal_CellHeight = 21;
1936
+ var _Terminal_CellWidth = 13;
1937
+ var _TermColors = ['000000', 'BB0000', '00BB00', 'BBBB00', '0000BB', 'BB00BB', '00BBBB', 'BBBBBB', '555555', 'FF5555', '55FF55', 'FFFF55', '5555FF', 'FF55FF', '55FFFF', 'FFFFFF'];
1938
+ var _TermCurrentReverse = 0;
1939
+ var _TermCurrentFColor = 7;
1940
+ var _TermCurrentBColor = 0;
1941
+ var _TermLineWrap = true;
1942
+ var _termx = 0;
1943
+ var _termy = 0;
1944
+ var _termsavex = 0;
1945
+ var _termsavey = 0;
1946
+ var _termstate = 0;
1947
+ var _escNumber = [];
1948
+ var _escNumberPtr = 0;
1949
+ var _escNumberMode = 0;
1950
+ var _scratt = [];
1951
+ var _tscreen = [];
1952
+ var _VTUNDERLINE = 1;
1953
+ var _VTREVERSE = 2;
1954
+ var _backSpaceErase = false;
1955
+ var _cursorVisible = true;
1956
+ var _scrollRegion;
1957
+ var _altKeypadMode = false;
1958
+ var scrollBackBuffer = [];
1959
+ obj.title = null;
1960
+ obj.onTitleChange = null;
1961
+
1962
+ obj.Start = function () { }
1963
+
1964
+ obj.Init = function (width, height) {
1965
+ obj.width = width ? width : 80;
1966
+ obj.height = height ? height : 25;
1967
+ for (var y = 0; y < obj.height; y++) {
1968
+ _tscreen[y] = [];
1969
+ _scratt[y] = [];
1970
+ for (var x = 0; x < obj.width; x++) { _tscreen[y][x] = ' '; _scratt[y][x] = (7 << 6); }
1971
+ }
1972
+ obj.TermInit();
1973
+ obj.TermDraw();
1974
+ }
1975
+
1976
+ obj.xxStateChange = function (newstate) {
1977
+ if ((newstate == 3) && (options != null) && (options.xterm == true)) { obj.TermSendKeys('stty rows ' + obj.height + ' cols ' + obj.width + '\nclear\n'); }
1978
+ }
1979
+
1980
+ obj.ProcessData = function (str) {
1981
+ if (obj.debugmode == 2) { console.log("TRecv(" + str.length + "): " + rstr2hex(str)); }
1982
+ if (obj.capture != null) obj.capture += str; _ProcessVt100EscString(str); obj.TermDraw();
1983
+ }
1984
+
1985
+ function _ProcessVt100EscString(str) { for (var i = 0; i < str.length; i++) _ProcessVt100EscChar(String.fromCharCode(str.charCodeAt(i)), str.charCodeAt(i)); }
1986
+
1987
+ function _ProcessVt100EscChar(b, c) {
1988
+ switch (_termstate) {
1989
+ case 0: // Normal Term State
1990
+ switch (c) {
1991
+ case 27: // ESC
1992
+ _termstate = 1;
1993
+ _escNumber = [];
1994
+ _escNumberPtr = 0;
1995
+ _escNumberMode = 0;
1996
+ break;
1997
+ default:
1998
+ // Process a single char
1999
+ _ProcessVt100Char(b);
2000
+ break;
2001
+ }
2002
+ break;
2003
+ case 1:
2004
+ switch (b) {
2005
+ case '[':
2006
+ _termstate = 2;
2007
+ break;
2008
+ case '(':
2009
+ _termstate = 4;
2010
+ break;
2011
+ case ')':
2012
+ _termstate = 5;
2013
+ break;
2014
+ case ']':
2015
+ _termstate = 6; // xterm strings
2016
+ break;
2017
+ case '=':
2018
+ // Set alternate keypad mode
2019
+ _altKeypadMode = true;
2020
+ _termstate = 0;
2021
+ break;
2022
+ case '>':
2023
+ // Set numeric keypad mode
2024
+ _altKeypadMode = false;
2025
+ _termstate = 0;
2026
+ break;
2027
+ case '7':
2028
+ // Save Cursor
2029
+ _termsavex = _termx;
2030
+ _termsavey = _termy;
2031
+ _termstate = 0;
2032
+ break;
2033
+ case '8':
2034
+ // Restore Cursor
2035
+ _termx = _termsavex;
2036
+ _termy = _termsavey;
2037
+ _termstate = 0;
2038
+ break;
2039
+ case 'M':
2040
+ // Scroll down one
2041
+ var x = 1;
2042
+ for (var y = _scrollRegion[1]; y >= _scrollRegion[0] + x; y--) {
2043
+ for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = _tscreen[y - x][z]; _scratt[y][z] = _scratt[y - x][z]; }
2044
+ }
2045
+ for (var y = _scrollRegion[0] + x - 1; y > _scrollRegion[0] - 1; y--) {
2046
+ for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = ' '; _scratt[y][z] = (7 << 6); }
2047
+ }
2048
+ _termstate = 0;
2049
+ break;
2050
+ default:
2051
+ console.log('unknown terminal short code', b);
2052
+ _termstate = 0;
2053
+ break;
2054
+ }
2055
+ break;
2056
+ case 2:
2057
+ if (b >= '0' && b <= '9') {
2058
+ // This is a number
2059
+ if (!_escNumber[_escNumberPtr]) { _escNumber[_escNumberPtr] = (b - '0'); }
2060
+ else { _escNumber[_escNumberPtr] = ((_escNumber[_escNumberPtr] * 10) + (b - '0')); }
2061
+ break;
2062
+ } else if (b == ';') {
2063
+ // New number
2064
+ _escNumberPtr++;
2065
+ break;
2066
+ } else if (b == '?') {
2067
+ _escNumberMode = 1;
2068
+ break;
2069
+ } else {
2070
+ // Process Escape Sequence
2071
+ if (!_escNumber[0]) _escNumber[0] = 0;
2072
+ _ProcessEscapeHandler(b, _escNumber, _escNumberPtr + 1, _escNumberMode);
2073
+ _termstate = 0;
2074
+ }
2075
+ break;
2076
+ case 4: // '(' Code
2077
+ _termstate = 0;
2078
+ break;
2079
+ case 5: // ')' Code
2080
+ _termstate = 0;
2081
+ break;
2082
+ case 6: // ']' Code, xterm
2083
+ var bx = b.charCodeAt(0);
2084
+ if (b == ';') {
2085
+ _escNumberPtr++;
2086
+ } else if (bx == 7) {
2087
+ _ProcessXTermHandler(_escNumber);
2088
+ _termstate = 0;
2089
+ } else {
2090
+ if (!_escNumber[_escNumberPtr]) { _escNumber[_escNumberPtr] = b; }
2091
+ else { _escNumber[_escNumberPtr] += b; }
2092
+ }
2093
+ break;
2094
+ }
2095
+ }
2096
+
2097
+ function _ProcessXTermHandler(_escNumber) {
2098
+ if (_escNumber.length == 0) return;
2099
+ var cmd = parseInt(_escNumber[0]);
2100
+ if ((cmd == 0 || cmd == 2) && (_escNumber.length > 1) && (_escNumber[1] != '?')) {
2101
+ if (obj.onTitleChange) { obj.onTitleChange(obj, obj.title = _escNumber[1]); }
2102
+ }
2103
+ }
2104
+
2105
+ function _ProcessEscapeHandler(code, args, argslen, mode) {
2106
+ //console.log('process', code, args, mode);
2107
+ if (mode == 1) {
2108
+ switch (code) {
2109
+ case 'l': // Hide the cursor
2110
+ if (args[0] == 25) { _cursorVisible = false; }
2111
+ break;
2112
+ case 'h': // Show the cursor
2113
+ if (args[0] == 25) { _cursorVisible = true; }
2114
+ break;
2115
+ }
2116
+ } else if (mode == 0) {
2117
+ var i;
2118
+ switch (code) {
2119
+ case 'c': // ResetDevice
2120
+ // Reset
2121
+ obj.TermResetScreen();
2122
+ break;
2123
+ case 'A': // Move cursor up n lines
2124
+ if (argslen == 1) {
2125
+ if (args[0] == 0) { _termy--; } else { _termy -= args[0]; }
2126
+ if (_termy < 0) _termy = 0;
2127
+ }
2128
+ break;
2129
+ case 'B': // Move cursor down n lines
2130
+ if (argslen == 1) {
2131
+ if (args[0] == 0) { _termy++; } else { _termy += args[0]; }
2132
+ if (_termy > obj.height) _termy = obj.height;
2133
+ }
2134
+ break;
2135
+ case 'C': // Move cursor right n lines
2136
+ if (argslen == 1) {
2137
+ if (args[0] == 0) { _termx++; } else { _termx += args[0]; }
2138
+ if (_termx > obj.width) _termx = obj.width;
2139
+ }
2140
+ break;
2141
+ case 'D': // Move cursor left n lines
2142
+ if (argslen == 1) {
2143
+ if (args[0] == 0) { _termx--; } else { _termx -= args[0]; }
2144
+ if (_termx < 0) _termx = 0;
2145
+ }
2146
+ break;
2147
+ case 'd': // Set cursor to line n
2148
+ if (argslen == 1) {
2149
+ _termy = args[0] - 1;
2150
+ if (_termy > obj.height) _termy = obj.height;
2151
+ if (_termy < 0) _termy = 0;
2152
+ }
2153
+ break;
2154
+ case 'G': // Set cursor to col n
2155
+ if (argslen == 1) {
2156
+ _termx = args[0] - 1;
2157
+ if (_termx < 0) _termx = 0;
2158
+ if (_termx > (obj.width - 1)) _termx = (obj.width - 1);
2159
+ }
2160
+ break;
2161
+ case 'P': // Delete X Character(s), default 1 char
2162
+ var x = 1;
2163
+ if (argslen == 1) { x = args[0]; }
2164
+ for (i = _termx; i < obj.width - x; i++) { _tscreen[_termy][i] = _tscreen[_termy][i + x]; _scratt[_termy][i] = _scratt[_termy][i + x]; }
2165
+ for (i = (obj.width - x); i < obj.width; i++) { _tscreen[_termy][i] = ' '; _scratt[_termy][i] = (7 << 6); }
2166
+ break;
2167
+ case 'L': // Insert X Line(s), default 1 char
2168
+ var linecount = 1;
2169
+ if (argslen == 1) { linecount = args[0]; }
2170
+ if (linecount == 0) { linecount = 1; }
2171
+ for (y = _scrollRegion[1]; y >= _termy + linecount; y--) {
2172
+ _tscreen[y] = _tscreen[y - linecount];
2173
+ _scratt[y] = _scratt[y - linecount];
2174
+ }
2175
+ for (y = _termy; y < _termy + linecount; y++) {
2176
+ _tscreen[y] = [];
2177
+ _scratt[y] = [];
2178
+ for (x = 0; x < obj.width; x++) { _tscreen[y][x] = ' '; _scratt[y][x] = (7 << 6); }
2179
+ }
2180
+ break;
2181
+ case 'J': // ClearScreen:
2182
+ if (argslen == 1 && args[0] == 2) {
2183
+ obj.TermClear((_TermCurrentBColor << 12) + (_TermCurrentFColor << 6)); // Erase entire screen
2184
+ _termx = 0;
2185
+ _termy = 0;
2186
+ scrollBackBuffer = [];
2187
+ }
2188
+ else if (argslen == 0 || argslen == 1 && args[0] == 0) // Erase cursor down
2189
+ {
2190
+ _EraseCursorToEol();
2191
+ for (i = _termy + 1; i < obj.height; i++) _EraseLine(i);
2192
+ }
2193
+ else if (argslen == 1 && args[0] == 1) // Erase cursor up
2194
+ {
2195
+ _EraseCursorToEol();
2196
+ for (i = 0; i < _termy - 1; i++) _EraseLine(i);
2197
+ }
2198
+ break;
2199
+ case 'H': // MoveCursor:
2200
+ if (argslen == 2) {
2201
+ if (args[0] < 1) args[0] = 1;
2202
+ if (args[1] < 1) args[1] = 1;
2203
+ if (args[0] > obj.height) args[0] = obj.height;
2204
+ if (args[1] > obj.width) args[1] = obj.width;
2205
+ _termy = args[0] - 1;
2206
+ _termx = args[1] - 1;
2207
+ } else {
2208
+ _termy = 0;
2209
+ _termx = 0;
2210
+ }
2211
+ break;
2212
+ case 'm': // ScreenAttribs:
2213
+ // Change attributes
2214
+ for (i = 0; i < argslen; i++) {
2215
+ if (!args[i] || args[i] == 0) {
2216
+ // Reset Attributes
2217
+ _TermCurrentBColor = 0;
2218
+ _TermCurrentFColor = 7;
2219
+ _TermCurrentReverse = 0;
2220
+ }
2221
+ else if (args[i] == 1) {
2222
+ // Bright
2223
+ if (_TermCurrentFColor < 8) _TermCurrentFColor += 8;
2224
+ }
2225
+ else if (args[i] == 2 || args[i] == 22) {
2226
+ // Dim
2227
+ if (_TermCurrentFColor >= 8) _TermCurrentFColor -= 8;
2228
+ }
2229
+ else if (args[i] == 7) {
2230
+ // Set Reverse attribute true
2231
+ _TermCurrentReverse = 2;
2232
+ }
2233
+ else if (args[i] == 27) {
2234
+ // Set Reverse attribute false
2235
+ _TermCurrentReverse = 0;
2236
+ }
2237
+ else if (args[i] >= 30 && args[i] <= 37) {
2238
+ // Set Foreground Color
2239
+ var bright = (_TermCurrentFColor >= 8);
2240
+ _TermCurrentFColor = (args[i] - 30);
2241
+ if (bright && _TermCurrentFColor <= 8) _TermCurrentFColor += 8;
2242
+ }
2243
+ else if (args[i] >= 40 && args[i] <= 47) {
2244
+ // Set Background Color
2245
+ _TermCurrentBColor = (args[i] - 40);
2246
+ }
2247
+ else if (args[i] >= 90 && args[i] <= 99) {
2248
+ // Set Bright Foreground Color
2249
+ _TermCurrentFColor = (args[i] - 82);
2250
+ }
2251
+ else if (args[i] >= 100 && args[i] <= 109) {
2252
+ // Set Bright Background Color
2253
+ _TermCurrentBColor = (args[i] - 92);
2254
+ }
2255
+ }
2256
+ break;
2257
+ case 'K': // EraseLine:
2258
+ if (argslen == 0 || (argslen == 1 && (!args[0] || args[0] == 0))) {
2259
+ _EraseCursorToEol(); // Erase from the cursor to the end of the line
2260
+ } else if (argslen == 1) {
2261
+ if (args[0] == 1) { // Erase from the beginning of the line to the cursor
2262
+ _EraseBolToCursor();
2263
+ } else if (args[0] == 2) { // Erase the line with the cursor
2264
+ _EraseLine(_termy);
2265
+ }
2266
+ }
2267
+ break;
2268
+ case 'h': // EnableLineWrap:
2269
+ _TermLineWrap = true;
2270
+ break;
2271
+ case 'l': // DisableLineWrap:
2272
+ _TermLineWrap = false;
2273
+ break;
2274
+ case 'r': // Set the scroll region
2275
+ if (argslen == 2) { _scrollRegion = [args[0] - 1, args[1] - 1]; }
2276
+ if (_scrollRegion[0] < 0) { _scrollRegion[0] = 0; }
2277
+ if (_scrollRegion[0] > (obj.height - 1)) { _scrollRegion[0] = (obj.height - 1); }
2278
+ if (_scrollRegion[1] < 0) { _scrollRegion[1] = 0; }
2279
+ if (_scrollRegion[1] > (obj.height - 1)) { _scrollRegion[1] = (obj.height - 1); }
2280
+ if (_scrollRegion[0] > _scrollRegion[1]) { _scrollRegion[0] = _scrollRegion[1]; }
2281
+ break;
2282
+ case 'S': // Scroll up the scroll region X lines, default 1
2283
+ var x = 1;
2284
+ if (argslen == 1) { x = args[0] }
2285
+ for (var y = _scrollRegion[0]; y <= _scrollRegion[1] - x; y++) {
2286
+ for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = _tscreen[y + x][z]; _scratt[y][z] = _scratt[y + x][z]; }
2287
+ }
2288
+ for (var y = _scrollRegion[1] - x + 1; y < _scrollRegion[1]; y++) {
2289
+ for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = ' '; _scratt[y][z] = (7 << 6); }
2290
+ }
2291
+ break;
2292
+ case 'M': // Delete X lines, default 1
2293
+ var x = 1;
2294
+ if (argslen == 1) { x = args[0] }
2295
+ for (var y = _termy; y <= _scrollRegion[1] - x; y++) {
2296
+ for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = _tscreen[y + x][z]; _scratt[y][z] = _scratt[y + x][z]; }
2297
+ }
2298
+ for (var y = _scrollRegion[1] - x + 1; y < _scrollRegion[1]; y++) {
2299
+ for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = ' '; _scratt[y][z] = (7 << 6); }
2300
+ }
2301
+ break;
2302
+ case 'T': // Scroll down the scroll region X lines, default 1
2303
+ var x = 1;
2304
+ if (argslen == 1) { x = args[0] }
2305
+ for (var y = _scrollRegion[1]; y > _scrollRegion[0] + x; y--) {
2306
+ for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = _tscreen[y - x][z]; _scratt[y][z] = _scratt[y - x][z]; }
2307
+ }
2308
+ for (var y = _scrollRegion[0] + x; y > _scrollRegion[0]; y--) {
2309
+ for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = ' '; _scratt[y][z] = (7 << 6); }
2310
+ }
2311
+ break;
2312
+ case 'X': // Erase X characters, default 1 (untested)
2313
+ var x = 1;
2314
+ if (argslen == 1) { x = args[0] }
2315
+ while ((x > 0) && (_termx > 0)) { _tscreen[_termy][_termx] = ' '; _termx--; x--; }
2316
+ break;
2317
+ default:
2318
+ //if (code != '@') alert(code);
2319
+ console.log('unknown terminal code', code, args, mode);
2320
+ break;
2321
+ }
2322
+ }
2323
+ }
2324
+
2325
+ obj.ProcessVt100String = function (str) {
2326
+ for (var i = 0; i < str.length; i++) _ProcessVt100Char(String.fromCharCode(str.charCodeAt(i)));
2327
+ }
2328
+
2329
+
2330
+
2331
+
2332
+ function _ProcessVt100Char(c) {
2333
+ if (c == '\0' || c.charCodeAt() == 7) return; // Ignore null & bell
2334
+ var ch = c.charCodeAt();
2335
+ //console.log('_ProcessVt100Char', ch, c);
2336
+
2337
+
2338
+
2339
+
2340
+ //if (ch < 32 && ch != 10 && ch != 13) alert(ch);
2341
+ switch (ch) {
2342
+ case 16: { c = ' '; break; } // This is an odd char that show up on Intel BIOS's.
2343
+ case 24: { c = '↑'; break; }
2344
+ case 25: { c = '↓'; break; }
2345
+ }
2346
+
2347
+ if (_termx > obj.width) _termx = obj.width;
2348
+ if (_termy > (obj.height - 1)) _termy = (obj.height - 1);
2349
+
2350
+ switch (c) {
2351
+ case '\b': // Backspace
2352
+ if (_termx > 0) {
2353
+ _termx--;
2354
+ if (_backSpaceErase) { _TermDrawChar(' '); }
2355
+ }
2356
+ break;
2357
+ case '\t': // tab
2358
+ var tab = 8 - (_termx % 8)
2359
+ for (var x = 0; x < tab; x++) _ProcessVt100Char(" ");
2360
+ break;
2361
+ case '\n': // Linefeed
2362
+ _termy++;
2363
+ if (_termy > _scrollRegion[1]) {
2364
+ // Move everything up one line
2365
+ obj.recordLineTobackBuffer(0);
2366
+ _TermMoveUp(1);
2367
+ _termy = _scrollRegion[1];
2368
+ }
2369
+ if (obj.lineFeed = '\r') { _termx = 0; } // *** If we are in Linux mode, \n will also return the cursor to the first col
2370
+ break;
2371
+ case '\r': // Carriage Return
2372
+ _termx = 0;
2373
+ break;
2374
+ default:
2375
+ if (_termx >= obj.width) {
2376
+ _termx = 0;
2377
+ if (_TermLineWrap) { _termy++; }
2378
+ if (_termy >= (obj.height - 1)) { _TermMoveUp(1); _termy = (obj.height - 1); }
2379
+ }
2380
+ _TermDrawChar(c);
2381
+ _termx++;
2382
+ break;
2383
+ }
2384
+ }
2385
+
2386
+ function _TermDrawChar(c) {
2387
+ _tscreen[_termy][_termx] = c;
2388
+ _scratt[_termy][_termx] = (_TermCurrentFColor << 6) + (_TermCurrentBColor << 12) + _TermCurrentReverse;
2389
+ }
2390
+
2391
+ obj.TermClear = function(TermColor) {
2392
+ for (var y = 0; y < obj.height; y++) {
2393
+ for (var x = 0; x < obj.width; x++) {
2394
+ _tscreen[y][x] = ' ';
2395
+ _scratt[y][x] = TermColor;
2396
+ }
2397
+ }
2398
+ scrollBackBuffer = [];
2399
+ }
2400
+
2401
+ obj.TermResetScreen = function () {
2402
+ _TermCurrentReverse = 0;
2403
+ _TermCurrentFColor = 7;
2404
+ _TermCurrentBColor = 0;
2405
+ _TermLineWrap = _cursorVisible = true;
2406
+ _termx = _termy = 0;
2407
+ _backSpaceErase = false;
2408
+ _scrollRegion = [0, (obj.height - 1)];
2409
+ _altKeypadMode = false;
2410
+ obj.TermClear(7 << 6);
2411
+ }
2412
+
2413
+ function _EraseCursorToEol() {
2414
+ var t = (_TermCurrentFColor << 6) + (_TermCurrentBColor << 12) + _TermCurrentReverse;
2415
+ for (var x = _termx; x < obj.width; x++) {
2416
+ _tscreen[_termy][x] = ' ';
2417
+ _scratt[_termy][x] = t;
2418
+ }
2419
+ }
2420
+
2421
+ function _EraseBolToCursor() {
2422
+ var t = (_TermCurrentFColor << 6) + (_TermCurrentBColor << 12) + _TermCurrentReverse;
2423
+ for (var x = 0; x < _termx; x++) {
2424
+ _tscreen[_termy][x] = ' ';
2425
+ _scratt[_termy][x] = t;
2426
+ }
2427
+ }
2428
+
2429
+ function _EraseLine(line) {
2430
+ var t = (_TermCurrentFColor << 6) + (_TermCurrentBColor << 12) + _TermCurrentReverse;
2431
+ for (var x = 0; x < obj.width; x++) {
2432
+ _tscreen[line][x] = ' ';
2433
+ _scratt[line][x] = t;
2434
+ }
2435
+ }
2436
+
2437
+ obj.TermSendKeys = function (keys) { if (obj.debugmode == 2) { console.log("TSend(" + keys.length + "): " + rstr2hex(keys), keys); } obj.parent.send(keys); }
2438
+ obj.TermSendKey = function (key) { if (obj.debugmode == 2) { console.log("TSend(1): " + rstr2hex(String.fromCharCode(key)), key); } obj.parent.send(String.fromCharCode(key)); }
2439
+
2440
+ function _TermMoveUp(linecount) {
2441
+ var x, y;
2442
+ for (y = _scrollRegion[0]; y <= _scrollRegion[1] - linecount; y++) {
2443
+ _tscreen[y] = _tscreen[y + linecount];
2444
+ _scratt[y] = _scratt[y + linecount];
2445
+ }
2446
+ for (y = _scrollRegion[1] - linecount + 1; y <= _scrollRegion[1]; y++) {
2447
+ _tscreen[y] = [];
2448
+ _scratt[y] = [];
2449
+ for (x = 0; x < obj.width; x++) {
2450
+ _tscreen[y][x] = ' ';
2451
+ _scratt[y][x] = (7 << 6);
2452
+ }
2453
+ }
2454
+ }
2455
+
2456
+ obj.TermHandleKeys = function (e) {
2457
+ if (!e.ctrlKey) {
2458
+ if (e.which == 127) obj.TermSendKey(8);
2459
+ else if (e.which == 13) { obj.TermSendKeys(obj.lineFeed); }
2460
+ else if (e.which != 0) obj.TermSendKey(e.which);
2461
+ return false;
2462
+ }
2463
+ if (e.preventDefault) e.preventDefault();
2464
+ if (e.stopPropagation) e.stopPropagation();
2465
+ }
2466
+
2467
+ obj.TermHandleKeyUp = function (e) {
2468
+ if ((e.which != 8) && (e.which != 32) && (e.which != 9)) return true;
2469
+ if (e.preventDefault) e.preventDefault();
2470
+ if (e.stopPropagation) e.stopPropagation();
2471
+ return false;
2472
+ }
2473
+
2474
+ obj.TermHandleKeyDown = function (e) {
2475
+ if ((e.which >= 65) && (e.which <= 90) && (e.ctrlKey == true)) {
2476
+ obj.TermSendKey(e.which - 64);
2477
+ if (e.preventDefault) e.preventDefault();
2478
+ if (e.stopPropagation) e.stopPropagation();
2479
+ return;
2480
+ }
2481
+ if (e.which == 27) { obj.TermSendKeys(String.fromCharCode(27)); return true; }; // ESC
2482
+
2483
+ if (_altKeypadMode == true) {
2484
+ if (e.which == 37) { obj.TermSendKeys(String.fromCharCode(27, 79, 68)); return true; }; // Left
2485
+ if (e.which == 38) { obj.TermSendKeys(String.fromCharCode(27, 79, 65)); return true; }; // Up
2486
+ if (e.which == 39) { obj.TermSendKeys(String.fromCharCode(27, 79, 67)); return true; }; // Right
2487
+ if (e.which == 40) { obj.TermSendKeys(String.fromCharCode(27, 79, 66)); return true; }; // Down
2488
+ } else {
2489
+ if (e.which == 37) { obj.TermSendKeys(String.fromCharCode(27, 91, 68)); return true; }; // Left
2490
+ if (e.which == 38) { obj.TermSendKeys(String.fromCharCode(27, 91, 65)); return true; }; // Up
2491
+ if (e.which == 39) { obj.TermSendKeys(String.fromCharCode(27, 91, 67)); return true; }; // Right
2492
+ if (e.which == 40) { obj.TermSendKeys(String.fromCharCode(27, 91, 66)); return true; }; // Down
2493
+ }
2494
+
2495
+ if (e.which == 33) { obj.TermSendKeys(String.fromCharCode(27, 91, 53, 126)); return true; }; // PageUp
2496
+ if (e.which == 34) { obj.TermSendKeys(String.fromCharCode(27, 91, 54, 126)); return true; }; // PageDown
2497
+ if (e.which == 35) { obj.TermSendKeys(String.fromCharCode(27, 91, 70)); return true; }; // End
2498
+ if (e.which == 36) { obj.TermSendKeys(String.fromCharCode(27, 91, 72)); return true; }; // Home
2499
+ if (e.which == 45) { obj.TermSendKeys(String.fromCharCode(27, 91, 50, 126)); return true; }; // Insert
2500
+ if (e.which == 46) { obj.TermSendKeys(String.fromCharCode(27, 91, 51, 126)); return true; }; // Delete
2501
+
2502
+ if (e.which == 9) { obj.TermSendKeys("\t"); if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return true; }; // TAB
2503
+
2504
+ // F1 to F12 keys
2505
+
2506
+ if (e.which != 8 && e.which != 32 && e.which != 9) return true;
2507
+ obj.TermSendKey(e.which);
2508
+ if (e.preventDefault) e.preventDefault();
2509
+ if (e.stopPropagation) e.stopPropagation();
2510
+ return false;
2511
+ }
2512
+
2513
+ obj.recordLineTobackBuffer = function(y) {
2514
+ var closetag = '', buf = '';
2515
+ var r = obj.TermDrawLine(buf, y, closetag);
2516
+ buf = r[0];
2517
+ closetag = r[1];
2518
+ scrollBackBuffer.push(buf + closetag + '<br>');
2519
+ }
2520
+
2521
+ obj.TermDrawLine = function (buf, y, closetag) {
2522
+ var newat, c, oldat = 1, x1, x2;
2523
+ for (var x = 0; x < obj.width; ++x) {
2524
+ newat = _scratt[y][x];
2525
+ if (_termx == x && _termy == y && _cursorVisible) { newat |= _VTREVERSE; } // If this is the cursor location, reverse the color.
2526
+ if (newat != oldat) {
2527
+ buf += closetag;
2528
+ closetag = '';
2529
+ x1 = 6; x2 = 12;
2530
+ if (newat & _VTREVERSE) { x1 = 12; x2 = 6; }
2531
+ buf += '<span style="color:#' + _TermColors[(newat >> x1) & 0x3F] + ';background-color:#' + _TermColors[(newat >> x2) & 0x3F];
2532
+ if (newat & _VTUNDERLINE) buf += ';text-decoration:underline';
2533
+ buf += ';">';
2534
+ closetag = "</span>" + closetag;
2535
+ oldat = newat;
2536
+ }
2537
+
2538
+ c = _tscreen[y][x];
2539
+ switch (c) {
2540
+ case '&': buf += '&'; break;
2541
+ case '<': buf += '<'; break;
2542
+ case '>': buf += '>'; break;
2543
+ case ' ': buf += ' '; break;
2544
+ default: buf += c; break;
2545
+ }
2546
+ }
2547
+ return [buf, closetag];
2548
+ }
2549
+
2550
+ obj.TermDraw = function() {
2551
+ var closetag = '', buf = '';
2552
+ for (var y = 0; y < obj.height; ++y) {
2553
+ var r = obj.TermDrawLine(buf, y, closetag);
2554
+ buf = r[0];
2555
+ closetag = r[1];
2556
+ if (y != (obj.height - 1)) buf += '<br>';
2557
+ }
2558
+
2559
+ if (scrollBackBuffer.length > 800) { scrollBackBuffer = scrollBackBuffer.slice(scrollBackBuffer.length - 800); }
2560
+ var backbuffer = scrollBackBuffer.join('');
2561
+ obj.DivElement.innerHTML = "<font size='4'><b>" + backbuffer + buf + closetag + "</b></font>";
2562
+ obj.DivElement.scrollTop = obj.DivElement.scrollHeight;
2563
+ if (obj.heightLock == 0) { setTimeout(obj.TermLockHeight, 10); }
2564
+ }
2565
+
2566
+ obj.TermLockHeight = function () {
2567
+ obj.heightLock = obj.DivElement.clientHeight;
2568
+ obj.DivElement.style['height'] = obj.DivElement.parentNode.style['height'] = obj.heightLock + 'px';
2569
+ obj.DivElement.style['overflow-y'] = 'scroll';
2570
+ }
2571
+
2572
+ obj.TermInit = function () { obj.TermResetScreen(); }
2573
+
2574
+ obj.heightLock = 0;
2575
+ obj.DivElement.style['height'] = '';
2576
+ if ((options != null) && (options.width != null) && (options.height != null)) { obj.Init(options.width, options.height); } else { obj.Init(); }
2577
+ return obj;
2578
+}/* zlib.js -- JavaScript implementation for the zlib.
2579
+ Version: 0.2.0
2580
+ LastModified: Apr 12 2012
2581
+ Copyright (C) 2012 Masanao Izumo <iz@onicos.co.jp>
2582
+
2583
+ The original copyright notice (zlib 1.2.6):
2584
+
2585
+ Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler
2586
+
2587
+ This software is provided 'as-is', without any express or implied
2588
+ warranty. In no event will the authors be held liable for any damages
2589
+ arising from the use of this software.
2590
+
2591
+ Permission is granted to anyone to use this software for any purpose,
2592
+ including commercial applications, and to alter it and redistribute it
2593
+ freely, subject to the following restrictions:
2594
+
2595
+ 1. The origin of this software must not be misrepresented; you must not
2596
+ claim that you wrote the original software. If you use this software
2597
+ in a product, an acknowledgment in the product documentation would be
2598
+ appreciated but is not required.
2599
+ 2. Altered source versions must be plainly marked as such, and must not be
2600
+ misrepresented as being the original software.
2601
+ 3. This notice may not be removed or altered from any source distribution.
2602
+
2603
+ Jean-loup Gailly Mark Adler
2604
+ jloup@gzip.org madler@alumni.caltech.edu
2605
+
2606
+
2607
+ The data format used by the zlib library is described by RFCs (Request for
2608
+ Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
2609
+ (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
2610
+*/
2611
+
2612
+var ZLIB = ( ZLIB || {} ); // ZLIB namespace initialization
2613
+
2614
+// common definitions
2615
+if(typeof ZLIB.common_initialized === 'undefined') {
2616
+ ZLIB.Z_NO_FLUSH = 0;
2617
+ ZLIB.Z_PARTIAL_FLUSH = 1;
2618
+ ZLIB.Z_SYNC_FLUSH = 2;
2619
+ ZLIB.Z_FULL_FLUSH = 3;
2620
+ ZLIB.Z_FINISH = 4;
2621
+ ZLIB.Z_BLOCK = 5;
2622
+ ZLIB.Z_TREES = 6;
2623
+ /* Allowed flush values; see deflate() and inflate() below for details */
2624
+
2625
+ ZLIB.Z_OK = 0;
2626
+ ZLIB.Z_STREAM_END = 1;
2627
+ ZLIB.Z_NEED_DICT = 2;
2628
+ ZLIB.Z_ERRNO = (-1);
2629
+ ZLIB.Z_STREAM_ERROR = (-2);
2630
+ ZLIB.Z_DATA_ERROR = (-3);
2631
+ ZLIB.Z_MEM_ERROR = (-4);
2632
+ ZLIB.Z_BUF_ERROR = (-5);
2633
+ ZLIB.Z_VERSION_ERROR = (-6);
2634
+ /* Return codes for the compression/decompression functions. Negative values
2635
+ * are errors, positive values are used for special but normal events.
2636
+ */
2637
+
2638
+ ZLIB.Z_DEFLATED = 8; /* The deflate compression method (the only one supported in this version) */
2639
+
2640
+ /**
2641
+ * z_stream constructor
2642
+ * @constructor
2643
+ */
2644
+ ZLIB.z_stream = function() {
2645
+ this.next_in = 0; /* next input byte */
2646
+ this.avail_in = 0; /* number of bytes available in input_data */
2647
+ this.total_in = 0; /* total number of input bytes read so far */
2648
+
2649
+ this.next_out = 0; /* next output byte */
2650
+ this.avail_out = 0; /* remaining free space at next_out */
2651
+ this.total_out = 0; /* total number of bytes output so far */
2652
+
2653
+ this.msg = null; /* last error message, null if no error */
2654
+ this.state = null; /* not visible by applications */
2655
+
2656
+ this.data_type = 0; /* best guess about the data type: binary or text */
2657
+ this.adler = 0; /* TODO: adler32 value of the uncompressed data */
2658
+
2659
+ // zlib.js
2660
+ this.input_data = ''; /* input data */
2661
+ this.output_data = ''; /* output data */
2662
+ this.error = 0; /* error code */
2663
+ this.checksum_function = null; /* crc32(for gzip) or adler32(for zlib) */
2664
+ };
2665
+
2666
+ /**
2667
+ * TODO
2668
+ * @constructor
2669
+ */
2670
+ ZLIB.gz_header = function() {
2671
+ this.text = 0; /* true if compressed data believed to be text */
2672
+ this.time = 0; /* modification time */
2673
+ this.xflags = 0; /* extra flags (not used when writing a gzip file) */
2674
+ this.os = 0xff; /* operating system */
2675
+ this.extra = null; /* extra field string or null if none */
2676
+ this.extra_len = 0; /* this.extra.length (only when reading header) */
2677
+ this.extra_max = 0; /* space at extra (only when reading header) */
2678
+ this.name = null; /* file name string or null if none */
2679
+ this.name_max = 0; /* space at name (only when reading header) */
2680
+ this.comment = null; /* comment string or null if none */
2681
+ this.comm_max = 0; /* space at comment (only when reading header) */
2682
+ this.hcrc = 0; /* true if there was or will be a header crc */
2683
+ this.done = 0; /* true when done reading gzip header (not used
2684
+ when writing a gzip file) */
2685
+ };
2686
+
2687
+ ZLIB.common_initialized = true;
2688
+} // common definitions
2689
+/* zlib-inflate.js -- JavaScript implementation for the zlib inflate.
2690
+ Version: 0.2.0
2691
+ LastModified: Apr 12 2012
2692
+ Copyright (C) 2012 Masanao Izumo <iz@onicos.co.jp>
2693
+
2694
+ This library is one of the JavaScript zlib implementation.
2695
+ Some API's are modified from the original.
2696
+ Only inflate API is implemented.
2697
+
2698
+ The original copyright notice (zlib 1.2.6):
2699
+
2700
+ Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler
2701
+
2702
+ This software is provided 'as-is', without any express or implied
2703
+ warranty. In no event will the authors be held liable for any damages
2704
+ arising from the use of this software.
2705
+
2706
+ Permission is granted to anyone to use this software for any purpose,
2707
+ including commercial applications, and to alter it and redistribute it
2708
+ freely, subject to the following restrictions:
2709
+
2710
+ 1. The origin of this software must not be misrepresented; you must not
2711
+ claim that you wrote the original software. If you use this software
2712
+ in a product, an acknowledgment in the product documentation would be
2713
+ appreciated but is not required.
2714
+ 2. Altered source versions must be plainly marked as such, and must not be
2715
+ misrepresented as being the original software.
2716
+ 3. This notice may not be removed or altered from any source distribution.
2717
+
2718
+ Jean-loup Gailly Mark Adler
2719
+ jloup@gzip.org madler@alumni.caltech.edu
2720
+
2721
+
2722
+ The data format used by the zlib library is described by RFCs (Request for
2723
+ Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
2724
+ (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
2725
+*/
2726
+
2727
+/*
2728
+ API documentation
2729
+==============================================================================
2730
+Usage: z_stream = ZLIB.inflateInit([windowBits]);
2731
+
2732
+ Create the stream object for decompression.
2733
+ See zlib.h for windowBits information.
2734
+
2735
+==============================================================================
2736
+Usage: decoded_string = z_stream.inflate(encoded_string [, {OPTIONS...}]);
2737
+
2738
+OPTIONS:
2739
+ next_in: decode start offset for encoded_string.
2740
+
2741
+ avail_in: // TODO document. See zlib.h for the information.
2742
+
2743
+ avail_out: // TODO document. See zlib.h for the information.
2744
+
2745
+ flush: // TODO document. See zlib.h for the information.
2746
+
2747
+Ex: decoded_string = z_stream.inflate(encoded_string);
2748
+ decoded_string = z_stream.inflate(encoded_string,
2749
+ {next_in: 0,
2750
+ avail_in: encoded_string.length,
2751
+ avail_out: 1024,
2752
+ flush: ZLIB.Z_NO_FLUSH});
2753
+
2754
+ See zlib.h for more information.
2755
+
2756
+==============================================================================
2757
+Usage: z_stream.inflateReset();
2758
+ TODO document
2759
+
2760
+*/
2761
+
2762
+if( typeof ZLIB === 'undefined' ) {
2763
+ alert('ZLIB is not defined. SRC zlib.js before zlib-inflate.js')
2764
+}
2765
+
2766
+(function() {
2767
+
2768
+/* inflate.c -- zlib decompression
2769
+ * Copyright (C) 1995-2011 Mark Adler
2770
+ * For conditions of distribution and use, see copyright notice in zlib.h
2771
+ */
2772
+
2773
+var DEF_WBITS = 15;
2774
+
2775
+// inflate_mode
2776
+var HEAD = 0; /* i: waiting for magic header */
2777
+var FLAGS = 1; /* i: waiting for method and flags (gzip) */
2778
+var TIME = 2; /* i: waiting for modification time (gzip) */
2779
+var OS = 3; /* i: waiting for extra flags and operating system (gzip) */
2780
+var EXLEN = 4; /* i: waiting for extra length (gzip) */
2781
+var EXTRA = 5; /* i: waiting for extra bytes (gzip) */
2782
+var NAME = 6; /* i: waiting for end of file name (gzip) */
2783
+var COMMENT = 7; /* i: waiting for end of comment (gzip) */
2784
+var HCRC = 8; /* i: waiting for header crc (gzip) */
2785
+var DICTID = 9; /* i: waiting for dictionary check value */
2786
+var DICT = 10; /* waiting for inflateSetDictionary() call */
2787
+var TYPE = 11; /* i: waiting for type bits, including last-flag bit */
2788
+var TYPEDO = 12; /* i: same, but skip check to exit inflate on new block */
2789
+var STORED = 13; /* i: waiting for stored size (length and complement) */
2790
+var COPY_ = 14; /* i/o: same as COPY below, but only first time in */
2791
+var COPY = 15; /* i/o: waiting for input or output to copy stored block */
2792
+var TABLE = 16; /* i: waiting for dynamic block table lengths */
2793
+var LENLENS = 17; /* i: waiting for code length code lengths */
2794
+var CODELENS = 18; /* i: waiting for length/lit and distance code lengths */
2795
+var LEN_ = 19; /* i: same as LEN below, but only first time in */
2796
+var LEN = 20; /* i: waiting for length/lit/eob code */
2797
+var LENEXT = 21; /* i: waiting for length extra bits */
2798
+var DIST = 22; /* i: waiting for distance code */
2799
+var DISTEXT = 23; /* i: waiting for distance extra bits */
2800
+var MATCH = 24; /* o: waiting for output space to copy string */
2801
+var LIT = 25; /* o: waiting for output space to write literal */
2802
+var CHECK = 26; /* i: waiting for 32-bit check value */
2803
+var LENGTH = 27; /* i: waiting for 32-bit length (gzip) */
2804
+var DONE = 28; /* finished check, done -- remain here until reset */
2805
+var BAD = 29; /* got a data error -- remain here until reset */
2806
+var MEM = 30; /* got an inflate() memory error -- remain here until reset */
2807
+var SYNC = 31; /* looking for synchronization bytes to restart inflate() */
2808
+
2809
+/* Maximum size of the dynamic table. The maximum number of code structures is
2810
+ 1444, which is the sum of 852 for literal/length codes and 592 for distance
2811
+ codes. These values were found by exhaustive searches using the program
2812
+ examples/enough.c found in the zlib distribtution. The arguments to that
2813
+ program are the number of symbols, the initial root table size, and the
2814
+ maximum bit length of a code. "enough 286 9 15" for literal/length codes
2815
+ returns returns 852, and "enough 30 6 15" for distance codes returns 592.
2816
+ The initial root table size (9 or 6) is found in the fifth argument of the
2817
+ inflate_table() calls in inflate.c and infback.c. If the root table size is
2818
+ changed, then these maximum sizes would be need to be recalculated and
2819
+ updated. */
2820
+var ENOUGH_LENS = 852;
2821
+var ENOUGH_DISTS = 592;
2822
+var ENOUGH = (ENOUGH_LENS + ENOUGH_DISTS);
2823
+
2824
+/* Type of code to build for inflate_table() */
2825
+var CODES = 0;
2826
+var LENS = 1;
2827
+var DISTS = 2;
2828
+
2829
+
2830
+
2831
+var inflate_table_lbase = [ /* Length codes 257..285 base */
2832
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
2833
+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0];
2834
+var inflate_table_lext = [ /* Length codes 257..285 extra */
2835
+ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
2836
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 69];
2837
+var inflate_table_dbase = [ /* Distance codes 0..29 base */
2838
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
2839
+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
2840
+ 8193, 12289, 16385, 24577, 0, 0];
2841
+var inflate_table_dext = [ /* Distance codes 0..29 extra */
2842
+ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
2843
+ 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
2844
+ 28, 28, 29, 29, 64, 64];
2845
+
2846
+/* inftrees.c -- generate Huffman trees for efficient decoding
2847
+ * Copyright (C) 1995-2012 Mark Adler
2848
+ * For conditions of distribution and use, see copyright notice in zlib.h
2849
+ */
2850
+
2851
+ZLIB.inflate_copyright =
2852
+ ' inflate 1.2.6 Copyright 1995-2012 Mark Adler ';
2853
+/*
2854
+ If you use the zlib library in a product, an acknowledgment is welcome
2855
+ in the documentation of your product. If for some reason you cannot
2856
+ include such an acknowledgment, I would appreciate that you keep this
2857
+ copyright string in the executable of your product.
2858
+ */
2859
+
2860
+/*
2861
+ Build a set of tables to decode the provided canonical Huffman code.
2862
+ The code lengths are lens[0..codes-1]. The result starts at *table,
2863
+ whose indices are 0..2^bits-1. work is a writable array of at least
2864
+ lens shorts, which is used as a work area. type is the type of code
2865
+ to be generated, CODES, LENS, or DISTS. On return, zero is success,
2866
+ -1 is an invalid code, and +1 means that ENOUGH isn't enough. table
2867
+ on return points to the next available entry's address. bits is the
2868
+ requested root table index bits, and on return it is the actual root
2869
+ table index bits. It will differ if the request is greater than the
2870
+ longest code or if it is less than the shortest code.
2871
+*/
2872
+function inflate_table(state, type)
2873
+{
2874
+ var MAXBITS = 15;
2875
+ var table = state.next;
2876
+ var bits = (type == DISTS ? state.distbits : state.lenbits);
2877
+ var work = state.work;
2878
+ var lens = state.lens;
2879
+ var lens_offset = (type == DISTS ? state.nlen : 0);
2880
+ var state_codes = state.codes;
2881
+ var codes;
2882
+ if(type == LENS)
2883
+ codes = state.nlen;
2884
+ else if(type == DISTS)
2885
+ codes = state.ndist;
2886
+ else // CODES
2887
+ codes = 19;
2888
+
2889
+ var len; /* a code's length in bits */
2890
+ var sym; /* index of code symbols */
2891
+ var min, max; /* minimum and maximum code lengths */
2892
+ var root; /* number of index bits for root table */
2893
+ var curr; /* number of index bits for current table */
2894
+ var drop; /* code bits to drop for sub-table */
2895
+ var left; /* number of prefix codes available */
2896
+ var used; /* code entries in table used */
2897
+ var huff; /* Huffman code */
2898
+ var incr; /* for incrementing code, index */
2899
+ var fill; /* index for replicating entries */
2900
+ var low; /* low bits for current root entry */
2901
+ var mask; /* mask for low root bits */
2902
+ var here; /* table entry for duplication */
2903
+ var next; /* next available space in table */
2904
+ var base; /* base value table to use */
2905
+ var base_offset;
2906
+ var extra; /* extra bits table to use */
2907
+ var extra_offset;
2908
+ var end; /* use base and extra for symbol > end */
2909
+ var count = new Array(MAXBITS+1); /* number of codes of each length */
2910
+ var offs = new Array(MAXBITS+1); /* offsets in table for each length */
2911
+
2912
+ /*
2913
+ Process a set of code lengths to create a canonical Huffman code. The
2914
+ code lengths are lens[0..codes-1]. Each length corresponds to the
2915
+ symbols 0..codes-1. The Huffman code is generated by first sorting the
2916
+ symbols by length from short to long, and retaining the symbol order
2917
+ for codes with equal lengths. Then the code starts with all zero bits
2918
+ for the first code of the shortest length, and the codes are integer
2919
+ increments for the same length, and zeros are appended as the length
2920
+ increases. For the deflate format, these bits are stored backwards
2921
+ from their more natural integer increment ordering, and so when the
2922
+ decoding tables are built in the large loop below, the integer codes
2923
+ are incremented backwards.
2924
+
2925
+ This routine assumes, but does not check, that all of the entries in
2926
+ lens[] are in the range 0..MAXBITS. The caller must assure this.
2927
+ 1..MAXBITS is interpreted as that code length. zero means that that
2928
+ symbol does not occur in this code.
2929
+
2930
+ The codes are sorted by computing a count of codes for each length,
2931
+ creating from that a table of starting indices for each length in the
2932
+ sorted table, and then entering the symbols in order in the sorted
2933
+ table. The sorted table is work[], with that space being provided by
2934
+ the caller.
2935
+
2936
+ The length counts are used for other purposes as well, i.e. finding
2937
+ the minimum and maximum length codes, determining if there are any
2938
+ codes at all, checking for a valid set of lengths, and looking ahead
2939
+ at length counts to determine sub-table sizes when building the
2940
+ decoding tables.
2941
+ */
2942
+
2943
+ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
2944
+ for (len = 0; len <= MAXBITS; len++)
2945
+ count[len] = 0;
2946
+ for (sym = 0; sym < codes; sym++)
2947
+ count[lens[lens_offset + sym]]++;
2948
+
2949
+ /* bound code lengths, force root to be within code lengths */
2950
+ root = bits;
2951
+
2952
+ for (max = MAXBITS; max >= 1; max--)
2953
+ if (count[max] != 0) break;
2954
+ if (root > max) root = max;
2955
+ if (max == 0) {
2956
+ /* no symbols to code at all */
2957
+ /* invalid code marker */
2958
+ here = {op:64, bits:1, val:0};
2959
+ state_codes[table++] = here; /* make a table to force an error */
2960
+ state_codes[table++] = here;
2961
+ if(type == DISTS) state.distbits = 1; else state.lenbits = 1; // *bits = 1;
2962
+ state.next = table;
2963
+ return 0; /* no symbols, but wait for decoding to report error */
2964
+ }
2965
+ for (min = 1; min < max; min++)
2966
+ if (count[min] != 0) break;
2967
+ if (root < min) root = min;
2968
+
2969
+ /* check for an over-subscribed or incomplete set of lengths */
2970
+ left = 1;
2971
+ for (len = 1; len <= MAXBITS; len++) {
2972
+ left <<= 1;
2973
+ left -= count[len];
2974
+ if (left < 0) return -1; /* over-subscribed */
2975
+ }
2976
+ if (left > 0 && (type == CODES || max != 1)) {
2977
+ state.next = table;
2978
+ return -1; /* incomplete set */
2979
+ }
2980
+
2981
+ /* generate offsets into symbol table for each length for sorting */
2982
+ offs[1] = 0;
2983
+ for (len = 1; len < MAXBITS; len++)
2984
+ offs[len + 1] = offs[len] + count[len];
2985
+
2986
+ /* sort symbols by length, by symbol order within each length */
2987
+ for (sym = 0; sym < codes; sym++)
2988
+ if (lens[lens_offset + sym] != 0) work[offs[lens[lens_offset + sym]]++] = sym;
2989
+
2990
+ /*
2991
+ Create and fill in decoding tables. In this loop, the table being
2992
+ filled is at next and has curr index bits. The code being used is huff
2993
+ with length len. That code is converted to an index by dropping drop
2994
+ bits off of the bottom. For codes where len is less than drop + curr,
2995
+ those top drop + curr - len bits are incremented through all values to
2996
+ fill the table with replicated entries.
2997
+
2998
+ root is the number of index bits for the root table. When len exceeds
2999
+ root, sub-tables are created pointed to by the root entry with an index
3000
+ of the low root bits of huff. This is saved in low to check for when a
3001
+ new sub-table should be started. drop is zero when the root table is
3002
+ being filled, and drop is root when sub-tables are being filled.
3003
+
3004
+ When a new sub-table is needed, it is necessary to look ahead in the
3005
+ code lengths to determine what size sub-table is needed. The length
3006
+ counts are used for this, and so count[] is decremented as codes are
3007
+ entered in the tables.
3008
+
3009
+ used keeps track of how many table entries have been allocated from the
3010
+ provided *table space. It is checked for LENS and DIST tables against
3011
+ the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
3012
+ the initial root table size constants. See the comments in inftrees.h
3013
+ for more information.
3014
+
3015
+ sym increments through all symbols, and the loop terminates when
3016
+ all codes of length max, i.e. all codes, have been processed. This
3017
+ routine permits incomplete codes, so another loop after this one fills
3018
+ in the rest of the decoding tables with invalid code markers.
3019
+ */
3020
+
3021
+ /* set up for code type */
3022
+ switch (type) {
3023
+ case CODES:
3024
+ base = extra = work; /* dummy value--not used */
3025
+ base_offset = 0;
3026
+ extra_offset = 0;
3027
+ end = 19;
3028
+ break;
3029
+ case LENS:
3030
+ base = inflate_table_lbase;
3031
+ base_offset = -257; // base -= 257;
3032
+ extra = inflate_table_lext;
3033
+ extra_offset = -257; // extra -= 257;
3034
+ end = 256;
3035
+ break;
3036
+ default: /* DISTS */
3037
+ base = inflate_table_dbase;
3038
+ extra = inflate_table_dext;
3039
+ base_offset = 0;
3040
+ extra_offset = 0;
3041
+ end = -1;
3042
+ }
3043
+
3044
+ /* initialize state for loop */
3045
+ huff = 0; /* starting code */
3046
+ sym = 0; /* starting code symbol */
3047
+ len = min; /* starting code length */
3048
+ next = table; /* current table to fill in */
3049
+ curr = root; /* current table index bits */
3050
+ drop = 0; /* current bits to drop from code for index */
3051
+ low = -1; /* trigger new sub-table when len > root */
3052
+ used = 1 << root; /* use root table entries */
3053
+ mask = used - 1; /* mask for comparing low */
3054
+
3055
+ /* check available table space */
3056
+ if ((type == LENS && used >= ENOUGH_LENS) ||
3057
+ (type == DISTS && used >= ENOUGH_DISTS)) {
3058
+ state.next = table;
3059
+ return 1;
3060
+ }
3061
+
3062
+ /* process all codes and make table entries */
3063
+ for (;;) {
3064
+ /* create table entry */
3065
+ here = {op:0, bits:len - drop, val:0};
3066
+ if (work[sym] < end) {
3067
+ here.val = work[sym];
3068
+ }
3069
+ else if (work[sym] > end) {
3070
+ here.op = extra[extra_offset + work[sym]];
3071
+ here.val = base[base_offset + work[sym]];
3072
+ }
3073
+ else {
3074
+ here.op = 32 + 64; /* end of block */
3075
+ }
3076
+
3077
+ /* replicate for those indices with low len bits equal to huff */
3078
+ incr = 1 << (len - drop);
3079
+ fill = 1 << curr;
3080
+ min = fill; /* save offset to next table */
3081
+ do {
3082
+ fill -= incr;
3083
+ state_codes[next + (huff >>> drop) + fill] = here;
3084
+ } while (fill != 0);
3085
+
3086
+ /* backwards increment the len-bit code huff */
3087
+ incr = 1 << (len - 1);
3088
+ while (huff & incr)
3089
+ incr >>>= 1;
3090
+ if (incr != 0) {
3091
+ huff &= incr - 1;
3092
+ huff += incr;
3093
+ }
3094
+ else
3095
+ huff = 0;
3096
+
3097
+ /* go to next symbol, update count, len */
3098
+ sym++;
3099
+ if (--(count[len]) == 0) {
3100
+ if (len == max) break;
3101
+ len = lens[lens_offset + work[sym]];
3102
+ }
3103
+
3104
+ /* create new sub-table if needed */
3105
+ if (len > root && (huff & mask) != low) {
3106
+ /* if first time, transition to sub-tables */
3107
+ if (drop == 0)
3108
+ drop = root;
3109
+
3110
+ /* increment past last table */
3111
+ next += min; /* here min is 1 << curr */
3112
+
3113
+ /* determine length of next table */
3114
+ curr = len - drop;
3115
+ left = (1 << curr);
3116
+ while (curr + drop < max) {
3117
+ left -= count[curr + drop];
3118
+ if (left <= 0) break;
3119
+ curr++;
3120
+ left <<= 1;
3121
+ }
3122
+
3123
+ /* check for enough space */
3124
+ used += 1 << curr;
3125
+ if ((type == LENS && used >= ENOUGH_LENS) ||
3126
+ (type == DISTS && used >= ENOUGH_DISTS)) {
3127
+ state.next = table;
3128
+ return 1;
3129
+ }
3130
+
3131
+ /* point entry in root table to sub-table */
3132
+ low = huff & mask;
3133
+ state_codes[table + low] = {op:curr, bits:root, val:next - table};
3134
+ }
3135
+ }
3136
+
3137
+ /* fill in remaining table entry if code is incomplete (guaranteed to have
3138
+ at most one remaining entry, since if the code is incomplete, the
3139
+ maximum code length that was allowed to get this far is one bit) */
3140
+ if (huff != 0) {
3141
+ state_codes[next + huff] = {op:64, bits:len - drop, val:0};
3142
+ }
3143
+
3144
+ /* set return parameters */
3145
+ state.next = table + used;
3146
+ if(type == DISTS) state.distbits = root; else state.lenbits = root; //*bits = root;
3147
+ return 0;
3148
+}
3149
+
3150
+/* inffast.c -- fast decoding
3151
+ * Copyright (C) 1995-2008, 2010 Mark Adler
3152
+ * For conditions of distribution and use, see copyright notice in zlib.h
3153
+ */
3154
+
3155
+/*
3156
+ Decode literal, length, and distance codes and write out the resulting
3157
+ literal and match bytes until either not enough input or output is
3158
+ available, an end-of-block is encountered, or a data error is encountered.
3159
+ When large enough input and output buffers are supplied to inflate(), for
3160
+ example, a 16K input buffer and a 64K output buffer, more than 95% of the
3161
+ inflate execution time is spent in this routine.
3162
+
3163
+ Entry assumptions:
3164
+
3165
+ state->mode == LEN
3166
+ strm->avail_in >= 6
3167
+ strm->avail_out >= 258
3168
+ start >= strm->avail_out
3169
+ state->bits < 8
3170
+
3171
+ On return, state->mode is one of:
3172
+
3173
+ LEN -- ran out of enough output space or enough available input
3174
+ TYPE -- reached end of block code, inflate() to interpret next block
3175
+ BAD -- error in block data
3176
+
3177
+ Notes:
3178
+
3179
+ - The maximum input bits used by a length/distance pair is 15 bits for the
3180
+ length code, 5 bits for the length extra, 15 bits for the distance code,
3181
+ and 13 bits for the distance extra. This totals 48 bits, or six bytes.
3182
+ Therefore if strm->avail_in >= 6, then there is enough input to avoid
3183
+ checking for available input while decoding.
3184
+
3185
+ - The maximum bytes that a single length/distance pair can output is 258
3186
+ bytes, which is the maximum length that can be coded. inflate_fast()
3187
+ requires strm->avail_out >= 258 for each loop to avoid checking for
3188
+ output space.
3189
+ */
3190
+function inflate_fast(strm,
3191
+ start) /* inflate()'s starting value for strm->avail_out */
3192
+{
3193
+ var state;
3194
+ var input_data; /* local strm->input_data */
3195
+ var next_in; /* zlib.js: index of input_data */
3196
+ var last; /* while next_in < last, enough input available */
3197
+ var out; /* local strm.next_out */
3198
+ var beg; /* inflate()'s initial strm.next_out */
3199
+ var end; /* while out < end, enough space available */
3200
+//NOSPRT #ifdef INFLATE_STRICT
3201
+// unsigned dmax; /* maximum distance from zlib header */
3202
+//#endif
3203
+ var wsize; /* window size or zero if not using window */
3204
+ var whave; /* valid bytes in the window */
3205
+ var wnext; /* window write index */
3206
+ var window; /* allocated sliding window, if wsize != 0 */
3207
+ var hold; /* local strm->hold */
3208
+ var bits; /* local strm->bits */
3209
+ var codes; /* zlib.js: local state.codes */
3210
+ var lcode; /* local strm->lencode */
3211
+ var dcode; /* local strm->distcode */
3212
+ var lmask; /* mask for first level of length codes */
3213
+ var dmask; /* mask for first level of distance codes */
3214
+ var here; /* retrieved table entry */
3215
+ var op; /* code bits, operation, extra bits, or */
3216
+ /* window position, window bytes to copy */
3217
+ var len; /* match length, unused bytes */
3218
+ var dist; /* match distance */
3219
+ // var from; /* where to copy match from */
3220
+ var from_window_offset = -1; /* index of window[] */
3221
+ var from_out_offset = -1; /* index of next_out[] */
3222
+
3223
+ /* copy state to local variables */
3224
+ state = strm.state;
3225
+ input_data = strm.input_data;
3226
+ next_in = strm.next_in;
3227
+ last = next_in + strm.avail_in - 5;
3228
+ out = strm.next_out;
3229
+ beg = out - (start - strm.avail_out);
3230
+ end = out + (strm.avail_out - 257);
3231
+//NOSPRT #ifdef INFLATE_STRICT
3232
+// dmax = state->dmax;
3233
+//#endif
3234
+ wsize = state.wsize;
3235
+ whave = state.whave;
3236
+ wnext = state.wnext;
3237
+ window = state.window;
3238
+ hold = state.hold;
3239
+ bits = state.bits;
3240
+ codes = state.codes;
3241
+ lcode = state.lencode;
3242
+ dcode = state.distcode;
3243
+ lmask = (1 << state.lenbits) - 1;
3244
+ dmask = (1 << state.distbits) - 1;
3245
+
3246
+ /* decode literals and length/distances until end-of-block or not enough
3247
+ input data or output space */
3248
+loop: do {
3249
+ if (bits < 15) {
3250
+ hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3251
+ bits += 8;
3252
+ hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3253
+ bits += 8;
3254
+ }
3255
+ here = codes[lcode + (hold & lmask)];
3256
+ dolen: while(true) {
3257
+ op = here.bits;
3258
+ hold >>>= op;
3259
+ bits -= op;
3260
+ op = here.op;
3261
+ if (op == 0) { /* literal */
3262
+// Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
3263
+// "inflate: literal '%c'\n" :
3264
+// "inflate: literal 0x%02x\n", here.val));
3265
+ strm.output_data += String.fromCharCode(here.val);
3266
+ out++;
3267
+ }
3268
+ else if (op & 16) { /* length base */
3269
+ len = here.val;
3270
+ op &= 15; /* number of extra bits */
3271
+ if (op) {
3272
+ if (bits < op) {
3273
+ hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3274
+ bits += 8;
3275
+ }
3276
+ len += hold & ((1 << op) - 1);
3277
+ hold >>>= op;
3278
+ bits -= op;
3279
+ }
3280
+// Tracevv((stderr, "inflate: length %u\n", len));
3281
+ if (bits < 15) {
3282
+ hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3283
+ bits += 8;
3284
+ hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3285
+ bits += 8;
3286
+ }
3287
+ here = codes[dcode + (hold & dmask)];
3288
+ dodist: while(true) {
3289
+ op = here.bits;
3290
+ hold >>>= op;
3291
+ bits -= op;
3292
+ op = here.op;
3293
+ if (op & 16) { /* distance base */
3294
+ dist = here.val;
3295
+ op &= 15; /* number of extra bits */
3296
+ if (bits < op) {
3297
+ hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3298
+ bits += 8;
3299
+ if (bits < op) {
3300
+ hold += (input_data.charCodeAt(next_in++) & 0xff) << bits;
3301
+ bits += 8;
3302
+ }
3303
+ }
3304
+ dist += hold & ((1 << op) - 1);
3305
+//NOSPRT #ifdef INFLATE_STRICT
3306
+// if (dist > dmax) {
3307
+// strm->msg = (char *)"invalid distance too far back";
3308
+// state->mode = BAD;
3309
+// break loop;
3310
+// }
3311
+//#endif
3312
+ hold >>>= op;
3313
+ bits -= op;
3314
+// Tracevv((stderr, "inflate: distance %u\n", dist));
3315
+ op = out - beg; /* max distance in output */
3316
+ if (dist > op) { /* see if copy from window */
3317
+ op = dist - op; /* distance back in window */
3318
+ if (op > whave) {
3319
+ if (state.sane) {
3320
+ strm.msg = 'invalid distance too far back';
3321
+ state.mode = BAD;
3322
+ break loop;
3323
+ }
3324
+//NOSPRT #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
3325
+// if (len <= op - whave) {
3326
+// do {
3327
+// PUP(out) = 0;
3328
+// } while (--len);
3329
+// continue;
3330
+// }
3331
+// len -= op - whave;
3332
+// do {
3333
+// PUP(out) = 0;
3334
+// } while (--op > whave);
3335
+// if (op == 0) {
3336
+// from = out - dist;
3337
+// do {
3338
+// PUP(out) = PUP(from);
3339
+// } while (--len);
3340
+// continue;
3341
+// }
3342
+//#endif
3343
+ } // if (op > whave)
3344
+
3345
+ from_window_offset = 0;
3346
+ from_out_offset = -1;
3347
+ if (wnext == 0) { /* very common case */
3348
+ from_window_offset += wsize - op;
3349
+ if (op < len) { /* some from window */
3350
+ len -= op;
3351
+ strm.output_data += window.substring(from_window_offset, from_window_offset + op);
3352
+ out += op;
3353
+ op = 0;
3354
+ from_window_offset = -1;
3355
+ from_out_offset = out - dist; /* rest from output */
3356
+ }
3357
+ }
3358
+//NOTREACHED else if (wnext < op) { /* wrap around window */
3359
+//NOTREACHED from += wsize + wnext - op;
3360
+//NOTREACHED op -= wnext;
3361
+//NOTREACHED if (op < len) { /* some from end of window */
3362
+//NOTREACHED len -= op;
3363
+//NOTREACHED do {
3364
+//NOTREACHED PUP(out) = PUP(from);
3365
+//NOTREACHED } while (--op);
3366
+//NOTREACHED from = window - OFF;
3367
+//NOTREACHED if (wnext < len) { /* some from start of window */
3368
+//NOTREACHED op = wnext;
3369
+//NOTREACHED len -= op;
3370
+//NOTREACHED do {
3371
+//NOTREACHED PUP(out) = PUP(from);
3372
+//NOTREACHED } while (--op);
3373
+//NOTREACHED from = out - dist; /* rest from output */
3374
+//NOTREACHED }
3375
+//NOTREACHED }
3376
+//NOTREACHED }
3377
+ else { /* contiguous in window */
3378
+ from_window_offset += wnext - op;
3379
+ if (op < len) { /* some from window */
3380
+ len -= op;
3381
+ strm.output_data += window.substring(from_window_offset, from_window_offset + op);
3382
+ out += op;
3383
+ from_window_offset = -1;
3384
+ from_out_offset = out - dist; /* rest from output */
3385
+ }
3386
+ }
3387
+ }
3388
+ else {
3389
+ from_window_offset = -1;
3390
+ from_out_offset = out - dist; /* copy direct from output */
3391
+ }
3392
+
3393
+ if (from_window_offset >= 0) {
3394
+ strm.output_data += window.substring(from_window_offset, from_window_offset + len);
3395
+ out += len;
3396
+ from_window_offset += len;
3397
+ } else {
3398
+ var len_inner = len;
3399
+ if(len_inner > out - from_out_offset)
3400
+ len_inner = out - from_out_offset;
3401
+ strm.output_data += strm.output_data.substring(
3402
+ from_out_offset, from_out_offset + len_inner);
3403
+ out += len_inner;
3404
+ len -= len_inner;
3405
+ from_out_offset += len_inner;
3406
+ out += len;
3407
+ while (len > 2) {
3408
+ strm.output_data += strm.output_data.charAt(from_out_offset++);
3409
+ strm.output_data += strm.output_data.charAt(from_out_offset++);
3410
+ strm.output_data += strm.output_data.charAt(from_out_offset++);
3411
+ len -= 3;
3412
+ }
3413
+ if (len) {
3414
+ strm.output_data += strm.output_data.charAt(from_out_offset++);
3415
+ if (len > 1)
3416
+ strm.output_data += strm.output_data.charAt(from_out_offset++);
3417
+ }
3418
+ }
3419
+ }
3420
+ else if ((op & 64) == 0) { /* 2nd level distance code */
3421
+ here = codes[dcode + (here.val + (hold & ((1 << op) - 1)))];
3422
+ continue dodist; // goto dodist
3423
+ }
3424
+ else {
3425
+ strm.msg = 'invalid distance code';
3426
+ state.mode = BAD;
3427
+ break loop;
3428
+ }
3429
+ break dodist; }
3430
+ }
3431
+ else if ((op & 64) == 0) { /* 2nd level length code */
3432
+ here = codes[lcode + (here.val + (hold & ((1 << op) - 1)))];
3433
+ continue dolen; // goto dolen;
3434
+ }
3435
+ else if (op & 32) { /* end-of-block */
3436
+ // Tracevv((stderr, "inflate: end of block\n"));
3437
+ state.mode = TYPE;
3438
+ break loop;
3439
+ }
3440
+ else {
3441
+ strm.msg = 'invalid literal/length code';
3442
+ state.mode = BAD;
3443
+ break loop;
3444
+ }
3445
+ break dolen; }
3446
+ } while (next_in < last && out < end);
3447
+
3448
+ /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
3449
+ len = bits >>> 3;
3450
+ next_in -= len;
3451
+ bits -= len << 3;
3452
+ hold &= (1 << bits) - 1;
3453
+
3454
+ /* update state and return */
3455
+ strm.next_in = next_in;
3456
+ strm.next_out = out;
3457
+ strm.avail_in = (next_in < last ? 5 + (last - next_in) : 5 - (next_in - last));
3458
+ strm.avail_out = (out < end ?
3459
+ 257 + (end - out) : 257 - (out - end));
3460
+ state.hold = hold;
3461
+ state.bits = bits;
3462
+}
3463
+
3464
+function new_array(size)
3465
+{
3466
+ var i;
3467
+ var ary = new Array(size);
3468
+ for(i = 0; i < size; i++)
3469
+ ary[i] = 0;
3470
+ return ary;
3471
+}
3472
+
3473
+function getarg(opts, name, def_value)
3474
+{
3475
+ return (opts && (name in opts)) ? opts[name] : def_value;
3476
+}
3477
+
3478
+function checksum_none()
3479
+{
3480
+ return 0;
3481
+}
3482
+
3483
+/**
3484
+ * z_stream constructor
3485
+ * @constructor
3486
+ */
3487
+function inflate_state()
3488
+{
3489
+ var i;
3490
+
3491
+ this.mode = 0; /* current inflate mode */
3492
+ this.last = 0; /* true if processing last block */
3493
+ this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
3494
+ this.havedict = 0; /* true if dictionary provided */
3495
+ this.flags = 0; /* gzip header method and flags (0 if zlib) */
3496
+ this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */
3497
+ this.check = 0; /* protected copy of check value */
3498
+ this.total = 0; /* protected copy of output count */
3499
+ this.head = null; /* where to save gzip header information */
3500
+ /* sliding window */
3501
+ this.wbits = 0; /* log base 2 of requested window size */
3502
+ this.wsize = 0; /* window size or zero if not using window */
3503
+ this.whave = 0; /* valid bytes in the window */
3504
+ this.wnext = 0; /* window write index (TODO remove) */
3505
+ this.window = null; /* allocated sliding window, if needed */
3506
+ /* bit accumulator */
3507
+ this.hold = 0; /* input bit accumulator */
3508
+ this.bits = 0; /* number of bits in "in" */
3509
+ /* for string and stored block copying */
3510
+ this.length = 0; /* literal or length of data to copy */
3511
+ this.offset = 0; /* distance back to copy string from */
3512
+ /* for table and code decoding */
3513
+ this.extra = 0; /* extra bits needed */
3514
+ /* fixed and dynamic code tables */
3515
+
3516
+ /* zlib.js: modified implementation: lencode, distcode, next are offset of codes[] */
3517
+ this.lencode = 0; /* starting table for length/literal codes */
3518
+ this.distcode = 0; /* starting table for distance codes */
3519
+ this.lenbits = 0; /* index bits for lencode */
3520
+ this.distbits = 0; /* index bits for distcode */
3521
+ /* dynamic table building */
3522
+ this.ncode = 0; /* number of code length code lengths */
3523
+ this.nlen = 0; /* number of length code lengths */
3524
+ this.ndist = 0; /* number of distance code lengths */
3525
+ this.have = 0; /* number of code lengths in lens[] */
3526
+ this.next = 0; /* next available space in codes[] */
3527
+ this.lens = new_array(320); /* temporary storage for code lengths */
3528
+ this.work = new_array(288); /* work area for code table building */
3529
+ this.codes = new Array(ENOUGH); /* space for code tables */
3530
+ var c = {op:0, bits:0, val:0};
3531
+ for(i = 0; i < ENOUGH; i++)
3532
+ this.codes[i] = c;
3533
+ this.sane = 0; /* if false, allow invalid distance too far */
3534
+ this.back = 0; /* bits back of last unprocessed length/lit */
3535
+ this.was = 0; /* initial length of match */
3536
+}
3537
+
3538
+ZLIB.inflateResetKeep = function(strm)
3539
+{
3540
+ var state;
3541
+
3542
+ if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
3543
+ state = strm.state;
3544
+ strm.total_in = strm.total_out = state.total = 0;
3545
+ strm.msg = null;
3546
+ if (state.wrap) { /* to support ill-conceived Java test suite */
3547
+ strm.adler = state.wrap & 1;
3548
+ }
3549
+
3550
+ state.mode = HEAD;
3551
+ state.last = 0;
3552
+ state.havedict = 0;
3553
+ state.dmax = 32768;
3554
+ state.head = null;
3555
+ state.hold = 0;
3556
+ state.bits = 0;
3557
+ state.lencode = 0;
3558
+ state.distcode = 0;
3559
+ state.next = 0;
3560
+ state.sane = 1;
3561
+ state.back = -1;
3562
+ return ZLIB.Z_OK;
3563
+};
3564
+
3565
+// Usage: strm = ZLIB.inflateReset(z_stream [, windowBits]);
3566
+ZLIB.inflateReset = function(strm, windowBits)
3567
+{
3568
+ var wrap;
3569
+ var state;
3570
+
3571
+ /* get the state */
3572
+ if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
3573
+ state = strm.state;
3574
+
3575
+ if(typeof windowBits === "undefined")
3576
+ windowBits = DEF_WBITS;
3577
+
3578
+ /* extract wrap request from windowBits parameter */
3579
+ if (windowBits < 0) {
3580
+ wrap = 0;
3581
+ windowBits = -windowBits;
3582
+ }
3583
+ else {
3584
+ wrap = (windowBits >>> 4) + 1;
3585
+ if (windowBits < 48)
3586
+ windowBits &= 15;
3587
+ }
3588
+
3589
+ if(wrap == 1 && (typeof ZLIB.adler32 === 'function')) {
3590
+ strm.checksum_function = ZLIB.adler32;
3591
+ } else if(wrap == 2 && (typeof ZLIB.crc32 === 'function')) {
3592
+ strm.checksum_function = ZLIB.crc32;
3593
+ } else {
3594
+ strm.checksum_function = checksum_none;
3595
+ }
3596
+
3597
+ /* set number of window bits, free window if different */
3598
+ if (windowBits && (windowBits < 8 || windowBits > 15))
3599
+ return ZLIB.Z_STREAM_ERROR;
3600
+ if (state.window && state.wbits != windowBits) {
3601
+ state.window = null;
3602
+ }
3603
+
3604
+ /* update state and reset the rest of it */
3605
+ state.wrap = wrap;
3606
+ state.wbits = windowBits;
3607
+ state.wsize = 0;
3608
+ state.whave = 0;
3609
+ state.wnext = 0;
3610
+ return ZLIB.inflateResetKeep(strm);
3611
+};
3612
+
3613
+// Usage: strm = ZLIB.inflateInit([windowBits]);
3614
+ZLIB.inflateInit = function(windowBits)
3615
+{
3616
+ var strm = new ZLIB.z_stream();
3617
+ strm.state = new inflate_state();
3618
+ ZLIB.inflateReset(strm, windowBits);
3619
+ return strm;
3620
+};
3621
+
3622
+ZLIB.inflatePrime = function(strm, bits, value)
3623
+{
3624
+ var state;
3625
+
3626
+ if (!strm || !strm.state) return ZLIB.Z_STREAM_ERROR;
3627
+ state = strm.state;
3628
+ if (bits < 0) {
3629
+ state.hold = 0;
3630
+ state.bits = 0;
3631
+ return ZLIB.Z_OK;
3632
+ }
3633
+ if (bits > 16 || state.bits + bits > 32) return ZLIB.Z_STREAM_ERROR;
3634
+ value &= (1 << bits) - 1;
3635
+ state.hold += value << state.bits;
3636
+ state.bits += bits;
3637
+ return ZLIB.Z_OK;
3638
+};
3639
+
3640
+var lenfix_ary = null;
3641
+var distfix_ary = null;
3642
+function fixedtables(state)
3643
+{
3644
+ var i;
3645
+ if (!lenfix_ary) lenfix_ary = [ { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 80 }, { op: 0, bits: 8, val: 16 }, { op: 20, bits: 8, val: 115 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 112 }, { op: 0, bits: 8, val: 48 }, { op: 0, bits: 9, val: 192 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 96 }, { op: 0, bits: 8, val: 32 }, { op: 0, bits: 9, val: 160 }, { op: 0, bits: 8, val: 0 }, { op: 0, bits: 8, val: 128 }, { op: 0, bits: 8, val: 64 }, { op: 0, bits: 9, val: 224 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 88 }, { op: 0, bits: 8, val: 24 }, { op: 0, bits: 9, val: 144 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 120 }, { op: 0, bits: 8, val: 56 }, { op: 0, bits: 9, val: 208 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 104 }, { op: 0, bits: 8, val: 40 }, { op: 0, bits: 9, val: 176 }, { op: 0, bits: 8, val: 8 }, { op: 0, bits: 8, val: 136 }, { op: 0, bits: 8, val: 72 }, { op: 0, bits: 9, val: 240 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 84 }, { op: 0, bits: 8, val: 20 }, { op: 21, bits: 8, val: 227 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 116 }, { op: 0, bits: 8, val: 52 }, { op: 0, bits: 9, val: 200 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 100 }, { op: 0, bits: 8, val: 36 }, { op: 0, bits: 9, val: 168 }, { op: 0, bits: 8, val: 4 }, { op: 0, bits: 8, val: 132 }, { op: 0, bits: 8, val: 68 }, { op: 0, bits: 9, val: 232 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 92 }, { op: 0, bits: 8, val: 28 }, { op: 0, bits: 9, val: 152 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 124 }, { op: 0, bits: 8, val: 60 }, { op: 0, bits: 9, val: 216 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 108 }, { op: 0, bits: 8, val: 44 }, { op: 0, bits: 9, val: 184 }, { op: 0, bits: 8, val: 12 }, { op: 0, bits: 8, val: 140 }, { op: 0, bits: 8, val: 76 }, { op: 0, bits: 9, val: 248 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 82 }, { op: 0, bits: 8, val: 18 }, { op: 21, bits: 8, val: 163 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 114 }, { op: 0, bits: 8, val: 50 }, { op: 0, bits: 9, val: 196 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 98 }, { op: 0, bits: 8, val: 34 }, { op: 0, bits: 9, val: 164 }, { op: 0, bits: 8, val: 2 }, { op: 0, bits: 8, val: 130 }, { op: 0, bits: 8, val: 66 }, { op: 0, bits: 9, val: 228 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 90 }, { op: 0, bits: 8, val: 26 }, { op: 0, bits: 9, val: 148 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 122 }, { op: 0, bits: 8, val: 58 }, { op: 0, bits: 9, val: 212 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 106 }, { op: 0, bits: 8, val: 42 }, { op: 0, bits: 9, val: 180 }, { op: 0, bits: 8, val: 10 }, { op: 0, bits: 8, val: 138 }, { op: 0, bits: 8, val: 74 }, { op: 0, bits: 9, val: 244 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 86 }, { op: 0, bits: 8, val: 22 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 118 }, { op: 0, bits: 8, val: 54 }, { op: 0, bits: 9, val: 204 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 102 }, { op: 0, bits: 8, val: 38 }, { op: 0, bits: 9, val: 172 }, { op: 0, bits: 8, val: 6 }, { op: 0, bits: 8, val: 134 }, { op: 0, bits: 8, val: 70 }, { op: 0, bits: 9, val: 236 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 94 }, { op: 0, bits: 8, val: 30 }, { op: 0, bits: 9, val: 156 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 126 }, { op: 0, bits: 8, val: 62 }, { op: 0, bits: 9, val: 220 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 110 }, { op: 0, bits: 8, val: 46 }, { op: 0, bits: 9, val: 188 }, { op: 0, bits: 8, val: 14 }, { op: 0, bits: 8, val: 142 }, { op: 0, bits: 8, val: 78 }, { op: 0, bits: 9, val: 252 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 81 }, { op: 0, bits: 8, val: 17 }, { op: 21, bits: 8, val: 131 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 113 }, { op: 0, bits: 8, val: 49 }, { op: 0, bits: 9, val: 194 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 97 }, { op: 0, bits: 8, val: 33 }, { op: 0, bits: 9, val: 162 }, { op: 0, bits: 8, val: 1 }, { op: 0, bits: 8, val: 129 }, { op: 0, bits: 8, val: 65 }, { op: 0, bits: 9, val: 226 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 89 }, { op: 0, bits: 8, val: 25 }, { op: 0, bits: 9, val: 146 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 121 }, { op: 0, bits: 8, val: 57 }, { op: 0, bits: 9, val: 210 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 105 }, { op: 0, bits: 8, val: 41 }, { op: 0, bits: 9, val: 178 }, { op: 0, bits: 8, val: 9 }, { op: 0, bits: 8, val: 137 }, { op: 0, bits: 8, val: 73 }, { op: 0, bits: 9, val: 242 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 85 }, { op: 0, bits: 8, val: 21 }, { op: 16, bits: 8, val: 258 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 117 }, { op: 0, bits: 8, val: 53 }, { op: 0, bits: 9, val: 202 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 101 }, { op: 0, bits: 8, val: 37 }, { op: 0, bits: 9, val: 170 }, { op: 0, bits: 8, val: 5 }, { op: 0, bits: 8, val: 133 }, { op: 0, bits: 8, val: 69 }, { op: 0, bits: 9, val: 234 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 93 }, { op: 0, bits: 8, val: 29 }, { op: 0, bits: 9, val: 154 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 125 }, { op: 0, bits: 8, val: 61 }, { op: 0, bits: 9, val: 218 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 109 }, { op: 0, bits: 8, val: 45 }, { op: 0, bits: 9, val: 186 }, { op: 0, bits: 8, val: 13 }, { op: 0, bits: 8, val: 141 }, { op: 0, bits: 8, val: 77 }, { op: 0, bits: 9, val: 250 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 83 }, { op: 0, bits: 8, val: 19 }, { op: 21, bits: 8, val: 195 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 115 }, { op: 0, bits: 8, val: 51 }, { op: 0, bits: 9, val: 198 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 99 }, { op: 0, bits: 8, val: 35 }, { op: 0, bits: 9, val: 166 }, { op: 0, bits: 8, val: 3 }, { op: 0, bits: 8, val: 131 }, { op: 0, bits: 8, val: 67 }, { op: 0, bits: 9, val: 230 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 91 }, { op: 0, bits: 8, val: 27 }, { op: 0, bits: 9, val: 150 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 123 }, { op: 0, bits: 8, val: 59 }, { op: 0, bits: 9, val: 214 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 107 }, { op: 0, bits: 8, val: 43 }, { op: 0, bits: 9, val: 182 }, { op: 0, bits: 8, val: 11 }, { op: 0, bits: 8, val: 139 }, { op: 0, bits: 8, val: 75 }, { op: 0, bits: 9, val: 246 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 87 }, { op: 0, bits: 8, val: 23 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 119 }, { op: 0, bits: 8, val: 55 }, { op: 0, bits: 9, val: 206 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 103 }, { op: 0, bits: 8, val: 39 }, { op: 0, bits: 9, val: 174 }, { op: 0, bits: 8, val: 7 }, { op: 0, bits: 8, val: 135 }, { op: 0, bits: 8, val: 71 }, { op: 0, bits: 9, val: 238 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 95 }, { op: 0, bits: 8, val: 31 }, { op: 0, bits: 9, val: 158 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 127 }, { op: 0, bits: 8, val: 63 }, { op: 0, bits: 9, val: 222 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 111 }, { op: 0, bits: 8, val: 47 }, { op: 0, bits: 9, val: 190 }, { op: 0, bits: 8, val: 15 }, { op: 0, bits: 8, val: 143 }, { op: 0, bits: 8, val: 79 }, { op: 0, bits: 9, val: 254 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 80 }, { op: 0, bits: 8, val: 16 }, { op: 20, bits: 8, val: 115 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 112 }, { op: 0, bits: 8, val: 48 }, { op: 0, bits: 9, val: 193 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 96 }, { op: 0, bits: 8, val: 32 }, { op: 0, bits: 9, val: 161 }, { op: 0, bits: 8, val: 0 }, { op: 0, bits: 8, val: 128 }, { op: 0, bits: 8, val: 64 }, { op: 0, bits: 9, val: 225 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 88 }, { op: 0, bits: 8, val: 24 }, { op: 0, bits: 9, val: 145 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 120 }, { op: 0, bits: 8, val: 56 }, { op: 0, bits: 9, val: 209 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 104 }, { op: 0, bits: 8, val: 40 }, { op: 0, bits: 9, val: 177 }, { op: 0, bits: 8, val: 8 }, { op: 0, bits: 8, val: 136 }, { op: 0, bits: 8, val: 72 }, { op: 0, bits: 9, val: 241 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 84 }, { op: 0, bits: 8, val: 20 }, { op: 21, bits: 8, val: 227 }, { op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 116 }, { op: 0, bits: 8, val: 52 }, { op: 0, bits: 9, val: 201 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 100 }, { op: 0, bits: 8, val: 36 }, { op: 0, bits: 9, val: 169 }, { op: 0, bits: 8, val: 4 }, { op: 0, bits: 8, val: 132 }, { op: 0, bits: 8, val: 68 }, { op: 0, bits: 9, val: 233 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 92 }, { op: 0, bits: 8, val: 28 }, { op: 0, bits: 9, val: 153 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 124 }, { op: 0, bits: 8, val: 60 }, { op: 0, bits: 9, val: 217 }, { op: 18, bits: 7, val: 23 }, { op: 0, bits: 8, val: 108 }, { op: 0, bits: 8, val: 44 }, { op: 0, bits: 9, val: 185 }, { op: 0, bits: 8, val: 12 }, { op: 0, bits: 8, val: 140 }, { op: 0, bits: 8, val: 76 }, { op: 0, bits: 9, val: 249 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 82 }, { op: 0, bits: 8, val: 18 }, { op: 21, bits: 8, val: 163 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 114 }, { op: 0, bits: 8, val: 50 }, { op: 0, bits: 9, val: 197 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 98 }, { op: 0, bits: 8, val: 34 }, { op: 0, bits: 9, val: 165 }, { op: 0, bits: 8, val: 2 }, { op: 0, bits: 8, val: 130 }, { op: 0, bits: 8, val: 66 }, { op: 0, bits: 9, val: 229 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 90 }, { op: 0, bits: 8, val: 26 }, { op: 0, bits: 9, val: 149 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 122 }, { op: 0, bits: 8, val: 58 },{ op: 0, bits: 9, val: 213 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 106 }, { op: 0, bits: 8, val: 42 }, { op: 0, bits: 9, val: 181 }, { op: 0, bits: 8, val: 10 }, { op: 0, bits: 8, val: 138 },{ op: 0, bits: 8, val: 74 }, { op: 0, bits: 9, val: 245 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 86 }, { op: 0, bits: 8, val: 22 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 },{ op: 0, bits: 8, val: 118 }, { op: 0, bits: 8, val: 54 }, { op: 0, bits: 9, val: 205 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 102 }, { op: 0, bits: 8, val: 38 }, { op: 0, bits: 9, val: 173 },{ op: 0, bits: 8, val: 6 }, { op: 0, bits: 8, val: 134 }, { op: 0, bits: 8, val: 70 }, { op: 0, bits: 9, val: 237 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 94 }, { op: 0, bits: 8, val: 30 },{ op: 0, bits: 9, val: 157 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 126 }, { op: 0, bits: 8, val: 62 }, { op: 0, bits: 9, val: 221 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 110 }, { op: 0, bits: 8, val: 46 }, { op: 0, bits: 9, val: 189 }, { op: 0, bits: 8, val: 14 }, { op: 0, bits: 8, val: 142 }, { op: 0, bits: 8, val: 78 }, { op: 0, bits: 9, val: 253 }, { op: 96, bits: 7, val: 0 }, { op: 0, bits: 8, val: 81 }, { op: 0, bits: 8, val: 17 }, { op: 21, bits: 8, val: 131 }, { op: 18, bits: 7, val: 31 }, { op: 0, bits: 8, val: 113 }, { op: 0, bits: 8, val: 49 }, { op: 0, bits: 9, val: 195 }, { op: 16, bits: 7, val: 10 }, { op: 0, bits: 8, val: 97 }, { op: 0, bits: 8, val: 33 }, { op: 0, bits: 9, val: 163 }, { op: 0, bits: 8, val: 1 }, { op: 0, bits: 8, val: 129 }, { op: 0, bits: 8, val: 65 }, { op: 0, bits: 9, val: 227 }, { op: 16, bits: 7, val: 6 }, { op: 0, bits: 8, val: 89 }, { op: 0, bits: 8, val: 25 }, { op: 0, bits: 9, val: 147 }, { op: 19, bits: 7, val: 59 }, { op: 0, bits: 8, val: 121 }, { op: 0, bits: 8, val: 57 }, { op: 0, bits: 9, val: 211 }, { op: 17, bits: 7, val: 17 }, { op: 0, bits: 8, val: 105 }, { op: 0, bits: 8, val: 41 }, { op: 0, bits: 9, val: 179 }, { op: 0, bits: 8, val: 9 },{ op: 0, bits: 8, val: 137 }, { op: 0, bits: 8, val: 73 }, { op: 0, bits: 9, val: 243 }, { op: 16, bits: 7, val: 4 }, { op: 0, bits: 8, val: 85 }, { op: 0, bits: 8, val: 21 }, { op: 16, bits: 8, val: 258 },{ op: 19, bits: 7, val: 43 }, { op: 0, bits: 8, val: 117 }, { op: 0, bits: 8, val: 53 }, { op: 0, bits: 9, val: 203 }, { op: 17, bits: 7, val: 13 }, { op: 0, bits: 8, val: 101 }, { op: 0, bits: 8, val: 37 },{ op: 0, bits: 9, val: 171 }, { op: 0, bits: 8, val: 5 }, { op: 0, bits: 8, val: 133 }, { op: 0, bits: 8, val: 69 }, { op: 0, bits: 9, val: 235 }, { op: 16, bits: 7, val: 8 }, { op: 0, bits: 8, val: 93 },{ op: 0, bits: 8, val: 29 }, { op: 0, bits: 9, val: 155 }, { op: 20, bits: 7, val: 83 }, { op: 0, bits: 8, val: 125 }, { op: 0, bits: 8, val: 61 }, { op: 0, bits: 9, val: 219 }, { op: 18, bits: 7, val: 23 },{ op: 0, bits: 8, val: 109 }, { op: 0, bits: 8, val: 45 }, { op: 0, bits: 9, val: 187 }, { op: 0, bits: 8, val: 13 }, { op: 0, bits: 8, val: 141 }, { op: 0, bits: 8, val: 77 }, { op: 0, bits: 9, val: 251 }, { op: 16, bits: 7, val: 3 }, { op: 0, bits: 8, val: 83 }, { op: 0, bits: 8, val: 19 }, { op: 21, bits: 8, val: 195 }, { op: 19, bits: 7, val: 35 }, { op: 0, bits: 8, val: 115 }, { op: 0, bits: 8, val: 51 }, { op: 0, bits: 9, val: 199 }, { op: 17, bits: 7, val: 11 }, { op: 0, bits: 8, val: 99 }, { op: 0, bits: 8, val: 35 }, { op: 0, bits: 9, val: 167 }, { op: 0, bits: 8, val: 3 }, { op: 0, bits: 8, val: 131 }, { op: 0, bits: 8, val: 67 }, { op: 0, bits: 9, val: 231 }, { op: 16, bits: 7, val: 7 }, { op: 0, bits: 8, val: 91 }, { op: 0, bits: 8, val: 27 }, { op: 0, bits: 9, val: 151 }, { op: 20, bits: 7, val: 67 }, { op: 0, bits: 8, val: 123 }, { op: 0, bits: 8, val: 59 }, { op: 0, bits: 9, val: 215 }, { op: 18, bits: 7, val: 19 }, { op: 0, bits: 8, val: 107 }, { op: 0, bits: 8, val: 43 }, { op: 0, bits: 9, val: 183 }, { op: 0, bits: 8, val: 11 }, { op: 0, bits: 8, val: 139 }, { op: 0, bits: 8, val: 75 }, { op: 0, bits: 9, val: 247 }, { op: 16, bits: 7, val: 5 }, { op: 0, bits: 8, val: 87 }, { op: 0, bits: 8, val: 23 }, { op: 64, bits: 8, val: 0 }, { op: 19, bits: 7, val: 51 }, { op: 0, bits: 8, val: 119 }, { op: 0, bits: 8, val: 55 }, { op: 0, bits: 9, val: 207 }, { op: 17, bits: 7, val: 15 }, { op: 0, bits: 8, val: 103 }, { op: 0, bits: 8, val: 39 }, { op: 0, bits: 9, val: 175 }, { op: 0, bits: 8, val: 7 }, { op: 0, bits: 8, val: 135 }, { op: 0, bits: 8, val: 71 }, { op: 0, bits: 9, val: 239 }, { op: 16, bits: 7, val: 9 }, { op: 0, bits: 8, val: 95 }, { op: 0, bits: 8, val: 31 }, { op: 0, bits: 9, val: 159 }, { op: 20, bits: 7, val: 99 }, { op: 0, bits: 8, val: 127 }, { op: 0, bits: 8, val: 63 }, { op: 0, bits: 9, val: 223 }, { op: 18, bits: 7, val: 27 }, { op: 0, bits: 8, val: 111 }, { op: 0, bits: 8, val: 47 }, { op: 0, bits: 9, val: 191 }, { op: 0, bits: 8, val: 15 }, { op: 0, bits: 8, val: 143 }, { op: 0, bits: 8, val: 79 }, { op: 0, bits: 9, val: 255 } ];
3646
+ if (!distfix_ary) distfix_ary = [ { op: 16, bits: 5, val: 1 }, { op: 23, bits: 5, val: 257 }, { op: 19, bits: 5, val: 17 }, { op: 27, bits: 5, val: 4097 }, { op: 17, bits: 5, val: 5 }, { op: 25, bits: 5, val: 1025 }, { op: 21, bits: 5, val: 65 }, { op: 29, bits: 5, val: 16385 }, { op: 16, bits: 5, val: 3 }, { op: 24, bits: 5, val: 513 }, { op: 20, bits: 5, val: 33 }, { op: 28, bits: 5, val: 8193 }, { op: 18, bits: 5, val: 9 }, { op: 26, bits: 5, val: 2049 }, { op: 22, bits: 5, val: 129 }, { op: 64, bits: 5, val: 0 }, { op: 16, bits: 5, val: 2 }, { op: 23, bits: 5, val: 385 }, { op: 19, bits: 5, val: 25 }, { op: 27, bits: 5, val: 6145 }, { op: 17, bits: 5, val: 7 }, { op: 25, bits: 5, val: 1537 }, { op: 21, bits: 5, val: 97 }, { op: 29, bits: 5, val: 24577 }, { op: 16, bits: 5, val: 4 }, { op: 24, bits: 5, val: 769 }, { op: 20, bits: 5, val: 49 }, { op: 28, bits: 5, val: 12289 }, { op: 18, bits: 5, val: 13 }, { op: 26, bits: 5, val: 3073 }, { op: 22, bits: 5, val: 193 }, { op: 64, bits: 5, val: 0 } ];
3647
+ state.lencode = 0;
3648
+ state.distcode = 512;
3649
+ for (i = 0; i < 512; i++) { state.codes[i] = lenfix_ary[i]; }
3650
+ for (i = 0; i < 32; i++) { state.codes[i + 512] = distfix_ary[i]; }
3651
+ state.lenbits = 9;
3652
+ state.distbits = 5;
3653
+}
3654
+
3655
+/*
3656
+ Update the window with the last wsize (normally 32K) bytes written before
3657
+ returning. If window does not exist yet, create it. This is only called
3658
+ when a window is already in use, or when output has been written during this
3659
+ inflate call, but the end of the deflate stream has not been reached yet.
3660
+ It is also called to create a window for dictionary data when a dictionary
3661
+ is loaded.
3662
+
3663
+ Providing output buffers larger than 32K to inflate() should provide a speed
3664
+ advantage, since only the last 32K of output is copied to the sliding window
3665
+ upon return from inflate(), and since all distances after the first 32K of
3666
+ output will fall in the output data, making match copies simpler and faster.
3667
+ The advantage may be dependent on the size of the processor's data caches.
3668
+*/
3669
+function updatewindow(strm)
3670
+{
3671
+ var state = strm.state;
3672
+ var out = strm.output_data.length;
3673
+
3674
+ /* if it hasn't been done already, allocate space for the window */
3675
+ if (state.window === null) {
3676
+ state.window = '';
3677
+ }
3678
+
3679
+ /* if window not in use yet, initialize */
3680
+ if (state.wsize == 0) {
3681
+ state.wsize = 1 << state.wbits;
3682
+ }
3683
+
3684
+ // zlib.js: Sliding window
3685
+ if (out >= state.wsize) {
3686
+ state.window = strm.output_data.substring(out - state.wsize);
3687
+ } else {
3688
+ if(state.whave + out < state.wsize) {
3689
+ state.window += strm.output_data;
3690
+ } else {
3691
+ state.window = state.window.substring(state.whave - (state.wsize - out)) + strm.output_data;
3692
+ }
3693
+ }
3694
+ state.whave = state.window.length;
3695
+ if(state.whave < state.wsize) {
3696
+ state.wnext = state.whave;
3697
+ } else {
3698
+ state.wnext = 0;
3699
+ }
3700
+ return 0;
3701
+}
3702
+
3703
+
3704
+// #ifdef GUNZIP
3705
+function CRC2(strm, word)
3706
+{
3707
+ var hbuf = [word & 0xff, (word >>> 8) & 0xff];
3708
+ strm.state.check = strm.checksum_function(strm.state.check, hbuf, 0, 2);
3709
+}
3710
+
3711
+function CRC4(strm, word)
3712
+{
3713
+ var hbuf = [word & 0xff,
3714
+ (word >>> 8) & 0xff,
3715
+ (word >>> 16) & 0xff,
3716
+ (word >>> 24) & 0xff];
3717
+ strm.state.check = strm.checksum_function(strm.state.check, hbuf, 0, 4);
3718
+}
3719
+
3720
+/* Load registers with state in inflate() for speed */
3721
+function LOAD(strm, s)
3722
+{
3723
+ s.strm = strm; /* z_stream */
3724
+ s.left = strm.avail_out; /* available output */
3725
+ s.next = strm.next_in; /* next input */
3726
+ s.have = strm.avail_in; /* available input */
3727
+ s.hold = strm.state.hold; /* bit buffer */
3728
+ s.bits = strm.state.bits; /* bits in bit buffer */
3729
+ return s;
3730
+}
3731
+
3732
+/* Restore state from registers in inflate() */
3733
+function RESTORE(s)
3734
+{
3735
+ var strm = s.strm;
3736
+ strm.next_in = s.next;
3737
+ strm.avail_out = s.left;
3738
+ strm.avail_in = s.have;
3739
+ strm.state.hold = s.hold;
3740
+ strm.state.bits = s.bits;
3741
+}
3742
+
3743
+/* Clear the input bit accumulator */
3744
+function INITBITS(s)
3745
+{
3746
+ s.hold = 0;
3747
+ s.bits = 0;
3748
+}
3749
+
3750
+/* Get a byte of input into the bit accumulator, or return from inflate()
3751
+ if there is no input available. */
3752
+function PULLBYTE(s)
3753
+{
3754
+ if (s.have == 0) return false;
3755
+ s.have--;
3756
+ s.hold += (s.strm.input_data.charCodeAt(s.next++) & 0xff) << s.bits;
3757
+ s.bits += 8;
3758
+ return true;
3759
+}
3760
+
3761
+/* Assure that there are at least n bits in the bit accumulator. If there is
3762
+ not enough available input to do that, then return from inflate(). */
3763
+function NEEDBITS(s, n)
3764
+{
3765
+ // if(typeof n != 'number') throw 'ERROR';
3766
+ while (s.bits < n) {
3767
+ if(!PULLBYTE(s))
3768
+ return false;
3769
+ }
3770
+ return true;
3771
+}
3772
+
3773
+/* Return the low n bits of the bit accumulator (n < 16) */
3774
+function BITS(s, n)
3775
+{
3776
+ return s.hold & ((1 << n) - 1);
3777
+}
3778
+
3779
+/* Remove n bits from the bit accumulator */
3780
+function DROPBITS(s, n)
3781
+{
3782
+ // if(typeof n != 'number') throw 'ERROR';
3783
+ s.hold >>>= n;
3784
+ s.bits -= n;
3785
+}
3786
+
3787
+/* Remove zero to seven bits as needed to go to a byte boundary */
3788
+function BYTEBITS(s)
3789
+{
3790
+ s.hold >>>= s.bits & 7;
3791
+ s.bits -= s.bits & 7;
3792
+}
3793
+
3794
+/* Reverse the bytes in a 32-bit value */
3795
+function REVERSE(q)
3796
+{
3797
+ return ((q >>> 24) & 0xff) +
3798
+ ((q >>> 8) & 0xff00) +
3799
+ ((q & 0xff00) << 8) +
3800
+ ((q & 0xff) << 24);
3801
+}
3802
+
3803
+/*
3804
+ inflate() uses a state machine to process as much input data and generate as
3805
+ much output data as possible before returning. The state machine is
3806
+ structured roughly as follows:
3807
+
3808
+ for (;;) switch (state) {
3809
+ ...
3810
+ case STATEn:
3811
+ if (not enough input data or output space to make progress)
3812
+ return;
3813
+ ... make progress ...
3814
+ state = STATEm;
3815
+ break;
3816
+ ...
3817
+ }
3818
+
3819
+ so when inflate() is called again, the same case is attempted again, and
3820
+ if the appropriate resources are provided, the machine proceeds to the
3821
+ next state. The NEEDBITS() macro is usually the way the state evaluates
3822
+ whether it can proceed or should return. NEEDBITS() does the return if
3823
+ the requested bits are not available. The typical use of the BITS macros
3824
+ is:
3825
+
3826
+ NEEDBITS(n);
3827
+ ... do something with BITS(n) ...
3828
+ DROPBITS(n);
3829
+
3830
+ where NEEDBITS(n) either returns from inflate() if there isn't enough
3831
+ input left to load n bits into the accumulator, or it continues. BITS(n)
3832
+ gives the low n bits in the accumulator. When done, DROPBITS(n) drops
3833
+ the low n bits off the accumulator. INITBITS() clears the accumulator
3834
+ and sets the number of available bits to zero. BYTEBITS() discards just
3835
+ enough bits to put the accumulator on a byte boundary. After BYTEBITS()
3836
+ and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
3837
+
3838
+ NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
3839
+ if there is no input available. The decoding of variable length codes uses
3840
+ PULLBYTE() directly in order to pull just enough bytes to decode the next
3841
+ code, and no more.
3842
+
3843
+ Some states loop until they get enough input, making sure that enough
3844
+ state information is maintained to continue the loop where it left off
3845
+ if NEEDBITS() returns in the loop. For example, want, need, and keep
3846
+ would all have to actually be part of the saved state in case NEEDBITS()
3847
+ returns:
3848
+
3849
+ case STATEw:
3850
+ while (want < need) {
3851
+ NEEDBITS(n);
3852
+ keep[want++] = BITS(n);
3853
+ DROPBITS(n);
3854
+ }
3855
+ state = STATEx;
3856
+ case STATEx:
3857
+
3858
+ As shown above, if the next state is also the next case, then the break
3859
+ is omitted.
3860
+
3861
+ A state may also return if there is not enough output space available to
3862
+ complete that state. Those states are copying stored data, writing a
3863
+ literal byte, and copying a matching string.
3864
+
3865
+ When returning, a "goto inf_leave" is used to update the total counters,
3866
+ update the check value, and determine whether any progress has been made
3867
+ during that inflate() call in order to return the proper return code.
3868
+ Progress is defined as a change in either strm->avail_in or strm->avail_out.
3869
+ When there is a window, goto inf_leave will update the window with the last
3870
+ output written. If a goto inf_leave occurs in the middle of decompression
3871
+ and there is no window currently, goto inf_leave will create one and copy
3872
+ output to the window for the next call of inflate().
3873
+
3874
+ In this implementation, the flush parameter of inflate() only affects the
3875
+ return code (per zlib.h). inflate() always writes as much as possible to
3876
+ strm->next_out, given the space available and the provided input--the effect
3877
+ documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers
3878
+ the allocation of and copying into a sliding window until necessary, which
3879
+ provides the effect documented in zlib.h for Z_FINISH when the entire input
3880
+ stream available. So the only thing the flush parameter actually does is:
3881
+ when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it
3882
+ will return Z_BUF_ERROR if it has not reached the end of the stream.
3883
+ */
3884
+
3885
+/* permutation of code lengths */
3886
+var inflate_order = [
3887
+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
3888
+ZLIB.inflate = function(strm, flush)
3889
+{
3890
+ var state;
3891
+ var s;
3892
+ var _in, out; /* save starting available input and output */
3893
+ var copy; /* number of stored or match bytes to copy */
3894
+ var from_window_offset = -1; /* index of window[] */
3895
+ var from_out_offset = -1; /* index of next_out[] */
3896
+ var here; /* current decoding table entry */
3897
+ var last; /* parent table entry */
3898
+ var len; /* length to copy for repeats, bits to drop */
3899
+ var ret; /* return code */
3900
+
3901
+ if (!strm || !strm.state ||
3902
+ (!strm.input_data && strm.avail_in != 0))
3903
+ return ZLIB.Z_STREAM_ERROR;
3904
+
3905
+ state = strm.state;
3906
+ if (state.mode == TYPE) state.mode = TYPEDO; /* skip check */
3907
+
3908
+ // LOAD
3909
+ s = {};
3910
+ LOAD(strm, s);
3911
+
3912
+ _in = s.have;
3913
+ out = s.left;
3914
+ ret = ZLIB.Z_OK;
3915
+inf_leave: for (;;) {
3916
+ switch (state.mode) {
3917
+ case HEAD:
3918
+ if (state.wrap == 0) {
3919
+ state.mode = TYPEDO;
3920
+ break;
3921
+ }
3922
+ if(!NEEDBITS(s, 16)) break inf_leave;
3923
+// #ifdef GUNZIP
3924
+ if ((state.wrap & 2) && s.hold == 0x8b1f) { /* gzip header */
3925
+ state.check = strm.checksum_function(0, null, 0, 0);
3926
+ CRC2(strm, s.hold);
3927
+ INITBITS(s);
3928
+ state.mode = FLAGS;
3929
+ break;
3930
+ }
3931
+ state.flags = 0; /* expect zlib header */
3932
+ if (state.head !== null)
3933
+ state.head.done = -1;
3934
+ if (!(state.wrap & 1) || /* check if zlib header allowed */
3935
+//#else
3936
+// if (
3937
+//#endif
3938
+ ((BITS(s, 8) << 8) + (s.hold >>> 8)) % 31) {
3939
+ strm.msg = 'incorrect header check';
3940
+ state.mode = BAD;
3941
+ break;
3942
+ }
3943
+ if (BITS(s, 4) != ZLIB.Z_DEFLATED) {
3944
+ strm.msg = 'unknown compression method';
3945
+ state.mode = BAD;
3946
+ break;
3947
+ }
3948
+
3949
+ DROPBITS(s, 4);
3950
+ len = BITS(s, 4) + 8;
3951
+ if (state.wbits == 0)
3952
+ state.wbits = len;
3953
+ else if (len > state.wbits) {
3954
+ strm.msg = 'invalid window size';
3955
+ state.mode = BAD;
3956
+ break;
3957
+ }
3958
+ state.dmax = 1 << len;
3959
+// Tracev((stderr, "inflate: zlib header ok\n"));
3960
+ strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
3961
+ state.mode = s.hold & 0x200 ? DICTID : TYPE;
3962
+ INITBITS(s);
3963
+ break;
3964
+// #ifdef GUNZIP
3965
+ case FLAGS:
3966
+ if(!NEEDBITS(s, 16)) break inf_leave;
3967
+ state.flags = s.hold;
3968
+ if ((state.flags & 0xff) != ZLIB.Z_DEFLATED) {
3969
+ strm.msg = "unknown compression method";
3970
+ state.mode = BAD;
3971
+ break;
3972
+ }
3973
+ if (state.flags & 0xe000) {
3974
+ strm.msg = "unknown header flags set";
3975
+ state.mode = BAD;
3976
+ break;
3977
+ }
3978
+ if (state.head !== null)
3979
+ state.head.text = (s.hold >>> 8) & 1;
3980
+ if (state.flags & 0x0200) {
3981
+ CRC2(strm, s.hold);
3982
+ }
3983
+ INITBITS(s);
3984
+ state.mode = TIME;
3985
+ case TIME:
3986
+ if(!NEEDBITS(s, 32)) break inf_leave;
3987
+ if (state.head !== null)
3988
+ state.head.time = s.hold;
3989
+ if (state.flags & 0x0200) {
3990
+ CRC4(strm, s.hold);
3991
+ }
3992
+ INITBITS(s);
3993
+ state.mode = OS;
3994
+ case OS:
3995
+ if(!NEEDBITS(s, 16)) break inf_leave;
3996
+ if (state.head !== null) {
3997
+ state.head.xflags = s.hold & 0xff;
3998
+ state.head.os = s.hold >>> 8;
3999
+ }
4000
+ if (state.flags & 0x0200) {
4001
+ CRC2(strm, s.hold);
4002
+ }
4003
+ INITBITS(s);
4004
+ state.mode = EXLEN;
4005
+ case EXLEN:
4006
+ if (state.flags & 0x0400) {
4007
+ if(!NEEDBITS(s, 16)) break inf_leave;
4008
+ state.length = s.hold;
4009
+ if (state.head !== null) {
4010
+ state.head.extra_len = s.hold;
4011
+ }
4012
+ if (state.flags & 0x0200) {
4013
+ CRC2(strm, s.hold);
4014
+ }
4015
+ INITBITS(s);
4016
+ state.head.extra = "";
4017
+ }
4018
+ else if (state.head !== null) {
4019
+ state.head.extra = null;
4020
+ }
4021
+ state.mode = EXTRA;
4022
+ case EXTRA:
4023
+ if (state.flags & 0x0400) {
4024
+ copy = state.length;
4025
+ if (copy > s.have) copy = s.have;
4026
+ if (copy) {
4027
+ if (state.head !== null &&
4028
+ state.head.extra !== null) {
4029
+ len = state.head.extra_len - state.length;
4030
+/*
4031
+ zmemcpy(state->head->extra + len, next,
4032
+ len + copy > state->head->extra_max ?
4033
+ state->head->extra_max - len : copy);
4034
+*/
4035
+ state.head.extra += strm.input_data.substring(
4036
+ s.next, s.next + (len + copy > state.head.extra_max ?
4037
+ state.head.extra_max - len : copy));
4038
+
4039
+ }
4040
+ if (state.flags & 0x0200)
4041
+ state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
4042
+ s.have -= copy;
4043
+ s.next += copy;
4044
+ state.length -= copy;
4045
+ }
4046
+ if (state.length) break inf_leave;
4047
+ }
4048
+ state.length = 0;
4049
+ state.mode = NAME;
4050
+ case NAME:
4051
+ if (state.flags & 0x0800) {
4052
+ if (s.have == 0) break inf_leave;
4053
+ if (state.head !== null && state.head.name === null) {
4054
+ state.head.name = "";
4055
+ }
4056
+ copy = 0;
4057
+ // TODO end = strm.input_data.indexOf("\0", s.next);
4058
+ // TODO state.length => state.head.name.length
4059
+ do {
4060
+ len = strm.input_data.charAt(s.next + copy); copy++;
4061
+ if(len === "\0")
4062
+ break;
4063
+ if (state.head !== null &&
4064
+ state.length < state.head.name_max) {
4065
+ state.head.name += len;
4066
+ state.length++;
4067
+ }
4068
+ } while (copy < s.have);
4069
+ if (state.flags & 0x0200) {
4070
+ state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
4071
+ }
4072
+ s.have -= copy;
4073
+ s.next += copy;
4074
+ if (len !== "\0") break inf_leave;
4075
+ }
4076
+ else if (state.head !== null)
4077
+ state.head.name = null;
4078
+ state.length = 0;
4079
+ state.mode = COMMENT;
4080
+ case COMMENT:
4081
+ if (state.flags & 0x1000) {
4082
+ if (s.have == 0) break inf_leave;
4083
+ copy = 0;
4084
+ if (state.head !== null && state.head.comment === null) {
4085
+ state.head.comment = "";
4086
+ }
4087
+ // TODO end = strm.input_data.indexOf("\0", s.next);
4088
+ // TODO state.length => state.head.comment.length
4089
+ do {
4090
+ len = strm.input_data.charAt(s.next + copy); copy++;
4091
+ if(len === "\0")
4092
+ break;
4093
+ if (state.head !== null &&
4094
+ state.length < state.head.comm_max) {
4095
+ state.head.comment += len;
4096
+ state.length++;
4097
+ }
4098
+ } while (copy < s.have);
4099
+ if (state.flags & 0x0200)
4100
+ state.check = strm.checksum_function(state.check, strm.input_data, s.next, copy);
4101
+ s.have -= copy;
4102
+ s.next += copy;
4103
+ if (len !== "\0") break inf_leave;
4104
+ }
4105
+ else if (state.head !== null)
4106
+ state.head.comment = null;
4107
+ state.mode = HCRC;
4108
+ case HCRC:
4109
+ if (state.flags & 0x0200) {
4110
+ if(!NEEDBITS(s, 16)) break inf_leave;
4111
+ if (s.hold != (state.check & 0xffff)) {
4112
+ strm.msg = "header crc mismatch";
4113
+ state.mode = BAD;
4114
+ break;
4115
+ }
4116
+ INITBITS(s);
4117
+ }
4118
+ if (state.head !== null) {
4119
+ state.head.hcrc = (state.flags >>> 9) & 1;
4120
+ state.head.done = 1;
4121
+ }
4122
+ strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
4123
+ state.mode = TYPE;
4124
+ break;
4125
+//#endif
4126
+ case DICTID:
4127
+ if(!NEEDBITS(s, 32)) break inf_leave;
4128
+ strm.adler = state.check = REVERSE(s.hold);
4129
+ INITBITS(s);
4130
+ state.mode = DICT;
4131
+ case DICT:
4132
+ if (state.havedict == 0) {
4133
+ RESTORE(s);
4134
+ return ZLIB.Z_NEED_DICT;
4135
+ }
4136
+ strm.adler = state.check = strm.checksum_function(0, null, 0, 0);
4137
+ state.mode = TYPE;
4138
+ case TYPE:
4139
+ if (flush == ZLIB.Z_BLOCK || flush == ZLIB.Z_TREES) break inf_leave;
4140
+ case TYPEDO:
4141
+ if (state.last) {
4142
+ BYTEBITS(s);
4143
+ state.mode = CHECK;
4144
+ break;
4145
+ }
4146
+ if(!NEEDBITS(s, 3)) break inf_leave;
4147
+ state.last = BITS(s, 1);
4148
+ DROPBITS(s, 1);
4149
+ switch (BITS(s, 2)) {
4150
+ case 0: /* stored block */
4151
+// Tracev((stderr, "inflate: stored block%s\n",
4152
+// state->last ? " (last)" : ""));
4153
+ state.mode = STORED;
4154
+ break;
4155
+ case 1: /* fixed block */
4156
+ fixedtables(state);
4157
+// Tracev((stderr, "inflate: fixed codes block%s\n",
4158
+// state->last ? " (last)" : ""));
4159
+ state.mode = LEN_; /* decode codes */
4160
+ if (flush == ZLIB.Z_TREES) {
4161
+ DROPBITS(s, 2);
4162
+ break inf_leave;
4163
+ }
4164
+ break;
4165
+ case 2: /* dynamic block */
4166
+// Tracev((stderr, "inflate: dynamic codes block%s\n",
4167
+// state->last ? " (last)" : ""));
4168
+ state.mode = TABLE;
4169
+ break;
4170
+ case 3:
4171
+ strm.msg = 'invalid block type';
4172
+ state.mode = BAD;
4173
+ }
4174
+ DROPBITS(s, 2);
4175
+ break;
4176
+ case STORED:
4177
+ BYTEBITS(s); /* go to byte boundary */
4178
+ if(!NEEDBITS(s, 32)) break inf_leave;
4179
+ if ((s.hold & 0xffff) != (((s.hold >>> 16) & 0xffff) ^ 0xffff)) {
4180
+ strm.msg = 'invalid stored block lengths';
4181
+ state.mode = BAD;
4182
+ break;
4183
+ }
4184
+ state.length = s.hold & 0xffff;
4185
+// Tracev((stderr, "inflate: stored length %u\n",
4186
+// state->length));
4187
+ INITBITS(s);
4188
+ state.mode = COPY_;
4189
+ if (flush == ZLIB.Z_TREES) break inf_leave;
4190
+ case COPY_:
4191
+ state.mode = COPY;
4192
+ case COPY:
4193
+ copy = state.length;
4194
+ if (copy) {
4195
+ if (copy > s.have) copy = s.have;
4196
+ if (copy > s.left) copy = s.left;
4197
+ if (copy == 0) break inf_leave;
4198
+ strm.output_data += strm.input_data.substring(s.next, s.next + copy);
4199
+ strm.next_out += copy;
4200
+ s.have -= copy;
4201
+ s.next += copy;
4202
+ s.left -= copy;
4203
+ state.length -= copy;
4204
+ break;
4205
+ }
4206
+// Tracev((stderr, "inflate: stored end\n"));
4207
+ state.mode = TYPE;
4208
+ break;
4209
+ case TABLE:
4210
+ if(!NEEDBITS(s, 14)) break inf_leave;
4211
+ state.nlen = BITS(s, 5) + 257;
4212
+ DROPBITS(s, 5);
4213
+ state.ndist = BITS(s, 5) + 1;
4214
+ DROPBITS(s, 5);
4215
+ state.ncode = BITS(s, 4) + 4;
4216
+ DROPBITS(s, 4);
4217
+//#ifndef PKZIP_BUG_WORKAROUND
4218
+ if (state.nlen > 286 || state.ndist > 30) {
4219
+ strm.msg = 'too many length or distance symbols';
4220
+ state.mode = BAD;
4221
+ break;
4222
+ }
4223
+//#endif
4224
+// Tracev((stderr, "inflate: table sizes ok\n"));
4225
+ state.have = 0;
4226
+ state.mode = LENLENS;
4227
+ case LENLENS:
4228
+ while (state.have < state.ncode) {
4229
+ if(!NEEDBITS(s, 3)) break inf_leave;
4230
+ var tmp = BITS(s, 3);
4231
+ state.lens[inflate_order[state.have++]] = tmp;
4232
+ DROPBITS(s, 3);
4233
+ }
4234
+ while (state.have < 19)
4235
+ state.lens[inflate_order[state.have++]] = 0;
4236
+ state.next = 0;
4237
+ state.lencode = 0;
4238
+ state.lenbits = 7;
4239
+
4240
+// ret = inflate_table(CODES, state->lens, 19, &(state->next),
4241
+// &(state->lenbits), state->work);
4242
+ ret = inflate_table(state, CODES);
4243
+
4244
+ if (ret) {
4245
+ strm.msg = 'invalid code lengths set';
4246
+ state.mode = BAD;
4247
+ break;
4248
+ }
4249
+// Tracev((stderr, "inflate: code lengths ok\n"));
4250
+ state.have = 0;
4251
+ state.mode = CODELENS;
4252
+ case CODELENS:
4253
+ while (state.have < state.nlen + state.ndist) {
4254
+ for (;;) {
4255
+ here = state.codes[state.lencode + BITS(s, state.lenbits)];
4256
+ if (here.bits <= s.bits) break;
4257
+ if(!PULLBYTE(s)) break inf_leave;
4258
+ }
4259
+ if (here.val < 16) {
4260
+ DROPBITS(s, here.bits);
4261
+ state.lens[state.have++] = here.val;
4262
+ }
4263
+ else {
4264
+ if (here.val == 16) {
4265
+ if(!NEEDBITS(s, here.bits + 2)) break inf_leave;
4266
+ DROPBITS(s, here.bits);
4267
+ if (state.have == 0) {
4268
+ strm.msg = 'invalid bit length repeat';
4269
+ state.mode = BAD;
4270
+ break;
4271
+ }
4272
+ len = state.lens[state.have - 1];
4273
+ copy = 3 + BITS(s, 2);
4274
+ DROPBITS(s, 2);
4275
+ }
4276
+ else if (here.val == 17) {
4277
+ if(!NEEDBITS(s, here.bits + 3)) break inf_leave;
4278
+ DROPBITS(s, here.bits);
4279
+ len = 0;
4280
+ copy = 3 + BITS(s, 3);
4281
+ DROPBITS(s, 3);
4282
+ }
4283
+ else {
4284
+ if(!NEEDBITS(s, here.bits + 7)) break inf_leave;
4285
+ DROPBITS(s, here.bits);
4286
+ len = 0;
4287
+ copy = 11 + BITS(s, 7);
4288
+ DROPBITS(s, 7);
4289
+ }
4290
+ if (state.have + copy > state.nlen + state.ndist) {
4291
+ strm.msg = 'invalid bit length repeat';
4292
+ state.mode = BAD;
4293
+ break;
4294
+ }
4295
+ while (copy--)
4296
+ state.lens[state.have++] = len;
4297
+ }
4298
+ }
4299
+
4300
+ /* handle error breaks in while */
4301
+ if (state.mode == BAD) break;
4302
+
4303
+ /* check for end-of-block code (better have one) */
4304
+ if (state.lens[256] == 0) {
4305
+ strm.msg = 'invalid code -- missing end-of-block';
4306
+ state.mode = BAD;
4307
+ break;
4308
+ }
4309
+
4310
+ /* build code tables -- note: do not change the lenbits or distbits
4311
+ values here (9 and 6) without reading the comments in inftrees.h
4312
+ concerning the ENOUGH constants, which depend on those values */
4313
+ state.next = 0;
4314
+ state.lencode = state.next;
4315
+ state.lenbits = 9;
4316
+// ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
4317
+// &(state->lenbits), state->work);
4318
+ ret = inflate_table(state, LENS);
4319
+ if (ret) {
4320
+ strm.msg = 'invalid literal/lengths set';
4321
+ state.mode = BAD;
4322
+ break;
4323
+ }
4324
+ state.distcode = state.next;
4325
+ state.distbits = 6;
4326
+// ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next),
4327
+// &(state->distbits), state->work);
4328
+ ret = inflate_table(state, DISTS);
4329
+ if (ret) {
4330
+ strm.msg = 'invalid distances set';
4331
+ state.mode = BAD;
4332
+ break;
4333
+ }
4334
+// Tracev((stderr, "inflate: codes ok\n"));
4335
+ state.mode = LEN_;
4336
+ if (flush == ZLIB.Z_TREES) break inf_leave;
4337
+ case LEN_:
4338
+ state.mode = LEN;
4339
+ case LEN:
4340
+ if (s.have >= 6 && s.left >= 258) {
4341
+ RESTORE(s);
4342
+ inflate_fast(strm, out);
4343
+ LOAD(strm, s);
4344
+ if (state.mode == TYPE)
4345
+ state.back = -1;
4346
+ break;
4347
+ }
4348
+ state.back = 0;
4349
+ for (;;) {
4350
+ here = state.codes[state.lencode + BITS(s, state.lenbits)];
4351
+ if (here.bits <= s.bits) break;
4352
+ if(!PULLBYTE(s)) break inf_leave;
4353
+ }
4354
+ if (here.op && (here.op & 0xf0) == 0) {
4355
+ last = here;
4356
+ for (;;) {
4357
+ here = state.codes[state.lencode + last.val +
4358
+ (BITS(s, last.bits + last.op) >>> last.bits)];
4359
+ if (last.bits + here.bits <= s.bits) break;
4360
+ if(!PULLBYTE(s)) break inf_leave;
4361
+ }
4362
+ DROPBITS(s, last.bits);
4363
+ state.back += last.bits;
4364
+ }
4365
+ DROPBITS(s, here.bits);
4366
+ state.back += here.bits;
4367
+ state.length = here.val;
4368
+ if (here.op == 0) {
4369
+// Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
4370
+// "inflate: literal '%c'\n" :
4371
+// "inflate: literal 0x%02x\n", here.val));
4372
+ state.mode = LIT;
4373
+ break;
4374
+ }
4375
+ if (here.op & 32) {
4376
+// Tracevv((stderr, "inflate: end of block\n"));
4377
+ state.back = -1;
4378
+ state.mode = TYPE;
4379
+ break;
4380
+ }
4381
+ if (here.op & 64) {
4382
+ strm.msg = 'invalid literal/length code';
4383
+ state.mode = BAD;
4384
+ break;
4385
+ }
4386
+ state.extra = here.op & 15;
4387
+ state.mode = LENEXT;
4388
+ case LENEXT:
4389
+ if (state.extra) {
4390
+ if(!NEEDBITS(s, state.extra)) break inf_leave;
4391
+ state.length += BITS(s, state.extra);
4392
+ DROPBITS(s, state.extra);
4393
+ state.back += state.extra;
4394
+ }
4395
+ //Tracevv((stderr, "inflate: length %u\n", state->length));
4396
+ state.was = state.length;
4397
+ state.mode = DIST;
4398
+ case DIST:
4399
+ for (;;) {
4400
+ here = state.codes[state.distcode + BITS(s, state.distbits)];
4401
+ if (here.bits <= s.bits) break;
4402
+ if(!PULLBYTE(s)) break inf_leave;
4403
+ }
4404
+ if ((here.op & 0xf0) == 0) {
4405
+ last = here;
4406
+ for (;;) {
4407
+ here = state.codes[state.distcode + last.val +
4408
+ (BITS(s, last.bits + last.op) >>> last.bits)];
4409
+ if ((last.bits + here.bits) <= s.bits) break;
4410
+ if(!PULLBYTE(s)) break inf_leave;
4411
+ }
4412
+ DROPBITS(s, last.bits);
4413
+ state.back += last.bits;
4414
+ }
4415
+ DROPBITS(s, here.bits);
4416
+ state.back += here.bits;
4417
+ if (here.op & 64) {
4418
+ strm.msg = 'invalid distance code';
4419
+ state.mode = BAD;
4420
+ break;
4421
+ }
4422
+ state.offset = here.val;
4423
+ state.extra = here.op & 15;
4424
+ state.mode = DISTEXT;
4425
+ case DISTEXT:
4426
+ if (state.extra) {
4427
+ if(!NEEDBITS(s, state.extra)) break inf_leave;
4428
+ state.offset += BITS(s, state.extra);
4429
+ DROPBITS(s, state.extra);
4430
+ state.back += state.extra;
4431
+ }
4432
+//NOSPRT #ifdef INFLATE_STRICT
4433
+// if (state->offset > state->dmax) {
4434
+// strm->msg = (char *)"invalid distance too far back";
4435
+// state->mode = BAD;
4436
+// break;
4437
+// }
4438
+//#endif
4439
+// Tracevv((stderr, "inflate: distance %u\n", state->offset));
4440
+ state.mode = MATCH;
4441
+ case MATCH:
4442
+ if (s.left == 0) break inf_leave;
4443
+ copy = out - s.left;
4444
+ if (state.offset > copy) { /* copy from window */
4445
+ copy = state.offset - copy;
4446
+ if (copy > state.whave) {
4447
+ if (state.sane) {
4448
+ strm.msg = 'invalid distance too far back';
4449
+ state.mode = BAD;
4450
+ break;
4451
+ }
4452
+//NOSPRT #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
4453
+// Trace((stderr, "inflate.c too far\n"));
4454
+// copy -= state->whave;
4455
+// if (copy > state->length) copy = state->length;
4456
+// if (copy > left) copy = left;
4457
+// left -= copy;
4458
+// state->length -= copy;
4459
+// do {
4460
+// *put++ = 0;
4461
+// } while (--copy);
4462
+// if (state->length == 0) state->mode = LEN;
4463
+// break;
4464
+//#endif
4465
+ }
4466
+ if (copy > state.wnext) {
4467
+ copy -= state.wnext;
4468
+ // from = state->window + (state->wsize - copy);
4469
+ from_window_offset = state.wsize - copy;
4470
+ from_out_offset = -1;
4471
+ }
4472
+ else {
4473
+ // from = state->window + (state->wnext - copy);
4474
+ from_window_offset = state.wnext - copy;
4475
+ from_out_offset = -1;
4476
+ }
4477
+ if (copy > state.length) copy = state.length;
4478
+ }
4479
+ else { /* copy from output */
4480
+ // from = put - state->offset;
4481
+ from_window_offset = -1;
4482
+ from_out_offset = strm.next_out - state.offset;
4483
+ copy = state.length;
4484
+ }
4485
+ if (copy > s.left) copy = s.left;
4486
+ s.left -= copy;
4487
+ state.length -= copy;
4488
+ if( from_window_offset >= 0 ) {
4489
+ strm.output_data += state.window.substring(from_window_offset, from_window_offset + copy);
4490
+ strm.next_out += copy;
4491
+ copy = 0;
4492
+ } else {
4493
+ strm.next_out += copy;
4494
+ do {
4495
+ strm.output_data += strm.output_data.charAt(from_out_offset++);
4496
+ } while (--copy);
4497
+ }
4498
+ if (state.length == 0) state.mode = LEN;
4499
+ break;
4500
+ case LIT:
4501
+ if (s.left == 0) break inf_leave;
4502
+
4503
+ strm.output_data += String.fromCharCode(state.length);
4504
+ strm.next_out++;
4505
+ //*put++ = (unsigned char)(state->length);
4506
+
4507
+ s.left--;
4508
+ state.mode = LEN;
4509
+ break;
4510
+ case CHECK:
4511
+ if (state.wrap) {
4512
+ if(!NEEDBITS(s, 32)) break inf_leave;
4513
+ out -= s.left;
4514
+ strm.total_out += out;
4515
+ state.total += out;
4516
+ if (out)
4517
+ strm.adler = state.check =
4518
+ strm.checksum_function(state.check, strm.output_data, strm.output_data.length - out, out);
4519
+ out = s.left;
4520
+ if ((
4521
+// #ifdef GUNZIP
4522
+ state.flags ? s.hold :
4523
+//#endif
4524
+ REVERSE(s.hold)) != state.check) {
4525
+ strm.msg = "incorrect data check";
4526
+ state.mode = BAD;
4527
+ break;
4528
+ }
4529
+ INITBITS(s);
4530
+//debug("## inflate: check matches trailer\n");
4531
+// Tracev((stderr, "inflate: check matches trailer\n"));
4532
+ }
4533
+//#ifdef GUNZIP
4534
+ state.mode = LENGTH;
4535
+ case LENGTH:
4536
+ if (state.wrap && state.flags) {
4537
+ if(!NEEDBITS(s, 32)) break inf_leave;
4538
+ if (s.hold != (state.total & 0xffffffff)) {
4539
+ strm.msg = 'incorrect length check';
4540
+ state.mode = BAD;
4541
+ break;
4542
+ }
4543
+ INITBITS(s);
4544
+ //Tracev((stderr, "inflate: length matches trailer\n"));
4545
+ }
4546
+//#endif
4547
+ state.mode = DONE;
4548
+ case DONE:
4549
+ ret = ZLIB.Z_STREAM_END;
4550
+ break inf_leave;
4551
+ case BAD:
4552
+ ret = ZLIB.Z_DATA_ERROR;
4553
+ break inf_leave;
4554
+ case MEM:
4555
+ return ZLIB.Z_MEM_ERROR;
4556
+ case SYNC:
4557
+ default:
4558
+ return ZLIB.Z_STREAM_ERROR;
4559
+ } }
4560
+
4561
+ /*
4562
+ Return from inflate(), updating the total counts and the check value.
4563
+ If there was no progress during the inflate() call, return a buffer
4564
+ error. Call updatewindow() to create and/or update the window state.
4565
+ Note: a memory error from inflate() is non-recoverable.
4566
+ */
4567
+inf_leave:
4568
+ RESTORE(s);
4569
+ if (state.wsize || (out != strm.avail_out && state.mode < BAD &&
4570
+ (state.mode < CHECK || flush != ZLIB.Z_FINISH)))
4571
+ if (updatewindow(strm)) {
4572
+ state.mode = MEM;
4573
+ return ZLIB.Z_MEM_ERROR;
4574
+ }
4575
+ _in -= strm.avail_in;
4576
+ out -= strm.avail_out;
4577
+ strm.total_in += _in;
4578
+ strm.total_out += out;
4579
+ state.total += out;
4580
+ if (state.wrap && out)
4581
+ strm.adler = state.check = strm.checksum_function(state.check, strm.output_data, 0, strm.output_data.length);
4582
+ strm.data_type = state.bits + (state.last ? 64 : 0) +
4583
+ (state.mode == TYPE ? 128 : 0) +
4584
+ (state.mode == LEN_ || state.mode == COPY_ ? 256 : 0);
4585
+ if (((_in == 0 && out == 0) || flush == ZLIB.Z_FINISH) && ret == ZLIB.Z_OK)
4586
+ ret = ZLIB.Z_BUF_ERROR;
4587
+ return ret;
4588
+};
4589
+
4590
+ZLIB.inflateEnd = function(strm)
4591
+{
4592
+ var state;
4593
+ if (!strm || !strm.state )
4594
+ return ZLIB.Z_STREAM_ERROR;
4595
+ state = strm.state;
4596
+ state.window = null;
4597
+ strm.state = null;
4598
+ // Tracev((stderr, "inflate: end\n"));
4599
+ return ZLIB.Z_OK;
4600
+};
4601
+
4602
+ZLIB.z_stream.prototype.inflate = function(input_string, opts)
4603
+{
4604
+ var flush;
4605
+ var avail_out;
4606
+ var DEFAULT_BUFFER_SIZE = 16384;
4607
+
4608
+ this.input_data = input_string;
4609
+ this.next_in = getarg(opts, 'next_in', 0);
4610
+ this.avail_in = getarg(opts, 'avail_in', input_string.length - this.next_in);
4611
+
4612
+ flush = getarg(opts, 'flush', ZLIB.Z_SYNC_FLUSH);
4613
+ avail_out = getarg(opts, 'avail_out', -1);
4614
+
4615
+ var result = '';
4616
+ do {
4617
+ this.avail_out = (avail_out >= 0 ? avail_out : DEFAULT_BUFFER_SIZE);
4618
+ this.output_data = '';
4619
+ this.next_out = 0;
4620
+ this.error = ZLIB.inflate(this, flush);
4621
+ if(avail_out >= 0) {
4622
+ return this.output_data;
4623
+ }
4624
+ result += this.output_data;
4625
+ if(this.avail_out > 0) {
4626
+ break;
4627
+ }
4628
+ } while(this.error == ZLIB.Z_OK);
4629
+
4630
+ return result;
4631
+};
4632
+
4633
+ZLIB.z_stream.prototype.inflateReset = function(windowBits)
4634
+{
4635
+ return ZLIB.inflateReset(this, windowBits);
4636
+};
4637
+
4638
+}());
4639
+/* zlib-adler32.js -- JavaScript implementation for the zlib adler32.
4640
+ Version: 0.2.0
4641
+ LastModified: Apr 12 2012
4642
+ Copyright (C) 2012 Masanao Izumo <iz@onicos.co.jp>
4643
+
4644
+ API documentation
4645
+==============================================================================
4646
+Usage: adler = ZLIB.adler32(adler, buf, offset, len);
4647
+
4648
+ Update a running Adler-32 checksum with the bytes buf[offset..offset+len-1] and
4649
+ return the updated checksum. If buf is null, this function returns the
4650
+ required initial value for the checksum.
4651
+
4652
+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
4653
+ much faster.
4654
+
4655
+ Usage example:
4656
+
4657
+ var adler = ZLIB.adler32(0, null, 0, 0);
4658
+
4659
+ while (read_buffer(buffer, length) != EOF) {
4660
+ adler = ZLIB.adler32(adler, buffer, 0, length);
4661
+ }
4662
+ if (adler != original_adler) error();
4663
+
4664
+==============================================================================
4665
+Usage: adler = ZLIB.adler32_combine(adler1, adler2, len2);
4666
+
4667
+ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
4668
+ and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
4669
+ each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
4670
+ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note
4671
+ that the z_off_t type (like off_t) is a signed integer. If len2 is
4672
+ negative, the result has no meaning or utility.
4673
+*/
4674
+
4675
+if( typeof ZLIB === 'undefined' ) {
4676
+ alert('ZLIB is not defined. SRC zlib.js before zlib-adler32.js')
4677
+}
4678
+
4679
+(function() {
4680
+
4681
+/* adler32.c -- compute the Adler-32 checksum of a data stream
4682
+ * Copyright (C) 1995-2011 Mark Adler
4683
+ * For conditions of distribution and use, see copyright notice in zlib.h
4684
+ */
4685
+
4686
+var BASE = 65521; /* largest prime smaller than 65536 */
4687
+var NMAX = 5552;
4688
+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
4689
+
4690
+/* ========================================================================= */
4691
+function adler32_string(adler, buf, offset, len)
4692
+{
4693
+ var sum2;
4694
+ var n;
4695
+
4696
+ /* split Adler-32 into component sums */
4697
+ sum2 = (adler >>> 16) & 0xffff;
4698
+ adler &= 0xffff;
4699
+
4700
+ /* in case user likes doing a byte at a time, keep it fast */
4701
+ if (len == 1) {
4702
+ adler += buf.charCodeAt(offset) & 0xff;
4703
+ if (adler >= BASE)
4704
+ adler -= BASE;
4705
+ sum2 += adler;
4706
+ if (sum2 >= BASE)
4707
+ sum2 -= BASE;
4708
+ return adler | (sum2 << 16);
4709
+ }
4710
+
4711
+ /* initial Adler-32 value (deferred check for len == 1 speed) */
4712
+ if (buf === null)
4713
+ return 1;
4714
+
4715
+ /* in case short lengths are provided, keep it somewhat fast */
4716
+ if (len < 16) {
4717
+ while (len--) {
4718
+ adler += buf.charCodeAt(offset++) & 0xff;
4719
+ sum2 += adler;
4720
+ }
4721
+ if (adler >= BASE)
4722
+ adler -= BASE;
4723
+ sum2 %= BASE; /* only added so many BASE's */
4724
+ return adler | (sum2 << 16);
4725
+ }
4726
+
4727
+ /* do length NMAX blocks -- requires just one modulo operation */
4728
+ while (len >= NMAX) {
4729
+ len -= NMAX;
4730
+ n = NMAX >> 4; /* NMAX is divisible by 16 */
4731
+ do {
4732
+ /* 16 sums unrolled */
4733
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4734
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4735
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4736
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4737
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4738
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4739
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4740
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4741
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4742
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4743
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4744
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4745
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4746
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4747
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4748
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4749
+ } while (--n);
4750
+ adler %= BASE;
4751
+ sum2 %= BASE;
4752
+ }
4753
+
4754
+ /* do remaining bytes (less than NMAX, still just one modulo) */
4755
+ if (len) { /* avoid modulos if none remaining */
4756
+ while (len >= 16) {
4757
+ len -= 16;
4758
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4759
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4760
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4761
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4762
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4763
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4764
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4765
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4766
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4767
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4768
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4769
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4770
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4771
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4772
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4773
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4774
+ }
4775
+ while (len--) {
4776
+ adler += buf.charCodeAt(offset++) & 0xff; sum2 += adler;
4777
+ }
4778
+ adler %= BASE;
4779
+ sum2 %= BASE;
4780
+ }
4781
+
4782
+ /* return recombined sums */
4783
+ return adler | (sum2 << 16);
4784
+}
4785
+
4786
+/* ========================================================================= */
4787
+function adler32_array(adler, buf, offset, len)
4788
+{
4789
+ var sum2;
4790
+ var n;
4791
+
4792
+ /* split Adler-32 into component sums */
4793
+ sum2 = (adler >>> 16) & 0xffff;
4794
+ adler &= 0xffff;
4795
+
4796
+ /* in case user likes doing a byte at a time, keep it fast */
4797
+ if (len == 1) {
4798
+ adler += buf[offset];
4799
+ if (adler >= BASE)
4800
+ adler -= BASE;
4801
+ sum2 += adler;
4802
+ if (sum2 >= BASE)
4803
+ sum2 -= BASE;
4804
+ return adler | (sum2 << 16);
4805
+ }
4806
+
4807
+ /* initial Adler-32 value (deferred check for len == 1 speed) */
4808
+ if (buf === null)
4809
+ return 1;
4810
+
4811
+ /* in case short lengths are provided, keep it somewhat fast */
4812
+ if (len < 16) {
4813
+ while (len--) {
4814
+ adler += buf[offset++];
4815
+ sum2 += adler;
4816
+ }
4817
+ if (adler >= BASE)
4818
+ adler -= BASE;
4819
+ sum2 %= BASE; /* only added so many BASE's */
4820
+ return adler | (sum2 << 16);
4821
+ }
4822
+
4823
+ /* do length NMAX blocks -- requires just one modulo operation */
4824
+ while (len >= NMAX) {
4825
+ len -= NMAX;
4826
+ n = NMAX >> 4; /* NMAX is divisible by 16 */
4827
+ do {
4828
+ /* 16 sums unrolled */
4829
+ adler += buf[offset++]; sum2 += adler;
4830
+ adler += buf[offset++]; sum2 += adler;
4831
+ adler += buf[offset++]; sum2 += adler;
4832
+ adler += buf[offset++]; sum2 += adler;
4833
+ adler += buf[offset++]; sum2 += adler;
4834
+ adler += buf[offset++]; sum2 += adler;
4835
+ adler += buf[offset++]; sum2 += adler;
4836
+ adler += buf[offset++]; sum2 += adler;
4837
+ adler += buf[offset++]; sum2 += adler;
4838
+ adler += buf[offset++]; sum2 += adler;
4839
+ adler += buf[offset++]; sum2 += adler;
4840
+ adler += buf[offset++]; sum2 += adler;
4841
+ adler += buf[offset++]; sum2 += adler;
4842
+ adler += buf[offset++]; sum2 += adler;
4843
+ adler += buf[offset++]; sum2 += adler;
4844
+ adler += buf[offset++]; sum2 += adler;
4845
+ } while (--n);
4846
+ adler %= BASE;
4847
+ sum2 %= BASE;
4848
+ }
4849
+
4850
+ /* do remaining bytes (less than NMAX, still just one modulo) */
4851
+ if (len) { /* avoid modulos if none remaining */
4852
+ while (len >= 16) {
4853
+ len -= 16;
4854
+ adler += buf[offset++]; sum2 += adler;
4855
+ adler += buf[offset++]; sum2 += adler;
4856
+ adler += buf[offset++]; sum2 += adler;
4857
+ adler += buf[offset++]; sum2 += adler;
4858
+ adler += buf[offset++]; sum2 += adler;
4859
+ adler += buf[offset++]; sum2 += adler;
4860
+ adler += buf[offset++]; sum2 += adler;
4861
+ adler += buf[offset++]; sum2 += adler;
4862
+ adler += buf[offset++]; sum2 += adler;
4863
+ adler += buf[offset++]; sum2 += adler;
4864
+ adler += buf[offset++]; sum2 += adler;
4865
+ adler += buf[offset++]; sum2 += adler;
4866
+ adler += buf[offset++]; sum2 += adler;
4867
+ adler += buf[offset++]; sum2 += adler;
4868
+ adler += buf[offset++]; sum2 += adler;
4869
+ adler += buf[offset++]; sum2 += adler;
4870
+ }
4871
+ while (len--) {
4872
+ adler += buf[offset++]; sum2 += adler;
4873
+ }
4874
+ adler %= BASE;
4875
+ sum2 %= BASE;
4876
+ }
4877
+
4878
+ /* return recombined sums */
4879
+ return adler | (sum2 << 16);
4880
+}
4881
+
4882
+/* ========================================================================= */
4883
+ZLIB.adler32 = function(adler, buf, offset, len)
4884
+{
4885
+ if(typeof buf === 'string') {
4886
+ return adler32_string(adler, buf, offset, len);
4887
+ } else {
4888
+ return adler32_array(adler, buf, offset, len);
4889
+ }
4890
+};
4891
+
4892
+ZLIB.adler32_combine = function(adler1, adler2, len2)
4893
+{
4894
+ var sum1;
4895
+ var sum2;
4896
+ var rem;
4897
+
4898
+ /* for negative len, return invalid adler32 as a clue for debugging */
4899
+ if (len2 < 0)
4900
+ return 0xffffffff;
4901
+
4902
+ /* the derivation of this formula is left as an exercise for the reader */
4903
+ len2 %= BASE; /* assumes len2 >= 0 */
4904
+ rem = len2;
4905
+ sum1 = adler1 & 0xffff;
4906
+ sum2 = rem * sum1;
4907
+ sum2 %= BASE;
4908
+ sum1 += (adler2 & 0xffff) + BASE - 1;
4909
+ sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
4910
+ if (sum1 >= BASE) sum1 -= BASE;
4911
+ if (sum1 >= BASE) sum1 -= BASE;
4912
+ if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);
4913
+ if (sum2 >= BASE) sum2 -= BASE;
4914
+ return sum1 | (sum2 << 16);
4915
+}
4916
+
4917
+}());
4918
+/* zlib-adler32.js -- JavaScript implementation for the zlib crc32.
4919
+ Version: 0.2.0
4920
+ LastModified: Apr 12 2012
4921
+ Copyright (C) 2012 Masanao Izumo <iz@onicos.co.jp>
4922
+
4923
+ API documentation
4924
+==============================================================================
4925
+Usage: crc = ZLIB.crc32(crc, buf, offset, len);
4926
+
4927
+ Update a running CRC-32 with the bytes buf[offset..offset+len-1] and return the
4928
+ updated CRC-32. If buf is null, this function returns the required
4929
+ initial value for the for the crc. Pre- and post-conditioning (one's
4930
+ complement) is performed within this function so it shouldn't be done by the
4931
+ application.
4932
+
4933
+ Usage example:
4934
+
4935
+ var crc = ZLIB.crc32(0, null, 0, 0);
4936
+
4937
+ while (read_buffer(buffer, length) != EOF) {
4938
+ crc = ZLIB.crc32(crc, buffer, 0, length);
4939
+ }
4940
+ if (crc != original_crc) error();
4941
+
4942
+==============================================================================
4943
+Usage: crc = crc32_combine(crc1, crc2, len2);
4944
+
4945
+ Combine two CRC-32 check values into one. For two sequences of bytes,
4946
+ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
4947
+ calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
4948
+ check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
4949
+ len2.
4950
+*/
4951
+
4952
+if( typeof ZLIB === 'undefined' ) {
4953
+ alert('ZLIB is not defined. SRC zlib.js before zlib-crc32.js')
4954
+}
4955
+
4956
+(function() {
4957
+
4958
+/* crc32.c -- compute the CRC-32 of a data stream
4959
+ * Copyright (C) 1995-2006, 2010, 2011 Mark Adler
4960
+ * For conditions of distribution and use, see copyright notice in zlib.h
4961
+ *
4962
+ * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
4963
+ * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
4964
+ * tables for updating the shift register in one step with three exclusive-ors
4965
+ * instead of four steps with four exclusive-ors. This results in about a
4966
+ * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
4967
+ */
4968
+
4969
+var crc_table = [
4970
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
4971
+ 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
4972
+ 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
4973
+ 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
4974
+ 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
4975
+ 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
4976
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
4977
+ 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
4978
+ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
4979
+ 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
4980
+ 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
4981
+ 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
4982
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
4983
+ 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
4984
+ 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
4985
+ 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
4986
+ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
4987
+ 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
4988
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
4989
+ 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
4990
+ 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
4991
+ 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
4992
+ 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
4993
+ 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
4994
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
4995
+ 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
4996
+ 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
4997
+ 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
This file is too large to show in full.
views/default.handlebars
+10
-14
@@ -1036,7 +1036,8 @@
1036
var sessionActivity = Date.now();
1037
var updateSessionTimer = null;
1038
var pluginHandlerBuilder = {{{pluginHandler}}};
1039
- var pluginHandler = new pluginHandlerBuilder();
1039
+ var pluginHandler = null;
1040
+ if (pluginHandlerBuilder != null) { pluginHandler = new pluginHandlerBuilder(); }
1041
1042
// Console Message Display Timers
1043
var p11DeskConsoleMsgTimer = null;
@@ -2329,14 +2330,9 @@
2330
break;
2331
}
2332
case 'plugin': {
2332
- if (typeof message.plugin == 'string') {
2333
- try {
2334
- pluginHandler[message.plugin][message.method](server, message);
2335
- } catch (e) {
2336
- console.log('Error loading plugin handler ('+ e + ')');
2337
- }
2338
- }
2339
- break;
2333
+ if ((pluginHandler == null) || (typeof message.plugin != 'string')) break;
2334
+ try { pluginHandler[message.plugin][message.method](server, message); } catch (e) { console.log('Error loading plugin handler ('+ e + ')'); }
2335
+ break;
2336
}
2337
default:
2338
//console.log('Unknown message.action', message.action);
@@ -4390,6 +4386,7 @@
4386
QV('MainDevFiles', ((mesh.mtype == 2) && ((node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 4) != 0))) && (meshrights & 8) && fileAccess);
4387
QV('MainDevAmt', (node.intelamt != null) && ((node.intelamt.state == 2) || (node.conn & 2)) && (meshrights & 8) && amtAccess);
4388
QV('MainDevConsole', (consoleRights && (mesh.mtype == 2) && ((node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 8) != 0))) && (meshrights & 8));
4389
+ QV('MainDevPlugins', pluginHandler != null);
4390
QV('p15uploadCore', (node.agent != null) && (node.agent.caps != null) && ((node.agent.caps & 16) != 0));
4391
QH('p15coreName', ((node.agent != null) && (node.agent.core != null))?node.agent.core:'');
4392
@@ -4435,7 +4432,8 @@
4432
p12clearConsoleMsg();
4433
p13clearConsoleMsg();
4434
4438
- pluginHandler.onDeviceRefeshEnd(nodeid, panel, refresh, event);
4435
+ // Device refresh plugin handler
4436
+ if (pluginHandler != null) { pluginHandler.onDeviceRefeshEnd(nodeid, panel, refresh, event); }
4437
}
4438
setupDesktop(); // Always refresh the desktop, even if we are on the same device, we need to do some canvas switching.
4439
if (!panel) panel = 10;
@@ -9168,16 +9166,14 @@
9166
9167
// If we are going to panel 0 in "full screen mode", hide the left bar.
9168
QV('topbar', x != 0);
9171
- if ((x == 0) && (webPageFullScreen)) {
9172
- QC('body').add("arg_hide");
9173
- }
9169
+ if ((x == 0) && (webPageFullScreen)) { QC('body').add("arg_hide"); }
9170
9171
QV('MainSubMenuSpan', x >= 10 && x < 20);
9172
QV('UserDummyMenuSpan', (x < 10) && (x != 6) && webPageFullScreen);
9173
QV('MeshSubMenuSpan', x >= 20 && x < 30);
9174
QV('UserSubMenuSpan', x >= 30 && x < 40);
9175
QV('ServerSubMenuSpan', x == 6 || x == 115 || x == 40 || x == 41);
9180
- var panels = { 10: 'MainDev', 11: 'MainDevDesktop', 12: 'MainDevTerminal', 13: 'MainDevFiles', 14: 'MainDevAmt', 15: 'MainDevConsole', 16: 'MainDevEvents', 17: 'MainDevInfo', 20: 'MeshGeneral', 30: 'UserGeneral', 31: 'UserEvents', 6: 'ServerGeneral', 40: 'ServerStats', 41: 'ServerTrace', 19: 'Plugins', 115: 'ServerConsole' };
9176
+ var panels = { 10: 'MainDev', 11: 'MainDevDesktop', 12: 'MainDevTerminal', 13: 'MainDevFiles', 14: 'MainDevAmt', 15: 'MainDevConsole', 16: 'MainDevEvents', 17: 'MainDevInfo', 19: 'MainDevPlugins', 20: 'MeshGeneral', 30: 'UserGeneral', 31: 'UserEvents', 6: 'ServerGeneral', 40: 'ServerStats', 41: 'ServerTrace', 115: 'ServerConsole' };
9177
for (var i in panels) {
9178
QC(panels[i]).remove('style3x');
9179
QC(panels[i]).remove('style3sel');
webserver.js
+2
-4
@@ -1517,14 +1517,12 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
1517
1518
// Clean up the U2F challenge if needed
1519
if (req.session.u2fchallenge) { delete req.session.u2fchallenge; };
1520
-
1521
- var pluginHandler = require('./pluginHandler.js').pluginHandler(parent);
1522
-
1520
+
1521
// Fetch the web state
1522
parent.debug('web', 'handleRootRequestEx: success.');
1523
obj.db.Get('ws' + user._id, function (err, states) {
1524
var webstate = (states.length == 1) ? states[0].state : '';
1527
- res.render(getRenderPage('default', req), { authCookie: authCookie, viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, extitle: encodeURIComponent(domain.title), extitle2: encodeURIComponent(domain.title2), domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: obj.getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, sessiontime: args.sessiontime, mpspass: args.mpspass, passRequirements: passRequirements, webcerthash: Buffer.from(obj.webCertificateFullHashs[domain.id], 'binary').toString('base64').replace(/\+/g, '@').replace(/\//g, '$'), footer: (domain.footer == null) ? '' : domain.footer, webstate: encodeURIComponent(webstate), pluginHandler: pluginHandler.prepExports() });
1525
+ res.render(getRenderPage('default', req), { authCookie: authCookie, viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, extitle: encodeURIComponent(domain.title), extitle2: encodeURIComponent(domain.title2), domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: obj.getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, sessiontime: args.sessiontime, mpspass: args.mpspass, passRequirements: passRequirements, webcerthash: Buffer.from(obj.webCertificateFullHashs[domain.id], 'binary').toString('base64').replace(/\+/g, '@').replace(/\//g, '$'), footer: (domain.footer == null) ? '' : domain.footer, webstate: encodeURIComponent(webstate), pluginHandler: (parent.pluginHandler == null)?'null':parent.pluginHandler.prepExports() });
1526
});
1527
} else {
1528
// Send back the login application