UNPKG

iostatus

Version:
197 lines (195 loc) 26.9 kB
var _ = require("lodash"); var Promise = require("bluebird"); var rpj = require('request-promise-json'); function mconnection(user, password, db, serial, bool) { return new Promise(function (resolve, reject) { rpj.get(db + '/connection_' + serial).then(function (doc) { doc.connected = bool; doc.updatedAt = new Date().getTime(); rpj.put(db + '/connection_' + serial, doc).then(function (d) { resolve(true); }).catch(function (err) { console.log(err); reject(err); }); }).catch(function (err) { console.log(err); if (bool == true && err.statusCode == 404) { var doc = { _id: 'connection_' + serial, connected: true, updatedAt: new Date().getTime() }; rpj.post(db, doc).then(function (doc) { resolve(true); }).catch(function (err) { reject({ error: 'wrong credentials' }); }); } else { console.log(err); reject(err); } }); }); } function pushtodb(user, password, db, serial, doc) { return new Promise(function (resolve, reject) { rpj.get(db + '/' + doc._id).then(function (d) { doc._rev = d._rev; rpj.put(db + '/' + doc._id, doc).then(function () { resolve(doc); }).catch(function (err) { reject(err); }); }).catch(function (err) { if (err.statusCode == 404) { rpj.post(db + '/', doc).then(function () { resolve(doc); }).catch(function (err) { reject(err); }); } else { console.log(err); reject(err); } }); }); } function exists(all, serial, sid) { var serialexists = false; var socketexists = false; _.map(all, function (client) { if (client.serial) { serialexists = true; _.map(client.sockets, function (s) { if (s.id == sid) { socketexists = true; } }); } }); return { serial: serialexists, socket: socketexists }; } module.exports = (function () { function MaClients(db) { this.couchdb = db; this.all = []; } MaClients.prototype.add = function (user, password, db, serial, socket) { var exist = exists(this.all, serial, socket.id); if (!exist.serial) { this.all.push({ serial: serial, user: user, password: password, db: this.couchdb.protocol + '://' + user + ':' + password + '@' + this.couchdb.host + '/' + db, sockets: [{ id: socket.id, socket: socket }] }); return mconnection(user, password, this.couchdb.protocol + '://' + user + ':' + password + '@' + this.couchdb.host + '/' + db, serial, true); } else if (!exist.socket) { _.map(this.all, function (client) { if (client.serial) { client.sockets.push({ id: socket.id, socket: socket }); } }); console.log('new socket for ' + serial); } }; ; MaClients.prototype.pushdata = function (serial, type, data) { return new Promise(function (resolve, reject) { reject('todo'); }); }; ; MaClients.prototype.remove = function (serial, sid) { var remaning = []; for (var soc = 0; soc < this.all.length; soc++) { var client = this.all[soc]; if (client.serial == serial) { if (client.sockets.length == 1 && client.sockets[0].id == sid) { mconnection(client.user, client.password, client.db, client.serial, false).then(function () { console.log('switched offline'); }).catch(function (err) { console.log('switched offline error'); console.log(err); }); _.map(this.all, function (el) { if (el.serial != client.serial) { remaning.push(el); } }); this.all = remaning; } else { console.log('todo'); } } } }; ; MaClients.prototype.list = function (serial) { var serials = []; if (serial) { _.map(this.all, function (client) { if (client.serial == serial) { serials.push(client.serial); } }); } else { _.map(this.all, function (client) { serials.push(client.serial); }); } return serials; }; ; MaClients.prototype.ios = function (serial) { var sockets = []; if (serial) { _.map(this.all, function (client) { if (client.serial == serial) { _.map(client.sockets, function (s) { sockets.push(s.socket); }); } }); } else { _.map(this.all, function (client) { _.map(client.sockets, function (s) { sockets.push(s.socket); }); }); } return sockets; }; ; MaClients.prototype.sockets = function (serial) { var ids; if (serial) { _.map(this.all, function (client) { if (client.serial == serial) { ids = _.pluck(client.sockets, "id"); } }); return ids; } else { ids = []; _.map(this.all, function (client) { _.map(client.sockets, function (s) { ids.push(s.id); }); }); return ids; } }; ; return MaClients; })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1vZHVsZXMvbWFjaENsaWVudHMudHMiXSwibmFtZXMiOlsibWNvbm5lY3Rpb24iLCJwdXNodG9kYiIsImV4aXN0cyIsImNvbnN0cnVjdG9yIiwiYWRkIiwicHVzaGRhdGEiLCJyZW1vdmUiLCJsaXN0IiwiaW9zIiwic29ja2V0cyJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBWSxDQUFDLFdBQU0sUUFBUSxDQUFDLENBQUE7QUFDNUIsSUFBWSxPQUFPLFdBQU0sVUFBVSxDQUFDLENBQUE7QUFDcEMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFMUMscUJBQXFCLElBQVksRUFBRSxRQUFnQixFQUFFLEVBQVUsRUFBRSxNQUFjLEVBQUUsSUFBYztJQUMzRkEsTUFBTUEsQ0FBQ0EsSUFBSUEsT0FBT0EsQ0FBQ0EsVUFBU0EsT0FBT0EsRUFBRUEsTUFBTUE7UUFDdkMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsY0FBYyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFTLEdBQUc7WUFDbkQsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDckIsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ3BDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLGNBQWMsR0FBRyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVMsQ0FBQztnQkFDdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2pCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFTLEdBQUc7Z0JBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNmLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVMsR0FBRztZQUNqQixPQUFPLENBQUMs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RUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDVEEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsRUFBRUEsVUFBU0EsTUFBTUE7Z0JBQzNCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDMUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDdkMsQ0FBQztZQUNMLENBQUMsQ0FBQ0EsQ0FBQUE7WUFDRkEsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQUE7UUFDZEEsQ0FBQ0E7UUFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7WUFDSkEsR0FBR0EsR0FBR0EsRUFBRUEsQ0FBQ0E7WUFFVEEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsRUFBRUEsVUFBU0EsTUFBTUE7Z0JBQzNCLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFTLENBQUM7b0JBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUNsQixDQUFDLENBQUMsQ0FBQTtZQUNOLENBQUMsQ0FBQ0EsQ0FBQUE7WUFFRkEsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQUE7UUFDZEEsQ0FBQ0E7SUFFTEEsQ0FBQ0E7O0lBS0wsZ0JBQUM7QUFBRCxDQWhLUSxBQWdLUCxHQUFBLENBQUMiLCJmaWxlIjoibW9kdWxlcy9tYWNoQ2xpZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0ICogYXMgUHJvbWlzZSBmcm9tIFwiYmx1ZWJpcmRcIjtcbmxldCBycGogPSByZXF1aXJlKCdyZXF1ZXN0LXByb21pc2UtanNvbicpO1xuXG5mdW5jdGlvbiBtY29ubmVjdGlvbih1c2VyOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGRiOiBzdHJpbmcsIHNlcmlhbDogc3RyaW5nLCBib29sPzogYm9vbGVhbikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgcnBqLmdldChkYiArICcvY29ubmVjdGlvbl8nICsgc2VyaWFsKS50aGVuKGZ1bmN0aW9uKGRvYykge1xuICAgICAgICAgICAgZG9jLmNvbm5lY3RlZCA9IGJvb2w7XG4gICAgICAgICAgICBkb2MudXBkYXRlZEF0ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgICAgIHJwai5wdXQoZGIgKyAnL2Nvbm5lY3Rpb25fJyArIHNlcmlhbCwgZG9jKS50aGVuKGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKVxuXG4gICAgICAgICAgICBpZiAoYm9vbCA9PSB0cnVlICYmIGVyci5zdGF0dXNDb2RlID09IDQwNCkgeyAgLy8gaWYgZG9jbm90IGV4aXQgZSBib29sIHRydWUgYmxhIGJsYSBibGFcblxuICAgICAgICAgICAgICAgIGxldCBkb2MgPSB7XG4gICAgICAgICAgICAgICAgICAgIF9pZDogJ2Nvbm5lY3Rpb25fJyArIHNlcmlhbCxcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcnBqLnBvc3QoZGIsIGRvYykudGhlbihmdW5jdGlvbihkb2MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHsgZXJyb3I6ICd3cm9uZyBjcmVkZW50aWFscycgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBwdXNodG9kYih1c2VyOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGRiOiBzdHJpbmcsIHNlcmlhbDogc3RyaW5nLCBkb2M6IHsgX2lkOiBzdHJpbmcsIF9yZXY/OiBzdHJpbmcgfSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgcnBqLmdldChkYiArICcvJyArIGRvYy5faWQpLnRoZW4oZnVuY3Rpb24oZCkge1xuICAgICAgICAgICAgZG9jLl9yZXYgPSBkLl9yZXZcbiAgICAgICAgICAgIHJwai5wdXQoZGIgKyAnLycgKyBkb2MuX2lkLCBkb2MpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkb2MpXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5zdGF0dXNDb2RlID09IDQwNCkge1xuICAgICAgICAgICAgICAgIHJwai5wb3N0KGRiICsgJy8nLCBkb2MpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZG9jKVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gZXhpc3RzKGFsbDogSUNsaWVudFtdLCBzZXJpYWwsIHNpZCk6IHsgc2VyaWFsOiBib29sZWFuLCBzb2NrZXQ6IGJvb2xlYW4gfSB7XG4gICAgbGV0IHNlcmlhbGV4aXN0cyA9IGZhbHNlXG4gICAgbGV0IHNvY2tldGV4aXN0cyA9IGZhbHNlXG5cbiAgICBfLm1hcChhbGwsIGZ1bmN0aW9uKGNsaWVudCkge1xuICAgICAgICBpZiAoY2xpZW50LnNlcmlhbCkge1xuICAgICAgICAgICAgc2VyaWFsZXhpc3RzID0gdHJ1ZVxuXG4gICAgICAgICAgICBfLm1hcChjbGllbnQuc29ja2V0cywgZnVuY3Rpb24ocykge1xuICAgICAgICAgICAgICAgIGlmIChzLmlkID09IHNpZCkge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXRleGlzdHMgPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHsgc2VyaWFsOiBzZXJpYWxleGlzdHMsIHNvY2tldDogc29ja2V0ZXhpc3RzIH1cbn1cblxuXG5pbnRlcmZhY2UgSVNvY2tldEFycmF5IHtcblxuICAgIGlkOiBzdHJpbmc7XG4gICAgc29ja2V0OiBJU29ja2V0XG59XG5cbmludGVyZmFjZSBJU29ja2V0IHtcbiAgICAgICAgICAgICAgICBvbjpGdW5jdGlvbjtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZW1pdDpGdW5jdGlvbjtcbiAgICBkZWNvZGVkX3Rva2VuOntcbiAgICAgICAgZGI6c3RyaW5nO1xuICAgICAgICB1c2VyOnN0cmluZztcbiAgICAgICAgcGFzc3dvcmQ6c3RyaW5nO1xuICAgICAgICBzZXJpYWw6c3RyaW5nO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIElDbGllbnQge1xuICAgIHNlcmlhbDogc3RyaW5nO1xuICAgIHNvY2tldHM6IElTb2NrZXRBcnJheVtdO1xuICAgIHVzZXI6IHN0cmluZztcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIGRiOiBzdHJpbmc7XG59XG5cblxuaW50ZXJmYWNlIElDb3VjaGRiIHtcbiAgICBwcm90b2NvbDogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICBob3N0OiBzdHJpbmc7XG59XG5cblxuZXhwb3J0ID1jbGFzcyBNYUNsaWVudHMge1xuICAgIGFsbDogSUNsaWVudFtdO1xuICAgIGNvdWNoZGI6IElDb3VjaGRiO1xuXG4gICAgY29uc3RydWN0b3IoZGI6IElDb3VjaGRiKSB7XG4gICAgICAgIHRoaXMuY291Y2hkYiA9IGRiXG4gICAgICAgIHRoaXMuYWxsPSBbXTtcbiAgICB9XG5cbiAgICBhZGQodXNlcjogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBkYjogc3RyaW5nLCBzZXJpYWw6IHN0cmluZywgc29ja2V0OiBJU29ja2V0KSB7XG5cbiAgICAgICAgbGV0IGV4aXN0ID0gZXhpc3RzKHRoaXMuYWxsLCBzZXJpYWwsIHNvY2tldC5pZClcbiAgICAgICAgaWYgKCFleGlzdC5zZXJpYWwpIHtcblxuICAgICAgICAgICAgdGhpcy5hbGwucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VyaWFsOiBzZXJpYWwsXG4gICAgICAgICAgICAgICAgdXNlcjogdXNlcixcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgZGI6IHRoaXMuY291Y2hkYi5wcm90b2NvbCArICc6Ly8nICsgdXNlciArICc6JyArIHBhc3N3b3JkICsgJ0AnICsgdGhpcy5jb3VjaGRiLmhvc3QgKyAnLycgKyBkYixcbiAgICAgICAgICAgICAgICBzb2NrZXRzOiBbeyBpZDogc29ja2V0LmlkLCBzb2NrZXQ6IHNvY2tldCB9XVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgcmV0dXJuIG1jb25uZWN0aW9uKHVzZXIsIHBhc3N3b3JkLCB0aGlzLmNvdWNoZGIucHJvdG9jb2wgKyAnOi8vJyArIHVzZXIgKyAnOicgKyBwYXNzd29yZCArICdAJyArIHRoaXMuY291Y2hkYi5ob3N0ICsgJy8nICsgZGIsIHNlcmlhbCwgdHJ1ZSlcblxuICAgICAgICB9IGVsc2UgaWYgKCFleGlzdC5zb2NrZXQpIHtcbiAgICAgICAgICAgIF8ubWFwKHRoaXMuYWxsLCBmdW5jdGlvbihjbGllbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2xpZW50LnNlcmlhbCkge1xuICAgICAgICAgICAgICAgICAgICBjbGllbnQuc29ja2V0cy5wdXNoKHsgaWQ6IHNvY2tldC5pZCwgc29ja2V0OiBzb2NrZXQgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coJ25ldyBzb2NrZXQgZm9yICcgKyBzZXJpYWwpXG4gICAgICAgIH1cblxuXG4gICAgfTtcbiAgICBwdXNoZGF0YShzZXJpYWw6c3RyaW5nLHR5cGU6c3RyaW5nLGRhdGE6YW55KSB7XG4gICAgXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBcbiAgICAgICAgcmVqZWN0KCd0b2RvJylcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgfSkgXG4gICAgICAgIFxuICAgICAgICBcbn07XG4gICAgcmVtb3ZlKHNlcmlhbDogc3RyaW5nLCBzaWQ6IHN0cmluZykge1xuXG4gICAgICAgIGxldCByZW1hbmluZzogSUNsaWVudFtdPVtdO1xuXG4gICAgICAgIGZvciAobGV0IHNvYyA9IDA7IHNvYyA8IHRoaXMuYWxsLmxlbmd0aDsgc29jKyspIHtcblxuICAgICAgICAgICAgdmFyIGNsaWVudCA9IHRoaXMuYWxsW3NvY107XG5cblxuXG4gICAgICAgICAgICBpZiAoY2xpZW50LnNlcmlhbCA9PSBzZXJpYWwpIHtcblxuICAgICAgICAgICAgICAgIGlmIChjbGllbnQuc29ja2V0cy5sZW5ndGggPT0gMSAmJiBjbGllbnQuc29ja2V0c1swXS5pZCA9PSBzaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWNvbm5lY3Rpb24oY2xpZW50LnVzZXIsIGNsaWVudC5wYXNzd29yZCwgY2xpZW50LmRiLCBjbGllbnQuc2VyaWFsLCBmYWxzZSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzd2l0Y2hlZCBvZmZsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3dpdGNoZWQgb2ZmbGluZSBlcnJvcicpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgXy5tYXAodGhpcy5hbGwsIGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwuc2VyaWFsICE9IGNsaWVudC5zZXJpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1hbmluZy5wdXNoKGVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsID0gcmVtYW5pbmc7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndG9kbycpXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuYWxsPV8ucmVqZWN0KHRoaXMuYWxsLCBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgIHJldHVybiBlbC5zZXJpYWwgPT09IGNsaWVudC5zZXJpYWw7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pXG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbGlzdChzZXJpYWw/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBzZXJpYWxzOiBzdHJpbmdbXT1bXTtcbiAgICAgICAgaWYgKHNlcmlhbCkge1xuXG4gICAgICAgICAgICBfLm1hcCh0aGlzLmFsbCwgZnVuY3Rpb24oY2xpZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNsaWVudC5zZXJpYWwgPT0gc2VyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbHMucHVzaChjbGllbnQuc2VyaWFsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgXy5tYXAodGhpcy5hbGwsIGZ1bmN0aW9uKGNsaWVudCkge1xuICAgICAgICAgICAgICAgIHNlcmlhbHMucHVzaChjbGllbnQuc2VyaWFsKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlcmlhbHNcblxuICAgIH07XG4gICAgaW9zKHNlcmlhbD86IHN0cmluZyk6IElTb2NrZXRbXSB7XG4gICAgICAgIGxldCBzb2NrZXRzOiBJU29ja2V0W109W107XG5cbiAgICAgICAgaWYgKHNlcmlhbCkge1xuICAgICAgICAgICAgXy5tYXAodGhpcy5hbGwsIGZ1bmN0aW9uKGNsaWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjbGllbnQuc2VyaWFsID09IHNlcmlhbCkge1xuXG4gICAgICAgICAgICAgICAgICAgIF8ubWFwKGNsaWVudC5zb2NrZXRzLCBmdW5jdGlvbihzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRzLnB1c2gocy5zb2NrZXQpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICB9IGVsc2Uge1xuXG5cbiAgICAgICAgICAgIF8ubWFwKHRoaXMuYWxsLCBmdW5jdGlvbihjbGllbnQpIHtcbiAgICAgICAgICAgICAgICBfLm1hcChjbGllbnQuc29ja2V0cywgZnVuY3Rpb24ocykge1xuXG4gICAgICAgICAgICAgICAgICAgIHNvY2tldHMucHVzaChzLnNvY2tldClcblxuXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb2NrZXRzXG4gICAgfTtcbiAgICBzb2NrZXRzKHNlcmlhbD86IHN0cmluZykge1xuICAgICAgICBsZXQgaWRzO1xuICAgICAgICBpZiAoc2VyaWFsKSB7XG4gICAgICAgICAgICBfLm1hcCh0aGlzLmFsbCwgZnVuY3Rpb24oY2xpZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNsaWVudC5zZXJpYWwgPT0gc2VyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkcyA9IF8ucGx1Y2soY2xpZW50LnNvY2tldHMsIFwiaWRcIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGlkc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRzID0gW107XG5cbiAgICAgICAgICAgIF8ubWFwKHRoaXMuYWxsLCBmdW5jdGlvbihjbGllbnQpIHtcbiAgICAgICAgICAgICAgICBfLm1hcChjbGllbnQuc29ja2V0cywgZnVuY3Rpb24ocykge1xuICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChzLmlkKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm4gaWRzXG4gICAgICAgIH1cblxuICAgIH07XG4gICAgXG4gICAgXG4gICAgXG4gICAgXG59O1xuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9