More work on user device rights.

Ylian Saint-Hilaire committed Mar 29, 2020 at 22:40 UTC 5f762550d20dcd6203aa1cdcc96e5957edae548a
7 files changed +1703 -1572
agents/meshcore.js
+1 -1
@@ -794,7 +794,7 @@ function createMeshCore(agent) {
794 if (process.platform != 'win32') break;
795 var p = require('user-sessions').enumerateUsers();
796 p.sessionid = data.sessionid;
797 - p.then(function (u) { mesh.SendCommand({ action: 'msg', type: 'userSessions', sessionid: u.sessionid, data: u }); });
797 + p.then(function (u) { mesh.SendCommand({ action: 'msg', type: 'userSessions', sessionid: data.sessionid, data: u }); });
798 break;
799 }
800 default:
db.js
+38 -3
@@ -803,7 +803,17 @@ module.exports.CreateDB = function (parent, func) {
803 obj.GetAll = function (func) { sqlDbQuery('SELECT domain, doc FROM meshcentral.main', null, func); }
804 obj.GetHash = function (id, func) { sqlDbQuery('SELECT doc FROM meshcentral.main WHERE id = ?', [id], func); }
805 obj.GetAllTypeNoTypeField = function (type, domain, func) { sqlDbQuery('SELECT doc FROM meshcentral.main WHERE type = ? AND domain = ?', [type, domain], function (err, docs) { if (err == null) { for (var i in docs) { delete docs[i].type } } func(err, docs); }); };
806 - obj.GetAllTypeNoTypeFieldMeshFiltered = function (meshes, domain, type, id, func) { if (id && (id != '')) { sqlDbQuery('SELECT doc FROM meshcentral.main WHERE id = ? AND type = ? AND domain = ? AND extra IN (?)', [id, type, domain, meshes], function (err, docs) { if (err == null) { for (var i in docs) { delete docs[i].type } } func(err, docs); }); } else { sqlDbQuery('SELECT doc FROM meshcentral.main WHERE type = ? AND domain = ? AND extra IN (?)', [type, domain, meshes], function (err, docs) { if (err == null) { for (var i in docs) { delete docs[i].type } } func(err, docs); }); } };
806 + obj.GetAllTypeNoTypeFieldMeshFiltered = function (meshes, extrasids, domain, type, id, func) {
807 + if (id && (id != '')) {
808 + sqlDbQuery('SELECT doc FROM meshcentral.main WHERE id = ? AND type = ? AND domain = ? AND extra IN (?)', [id, type, domain, meshes], function (err, docs) { if (err == null) { for (var i in docs) { delete docs[i].type } } func(err, docs); });
809 + } else {
810 + if (extrasids == null) {
811 + sqlDbQuery('SELECT doc FROM meshcentral.main WHERE type = ? AND domain = ? AND extra IN (?)', [type, domain, meshes], function (err, docs) { if (err == null) { for (var i in docs) { delete docs[i].type } } func(err, docs); });
812 + } else {
813 + sqlDbQuery('SELECT doc FROM meshcentral.main WHERE type = ? AND domain = ? AND (extra IN (?) OR id IN (?))', [type, domain, meshes, extrasids], function (err, docs) { if (err == null) { for (var i in docs) { delete docs[i].type } } func(err, docs); });
814 + }
815 + }
816 + };
817 obj.GetAllType = function (type, func) { sqlDbQuery('SELECT doc FROM meshcentral.main WHERE type = ?', [type], func); }
818 obj.GetAllIdsOfType = function (ids, domain, type, func) { sqlDbQuery('SELECT doc FROM meshcentral.main WHERE id IN (?) AND domain = ? AND type = ?', [ids, domain, type], func); }
819 obj.GetUserWithEmail = function (domain, email, func) { sqlDbQuery('SELECT doc FROM meshcentral.main WHERE domain = ? AND extra = ?', [domain, 'email/' + email], func); }
@@ -952,7 +962,17 @@ module.exports.CreateDB = function (parent, func) {
962 obj.GetAll = function (func) { obj.file.find({}).toArray(function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
963 obj.GetHash = function (id, func) { obj.file.find({ _id: id }).project({ _id: 0, hash: 1 }).toArray(function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
964 obj.GetAllTypeNoTypeField = function (type, domain, func) { obj.file.find({ type: type, domain: domain }).project({ type: 0 }).toArray(function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
955 - obj.GetAllTypeNoTypeFieldMeshFiltered = function (meshes, domain, type, id, func) { var x = { type: type, domain: domain, meshid: { $in: meshes } }; if (id) { x._id = id; } obj.file.find(x, { type: 0 }).toArray(function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
965 + obj.GetAllTypeNoTypeFieldMeshFiltered = function (meshes, extrasids, domain, type, id, func) {
966 + if (extrasids == null) {
967 + var x = { type: type, domain: domain, meshid: { $in: meshes } };
968 + if (id) { x._id = id; }
969 + obj.file.find(x, { type: 0 }).toArray(function (err, docs) { func(err, performTypedRecordDecrypt(docs)); });
970 + } else {
971 + var x = { type: type, domain: domain, $or: [ { meshid: { $in: meshes } }, { _id: { $in: extrasids } } ] };
972 + if (id) { x._id = id; }
973 + obj.file.find(x, { type: 0 }).toArray(function (err, docs) { func(err, performTypedRecordDecrypt(docs)); });
974 + }
975 + };
976 obj.GetAllType = function (type, func) { obj.file.find({ type: type }).toArray(function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
977 obj.GetAllIdsOfType = function (ids, domain, type, func) { obj.file.find({ type: type, domain: domain, _id: { $in: ids } }).toArray(function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
978 obj.GetUserWithEmail = function (domain, email, func) { obj.file.find({ type: 'user', domain: domain, email: email }).project({ type: 0 }).toArray(function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
@@ -1090,7 +1110,22 @@ module.exports.CreateDB = function (parent, func) {
1110 obj.GetAll = function (func) { obj.file.find({}, function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
1111 obj.GetHash = function (id, func) { obj.file.find({ _id: id }, { _id: 0, hash: 1 }, func); };
1112 obj.GetAllTypeNoTypeField = function (type, domain, func) { obj.file.find({ type: type, domain: domain }, { type: 0 }, function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
1093 - obj.GetAllTypeNoTypeFieldMeshFiltered = function (meshes, domain, type, id, func) { var x = { type: type, domain: domain, meshid: { $in: meshes } }; if (id) { x._id = id; } obj.file.find(x, { type: 0 }, function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
1113 + //obj.GetAllTypeNoTypeFieldMeshFiltered = function (meshes, domain, type, id, func) {
1114 + //var x = { type: type, domain: domain, meshid: { $in: meshes } };
1115 + //if (id) { x._id = id; }
1116 + //obj.file.find(x, { type: 0 }, function (err, docs) { func(err, performTypedRecordDecrypt(docs)); });
1117 + //};
1118 + obj.GetAllTypeNoTypeFieldMeshFiltered = function (meshes, extrasids, domain, type, id, func) {
1119 + if (extrasids == null) {
1120 + var x = { type: type, domain: domain, meshid: { $in: meshes } };
1121 + if (id) { x._id = id; }
1122 + obj.file.find(x, { type: 0 }, function (err, docs) { func(err, performTypedRecordDecrypt(docs)); });
1123 + } else {
1124 + var x = { type: type, domain: domain, $or: [{ meshid: { $in: meshes } }, { _id: { $in: extrasids } }] };
1125 + if (id) { x._id = id; }
1126 + obj.file.find(x, { type: 0 }, function (err, docs) { func(err, performTypedRecordDecrypt(docs)); });
1127 + }
1128 + };
1129 obj.GetAllType = function (type, func) { obj.file.find({ type: type }, function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
1130 obj.GetAllIdsOfType = function (ids, domain, type, func) { obj.file.find({ type: type, domain: domain, _id: { $in: ids } }, function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
1131 obj.GetUserWithEmail = function (domain, email, func) { obj.file.find({ type: 'user', domain: domain, email: email }, { type: 0 }, function (err, docs) { func(err, performTypedRecordDecrypt(docs)); }); };
meshcentral.js
+4 -4
@@ -1551,7 +1551,7 @@ function CreateMeshCentralServer(config, args) {
1551
1552 // Event any changes on this server only
1553 if ((newConnectivity != oldPowerState) || (newPowerState != oldPowerState)) {
1554 - obj.DispatchEvent(obj.webserver.CreateMeshDispatchTargets(meshid), obj, { action: 'nodeconnect', meshid: meshid, nodeid: nodeid, conn: newConnectivity, pwr: newPowerState, nolog: 1, nopeers: 1 });
1554 + obj.DispatchEvent(obj.webserver.CreateMeshDispatchTargets(meshid, [nodeid]), obj, { action: 'nodeconnect', meshid: meshid, nodeid: nodeid, conn: newConnectivity, pwr: newPowerState, nolog: 1, nopeers: 1 });
1555 }
1556 }
1557 };
@@ -1599,8 +1599,8 @@ function CreateMeshCentralServer(config, args) {
1599 }
1600
1601 // Event the node connection change
1602 - if (eventConnectChange == 1) { obj.DispatchEvent(obj.webserver.CreateMeshDispatchTargets(meshid), obj, { action: 'nodeconnect', meshid: meshid, nodeid: nodeid, conn: state.connectivity, pwr: state.powerState, ct: connectTime, nolog: 1, nopeers: 1 }); }
1603 - } else {
1602 + if (eventConnectChange == 1) { obj.DispatchEvent(obj.webserver.CreateMeshDispatchTargets(meshid, [nodeid]), obj, { action: 'nodeconnect', meshid: meshid, nodeid: nodeid, conn: state.connectivity, pwr: state.powerState, ct: connectTime, nolog: 1, nopeers: 1 }); }
1603 + } else {nodeid
1604 // Multi server mode
1605
1606 // Change the node connection state
@@ -1672,7 +1672,7 @@ function CreateMeshCentralServer(config, args) {
1672 }
1673
1674 // Event the node connection change
1675 - if (eventConnectChange == 1) { obj.DispatchEvent(obj.webserver.CreateMeshDispatchTargets(meshid), obj, { action: 'nodeconnect', meshid: meshid, nodeid: nodeid, conn: state.connectivity, pwr: state.powerState, nolog: 1, nopeers: 1 }); }
1675 + if (eventConnectChange == 1) { obj.DispatchEvent(obj.webserver.CreateMeshDispatchTargets(meshid, [nodeid]), obj, { action: 'nodeconnect', meshid: meshid, nodeid: nodeid, conn: state.connectivity, pwr: state.powerState, nolog: 1, nopeers: 1 }); }
1676 } else {
1677 // Multi server mode
1678
meshuser.js
+11 -5
@@ -162,8 +162,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
162 var agent = parent.wsagents[command.nodeid];
163 if (agent != null) {
164 // Check if we have permission to send a message to that node
165 - var meshrights = parent.GetMeshRights(user, agent.dbMeshKey); // TODO: We will need to get the rights for this specific node.
165 + //var meshrights = parent.GetMeshRights(user, agent.dbMeshKey); // TODO: We will need to get the rights for this specific node.
166 var mesh = parent.meshes[agent.dbMeshKey];
167 + var meshrights = parent.GetNodeRights(user, mesh, agent.dbNodeKey);
168 if ((mesh != null) && ((meshrights & MESHRIGHT_REMOTECONTROL) || (meshrights & MESHRIGHT_REMOTEVIEWONLY))) { // 8 is remote control permission, 256 is desktop read only
169 command.sessionid = ws.sessionId; // Set the session id, required for responses
170 command.rights = meshrights; // Add user rights flags to the message
@@ -181,8 +182,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
182 var routing = parent.parent.GetRoutingServerId(command.nodeid, 1); // 1 = MeshAgent routing type
183 if (routing != null) {
184 // Check if we have permission to send a message to that node
184 - var meshrights = parent.GetMeshRights(user, routing.meshid);
185 + //var meshrights = parent.GetMeshRights(user, routing.meshid); // TODO: We will need to get the rights for this specific node.
186 var mesh = parent.meshes[routing.meshid];
187 + var meshrights = parent.GetNodeRights(user, mesh, agent.dbNodeKey);
188 if ((mesh != null) && ((meshrights & MESHRIGHT_REMOTECONTROL) || (meshrights & MESHRIGHT_REMOTEVIEWONLY))) { // 8 is remote control permission
189 command.fromSessionid = ws.sessionId; // Set the session id, required for responses
190 command.rights = meshrights; // Add user rights flags to the message
@@ -473,11 +475,14 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
475 }
476 case 'nodes':
477 {
476 - var links = [], err = null;
478 + var links = [], extraids = null, err = null;
479 try {
480 if (command.meshid == null) {
481 // Request a list of all meshes this user as rights to
482 links = parent.GetAllMeshIdWithRights(user);
483 +
484 + // Add any nodes with direct rights
485 + if (obj.user.links != null) { for (var i in obj.user.links) { if (i.startsWith('node/')) { if (extraids == null) { extraids = []; } extraids.push(i); } } }
486 } else {
487 // Request list of all nodes for one specific meshid
488 meshid = command.meshid;
@@ -495,7 +500,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
500 }
501
502 // Request a list of all nodes
498 - db.GetAllTypeNoTypeFieldMeshFiltered(links, domain.id, 'node', command.id, function (err, docs) {
503 + db.GetAllTypeNoTypeFieldMeshFiltered(links, extraids, domain.id, 'node', command.id, function (err, docs) {
504 if (docs == null) { docs = []; }
505 var r = {};
506 for (i in docs) {
@@ -2500,10 +2505,11 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
2505
2506 // Save the user to the database
2507 db.SetUser(newuser);
2508 + parent.parent.DispatchEvent([newuser], obj, 'resubscribe');
2509
2510 // Notify user change
2511 var targets = ['*', 'server-users', newuserid];
2506 - var event = { etype: 'user', userid: user._id, username: user.name, action: 'accountchange', msg: (command.rights == 0) ? ('Removed user device rights for ' + newuser.name) : ('Changed user device rights for ' + newuser.name), domain: domain.id, account: parent.CloneSafeUser(newuser) };
2512 + var event = { etype: 'user', userid: user._id, username: user.name, action: 'accountchange', msg: (command.rights == 0) ? ('Removed user device rights for ' + newuser.name) : ('Changed user device rights for ' + newuser.name), domain: domain.id, account: parent.CloneSafeUser(newuser), nodeListChange: newuserid };
2513 if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user. Another event will come.
2514 parent.parent.DispatchEvent(targets, obj, event);
2515 }
translate/translate.json
+1458 -1433
@@ -14,8 +14,8 @@
14 "ru": " + CIRA",
15 "zh-chs": " + CIRA",
16 "xloc": [
17 - "default.handlebars->27->1090",
18 - "default.handlebars->27->1092"
17 + "default.handlebars->27->1110",
18 + "default.handlebars->27->1112"
19 ]
20 },
21 {
@@ -236,7 +236,7 @@
236 "ru": " Может быть использована подсказка пароля, но не рекоммендуется.",
237 "zh-chs": " 可以使用密碼提示,但不建議使用。",
238 "xloc": [
239 - "default.handlebars->27->1020"
239 + "default.handlebars->27->1040"
240 ]
241 },
242 {
@@ -253,8 +253,8 @@
253 "ru": " Для добавления в группу устройств, пользователь должен зайти на сервер хотя бы один раз.",
254 "zh-chs": " 用戶需要先登錄到該服務器一次,然後才能將其添加到設備組。",
255 "xloc": [
256 - "default.handlebars->27->1166",
257 - "default.handlebars->27->1419"
256 + "default.handlebars->27->1183",
257 + "default.handlebars->27->1433"
258 ]
259 },
260 {
@@ -271,7 +271,7 @@
271 "ru": " и задайте указанное ниже имя пользователя и любой пароль.",
272 "zh-chs": " 並使用該用戶名和任何密碼對服務器進行身份驗證。",
273 "xloc": [
274 - "default.handlebars->27->249"
274 + "default.handlebars->27->250"
275 ]
276 },
277 {
@@ -288,7 +288,7 @@
288 "ru": " и задайте указанные ниже имя пользователя и пароль.",
289 "zh-chs": " 並使用該用戶名和密碼向服務器驗證身份。",
290 "xloc": [
291 - "default.handlebars->27->248"
291 + "default.handlebars->27->249"
292 ]
293 },
294 {
@@ -388,7 +388,7 @@
388 "ru": "(необязательно)",
389 "zh-chs": "(可選的)",
390 "xloc": [
391 - "default.handlebars->27->286"
391 + "default.handlebars->27->287"
392 ]
393 },
394 {
@@ -420,7 +420,7 @@
420 "ru": "* Для BSD сначала запустите \\\"pkg install wget sudo bash\\\".",
421 "zh-chs": "*對於BSD,首先運行 “pkg install wget sudo bash”。",
422 "xloc": [
423 - "default.handlebars->27->317"
423 + "default.handlebars->27->318"
424 ]
425 },
426 {
@@ -437,7 +437,7 @@
437 "ru": "* Оставьте пустым для установления случайного пароля каждому устройству.",
438 "zh-chs": "*保留空白以為每個設備分配一個隨機密碼。",
439 "xloc": [
440 - "default.handlebars->27->1140"
440 + "default.handlebars->27->1157"
441 ]
442 },
443 {
@@ -470,7 +470,7 @@
470 "zh-chs": ",",
471 "xloc": [
472 "default-mobile.handlebars->9->333",
473 - "default.handlebars->27->1225"
473 + "default.handlebars->27->1242"
474 ]
475 },
476 {
@@ -505,7 +505,7 @@
505 "ru": ", MQTT онлайн",
506 "zh-chs": ",MQTT在線",
507 "xloc": [
508 - "default.handlebars->27->769"
508 + "default.handlebars->27->789"
509 ]
510 },
511 {
@@ -522,7 +522,7 @@
522 "ru": ", Soft-KVM",
523 "zh-chs": ",軟KVM",
524 "xloc": [
525 - "default.handlebars->27->629"
525 + "default.handlebars->27->649"
526 ]
527 },
528 {
@@ -541,9 +541,9 @@
541 "xloc": [
542 "default-mobile.handlebars->9->231",
543 "default-mobile.handlebars->9->241",
544 - "default.handlebars->27->630",
545 - "default.handlebars->27->660",
546 - "default.handlebars->27->672",
544 + "default.handlebars->27->650",
545 + "default.handlebars->27->680",
546 + "default.handlebars->27->692",
547 "xterm.handlebars->9->6"
548 ]
549 },
@@ -652,9 +652,9 @@
652 "xloc": [
653 "default-mobile.handlebars->9->246",
654 "default-mobile.handlebars->9->70",
655 - "default.handlebars->27->1262",
656 - "default.handlebars->27->1509",
657 - "default.handlebars->27->674"
655 + "default.handlebars->27->1279",
656 + "default.handlebars->27->1520",
657 + "default.handlebars->27->694"
658 ]
659 },
660 {
@@ -703,7 +703,7 @@
703 "ru": "1 активная сессия",
704 "zh-chs": "1個活動會話",
705 "xloc": [
706 - "default.handlebars->27->1460"
706 + "default.handlebars->27->1474"
707 ]
708 },
709 {
@@ -722,7 +722,7 @@
722 "xloc": [
723 "default-mobile.handlebars->9->337",
724 "default-mobile.handlebars->9->80",
725 - "default.handlebars->27->1279"
725 + "default.handlebars->27->1296"
726 ]
727 },
728 {
@@ -740,8 +740,8 @@
740 "zh-chs": "1天",
741 "xloc": [
742 "default.handlebars->27->152",
743 - "default.handlebars->27->277",
744 - "default.handlebars->27->291"
743 + "default.handlebars->27->278",
744 + "default.handlebars->27->292"
745 ]
746 },
747 {
@@ -758,7 +758,7 @@
758 "ru": "1 группа",
759 "zh-chs": "1組",
760 "xloc": [
761 - "default.handlebars->27->1443"
761 + "default.handlebars->27->1457"
762 ]
763 },
764 {
@@ -776,8 +776,8 @@
776 "zh-chs": "1小時",
777 "xloc": [
778 "default.handlebars->27->150",
779 - "default.handlebars->27->275",
780 - "default.handlebars->27->289"
779 + "default.handlebars->27->276",
780 + "default.handlebars->27->290"
781 ]
782 },
783 {
@@ -812,8 +812,8 @@
812 "zh-chs": "1個月",
813 "xloc": [
814 "default.handlebars->27->154",
815 - "default.handlebars->27->279",
816 - "default.handlebars->27->293"
815 + "default.handlebars->27->280",
816 + "default.handlebars->27->294"
817 ]
818 },
819 {
@@ -830,7 +830,7 @@
830 "ru": "Еще 1 пользователь не показан, используйте поиск чтобы найти пользователей...",
831 "zh-chs": "未再顯示1個用戶,請使用搜索框查找用戶...",
832 "xloc": [
833 - "default.handlebars->27->1314"
833 + "default.handlebars->27->1331"
834 ]
835 },
836 {
@@ -847,7 +847,7 @@
847 "ru": "1 устройство",
848 "zh-chs": "1個節點",
849 "xloc": [
850 - "default.handlebars->27->331"
850 + "default.handlebars->27->332"
851 ]
852 },
853 {
@@ -881,7 +881,7 @@
881 "ru": "1 сессия",
882 "zh-chs": "1節",
883 "xloc": [
884 - "default.handlebars->27->1318"
884 + "default.handlebars->27->1335"
885 ]
886 },
887 {
@@ -899,8 +899,8 @@
899 "zh-chs": "1週",
900 "xloc": [
901 "default.handlebars->27->153",
902 - "default.handlebars->27->278",
903 - "default.handlebars->27->292"
902 + "default.handlebars->27->279",
903 + "default.handlebars->27->293"
904 ]
905 },
906 {
@@ -1146,7 +1146,7 @@
1146 "ru": "двухфакторная аутентификация включена",
1147 "zh-chs": "啟用第二因素身份驗證",
1148 "xloc": [
1149 - "default.handlebars->27->1452"
1149 + "default.handlebars->27->1466"
1150 ]
1151 },
1152 {
@@ -1245,8 +1245,8 @@
1245 "ru": "32-разрядная версия MeshAgent",
1246 "zh-chs": "MeshAgent的32位版本",
1247 "xloc": [
1248 - "default.handlebars->27->309",
1249 - "default.handlebars->27->324"
1248 + "default.handlebars->27->310",
1249 + "default.handlebars->27->325"
1250 ]
1251 },
1252 {
@@ -1450,7 +1450,7 @@
1450 "pt": "Versão de 64 bits do MacOS Mesh Agent",
1451 "zh-chs": "64位版本的MacOS Mesh Agent",
1452 "xloc": [
1453 - "default.handlebars->27->320"
1453 + "default.handlebars->27->321"
1454 ]
1455 },
1456 {
@@ -1467,8 +1467,8 @@
1467 "ru": "64-разрядная версия MeshAgent",
1468 "zh-chs": "MeshAgent的64位版本",
1469 "xloc": [
1470 - "default.handlebars->27->312",
1471 - "default.handlebars->27->327"
1470 + "default.handlebars->27->313",
1471 + "default.handlebars->27->328"
1472 ]
1473 },
1474 {
@@ -1499,7 +1499,7 @@
1499 "ru": "7-дневная статистика работы",
1500 "zh-chs": "7天電源狀態",
1501 "xloc": [
1502 - "default.handlebars->27->568"
1502 + "default.handlebars->27->588"
1503 ]
1504 },
1505 {
@@ -1551,8 +1551,8 @@
1551 "ru": "8 часов",
1552 "zh-chs": "8小時",
1553 "xloc": [
1554 - "default.handlebars->27->276",
1555 - "default.handlebars->27->290"
1554 + "default.handlebars->27->277",
1555 + "default.handlebars->27->291"
1556 ]
1557 },
1558 {
@@ -1738,7 +1738,7 @@
1738 "zh-chs": "ACM",
1739 "xloc": [
1740 "default-mobile.handlebars->9->185",
1741 - "default.handlebars->27->463"
1741 + "default.handlebars->27->464"
1742 ]
1743 },
1744 {
@@ -1755,8 +1755,8 @@
1755 "ru": "AMT",
1756 "zh-chs": "AMT",
1757 "xloc": [
1758 - "default.handlebars->27->170",
1759 - "default.handlebars->27->359"
1758 + "default.handlebars->27->171",
1759 + "default.handlebars->27->360"
1760 ]
1761 },
1762 {
@@ -1844,7 +1844,7 @@
1844 "ru": "Отказано в доступе",
1845 "zh-chs": "拒絕訪問",
1846 "xloc": [
1847 - "default.handlebars->27->770"
1847 + "default.handlebars->27->790"
1848 ]
1849 },
1850 {
@@ -1879,7 +1879,7 @@
1879 "ru": "Доступ к файлам сервера",
1880 "zh-chs": "訪問服務器文件",
1881 "xloc": [
1882 - "default.handlebars->27->1424"
1882 + "default.handlebars->27->1438"
1883 ]
1884 },
1885 {
@@ -1954,10 +1954,10 @@
1954 "default-mobile.handlebars->9->55",
1955 "default-mobile.handlebars->9->57",
1956 "default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->p3AccountActions->1->0",
1957 - "default.handlebars->27->1029",
1958 - "default.handlebars->27->1031",
1959 - "default.handlebars->27->433",
1960 - "default.handlebars->27->435"
1957 + "default.handlebars->27->1049",
1958 + "default.handlebars->27->1051",
1959 + "default.handlebars->27->434",
1960 + "default.handlebars->27->436"
1961 ]
1962 },
1963 {
@@ -2061,7 +2061,7 @@
2061 "ru": "Действиe",
2062 "zh-chs": "行動",
2063 "xloc": [
2064 - "default.handlebars->27->775",
2064 + "default.handlebars->27->795",
2065 "default.handlebars->container->column_l->p42->p42tbl->1->0->8"
2066 ]
2067 },
@@ -2078,8 +2078,8 @@
2078 "ru": "Файл действий",
2079 "zh-chs": "動作文件",
2080 "xloc": [
2081 - "default.handlebars->27->609",
2082 - "default.handlebars->27->611"
2081 + "default.handlebars->27->629",
2082 + "default.handlebars->27->631"
2083 ]
2084 },
2085 {
@@ -2097,7 +2097,7 @@
2097 "xloc": [
2098 "default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea4->1->3",
2099 "default-mobile.handlebars->container->page_content->column_l->p10->p10files->p13toolbar->1->0->1->1",
2100 - "default.handlebars->27->495",
2100 + "default.handlebars->27->496",
2101 "default.handlebars->container->column_l->p11->deskarea0->deskarea1->1",
2102 "default.handlebars->container->column_l->p12->termTable->1->1->0->1->1",
2103 "default.handlebars->container->column_l->p13->p13toolbar->1->0->1->1"
@@ -2153,9 +2153,9 @@
2153 "xloc": [
2154 "default-mobile.handlebars->9->180",
2155 "default-mobile.handlebars->9->182",
2156 - "default.handlebars->27->456",
2157 - "default.handlebars->27->458",
2158 - "default.handlebars->27->740"
2156 + "default.handlebars->27->457",
2157 + "default.handlebars->27->459",
2158 + "default.handlebars->27->760"
2159 ]
2160 },
2161 {
@@ -2171,10 +2171,10 @@
2171 "ru": "Активация",
2172 "zh-chs": "激活",
2173 "xloc": [
2174 - "default.handlebars->27->1103",
2175 - "default.handlebars->27->1105",
2176 - "default.handlebars->27->212",
2177 - "default.handlebars->27->214"
2174 + "default.handlebars->27->1123",
2175 + "default.handlebars->27->1125",
2176 + "default.handlebars->27->213",
2177 + "default.handlebars->27->215"
2178 ]
2179 },
2180 {
@@ -2191,7 +2191,7 @@
2191 "ru": "Активный пользователь",
2192 "zh-chs": "活動用戶{0}",
2193 "xloc": [
2194 - "default.handlebars->27->482"
2194 + "default.handlebars->27->483"
2195 ]
2196 },
2197 {
@@ -2208,7 +2208,7 @@
2208 "ru": "Добавить агент",
2209 "zh-chs": "添加代理",
2210 "xloc": [
2211 - "default.handlebars->27->216"
2211 + "default.handlebars->27->217"
2212 ]
2213 },
2214 {
@@ -2225,7 +2225,7 @@
2225 "ru": "Добавить CIRA",
2226 "zh-chs": "添加CIRA",
2227 "xloc": [
2228 - "default.handlebars->27->206"
2228 + "default.handlebars->27->207"
2229 ]
2230 },
2231 {
@@ -2238,7 +2238,7 @@
2238 "pt": "Adicionar Dispositivo",
2239 "zh-chs": "添加設備",
2240 "xloc": [
2241 - "default.handlebars->27->1476"
2241 + "default.handlebars->27->1490"
2242 ]
2243 },
2244 {
@@ -2255,7 +2255,7 @@
2255 "ru": "Добавить событие к устройству",
2256 "zh-chs": "添加設備事件",
2257 "xloc": [
2258 - "default.handlebars->27->551"
2258 + "default.handlebars->27->571"
2259 ]
2260 },
2261 {
@@ -2272,18 +2272,18 @@
2272 "ru": "Добавить группу устройств",
2273 "zh-chs": "添加設備組",
2274 "xloc": [
2275 - "default.handlebars->27->1194",
2276 - "default.handlebars->27->1196",
2277 - "default.handlebars->27->1398",
2278 - "default.handlebars->27->1482",
2279 - "default.handlebars->27->187"
2275 + "default.handlebars->27->1211",
2276 + "default.handlebars->27->1213",
2277 + "default.handlebars->27->1415",
2278 + "default.handlebars->27->1496",
2279 + "default.handlebars->27->188"
2280 ]
2281 },
2282 {
2283 "en": "Add Device Permissions",
2284 "nl": "Apparaatrechten toevoegen",
2285 "xloc": [
2286 - "default.handlebars->27->1197"
2286 + "default.handlebars->27->1214"
2287 ]
2288 },
2289 {
@@ -2300,7 +2300,7 @@
2300 "ru": "Добавить Intel® AMT CIRA устройство",
2301 "zh-chs": "添加英特爾®AMT CIRA設備",
2302 "xloc": [
2303 - "default.handlebars->27->262"
2303 + "default.handlebars->27->263"
2304 ]
2305 },
2306 {
@@ -2317,7 +2317,7 @@
2317 "ru": "Добавить Intel® AMT устройство",
2318 "zh-chs": "添加英特爾®AMT設備",
2319 "xloc": [
2320 - "default.handlebars->27->229"
2320 + "default.handlebars->27->230"
2321 ]
2322 },
2323 {
@@ -2350,7 +2350,7 @@
2350 "ru": "Добавить локально",
2351 "zh-chs": "添加本地",
2352 "xloc": [
2353 - "default.handlebars->27->208"
2353 + "default.handlebars->27->209"
2354 ]
2355 },
2356 {
@@ -2367,7 +2367,7 @@
2367 "ru": "Добавить участие",
2368 "zh-chs": "添加會員",
2369 "xloc": [
2370 - "default.handlebars->27->1505"
2370 + "default.handlebars->27->1516"
2371 ]
2372 },
2373 {
@@ -2384,7 +2384,7 @@
2384 "ru": "Добавить Mesh Agent",
2385 "zh-chs": "添加網格代理",
2386 "xloc": [
2387 - "default.handlebars->27->330"
2387 + "default.handlebars->27->331"
2388 ]
2389 },
2390 {
@@ -2405,20 +2405,20 @@
2405 "default.handlebars->27->130",
2406 "default.handlebars->27->133",
2407 "default.handlebars->27->134",
2408 - "default.handlebars->27->797",
2409 - "default.handlebars->27->798"
2408 + "default.handlebars->27->817",
2409 + "default.handlebars->27->818"
2410 ]
2411 },
2412 {
2413 "en": "Add User",
2414 "xloc": [
2415 - "default.handlebars->27->530"
2415 + "default.handlebars->27->531"
2416 ]
2417 },
2418 {
2419 "en": "Add User Device Permissions",
2420 "xloc": [
2421 - "default.handlebars->27->1200"
2421 + "default.handlebars->27->1217"
2422 ]
2423 },
2424 {
@@ -2435,9 +2435,9 @@
2435 "ru": "Добавить группу пользователей",
2436 "zh-chs": "添加用戶組",
2437 "xloc": [
2438 - "default.handlebars->27->1097",
2439 - "default.handlebars->27->1195",
2440 - "default.handlebars->27->1491"
2438 + "default.handlebars->27->1117",
2439 + "default.handlebars->27->1212",
2440 + "default.handlebars->27->1502"
2441 ]
2442 },
2443 {
@@ -2471,8 +2471,8 @@
2471 "ru": "Добавить пользователей",
2472 "zh-chs": "添加用戶",
2473 "xloc": [
2474 - "default.handlebars->27->1096",
2475 - "default.handlebars->27->1393"
2474 + "default.handlebars->27->1116",
2475 + "default.handlebars->27->1410"
2476 ]
2477 },
2478 {
@@ -2489,7 +2489,7 @@
2489 "ru": "Добавить пользователей в группу устройств",
2490 "zh-chs": "將用戶添加到設備組",
2491 "xloc": [
2492 - "default.handlebars->27->1193"
2492 + "default.handlebars->27->1210"
2493 ]
2494 },
2495 {
@@ -2506,7 +2506,7 @@
2506 "ru": "Добавить пользователей в группу",
2507 "zh-chs": "將用戶添加到用戶組",
2508 "xloc": [
2509 - "default.handlebars->27->1421"
2509 + "default.handlebars->27->1435"
2510 ]
2511 },
2512 {
@@ -2540,7 +2540,7 @@
2540 "ru": "Добавить новый Intel® AMT компьютер сканированием локальной сети.",
2541 "zh-chs": "通過掃描本地網絡添加新的英特爾®AMT計算機。",
2542 "xloc": [
2543 - "default.handlebars->27->209"
2543 + "default.handlebars->27->210"
2544 ]
2545 },
2546 {
@@ -2557,8 +2557,8 @@
2557 "ru": "Добавить новый Intel® AMT компьютер, находящийся в интернете.",
2558 "zh-chs": "添加位於互聯網上的新英特爾®AMT計算機。",
2559 "xloc": [
2560 - "default.handlebars->27->1098",
2561 - "default.handlebars->27->205"
2560 + "default.handlebars->27->1118",
2561 + "default.handlebars->27->206"
2562 ]
2563 },
2564 {
@@ -2575,8 +2575,8 @@
2575 "ru": "Добавить новый Intel® AMT компьютер, находящийся в локальной сети.",
2576 "zh-chs": "添加位於本地網絡上的新英特爾®AMT計算機。",
2577 "xloc": [
2578 - "default.handlebars->27->1100",
2579 - "default.handlebars->27->207"
2578 + "default.handlebars->27->1120",
2579 + "default.handlebars->27->208"
2580 ]
2581 },
2582 {
@@ -2593,7 +2593,7 @@
2593 "ru": "Добавить новое Intel® AMT устройство к группе устройств \\\"{0}\\\".",
2594 "zh-chs": "將新的英特爾®AMT設備添加到設備組“{0}”。",
2595 "xloc": [
2596 - "default.handlebars->27->219"
2596 + "default.handlebars->27->220"
2597 ]
2598 },
2599 {
@@ -2610,8 +2610,8 @@
2610 "ru": "Добавить новый компьютер к этой сети установкой Mesh Agent.",
2611 "zh-chs": "通過安裝網格代理將新計算機添加到該網格。",
2612 "xloc": [
2613 - "default.handlebars->27->1106",
2614 - "default.handlebars->27->215"
2613 + "default.handlebars->27->1126",
2614 + "default.handlebars->27->216"
2615 ]
2616 },
2617 {
@@ -2628,7 +2628,7 @@
2628 "ru": "Адрес",
2629 "zh-chs": "地址",
2630 "xloc": [
2631 - "default.handlebars->27->183"
2631 + "default.handlebars->27->184"
2632 ]
2633 },
2634 {
@@ -2661,7 +2661,7 @@
2661 "pt": "Admin Control Mode (ACM)",
2662 "zh-chs": "管理員控制模式(ACM)",
2663 "xloc": [
2664 - "default.handlebars->27->742"
2664 + "default.handlebars->27->762"
2665 ]
2666 },
2667 {
@@ -2674,7 +2674,7 @@
2674 "pt": "Credenciais de administrador",
2675 "zh-chs": "管理員憑證",
2676 "xloc": [
2677 - "default.handlebars->27->748"
2677 + "default.handlebars->27->768"
2678 ]
2679 },
2680 {
@@ -2708,7 +2708,7 @@
2708 "ru": "Области администратора",
2709 "zh-chs": "管理領域",
2710 "xloc": [
2711 - "default.handlebars->27->1447"
2711 + "default.handlebars->27->1461"
2712 ]
2713 },
2714 {
@@ -2742,7 +2742,7 @@
2742 "ru": "Административные области",
2743 "zh-chs": "行政領域",
2744 "xloc": [
2745 - "default.handlebars->27->1363"
2745 + "default.handlebars->27->1380"
2746 ]
2747 },
2748 {
@@ -2759,7 +2759,7 @@
2759 "ru": "Администратор",
2760 "zh-chs": "管理員",
2761 "xloc": [
2762 - "default.handlebars->27->1325"
2762 + "default.handlebars->27->1342"
2763 ]
2764 },
2765 {
@@ -2775,7 +2775,7 @@
2775 "ru": "Африканский",
2776 "zh-chs": "南非語",
2777 "xloc": [
2778 - "default.handlebars->27->800"
2778 + "default.handlebars->27->820"
2779 ]
2780 },
2781 {
@@ -2795,10 +2795,10 @@
2795 "default-mobile.handlebars->9->124",
2796 "default-mobile.handlebars->9->177",
2797 "default-mobile.handlebars->9->193",
2798 - "default.handlebars->27->1250",
2799 - "default.handlebars->27->1256",
2800 - "default.handlebars->27->166",
2801 - "default.handlebars->27->355",
2798 + "default.handlebars->27->1267",
2799 + "default.handlebars->27->1273",
2800 + "default.handlebars->27->167",
2801 + "default.handlebars->27->356",
2802 "default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->p15outputselecttd->p15outputselect->1"
2803 ]
2804 },
@@ -2815,8 +2815,8 @@
2815 "ru": "Агент + Intel AMT",
2816 "zh-chs": "代理+英特爾AMT",
2817 "xloc": [
2818 - "default.handlebars->27->1252",
2819 - "default.handlebars->27->1258"
2818 + "default.handlebars->27->1269",
2819 + "default.handlebars->27->1275"
2820 ]
2821 },
2822 {
@@ -2849,7 +2849,7 @@
2849 "zh-chs": "代理控制台",
2850 "xloc": [
2851 "default-mobile.handlebars->9->318",
2852 - "default.handlebars->27->1208"
2852 + "default.handlebars->27->1225"
2853 ]
2854 },
2855 {
@@ -2865,7 +2865,7 @@
2865 "ru": "Счетчик ошибок агента",
2866 "zh-chs": "座席錯誤計數器",
2867 "xloc": [
2868 - "default.handlebars->27->1518"
2868 + "default.handlebars->27->1529"
2869 ]
2870 },
2871 {
@@ -2931,7 +2931,7 @@
2931 "ru": "Сессии агентов",
2932 "zh-chs": "座席會議",
2933 "xloc": [
2934 - "default.handlebars->27->1534"
2934 + "default.handlebars->27->1545"
2935 ]
2936 },
2937 {
@@ -2948,7 +2948,7 @@
2948 "zh-chs": "代理商標籤",
2949 "xloc": [
2950 "default-mobile.handlebars->9->192",
2951 - "default.handlebars->27->475"
2951 + "default.handlebars->27->476"
2952 ]
2953 },
2954 {
@@ -2965,7 +2965,7 @@
2965 "ru": "Типы агента",
2966 "zh-chs": "代理類型",
2967 "xloc": [
2968 - "default.handlebars->27->1254",
2968 + "default.handlebars->27->1271",
2969 "default.handlebars->container->column_l->p21->3->1->meshOsChartDiv->1"
2970 ]
2971 },
@@ -2984,8 +2984,8 @@
2984 "zh-chs": "代理已連接",
2985 "xloc": [
2986 "default.handlebars->27->136",
2987 - "default.handlebars->27->521",
2988 - "default.handlebars->27->522"
2987 + "default.handlebars->27->522",
2988 + "default.handlebars->27->523"
2989 ]
2990 },
2991 {
@@ -3019,7 +3019,7 @@
3019 "ru": "Агент оффлайн",
3020 "zh-chs": "代理離線",
3021 "xloc": [
3022 - "default.handlebars->27->768"
3022 + "default.handlebars->27->788"
3023 ]
3024 },
3025 {
@@ -3036,7 +3036,7 @@
3036 "ru": "Агент онлайн",
3037 "zh-chs": "代理在線",
3038 "xloc": [
3039 - "default.handlebars->27->767"
3039 + "default.handlebars->27->787"
3040 ]
3041 },
3042 {
@@ -3053,7 +3053,7 @@
3053 "ru": "Агенты",
3054 "zh-chs": "代理商",
3055 "xloc": [
3056 - "default.handlebars->27->1547"
3056 + "default.handlebars->27->1558"
3057 ]
3058 },
3059 {
@@ -3069,7 +3069,7 @@
3069 "ru": "Албанский",
3070 "zh-chs": "阿爾巴尼亞語",
3071 "xloc": [
3072 - "default.handlebars->27->801"
3072 + "default.handlebars->27->821"
3073 ]
3074 },
3075 {
@@ -3121,9 +3121,9 @@
3121 "ru": "Фокусирование всех",
3122 "zh-chs": "全部聚焦",
3123 "xloc": [
3124 - "default.handlebars->27->631",
3125 - "default.handlebars->27->633",
3126 - "default.handlebars->27->634"
3124 + "default.handlebars->27->651",
3125 + "default.handlebars->27->653",
3126 + "default.handlebars->27->654"
3127 ]
3128 },
3129 {
@@ -3140,14 +3140,14 @@
3140 "ru": "Разрешить пользователям управлять этой группой и устройствами этой группы.",
3141 "zh-chs": "允許用戶管理此設備組和該組中的設備。",
3142 "xloc": [
3143 - "default.handlebars->27->1164",
3144 - "default.handlebars->27->1418"
3143 + "default.handlebars->27->1181",
3144 + "default.handlebars->27->1432"
3145 ]
3146 },
3147 {
3148 "en": "Allow users to manage this device.",
3149 "xloc": [
3150 - "default.handlebars->27->1165"
3150 + "default.handlebars->27->1182"
3151 ]
3152 },
3153 {
@@ -3200,7 +3200,7 @@
3200 "ru": "Поменять (F10 = ESC+0)",
3201 "zh-chs": "備用(F10 = ESC + 0)",
3202 "xloc": [
3203 - "default.handlebars->27->665"
3203 + "default.handlebars->27->685"
3204 ]
3205 },
3206 {
@@ -3232,7 +3232,7 @@
3232 "ru": "Всегда уведомлять",
3233 "zh-chs": "始終通知",
3234 "xloc": [
3235 - "default.handlebars->27->1077"
3235 + "default.handlebars->27->1097"
3236 ]
3237 },
3238 {
@@ -3249,7 +3249,7 @@
3249 "ru": "Всегда запрашивать",
3250 "zh-chs": "總是提示",
3251 "xloc": [
3252 - "default.handlebars->27->1078"
3252 + "default.handlebars->27->1098"
3253 ]
3254 },
3255 {
@@ -3320,7 +3320,7 @@
3320 "ru": "Антивирус",
3321 "zh-chs": "防毒軟件",
3322 "xloc": [
3323 - "default.handlebars->27->481"
3323 + "default.handlebars->27->482"
3324 ]
3325 },
3326 {
@@ -3336,7 +3336,7 @@
3336 "ru": "Любые поддерживаемые",
3337 "zh-chs": "任何支持",
3338 "xloc": [
3339 - "default.handlebars->27->270"
3339 + "default.handlebars->27->271"
3340 ]
3341 },
3342 {
@@ -3353,7 +3353,7 @@
3353 "ru": "Apple MacOS",
3354 "zh-chs": "蘋果MacOS",
3355 "xloc": [
3356 - "default.handlebars->27->300"
3356 + "default.handlebars->27->301"
3357 ]
3358 },
3359 {
@@ -3370,7 +3370,7 @@
3370 "ru": "Только Apple MacOS",
3371 "zh-chs": "僅限Apple MacOS",
3372 "xloc": [
3373 - "default.handlebars->27->272"
3373 + "default.handlebars->27->273"
3374 ]
3375 },
3376 {
@@ -3403,7 +3403,7 @@
3403 "ru": "Арабский (Алжир)",
3404 "zh-chs": "阿拉伯文(阿爾及利亞)",
3405 "xloc": [
3406 - "default.handlebars->27->803"
3406 + "default.handlebars->27->823"
3407 ]
3408 },
3409 {
@@ -3418,7 +3418,7 @@
3418 "ru": "Арабский (Бахрейн)",
3419 "zh-chs": "阿拉伯文(巴林)",
3420 "xloc": [
3421 - "default.handlebars->27->804"
3421 + "default.handlebars->27->824"
3422 ]
3423 },
3424 {
@@ -3434,7 +3434,7 @@
3434 "ru": "Арабский (Египет)",
3435 "zh-chs": "阿拉伯文(埃及)",
3436 "xloc": [
3437 - "default.handlebars->27->805"
3437 + "default.handlebars->27->825"
3438 ]
3439 },
3440 {
@@ -3450,7 +3450,7 @@
3450 "ru": "Арабский (Ирак)",
3451 "zh-chs": "阿拉伯文(伊拉克)",
3452 "xloc": [
3453 - "default.handlebars->27->806"
3453 + "default.handlebars->27->826"
3454 ]
3455 },
3456 {
@@ -3466,7 +3466,7 @@
3466 "ru": "Арабский (Иордания)",
3467 "zh-chs": "阿拉伯語(約旦)",
3468 "xloc": [
3469 - "default.handlebars->27->807"
3469 + "default.handlebars->27->827"
3470 ]
3471 },
3472 {
@@ -3481,7 +3481,7 @@
3481 "ru": "Арабский (Кувейт)",
3482 "zh-chs": "阿拉伯文(科威特)",
3483 "xloc": [
3484 - "default.handlebars->27->808"
3484 + "default.handlebars->27->828"
3485 ]
3486 },
3487 {
@@ -3496,7 +3496,7 @@
3496 "ru": "Арабский (Ливан)",
3497 "zh-chs": "阿拉伯語(黎巴嫩)",
3498 "xloc": [
3499 - "default.handlebars->27->809"
3499 + "default.handlebars->27->829"
3500 ]
3501 },
3502 {
@@ -3512,7 +3512,7 @@
3512 "ru": "Арабский (Ливия)",
3513 "zh-chs": "阿拉伯文(利比亞)",
3514 "xloc": [
3515 - "default.handlebars->27->810"
3515 + "default.handlebars->27->830"
3516 ]
3517 },
3518 {
@@ -3528,7 +3528,7 @@
3528 "ru": "Арабский (Марокко)",
3529 "zh-chs": "阿拉伯文(摩洛哥)",
3530 "xloc": [
3531 - "default.handlebars->27->811"
3531 + "default.handlebars->27->831"
3532 ]
3533 },
3534 {
@@ -3543,7 +3543,7 @@
3543 "ru": "Арабский (Оман)",
3544 "zh-chs": "阿拉伯文(阿曼)",
3545 "xloc": [
3546 - "default.handlebars->27->812"
3546 + "default.handlebars->27->832"
3547 ]
3548 },
3549 {
@@ -3559,7 +3559,7 @@
3559 "ru": "Арабский (Катар)",
3560 "zh-chs": "阿拉伯語(卡塔爾)",
3561 "xloc": [
3562 - "default.handlebars->27->813"
3562 + "default.handlebars->27->833"
3563 ]
3564 },
3565 {
@@ -3575,7 +3575,7 @@
3575 "ru": "Арабский (Саудовская Аравия)",
3576 "zh-chs": "阿拉伯語(沙特阿拉伯)",
3577 "xloc": [
3578 - "default.handlebars->27->814"
3578 + "default.handlebars->27->834"
3579 ]
3580 },
3581 {
@@ -3591,7 +3591,7 @@
3591 "ru": "Арабский (стандартный)",
3592 "zh-chs": "阿拉伯語(標準)",
3593 "xloc": [
3594 - "default.handlebars->27->802"
3594 + "default.handlebars->27->822"
3595 ]
3596 },
3597 {
@@ -3607,7 +3607,7 @@
3607 "ru": "Арабский (Сирия)",
3608 "zh-chs": "阿拉伯語(敘利亞)",
3609 "xloc": [
3610 - "default.handlebars->27->815"
3610 + "default.handlebars->27->835"
3611 ]
3612 },
3613 {
@@ -3623,7 +3623,7 @@
3623 "ru": "Арабский (Тунис)",
3624 "zh-chs": "阿拉伯文(突尼斯)",
3625 "xloc": [
3626 - "default.handlebars->27->816"
3626 + "default.handlebars->27->836"
3627 ]
3628 },
3629 {
@@ -3638,7 +3638,7 @@
3638 "ru": "Арабский (О.А.Э.)",
3639 "zh-chs": "阿拉伯文(阿聯酋)",
3640 "xloc": [
3641 - "default.handlebars->27->817"
3641 + "default.handlebars->27->837"
3642 ]
3643 },
3644 {
@@ -3654,7 +3654,7 @@
3654 "ru": "Арабский (Йемен)",
3655 "zh-chs": "阿拉伯文(也門)",
3656 "xloc": [
3657 - "default.handlebars->27->818"
3657 + "default.handlebars->27->838"
3658 ]
3659 },
3660 {
@@ -3670,7 +3670,7 @@
3670 "ru": "Арагонский",
3671 "zh-chs": "阿拉貢人",
3672 "xloc": [
3673 - "default.handlebars->27->819"
3673 + "default.handlebars->27->839"
3674 ]
3675 },
3676 {
@@ -3687,7 +3687,7 @@
3687 "ru": "Архитектура",
3688 "zh-chs": "建築",
3689 "xloc": [
3690 - "default.handlebars->27->716"
3690 + "default.handlebars->27->736"
3691 ]
3692 },
3693 {
@@ -3704,7 +3704,7 @@
3704 "ru": "Вы действительно хотите подключиться к {0} устройствам?",
3705 "zh-chs": "您確定要連接到{0}設備嗎?",
3706 "xloc": [
3707 - "default.handlebars->27->200"
3707 + "default.handlebars->27->201"
3708 ]
3709 },
3710 {
@@ -3722,7 +3722,7 @@
3722 "zh-chs": "您確定要刪除組{0}嗎?刪除設備組還將刪除該組中有關設備的所有信息。",
3723 "xloc": [
3724 "default-mobile.handlebars->9->289",
3725 - "default.handlebars->27->1144"
3725 + "default.handlebars->27->1161"
3726 ]
3727 },
3728 {
@@ -3739,7 +3739,7 @@
3739 "ru": "Вы действительно хотите удалить устройство \\\"{0}\\\"?",
3740 "zh-chs": "您確定要刪除節點{0}嗎?",
3741 "xloc": [
3742 - "default.handlebars->27->590"
3742 + "default.handlebars->27->610"
3743 ]
3744 },
3745 {
@@ -3756,7 +3756,7 @@
3756 "ru": "Вы действительно хотите деинсталировать выбранного агента?",
3757 "zh-chs": "您確定要卸載所選代理嗎?",
3758 "xloc": [
3759 - "default.handlebars->27->579"
3759 + "default.handlebars->27->599"
3760 ]
3761 },
3762 {
@@ -3773,7 +3773,7 @@
3773 "ru": "Вы действительно хотите деинсталлировать выбранных {0} агентов?",
3774 "zh-chs": "您確定要卸載所選的{0}代理嗎?",
3775 "xloc": [
3776 - "default.handlebars->27->578"
3776 + "default.handlebars->27->598"
3777 ]
3778 },
3779 {
@@ -3790,7 +3790,7 @@
3790 "ru": "Вы уверенны, что {0} плагин: {1}",
3791 "zh-chs": "您確定要{0}插件嗎:{1}",
3792 "xloc": [
3793 - "default.handlebars->27->1584"
3793 + "default.handlebars->27->1595"
3794 ]
3795 },
3796 {
@@ -3806,7 +3806,7 @@
3806 "ru": "Армянский",
3807 "zh-chs": "亞美尼亞人",
3808 "xloc": [
3809 - "default.handlebars->27->820"
3809 + "default.handlebars->27->840"
3810 ]
3811 },
3812 {
@@ -3821,7 +3821,7 @@
3821 "ru": "Ассамский",
3822 "zh-chs": "阿薩姆語",
3823 "xloc": [
3824 - "default.handlebars->27->821"
3824 + "default.handlebars->27->841"
3825 ]
3826 },
3827 {
@@ -3836,7 +3836,7 @@
3836 "ru": "Астурии",
3837 "zh-chs": "阿斯圖里亞斯人",
3838 "xloc": [
3839 - "default.handlebars->27->822"
3839 + "default.handlebars->27->842"
3840 ]
3841 },
3842 {
@@ -3852,7 +3852,7 @@
3852 "ru": "Приложение аутентификации",
3853 "zh-chs": "身份驗證應用",
3854 "xloc": [
3855 - "default.handlebars->27->1448"
3855 + "default.handlebars->27->1462"
3856 ]
3857 },
3858 {
@@ -3875,8 +3875,8 @@
3875 "default-mobile.handlebars->9->35",
3876 "default.handlebars->27->104",
3877 "default.handlebars->27->109",
3878 - "default.handlebars->27->786",
3879 - "default.handlebars->27->788"
3878 + "default.handlebars->27->806",
3879 + "default.handlebars->27->808"
3880 ]
3881 },
3882 {
@@ -3944,7 +3944,7 @@
3944 "ru": "Автоудаление",
3945 "zh-chs": "自動刪除",
3946 "xloc": [
3947 - "default.handlebars->27->1065"
3947 + "default.handlebars->27->1085"
3948 ]
3949 },
3950 {
@@ -3997,7 +3997,7 @@
3997 "ru": "Азербайджанский",
3998 "zh-chs": "阿塞拜疆",
3999 "xloc": [
4000 - "default.handlebars->27->823"
4000 + "default.handlebars->27->843"
4001 ]
4002 },
4003 {
@@ -4014,7 +4014,7 @@
4014 "ru": "BIOS",
4015 "zh-chs": "的BIOS",
4016 "xloc": [
4017 - "default.handlebars->27->754"
4017 + "default.handlebars->27->774"
4018 ]
4019 },
4020 {
@@ -4092,7 +4092,7 @@
4092 "ru": "Фоновый и интерактивный",
4093 "zh-chs": "背景與互動",
4094 "xloc": [
4095 - "default.handlebars->27->304"
4095 + "default.handlebars->27->305"
4096 ]
4097 },
4098 {
@@ -4109,9 +4109,9 @@
4109 "ru": "Фоновый и интерактивный",
4110 "zh-chs": "背景與互動",
4111 "xloc": [
4112 - "default.handlebars->27->1233",
4113 - "default.handlebars->27->1240",
4114 - "default.handlebars->27->282"
4112 + "default.handlebars->27->1250",
4113 + "default.handlebars->27->1257",
4114 + "default.handlebars->27->283"
4115 ]
4116 },
4117 {
@@ -4128,10 +4128,10 @@
4128 "ru": "Только фоновый",
4129 "zh-chs": "僅背景",
4130 "xloc": [
4131 - "default.handlebars->27->1234",
4132 - "default.handlebars->27->1241",
4133 - "default.handlebars->27->283",
4134 - "default.handlebars->27->305"
4131 + "default.handlebars->27->1251",
4132 + "default.handlebars->27->1258",
4133 + "default.handlebars->27->284",
4134 + "default.handlebars->27->306"
4135 ]
4136 },
4137 {
@@ -4165,7 +4165,7 @@
4165 "ru": "Резервные коды",
4166 "zh-chs": "備用碼",
4167 "xloc": [
4168 - "default.handlebars->27->1450"
4168 + "default.handlebars->27->1464"
4169 ]
4170 },
4171 {
@@ -4182,7 +4182,7 @@
4182 "ru": "Плохой ключ",
4183 "zh-chs": "錯誤的簽名",
4184 "xloc": [
4185 - "default.handlebars->27->1525"
4185 + "default.handlebars->27->1536"
4186 ]
4187 },
4188 {
@@ -4199,7 +4199,7 @@
4199 "ru": "Плохой веб-сертификат",
4200 "zh-chs": "錯誤的網絡證書",
4201 "xloc": [
4202 - "default.handlebars->27->1524"
4202 + "default.handlebars->27->1535"
4203 ]
4204 },
4205 {
@@ -4214,7 +4214,7 @@
4214 "ru": "Баскский",
4215 "zh-chs": "巴斯克",
4216 "xloc": [
4217 - "default.handlebars->27->824"
4217 + "default.handlebars->27->844"
4218 ]
4219 },
4220 {
@@ -4247,7 +4247,7 @@
4247 "ru": "Белорусский",
4248 "zh-chs": "白俄羅斯語",
4249 "xloc": [
4250 - "default.handlebars->27->826"
4250 + "default.handlebars->27->846"
4251 ]
4252 },
4253 {
@@ -4263,7 +4263,7 @@
4263 "ru": "Бенгальский",
4264 "zh-chs": "孟加拉",
4265 "xloc": [
4266 - "default.handlebars->27->827"
4266 + "default.handlebars->27->847"
4267 ]
4268 },
4269 {
@@ -4279,7 +4279,7 @@
4279 "ru": "Боснийский",
4280 "zh-chs": "波斯尼亞人",
4281 "xloc": [
4282 - "default.handlebars->27->828"
4282 + "default.handlebars->27->848"
4283 ]
4284 },
4285 {
@@ -4294,7 +4294,7 @@
4294 "ru": "Бретонский",
4295 "zh-chs": "布列塔尼",
4296 "xloc": [
4297 - "default.handlebars->27->829"
4297 + "default.handlebars->27->849"
4298 ]
4299 },
4300 {
@@ -4311,7 +4311,7 @@
4311 "ru": "Отправить сообщение",
4312 "zh-chs": "廣播",
4313 "xloc": [
4314 - "default.handlebars->27->1391",
4314 + "default.handlebars->27->1408",
4315 "default.handlebars->container->column_l->p4->3->1->0->3->1"
4316 ]
4317 },
@@ -4329,7 +4329,7 @@
4329 "ru": "Отправить сообщение",
4330 "zh-chs": "廣播消息",
4331 "xloc": [
4332 - "default.handlebars->27->1348"
4332 + "default.handlebars->27->1365"
4333 ]
4334 },
4335 {
@@ -4346,7 +4346,7 @@
4346 "ru": "Отправить сообщение всем подключенным пользователям.",
4347 "zh-chs": "向所有連接的用戶廣播消息。",
4348 "xloc": [
4349 - "default.handlebars->27->1347"
4349 + "default.handlebars->27->1364"
4350 ]
4351 },
4352 {
@@ -4362,7 +4362,7 @@
4362 "ru": "Болгарский",
4363 "zh-chs": "保加利亞語",
4364 "xloc": [
4365 - "default.handlebars->27->825"
4365 + "default.handlebars->27->845"
4366 ]
4367 },
4368 {
@@ -4378,7 +4378,7 @@
4378 "ru": "Бирманский",
4379 "zh-chs": "緬甸人",
4380 "xloc": [
4381 - "default.handlebars->27->830"
4381 + "default.handlebars->27->850"
4382 ]
4383 },
4384 {
@@ -4396,7 +4396,7 @@
4396 "zh-chs": "CCM",
4397 "xloc": [
4398 "default-mobile.handlebars->9->184",
4399 - "default.handlebars->27->461"
4399 + "default.handlebars->27->462"
4400 ]
4401 },
4402 {
@@ -4414,10 +4414,10 @@
4414 "zh-chs": "CIRA",
4415 "xloc": [
4416 "default-mobile.handlebars->9->125",
4417 - "default.handlebars->27->1132",
4418 - "default.handlebars->27->1137",
4419 - "default.handlebars->27->168",
4420 - "default.handlebars->27->357"
4417 + "default.handlebars->27->1149",
4418 + "default.handlebars->27->1154",
4419 + "default.handlebars->27->169",
4420 + "default.handlebars->27->358"
4421 ]
4422 },
4423 {
@@ -4434,7 +4434,7 @@
4434 "ru": "CIRA Сервер",
4435 "zh-chs": "CIRA服務器",
4436 "xloc": [
4437 - "default.handlebars->27->1575"
4437 + "default.handlebars->27->1586"
4438 ]
4439 },
4440 {
@@ -4451,7 +4451,7 @@
4451 "ru": "CIRA Сервер команды",
4452 "zh-chs": "CIRA服務器命令",
4453 "xloc": [
4454 - "default.handlebars->27->1576"
4454 + "default.handlebars->27->1587"
4455 ]
4456 },
4457 {
@@ -4468,7 +4468,7 @@
4468 "ru": "Загрузка CPU",
4469 "zh-chs": "CPU負載",
4470 "xloc": [
4471 - "default.handlebars->27->1539"
4471 + "default.handlebars->27->1550"
4472 ]
4473 },
4474 {
@@ -4485,7 +4485,7 @@
4485 "ru": "Загрузка CPU за последние 15 минут",
4486 "zh-chs": "最近15分鐘的CPU負載",
4487 "xloc": [
4488 - "default.handlebars->27->1542"
4488 + "default.handlebars->27->1553"
4489 ]
4490 },
4491 {
@@ -4502,7 +4502,7 @@
4502 "ru": "Загрузка CPU за последние 5 минут",
4503 "zh-chs": "最近5分鐘的CPU負載",
4504 "xloc": [
4505 - "default.handlebars->27->1541"
4505 + "default.handlebars->27->1552"
4506 ]
4507 },
4508 {
@@ -4519,7 +4519,7 @@
4519 "ru": "Загрузка CPU за последнюю минуту",
4520 "zh-chs": "最後一分鐘的CPU負載",
4521 "xloc": [
4522 - "default.handlebars->27->1540"
4522 + "default.handlebars->27->1551"
4523 ]
4524 },
4525 {
@@ -4536,8 +4536,8 @@
4536 "ru": "CR+LF",
4537 "zh-chs": "CR +低頻",
4538 "xloc": [
4539 - "default.handlebars->27->658",
4540 - "default.handlebars->27->667",
4539 + "default.handlebars->27->678",
4540 + "default.handlebars->27->687",
4541 "default.handlebars->container->column_l->p12->termTable->1->1->6->1->1->terminalSettingsButtons"
4542 ]
4543 },
@@ -4555,9 +4555,9 @@
4555 "ru": "Формат CSV",
4556 "zh-chs": "CSV格式",
4557 "xloc": [
4558 - "default.handlebars->27->1300",
4559 - "default.handlebars->27->1339",
4560 - "default.handlebars->27->384"
4558 + "default.handlebars->27->1317",
4559 + "default.handlebars->27->1356",
4560 + "default.handlebars->27->385"
4561 ]
4562 },
4563 {
@@ -4574,7 +4574,7 @@
4574 "ru": "Ошибка вызова",
4575 "zh-chs": "通話錯誤",
4576 "xloc": [
4577 - "default.handlebars->27->1585"
4577 + "default.handlebars->27->1596"
4578 ]
4579 },
4580 {
@@ -4593,7 +4593,7 @@
4593 "xloc": [
4594 "default-mobile.handlebars->9->44",
4595 "default-mobile.handlebars->dialog->idx_dlgButtonBar",
4596 - "default.handlebars->27->1050",
4596 + "default.handlebars->27->1070",
4597 "default.handlebars->container->dialog->idx_dlgButtonBar",
4598 "login-mobile.handlebars->dialog->idx_dlgButtonBar",
4599 "login.handlebars->dialog->idx_dlgButtonBar",
@@ -4615,7 +4615,7 @@
4615 "ru": "Объем / Скорость",
4616 "zh-chs": "容量/速度",
4617 "xloc": [
4618 - "default.handlebars->27->761"
4618 + "default.handlebars->27->781"
4619 ]
4620 },
4621 {
@@ -4631,7 +4631,7 @@
4631 "ru": "Каталонский",
4632 "zh-chs": "加泰羅尼亞語",
4633 "xloc": [
4634 - "default.handlebars->27->831"
4634 + "default.handlebars->27->851"
4635 ]
4636 },
4637 {
@@ -4648,7 +4648,7 @@
4648 "ru": "Установить центр карты здесь",
4649 "zh-chs": "中心地圖在這裡",
4650 "xloc": [
4651 - "default.handlebars->27->424"
4651 + "default.handlebars->27->425"
4652 ]
4653 },
4654 {
@@ -4664,7 +4664,7 @@
4664 "ru": "Чаморро",
4665 "zh-chs": "查莫羅",
4666 "xloc": [
4667 - "default.handlebars->27->832"
4667 + "default.handlebars->27->852"
4668 ]
4669 },
4670 {
@@ -4681,7 +4681,7 @@
4681 "ru": "Смена email для {0}",
4682 "zh-chs": "更改{0}的電子郵件",
4683 "xloc": [
4684 - "default.handlebars->27->1466"
4684 + "default.handlebars->27->1480"
4685 ]
4686 },
4687 {
@@ -4698,9 +4698,9 @@
4698 "ru": "Смена группы",
4699 "zh-chs": "變更組",
4700 "xloc": [
4701 - "default.handlebars->27->502",
4702 - "default.handlebars->27->587",
4703 - "default.handlebars->27->588"
4701 + "default.handlebars->27->503",
4702 + "default.handlebars->27->607",
4703 + "default.handlebars->27->608"
4704 ]
4705 },
4706 {
@@ -4718,8 +4718,8 @@
4718 "zh-chs": "更改密碼",
4719 "xloc": [
4720 "default-mobile.handlebars->9->52",
4721 - "default.handlebars->27->1026",
4722 - "default.handlebars->27->1459"
4721 + "default.handlebars->27->1046",
4722 + "default.handlebars->27->1473"
4723 ]
4724 },
4725 {
@@ -4736,7 +4736,7 @@
4736 "ru": "Смена пароля для {0}",
4737 "zh-chs": "更改{0}的密碼",
4738 "xloc": [
4739 - "default.handlebars->27->1473"
4739 + "default.handlebars->27->1487"
4740 ]
4741 },
4742 {
@@ -4802,7 +4802,7 @@
4802 "pt": "Alterar a senha para este usuário",
4803 "zh-chs": "更改該用戶的密碼",
4804 "xloc": [
4805 - "default.handlebars->27->1458"
4805 + "default.handlebars->27->1472"
4806 ]
4807 },
4808 {
@@ -4836,7 +4836,7 @@
4836 "ru": "Измените адрес электронной почты вашей учетной записи здесь.",
4837 "zh-chs": "在此處更改您的帳戶電子郵件地址。",
4838 "xloc": [
4839 - "default.handlebars->27->1013"
4839 + "default.handlebars->27->1033"
4840 ]
4841 },
4842 {
@@ -4853,7 +4853,7 @@
4853 "ru": "Измените пароль своей учетной записи, введя старый пароль и дважды новый пароль в поля ниже.",
4854 "zh-chs": "在下面的框中兩次輸入舊密碼和新密碼,以更改帳戶密碼。",
4855 "xloc": [
4856 - "default.handlebars->27->1019"
4856 + "default.handlebars->27->1039"
4857 ]
4858 },
4859 {
@@ -4870,7 +4870,7 @@
4870 "ru": "Изменение языка потребует перезагрузить страницу.",
4871 "zh-chs": "更改語言將需要刷新頁面。",
4872 "xloc": [
4873 - "default.handlebars->27->998"
4873 + "default.handlebars->27->1018"
4874 ]
4875 },
4876 {
@@ -4887,8 +4887,9 @@
4887 "ru": "Чат",
4888 "zh-chs": "聊天室",
4889 "xloc": [
4890 - "default.handlebars->27->1317",
4891 - "default.handlebars->27->548"
4890 + "default.handlebars->27->1334",
4891 + "default.handlebars->27->549",
4892 + "default.handlebars->27->568"
4893 ]
4894 },
4895 {
@@ -4907,8 +4908,8 @@
4908 "xloc": [
4909 "default-mobile.handlebars->9->310",
4910 "default-mobile.handlebars->9->328",
4910 - "default.handlebars->27->1191",
4911 - "default.handlebars->27->1219"
4911 + "default.handlebars->27->1208",
4912 + "default.handlebars->27->1236"
4913 ]
4914 },
4915 {
@@ -4925,7 +4926,7 @@
4926 "ru": "Чеченский",
4927 "zh-chs": "車臣",
4928 "xloc": [
4928 - "default.handlebars->27->833"
4929 + "default.handlebars->27->853"
4930 ]
4931 },
4932 {
@@ -4993,8 +4994,8 @@
4994 "ru": "Проверка...",
4995 "zh-chs": "檢查...",
4996 "xloc": [
4996 - "default.handlebars->27->1581",
4997 - "default.handlebars->27->799"
4997 + "default.handlebars->27->1592",
4998 + "default.handlebars->27->819"
4999 ]
5000 },
5001 {
@@ -5011,7 +5012,7 @@
5012 "ru": "Китайский",
5013 "zh-chs": "中文",
5014 "xloc": [
5014 - "default.handlebars->27->834"
5015 + "default.handlebars->27->854"
5016 ]
5017 },
5018 {
@@ -5027,7 +5028,7 @@
5028 "ru": "Китайский (Гонконг)",
5029 "zh-chs": "中文(香港)",
5030 "xloc": [
5030 - "default.handlebars->27->835"
5031 + "default.handlebars->27->855"
5032 ]
5033 },
5034 {
@@ -5043,7 +5044,7 @@
5044 "ru": "Китайский (КНР)",
5045 "zh-chs": "中文(中國)",
5046 "xloc": [
5046 - "default.handlebars->27->836"
5047 + "default.handlebars->27->856"
5048 ]
5049 },
5050 {
@@ -5052,7 +5053,7 @@
5053 "nl": "Chinees (Vereenvoudigd)",
5054 "pt": "Chinês (simplificado)",
5055 "xloc": [
5055 - "default.handlebars->27->996"
5056 + "default.handlebars->27->1016"
5057 ]
5058 },
5059 {
@@ -5068,7 +5069,7 @@
5069 "ru": "Китайский (Сингапур)",
5070 "zh-chs": "中文(新加坡)",
5071 "xloc": [
5071 - "default.handlebars->27->837"
5072 + "default.handlebars->27->857"
5073 ]
5074 },
5075 {
@@ -5084,7 +5085,7 @@
5085 "ru": "Китайский (Тайвань)",
5086 "zh-chs": "中文(台灣)",
5087 "xloc": [
5087 - "default.handlebars->27->838"
5088 + "default.handlebars->27->858"
5089 ]
5090 },
5091 {
@@ -5117,7 +5118,7 @@
5118 "ru": "Чувашский",
5119 "zh-chs": "楚瓦什",
5120 "xloc": [
5120 - "default.handlebars->27->839"
5121 + "default.handlebars->27->859"
5122 ]
5123 },
5124 {
@@ -5134,7 +5135,7 @@
5135 "ru": "Очистка CIRA",
5136 "zh-chs": "清理CIRA",
5137 "xloc": [
5137 - "default.handlebars->27->246"
5138 + "default.handlebars->27->247"
5139 ]
5140 },
5141 {
@@ -5157,11 +5158,11 @@
5158 "default-mobile.handlebars->9->271",
5159 "default-mobile.handlebars->9->28",
5160 "default-mobile.handlebars->9->94",
5160 - "default.handlebars->27->1294",
5161 - "default.handlebars->27->693",
5162 - "default.handlebars->27->695",
5163 - "default.handlebars->27->697",
5164 - "default.handlebars->27->699",
5161 + "default.handlebars->27->1311",
5162 + "default.handlebars->27->713",
5163 + "default.handlebars->27->715",
5164 + "default.handlebars->27->717",
5165 + "default.handlebars->27->719",
5166 "default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->7",
5167 "default.handlebars->container->column_l->p41->3->1",
5168 "messenger.handlebars->xbottom"
@@ -5198,7 +5199,7 @@
5199 "ru": "Очистить ядро",
5200 "zh-chs": "清除核心",
5201 "xloc": [
5201 - "default.handlebars->27->777"
5202 + "default.handlebars->27->797"
5203 ]
5204 },
5205 {
@@ -5222,7 +5223,7 @@
5223 "en": "Clear this notification",
5224 "nl": "Wis deze melding",
5225 "xloc": [
5225 - "default.handlebars->27->1512"
5226 + "default.handlebars->27->1523"
5227 ]
5228 },
5229 {
@@ -5239,7 +5240,7 @@
5240 "ru": "Для изменения имени устройства на сервере нажмите сюда",
5241 "zh-chs": "單擊此處編輯服務器端設備名稱",
5242 "xloc": [
5242 - "default.handlebars->27->438"
5243 + "default.handlebars->27->439"
5244 ]
5245 },
5246 {
@@ -5257,7 +5258,7 @@
5258 "zh-chs": "單擊確定將驗證郵件發送到:",
5259 "xloc": [
5260 "default-mobile.handlebars->9->37",
5260 - "default.handlebars->27->1010"
5261 + "default.handlebars->27->1030"
5262 ]
5263 },
5264 {
@@ -5290,7 +5291,7 @@
5291 "pt": "Client Control Mode (CCM)",
5292 "zh-chs": "客戶端控制模式(CCM)",
5293 "xloc": [
5293 - "default.handlebars->27->741"
5294 + "default.handlebars->27->761"
5295 ]
5296 },
5297 {
@@ -5307,8 +5308,8 @@
5308 "ru": "Клиент инициировал удаленный доступ",
5309 "zh-chs": "客戶端啟動的遠程訪問",
5310 "xloc": [
5310 - "default.handlebars->27->1131",
5311 - "default.handlebars->27->1136"
5311 + "default.handlebars->27->1148",
5312 + "default.handlebars->27->1153"
5313 ]
5314 },
5315 {
@@ -5345,7 +5346,7 @@
5346 "default-mobile.handlebars->9->26",
5347 "default.handlebars->27->116",
5348 "default.handlebars->27->124",
5348 - "default.handlebars->27->651"
5349 + "default.handlebars->27->671"
5350 ]
5351 },
5352 {
@@ -5380,8 +5381,8 @@
5381 "ru": "Общие группы устройств",
5382 "zh-chs": "通用設備組",
5383 "xloc": [
5383 - "default.handlebars->27->1399",
5384 - "default.handlebars->27->1483"
5384 + "default.handlebars->27->1416",
5385 + "default.handlebars->27->1497"
5386 ]
5387 },
5388 {
@@ -5394,7 +5395,7 @@
5395 "pt": "Dispositivos comuns",
5396 "zh-chs": "通用設備",
5397 "xloc": [
5397 - "default.handlebars->27->1477"
5398 + "default.handlebars->27->1491"
5399 ]
5400 },
5401 {
@@ -5411,7 +5412,7 @@
5412 "zh-chs": "將{1}入口{2}中的{0}限製到此位置?",
5413 "xloc": [
5414 "default-mobile.handlebars->9->89",
5414 - "default.handlebars->27->1289"
5415 + "default.handlebars->27->1306"
5416 ]
5417 },
5418 {
@@ -5430,11 +5431,11 @@
5431 "xloc": [
5432 "default-mobile.handlebars->9->223",
5433 "default-mobile.handlebars->9->290",
5433 - "default.handlebars->27->1145",
5434 - "default.handlebars->27->1414",
5435 - "default.handlebars->27->381",
5436 - "default.handlebars->27->582",
5437 - "default.handlebars->27->591"
5434 + "default.handlebars->27->1162",
5435 + "default.handlebars->27->1428",
5436 + "default.handlebars->27->382",
5437 + "default.handlebars->27->602",
5438 + "default.handlebars->27->611"
5439 ]
5440 },
5441 {
@@ -5451,7 +5452,7 @@
5452 "zh-chs": "確認將1個副本複製到此位置?",
5453 "xloc": [
5454 "default-mobile.handlebars->9->260",
5454 - "default.handlebars->27->688"
5455 + "default.handlebars->27->708"
5456 ]
5457 },
5458 {
@@ -5468,7 +5469,7 @@
5469 "zh-chs": "確認{0}個條目的副本到此位置?",
5470 "xloc": [
5471 "default-mobile.handlebars->9->259",
5471 - "default.handlebars->27->687"
5472 + "default.handlebars->27->707"
5473 ]
5474 },
5475 {
@@ -5485,7 +5486,7 @@
5486 "ru": "Подтвердить удаление выбранных устройств?",
5487 "zh-chs": "確認刪除所選設備?",
5488 "xloc": [
5488 - "default.handlebars->27->380"
5489 + "default.handlebars->27->381"
5490 ]
5491 },
5492 {
@@ -5498,7 +5499,7 @@
5499 "pt": "Confirmar exclusão do usuário {0}?",
5500 "zh-chs": "確認刪除用戶{0}?",
5501 "xloc": [
5501 - "default.handlebars->27->1475"
5502 + "default.handlebars->27->1489"
5503 ]
5504 },
5505 {
@@ -5515,7 +5516,7 @@
5516 "zh-chs": "確認將1個入口移動到此位置?",
5517 "xloc": [
5518 "default-mobile.handlebars->9->262",
5518 - "default.handlebars->27->690"
5519 + "default.handlebars->27->710"
5520 ]
5521 },
5522 {
@@ -5532,7 +5533,7 @@
5533 "zh-chs": "確認將{0}個條目移到此位置?",
5534 "xloc": [
5535 "default-mobile.handlebars->9->261",
5535 - "default.handlebars->27->689"
5536 + "default.handlebars->27->709"
5537 ]
5538 },
5539 {
@@ -5549,7 +5550,7 @@
5550 "ru": "Подтвердить перезапись?",
5551 "zh-chs": "確認覆蓋?",
5552 "xloc": [
5552 - "default.handlebars->27->1288"
5553 + "default.handlebars->27->1305"
5554 ]
5555 },
5556 {
@@ -5567,7 +5568,7 @@
5568 "zh-chs": "確認刪除身份驗證器應用程序兩步登錄?",
5569 "xloc": [
5570 "default-mobile.handlebars->9->36",
5570 - "default.handlebars->27->789"
5571 + "default.handlebars->27->809"
5572 ]
5573 },
5574 {
@@ -5584,15 +5585,15 @@
5585 "ru": "Подтвердить удаление группы устройств {0}?",
5586 "zh-chs": "確認刪除設備組{0}?",
5587 "xloc": [
5587 - "default.handlebars->27->1409",
5588 - "default.handlebars->27->1507"
5588 + "default.handlebars->27->1423",
5589 + "default.handlebars->27->1518"
5590 ]
5591 },
5592 {
5593 "en": "Confirm removal of device {0}?",
5594 "nl": "Bevestig het verwijderen van apparaat {0}?",
5595 "xloc": [
5595 - "default.handlebars->27->1498"
5596 + "default.handlebars->27->1509"
5597 ]
5598 },
5599 {
@@ -5609,7 +5610,7 @@
5610 "ru": "Подтвердить удаление группы {0}?",
5611 "zh-chs": "確認刪除組{0}?",
5612 "xloc": [
5612 - "default.handlebars->27->1503"
5613 + "default.handlebars->27->1514"
5614 ]
5615 },
5616 {
@@ -5627,9 +5628,9 @@
5628 "zh-chs": "確認刪除用戶{0}?",
5629 "xloc": [
5630 "default-mobile.handlebars->9->336",
5630 - "default.handlebars->27->1228",
5631 - "default.handlebars->27->1417",
5632 - "default.handlebars->27->1500"
5631 + "default.handlebars->27->1245",
5632 + "default.handlebars->27->1431",
5633 + "default.handlebars->27->1511"
5634 ]
5635 },
5636 {
@@ -5649,8 +5650,8 @@
5650 "default-mobile.handlebars->9->239",
5651 "default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea1->1->3",
5652 "default-mobile.handlebars->container->page_content->column_l->p10->p10files->p13toolbar->1->0->1->3",
5652 - "default.handlebars->27->1081",
5653 - "default.handlebars->27->670",
5653 + "default.handlebars->27->1101",
5654 + "default.handlebars->27->690",
5655 "default.handlebars->container->column_l->p11->deskarea0->deskarea1->3->connectbutton1span",
5656 "default.handlebars->container->column_l->p12->termTable->1->1->0->1->3->connectbutton2span",
5657 "default.handlebars->container->column_l->p13->p13toolbar->1->0->1->3",
@@ -5671,7 +5672,7 @@
5672 "ru": "Подключиться ко всем",
5673 "zh-chs": "全部連接",
5674 "xloc": [
5674 - "default.handlebars->27->199",
5675 + "default.handlebars->27->200",
5676 "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->kvmListToolbar"
5677 ]
5678 },
@@ -5689,8 +5690,8 @@
5690 "ru": "Подключиться к серверу",
5691 "zh-chs": "連接到服務器",
5692 "xloc": [
5692 - "default.handlebars->27->1135",
5693 - "default.handlebars->27->1139"
5693 + "default.handlebars->27->1152",
5694 + "default.handlebars->27->1156"
5695 ]
5696 },
5697 {
@@ -5761,7 +5762,7 @@
5762 "ru": "Подключено Intel® AMT",
5763 "zh-chs": "連接的英特爾®AMT",
5764 "xloc": [
5764 - "default.handlebars->27->1530"
5765 + "default.handlebars->27->1541"
5766 ]
5767 },
5768 {
@@ -5778,7 +5779,7 @@
5779 "ru": "Подключенные пользователи",
5780 "zh-chs": "關聯用戶",
5781 "xloc": [
5781 - "default.handlebars->27->1535"
5782 + "default.handlebars->27->1546"
5783 ]
5784 },
5785 {
@@ -5791,7 +5792,7 @@
5792 "pt": "Conectado agora",
5793 "zh-chs": "現在已連接",
5794 "xloc": [
5794 - "default.handlebars->27->720"
5795 + "default.handlebars->27->740"
5796 ]
5797 },
5798 {
@@ -5828,10 +5829,10 @@
5829 "default-mobile.handlebars->9->2",
5830 "default-mobile.handlebars->9->275",
5831 "default-mobile.handlebars->9->6",
5831 - "default.handlebars->27->193",
5832 - "default.handlebars->27->196",
5833 - "default.handlebars->27->202",
5834 - "default.handlebars->27->711",
5832 + "default.handlebars->27->194",
5833 + "default.handlebars->27->197",
5834 + "default.handlebars->27->203",
5835 + "default.handlebars->27->731",
5836 "default.handlebars->27->9",
5837 "xterm.handlebars->9->2"
5838 ]
@@ -5850,7 +5851,7 @@
5851 "ru": "Подключений ",
5852 "zh-chs": "連接數",
5853 "xloc": [
5853 - "default.handlebars->27->1546"
5854 + "default.handlebars->27->1557"
5855 ]
5856 },
5857 {
@@ -5867,7 +5868,7 @@
5868 "ru": "Ретранслятор подключения",
5869 "zh-chs": "連接繼電器",
5870 "xloc": [
5870 - "default.handlebars->27->1574"
5871 + "default.handlebars->27->1585"
5872 ]
5873 },
5874 {
@@ -5919,9 +5920,9 @@
5920 "zh-chs": "連接性",
5921 "xloc": [
5922 "default-mobile.handlebars->9->198",
5922 - "default.handlebars->27->1259",
5923 - "default.handlebars->27->184",
5924 - "default.handlebars->27->493",
5923 + "default.handlebars->27->1276",
5924 + "default.handlebars->27->185",
5925 + "default.handlebars->27->494",
5926 "default.handlebars->container->column_l->p21->3->1->meshConnChartDiv->1"
5927 ]
5928 },
@@ -5939,7 +5940,8 @@
5940 "ru": "Консоль",
5941 "zh-chs": "安慰",
5942 "xloc": [
5942 - "default.handlebars->27->543",
5943 + "default.handlebars->27->544",
5944 + "default.handlebars->27->563",
5945 "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevConsole",
5946 "default.handlebars->container->topbar->1->1->ServerSubMenuSpan->ServerSubMenu->1->0->ServerConsole",
5947 "default.handlebars->contextMenu->cxconsole"
@@ -5959,13 +5961,14 @@
5961 "ru": "Консоль - ",
5962 "zh-chs": "安慰 -",
5963 "xloc": [
5962 - "default.handlebars->27->439"
5964 + "default.handlebars->27->440"
5965 ]
5966 },
5967 {
5968 "en": "Control",
5969 "xloc": [
5968 - "default.handlebars->27->542"
5970 + "default.handlebars->27->543",
5971 + "default.handlebars->27->562"
5972 ]
5973 },
5974 {
@@ -5981,7 +5984,7 @@
5984 "ru": "Cookie-кодировщик",
5985 "zh-chs": "Cookie編碼器",
5986 "xloc": [
5984 - "default.handlebars->27->1560"
5987 + "default.handlebars->27->1571"
5988 ]
5989 },
5990 {
@@ -6036,7 +6039,7 @@
6039 "ru": "Скопировать ссылку MacOS agent в буфер обмена",
6040 "zh-chs": "將MacOS代理URL複製到剪貼板",
6041 "xloc": [
6039 - "default.handlebars->27->321"
6042 + "default.handlebars->27->322"
6043 ]
6044 },
6045 {
@@ -6074,7 +6077,7 @@
6077 "ru": "Скопировать ссылку в буфер обмена",
6078 "zh-chs": "複製鏈接到剪貼板",
6079 "xloc": [
6077 - "default.handlebars->27->295"
6080 + "default.handlebars->27->296"
6081 ]
6082 },
6083 {
@@ -6241,7 +6244,7 @@
6244 "ru": "Основной сервер",
6245 "zh-chs": "核心服務器",
6246 "xloc": [
6244 - "default.handlebars->27->1559"
6247 + "default.handlebars->27->1570"
6248 ]
6249 },
6250 {
@@ -6257,7 +6260,7 @@
6260 "ru": "Kорсиканский",
6261 "zh-chs": "科西嘉人",
6262 "xloc": [
6260 - "default.handlebars->27->840"
6263 + "default.handlebars->27->860"
6264 ]
6265 },
6266 {
@@ -6274,7 +6277,7 @@
6277 "ru": "Создать учетную запись",
6278 "zh-chs": "創建帳號",
6279 "xloc": [
6277 - "default.handlebars->27->1359",
6280 + "default.handlebars->27->1376",
6281 "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->createpanel->1->1->9->1->12->1->1",
6282 "login.handlebars->container->column_l->centralTable->1->0->logincell->createpanel->1->9->1->12->1->1"
6283 ]
@@ -6310,7 +6313,7 @@
6313 "ru": "Создать группу пользователей",
6314 "zh-chs": "創建用戶組",
6315 "xloc": [
6313 - "default.handlebars->27->1382"
6316 + "default.handlebars->27->1399"
6317 ]
6318 },
6319 {
@@ -6327,7 +6330,7 @@
6330 "ru": "Создайте новую группу устройств, используя параметры ниже.",
6331 "zh-chs": "使用以下選項創建一個新的設備組。",
6332 "xloc": [
6330 - "default.handlebars->27->1033"
6333 + "default.handlebars->27->1053"
6334 ]
6335 },
6336 {
@@ -6344,7 +6347,7 @@
6347 "ru": "Создать новую группу устройств.",
6348 "zh-chs": "創建一個新的設備組。",
6349 "xloc": [
6347 - "default.handlebars->27->186"
6350 + "default.handlebars->27->187"
6351 ]
6352 },
6353 {
@@ -6361,7 +6364,7 @@
6364 "ru": "Создайте сразу несколько учетных записей, импортировав файл JSON в следующем формате:",
6365 "zh-chs": "通過導入以下格式的JSON文件一次創建多個帳戶:",
6366 "xloc": [
6364 - "default.handlebars->27->1330"
6367 + "default.handlebars->27->1347"
6368 ]
6369 },
6370 {
@@ -6396,7 +6399,7 @@
6399 "ru": "Создано",
6400 "zh-chs": "創建",
6401 "xloc": [
6399 - "default.handlebars->27->1436"
6402 + "default.handlebars->27->1450"
6403 ]
6404 },
6405 {
@@ -6428,7 +6431,7 @@
6431 "ru": "Кри (Канадский язык)",
6432 "zh-chs": "克里",
6433 "xloc": [
6431 - "default.handlebars->27->841"
6434 + "default.handlebars->27->861"
6435 ]
6436 },
6437 {
@@ -6443,7 +6446,7 @@
6446 "ru": "Хорватский",
6447 "zh-chs": "克羅地亞語",
6448 "xloc": [
6446 - "default.handlebars->27->842"
6449 + "default.handlebars->27->862"
6450 ]
6451 },
6452 {
@@ -6583,7 +6586,7 @@
6586 "ru": "Чешский",
6587 "zh-chs": "捷克文",
6588 "xloc": [
6586 - "default.handlebars->27->843"
6589 + "default.handlebars->27->863"
6590 ]
6591 },
6592 {
@@ -6616,7 +6619,7 @@
6619 "ru": "Датский",
6620 "zh-chs": "丹麥文",
6621 "xloc": [
6619 - "default.handlebars->27->844"
6622 + "default.handlebars->27->864"
6623 ]
6624 },
6625 {
@@ -6632,7 +6635,7 @@
6635 "ru": "DataChannel",
6636 "zh-chs": "數據通道",
6637 "xloc": [
6635 - "default.handlebars->27->628"
6638 + "default.handlebars->27->648"
6639 ]
6640 },
6641 {
@@ -6649,7 +6652,7 @@
6652 "ru": "Дата & Время",
6653 "zh-chs": "日期和時間",
6654 "xloc": [
6652 - "default.handlebars->27->1001"
6655 + "default.handlebars->27->1021"
6656 ]
6657 },
6658 {
@@ -6666,7 +6669,7 @@
6669 "ru": "День",
6670 "zh-chs": "天",
6671 "xloc": [
6669 - "default.handlebars->27->566"
6672 + "default.handlebars->27->586"
6673 ]
6674 },
6675 {
@@ -6683,7 +6686,7 @@
6686 "ru": "Деактивировать режим управления клиентом (CCM)",
6687 "zh-chs": "停用客戶端控制模式(CCM)",
6688 "xloc": [
6686 - "default.handlebars->27->1123"
6689 + "default.handlebars->27->1140"
6690 ]
6691 },
6692 {
@@ -6701,7 +6704,7 @@
6704 "zh-chs": "沉睡",
6705 "xloc": [
6706 "default-mobile.handlebars->9->113",
6704 - "default.handlebars->27->340"
6707 + "default.handlebars->27->341"
6708 ]
6709 },
6710 {
@@ -6722,9 +6725,9 @@
6725 "default-mobile.handlebars->9->84",
6726 "default-mobile.handlebars->container->page_content->column_l->p10->p10files->p13toolbar->1->2->1->1",
6727 "default-mobile.handlebars->container->page_content->column_l->p5->p5myfiles->p5toolbar->1->0->1->1",
6725 - "default.handlebars->27->1283",
6726 - "default.handlebars->27->411",
6727 - "default.handlebars->27->680",
6728 + "default.handlebars->27->1300",
6729 + "default.handlebars->27->412",
6730 + "default.handlebars->27->700",
6731 "default.handlebars->container->column_l->p13->p13toolbar->1->2->1->3",
6732 "default.handlebars->container->column_l->p5->p5toolbar->1->0->p5filehead->3",
6733 "default.handlebars->container->dialog->idx_dlgButtonBar->5",
@@ -6748,7 +6751,7 @@
6751 "zh-chs": "刪除帳戶",
6752 "xloc": [
6753 "default-mobile.handlebars->9->46",
6751 - "default.handlebars->27->1018"
6754 + "default.handlebars->27->1038"
6755 ]
6756 },
6757 {
@@ -6766,7 +6769,7 @@
6769 "zh-chs": "刪除裝置",
6770 "xloc": [
6771 "default-mobile.handlebars->9->202",
6769 - "default.handlebars->27->504"
6772 + "default.handlebars->27->505"
6773 ]
6774 },
6775 {
@@ -6785,8 +6788,8 @@
6788 "xloc": [
6789 "default-mobile.handlebars->9->288",
6790 "default-mobile.handlebars->9->291",
6788 - "default.handlebars->27->1116",
6789 - "default.handlebars->27->1146"
6791 + "default.handlebars->27->1133",
6792 + "default.handlebars->27->1163"
6793 ]
6794 },
6795 {
@@ -6804,7 +6807,7 @@
6807 "zh-chs": "刪除節點",
6808 "xloc": [
6809 "default-mobile.handlebars->9->221",
6807 - "default.handlebars->27->592"
6810 + "default.handlebars->27->612"
6811 ]
6812 },
6813 {
@@ -6821,7 +6824,7 @@
6824 "ru": "Удалить устройства",
6825 "zh-chs": "刪除節點",
6826 "xloc": [
6824 - "default.handlebars->27->382"
6827 + "default.handlebars->27->383"
6828 ]
6829 },
6830 {
@@ -6838,7 +6841,7 @@
6841 "ru": "Удалить пользователя",
6842 "zh-chs": "刪除用戶",
6843 "xloc": [
6841 - "default.handlebars->27->1457"
6844 + "default.handlebars->27->1471"
6845 ]
6846 },
6847 {
@@ -6855,8 +6858,8 @@
6858 "ru": "Удалить группу пользователей",
6859 "zh-chs": "刪除用戶組",
6860 "xloc": [
6858 - "default.handlebars->27->1407",
6859 - "default.handlebars->27->1415"
6861 + "default.handlebars->27->1421",
6862 + "default.handlebars->27->1429"
6863 ]
6864 },
6865 {
@@ -6873,7 +6876,7 @@
6876 "ru": "Удалить пользователя {0}",
6877 "zh-chs": "刪除用戶{0}",
6878 "xloc": [
6876 - "default.handlebars->27->1474"
6879 + "default.handlebars->27->1488"
6880 ]
6881 },
6882 {
@@ -6908,7 +6911,7 @@
6911 "ru": "Удалить устройства",
6912 "zh-chs": "刪除設備",
6913 "xloc": [
6911 - "default.handlebars->27->377"
6914 + "default.handlebars->27->378"
6915 ]
6916 },
6917 {
@@ -6922,7 +6925,7 @@
6925 "pt": "Apagar item?",
6926 "zh-chs": "刪除項目?",
6927 "xloc": [
6925 - "default.handlebars->27->412"
6928 + "default.handlebars->27->413"
6929 ]
6930 },
6931 {
@@ -6941,8 +6944,8 @@
6944 "xloc": [
6945 "default-mobile.handlebars->9->254",
6946 "default-mobile.handlebars->9->86",
6944 - "default.handlebars->27->1285",
6945 - "default.handlebars->27->682"
6947 + "default.handlebars->27->1302",
6948 + "default.handlebars->27->702"
6949 ]
6950 },
6951 {
@@ -6959,7 +6962,7 @@
6962 "ru": "Удалить группу пользователей {0}?",
6963 "zh-chs": "刪除用戶組{0}?",
6964 "xloc": [
6962 - "default.handlebars->27->1413"
6965 + "default.handlebars->27->1427"
6966 ]
6967 },
6968 {
@@ -6978,8 +6981,8 @@
6981 "xloc": [
6982 "default-mobile.handlebars->9->253",
6983 "default-mobile.handlebars->9->85",
6981 - "default.handlebars->27->1284",
6982 - "default.handlebars->27->681"
6984 + "default.handlebars->27->1301",
6985 + "default.handlebars->27->701"
6986 ]
6987 },
6988 {
@@ -7079,17 +7082,17 @@
7082 "default-mobile.handlebars->9->280",
7083 "default-mobile.handlebars->9->293",
7084 "default-mobile.handlebars->9->63",
7082 - "default.handlebars->27->1038",
7083 - "default.handlebars->27->1062",
7084 - "default.handlebars->27->1148",
7085 - "default.handlebars->27->1381",
7086 - "default.handlebars->27->1386",
7087 - "default.handlebars->27->1388",
7088 - "default.handlebars->27->1411",
7089 - "default.handlebars->27->451",
7085 + "default.handlebars->27->1058",
7086 + "default.handlebars->27->1082",
7087 + "default.handlebars->27->1165",
7088 + "default.handlebars->27->1398",
7089 + "default.handlebars->27->1403",
7090 + "default.handlebars->27->1405",
7091 + "default.handlebars->27->1425",
7092 "default.handlebars->27->452",
7091 - "default.handlebars->27->624",
7092 - "default.handlebars->27->726",
7093 + "default.handlebars->27->453",
7094 + "default.handlebars->27->644",
7095 + "default.handlebars->27->746",
7096 "default.handlebars->27->77",
7097 "default.handlebars->container->column_l->p42->p42tbl->1->0->3"
7098 ]
@@ -7121,8 +7124,8 @@
7124 "ru": "Рабочий стол",
7125 "zh-chs": "桌面",
7126 "xloc": [
7124 - "default.handlebars->27->1150",
7125 - "default.handlebars->27->417",
7127 + "default.handlebars->27->1167",
7128 + "default.handlebars->27->418",
7129 "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevDesktop",
7130 "default.handlebars->contextMenu->cxdesktop"
7131 ]
@@ -7158,7 +7161,7 @@
7161 "ru": "Уведомление на рабочем столе",
7162 "zh-chs": "桌面通知",
7163 "xloc": [
7161 - "default.handlebars->27->1072"
7164 + "default.handlebars->27->1092"
7165 ]
7166 },
7167 {
@@ -7175,7 +7178,7 @@
7178 "ru": "Запрос рабочего стола",
7179 "zh-chs": "桌面提示",
7180 "xloc": [
7178 - "default.handlebars->27->1071"
7181 + "default.handlebars->27->1091"
7182 ]
7183 },
7184 {
@@ -7191,7 +7194,7 @@
7194 "ru": "Запрос рабочего стола + панель инструментов",
7195 "zh-chs": "桌面提示+工具欄",
7196 "xloc": [
7194 - "default.handlebars->27->1069"
7197 + "default.handlebars->27->1089"
7198 ]
7199 },
7200 {
@@ -7207,7 +7210,7 @@
7210 "ru": "Панель инструментов рабочего стола",
7211 "zh-chs": "桌面工具欄",
7212 "xloc": [
7210 - "default.handlebars->27->1070"
7213 + "default.handlebars->27->1090"
7214 ]
7215 },
7216 {
@@ -7274,8 +7277,8 @@
7277 "ru": "Устройство",
7278 "zh-chs": "設備",
7279 "xloc": [
7277 - "default.handlebars->27->1172",
7278 - "default.handlebars->27->1480",
7280 + "default.handlebars->27->1189",
7281 + "default.handlebars->27->1494",
7282 "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSort->sortselect->5"
7283 ]
7284 },
@@ -7293,7 +7296,7 @@
7296 "zh-chs": "設備動作",
7297 "xloc": [
7298 "default-mobile.handlebars->9->214",
7296 - "default.handlebars->27->565"
7299 + "default.handlebars->27->585"
7300 ]
7301 },
7302 {
@@ -7310,12 +7313,11 @@
7313 "ru": "Группа устройства",
7314 "zh-chs": "設備組",
7315 "xloc": [
7313 - "default.handlebars->27->1168",
7314 - "default.handlebars->27->1170",
7315 - "default.handlebars->27->1171",
7316 - "default.handlebars->27->1405",
7317 - "default.handlebars->27->1489",
7318 - "default.handlebars->27->1495"
7316 + "default.handlebars->27->1185",
7317 + "default.handlebars->27->1187",
7318 + "default.handlebars->27->1188",
7319 + "default.handlebars->27->1419",
7320 + "default.handlebars->27->1500"
7321 ]
7322 },
7323 {
@@ -7333,7 +7335,7 @@
7335 "zh-chs": "設備組用戶",
7336 "xloc": [
7337 "default-mobile.handlebars->9->334",
7336 - "default.handlebars->27->1226"
7338 + "default.handlebars->27->1243"
7339 ]
7340 },
7341 {
@@ -7351,10 +7353,10 @@
7353 "zh-chs": "設備組",
7354 "xloc": [
7355 "default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->3",
7354 - "default.handlebars->27->1377",
7355 - "default.handlebars->27->1390",
7356 - "default.handlebars->27->1445",
7357 - "default.handlebars->27->1533",
7356 + "default.handlebars->27->1394",
7357 + "default.handlebars->27->1407",
7358 + "default.handlebars->27->1459",
7359 + "default.handlebars->27->1544",
7360 "default.handlebars->container->column_l->p2->9"
7361 ]
7362 },
@@ -7369,7 +7371,7 @@
7371 "pt": "Exportação de informações do dispositivo",
7372 "zh-chs": "設備信息導出",
7373 "xloc": [
7372 - "default.handlebars->27->388"
7374 + "default.handlebars->27->389"
7375 ]
7376 },
7377 {
@@ -7386,7 +7388,7 @@
7388 "ru": "Местонахождение устройства",
7389 "zh-chs": "設備位置",
7390 "xloc": [
7389 - "default.handlebars->27->593"
7391 + "default.handlebars->27->613"
7392 ]
7393 },
7394 {
@@ -7404,8 +7406,8 @@
7406 "zh-chs": "設備名稱",
7407 "xloc": [
7408 "default-mobile.handlebars->9->225",
7407 - "default.handlebars->27->220",
7408 - "default.handlebars->27->622",
7409 + "default.handlebars->27->221",
7410 + "default.handlebars->27->642",
7411 "player.handlebars->3->9"
7412 ]
7413 },
@@ -7423,7 +7425,7 @@
7425 "ru": "Уведомление устройства",
7426 "zh-chs": "設備通知",
7427 "xloc": [
7426 - "default.handlebars->27->556"
7428 + "default.handlebars->27->576"
7429 ]
7430 },
7431 {
@@ -7456,8 +7458,8 @@
7458 "ru": "Подключения устройств.",
7459 "zh-chs": "設備連接。",
7460 "xloc": [
7459 - "default.handlebars->27->1006",
7460 - "default.handlebars->27->1245"
7461 + "default.handlebars->27->1026",
7462 + "default.handlebars->27->1262"
7463 ]
7464 },
7465 {
@@ -7474,8 +7476,8 @@
7476 "ru": "Отключения устройств.",
7477 "zh-chs": "設備斷開連接。",
7478 "xloc": [
7477 - "default.handlebars->27->1007",
7478 - "default.handlebars->27->1246"
7479 + "default.handlebars->27->1027",
7480 + "default.handlebars->27->1263"
7481 ]
7482 },
7483 {
@@ -7492,7 +7494,7 @@
7494 "ru": "Примечания могут быть просмотрены и изменены другими администраторами.",
7495 "zh-chs": "其他設備組管理員可以查看和更改設備組註釋。",
7496 "xloc": [
7495 - "default.handlebars->27->554"
7497 + "default.handlebars->27->574"
7498 ]
7499 },
7500 {
@@ -7509,7 +7511,7 @@
7511 "ru": "Устройство обнаружено, но состояние питания не может быть получено.",
7512 "zh-chs": "檢測到設備,但無法獲得電源狀態。",
7513 "xloc": [
7512 - "default.handlebars->27->345"
7514 + "default.handlebars->27->346"
7515 ]
7516 },
7517 {
@@ -7527,7 +7529,7 @@
7529 "zh-chs": "設備正在休眠(S4)",
7530 "xloc": [
7531 "default-mobile.handlebars->9->121",
7530 - "default.handlebars->27->351"
7532 + "default.handlebars->27->352"
7533 ]
7534 },
7535 {
@@ -7545,7 +7547,7 @@
7547 "zh-chs": "設備處於深度睡眠狀態(S3)",
7548 "xloc": [
7549 "default-mobile.handlebars->9->120",
7548 - "default.handlebars->27->350"
7550 + "default.handlebars->27->351"
7551 ]
7552 },
7553 {
@@ -7562,7 +7564,7 @@
7564 "ru": "Устройство находится в состоянии глубокого сна (S3).",
7565 "zh-chs": "設備處於深度睡眠狀態(S3)。",
7566 "xloc": [
7565 - "default.handlebars->27->339"
7567 + "default.handlebars->27->340"
7568 ]
7569 },
7570 {
@@ -7579,7 +7581,7 @@
7581 "ru": "Устройство находится в режиме гибернации (S4).",
7582 "zh-chs": "設備處於休眠狀態(S4)。",
7583 "xloc": [
7582 - "default.handlebars->27->341"
7584 + "default.handlebars->27->342"
7585 ]
7586 },
7587 {
@@ -7596,7 +7598,7 @@
7598 "ru": "Устройство находится в выключенном состоянии (S5).",
7599 "zh-chs": "設備處於關機狀態(S5)。",
7600 "xloc": [
7599 - "default.handlebars->27->343"
7601 + "default.handlebars->27->344"
7602 ]
7603 },
7604 {
@@ -7614,7 +7616,7 @@
7616 "zh-chs": "設備處於睡眠狀態(S1)",
7617 "xloc": [
7618 "default-mobile.handlebars->9->118",
7617 - "default.handlebars->27->348"
7619 + "default.handlebars->27->349"
7620 ]
7621 },
7622 {
@@ -7631,7 +7633,7 @@
7633 "ru": "Устройство находится в спящем режиме (S1).",
7634 "zh-chs": "設備處於睡眠狀態(S1)。",
7635 "xloc": [
7634 - "default.handlebars->27->335"
7636 + "default.handlebars->27->336"
7637 ]
7638 },
7639 {
@@ -7649,7 +7651,7 @@
7651 "zh-chs": "設備處於睡眠狀態(S2)",
7652 "xloc": [
7653 "default-mobile.handlebars->9->119",
7652 - "default.handlebars->27->349"
7654 + "default.handlebars->27->350"
7655 ]
7656 },
7657 {
@@ -7666,7 +7668,7 @@
7668 "ru": "Устройство находится в спящем режиме (S2).",
7669 "zh-chs": "設備處於睡眠狀態(S2)。",
7670 "xloc": [
7669 - "default.handlebars->27->337"
7671 + "default.handlebars->27->338"
7672 ]
7673 },
7674 {
@@ -7684,7 +7686,7 @@
7686 "zh-chs": "設備處於軟斷開狀態(S5)",
7687 "xloc": [
7688 "default-mobile.handlebars->9->122",
7687 - "default.handlebars->27->352"
7689 + "default.handlebars->27->353"
7690 ]
7691 },
7692 {
@@ -7702,7 +7704,7 @@
7704 "zh-chs": "設備已上電",
7705 "xloc": [
7706 "default-mobile.handlebars->9->117",
7705 - "default.handlebars->27->347"
7707 + "default.handlebars->27->348"
7708 ]
7709 },
7710 {
@@ -7719,7 +7721,7 @@
7721 "ru": "Устройство включено.",
7722 "zh-chs": "設備上電。",
7723 "xloc": [
7722 - "default.handlebars->27->333"
7724 + "default.handlebars->27->334"
7725 ]
7726 },
7727 {
@@ -7737,7 +7739,7 @@
7739 "zh-chs": "設備存在,但無法確定電源狀態",
7740 "xloc": [
7741 "default-mobile.handlebars->9->123",
7740 - "default.handlebars->27->353"
7742 + "default.handlebars->27->354"
7743 ]
7744 },
7745 {
@@ -7754,7 +7756,7 @@
7756 "ru": "Имя устройства",
7757 "zh-chs": "設備名稱",
7758 "xloc": [
7757 - "default.handlebars->27->429"
7759 + "default.handlebars->27->430"
7760 ]
7761 },
7762 {
@@ -7770,7 +7772,7 @@
7772 "ru": "DeviceCheckbox",
7773 "zh-chs": "設備複選框",
7774 "xloc": [
7773 - "default.handlebars->27->379"
7775 + "default.handlebars->27->380"
7776 ]
7777 },
7778 {
@@ -7787,7 +7789,7 @@
7789 "ru": "Отключено",
7790 "zh-chs": "殘障人士",
7791 "xloc": [
7790 - "default.handlebars->27->478"
7792 + "default.handlebars->27->479"
7793 ]
7794 },
7795 {
@@ -7806,8 +7808,8 @@
7808 "xloc": [
7809 "default-mobile.handlebars->9->240",
7810 "default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea1->1->3",
7809 - "default.handlebars->27->1082",
7810 - "default.handlebars->27->671",
7811 + "default.handlebars->27->1102",
7812 + "default.handlebars->27->691",
7813 "default.handlebars->container->column_l->p11->deskarea0->deskarea1->3->disconnectbutton1span",
7814 "default.handlebars->container->column_l->p12->termTable->1->1->0->1->3->disconnectbutton2span",
7815 "xterm.handlebars->p11->deskarea0->deskarea1->3"
@@ -7847,10 +7849,10 @@
7849 "default-mobile.handlebars->9->1",
7850 "default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea1->1->3->deskstatus",
7851 "default-mobile.handlebars->container->page_content->column_l->p10->p10files->p13toolbar->1->0->1->3->p13Status",
7850 - "default.handlebars->27->175",
7851 - "default.handlebars->27->192",
7852 - "default.handlebars->27->195",
7853 - "default.handlebars->27->201",
7852 + "default.handlebars->27->176",
7853 + "default.handlebars->27->193",
7854 + "default.handlebars->27->196",
7855 + "default.handlebars->27->202",
7856 "default.handlebars->27->8",
7857 "default.handlebars->container->column_l->p11->deskarea0->deskarea1->3->deskstatus",
7858 "default.handlebars->container->column_l->p12->termTable->1->1->0->1->3->termstatus",
@@ -7889,7 +7891,7 @@
7891 "ru": "Отобразить имя группы устройств",
7892 "zh-chs": "顯示設備組名稱",
7893 "xloc": [
7892 - "default.handlebars->27->1005"
7894 + "default.handlebars->27->1025"
7895 ]
7896 },
7897 {
@@ -7906,7 +7908,7 @@
7908 "ru": "Отображаемое имя",
7909 "zh-chs": "顯示名稱",
7910 "xloc": [
7909 - "default.handlebars->27->642"
7911 + "default.handlebars->27->662"
7912 ]
7913 },
7914 {
@@ -7923,7 +7925,7 @@
7925 "ru": "Ничего не делать",
7926 "zh-chs": "沒做什麼",
7927 "xloc": [
7926 - "default.handlebars->27->1129"
7928 + "default.handlebars->27->1146"
7929 ]
7930 },
7931 {
@@ -7958,8 +7960,8 @@
7960 "ru": "Не настраивать",
7961 "zh-chs": "不要配置",
7962 "xloc": [
7961 - "default.handlebars->27->1133",
7962 - "default.handlebars->27->1138"
7963 + "default.handlebars->27->1150",
7964 + "default.handlebars->27->1155"
7965 ]
7966 },
7967 {
@@ -7976,7 +7978,7 @@
7978 "ru": "Не подключаться к серверу",
7979 "zh-chs": "不連接服務器",
7980 "xloc": [
7979 - "default.handlebars->27->1134"
7981 + "default.handlebars->27->1151"
7982 ]
7983 },
7984 {
@@ -8030,7 +8032,7 @@
8032 "zh-chs": "下載文件",
8033 "xloc": [
8034 "default-mobile.handlebars->9->273",
8033 - "default.handlebars->27->700"
8035 + "default.handlebars->27->720"
8036 ]
8037 },
8038 {
@@ -8047,7 +8049,7 @@
8049 "ru": "Скачать MeshCentral Router, инструмент сопоставления TCP портов.",
8050 "zh-chs": "下載MeshCentral Router,一個TCP端口映射工具。",
8051 "xloc": [
8050 - "default.handlebars->27->190"
8052 + "default.handlebars->27->191"
8053 ]
8054 },
8055 {
@@ -8064,7 +8066,7 @@
8066 "ru": "Скачать MeshCmd",
8067 "zh-chs": "下載MeshCmd",
8068 "xloc": [
8067 - "default.handlebars->27->613"
8069 + "default.handlebars->27->633"
8070 ]
8071 },
8072 {
@@ -8081,7 +8083,7 @@
8083 "ru": "Скачать MeshCmd, инструмент командной строки, выполняющий множество функций.",
8084 "zh-chs": "下載MeshCmd,這是一個執行許多功能的命令行工具。",
8085 "xloc": [
8084 - "default.handlebars->27->188"
8086 + "default.handlebars->27->189"
8087 ]
8088 },
8089 {
@@ -8113,7 +8115,7 @@
8115 "ru": "Скачайте \\\"meshcmd\\\" с файлом команд для маршрутизации трафика к этому устройству через сервер. Не забудьте указать пароль от своей учетной записи в meshaction.txt и сделать другие правки при необходимости.",
8116 "zh-chs": "下載帶有動作文件的“ meshcmd”,以將通過此服務器的流量路由到該設備。確保編輯meshaction.txt並添加您的帳戶密碼或進行任何必要的更改。",
8117 "xloc": [
8116 - "default.handlebars->27->606"
8118 + "default.handlebars->27->626"
8119 ]
8120 },
8121 {
@@ -8181,7 +8183,7 @@
8183 "ru": "Скачать события состояния питания",
8184 "zh-chs": "下載電源事件",
8185 "xloc": [
8184 - "default.handlebars->27->567"
8186 + "default.handlebars->27->587"
8187 ]
8188 },
8189 {
@@ -8229,7 +8231,7 @@
8231 "pt": "Faça o download da lista de dispositivos com um dos formatos de arquivo abaixo.",
8232 "zh-chs": "使用以下一種文件格式下載設備列表。",
8233 "xloc": [
8232 - "default.handlebars->27->383"
8234 + "default.handlebars->27->384"
8235 ]
8236 },
8237 {
@@ -8246,7 +8248,7 @@
8248 "ru": "Скачать список событий в одном из форматов ниже.",
8249 "zh-chs": "使用以下一種文件格式下載事件列表。",
8250 "xloc": [
8249 - "default.handlebars->27->1299"
8251 + "default.handlebars->27->1316"
8252 ]
8253 },
8254 {
@@ -8263,7 +8265,7 @@
8265 "ru": "Скачать список пользователей в одном из форматов ниже.",
8266 "zh-chs": "使用以下一種文件格式下載用戶列表。",
8267 "xloc": [
8266 - "default.handlebars->27->1338"
8268 + "default.handlebars->27->1355"
8269 ]
8270 },
8271 {
@@ -8349,7 +8351,7 @@
8351 "ru": "Скопировать агент",
8352 "zh-chs": "代理重複",
8353 "xloc": [
8352 - "default.handlebars->27->1529"
8354 + "default.handlebars->27->1540"
8355 ]
8356 },
8357 {
@@ -8383,7 +8385,7 @@
8385 "ru": "Скопировать группу пользователей",
8386 "zh-chs": "重複的用戶組",
8387 "xloc": [
8386 - "default.handlebars->27->1383"
8388 + "default.handlebars->27->1400"
8389 ]
8390 },
8391 {
@@ -8417,7 +8419,7 @@
8419 "ru": "Во время активации агент будет иметь доступ к паролю администратора.",
8420 "zh-chs": "在激活期間,代理將有權訪問管理員密碼信息。",
8421 "xloc": [
8420 - "default.handlebars->27->1143"
8422 + "default.handlebars->27->1160"
8423 ]
8424 },
8425 {
@@ -8433,7 +8435,7 @@
8435 "ru": "Голландский (Бельгийский)",
8436 "zh-chs": "荷蘭語(比利時)",
8437 "xloc": [
8436 - "default.handlebars->27->846"
8438 + "default.handlebars->27->866"
8439 ]
8440 },
8441 {
@@ -8449,7 +8451,7 @@
8451 "ru": "Голландский (Стандартный)",
8452 "zh-chs": "荷蘭語(標準)",
8453 "xloc": [
8452 - "default.handlebars->27->845"
8454 + "default.handlebars->27->865"
8455 ]
8456 },
8457 {
@@ -8536,7 +8538,7 @@
8538 "zh-chs": "編輯裝置",
8539 "xloc": [
8540 "default-mobile.handlebars->9->230",
8539 - "default.handlebars->27->627"
8541 + "default.handlebars->27->647"
8542 ]
8543 },
8544 {
@@ -8556,9 +8558,9 @@
8558 "default-mobile.handlebars->9->294",
8559 "default-mobile.handlebars->9->296",
8560 "default-mobile.handlebars->9->314",
8559 - "default.handlebars->27->1149",
8560 - "default.handlebars->27->1176",
8561 - "default.handlebars->27->1204"
8561 + "default.handlebars->27->1166",
8562 + "default.handlebars->27->1193",
8563 + "default.handlebars->27->1221"
8564 ]
8565 },
8566 {
@@ -8575,7 +8577,7 @@
8577 "ru": "Редактировать функции группы устройств",
8578 "zh-chs": "編輯設備組功能",
8579 "xloc": [
8578 - "default.handlebars->27->1163"
8580 + "default.handlebars->27->1180"
8581 ]
8582 },
8583 {
@@ -8592,7 +8594,7 @@
8594 "ru": "Редактировать права группы устройств",
8595 "zh-chs": "編輯設備組權限",
8596 "xloc": [
8595 - "default.handlebars->27->1201"
8597 + "default.handlebars->27->1218"
8598 ]
8599 },
8600 {
@@ -8609,7 +8611,7 @@
8611 "ru": "Редактировать согласие пользователя группы устройств",
8612 "zh-chs": "編輯設備組用戶同意",
8613 "xloc": [
8612 - "default.handlebars->27->1160"
8614 + "default.handlebars->27->1177"
8615 ]
8616 },
8617 {
@@ -8627,14 +8629,20 @@
8629 "zh-chs": "編輯設備說明",
8630 "xloc": [
8631 "default-mobile.handlebars->9->308",
8630 - "default.handlebars->27->1189"
8632 + "default.handlebars->27->1206"
8633 ]
8634 },
8635 {
8636 "en": "Edit Device Permissions",
8637 "nl": "Bewerk apparaatrechten",
8638 "xloc": [
8637 - "default.handlebars->27->1198"
8639 + "default.handlebars->27->1215"
8640 + ]
8641 + },
8642 + {
8643 + "en": "Edit Group",
8644 + "xloc": [
8645 + "default.handlebars->27->553"
8646 ]
8647 },
8648 {
@@ -8652,9 +8660,9 @@
8660 "zh-chs": "編輯英特爾®AMT憑據",
8661 "xloc": [
8662 "default-mobile.handlebars->9->220",
8655 - "default.handlebars->27->466",
8656 - "default.handlebars->27->469",
8657 - "default.handlebars->27->574"
8663 + "default.handlebars->27->467",
8664 + "default.handlebars->27->470",
8665 + "default.handlebars->27->594"
8666 ]
8667 },
8668 {
@@ -8672,7 +8680,7 @@
8680 "zh-chs": "編輯筆記",
8681 "xloc": [
8682 "default-mobile.handlebars->9->321",
8675 - "default.handlebars->27->1211"
8683 + "default.handlebars->27->1228"
8684 ]
8685 },
8686 {
@@ -8689,13 +8697,13 @@
8697 "ru": "Редактировать права пользователя для группы устройств",
8698 "zh-chs": "編輯用戶設備組權限",
8699 "xloc": [
8692 - "default.handlebars->27->1202"
8700 + "default.handlebars->27->1219"
8701 ]
8702 },
8703 {
8704 "en": "Edit User Device Permissions",
8705 "xloc": [
8698 - "default.handlebars->27->1199"
8706 + "default.handlebars->27->1216"
8707 ]
8708 },
8709 {
@@ -8712,7 +8720,7 @@
8720 "ru": "Редактировать группу пользователей",
8721 "zh-chs": "編輯用戶組",
8722 "xloc": [
8715 - "default.handlebars->27->1412"
8723 + "default.handlebars->27->1426"
8724 ]
8725 },
8726 {
@@ -8746,11 +8754,11 @@
8754 "zh-chs": "電子郵件",
8755 "xloc": [
8756 "default-mobile.handlebars->9->40",
8749 - "default.handlebars->27->1350",
8750 - "default.handlebars->27->1432",
8751 - "default.handlebars->27->1433",
8752 - "default.handlebars->27->1462",
8753 - "default.handlebars->27->266",
8757 + "default.handlebars->27->1367",
8758 + "default.handlebars->27->1446",
8759 + "default.handlebars->27->1447",
8760 + "default.handlebars->27->1476",
8761 + "default.handlebars->27->267",
8762 "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->tokenpanel->1->7->1->4->1->3",
8763 "login.handlebars->container->column_l->centralTable->1->0->logincell->tokenpanel->1->7->1->4->1->3"
8764 ]
@@ -8770,7 +8778,7 @@
8778 "zh-chs": "電郵地址變更",
8779 "xloc": [
8780 "default-mobile.handlebars->9->41",
8773 - "default.handlebars->27->1014"
8781 + "default.handlebars->27->1034"
8782 ]
8783 },
8784 {
@@ -8784,14 +8792,14 @@
8792 "zh-chs": "郵件認證",
8793 "xloc": [
8794 "default-mobile.handlebars->9->30",
8787 - "default.handlebars->27->783"
8795 + "default.handlebars->27->803"
8796 ]
8797 },
8798 {
8799 "en": "Email Traffic",
8800 "nl": "E-mailverkeer",
8801 "xloc": [
8794 - "default.handlebars->27->1568"
8802 + "default.handlebars->27->1579"
8803 ]
8804 },
8805 {
@@ -8809,7 +8817,7 @@
8817 "zh-chs": "電子郵件驗證",
8818 "xloc": [
8819 "default-mobile.handlebars->9->39",
8812 - "default.handlebars->27->1012"
8820 + "default.handlebars->27->1032"
8821 ]
8822 },
8823 {
@@ -8826,7 +8834,7 @@
8834 "ru": "Email подтвержден",
8835 "zh-chs": "電子郵件已驗證",
8836 "xloc": [
8829 - "default.handlebars->27->1429"
8837 + "default.handlebars->27->1443"
8838 ]
8839 },
8840 {
@@ -8843,7 +8851,7 @@
8851 "ru": "Email подтвержден.",
8852 "zh-chs": "電子郵件已驗證。",
8853 "xloc": [
8846 - "default.handlebars->27->1356"
8854 + "default.handlebars->27->1373"
8855 ]
8856 },
8857 {
@@ -8860,7 +8868,7 @@
8868 "ru": "Email не подтвержден",
8869 "zh-chs": "電子郵件未驗證",
8870 "xloc": [
8863 - "default.handlebars->27->1430"
8871 + "default.handlebars->27->1444"
8872 ]
8873 },
8874 {
@@ -8908,7 +8916,7 @@
8916 "pt": "Ativar códigos de convite",
8917 "zh-chs": "啟用邀請代碼",
8918 "xloc": [
8911 - "default.handlebars->27->1230"
8919 + "default.handlebars->27->1247"
8920 ]
8921 },
8922 {
@@ -8939,7 +8947,7 @@
8947 "zh-chs": "啟用電子郵件兩因素驗證。",
8948 "xloc": [
8949 "default-mobile.handlebars->9->32",
8942 - "default.handlebars->27->785"
8950 + "default.handlebars->27->805"
8951 ]
8952 },
8953 {
@@ -8990,7 +8998,7 @@
8998 "ru": "Английский",
8999 "zh-chs": "英語",
9000 "xloc": [
8993 - "default.handlebars->27->847"
9001 + "default.handlebars->27->867"
9002 ]
9003 },
9004 {
@@ -9006,7 +9014,7 @@
9014 "ru": "Английский (Австралия)",
9015 "zh-chs": "英文(澳洲)",
9016 "xloc": [
9009 - "default.handlebars->27->848"
9017 + "default.handlebars->27->868"
9018 ]
9019 },
9020 {
@@ -9022,7 +9030,7 @@
9030 "ru": "Английский (Белиз)",
9031 "zh-chs": "英語(伯利茲)",
9032 "xloc": [
9025 - "default.handlebars->27->849"
9033 + "default.handlebars->27->869"
9034 ]
9035 },
9036 {
@@ -9038,7 +9046,7 @@
9046 "ru": "Английский (Канада)",
9047 "zh-chs": "英文(加拿大)",
9048 "xloc": [
9041 - "default.handlebars->27->850"
9049 + "default.handlebars->27->870"
9050 ]
9051 },
9052 {
@@ -9054,7 +9062,7 @@
9062 "ru": "Английский (Ирландия)",
9063 "zh-chs": "英文(愛爾蘭)",
9064 "xloc": [
9057 - "default.handlebars->27->851"
9065 + "default.handlebars->27->871"
9066 ]
9067 },
9068 {
@@ -9070,7 +9078,7 @@
9078 "ru": "Английский (Ямайка)",
9079 "zh-chs": "英文(牙買加)",
9080 "xloc": [
9073 - "default.handlebars->27->852"
9081 + "default.handlebars->27->872"
9082 ]
9083 },
9084 {
@@ -9086,7 +9094,7 @@
9094 "ru": "Английский (Новая Зеландия)",
9095 "zh-chs": "英文(紐西蘭)",
9096 "xloc": [
9089 - "default.handlebars->27->853"
9097 + "default.handlebars->27->873"
9098 ]
9099 },
9100 {
@@ -9102,7 +9110,7 @@
9110 "ru": "Английский (Филиппины)",
9111 "zh-chs": "英文(菲律賓)",
9112 "xloc": [
9105 - "default.handlebars->27->854"
9113 + "default.handlebars->27->874"
9114 ]
9115 },
9116 {
@@ -9118,7 +9126,7 @@
9126 "ru": "Английский (Южная Африка)",
9127 "zh-chs": "英語(南非)",
9128 "xloc": [
9121 - "default.handlebars->27->855"
9129 + "default.handlebars->27->875"
9130 ]
9131 },
9132 {
@@ -9133,7 +9141,7 @@
9141 "ru": "Английский (Тринидад и Тобаго)",
9142 "zh-chs": "英文(特立尼達和多巴哥)",
9143 "xloc": [
9136 - "default.handlebars->27->856"
9144 + "default.handlebars->27->876"
9145 ]
9146 },
9147 {
@@ -9149,7 +9157,7 @@
9157 "ru": "Английский (Великобритания)",
9158 "zh-chs": "英文(英國)",
9159 "xloc": [
9152 - "default.handlebars->27->857"
9160 + "default.handlebars->27->877"
9161 ]
9162 },
9163 {
@@ -9165,7 +9173,7 @@
9173 "ru": "Английский (Соединенные Штаты)",
9174 "zh-chs": "美國英語)",
9175 "xloc": [
9168 - "default.handlebars->27->858"
9176 + "default.handlebars->27->878"
9177 ]
9178 },
9179 {
@@ -9181,7 +9189,7 @@
9189 "ru": "Английский (Зимбабве)",
9190 "zh-chs": "英文(津巴布韋)",
9191 "xloc": [
9184 - "default.handlebars->27->859"
9192 + "default.handlebars->27->879"
9193 ]
9194 },
9195 {
@@ -9197,8 +9205,8 @@
9205 "ru": "Ввод",
9206 "zh-chs": "輸入",
9207 "xloc": [
9200 - "default.handlebars->27->1040",
9201 - "default.handlebars->27->1041"
9208 + "default.handlebars->27->1060",
9209 + "default.handlebars->27->1061"
9210 ]
9211 },
9212 {
@@ -9215,7 +9223,7 @@
9223 "ru": "Введите разделенный запятыми список имен административных областей.",
9224 "zh-chs": "輸入管理領域名稱的逗號分隔列表。",
9225 "xloc": [
9218 - "default.handlebars->27->1360"
9226 + "default.handlebars->27->1377"
9227 ]
9228 },
9229 {
@@ -9232,7 +9240,7 @@
9240 "ru": "Введите диапазон IP-адресов для сканирования Intel AMT устройств.",
9241 "zh-chs": "輸入IP地址範圍以掃描Intel AMT設備。",
9242 "xloc": [
9235 - "default.handlebars->27->235"
9243 + "default.handlebars->27->236"
9244 ]
9245 },
9246 {
@@ -9249,7 +9257,7 @@
9257 "ru": "Для удаленного набора введите текст, используя английскую раскладку и нажмите OK. Перед продолжением убедитесь, что курсор на удаленном компьютере установлен в правильное положение.",
9258 "zh-chs": "輸入文本,然後單擊“確定”以使用美式英語鍵盤遠程輸入文本。在繼續操作之前,請確保將遠程光標放置在正確的位置。",
9259 "xloc": [
9252 - "default.handlebars->27->637"
9260 + "default.handlebars->27->657"
9261 ]
9262 },
9263 {
@@ -9333,7 +9341,7 @@
9341 "ru": "Эсперанто",
9342 "zh-chs": "世界語",
9343 "xloc": [
9336 - "default.handlebars->27->860"
9344 + "default.handlebars->27->880"
9345 ]
9346 },
9347 {
@@ -9349,7 +9357,7 @@
9357 "ru": "Эстонский",
9358 "zh-chs": "愛沙尼亞語",
9359 "xloc": [
9352 - "default.handlebars->27->861"
9360 + "default.handlebars->27->881"
9361 ]
9362 },
9363 {
@@ -9366,7 +9374,7 @@
9374 "ru": "Детали события",
9375 "zh-chs": "活動詳情",
9376 "xloc": [
9369 - "default.handlebars->27->713"
9377 + "default.handlebars->27->733"
9378 ]
9379 },
9380 {
@@ -9383,7 +9391,7 @@
9391 "ru": "Экспорт списка событий",
9392 "zh-chs": "活動列表導出",
9393 "xloc": [
9386 - "default.handlebars->27->1304"
9394 + "default.handlebars->27->1321"
9395 ]
9396 },
9397 {
@@ -9452,7 +9460,7 @@
9460 "pt": "Exportar informações do dispositivo",
9461 "zh-chs": "導出設備信息",
9462 "xloc": [
9455 - "default.handlebars->27->375"
9463 + "default.handlebars->27->376"
9464 ]
9465 },
9466 {
@@ -9469,7 +9477,7 @@
9477 "ru": "Расширенный ASCII",
9478 "zh-chs": "擴展ASCII",
9479 "xloc": [
9472 - "default.handlebars->27->662"
9480 + "default.handlebars->27->682"
9481 ]
9482 },
9483 {
@@ -9503,7 +9511,7 @@
9511 "ru": "Внешний",
9512 "zh-chs": "外部",
9513 "xloc": [
9506 - "default.handlebars->27->1553"
9514 + "default.handlebars->27->1564"
9515 ]
9516 },
9517 {
@@ -9519,7 +9527,7 @@
9527 "ru": "Mакедонский (БЮР)",
9528 "zh-chs": "FYRO馬其頓語",
9529 "xloc": [
9522 - "default.handlebars->27->911"
9530 + "default.handlebars->27->931"
9531 ]
9532 },
9533 {
@@ -9535,7 +9543,7 @@
9543 "ru": "Фарерский",
9544 "zh-chs": "法羅語",
9545 "xloc": [
9538 - "default.handlebars->27->862"
9546 + "default.handlebars->27->882"
9547 ]
9548 },
9549 {
@@ -9568,7 +9576,7 @@
9576 "ru": "Фарси (Персидский)",
9577 "zh-chs": "波斯語(波斯語)",
9578 "xloc": [
9571 - "default.handlebars->27->863"
9579 + "default.handlebars->27->883"
9580 ]
9581 },
9582 {
@@ -9603,7 +9611,7 @@
9611 "ru": "Функции",
9612 "zh-chs": "特徵",
9613 "xloc": [
9606 - "default.handlebars->27->1068"
9614 + "default.handlebars->27->1088"
9615 ]
9616 },
9617 {
@@ -9619,7 +9627,7 @@
9627 "ru": "Фиджи",
9628 "zh-chs": "斐濟",
9629 "xloc": [
9622 - "default.handlebars->27->864"
9630 + "default.handlebars->27->884"
9631 ]
9632 },
9633 {
@@ -9637,8 +9645,8 @@
9645 "zh-chs": "文件編輯器",
9646 "xloc": [
9647 "default-mobile.handlebars->9->257",
9640 - "default.handlebars->27->409",
9641 - "default.handlebars->27->685"
9648 + "default.handlebars->27->410",
9649 + "default.handlebars->27->705"
9650 ]
9651 },
9652 {
@@ -9671,7 +9679,7 @@
9679 "ru": "Драйвер файловой системы",
9680 "zh-chs": "FileSystemDriver",
9681 "xloc": [
9674 - "default.handlebars->27->645"
9682 + "default.handlebars->27->665"
9683 ]
9684 },
9685 {
@@ -9688,7 +9696,7 @@
9696 "ru": "Файлы",
9697 "zh-chs": "檔案",
9698 "xloc": [
9691 - "default.handlebars->27->1157",
9699 + "default.handlebars->27->1174",
9700 "default.handlebars->container->topbar->1->1->MainSubMenuSpan->MainSubMenu->1->0->MainDevFiles",
9701 "default.handlebars->contextMenu->cxfiles"
9702 ]
@@ -9724,7 +9732,7 @@
9732 "ru": "Уведомление файлов",
9733 "zh-chs": "文件通知",
9734 "xloc": [
9727 - "default.handlebars->27->1076"
9735 + "default.handlebars->27->1096"
9736 ]
9737 },
9738 {
@@ -9740,7 +9748,7 @@
9748 "ru": "Запрос файлов",
9749 "zh-chs": "文件提示",
9750 "xloc": [
9743 - "default.handlebars->27->1075"
9751 + "default.handlebars->27->1095"
9752 ]
9753 },
9754 {
@@ -9775,7 +9783,7 @@
9783 "ru": "Финский",
9784 "zh-chs": "芬蘭",
9785 "xloc": [
9778 - "default.handlebars->27->865"
9786 + "default.handlebars->27->885"
9787 ]
9788 },
9789 {
@@ -9848,8 +9856,8 @@
9856 "ru": "Принудительно сбросить пароль при следующем входе в систему.",
9857 "zh-chs": "下次登錄時強制重置密碼。",
9858 "xloc": [
9851 - "default.handlebars->27->1354",
9852 - "default.handlebars->27->1471"
9859 + "default.handlebars->27->1371",
9860 + "default.handlebars->27->1485"
9861 ]
9862 },
9863 {
@@ -9935,8 +9943,8 @@
9943 "ru": "Свободно",
9944 "zh-chs": "自由",
9945 "xloc": [
9938 - "default.handlebars->27->1514",
9939 - "default.handlebars->27->1516"
9946 + "default.handlebars->27->1525",
9947 + "default.handlebars->27->1527"
9948 ]
9949 },
9950 {
@@ -9970,7 +9978,7 @@
9978 "ru": "Французский (Бельгия)",
9979 "zh-chs": "法語(比利時)",
9980 "xloc": [
9973 - "default.handlebars->27->867"
9981 + "default.handlebars->27->887"
9982 ]
9983 },
9984 {
@@ -9986,7 +9994,7 @@
9994 "ru": "Французский (Канада)",
9995 "zh-chs": "法語(加拿大)",
9996 "xloc": [
9989 - "default.handlebars->27->868"
9997 + "default.handlebars->27->888"
9998 ]
9999 },
10000 {
@@ -10002,7 +10010,7 @@
10010 "ru": "Французский (Франция)",
10011 "zh-chs": "法語(法國)",
10012 "xloc": [
10005 - "default.handlebars->27->869"
10013 + "default.handlebars->27->889"
10014 ]
10015 },
10016 {
@@ -10018,7 +10026,7 @@
10026 "ru": "Французский (Люксембург)",
10027 "zh-chs": "法語(盧森堡)",
10028 "xloc": [
10021 - "default.handlebars->27->870"
10029 + "default.handlebars->27->890"
10030 ]
10031 },
10032 {
@@ -10034,7 +10042,7 @@
10042 "ru": "Французский (Монако)",
10043 "zh-chs": "法語(摩納哥)",
10044 "xloc": [
10037 - "default.handlebars->27->871"
10045 + "default.handlebars->27->891"
10046 ]
10047 },
10048 {
@@ -10050,7 +10058,7 @@
10058 "ru": "Французский (Стандартный)",
10059 "zh-chs": "法語(標準)",
10060 "xloc": [
10053 - "default.handlebars->27->866"
10061 + "default.handlebars->27->886"
10062 ]
10063 },
10064 {
@@ -10066,7 +10074,7 @@
10074 "ru": "Французский (Швейцария)",
10075 "zh-chs": "法語(瑞士)",
10076 "xloc": [
10069 - "default.handlebars->27->872"
10077 + "default.handlebars->27->892"
10078 ]
10079 },
10080 {
@@ -10082,7 +10090,7 @@
10090 "ru": "Фризский",
10091 "zh-chs": "弗里斯蘭語",
10092 "xloc": [
10085 - "default.handlebars->27->873"
10093 + "default.handlebars->27->893"
10094 ]
10095 },
10096 {
@@ -10098,7 +10106,7 @@
10106 "ru": "Фриульский",
10107 "zh-chs": "弗留利",
10108 "xloc": [
10101 - "default.handlebars->27->874"
10109 + "default.handlebars->27->894"
10110 ]
10111 },
10112 {
@@ -10119,9 +10127,9 @@
10127 "default-mobile.handlebars->9->295",
10128 "default-mobile.handlebars->9->313",
10129 "default-mobile.handlebars->9->67",
10122 - "default.handlebars->27->1047",
10123 - "default.handlebars->27->1175",
10124 - "default.handlebars->27->1365"
10130 + "default.handlebars->27->1067",
10131 + "default.handlebars->27->1192",
10132 + "default.handlebars->27->1382"
10133 ]
10134 },
10135 {
@@ -10138,7 +10146,7 @@
10146 "ru": "Администратор с полным доступом (все права)",
10147 "zh-chs": "正式管理員(保留所有權利)",
10148 "xloc": [
10141 - "default.handlebars->27->1203"
10149 + "default.handlebars->27->1220"
10150 ]
10151 },
10152 {
@@ -10153,12 +10161,7 @@
10161 "nl": "Volledige apparaatgroep beheerder",
10162 "pt": "Administrador de grupo de dispositivos completo",
10163 "ru": "Администратор группы устройств с полным доступом",
10156 - "zh-chs": "完整的設備組管理員",
10157 - "xloc": [
10158 - "default.handlebars->27->1112",
10159 - "default.handlebars->27->1402",
10160 - "default.handlebars->27->1486"
10161 - ]
10164 + "zh-chs": "完整的設備組管理員"
10165 },
10166 {
10167 "de": "Volle Geräterechte",
@@ -10170,7 +10173,13 @@
10173 "pt": "Direitos completos do dispositivo",
10174 "zh-chs": "完整的設備權限",
10175 "xloc": [
10173 - "default.handlebars->27->535"
10176 + "default.handlebars->27->536"
10177 + ]
10178 + },
10179 + {
10180 + "en": "Full Rights",
10181 + "xloc": [
10182 + "default.handlebars->27->552"
10183 ]
10184 },
10185 {
@@ -10206,7 +10215,7 @@
10215 "ru": "Администратор с полным доступом",
10216 "zh-chs": "正式管理員",
10217 "xloc": [
10209 - "default.handlebars->27->1425"
10218 + "default.handlebars->27->1439"
10219 ]
10220 },
10221 {
@@ -10222,7 +10231,7 @@
10231 "ru": "Гэльский (Ирландский)",
10232 "zh-chs": "蓋爾語(愛爾蘭)",
10233 "xloc": [
10225 - "default.handlebars->27->876"
10234 + "default.handlebars->27->896"
10235 ]
10236 },
10237 {
@@ -10238,7 +10247,7 @@
10247 "ru": "Гэльский (Шотландия)",
10248 "zh-chs": "蓋爾語(蘇格蘭語)",
10249 "xloc": [
10241 - "default.handlebars->27->875"
10250 + "default.handlebars->27->895"
10251 ]
10252 },
10253 {
@@ -10254,7 +10263,7 @@
10263 "ru": "Галицкий",
10264 "zh-chs": "加拉契人",
10265 "xloc": [
10257 - "default.handlebars->27->877"
10266 + "default.handlebars->27->897"
10267 ]
10268 },
10269 {
@@ -10327,7 +10336,7 @@
10336 "ru": "Общая информация",
10337 "zh-chs": "一般信息",
10338 "xloc": [
10330 - "default.handlebars->27->416"
10339 + "default.handlebars->27->417"
10340 ]
10341 },
10342 {
@@ -10360,7 +10369,7 @@
10369 "ru": "Грузинский",
10370 "zh-chs": "格魯吉亞人",
10371 "xloc": [
10363 - "default.handlebars->27->878"
10372 + "default.handlebars->27->898"
10373 ]
10374 },
10375 {
@@ -10376,7 +10385,7 @@
10385 "ru": "Немецкий (Австрия)",
10386 "zh-chs": "德語(奧地利)",
10387 "xloc": [
10379 - "default.handlebars->27->880"
10388 + "default.handlebars->27->900"
10389 ]
10390 },
10391 {
@@ -10392,7 +10401,7 @@
10401 "ru": "Немецкий (Германия)",
10402 "zh-chs": "德文(德國)",
10403 "xloc": [
10395 - "default.handlebars->27->881"
10404 + "default.handlebars->27->901"
10405 ]
10406 },
10407 {
@@ -10408,7 +10417,7 @@
10417 "ru": "Немецкий (Лихтенштейн)",
10418 "zh-chs": "德文(列支敦士登)",
10419 "xloc": [
10411 - "default.handlebars->27->882"
10420 + "default.handlebars->27->902"
10421 ]
10422 },
10423 {
@@ -10424,7 +10433,7 @@
10433 "ru": "Немецкий (Люксембург)",
10434 "zh-chs": "德語(盧森堡)",
10435 "xloc": [
10427 - "default.handlebars->27->883"
10436 + "default.handlebars->27->903"
10437 ]
10438 },
10439 {
@@ -10440,7 +10449,7 @@
10449 "ru": "Немецкий (Стандартный)",
10450 "zh-chs": "德語(標準)",
10451 "xloc": [
10443 - "default.handlebars->27->879"
10452 + "default.handlebars->27->899"
10453 ]
10454 },
10455 {
@@ -10456,7 +10465,7 @@
10465 "ru": "Немецкий (Швейцария)",
10466 "zh-chs": "德語(瑞士)",
10467 "xloc": [
10459 - "default.handlebars->27->884"
10468 + "default.handlebars->27->904"
10469 ]
10470 },
10471 {
@@ -10473,7 +10482,7 @@
10482 "ru": "Получить учетные данные MQTT для этого устройства.",
10483 "zh-chs": "獲取此設備的MQTT登錄憑據。",
10484 "xloc": [
10476 - "default.handlebars->27->519"
10485 + "default.handlebars->27->520"
10486 ]
10487 },
10488 {
@@ -10526,7 +10535,7 @@
10535 "ru": "Хорошо",
10536 "zh-chs": "好",
10537 "xloc": [
10529 - "default.handlebars->27->1043"
10538 + "default.handlebars->27->1063"
10539 ]
10540 },
10541 {
@@ -10562,7 +10571,7 @@
10571 "ru": "Греческий",
10572 "zh-chs": "希臘語",
10573 "xloc": [
10565 - "default.handlebars->27->885"
10574 + "default.handlebars->27->905"
10575 ]
10576 },
10577 {
@@ -10580,7 +10589,7 @@
10589 "zh-chs": "組",
10590 "xloc": [
10591 "default-mobile.handlebars->9->137",
10583 - "default.handlebars->27->441",
10592 + "default.handlebars->27->442",
10593 "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->9->devListToolbarSort->sortselect->1"
10594 ]
10595 },
@@ -10598,7 +10607,7 @@
10607 "ru": "Групповое действие",
10608 "zh-chs": "集體行動",
10609 "xloc": [
10601 - "default.handlebars->27->378",
10610 + "default.handlebars->27->379",
10611 "default.handlebars->container->column_l->p1->devListToolbarSpan->1->0->devListToolbar"
10612 ]
10613 },
@@ -10616,7 +10625,7 @@
10625 "ru": "Члены группы",
10626 "zh-chs": "小組成員",
10627 "xloc": [
10619 - "default.handlebars->27->1394"
10628 + "default.handlebars->27->1411"
10629 ]
10630 },
10631 {
@@ -10633,7 +10642,7 @@
10642 "ru": "Права на группу для пользователя {0}.",
10643 "zh-chs": "用戶{0}的組權限。",
10644 "xloc": [
10636 - "default.handlebars->27->1174"
10645 + "default.handlebars->27->1191"
10646 ]
10647 },
10648 {
@@ -10649,7 +10658,7 @@
10658 "ru": "Права на группу для {0}.",
10659 "zh-chs": "{0}的組權限。",
10660 "xloc": [
10652 - "default.handlebars->27->1173"
10661 + "default.handlebars->27->1190"
10662 ]
10663 },
10664 {
@@ -10683,7 +10692,7 @@
10692 "ru": "Группы",
10693 "zh-chs": "團體",
10694 "xloc": [
10686 - "default.handlebars->27->1309",
10695 + "default.handlebars->27->1326",
10696 "default.handlebars->container->topbar->1->1->UsersSubMenuSpan->UsersSubMenu->1->0->UsersGroups"
10697 ]
10698 },
@@ -10700,7 +10709,7 @@
10709 "ru": "Гуджарати",
10710 "zh-chs": "古久拉提",
10711 "xloc": [
10703 - "default.handlebars->27->886"
10712 + "default.handlebars->27->906"
10713 ]
10714 },
10715 {
@@ -10735,7 +10744,7 @@
10744 "ru": "Гаитянский",
10745 "zh-chs": "海地",
10746 "xloc": [
10738 - "default.handlebars->27->887"
10747 + "default.handlebars->27->907"
10748 ]
10749 },
10750 {
@@ -10769,7 +10778,7 @@
10778 "ru": "Жесткое отключение агента",
10779 "zh-chs": "硬斷開劑",
10780 "xloc": [
10772 - "default.handlebars->27->781"
10781 + "default.handlebars->27->801"
10782 ]
10783 },
10784 {
@@ -10784,7 +10793,7 @@
10793 "pt": "Total da pilha",
10794 "zh-chs": "堆總數",
10795 "xloc": [
10787 - "default.handlebars->27->1555"
10796 + "default.handlebars->27->1566"
10797 ]
10798 },
10799 {
@@ -10799,7 +10808,7 @@
10808 "pt": "Pilha usada",
10809 "zh-chs": "堆使用",
10810 "xloc": [
10802 - "default.handlebars->27->1554"
10811 + "default.handlebars->27->1565"
10812 ]
10813 },
10814 {
@@ -10816,7 +10825,7 @@
10825 "ru": "Иврит",
10826 "zh-chs": "希伯來語",
10827 "xloc": [
10819 - "default.handlebars->27->888"
10828 + "default.handlebars->27->908"
10829 ]
10830 },
10831 {
@@ -10833,7 +10842,7 @@
10842 "ru": "Помочь перевести MeshCentral",
10843 "zh-chs": "幫助翻譯MeshCentral",
10844 "xloc": [
10836 - "default.handlebars->27->1002"
10845 + "default.handlebars->27->1022"
10846 ]
10847 },
10848 {
@@ -10852,7 +10861,7 @@
10861 "xloc": [
10862 "default-mobile.handlebars->9->107",
10863 "default-mobile.handlebars->9->114",
10855 - "default.handlebars->27->342",
10864 + "default.handlebars->27->343",
10865 "default.handlebars->27->5"
10866 ]
10867 },
@@ -10869,7 +10878,7 @@
10878 "ru": "Хинди",
10879 "zh-chs": "印地語",
10880 "xloc": [
10872 - "default.handlebars->27->889"
10881 + "default.handlebars->27->909"
10882 ]
10883 },
10884 {
@@ -10904,7 +10913,7 @@
10913 "zh-chs": "持有1份副本",
10914 "xloc": [
10915 "default-mobile.handlebars->9->266",
10907 - "default.handlebars->27->694"
10916 + "default.handlebars->27->714"
10917 ]
10918 },
10919 {
@@ -10921,7 +10930,7 @@
10930 "zh-chs": "持有1個搬家公司",
10931 "xloc": [
10932 "default-mobile.handlebars->9->270",
10924 - "default.handlebars->27->698"
10933 + "default.handlebars->27->718"
10934 ]
10935 },
10936 {
@@ -10938,7 +10947,7 @@
10947 "zh-chs": "保留{0}個條目進行複制",
10948 "xloc": [
10949 "default-mobile.handlebars->9->264",
10941 - "default.handlebars->27->692"
10950 + "default.handlebars->27->712"
10951 ]
10952 },
10953 {
@@ -10955,7 +10964,7 @@
10964 "zh-chs": "保留{0}個條目以進行移動",
10965 "xloc": [
10966 "default-mobile.handlebars->9->268",
10958 - "default.handlebars->27->696"
10967 + "default.handlebars->27->716"
10968 ]
10969 },
10970 {
@@ -10972,7 +10981,7 @@
10981 "zh-chs": "保持{2}的{0}入口{1}",
10982 "xloc": [
10983 "default-mobile.handlebars->9->91",
10975 - "default.handlebars->27->1291"
10984 + "default.handlebars->27->1308"
10985 ]
10986 },
10987 {
@@ -10993,11 +11002,11 @@
11002 "default-mobile.handlebars->9->140",
11003 "default-mobile.handlebars->9->142",
11004 "default-mobile.handlebars->9->226",
10996 - "default.handlebars->27->221",
10997 - "default.handlebars->27->446",
11005 + "default.handlebars->27->222",
11006 "default.handlebars->27->447",
10999 - "default.handlebars->27->449",
11000 - "default.handlebars->27->623"
11007 + "default.handlebars->27->448",
11008 + "default.handlebars->27->450",
11009 + "default.handlebars->27->643"
11010 ]
11011 },
11012 {
@@ -11014,7 +11023,7 @@
11023 "ru": "Синхронизация имени хоста",
11024 "zh-chs": "主機名同步",
11025 "xloc": [
11017 - "default.handlebars->27->1066"
11026 + "default.handlebars->27->1086"
11027 ]
11028 },
11029 {
@@ -11030,7 +11039,7 @@
11039 "ru": "Венгерский",
11040 "zh-chs": "匈牙利",
11041 "xloc": [
11033 - "default.handlebars->27->890"
11042 + "default.handlebars->27->910"
11043 ]
11044 },
11045 {
@@ -11047,7 +11056,7 @@
11056 "ru": "Диапазон IP",
11057 "zh-chs": "IP範圍",
11058 "xloc": [
11050 - "default.handlebars->27->236"
11059 + "default.handlebars->27->237"
11060 ]
11061 },
11062 {
@@ -11082,7 +11091,7 @@
11091 "ru": "IP: {0}",
11092 "zh-chs": "IP:{0}",
11093 "xloc": [
11085 - "default.handlebars->27->734"
11094 + "default.handlebars->27->754"
11095 ]
11096 },
11097 {
@@ -11095,7 +11104,7 @@
11104 "pt": "IP: {0}, Máscara: {1}, Gateway: {2}",
11105 "zh-chs": "IP:{0},掩碼:{1},網關:{2}",
11106 "xloc": [
11098 - "default.handlebars->27->732"
11107 + "default.handlebars->27->752"
11108 ]
11109 },
11110 {
@@ -11108,8 +11117,8 @@
11117 "pt": "Camada IPv4",
11118 "zh-chs": "IPv4層",
11119 "xloc": [
11111 - "default.handlebars->27->731",
11112 - "default.handlebars->27->733"
11120 + "default.handlebars->27->751",
11121 + "default.handlebars->27->753"
11122 ]
11123 },
11124 {
@@ -11176,7 +11185,7 @@
11185 "ru": "Исландский",
11186 "zh-chs": "冰島的",
11187 "xloc": [
11179 - "default.handlebars->27->891"
11188 + "default.handlebars->27->911"
11189 ]
11190 },
11191 {
@@ -11194,7 +11203,7 @@
11203 "zh-chs": "圖標選擇",
11204 "xloc": [
11205 "default-mobile.handlebars->9->224",
11197 - "default.handlebars->27->621"
11206 + "default.handlebars->27->641"
11207 ]
11208 },
11209 {
@@ -11211,7 +11220,7 @@
11220 "ru": "Идентификатор",
11221 "zh-chs": "識別碼",
11222 "xloc": [
11214 - "default.handlebars->27->759"
11223 + "default.handlebars->27->779"
11224 ]
11225 },
11226 {
@@ -11255,6 +11264,12 @@
11264 "player.handlebars->3->17"
11265 ]
11266 },
11267 + {
11268 + "en": "Indivitual Devices",
11269 + "xloc": [
11270 + "default.handlebars->27->163"
11271 + ]
11272 + },
11273 {
11274 "cs": "indonézština",
11275 "de": "Indonesisch",
@@ -11268,7 +11283,7 @@
11283 "ru": "Индонезийский",
11284 "zh-chs": "印度尼西亞",
11285 "xloc": [
11271 - "default.handlebars->27->892"
11286 + "default.handlebars->27->912"
11287 ]
11288 },
11289 {
@@ -11337,7 +11352,7 @@
11352 "ru": "Установка",
11353 "zh-chs": "安裝",
11354 "xloc": [
11340 - "default.handlebars->27->1107"
11355 + "default.handlebars->27->1127"
11356 ]
11357 },
11358 {
@@ -11384,7 +11399,7 @@
11399 "ru": "Установка CIRA",
11400 "zh-chs": "安裝CIRA",
11401 "xloc": [
11387 - "default.handlebars->27->1099"
11402 + "default.handlebars->27->1119"
11403 ]
11404 },
11405 {
@@ -11401,7 +11416,7 @@
11416 "ru": "Локальная установка",
11417 "zh-chs": "安裝本地",
11418 "xloc": [
11404 - "default.handlebars->27->1101"
11419 + "default.handlebars->27->1121"
11420 ]
11421 },
11422 {
@@ -11418,10 +11433,10 @@
11433 "ru": "Тип установки",
11434 "zh-chs": "安裝類型",
11435 "xloc": [
11421 - "default.handlebars->27->1232",
11422 - "default.handlebars->27->1239",
11423 - "default.handlebars->27->281",
11424 - "default.handlebars->27->303"
11436 + "default.handlebars->27->1249",
11437 + "default.handlebars->27->1256",
11438 + "default.handlebars->27->282",
11439 + "default.handlebars->27->304"
11440 ]
11441 },
11442 {
@@ -11437,7 +11452,7 @@
11452 "ru": "Intel (F10 = ESC+[OM)",
11453 "zh-chs": "英特爾(F10 = ESC + [OM)",
11454 "xloc": [
11440 - "default.handlebars->27->664",
11455 + "default.handlebars->27->684",
11456 "default.handlebars->container->column_l->p12->termTable->1->1->6->1->1->terminalSettingsButtons"
11457 ]
11458 },
@@ -11455,10 +11470,10 @@
11470 "ru": "Intel AMT",
11471 "zh-chs": "英特爾AMT",
11472 "xloc": [
11458 - "default.handlebars->27->1251",
11459 - "default.handlebars->27->1257",
11460 - "default.handlebars->27->1551",
11461 - "default.handlebars->27->1573"
11473 + "default.handlebars->27->1268",
11474 + "default.handlebars->27->1274",
11475 + "default.handlebars->27->1562",
11476 + "default.handlebars->27->1584"
11477 ]
11478 },
11479 {
@@ -11526,7 +11541,7 @@
11541 "ru": "Intel AMT активирован в режиме администратора",
11542 "zh-chs": "在管理控制模式下激活了Intel AMT",
11543 "xloc": [
11529 - "default.handlebars->27->462"
11544 + "default.handlebars->27->463"
11545 ]
11546 },
11547 {
@@ -11543,7 +11558,7 @@
11558 "ru": "Intel AMT активирован в режиме клиента",
11559 "zh-chs": "英特爾AMT在客戶端控制模式下被激活",
11560 "xloc": [
11546 - "default.handlebars->27->460"
11561 + "default.handlebars->27->461"
11562 ]
11563 },
11564 {
@@ -11560,7 +11575,7 @@
11575 "ru": "Intel AMT настроен с TLS безопасностью сети",
11576 "zh-chs": "英特爾AMT已設置TLS網絡安全性",
11577 "xloc": [
11563 - "default.handlebars->27->464"
11578 + "default.handlebars->27->465"
11579 ]
11580 },
11581 {
@@ -11593,7 +11608,7 @@
11608 "ru": "Intel AMT необходимо установить с доверенным FQDN в MEBx или иметь кабельное подключение к локальной сети:",
11609 "zh-chs": "英特爾AMT將需要在MEBx中設置為受信任的FQDN,或者在網絡上具有有線局域網:",
11610 "xloc": [
11596 - "default.handlebars->27->233"
11611 + "default.handlebars->27->234"
11612 ]
11613 },
11614 {
@@ -11610,7 +11625,7 @@
11625 "ru": "Intel ASCII",
11626 "zh-chs": "英特爾ASCII",
11627 "xloc": [
11613 - "default.handlebars->27->663"
11628 + "default.handlebars->27->683"
11629 ]
11630 },
11631 {
@@ -11630,11 +11645,11 @@
11645 "default-mobile.handlebars->9->126",
11646 "default-mobile.handlebars->9->190",
11647 "default-mobile.handlebars->9->195",
11633 - "default.handlebars->27->1083",
11634 - "default.handlebars->27->1093",
11635 - "default.handlebars->27->419",
11636 - "default.handlebars->27->472",
11637 - "default.handlebars->27->488"
11648 + "default.handlebars->27->1103",
11649 + "default.handlebars->27->1113",
11650 + "default.handlebars->27->420",
11651 + "default.handlebars->27->473",
11652 + "default.handlebars->27->489"
11653 ]
11654 },
11655 {
@@ -11652,7 +11667,7 @@
11667 "zh-chs": "英特爾®AMT CIRA",
11668 "xloc": [
11669 "default-mobile.handlebars->9->194",
11655 - "default.handlebars->27->486"
11670 + "default.handlebars->27->487"
11671 ]
11672 },
11673 {
@@ -11669,9 +11684,9 @@
11684 "ru": "Intel® AMT CIRA подключен и готов к использованию.",
11685 "zh-chs": "英特爾®AMT CIRA已連接並可以使用。",
11686 "xloc": [
11672 - "default.handlebars->27->167",
11673 - "default.handlebars->27->356",
11674 - "default.handlebars->27->485"
11687 + "default.handlebars->27->168",
11688 + "default.handlebars->27->357",
11689 + "default.handlebars->27->486"
11690 ]
11691 },
11692 {
@@ -11707,7 +11722,7 @@
11722 "ru": "Политика Intel® AMT",
11723 "zh-chs": "英特爾®AMT政策",
11724 "xloc": [
11710 - "default.handlebars->27->1125"
11725 + "default.handlebars->27->1142"
11726 ]
11727 },
11728 {
@@ -11739,7 +11754,7 @@
11754 "ru": "Intel® AMT Тег",
11755 "zh-chs": "英特爾®AMT標籤",
11756 "xloc": [
11742 - "default.handlebars->27->476"
11757 + "default.handlebars->27->477"
11758 ]
11759 },
11760 {
@@ -11772,8 +11787,8 @@
11787 "ru": "Активация Intel® AMT",
11788 "zh-chs": "英特爾®AMT激活",
11789 "xloc": [
11775 - "default.handlebars->27->231",
11776 - "default.handlebars->27->234"
11790 + "default.handlebars->27->232",
11791 + "default.handlebars->27->235"
11792 ]
11793 },
11794 {
@@ -11791,8 +11806,8 @@
11806 "zh-chs": "英特爾®AMT已連接",
11807 "xloc": [
11808 "default-mobile.handlebars->9->204",
11794 - "default.handlebars->27->523",
11795 - "default.handlebars->27->524"
11809 + "default.handlebars->27->524",
11810 + "default.handlebars->27->525"
11811 ]
11812 },
11813 {
@@ -11808,8 +11823,8 @@
11823 "ru": "События Intel® AMT desktop или serial.",
11824 "zh-chs": "英特爾®AMT桌面和串行事件。",
11825 "xloc": [
11811 - "default.handlebars->27->1008",
11812 - "default.handlebars->27->1247"
11826 + "default.handlebars->27->1028",
11827 + "default.handlebars->27->1264"
11828 ]
11829 },
11830 {
@@ -11827,8 +11842,8 @@
11842 "zh-chs": "檢測到英特爾®AMT",
11843 "xloc": [
11844 "default-mobile.handlebars->9->205",
11830 - "default.handlebars->27->525",
11831 - "default.handlebars->27->526"
11845 + "default.handlebars->27->526",
11846 + "default.handlebars->27->527"
11847 ]
11848 },
11849 {
@@ -11844,7 +11859,7 @@
11859 "ru": "Intel® AMT маршрутизируется и готов к использованию.",
11860 "zh-chs": "英特爾®AMT可路由並可以使用。",
11861 "xloc": [
11847 - "default.handlebars->27->487"
11862 + "default.handlebars->27->488"
11863 ]
11864 },
11865 {
@@ -11860,8 +11875,8 @@
11875 "ru": "Intel® AMT маршрутизируется.",
11876 "zh-chs": "英特爾®AMT是可路由的。",
11877 "xloc": [
11863 - "default.handlebars->27->169",
11864 - "default.handlebars->27->358"
11878 + "default.handlebars->27->170",
11879 + "default.handlebars->27->359"
11880 ]
11881 },
11882 {
@@ -11896,8 +11911,8 @@
11911 "zh-chs": "僅限英特爾®AMT,無代理",
11912 "xloc": [
11913 "default-mobile.handlebars->9->277",
11899 - "default.handlebars->27->1037",
11900 - "default.handlebars->27->1059"
11914 + "default.handlebars->27->1057",
11915 + "default.handlebars->27->1079"
11916 ]
11917 },
11918 {
@@ -11913,7 +11928,7 @@
11928 "ru": "Технология Intel® Active Management",
11929 "zh-chs": "英特爾®主動管理技術",
11930 "xloc": [
11916 - "default.handlebars->27->471"
11931 + "default.handlebars->27->472"
11932 ]
11933 },
11934 {
@@ -11930,7 +11945,7 @@
11945 "ru": "Intel® Active Management Technology (Intel® AMT)",
11946 "zh-chs": "英特爾®主動管理技術(英特爾®AMT)",
11947 "xloc": [
11933 - "default.handlebars->27->751"
11948 + "default.handlebars->27->771"
11949 ]
11950 },
11951 {
@@ -11948,7 +11963,7 @@
11963 "zh-chs": "英特爾®ME",
11964 "xloc": [
11965 "default-mobile.handlebars->9->189",
11951 - "default.handlebars->27->470"
11966 + "default.handlebars->27->471"
11967 ]
11968 },
11969 {
@@ -11966,7 +11981,7 @@
11981 "zh-chs": "英特爾®SM",
11982 "xloc": [
11983 "default-mobile.handlebars->9->191",
11969 - "default.handlebars->27->474"
11984 + "default.handlebars->27->475"
11985 ]
11986 },
11987 {
@@ -11982,7 +11997,7 @@
11997 "ru": "Intel® Standard Manageability",
11998 "zh-chs": "英特爾®標準可管理性",
11999 "xloc": [
11985 - "default.handlebars->27->473"
12000 + "default.handlebars->27->474"
12001 ]
12002 },
12003 {
@@ -12082,7 +12097,7 @@
12097 "ru": "Интерактивный",
12098 "zh-chs": "互動",
12099 "xloc": [
12085 - "default.handlebars->27->646"
12100 + "default.handlebars->27->666"
12101 ]
12102 },
12103 {
@@ -12099,10 +12114,10 @@
12114 "ru": "Только интерактивный режим",
12115 "zh-chs": "僅限互動",
12116 "xloc": [
12102 - "default.handlebars->27->1235",
12103 - "default.handlebars->27->1242",
12104 - "default.handlebars->27->284",
12105 - "default.handlebars->27->306"
12117 + "default.handlebars->27->1252",
12118 + "default.handlebars->27->1259",
12119 + "default.handlebars->27->285",
12120 + "default.handlebars->27->307"
12121 ]
12122 },
12123 {
@@ -12119,7 +12134,7 @@
12134 "ru": "Интерфейсы",
12135 "zh-chs": "介面",
12136 "xloc": [
12122 - "default.handlebars->27->506"
12137 + "default.handlebars->27->507"
12138 ]
12139 },
12140 {
@@ -12135,7 +12150,7 @@
12150 "ru": "Инуктитут",
12151 "zh-chs": "因紐特人",
12152 "xloc": [
12138 - "default.handlebars->27->893"
12153 + "default.handlebars->27->913"
12154 ]
12155 },
12156 {
@@ -12151,7 +12166,7 @@
12166 "ru": "Некорректный тип группы устройств",
12167 "zh-chs": "無效的設備組類型",
12168 "xloc": [
12154 - "default.handlebars->27->1528"
12169 + "default.handlebars->27->1539"
12170 ]
12171 },
12172 {
@@ -12168,7 +12183,7 @@
12183 "ru": "Некорректный JSON",
12184 "zh-chs": "無效的JSON",
12185 "xloc": [
12171 - "default.handlebars->27->1522"
12186 + "default.handlebars->27->1533"
12187 ]
12188 },
12189 {
@@ -12185,8 +12200,8 @@
12200 "ru": "Некорректный формат файла JSON.",
12201 "zh-chs": "無效的JSON文件格式。",
12202 "xloc": [
12188 - "default.handlebars->27->1335",
12189 - "default.handlebars->27->1337"
12203 + "default.handlebars->27->1352",
12204 + "default.handlebars->27->1354"
12205 ]
12206 },
12207 {
@@ -12203,7 +12218,7 @@
12218 "ru": "Некорректный файл JSON: {0}.",
12219 "zh-chs": "無效的JSON文件:{0}。",
12220 "xloc": [
12206 - "default.handlebars->27->1333"
12221 + "default.handlebars->27->1350"
12222 ]
12223 },
12224 {
@@ -12220,7 +12235,7 @@
12235 "ru": "Некорректная сигнатура PKCS",
12236 "zh-chs": "無效的PKCS簽名",
12237 "xloc": [
12223 - "default.handlebars->27->1520"
12238 + "default.handlebars->27->1531"
12239 ]
12240 },
12241 {
@@ -12237,7 +12252,7 @@
12252 "ru": "Некорректная сигнатура RSA",
12253 "zh-chs": "無效的RSA密碼",
12254 "xloc": [
12240 - "default.handlebars->27->1521"
12255 + "default.handlebars->27->1532"
12256 ]
12257 },
12258 {
@@ -12338,7 +12353,7 @@
12353 "ru": "Тип приглашения",
12354 "zh-chs": "邀請類型",
12355 "xloc": [
12341 - "default.handlebars->27->263"
12356 + "default.handlebars->27->264"
12357 ]
12358 },
12359 {
@@ -12351,7 +12366,7 @@
12366 "pt": "Os códigos de convite podem ser usados ​​por qualquer pessoa para associar dispositivos a este grupo de dispositivos usando o seguinte link público:",
12367 "zh-chs": "任何人都可以使用邀請代碼通過以下公共鏈接將設備加入該設備組:",
12368 "xloc": [
12354 - "default.handlebars->27->1237"
12369 + "default.handlebars->27->1254"
12370 ]
12371 },
12372 {
@@ -12381,9 +12396,9 @@
12396 "ru": "Пригласить",
12397 "zh-chs": "邀請",
12398 "xloc": [
12384 - "default.handlebars->27->1109",
12385 - "default.handlebars->27->218",
12386 - "default.handlebars->27->296"
12399 + "default.handlebars->27->1129",
12400 + "default.handlebars->27->219",
12401 + "default.handlebars->27->297"
12402 ]
12403 },
12404 {
@@ -12396,11 +12411,11 @@
12411 "pt": "Códigos de convite",
12412 "zh-chs": "邀請碼",
12413 "xloc": [
12399 - "default.handlebars->27->1087",
12400 - "default.handlebars->27->1231",
12401 - "default.handlebars->27->1236",
12402 - "default.handlebars->27->1238",
12403 - "default.handlebars->27->1243"
12414 + "default.handlebars->27->1107",
12415 + "default.handlebars->27->1248",
12416 + "default.handlebars->27->1253",
12417 + "default.handlebars->27->1255",
12418 + "default.handlebars->27->1260"
12419 ]
12420 },
12421 {
@@ -12417,7 +12432,7 @@
12432 "ru": "Пригласите установить Mesh Agent поделившись ссылкой. Эта ссылка ведет на инструкции для установки для группы устройств \\\"{0}\\\". Ссылка общедоступна и не требует наличия учетной записи на сервере.",
12433 "zh-chs": "通過共享邀請鏈接來邀請某人安裝網格代理。該鏈接為用戶提供 “{0}” 設備組的安裝說明。該鏈接是公共的,不需要該服務器的帳戶。",
12434 "xloc": [
12420 - "default.handlebars->27->287"
12435 + "default.handlebars->27->288"
12436 ]
12437 },
12438 {
@@ -12434,8 +12449,8 @@
12449 "ru": "Отправить приглашение на установку Mesh Agent",
12450 "zh-chs": "邀請某人在此網格上安裝網格代理。",
12451 "xloc": [
12437 - "default.handlebars->27->1108",
12438 - "default.handlebars->27->217"
12452 + "default.handlebars->27->1128",
12453 + "default.handlebars->27->218"
12454 ]
12455 },
12456 {
@@ -12452,7 +12467,7 @@
12467 "ru": "Пригласите установить Mesh Agent. Ссылка на установку для группы \\\"{0}\\\" будет отправлена по электронной почте.",
12468 "zh-chs": "邀請某人安裝網狀代理。將發送一封電子郵件,其中包含指向 “{0}” 設備組的網狀代理安裝的鏈接。",
12469 "xloc": [
12455 - "default.handlebars->27->264"
12470 + "default.handlebars->27->265"
12471 ]
12472 },
12473 {
@@ -12469,7 +12484,7 @@
12484 "ru": "Ирландский",
12485 "zh-chs": "愛爾蘭人",
12486 "xloc": [
12472 - "default.handlebars->27->894"
12487 + "default.handlebars->27->914"
12488 ]
12489 },
12490 {
@@ -12485,7 +12500,7 @@
12500 "ru": "Итальянский (Стандартный)",
12501 "zh-chs": "意大利語(標準)",
12502 "xloc": [
12488 - "default.handlebars->27->895"
12503 + "default.handlebars->27->915"
12504 ]
12505 },
12506 {
@@ -12501,7 +12516,7 @@
12516 "ru": "Итальянский (Швейцария)",
12517 "zh-chs": "義大利文(瑞士)",
12518 "xloc": [
12504 - "default.handlebars->27->896"
12519 + "default.handlebars->27->916"
12520 ]
12521 },
12522 {
@@ -12518,9 +12533,9 @@
12533 "ru": "Формат JSON",
12534 "zh-chs": "JSON格式",
12535 "xloc": [
12521 - "default.handlebars->27->1302",
12522 - "default.handlebars->27->1341",
12523 - "default.handlebars->27->386"
12536 + "default.handlebars->27->1319",
12537 + "default.handlebars->27->1358",
12538 + "default.handlebars->27->387"
12539 ]
12540 },
12541 {
@@ -12537,7 +12552,7 @@
12552 "ru": "Японский",
12553 "zh-chs": "日本",
12554 "xloc": [
12540 - "default.handlebars->27->897"
12555 + "default.handlebars->27->917"
12556 ]
12557 },
12558 {
@@ -12552,7 +12567,7 @@
12567 "ru": "Каннада",
12568 "zh-chs": "卡納達語",
12569 "xloc": [
12555 - "default.handlebars->27->898"
12570 + "default.handlebars->27->918"
12571 ]
12572 },
12573 {
@@ -12567,7 +12582,7 @@
12582 "ru": "Кашмирский",
12583 "zh-chs": "克什米爾語",
12584 "xloc": [
12570 - "default.handlebars->27->899"
12585 + "default.handlebars->27->919"
12586 ]
12587 },
12588 {
@@ -12582,7 +12597,7 @@
12597 "ru": "Казахский",
12598 "zh-chs": "哈薩克語",
12599 "xloc": [
12585 - "default.handlebars->27->900"
12600 + "default.handlebars->27->920"
12601 ]
12602 },
12603 {
@@ -12598,7 +12613,7 @@
12613 "ru": "Драйвер ядра",
12614 "zh-chs": "內核驅動程序",
12615 "xloc": [
12601 - "default.handlebars->27->647"
12616 + "default.handlebars->27->667"
12617 ]
12618 },
12619 {
@@ -12615,8 +12630,8 @@
12630 "ru": "Имя ключа",
12631 "zh-chs": "鍵名",
12632 "xloc": [
12618 - "default.handlebars->27->791",
12619 - "default.handlebars->27->794"
12633 + "default.handlebars->27->811",
12634 + "default.handlebars->27->814"
12635 ]
12636 },
12637 {
@@ -12648,7 +12663,7 @@
12663 "ru": "Кхмерский",
12664 "zh-chs": "高棉語",
12665 "xloc": [
12651 - "default.handlebars->27->901"
12666 + "default.handlebars->27->921"
12667 ]
12668 },
12669 {
@@ -12663,7 +12678,7 @@
12678 "ru": "Киргизский",
12679 "zh-chs": "吉爾吉斯",
12680 "xloc": [
12666 - "default.handlebars->27->902"
12681 + "default.handlebars->27->922"
12682 ]
12683 },
12684 {
@@ -12678,7 +12693,7 @@
12693 "ru": "Клингонский",
12694 "zh-chs": "克林貢",
12695 "xloc": [
12681 - "default.handlebars->27->903"
12696 + "default.handlebars->27->923"
12697 ]
12698 },
12699 {
@@ -12691,7 +12706,7 @@
12706 "pt": "Conhecido",
12707 "zh-chs": "已知的",
12708 "xloc": [
12694 - "default.handlebars->27->750"
12709 + "default.handlebars->27->770"
12710 ]
12711 },
12712 {
@@ -12707,7 +12722,7 @@
12722 "ru": "Korean",
12723 "zh-chs": "韓語",
12724 "xloc": [
12710 - "default.handlebars->27->904"
12725 + "default.handlebars->27->924"
12726 ]
12727 },
12728 {
@@ -12723,7 +12738,7 @@
12738 "ru": "Корейский (Северная Корея)",
12739 "zh-chs": "韓語(朝鮮)",
12740 "xloc": [
12726 - "default.handlebars->27->905"
12741 + "default.handlebars->27->925"
12742 ]
12743 },
12744 {
@@ -12739,7 +12754,7 @@
12754 "ru": "Корейский (Южная Корея)",
12755 "zh-chs": "韓語(韓國)",
12756 "xloc": [
12742 - "default.handlebars->27->906"
12757 + "default.handlebars->27->926"
12758 ]
12759 },
12760 {
@@ -12756,8 +12771,8 @@
12771 "ru": "LF",
12772 "zh-chs": "如果",
12773 "xloc": [
12759 - "default.handlebars->27->659",
12760 - "default.handlebars->27->668"
12774 + "default.handlebars->27->679",
12775 + "default.handlebars->27->688"
12776 ]
12777 },
12778 {
@@ -12774,7 +12789,7 @@
12789 "ru": "Язык",
12790 "zh-chs": "語言",
12791 "xloc": [
12777 - "default.handlebars->27->1000"
12792 + "default.handlebars->27->1020"
12793 ]
12794 },
12795 {
@@ -12808,7 +12823,7 @@
12823 "ru": "Большой Фокус",
12824 "zh-chs": "大焦點",
12825 "xloc": [
12811 - "default.handlebars->27->636"
12826 + "default.handlebars->27->656"
12827 ]
12828 },
12829 {
@@ -12991,7 +13006,7 @@
13006 "ru": "Последний доступ",
13007 "zh-chs": "最後訪問",
13008 "xloc": [
12994 - "default.handlebars->27->1310"
13009 + "default.handlebars->27->1327"
13010 ]
13011 },
13012 {
@@ -13008,7 +13023,7 @@
13023 "ru": "Последний вход в систему",
13024 "zh-chs": "上次登錄",
13025 "xloc": [
13011 - "default.handlebars->27->1437"
13026 + "default.handlebars->27->1451"
13027 ]
13028 },
13029 {
@@ -13027,10 +13042,10 @@
13042 "xloc": [
13043 "default.handlebars->27->70",
13044 "default.handlebars->27->71",
13030 - "default.handlebars->27->722",
13031 - "default.handlebars->27->723",
13032 - "default.handlebars->27->724",
13033 - "default.handlebars->27->73"
13045 + "default.handlebars->27->73",
13046 + "default.handlebars->27->742",
13047 + "default.handlebars->27->743",
13048 + "default.handlebars->27->744"
13049 ]
13050 },
13051 {
@@ -13048,8 +13063,8 @@
13063 "zh-chs": "上次代理連接",
13064 "xloc": [
13065 "default.handlebars->27->69",
13051 - "default.handlebars->27->719",
13052 - "default.handlebars->27->721"
13066 + "default.handlebars->27->739",
13067 + "default.handlebars->27->741"
13068 ]
13069 },
13070 {
@@ -13066,7 +13081,7 @@
13081 "ru": "Последнее изменение: {0}",
13082 "zh-chs": "上次更改:{0}",
13083 "xloc": [
13069 - "default.handlebars->27->1441"
13084 + "default.handlebars->27->1455"
13085 ]
13086 },
13087 {
@@ -13117,7 +13132,7 @@
13132 "ru": "Последний вход в систему: {0}",
13133 "zh-chs": "上次登錄:{0}",
13134 "xloc": [
13120 - "default.handlebars->27->1320"
13135 + "default.handlebars->27->1337"
13136 ]
13137 },
13138 {
@@ -13134,7 +13149,7 @@
13149 "ru": "Последнее посещение:",
13150 "zh-chs": "最後一次露面:",
13151 "xloc": [
13137 - "default.handlebars->27->529",
13152 + "default.handlebars->27->530",
13153 "default.handlebars->27->65"
13154 ]
13155 },
@@ -13203,7 +13218,7 @@
13218 "ru": "Латинский",
13219 "zh-chs": "拉丁",
13220 "xloc": [
13206 - "default.handlebars->27->907"
13221 + "default.handlebars->27->927"
13222 ]
13223 },
13224 {
@@ -13219,7 +13234,7 @@
13234 "ru": "Латышский",
13235 "zh-chs": "拉脫維亞語",
13236 "xloc": [
13222 - "default.handlebars->27->908"
13237 + "default.handlebars->27->928"
13238 ]
13239 },
13240 {
@@ -13258,13 +13273,14 @@
13273 "ru": "Меньше",
13274 "zh-chs": "減",
13275 "xloc": [
13261 - "default.handlebars->27->1587"
13276 + "default.handlebars->27->1598"
13277 ]
13278 },
13279 {
13280 "en": "Limit Events",
13281 "xloc": [
13267 - "default.handlebars->27->547"
13282 + "default.handlebars->27->548",
13283 + "default.handlebars->27->567"
13284 ]
13285 },
13286 {
@@ -13299,8 +13315,9 @@
13315 "zh-chs": "有限輸入",
13316 "xloc": [
13317 "default-mobile.handlebars->9->326",
13302 - "default.handlebars->27->1217",
13303 - "default.handlebars->27->540"
13318 + "default.handlebars->27->1234",
13319 + "default.handlebars->27->541",
13320 + "default.handlebars->27->560"
13321 ]
13322 },
13323 {
@@ -13317,7 +13334,7 @@
13334 "zh-chs": "僅限於輸入",
13335 "xloc": [
13336 "default-mobile.handlebars->9->301",
13320 - "default.handlebars->27->1181"
13337 + "default.handlebars->27->1198"
13338 ]
13339 },
13340 {
@@ -13335,7 +13352,7 @@
13352 "zh-chs": "鏈接",
13353 "xloc": [
13354 "default-mobile.handlebars->9->71",
13338 - "default.handlebars->27->1263",
13355 + "default.handlebars->27->1280",
13356 "default.handlebars->container->column_l->p42->p42tbl->1->0->4"
13357 ]
13358 },
@@ -13353,8 +13370,8 @@
13370 "ru": "Срок действия ссылки",
13371 "zh-chs": "鏈接過期",
13372 "xloc": [
13356 - "default.handlebars->27->274",
13357 - "default.handlebars->27->288"
13373 + "default.handlebars->27->275",
13374 + "default.handlebars->27->289"
13375 ]
13376 },
13377 {
@@ -13389,7 +13406,7 @@
13406 "ru": "Linux / BSD",
13407 "zh-chs": "Linux / BSD",
13408 "xloc": [
13392 - "default.handlebars->27->299"
13409 + "default.handlebars->27->300"
13410 ]
13411 },
13412 {
@@ -13406,7 +13423,7 @@
13423 "ru": "Linux / BSD (Удаление)",
13424 "zh-chs": "Linux / BSD(卸載)",
13425 "xloc": [
13409 - "default.handlebars->27->302"
13426 + "default.handlebars->27->303"
13427 ]
13428 },
13429 {
@@ -13477,7 +13494,7 @@
13494 "ru": "Linux ARM, Raspberry Pi (32bit)",
13495 "zh-chs": "Linux ARM,Raspberry Pi(32位)",
13496 "xloc": [
13480 - "default.handlebars->27->604"
13497 + "default.handlebars->27->624"
13498 ]
13499 },
13500 {
@@ -13566,7 +13583,7 @@
13583 "ru": "Только Linux",
13584 "zh-chs": "僅Linux",
13585 "xloc": [
13569 - "default.handlebars->27->273"
13586 + "default.handlebars->27->274"
13587 ]
13588 },
13589 {
@@ -13583,7 +13600,7 @@
13600 "ru": "Linux x86 (32bit)",
13601 "zh-chs": "Linux x86(32位)",
13602 "xloc": [
13586 - "default.handlebars->27->601"
13603 + "default.handlebars->27->621"
13604 ]
13605 },
13606 {
@@ -13600,7 +13617,7 @@
13617 "ru": "Linux x86 (64bit)",
13618 "zh-chs": "Linux x86(64位)",
13619 "xloc": [
13603 - "default.handlebars->27->602"
13620 + "default.handlebars->27->622"
13621 ]
13622 },
13623 {
@@ -13635,7 +13652,7 @@
13652 "ru": "Литовский",
13653 "zh-chs": "立陶宛語",
13654 "xloc": [
13638 - "default.handlebars->27->909"
13655 + "default.handlebars->27->929"
13656 ]
13657 },
13658 {
@@ -13653,10 +13670,10 @@
13670 "zh-chs": "載入中...",
13671 "xloc": [
13672 "default-mobile.handlebars->9->34",
13656 - "default.handlebars->27->1054",
13657 - "default.handlebars->27->1056",
13658 - "default.handlebars->27->595",
13659 - "default.handlebars->27->787"
13673 + "default.handlebars->27->1074",
13674 + "default.handlebars->27->1076",
13675 + "default.handlebars->27->615",
13676 + "default.handlebars->27->807"
13677 ]
13678 },
13679 {
@@ -13722,7 +13739,7 @@
13739 "ru": "Настройки локализации",
13740 "zh-chs": "本地化設置",
13741 "xloc": [
13725 - "default.handlebars->27->1003",
13742 + "default.handlebars->27->1023",
13743 "default.handlebars->container->column_l->p2->p2AccountActions->3->5"
13744 ]
13745 },
@@ -13740,7 +13757,7 @@
13757 "ru": "Местонахождение",
13758 "zh-chs": "位置",
13759 "xloc": [
13743 - "default.handlebars->27->508"
13760 + "default.handlebars->27->509"
13761 ]
13762 },
13763 {
@@ -13773,7 +13790,7 @@
13790 "ru": "Заблокировать учетную запись",
13791 "zh-chs": "鎖定賬戶",
13792 "xloc": [
13776 - "default.handlebars->27->1371"
13793 + "default.handlebars->27->1388"
13794 ]
13795 },
13796 {
@@ -13790,7 +13807,7 @@
13807 "ru": "Заблокирован",
13808 "zh-chs": "已鎖定",
13809 "xloc": [
13793 - "default.handlebars->27->1321"
13810 + "default.handlebars->27->1338"
13811 ]
13812 },
13813 {
@@ -13807,7 +13824,7 @@
13824 "ru": "Заблокированная учетная запись",
13825 "zh-chs": "賬戶鎖定",
13826 "xloc": [
13810 - "default.handlebars->27->1422"
13827 + "default.handlebars->27->1436"
13828 ]
13829 },

This file is too large to show in full.

views/default.handlebars
+169 -117
@@ -1814,21 +1814,25 @@
1814 case 'nodes': {
1815 nodes = [];
1816 for (var m in message.nodes) {
1817 - if (!meshes[m]) { console.log('Invalid mesh (1): ' + m); continue; }
1817 for (var n in message.nodes[m]) {
1818 if (message.nodes[m][n]._id == null) { console.log('Invalid node (' + n + '): ' + JSON.stringify(message.nodes)); continue; }
1819 message.nodes[m][n].namel = message.nodes[m][n].name.toLowerCase();
1820 if (message.nodes[m][n].rname) { message.nodes[m][n].rnamel = message.nodes[m][n].rname.toLowerCase(); } else { message.nodes[m][n].rnamel = message.nodes[m][n].namel; }
1822 - message.nodes[m][n].meshnamel = meshes[m].name.toLowerCase();
1821 + if (meshes[m]) { message.nodes[m][n].meshnamel = meshes[m].name.toLowerCase(); }
1822 message.nodes[m][n].meshid = m;
1823 message.nodes[m][n].state = (message.nodes[m][n].state)?(message.nodes[m][n].state):0;
1825 - message.nodes[m][n].desc = message.nodes[m][n].desc;
1826 - message.nodes[m][n].ip = message.nodes[m][n].ip;
1824 if (!message.nodes[m][n].icon) message.nodes[m][n].icon = 1;
1825 message.nodes[m][n].ident = ++nodeShortIdent;
1826 nodes.push(message.nodes[m][n]);
1827 }
1828 }
1829 +
1830 + // If we are currently looking at a node this is now gone, change the view.
1831 + if ((currentNode != null) && (getNodeFromId(currentNode._id) == null)) { currentNode = null; go(1); }
1832 +
1833 + // Change the reference to the current node
1834 + if (currentNode != null) { currentNode = getNodeFromId(currentNode._id); }
1835 +
1836 masterUpdate(1 | 2 | 4 | 64);
1837 break;
1838 }
@@ -1996,7 +2000,7 @@
2000 break;
2001 }
2002 case 'events': {
1999 - if ((message.nodeid != null) && (message.nodeid == currentNode._id)) {
2003 + if ((message.nodeid != null) && (currentNode != null) && (message.nodeid == currentNode._id)) {
2004 currentDeviceEvents = message.events;
2005 masterUpdate(1024);
2006 } else if ((message.user != null) && (message.user == currentUser.name)) {
@@ -2232,6 +2236,9 @@
2236 meshserver.send({ action: 'wssessioncount' });
2237 }
2238 }
2239 +
2240 + // If out list of nodes may have changes, request the new list now.
2241 + if (message.event.nodeListChange == userinfo._id) { meshserver.send({ action: 'nodes' }); }
2242 }
2243 if (users == null) break;
2244
@@ -2327,9 +2334,9 @@
2334 if ((xxcurrentView == 20) && (currentMesh == meshes[message.event.meshid])) go(2);
2335 delete meshes[message.event.meshid];
2336
2330 - // Delete all nodes in that mesh
2337 + // Delete all nodes in that mesh, except ones with direct links
2338 var newnodes = [];
2332 - for (var i in nodes) { if (nodes[i].meshid != message.event.meshid) { newnodes.push(nodes[i]); } }
2339 + for (var i in nodes) { if ((nodes[i].meshid != message.event.meshid) || ((userinfo.links != null) && (userinfo.links[nodes[i]._id] != null))) { newnodes.push(nodes[i]); } }
2340 nodes = newnodes;
2341
2342 // If we are looking at a node in the deleted mesh, move back to "My Devices"
@@ -2926,11 +2933,11 @@
2933 QV('kvmListToolbar', view == 3);
2934 QV('devMapToolbar', view == 4);
2935 QV('devListToolbarSize', view == 3);
2929 - QV('NoMeshesPanel', meshcount == 0);
2936 + QV('NoMeshesPanel', (nodes.length == 0) && (meshcount == 0));
2937 //QV('devListToolbarView', (meshcount != 0) && (nodes.length > 0));
2931 - QV('devListToolbarViewIcons', (meshcount != 0) && (nodes.length > 0));
2932 - QV('devListToolbarSort', (meshcount != 0) && (nodes.length > 0) && (view < 4));
2933 - if ((meshcount == 0) || (nodes.length == 0)) { view = 1; sort = 0; }
2938 + QV('devListToolbarViewIcons', nodes.length > 0);
2939 + QV('devListToolbarSort', (nodes.length > 0) && (view < 4));
2940 + if (nodes.length == 0) { view = 1; sort = 0; }
2941 if (view == 4) {
2942 setTimeout( function() { if (xxmap.map != null) { xxmap.map.updateSize(); } }, 200);
2943 // TODO
@@ -2964,7 +2971,7 @@
2971 var node = nodes[i];
2972 if (node.v == false) continue;
2973 var mesh2 = meshes[node.meshid];
2967 - if ((view == 3) && (mesh2.mtype == 1)) continue;
2974 + //if ((view == 3) && (mesh2.mtype == 1)) continue;
2975 var meshrights = GetNodeRights(node);
2976 if (sort == 0) {
2977 // Mesh header
@@ -2973,7 +2980,7 @@
2980 deviceHeaderSet();
2981 var extra = '';
2982 if (view == 2) { r += '<tr><td colspan=5>'; }
2976 - if (meshes[node.meshid].mtype == 1) { extra = '<span class=devHeaderx>' + ", Intel&reg; AMT only" + '</span>'; }
2983 + if (meshes[node.meshid] && (meshes[node.meshid].mtype == 1)) { extra = '<span class=devHeaderx>' + ", Intel&reg; AMT only" + '</span>'; }
2984 if ((view == 1) && (current != null)) { if (c == 2) { r += '<td><div style=width:301px></div></td>'; } if (r != '') { r += '</tr></table>'; } }
2985 if (view == 2) { r += '<div>'; }
2986 r += '<div class=DevSt style=width:100%;padding-top:4px><span style=float:right>';
@@ -2983,7 +2990,11 @@
2990 var collapsed = CollapsedGroups[node.meshid];
2991 r += '<img class=collapseImage id=\"DevxColImg' + deviceHeaderId + '\" src=images/c' + ((collapsed === true)?'1':'2') + '.png height=8 width=8 style=margin-left:2px;margin-right:2px;cursor:pointer onclick=toggleCollapseGroup(\"' + deviceHeaderId + '\",\"' + node.meshid + '\",' + view + ')></img>'; // Collapse action
2992 }
2986 - r += '<span id=MxMESH cmenu=meshContextMenu tabindex=0 style=cursor:pointer onclick=gotoMesh("' + node.meshid + '") onkeypress="if (event.key==\'Enter\') gotoMesh(\'' + node.meshid + '\')">' + EscapeHtml(meshes[node.meshid].name) + '</span>' + getMeshActions(mesh2, meshrights) + '</div>';
2993 + if (meshes[node.meshid]) {
2994 + r += '<span id=MxMESH cmenu=meshContextMenu tabindex=0 style=cursor:pointer onclick=gotoMesh("' + node.meshid + '") onkeypress="if (event.key==\'Enter\') gotoMesh(\'' + node.meshid + '\')">' + EscapeHtml(meshes[node.meshid].name) + '</span>' + getMeshActions(mesh2, meshrights) + '</div>';
2995 + } else {
2996 + r += '<span id=MxMESH cmenu=meshContextMenu tabindex=0 style=cursor:pointer><i>' + "Indivitual Devices" + '</i></span></div>';
2997 + }
2998 if (view == 2) { r += '</div>'; }
2999 current = node.meshid;
3000 displayedMeshes[current] = 1;
@@ -3113,7 +3124,7 @@
3124 }
3125
3126 // If there is nothing to display, explain the problem
3116 - if ((r == '') && (meshcount > 0) && (Q('SearchInput').value != '')) {
3127 + if ((r == '') && (nodes.length > 0) && (Q('SearchInput').value != '')) {
3128 if (sort == 3) {
3129 r = '<div style="margin:30px">' + "No devices are included in any groups, click on a device\'s \"Groups\" to add to a group." + '</div>';
3130 } else {
@@ -3173,7 +3184,7 @@
3184
3185 // Add a "Add Device Group" option
3186 r += '<div style=border-top-style:solid;border-top-width:1px;border-top-color:#DDDDDD;cursor:pointer;font-size:10px>';
3176 - if ((view < 3) && (sort == 0) && (meshcount > 0) && ((userinfo.siteadmin == 0xFFFFFFFF) || ((userinfo.siteadmin & 64) == 0))) {
3187 + if ((view < 3) && (sort == 0) && (nodes.length > 0) && ((userinfo.siteadmin == 0xFFFFFFFF) || ((userinfo.siteadmin & 64) == 0))) {
3188 r += '<a href=# onclick="return account_createMesh()" title=\"' + "Create a new group of devices." + '\" style=cursor:pointer>' + "Add Device Group" + '</a>&nbsp';
3189 }
3190 if ((userinfo.siteadmin == 0xFFFFFFFF) || ((userinfo.siteadmin & 128) == 0)) {
@@ -4139,6 +4150,8 @@
4150 // DEVICES MAP
4151 //
4152
4153 + {{{StartGeoLocationJS}}}
4154 +
4155 // Maps code starts from here. Initialize all the variables
4156 var xxmap = {
4157 map: null,
@@ -4151,8 +4164,6 @@
4164 mapView: null, // Sets the initial view
4165 }
4166
4154 - {{{StartGeoLocationJS}}}
4155 -
4167 // Add a feature for every Node and change style if connection status changes
4168 function updateMapMarkers(selectedMesh) {
4169 if ((xxmap != null) && (xxmap.map == null)) { try { loadmap(); } catch (ex) { console.error('loadmap() exception', ex); } }
@@ -4775,7 +4786,7 @@
4786 var nname = EscapeHtml(node.name);
4787 if (nname.length == 0) { nname = '<i>' + "None" + '</i>'; }
4788 if (((meshrights & 4) != 0) && ((!mesh.flags) || ((mesh.flags & 2) == 0))) { nname = '<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>' + nname + ' <img class=hoverButton src="images/link5.png" /></span>'; }
4778 - nname += '<span style=color:#AAA;font-size:small> - ' + EscapeHtml(mesh.name) + '</span>';
4789 + if (mesh) { nname += '<span style=color:#AAA;font-size:small> - ' + EscapeHtml(mesh.name) + '</span>'; }
4790 QH('p10deviceName', nname);
4791 QH('p11deviceName', nname);
4792 QH('p12deviceName', nname);
@@ -4790,7 +4801,7 @@
4801 var x = '<table style=width:100%>';
4802
4803 // Attribute: Mesh
4793 - x += 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("' + node.meshid + '") style=cursor:pointer>' + EscapeHtml(meshes[node.meshid].name) + '</a>');
4804 + if (mesh) { x += 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("' + node.meshid + '") style=cursor:pointer>' + EscapeHtml(meshes[node.meshid].name) + '</a>'); }
4805
4806 // Attribute: Name
4807 if ((node.rname != null) && (node.name != node.rname)) { x += 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(node.rname) + '</span>'); }
@@ -4861,20 +4872,16 @@
4872 x += addDeviceAttribute(meName, str);
4873 }
4874
4864 - if (mesh.mtype == 2) {
4875 + if ((node.agent != null) && (node.agent.tag != null)) {
4876 // Attribute: Mesh Agent Tag
4866 - if ((node.agent != null) && (node.agent.tag != null)) {
4867 - var tag = EscapeHtml(node.agent.tag);
4868 - if (tag.startsWith('mailto:')) { tag = '<a href="' + tag + '">' + tag.substring(7) + '</a>'; }
4869 - x += addDeviceAttribute("Agent Tag", tag);
4870 - }
4871 - } else {
4877 + var tag = EscapeHtml(node.agent.tag);
4878 + if (tag.startsWith('mailto:')) { tag = '<a href="' + tag + '">' + tag.substring(7) + '</a>'; }
4879 + x += addDeviceAttribute("Agent Tag", tag);
4880 + } else if ((node.intelamt != null) && (node.intelamt.tag != null)) {
4881 // Attribute: Intel AMT Tag
4873 - if ((node.intelamt != null) && (node.intelamt.tag != null)) {
4874 - var tag = EscapeHtml(node.intelamt.tag);
4875 - if (tag.startsWith('mailto:')) { tag = '<a href="' + tag + '">' + tag.substring(7) + '</a>'; }
4876 - x += addDeviceAttribute("Intel&reg; AMT Tag", tag);
4877 - }
4882 + var tag = EscapeHtml(node.intelamt.tag);
4883 + if (tag.startsWith('mailto:')) { tag = '<a href="' + tag + '">' + tag.substring(7) + '</a>'; }
4884 + x += addDeviceAttribute("Intel&reg; AMT Tag", tag);
4885 }
4886
4887 // Attribute: Intel AMT
@@ -4947,13 +4954,15 @@
4954 x += '&nbsp;<a href=# onclick=p10showDeleteNodeDialog("' + node._id + '") title=\"' + "Remove this device" + '\">' + "Delete Device" + '</a>';
4955 }
4956 x += '</div><div class="p10html3left">';
4950 - if (mesh.mtype == 2) x += '<a href=# onclick=p10showNodeNetInfoDialog("' + node._id + '") title=\"' + "Show device network interface information" + '\">' + "Interfaces" + '</a>&nbsp;';
4957 + if (node.agent) x += '<a href=# onclick=p10showNodeNetInfoDialog("' + node._id + '") title=\"' + "Show device network interface information" + '\">' + "Interfaces" + '</a>&nbsp;';
4958 + {{{StartGeoLocationJS}}}
4959 if (xxmap != null) x += '<a href=# onclick=p10showNodeLocationDialog("' + node._id + '") title=\"' + "Show device locations information" + '\">' + "Location" + '</a>&nbsp;';
4952 - if ((terminalAccess) && ((meshrights & 8) != 0) && (mesh.mtype == 2)) x += '<a href=# onclick=p10showMeshCmdDialog(1,"' + node._id + '") title=\"' + "Traffic router used to connect to a device thru this server" + '.\">' + "Router" + '</a>&nbsp;';
4953 - if ((args.xterm === 0) && (mesh.mtype == 2) && ((node.agent.caps & 2) != 0) && ((meshrights & 8) != 0) && ((meshrights == 0xFFFFFFFF) || ((meshrights & 512) == 0))) { x += '<a href=# onclick=p10openxterm(event,"' + node._id + '") title=\"' + "Open XTerm terminal" + '\">' + "XTerm" + '</a>&nbsp;'; }
4960 + {{{EndGeoLocationJS}}}
4961 + if ((terminalAccess) && ((meshrights & 8) != 0) && (node.agent != null)) x += '<a href=# onclick=p10showMeshCmdDialog(1,"' + node._id + '") title=\"' + "Traffic router used to connect to a device thru this server" + '.\">' + "Router" + '</a>&nbsp;';
4962 + if ((args.xterm === 0) && (node.agent) && ((node.agent.caps & 2) != 0) && ((meshrights & 8) != 0) && ((meshrights == 0xFFFFFFFF) || ((meshrights & 512) == 0))) { x += '<a href=# onclick=p10openxterm(event,"' + node._id + '") title=\"' + "Open XTerm terminal" + '\">' + "XTerm" + '</a>&nbsp;'; }
4963
4964 // RDP link, show this link only of the remote machine is Windows.
4956 - if (((connectivity & 1) != 0) && (clickOnce == true) && (mesh.mtype == 2) && ((meshrights & 8) != 0)) {
4965 + if (((connectivity & 1) != 0) && (clickOnce == true) && (node.agent) && ((meshrights & 8) != 0)) {
4966 if ((node.agent.id > 0) && (node.agent.id < 5)) { x += '<a href=# cmenu=altPortContextMenu id=rdpClickOnceLink onclick=p10clickOnce("' + node._id + '","RDP2") title=\"' + "Requires Microsoft ClickOnce support in your browser" + '.\">' + "RDP" + '</a>&nbsp;'; }
4967 if (node.agent.id > 4) {
4968 x += '<a href=# onclick=p10clickOnce("' + node._id + '","PSSH",22) title=\"' + "Requires Microsoft ClickOnce support in your browser." + '\">' + "Putty" + '</a>&nbsp;';
@@ -4990,14 +4999,14 @@
4999 // Show or hide the tabs
5000 // mesh.mtype: 1 = Intel AMT only, 2 = Mesh Agent
5001 // node.agent.caps (bitmask): 1 = Desktop, 2 = Terminal, 4 = Files, 8 = Console
4993 - QV('MainDevDesktop', desktopAccess && ((((mesh.mtype == 1) && ((typeof node.intelamt.sku !== 'number') || ((node.intelamt.sku & 8) != 0)))
4994 - || ((mesh.mtype == 2) && ((node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 1) != 0) || (node.intelamt && (node.intelamt.state == 2)))))
5002 + QV('MainDevDesktop', desktopAccess && ((((node.agent == null) && ((typeof node.intelamt.sku !== 'number') || ((node.intelamt.sku & 8) != 0)))
5003 + || ((node.agent != null) && ((node.agent.caps == null) || ((node.agent.caps & 1) != 0) || (node.intelamt && (node.intelamt.state == 2)))))
5004 && ((meshrights & 8) || (meshrights & 256)))
5005 );
4997 - QV('MainDevTerminal', ((mesh.mtype == 1) || (node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 2) != 0) || (node.intelamt && (node.intelamt.state == 2))) && (meshrights & 8) && terminalAccess);
4998 - QV('MainDevFiles', ((mesh.mtype == 2) && ((node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 4) != 0))) && (meshrights & 8) && fileAccess);
5006 + QV('MainDevTerminal', (((node.agent == null) && (node.intelamt != null)) || (node.agent.caps == null) || ((node.agent.caps & 2) != 0) || (node.intelamt && (node.intelamt.state == 2))) && (meshrights & 8) && terminalAccess);
5007 + QV('MainDevFiles', (node.agent != null) && (node.agent.caps != null) && ((node.agent.caps & 4) != 0) && (meshrights & 8) && fileAccess);
5008 QV('MainDevAmt', (node.intelamt != null) && ((node.intelamt.state == 2) || (node.conn & 2)) && (meshrights & 8) && amtAccess);
5000 - QV('MainDevConsole', (consoleRights && (mesh.mtype == 2) && ((node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 8) != 0))) && (meshrights & 8));
5009 + QV('MainDevConsole', (consoleRights && ((node.agent != null) && (node.agent.caps != null) && ((node.agent.caps & 8) != 0))) && (meshrights & 8));
5010 QV('MainDevPlugins', false);
5011 QV('p15uploadCore', (node.agent != null) && (node.agent.caps != null) && ((node.agent.caps & 16) != 0));
5012 QH('p15coreName', ((node.agent != null) && (node.agent.core != null))?node.agent.core:'');
@@ -5035,7 +5044,7 @@
5044
5045 // Update the web page title
5046 if ((currentNode) && (xxcurrentView >= 10) && (xxcurrentView < 20)) {
5038 - document.title = decodeURIComponent('{{{extitle}}}') + ' - ' + currentNode.name + ' - ' + mesh.name;
5047 + document.title = decodeURIComponent('{{{extitle}}}') + ' - ' + currentNode.name + (mesh?(' - ' + mesh.name):'');
5048 } else {
5049 document.title = decodeURIComponent('{{{extitle}}}');
5050 }
@@ -5055,29 +5064,27 @@
5064
5065 // Show user device permissions
5066 x = '';
5058 - if (urlargs.dp == 1) { // For testing only
5059 - x += '<a href=# onclick="return p20showAddMeshUserDialog(5)" style=cursor:pointer;margin-right:10px><img src=images/icon-addnew.png border=0 height=12 width=12> ' + "Add User" + '</a>';
5060 - x += '<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 Permissions" + '</th><th scope=col style=text-align:left></th></tr>';
5061 - var count = 1;
5062 - if (currentNode.links != null) {
5063 - // Sort the list of users to display
5064 - var useridlist = [];
5065 - for (var i in currentNode.links) { if (i.startsWith('user/')) { useridlist.push(i); } }
5066 - useridlist.sort();
5067 - for (var i in useridlist) {
5068 - var trash = '', rights = '', userid = useridlist[i], srights = currentNode.links[userid].rights, username = EscapeHtml(userid.split('/')[2]), rights = makeUserDeviceRightsString(srights);
5069 - if ((users != null) && (users[userid] != null)) { username = EscapeHtml(users[userid].name); }
5070 - if ((meshrights & 2) != 0) {
5071 - rights = '<div style=cursor:pointer onclick=p20showAddMeshUserDialog(5,\"' + encodeURIComponent(userid) + '\")>' + rights + ' <img class=hoverButton style=cursor:pointer src=images/link5.png></div>';
5072 - trash = '<a href=# onclick=\'return p30removeUserFromNode(event,"' + encodeURIComponent(userid) + '")\' title=\"' + "Remove user rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>';
5073 - }
5074 - if (users != null) { username = '<a href=# onclick=\'gotoUser("' + encodeURIComponent(userid) + '");haltEvent(event);\'>' + username + '</a>'; }
5075 - x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td style=width:30%><div title=\"' + "User" + '\" class=m2></div><div>&nbsp;' + username + '<div></div></div></td><td style=width:70%><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
5067 + if (meshrights & 7) { x += '<a href=# onclick="return p20showAddMeshUserDialog(5)" style=cursor:pointer;margin-right:10px><img src=images/icon-addnew.png border=0 height=12 width=12> ' + "Add User" + '</a>'; }
5068 + x += '<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>';
5069 + var count = 1;
5070 + if (currentNode.links != null) {
5071 + // Sort the list of users to display
5072 + var useridlist = [];
5073 + for (var i in currentNode.links) { if (i.startsWith('user/')) { useridlist.push(i); } }
5074 + useridlist.sort();
5075 + for (var i in useridlist) {
5076 + var trash = '', rights = '', userid = useridlist[i], srights = currentNode.links[userid].rights, username = EscapeHtml(userid.split('/')[2]), rights = makeUserDeviceRightsString(srights);
5077 + if ((users != null) && (users[userid] != null)) { username = EscapeHtml(users[userid].name); }
5078 + if ((meshrights & 2) != 0) {
5079 + trash = '<a href=# onclick=\'return p30removeUserFromNode(event,"' + encodeURIComponent(userid) + '")\' title=\"' + "Remove user rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>';
5080 + rights = '<div style=cursor:pointer onclick=p20showAddMeshUserDialog(5,\"' + encodeURIComponent(userid) + '\")>' + rights + ' <img class=hoverButton style=cursor:pointer src=images/link5.png></div>';
5081 }
5082 + if (users != null) { username = '<a href=# onclick=\'gotoUser("' + encodeURIComponent(userid) + '");haltEvent(event);\'>' + username + '</a>'; }
5083 + x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td style=width:30%><div title=\"' + "User" + '\" class=m2></div><div>&nbsp;' + username + '<div></div></div></td><td style=width:70%><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
5084 }
5078 - if (count == 1) { x += '<tr><td><div style=padding:6px>&nbsp;<i>' + "No users with special device permissions" + '</i><div></div></div></td><td></td></tr>'; }
5079 - x += '</tbody></table>';
5085 }
5086 + if (count == 1) { x += '<tr><td><div style=padding:6px>&nbsp;<i>' + "No users with special device permissions" + '</i><div></div></div></td><td></td></tr>'; }
5087 + x += '</tbody></table>';
5088 QH('p10html4', x);
5089
5090 // Change the URL
@@ -5117,6 +5124,33 @@
5124 return str.join(', ');
5125 }
5126
5127 + function makeDeviceGroupRightsString(rights) {
5128 + if (rights == 0xFFFFFFFF) { return "Full Rights"; }
5129 + var str = [];
5130 + if (rights & 1) str.push("Edit Group");
5131 + if (rights & 2) str.push("Manage Users");
5132 + if (rights & 4) str.push("Manage Devices");
5133 + if (rights & 8) {
5134 + var str1 = [];
5135 + if (rights & 256) str1.push("No Input");
5136 + if (rights & 512) str1.push("No Terminal");
5137 + if (rights & 1024) str1.push("No Files");
5138 + if (rights & 2048) str1.push("No AMT");
5139 + if (rights & 4096) str1.push("Limited Input");
5140 + if (rights & 65536) str1.push("No Desktop");
5141 + if (str1.length > 0) { str.push('Control (' + str1.join(', ') + ')'); } else { str.push("Control"); }
5142 + }
5143 + if (rights & 16) str.push("Console");
5144 + if (rights & 32) str.push("Server Files");
5145 + if (rights & 64) str.push("Wake");
5146 + if (rights & 128) str.push("Notes");
5147 + if (rights & 8192) str.push("Limit Events");
5148 + if (rights & 16384) str.push("Chat");
5149 + if (rights & 32768) str.push("Uninstall");
5150 + if (str.length == 0) return "No Rights";
5151 + return str.join(', ');
5152 + }
5153 +
5154 function writeDeviceEvent(nodeid) {
5155 if (xxdialogMode) return;
5156 setDialogMode(2, "Add Device Event", 3, writeDeviceEventEx, '<textarea id=d2devEvent style=background-color:#fcf3cf;width:100%;height:200px;resize:none;overflow-y:scroll></textarea><span style=font-size:10px>' + "This will add an entry to this device\'s event log." + '<span>', nodeid);
@@ -5273,7 +5307,7 @@
5307 date = new Date(date.getTime() - (1000 * 60 * 60 * 24)); // Substract one day
5308 }
5309
5276 - 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>' + x + '</tbody></table>');
5310 + 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 + (urlargs.key?('&key=' + urlargs.key):'') + '" onclick="setDialogMode(0)"><img title=\"' + "Download power events" + '\" src="images/link4.png" /></a>' + "7 Day Power State" + '</th></tr></thead><tbody>' + x + '</tbody></table>');
5311 }
5312
5313 // Return a color for the given power state
@@ -5623,22 +5657,23 @@
5657
5658 // Show the right buttons
5659 QV('disconnectbutton1span', (deskState != 0));
5626 - QV('connectbutton1span', (deskState == 0) && ((rights & 8) || (rights & 256)) && (mesh.mtype == 2) && (currentNode.agent.caps & 1));
5660 + QV('connectbutton1span', (deskState == 0) && ((rights & 8) || (rights & 256)) && (currentNode.agent != null) && (currentNode.agent.caps & 1));
5661 QV('connectbutton1hspan',
5662 (deskState == 0) &&
5663 (rights & 8) &&
5630 - ((mesh.mtype == 1) ||
5664 + (
5665 ((currentNode.intelamt != null) &&
5666 (currentNode.intelamt.state == 2) &&
5667 (currentNode.intelamt.ver != null) &&
5634 - (typeof currentNode.intelamt.sku == 'number') &&
5635 - ((currentNode.intelamt.sku & 8) != 0))
5668 + ((currentNode.intelamt.sku == null) ||
5669 + ((typeof currentNode.intelamt.sku == 'number') &&
5670 + ((currentNode.intelamt.sku & 8) != 0))))
5671 )
5672 );
5673
5674 // Show the right settings
5640 - QV('d7amtkvm', (currentNode.intelamt != null && ((currentNode.intelamt.ver != null) || (mesh.mtype == 1))) && ((deskState == 0) || (desktop.contype == 2)));
5641 - QV('d7meshkvm', (webRtcDesktop) || ((mesh.mtype == 2) && (currentNode.agent.caps & 1) && ((deskState == false) || (desktop.contype == 1))));
5675 + QV('d7amtkvm', (currentNode.intelamt != null && ((currentNode.intelamt.ver != null) || (currentNode.agent == null))) && ((deskState == 0) || (desktop.contype == 2)));
5676 + QV('d7meshkvm', (webRtcDesktop) || ((currentNode.agent != null) && (currentNode.agent.caps & 1) && ((deskState == false) || (desktop.contype == 1))));
5677
5678 // Enable buttons
5679 var inputAllowed = (rights == 0xFFFFFFFF) || (((rights & 8) != 0) && ((rights & 256) == 0) && ((rights & 4096) == 0));
@@ -5657,12 +5692,12 @@
5692 QE('deskkeys', deskState == 3);
5693
5694 // Display this only if we have Chat & Notify permissions
5660 - QV('DeskChatButton', ((rights & 16384) != 0) && (browserfullscreen == false) && (inputAllowed) && (mesh.mtype == 2) && online);
5661 - QV('DeskNotifyButton', ((rights & 16384) != 0) && (browserfullscreen == false) && (currentNode.agent) && (currentNode.agent.id < 5) && (inputAllowed) && (mesh.mtype == 2) && online);
5695 + QV('DeskChatButton', ((rights & 16384) != 0) && (browserfullscreen == false) && (inputAllowed) && (currentNode.agent) && online);
5696 + QV('DeskNotifyButton', ((rights & 16384) != 0) && (browserfullscreen == false) && (currentNode.agent) && (currentNode.agent.id < 5) && (inputAllowed) && (currentNode.agent) && online);
5697
5663 - QV('DeskToolsButton', (inputAllowed) && (mesh.mtype == 2) && online);
5664 - QV('DeskOpenWebButton', (browserfullscreen == false) && (inputAllowed) && (mesh.mtype == 2) && online);
5665 - QV('DeskBackgroundButton', (deskState == 3) && (desktop.contype == 1) && (mesh.mtype == 2) && (currentNode.agent.id != 11) && (currentNode.agent.id != 16) && online);
5698 + QV('DeskToolsButton', (inputAllowed) && (currentNode.agent) && online);
5699 + QV('DeskOpenWebButton', (browserfullscreen == false) && (inputAllowed) && (currentNode.agent) && online);
5700 + QV('DeskBackgroundButton', (deskState == 3) && (desktop.contype == 1) && (currentNode.agent) && (currentNode.agent.id != 11) && (currentNode.agent.id != 16) && online);
5701 QV('DeskControlSpan', inputAllowed)
5702 QV('deskActionsBtn', (browserfullscreen == false));
5703 QV('deskActionsSettings', (browserfullscreen == false));
@@ -6431,9 +6466,9 @@
6466
6467 // Show the right buttons
6468 QV('disconnectbutton2span', (termState == true));
6434 - QV('connectbutton2span', (termState == false) && (mesh.mtype == 2) && (currentNode.agent.caps & 2));
6435 - QV('connectbutton2hspan', (termState == false) && ((terminalNode.intelamt != null) && (mesh.mtype == 1 || terminalNode.intelamt.state == 2) && ((terminalNode.intelamt.ver != null) || (mesh.mtype == 1))));
6436 - QV('terminalSizeDropDown', (termState == false) && ((terminalNode.intelamt != null) && (mesh.mtype == 1 || terminalNode.intelamt.state == 2) && ((terminalNode.intelamt.ver != null) || (mesh.mtype == 1))));
6469 + QV('connectbutton2span', (termState == false) && (currentNode.agent != null) && (currentNode.agent.caps & 2));
6470 + QV('connectbutton2hspan', (termState == false) && (terminalNode.intelamt != null) && (terminalNode.intelamt.state == 2) && (terminalNode.intelamt.ver != null));
6471 + QV('terminalSizeDropDown', (termState == false) && (terminalNode.intelamt != null) && (terminalNode.intelamt.state == 2) && (terminalNode.intelamt.ver != null));
6472
6473 // Enable buttons
6474 var online = ((terminalNode.conn & 1) != 0); // If Agent (1) connected, enable Terminal
@@ -8266,13 +8301,17 @@
8301 }
8302 sortedusers.sort(function(a, b) { if (a.name > b.name) return 1; if (a.name < b.name) return -1; return 0; });
8303
8269 - // Display all users for this mesh
8304 + // Display all users for this device group
8305 for (var i in sortedusers) {
8271 - var trash = '', rights = "Partial Device Group Rights", r = sortedusers[i].rights, icon = 2;
8272 - if (r == 0xFFFFFFFF) rights = "Full Device Group Administrator"; else if (r == 0) rights = "No Rights";
8273 - if ((sortedusers[i].id != userinfo._id) && (meshrights == 0xFFFFFFFF || (((meshrights & 2) != 0)))) { trash = '<a href=# onclick=\'return p20deleteUser(event,"' + encodeURIComponent(sortedusers[i].id) + '")\' title=\"' + "Remove user rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'; }
8306 + var trash = '', r = sortedusers[i].rights, rights = makeDeviceGroupRightsString(r), icon = 2;
8307 + if ((sortedusers[i].id != userinfo._id) && (meshrights == 0xFFFFFFFF || (((meshrights & 2) != 0)))) {
8308 + trash = '<a href=# onclick=\'return p20deleteUser(event,"' + encodeURIComponent(sortedusers[i].id) + '")\' title=\"' + "Remove user rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>';
8309 + rights = '<div tabindex=0 style=cursor:pointer onclick=p20viewuser("' + encodeURIComponent(sortedusers[i].id) + '") onkeypress="if (event.key==\'Enter\') p20viewuser(\'' + encodeURIComponent(sortedusers[i].id) + '\')">' + rights + ' <img class=hoverButton style=cursor:pointer src=images/link5.png></div>';
8310 + }
8311 if (sortedusers[i].id.startsWith('ugrp/')) { icon = 4; }
8275 - x += '<tr tabindex=0 onclick=p20viewuser("' + encodeURIComponent(sortedusers[i].id) + '") onkeypress="if (event.key==\'Enter\') p20viewuser(\'' + encodeURIComponent(sortedusers[i].id) + '\')" style=cursor:pointer' + (((count % 2) == 0) ? ';background-color:#DDD' : '') + '><td><div title=\"' + "User" + '\" class=m' + icon + '></div><div>&nbsp;' + EscapeHtml(decodeURIComponent(sortedusers[i].name)) + '<div></div></div></td><td><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
8312 + var username = EscapeHtml(decodeURIComponent(sortedusers[i].name));
8313 + if (users != null) { username = '<a tabindex=0 href=# onclick=\'gotoUser("' + encodeURIComponent(sortedusers[i].id) + '");haltEvent(event);\'>' + username + '</a>'; }
8314 + x += '<tr style=' + (((count % 2) == 0) ? ';background-color:#DDD' : '') + '><td style=width:30%><div title=\"' + "User" + '\" class=m' + icon + '></div><div>&nbsp;' + username + '<div></div></div></td><td style=width:70%><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
8315 ++count;
8316 }
8317
@@ -8490,7 +8529,11 @@
8529 } else if (userid === 4) {
8530 var y = '', selectedMeshId = null, selectedNode = null;
8531 if (selected != null) { selectedNode = getNodeFromId(decodeURIComponent(selected)); if (selectedNode != null) { selectedMeshId = selectedNode.meshid; } }
8493 - for (var i in meshes) { if (selectedMeshId == null) { selectedMeshId = meshes[i]._id; } y += '<option value=' + encodeURIComponent(meshes[i]._id) + ((selectedMeshId == meshes[i]._id)?' selected':' ') + '>' + EscapeHtml(meshes[i].name) + '</option>'; }
8532 + for (var i in meshes) {
8533 + if ((meshes[i].links[userinfo._id] != null) && (meshes[i].links[userinfo._id].rights & 7)) { // Only show device groups that we have user administrator for.
8534 + if (selectedMeshId == null) { selectedMeshId = meshes[i]._id; } y += '<option value=' + encodeURIComponent(meshes[i]._id) + ((selectedMeshId == meshes[i]._id)?' selected':' ') + '>' + EscapeHtml(meshes[i].name) + '</option>';
8535 + }
8536 + }
8537 x += addHtmlValue("Device Group", '<div style=width:230px;margin:0;padding:0><select onchange=p20changeMeshAddMeshUserDialog(4) id=dp2meshid style=width:100%>' + y + '</select></div>');
8538 y = '';
8539 for (var i in nodes) { if (nodes[i].meshid == selectedMeshId) { y += '<option value=' + encodeURIComponent(nodes[i]._id) + ((selectedNode == nodes[i])?' selected':' ') + '>' + EscapeHtml(nodes[i].name) + '</option>'; } }
@@ -9943,7 +9986,9 @@
9986 // Display all users for this mesh
9987 for (var i in sortedusers) {
9988 var trash = '<a href=# onclick=\'return p51deleteUser(event,"' + encodeURIComponent(sortedusers[i].id) + '")\' title=\"' + "Remove user rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>';
9946 - x += '<tr ' + (((count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td><div title=\"' + "User" + '\" class=m2></div><div>&nbsp;' + EscapeHtml(decodeURIComponent(sortedusers[i].name)) + '<div></div></div></td><td><div style=float:right>' + trash + '</div></td></tr>';
9989 + var username = EscapeHtml(decodeURIComponent(sortedusers[i].name));
9990 + if (users != null) { username = '<a href=# onclick=\'gotoUser("' + encodeURIComponent(sortedusers[i].id) + '");haltEvent(event);\'>' + username + '</a>'; }
9991 + x += '<tr ' + (((count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td><div title=\"' + "User" + '\" class=m2></div><div>&nbsp;' + username + '<div></div></div></td><td><div style=float:right>' + trash + '</div></td></tr>';
9992 ++count;
9993 }
9994
@@ -9959,13 +10004,18 @@
10004 if (currentUserGroup.links) {
10005 for (var i in currentUserGroup.links) {
10006 if (i.startsWith('mesh/')) {
9962 - var cr = 0, r = currentUserGroup.links[i].rights, mesh = meshes[i], trash = '', rights = "Partial Device Group Rights";
10007 + var cr = 0, r = currentUserGroup.links[i].rights, mesh = meshes[i], trash = '', rights = makeDeviceGroupRightsString(r);
10008 if (mesh == null) { continue; }
10009 if ((userinfo.links) && (userinfo.links[i] != null) && (userinfo.links[i].rights != null)) { cr = userinfo.links[i].rights; }
9965 - var meshname = mesh?EscapeHtml(mesh.name):('<i>' + "Unknown Device Group" + '</i>');
9966 - if (r == 0xFFFFFFFF) rights = "Full Device Group Administrator"; else if (r == 0) rights = "No Rights";
9967 - if ((cr & 2) != 0) { trash = '<a href=# onclick=\'return p51removeMeshFromUserGroup(event,"' + encodeURIComponent(mesh._id) + '")\' title=\"' + "Remove user group rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'; }
9968 - x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td><div title=\"' + "Device Group" + '\" class=m99></div><div>&nbsp;' + meshname + '<div></div></div></td><td><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
10010 + var meshname = '<i>' + "Unknown Device Group" + '</i>';
10011 + if (mesh) { meshname = '<a href=# onclick=\'gotoMesh("' + mesh._id + '");haltEvent(event);\'>' + mesh.name + '</a>'; } else {}
10012 + if ((cr & 2) != 0) {
10013 + trash = '<a href=# onclick=\'return p51removeMeshFromUserGroup(event,"' + encodeURIComponent(mesh._id) + '")\' title=\"' + "Remove user group rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>';
10014 +
10015 + // TODO
10016 + //rights = '<div style=cursor:pointer onclick=p20showAddMeshUserDialog(5,\"' + encodeURIComponent(userid) + '\")>' + rights + ' <img class=hoverButton style=cursor:pointer src=images/link5.png></div>';
10017 + }
10018 + x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td style=width:30%><div title=\"' + "Device Group" + '\" class=m99></div><div>&nbsp;' + meshname + '<div></div></div></td><td style=width:70%><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
10019 }
10020 }
10021 }
@@ -10311,30 +10361,28 @@
10361 function drawUserPermissions() {
10362 var count = 1, x = '';
10363
10314 - if (urlargs.dp == 1) { // For testing only
10315 - // Display common devices
10316 - x += '<a href=# onclick="return p20showAddMeshUserDialog(4)" style=cursor:pointer;margin-right:10px><img src=images/icon-addnew.png border=0 height=12 width=12> ' + "Add Device" + '</a>';
10317 - x += '<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>' + "Common Devices" + '</th><th scope=col style=text-align:left></th></tr>';
10318 - if (currentUser.links) {
10319 - // Sort the list of devices to display
10320 - var nodelist = [];
10321 - for (var i in currentUser.links) { if (i.startsWith('node/')) { var node = getNodeFromId(i); if (node != null) { nodelist.push(node); } } }
10322 - nodelist.sort(nameSort);
10323 - for (var i in nodelist) {
10324 - var node = nodelist[i], r = currentUser.links[node._id].rights, trash = '', cr = GetNodeRights(node);
10325 - if ((userinfo.links) && (userinfo.links[i] != null) && (userinfo.links[i].rights != null)) { cr = userinfo.links[i].rights; }
10326 - var nodename = node?EscapeHtml(node.name):('<i>' + "Unknown Device" + '</i>');
10327 - if ((cr & 2) != 0) {
10328 - rights = '<div style=cursor:pointer onclick=p20showAddMeshUserDialog(4,\"' + encodeURIComponent(node._id) + '\")>' + makeUserDeviceRightsString(r) + ' <img class=hoverButton style=cursor:pointer src=images/link5.png></div>';
10329 - trash = '<a href=# onclick=\'return p30removeNodeFromUser(event,"' + encodeURIComponent(node._id) + '")\' title=\"' + "Remove user rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>';
10330 - }
10331 - nodename = '<a href=# onclick=\'gotoDevice("' + node._id + '",10);haltEvent(event);\'>' + nodename + '</a>';
10332 - x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td style=width:30%><div title=\"' + "Device" + '\" class=si' + node.icon + '></div><div>&nbsp;' + nodename + '<div></div></div></td><td style=width:70%><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
10364 + // Display common devices
10365 + x += '<a href=# onclick="return p20showAddMeshUserDialog(4)" style=cursor:pointer;margin-right:10px><img src=images/icon-addnew.png border=0 height=12 width=12> ' + "Add Device" + '</a>';
10366 + x += '<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>' + "Common Devices" + '</th><th scope=col style=text-align:left></th></tr>';
10367 + if (currentUser.links) {
10368 + // Sort the list of devices to display
10369 + var nodelist = [];
10370 + for (var i in currentUser.links) { if (i.startsWith('node/')) { var node = getNodeFromId(i); if (node != null) { nodelist.push(node); } } }
10371 + nodelist.sort(nameSort);
10372 + for (var i in nodelist) {
10373 + var node = nodelist[i], r = currentUser.links[node._id].rights, trash = '', cr = GetNodeRights(node);
10374 + if ((userinfo.links) && (userinfo.links[i] != null) && (userinfo.links[i].rights != null)) { cr = userinfo.links[i].rights; }
10375 + var nodename = node?EscapeHtml(node.name):('<i>' + "Unknown Device" + '</i>');
10376 + if ((cr & 2) != 0) {
10377 + rights = '<div style=cursor:pointer onclick=p20showAddMeshUserDialog(4,\"' + encodeURIComponent(node._id) + '\")>' + makeUserDeviceRightsString(r) + ' <img class=hoverButton style=cursor:pointer src=images/link5.png></div>';
10378 + trash = '<a href=# onclick=\'return p30removeNodeFromUser(event,"' + encodeURIComponent(node._id) + '")\' title=\"' + "Remove user rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>';
10379 }
10380 + nodename = '<a href=# onclick=\'gotoDevice("' + node._id + '",10);haltEvent(event);\'>' + nodename + '</a>';
10381 + x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td style=width:30%><div title=\"' + "Device" + '\" class=si' + node.icon + '></div><div>&nbsp;' + nodename + '<div></div></div></td><td style=width:70%><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
10382 }
10335 - if (count == 1) { x += '<tr><td><div style=padding:6px>&nbsp;<i>' + "No devices in common" + '</i><div></div></div></td><td></td></tr>'; }
10336 - x += '</tbody></table><br />';
10383 }
10384 + if (count == 1) { x += '<tr><td><div style=padding:6px>&nbsp;<i>' + "No devices in common" + '</i><div></div></div></td><td></td></tr>'; }
10385 + x += '</tbody></table><br />';
10386
10387 // Display common device groups
10388 count = 1;
@@ -10345,13 +10393,13 @@
10393 if (currentUser.links) {
10394 for (var i in currentUser.links) {
10395 if (i.startsWith('mesh/')) {
10348 - var cr = 0, r = currentUser.links[i].rights, mesh = meshes[i], trash = '', rights = "Partial Device Group Rights";
10396 + var cr = 0, r = currentUser.links[i].rights, mesh = meshes[i], trash = '', rights = makeDeviceGroupRightsString(r);
10397 if (mesh == null) { continue; }
10398 if ((userinfo.links) && (userinfo.links[i] != null) && (userinfo.links[i].rights != null)) { cr = userinfo.links[i].rights; }
10351 - var meshname = mesh?EscapeHtml(mesh.name):('<i>' + "Unknown Device Group" + '</i>');
10352 - if (r == 0xFFFFFFFF) rights = "Full Device Group Administrator"; else if (r == 0) rights = "No Rights";
10399 + var meshname = '<i>' + "Unknown Device Group" + '</i>';
10400 + if (mesh) { meshname = '<a href=# onclick=\'gotoMesh("' + mesh._id + '");haltEvent(event);\'>' + EscapeHtml(mesh.name) + '</a>'; } else {}
10401 if ((currentUser._id != userinfo._id) && ((cr & 2) != 0)) { trash = '<a href=# onclick=\'return p30removeMeshFromUser(event,"' + encodeURIComponent(mesh._id) + '")\' title=\"' + "Remove user rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'; }
10354 - x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td><div title=\"' + "Device Group" + '\" class=m99></div><div>&nbsp;' + meshname + '<div></div></div></td><td><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
10402 + x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td style=width:30%><div title=\"' + "Device Group" + '\" class=m99></div><div>&nbsp;' + meshname + '<div></div></div></td><td style=width:70%><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
10403 }
10404 }
10405 }
@@ -10372,9 +10420,13 @@
10420 for (var i in currentUser.links) {
10421 if (i.startsWith('ugrp/')) {
10422 var r = currentUser.links[i].rights, group = usergroups[i], trash = '';
10375 - var groupname = (group != null)?EscapeHtml(group.name):('<i>' + "Unknown User Group" + '</i>');
10423 + var groupname = '<i>' + "Unknown User Group" + '</i>';
10424 + if (group != null) {
10425 + groupname = EscapeHtml(group.name);
10426 + if (usergroups != null) { groupname = '<a href=# onclick=\'gotoUserGroup("' + encodeURIComponent(i) + '");haltEvent(event);\'>' + groupname + '</a>'; }
10427 + }
10428 if ((userinfo.siteadmin & 256) != 0) { trash = '<a href=# onclick=\'return p30RemoveUserGroup(event,"' + encodeURIComponent(i) + '")\' title=\"' + "Remove user group membership" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>'; }
10377 - x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td><div title=\"' + "Device Group" + '\" class=m4></div><div>&nbsp;' + groupname + '<div></div></div></td><td><div style=float:right>' + trash + '</div></td></tr>';
10429 + x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td><div title=\"' + "User Group" + '\" class=m4></div><div>&nbsp;' + groupname + '<div></div></div></td><td><div style=float:right>' + trash + '</div></td></tr>';
10430 }
10431 }
10432 }
@@ -11193,7 +11245,7 @@
11245
11246 // Update the web page title
11247 if ((currentNode) && (x >= 10) && (x < 20)) {
11196 - document.title = decodeURIComponent('{{{extitle}}}') + ' - ' + currentNode.name + ' - ' + meshes[currentNode.meshid].name;
11248 + document.title = decodeURIComponent('{{{extitle}}}') + ' - ' + currentNode.name + ((meshes[currentNode.meshid])?(' - ' + meshes[currentNode.meshid].name):'');
11249 } else {
11250 document.title = decodeURIComponent('{{{extitle}}}');
11251 }
webserver.js
+22 -9
@@ -2474,7 +2474,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
2474 if (!node.intelamt) { console.log('ERR: Not AMT node'); try { ws.close(); } catch (e) { } return; } // Disconnect websocket
2475
2476 // Check if this user has permission to manage this computer
2477 - if ((obj.GetMeshRights(user, node.meshid) & MESHRIGHT_REMOTECONTROL) == 0) { console.log('ERR: Access denied (2)'); try { ws.close(); } catch (e) { } return; }
2477 + if ((obj.GetNodeRights(user, node.meshid, node._id) & MESHRIGHT_REMOTECONTROL) == 0) { console.log('ERR: Access denied (2)'); try { ws.close(); } catch (e) { } return; }
2478
2479 // Check what connectivity is available for this node
2480 var state = parent.GetConnectivityState(req.query.host);
@@ -3494,6 +3494,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
3494 obj.handleDevicePowerEvents = function (req, res) {
3495 const domain = checkUserIpAddress(req, res);
3496 if (domain == null) { return; }
3497 + if ((domain.loginkey != null) && (domain.loginkey.indexOf(req.query.key) == -1)) { res.sendStatus(404); return; } // Check 3FA URL key
3498 if ((domain.id !== '') || (!req.session) || (req.session == null) || (!req.session.userid) || (req.query.id == null) || (typeof req.query.id != 'string')) { res.sendStatus(401); return; }
3499 var x = req.query.id.split('/');
3500 var user = obj.users[req.session.userid];
@@ -3506,7 +3507,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
3507 var node = docs[0];
3508
3509 // Check if we have right to this node
3509 - if (obj.GetMeshRights(user, node.meshid) == 0) { res.sendStatus(401); return; }
3510 + if (obj.GetNodeRights(user, node.meshid, node._id) == 0) { res.sendStatus(401); return; }
3511
3512 // Get the list of power events and send them
3513 res.set({ 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Content-Type': 'text/csv', 'Content-Disposition': 'attachment; filename="powerevents.csv"' });
@@ -4374,6 +4375,18 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4375 return false;
4376 }
4377
4378 + // Return the user rights for a given node
4379 + obj.GetNodeRights = function (user, mesh, nodeid) {
4380 + if ((user == null) || (mesh == null) || (nodeid == null)) { return 0; }
4381 + if (typeof user == 'string') { user = obj.users[user]; }
4382 + var r = obj.GetMeshRights(user, mesh);
4383 + if (r == 0xFFFFFFFF) return r;
4384 +
4385 + // Check direct device rights using device data
4386 + if ((user.links != null) && (user.links[nodeid] != null)) { r |= user.links[nodeid].rights; } // TODO: Deal with reverse permissions
4387 + return r;
4388 + }
4389 +
4390 // Returns a list of displatch targets for a given mesh
4391 // We have to target the meshid and all user groups for this mesh, plus any added targets
4392 obj.CreateMeshDispatchTargets = function (mesh, addedTargets) {
@@ -4510,7 +4523,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4523 if ((domain.titlepicture == null) && (domain.titlehtml == null)) {
4524 if (domain.title == null) {
4525 xargs.title1 = 'MeshCentral';
4513 - xargs.title2 = '2.0';
4526 + xargs.title2 = '';
4527 } else {
4528 xargs.title1 = domain.title;
4529 xargs.title2 = domain.title2 ? domain.title2 : '';
@@ -4535,13 +4548,13 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4548 // Check that we are in the same domain and the user has rights over this node.
4549 if ((splitsessionid.length == 4) && (splitsessionid[0] == 'user') && (splitsessionid[1] == domainid)) {
4550 // Check if this user has rights to get this message
4538 - if (obj.GetMeshRights(splitsessionid[0] + '/' + splitsessionid[1] + '/' + splitsessionid[2], meshid) == 0) return; // TODO: Check if this is ok
4551 + if (obj.GetNodeRights(splitsessionid[0] + '/' + splitsessionid[1] + '/' + splitsessionid[2], meshid, nodeid) == 0) return; // TODO: Check if this is ok
4552
4553 // See if the session is connected. If so, go ahead and send this message to the target node
4554 var ws = obj.wssessions2[command.sessionid];
4555 if (ws != null) {
4543 - command.nodeid = nodeid; // Set the nodeid, required for responses.
4544 - delete command.sessionid; // Remove the sessionid, since we are sending to that sessionid, so it's implyed.
4556 + command.nodeid = nodeid; // Set the nodeid, required for responses.
4557 + delete command.sessionid; // Remove the sessionid, since we are sending to that sessionid, so it's implyed.
4558 try { ws.send(JSON.stringify(command)); } catch (ex) { }
4559 } else if (parent.multiServer != null) {
4560 // See if we can send this to a peer server
@@ -4558,7 +4571,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4571 // Check that we are in the same domain and the user has rights over this node.
4572 if ((splituserid[0] == 'user') && (splituserid[1] == domainid)) {
4573 // Check if this user has rights to get this message
4561 - if (obj.GetMeshRights(command.userid, meshid) == 0) return; // TODO: Check if this is ok
4574 + if (obj.GetNodeRights(command.userid, meshid, nodeid) == 0) return; // TODO: Check if this is ok
4575
4576 // See if the session is connected
4577 var sessions = obj.wssessions[command.userid];
@@ -4566,7 +4579,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4579 // Go ahead and send this message to the target node
4580 if (sessions != null) {
4581 command.nodeid = nodeid; // Set the nodeid, required for responses.
4569 - delete command.userid; // Remove the userid, since we are sending to that userid, so it's implyed.
4582 + delete command.userid; // Remove the userid, since we are sending to that userid, so it's implyed.
4583 for (i in sessions) { sessions[i].send(JSON.stringify(command)); }
4584 }
4585
@@ -4581,7 +4594,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
4594 // Find all connected user sessions with access to this device
4595 for (var userid in obj.wssessions) {
4596 var xsessions = obj.wssessions[userid];
4584 - if (obj.GetMeshRights(userid, meshid) != 0) {
4597 + if (obj.GetNodeRights(userid, meshid, nodeid) != 0) {
4598 // Send the message to all sessions for this user on this server
4599 for (i in xsessions) { try { xsessions[i].send(cmdstr); } catch (e) { } }
4600 }