3 lines
371 KiB
JavaScript
3 lines
371 KiB
JavaScript
"use strict";Array.prototype.remove=function(){for(var e,t,n=arguments,i=n.length;i&&this.length;)for(e=n[--i];-1!==(t=this.indexOf(e));)this.splice(t,1);return this},console.debug||(console.debug=console.log),"undefined"==typeof Number&&(console.log("define Number"),Number=function(e){return parseFloat(e)}),Object.assign||(Object.assign=$.extend);var $iframeDialog=null,configNotSaved=null,showConfig=null,defaults={},customPostInits={},FORBIDDEN_CHARS=/[\]\[*,;'"`<>\\\s?]/g,adapterRedirect=function(e,t){e&&setTimeout(function(){e+=document.location.pathname,e+=document.location.hash,document.location.href=e},t||5e3)},gMain=null;function detectIE(){var e=window.navigator.userAgent,t=e.indexOf("MSIE ");if(0<t)return parseInt(e.substring(t+5,e.indexOf(".",t)),10);if(0<e.indexOf("Trident/")){var n=e.indexOf("rv:");return parseInt(e.substring(n+3,e.indexOf(".",n)),10)}var i=e.indexOf("Edge/");return 0<i&&parseInt(e.substring(i+5,e.indexOf(".",i)),10)}function Adapters(e){var H=this;function t(){H.$grid.show(),H.$tiles.html("").hide(),H.$tab.find("#main-toolbar-table-types-btn").hide(),H.$grid.data("inited")?(H.$tab.find("#btn_collapse_adapters").show(),H.$tab.find("#btn_expand_adapters").show(),H.$tab.find("#btn_list_adapters").show()):(H.$grid.data("inited",!0),H.$grid.fancytree({extensions:["table","gridnav","filter","themeroller"],checkbox:!1,strings:{noData:_("No data")},table:{indentation:5},show:function(e,t,n){H.sortTree()},source:H.tree,renderColumns:function(e,t){var n=t.node,i=$(n.tr).find(">td"),a=H.data[n.key];function s(e){return'<div class="text-ellipsis">'+e+"</div>"}if(a){i.eq(0).css({overflow:"hidden","white-space":"nowrap"});var o=a.desc.indexOf("<div"),r=0<=o?a.desc.substr(0,o):a.desc;i.eq(1).html(s(a.desc)).attr("title",r).css({"white-space":"nowrap",position:"relative","font-weight":a.bold?"bold":null}).find(">div>div").css("height: 22px !important"),u(2,a.keywords).attr("title",a.keywords),i.eq(3).html(a.installed),i.eq(4).html(a.version),u(5,a.license),u(6,a.install),H.initButtons(n.key),H.isCollapsed[a.group]&&(H.isCollapsed[a.group]=!1,H.main.saveConfig("adaptersIsCollapsed",JSON.stringify(H.isCollapsed)))}else{i.eq(0).css({"font-weight":"bold"}),i.eq(0).find("img").remove(),i.eq(0).find("span.fancytree-title").attr("style","padding-left: 0px !important");for(var c=0;c<H.tree.length;c++)if(H.tree[c].key===n.key){i.eq(1).html(H.tree[c].desc||"").css({overflow:"hidden","white-space":"nowrap",position:"relative"});for(var l=0,d=0;d<H.tree[c].children.length;d++)H.data[H.tree[c].children[d].key].installed&&l++;H.tree[c].installed=l,n.data.installed=l,'[<span title="'+_("Installed from group")+'">'+l+'</span> / <span title="'+_("Total count in group")+'">'+H.tree[c].children.length+"</span>]",i.eq(1).html(s('<span class="dark-green">'+l+"</span> "+_("of")+'<span class="dark-blue"> '+H.tree[c].children.length+"</span> "+_("Adapters from this Group installed")));break}}function u(e,t){return i.eq(e).html(s(t))}},gridnav:{autofocusInput:!1,handleCursorKeys:!0},filter:{mode:"hide",autoApply:!0},collapse:function(e,t){H.isCollapsed[t.node.key]||(H.isCollapsed[t.node.key]=!0,H.main.saveConfig("adaptersIsCollapsed",JSON.stringify(H.isCollapsed)))}}),H.$tab.find("#btn_collapse_adapters").show().off("click").on("click",function(){H.$tab.find(".process-adapters").show(),setTimeout(function(){H.$grid.fancytree("getRootNode").visit(function(e){(!H.filterVals.length||e.match||e.subMatch)&&e.setExpanded(!1)}),H.$tab.find(".process-adapters").hide()},100)}),H.$tab.find("#btn_expand_adapters").show().off("click").on("click",function(){H.$tab.find(".process-adapters").show(),setTimeout(function(){H.$grid.fancytree("getRootNode").visit(function(e){(!H.filterVals.length||e.match||e.subMatch)&&e.setExpanded(!0)}),H.$tab.find(".process-adapters").hide()},100)}),H.$tab.find("#btn_list_adapters").show().off("click").on("click",function(){var e=H.$tab.find(".process-adapters");e.show(),H.isList=!H.isList,H.isList?(H.$tab.find("#btn_list_adapters").addClass("red lighten-3"),H.$tab.find("#btn_expand_adapters").hide(),H.$tab.find("#btn_collapse_adapters").hide(),$(this).attr("title",_("list"))):(H.$tab.find("#btn_list_adapters").removeClass("red lighten-3"),H.$tab.find("#btn_expand_adapters").show(),H.$tab.find("#btn_collapse_adapters").show(),$(this).attr("title",_("tree"))),H.main.saveConfig("adaptersIsList",H.isList),e.show(),setTimeout(function(){H._postInit(!0),e.hide()},200)})),H.isList?(H.$tab.find("#btn_list_adapters").addClass("red lighten-3").attr("title",_("tree")),H.$tab.find("#btn_expand_adapters").hide(),H.$tab.find("#btn_collapse_adapters").hide()):(H.$tab.find("#btn_list_adapters").removeClass("red lighten-3").attr("title",_("list")),H.$tab.find("#btn_expand_adapters").show(),H.$tab.find("#btn_collapse_adapters").show()),H.$tab.find(".filter-input").trigger("change")}function n(){H.$grid.hide(),H.$tiles.show(),H.$tab.find("#main-toolbar-table-types-btn").show(),H.$tab.find("#btn_list_adapters").hide(),H.$tab.find("#btn_collapse_adapters").hide(),H.$tab.find("#btn_expand_adapters").hide(),H.$tab.find(".filter-input").trigger("change")}function i(){H.onlyUpdatable?(H.$tab.find("#btn_filter_updates").addClass("red lighten-3"),H.$tab.find("#btn_upgrade_all").show()):(H.$tab.find("#btn_upgrade_all").hide(),H.$tab.find("#btn_filter_updates").removeClass("red lighten-3"))}function a(){H.main.config.expertMode?(H.$tab.find("#btn_adapters_expert_mode").addClass("red lighten-3"),H.$tab.find("#btn_upgrade_all").show()):(H.$tab.find("#btn_adapters_expert_mode").removeClass("red lighten-3"),i())}function B(){var t=!1;H.currentFilter?H.$tiles.find(".tile").each(function(){var e=$(this);(!H.currentType||e.hasClass("class-"+H.currentType))&&G({key:e.data("id")})?(t=!0,e.show()):e.hide()}):H.currentType?(H.$tiles.find(".tile").hide(),H.$tiles.find(".class-"+H.currentType).show(),H.$tiles.find(".tile").each(function(){if($(this).is(":visible"))return!(t=!0)})):H.$tiles.find(".tile").show().each(function(){if($(this).is(":visible"))return!(t=!0)}),t?H.$tiles.find(".filtered-out").hide():H.$tiles.find(".filtered-out").show()}function G(e){if(H.currentFilter){if(!H.data[e.key])return!1;var t=H.data[e.key].title;t&&"object"==typeof t&&(t=t[systemLang]||t.en);var n=H.data[e.key].desc;return n&&"object"==typeof n&&(n=n[systemLang]||n.en),!!(H.data[e.key].name&&-1!==H.data[e.key].name.toLowerCase().indexOf(H.currentFilter)||t&&-1!==t.toLowerCase().indexOf(H.currentFilter)||H.data[e.key].keywords&&-1!==H.data[e.key].keywords.toLowerCase().indexOf(H.currentFilter)||n&&-1!==n.toLowerCase().indexOf(H.currentFilter))}return!0}function F(e,t){var n="";if(t.news)for(var i in t.news)if(t.news.hasOwnProperty(i)){if(systemLang===i&&(n+=(n?"\n":"")+t.news[i]),"en"===i||"cn"===i)continue;if(i===e)break;n+=(n?"\n":"")+(t.news[i][systemLang]||t.news[i].en)}return n}function Z(e){if(!e)return"";var t;if(e instanceof Array){t={};for(var n=0;n<e.length;n++)if("string"!=typeof e[n])for(var i in e[n])e[n].hasOwnProperty(i)&&(t[i]=e[n][i])}else t=e;for(var a in t)if(t.hasOwnProperty(a))if("js-controller"===a){if(!semver.satisfies(H.main.objects["system.host."+H.main.currentHost].common.installedVersion,t[a]))return _("Invalid version of %s. Required %s",a,t[a])}else{if(!H.main.objects["system.adapter."+a]||!H.main.objects["system.adapter."+a].common||!H.main.objects["system.adapter."+a].common.installedVersion)return _("No version of %s",a);if(!semver.satisfies(H.main.objects["system.adapter."+a].common.installedVersion,t[a]))return _("Invalid version of %s",a)}return""}function J(e,t,n,i,a,s,o){if(o=o||Date.now(),!e)return"";"string"!=typeof e&&"number"!=typeof e||(e=new Date(e));var r=o.getTime()-e.getTime(),c=Math.floor(r/864e5);if(0===c)return o.getDate()===e.getDate()?t:n;if(1===c)return o.getDate()-e.getDate()==1?n:a.replace("%d",c+1);var l=c%10,d=c%100;return(d<10||20<d)&&2<=l&&l<=4?a.replace("%d",c):(d<10||20<d)&&1===l?i.replace("%d",c):s.replace("%d",c)}function W(e,t,n){var i="";return t||"string"==typeof e?(t||(i+='<div class="group-upload-progress"'),!0):(n=e,e=null),n&&(i+='<table style="height: 3px; " title="'+_("Upload")+" "+n+'%" class="no-space" style="width:100%; height: 100%; opacity: 0.7"><tr style="height: 100%" class="no-space"><td class="no-space" style="width:'+n+'%;background: blue"></td><td style="width:'+(100-n)+'%;opacity: 0.1" class="no-space"></td></tr></table>'),i}this.curRepository=null,this.curRepoLastUpdate=null,this.curInstalled=null,this.curRepoLastHost=null,this.list=[],this.$tab=$("#tab-adapters"),this.$grid=this.$tab.find("#grid-adapters"),this.$tiles=this.$tab.find("#grid-adapters-tiles"),this.$installDialog=$("#dialog-install-url"),this.main=e,this.tree=[],this.data={},this.urls={},this.groupImages={"common adapters_group":"img/common.png",general_group:"img/common.png",hardware_group:"img/hardware.png",lighting_group:"img/hardware.png",energy_group:"img/hardware.png",household_group:"img/hardware.png","iot-systems_group":"img/hardware.png","climate-control_group":"img/hardware.png",infrastructure_group:"img/hardware.png",garden_group:"img/hardware.png",alarm_group:"img/hardware.png",script_group:"img/script.png",logic_group:"img/script.png",media_group:"img/media.png",multimedia_group:"img/media.png",communication_group:"img/communication.png",protocols_group:"img/communication.png",network_group:"img/communication.png",messaging_group:"img/communication.png",visualisation_group:"img/visualisation.png",visualization_group:"img/visualisation.png","visualization-icons_group":"img/visualisation.png","visualization-widgets_group":"img/visualisation.png",storage_group:"img/storage.png",weather_group:"img/weather.png",schedule_group:"img/schedule.png",vis_group:"img/vis.png","date-and-time_group":"img/service.png",geoposition_group:"img/service.png",utility_group:"img/service.png","misc-data_group":"img/service.png",service_group:"img/service.png","third-party_group":"img/service.png"},this.inited=!1,this.isList=!1,this.filterVals={length:0},this.onlyInstalled=!1,this.onlyUpdatable=!1,this.currentFilter="",this.currentType="",this.isCollapsed={},this.isTiles=!0,this.types={occ:"schedule"},this.prepare=function(){this.$tab.find("#btn_switch_adapters").off("click").on("click",function(){H.$tab.find(".process-adapters").show(),H.isTiles=!H.isTiles,H.isTiles?(H.$tab.removeClass("view-table").addClass("view-tiles"),$(this).find("i").text("view_list")):($(this).find("i").text("view_module"),H.$tab.removeClass("view-tiles").addClass("view-table")),H.main.saveConfig("adaptersIsTiles",H.isTiles),setTimeout(function(){H.isTiles?n():t(),H._postInit(!0),H.$tab.find(".process-adapters").hide()},50)}),this.$tab.find("#btn_filter_adapters").off("click").on("click",function(){H.$tab.find(".process-adapters").show(),H.onlyInstalled=!H.onlyInstalled,H.onlyInstalled?H.$tab.find("#btn_filter_adapters").addClass("red lighten-3"):H.$tab.find("#btn_filter_adapters").removeClass("red lighten-3"),H.main.saveConfig("adaptersOnlyInstalled",H.onlyInstalled),setTimeout(function(){H._postInit(!0),H.$tab.find(".process-adapters").hide()},50)}),this.$tab.find("#btn_filter_updates").off("click").on("click",function(){H.$tab.find(".process-adapters").show(),H.onlyUpdatable=!H.onlyUpdatable,i(),H.main.saveConfig("adaptersOnlyUpdatable",H.onlyUpdatable),setTimeout(function(){H._postInit(!0),H.$tab.find(".process-adapters").hide()},200)}),this.$tab.find("#btn_filter_custom_url").off("click").on("click",function(){var e,t='<option value="">'+_("none")+"</option>",n=[];for(e in H.urls)H.urls.hasOwnProperty(e)&&n.push(e);n.sort();for(var i=0;i<n.length;i++){var a=H.urls[n[i]].match(/\.com\/([-_$§A-Za-z0-9]+)\/([-._$§A-Za-z0-9]+)\//);a&&2<=a.length&&(H.main.config.expertMode||-1===n[i].indexOf("js-controller"))&&(t+='<option value="https://git.spacen.net/'+a[1]+"/yunkong2."+n[i]+"/tarball/master "+n[i]+'">'+n[i]+"</option>")}H.$installDialog.find("#install-github-link").html(t).val(H.main.config.adaptersGithub||""),H.$installDialog.modal(),H.$installDialog.find(".btn-install").off("click").on("click",function(){var e,t,n,i,a;if(!H.$installDialog.find('a[href="#tabs-install-github"]').hasClass("active"))e=H.$installDialog.find("#install-url-link").val(),i=H.$installDialog.find("#install-url-link-username").val(),a=H.$installDialog.find("#install-url-link-password").val(),i&&(e=e.replace("https://","https://"+i+":"+a+"@")),e.startsWith("http")&&e.endsWith(".git")&&(e="git+"+e),t=H.$installDialog.find("#install-url-debug").prop("checked")?" --debug":"",n="";else{var s=H.$installDialog.find("#install-github-link").val().split(" ");e=s[0],t=H.$installDialog.find("#install-github-debug").prop("checked")?" --debug":"",n=" "+s[1]}e?H.main.cmdExec(null,'url "'+e+'" --production'+n+t,function(e){e||H.init(!0,!0)}):H.main.showError(_("Invalid link"))}),H.$installDialog.find("#install-github-link").select(),H.$installDialog.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),H.$installDialog.modal("open"),H.$installDialog.find(".tabs").mtabs({nShow:function(e){e&&H.main.saveConfig("adaptersInstallTab",$(e).attr("id"))}}),H.main.config.adaptersInstallTab&&!H.main.noSelect&&H.$installDialog.find(".tabs").mtabs("select",H.main.config.adaptersInstallTab)}),this.$tab.find("#btn_upgrade_all").off("click").on("click",function(){H.main.confirmMessage(_("Do you want to upgrade all adapters?"),_("Please confirm"),"help",function(e){e&&H.main.cmdExec(null,"upgrade",function(e){e||H._postInit(!0)})})}),this.$tab.find("#btn_adapters_expert_mode").on("click",function(){H.main.config.expertMode=!H.main.config.expertMode,H.main.saveConfig("expertMode",H.main.config.expertMode),H.updateExpertMode(),H.main.tabs.instances.updateExpertMode()}),H.main.config.expertMode&&H.$tab.find("#btn_adapters_expert_mode").addClass("red lighten-3"),this.$installDialog.find("#install-github-link").on("change",function(){H.main.saveConfig("adaptersGithub",$(this).val())}),this.$installDialog.find("#install-url-link").on("keyup",function(e){13===e.which&&H.$installDialog.find("#dialog-install-url-button").trigger("click")}),this.isTiles=void 0===this.main.config.adaptersIsTiles||null===this.main.config.adaptersIsTiles||this.main.config.adaptersIsTiles,this.isList=this.main.config.adaptersIsList||!1,this.onlyInstalled=this.main.config.adaptersOnlyInstalled||!1,this.onlyUpdatable=this.main.config.adaptersOnlyUpdatable||!1,this.currentFilter=this.main.config.adaptersCurrentFilter||"",this.currentType=this.main.config.adaptersCurrentType||"",this.currentOrder=this.main.config.adaptersCurrentOrder||"a-z",this.isCollapsed=this.main.config.adaptersIsCollapsed?JSON.parse(this.main.config.adaptersIsCollapsed):{},this.currentFilter?(this.$tab.find(".filter-input").addClass("input-not-empty").val(H.currentFilter),this.$tab.find(".filter-clear").show()):this.$tab.find(".filter-clear").hide(),this.onlyInstalled?this.$tab.find("#btn_filter_adapters").addClass("red lighten-3"):this.$tab.find("#btn_filter_adapters").removeClass("red lighten-3"),this.onlyUpdatable?this.$tab.find("#btn_filter_updates").addClass("red lighten-3"):this.$tab.find("#btn_filter_updates").removeClass("red lighten-3"),"ie"===this.main.browser&&this.main.browserVersion<=10&&(this.isTiles=!1,this.$tab.find("#btn_switch_adapters").hide()),a(),this.$tab.find("#btn_refresh_adapters").on("click",function(){H.init(!0,!0)}),this.$tab.find(".filter-input").on("keyup",function(){$(this).trigger("change")}).on("change",function(e){H.filterTimer&&clearTimeout(H.filterTimer),H.filterTimer=setTimeout(function(){H.filterTimer=null,H.currentFilter=H.$tab.find(".filter-input").val().toLowerCase(),e&&e.target&&$(e.target)[H.currentFilter?"addClass":"removeClass"]("input-not-empty"),H.currentFilter?H.$tab.find(".filter-clear").show():H.$tab.find(".filter-clear").hide(),H.main.saveConfig("adaptersCurrentFilter",H.currentFilter),H.isTiles?B():H.$grid.fancytree("getTree").filterNodes(G,!1)},400)}),this.$tab.find(".filter-clear").on("click",function(){H.$tab.find(".filter-input").val("").trigger("change")}),this.isTiles?(this.$tab.find("#btn_switch_adapters").find("i").text("view_list"),H.$tab.removeClass("view-table").addClass("view-tiles"),n()):(H.$tab.removeClass("view-tiles").addClass("view-table"),t())},this.updateExpertMode=function(){this.init(!0),a()},this.getAdaptersInfo=function(e,t,n,i){if(e){if(!i)throw"Callback cannot be null or undefined";t&&(!this.curRepoLastUpdate||1e3<(new Date).getTime()-this.curRepoLastUpdate)&&(this.curRepository=null,this.curInstalled=null),this.curRunning?this.curRunning.push(i):(this.curRepository&&this.curRepoLastHost===e||(this.curRepository=null,this.main.socket.emit("sendToHost",e,"getRepository",{repo:this.main.systemConfig.common.activeRepo,update:n},function(e){"permissionError"===e&&(console.error('May not read "getRepository"'),e={}),H.curRepository=e||{},H.curRepository&&H.curInstalled&&H.curRunning&&(H.curRepoLastUpdate=(new Date).getTime(),setTimeout(function(){for(var e=0;e<H.curRunning.length;e++)H.curRunning[e](H.curRepository,H.curInstalled);H.curRunning=null},0))})),this.curInstalled&&this.curRepoLastHost===e||(this.curInstalled=null,this.main.socket.emit("sendToHost",e,"getInstalled",null,function(e){"permissionError"===e&&(console.error('May not read "getInstalled"'),e={}),H.curInstalled=e||{},H.curRepository&&H.curInstalled&&(H.curRepoLastUpdate=(new Date).getTime(),setTimeout(function(){for(var e=0;e<H.curRunning.length;e++)H.curRunning[e](H.curRepository,H.curInstalled);H.curRunning=null},0))})),this.curRepoLastHost=e,this.curInstalled&&this.curRepository?setTimeout(function(){if(H.curRunning){for(var e=0;e<H.curRunning.length;e++)H.curRunning[e](H.curRepository,H.curInstalled);H.curRunning=null}i&&i(H.curRepository,H.curInstalled)},0):this.curRunning=[i])}},this.enableColResize=function(){$.fn.colResizable&&this.$grid.is(":visible")&&this.$grid.colResizable({liveDrag:!0})},this.sortTree=function(){H.$grid.fancytree("getRootNode").sortChildren(function(e,t){var n=e.data.installed||0,i=(t.data.installed||0)-n;if(i)return i;var a=e.titleLang||e.title||"";"object"==typeof a&&(a=a[systemLang]||a.en);var s=t.titleLang||t.title||"";return"object"==typeof s&&(s=s[systemLang]||s.en),a=a.toLowerCase(),(s=s.toLowerCase())<a?1:a<s?-1:0},!0)},this._postInit=function(e,t){void 0!==this.$grid?(H.$tab.find(".process-adapters").show(),this.$grid.find("tbody").html(""),this.getAdaptersInfo(this.main.currentHost,e,t,function(e,t){var n,i,a,o,s=0,r=[],c=[],l=new Date,d={"add instance":_("add instance"),update:_("update"),upload:_("upload"),"Available version:":_("Available version:"),"Active instances":_("Active instances"),"Installed version":_("Installed version"),readme:_("readme"),"delete adapter":_("delete adapter"),"install specific version":_("install specific version"),all:_("all"),"Last update":_("Last update"),"Installations counter":_("Installation counter"),today:_("today"),yesterday:_("yesterday"),"1 %d days ago":_("1 %d days ago"),"2 %d days ago":_("2 %d days ago"),"5 %d days ago":_("5 %d days ago")};if(t){for(o in t)t.hasOwnProperty(o)&&(n=t[o])&&!n.controller&&"hosts"!==o&&r.push(o);r.sort()}for(o in H.urls={},e)e.hasOwnProperty(o)&&(t&&t[o]&&!t[o].versionDate&&(t[o].versionDate=e[o].versionDate),e[o].nogit||(H.urls[o]=e[o].meta),(n=e[o])&&!n.controller&&(i="",t&&t[o]||c.push(o)));function u(e,t,n,i){var a=function(e){if(e){var t=e.split(".");e="0"===t[0]&&"0"===t[1]&&"0"===t[2]?"planned":"0"===t[0]&&"0"===t[1]?"alpha":"0"===t[0]?"beta":"npm error"===e?"error":"stable"}return e}(e),s=a+"\n\r"+(n||"");return e='<table style="cursor: alias; width: 100%; text-align: center; border: 0; border-spacing: 0;'+(n?"color: blue;":"")+'" cellspacing="0" cellpadding="0" class="ui-widget"><tr class="'+a+'Bg"><td title="'+d["Available version:"]+" "+s+'" class="actual-version">'+e+'</td><td style="border: 0; padding: 0; width: 30px" class="update-version">',t&&(e+='<button class="adapter-update-submit small-button m" data-adapter-name="'+o+'" '+(i?' disabled title="'+i+'"':'title="'+d.update+'"')+'><i class="material-icons">refresh</i></button>'),e+="</td></tr></table>"}c.sort(),H.tree=[],H.data={};for(var m=0;m<r.length;m++)if(o=r[m],(n=t?t[o]:null)&&!n.controller&&"hosts"!==o){var g="",h="",f=n.icon;i="",e[o]&&e[o].version&&(i=e[o].version),e[o]&&e[o].extIcon&&(f=e[o].extIcon);var p=0,b=0;if(n.version){var M="",y=!1,v="";H.main.upToDate(i,n.version)||(M=F(n.version,e[o]),y=!0,v=Z(e[o].dependencies),s++),g='<table style="min-width: 80px; text-align: center; border: 0; border-spacing: 0;" cellspacing="0" cellpadding="0" class="ui-widget"><tr>';for(var w=0;w<H.main.instances.length;w++)H.main.objects[H.main.instances[w]]&&H.main.objects[H.main.instances[w]].common.name===o&&(p++,H.main.objects[H.main.instances[w]].common.enabled&&b++);if(p?(g+='<td style="border: 0; text-align: center; padding: 0; width: 40px">',b!==p&&(g+='<span title="'+_("Installed instances")+'">'+p+"</span>",b&&(g+=" ~ ")),b&&(g+='<span title="'+d["Active instances"]+'" class="true">'+b+"</span>"),g+="</td>"):g+='<td style="border: 0; padding: 0; width: 40px"></td>',g+='<td style="border: 0; padding: 0; width: 50px" title="'+d["Installed version"]+'">'+n.version+"</td>",h='<span class="installed" title="'+d["Installed version"]+'">'+n.version+"</span>",g+="</tr></table>",!y&&H.onlyUpdatable)continue}i=u(a=i,y,M,v);var j=(n.type||H.types[o]||"common adapters")+"_group";C=(C="object"==typeof n.desc?n.desc[systemLang]||n.desc.en:n.desc)||"",C+=W(j,o,H.main.states["system.adapter."+o+".upload"]?H.main.states["system.adapter."+o+".upload"].val:0);var L=n.titleLang||n.title;if(L="object"==typeof L?L[systemLang]||L.en:L,H.data[o]={image:f?'<img onerror="this.src=\'img/info-big.png\';" src="'+f+'" class="adapter-table-icon" />':"",icon:f||"",stat:e[o]?e[o].stat:0,name:o,title:(L||"").replace("yunkong2 Visualisation - ",""),desc:C,news:M,updatableError:v,keywords:n.keywords?n.keywords.join(" "):"",version:i,installed:g,rawVersion:a,instances:p,rawInstalled:h,versionDate:n.versionDate,updatable:y,bold:n.highlight||!1,install:'<button data-adapter-name="'+o+'" class="adapter-install-submit small-button m" title="'+d["add instance"]+'" data-adapter-desc="'+C+'"><i class="material-icons">add_circle_outline</i></button><button '+(n.readme?"":'disabled="disabled" ')+'data-adapter-name="'+o+'" data-adapter-url="'+(n.readme||"")+'" class="adapter-readme-submit small-button" title="'+d.readme+'"><i class="material-icons">help_outline</i></button>'+(H.main.config.expertMode?'<button data-adapter-name="'+o+'" class="adapter-upload-submit small-button" title="'+d.upload+'"><i class="material-icons">file_upload</i></button>':"")+"<button "+(g?"":'disabled="disabled" ')+'data-adapter-name="'+o+'" class="adapter-delete-submit small-button" title="'+d["delete adapter"]+'"><i class="material-icons">delete_forever</i></button>'+(H.main.config.expertMode?'<button data-adapter-name="'+o+'" data-target="adapters-menu" class="adapter-update-custom-submit small-button" title="'+d["install specific version"]+'"><i class="material-icons">add_to_photos</i></button>':""),group:j,license:n.license||"",licenseUrl:n.licenseUrl||""},n.type||console.log('"'+o+'": "common adapters",'),n.type&&H.types[o]&&console.log('Adapter "'+o+'" has own type. Remove from admin.'),H.isList)H.tree.push({icon:f,title:H.data[o].title||o,key:o});else{for(var N=-1,T=0;T<H.tree.length;T++)if(H.tree[T].key===H.data[o].group){N=T;break}N<0&&(d[H.data[o].group]||(d[H.data[o].group]=_(H.data[o].group)),H.tree.push({title:d[H.data[o].group],desc:W(j),key:H.data[o].group,folder:!0,expanded:!H.isCollapsed[H.data[o].group],children:[],icon:H.groupImages[H.data[o].group]}),N=H.tree.length-1),H.tree[N].children.push({icon:f,title:H.data[o].title||o,key:o})}}if(!H.onlyInstalled&&!H.onlyUpdatable)for(m=0;m<c.length;m++)if((n=e[o=c[m]])&&!n.controller&&(i="",!t||!t[o])){n&&n.version&&(i=u(a=i=n.version));var C;j=(n.type||H.types[o]||"common adapters")+"_group";if(C=(C="object"==typeof n.desc?n.desc[systemLang]||n.desc.en:n.desc)||"",C+=W(j,o,H.main.states["system.adapter."+o+".upload"]?H.main.states["system.adapter."+o+".upload"].val:0),L="object"==typeof(L=n.titleLang||n.title)?L[systemLang]||L.en:L,H.data[o]={image:n.extIcon?'<img onerror="this.src=\'img/info-big.png\';" src="'+n.extIcon+'" class="adapter-table-icon" />':"",icon:n.extIcon,stat:n.stat,name:o,title:(L||"").replace("yunkong2 Visualisation - ",""),desc:C,keywords:n.keywords?n.keywords.join(" "):"",rawVersion:a,version:i,bold:n.highlight,installed:"",versionDate:n.versionDate,install:'<button data-adapter-name="'+o+'" class="adapter-install-submit small-button" title="'+d["add instance"]+'" data-adapter-desc="'+C+'"><i class="material-icons">add_circle_outline</i></button><button '+(n.readme?"":'disabled="disabled" ')+' data-adapter-name="'+o+'" data-adapter-url="'+(n.readme||"")+'" class="adapter-readme-submit small-button" title="'+d.readme+'"><i class="material-icons">help_outline</i></button><button data-adapter-name="'+o+'" class="adapter-delete-submit small-button hide" title="'+d["delete adapter"]+'"><i class="material-icons">delete_forever</i></button>'+(H.main.config.expertMode?'<button data-adapter-name="'+o+'" data-target="adapters-menu" class="adapter-update-custom-submit small-button" title="'+d["install specific version"]+'"><i class="material-icons">add_to_photos</i></button>':""),license:n.license||"",licenseUrl:n.licenseUrl||"",group:j},n.type||console.log('"'+o+'": "common adapters",'),n.type&&H.types[o]&&console.log('Adapter "'+o+'" has own type. Remove from admin.'),H.isList)H.tree.push({icon:n.extIcon,title:H.data[o].title||o,key:o});else{for(var D=-1,I=0;I<H.tree.length;I++)if(H.tree[I].key===H.data[o].group){D=I;break}D<0&&(d[H.data[o].group]||(d[H.data[o].group]=_(H.data[o].group)),H.tree.push({title:d[H.data[o].group],key:H.data[o].group,folder:!0,expanded:!H.isCollapsed[H.data[o].group],children:[],icon:H.groupImages[H.data[o].group]}),D=H.tree.length-1),H.tree[D].children.push({title:H.data[o].title||o,icon:n.extIcon,desc:W(j),key:o})}}if("popular"===H.currentOrder||"updated"===H.currentOrder){var k=Object.keys(H.data);"popular"===H.currentOrder?k.sort(function(e,t){return H.data[e].stat>H.data[t].stat?-1:H.data[e].stat<H.data[t].stat?1:0}):"updated"===H.currentOrder&&k.sort(function(e,t){return H.data[e].versionDate&&!H.data[t].versionDate?-1:!H.data[e].versionDate&&H.data[t].versionDate?1:H.data[e].versionDate>H.data[t].versionDate?-1:H.data[e].versionDate<H.data[t].versionDate?1:t<e?-1:e<t?1:0});for(var z={},x=0;x<k.length;x++)z[k[x]]=H.data[k[x]];H.data=z}if(H.isTiles&&("ie"!==H.main.browser||10<H.main.browserVersion)){var O="",A=[];for(var E in H.data)if(H.data.hasOwnProperty(E)){var S=H.data[E];-1===A.indexOf(S.group)&&A.push(S.group),O+='<div class="col s12 m6 l4 xl3 tile class-'+S.group+'" data-id="'+S.name+'">',O+=' <div class="card hoverable card-adapters">',O+=' <div class="card-header '+(S.updatable?"updatable":S.installed?"installed":"")+'"></div>',O+=' <div class="card-content">',O+=' <img onerror="this.src=\'img/info-big.png\';" class="card-profile-image" src="'+S.icon+'">',O+=' <span class="card-title grey-text text-darken-4">'+S.title+"</span>",O+=' <a title="info" class="btn-floating activator btnUp blue lighten-2 z-depth-3"><i class="material-icons">more_vert</i></a>',O+=' <ul class="ver">',O+=" <li>"+d["Available version:"]+' <span class="data '+(S.updatable?"updatable":"")+'" '+(S.news?' title="'+S.news+'"':"")+">"+S.rawVersion+"</span>"+(S.updatable?'<button class="adapter-update-submit small-button" data-adapter-name="'+E+'" '+(v?' disabled title="'+S.updatableError+'"':'title="'+d.update+'"')+'><i class="material-icons">refresh</i></button>':"")+"</li>",S.installed&&(O+=" <li>"+d["Installed version"]+': <span class="data">'+S.rawInstalled+"</span></li>"),S.instances&&(O+=" <li>"+_("Installed instances")+': <span class="data">'+S.instances+"</span></li>"),O+=" </ul>",O+=" </div>",O+=' <div class="footer right-align"></div>',O+=' <div class="card-reveal">',O+=' <i class="card-title material-icons right">close</i>',O+=" <p>"+S.desc+"</p>",O+=' <div class="card-reveal-buttons">',O+=S.install,O+=" </div>",O+=" </div>","popular"===H.currentOrder&&S.stat?O+=' <div class="stat" title="'+d["Installations counter"]+'">'+S.stat+"</div>":"updated"===H.currentOrder&&S.versionDate&&(O+=' <div class="last-update" title="'+d["Last update"]+'">'+J(S.versionDate,d.today,d.yesterday,d["1 %d days ago"],d["2 %d days ago"],d["5 %d days ago"],l)+"</div>"),O+=" </div>",O+="</div>"}for(var Y in O+='<div class="col s12 m6 l4 xl3 filtered-out">',O+=' <div class="card hoverable card-adapters">',O+=' <div class="card-header"></div>',O+=' <div class="card-content">',O+=' <span class="card-title grey-text text-darken-4">'+_("Filtered out")+"</span>",O+=" </div>",O+=' <div class="footer right-align"></div>',O+=" </div>",O+="</div>",H.$tiles.html(O),H.data)H.data.hasOwnProperty(Y)&&H.initButtons(Y);for(var Q='<li class="main-toolbar-table-types-item" data-type=""><a>'+d.all+"</a></li>\n",P=0;P<A.length;P++)Q+='<li class="main-toolbar-table-types-item" data-type="'+A[P]+'"><a>'+_(A[P])+"</a></li>\n";var U=H.$tab.find("#main-toolbar-table-types");U.html(Q),U.find(".main-toolbar-table-types-item").show().off("click").on("click",function(){H.currentType=$(this).data("type")||"",B(),H.$tab.find("#main-toolbar-table-types-btn").html(_(H.currentType||"all")),H.main.saveConfig("adaptersCurrentType",H.currentType)}),H.currentType&&!d[H.currentType]&&(d[H.currentType]=_(H.currentType)),H.$tab.find("#main-toolbar-table-types-btn").html(d[H.currentType||"all"]).dropdown({constrainWidth:!1,gutter:0}),(U=H.$tab.find("#main-toolbar-table-order")).find(".main-toolbar-table-order-item").off("click").on("click",function(){H.currentOrder=$(this).data("type")||"",H.$tab.find("#main-toolbar-table-order-btn").html(_(H.currentOrder||"a-z")),H.main.saveConfig("adaptersCurrentOrder",H.currentOrder),H._postInit()}),H.currentOrder&&!d[H.currentOrder]&&(d[H.currentOrder]=_(H.currentOrder)),H.$tab.find("#main-toolbar-table-order-btn").show().html(d[H.currentOrder||"a-z"]).dropdown({constrainWidth:!1,gutter:0}),B()}else{H.$tab.find("#main-toolbar-table-types-btn").hide(),H.$tab.find("#main-toolbar-table-order-btn").hide(),H.$grid.fancytree("getTree").reload(H.tree),H.$grid.find(".fancytree-icon").each(function(){$(this).attr("src")&&$(this).css({width:18,height:18}),$(this).on("hover",function(){var e='<div class="icon-large" style="left: '+Math.round($(this).position().left+$(this).width()+5)+'px;"><img src="'+$(this).attr("src")+'"/></div>',t=$(e);t.insertAfter($(this)),$(this).data("big",t[0]);var n=parseFloat(t.height()),i=Math.round($(this).position().top-(n-parseFloat($(this).height()))/2);n+i>(window.innerHeight||document.documentElement.clientHeight)&&(i=(window.innerHeight||document.documentElement.clientHeight)-n),t.css({top:i})},function(){var e=$(this).data("big");$(e).remove(),$(this).data("big",void 0)})}),H.currentFilter&&H.$grid.fancytree("getTree").filterNodes(G,!1),H.sortTree(),H.enableColResize();var R=["tab-adapters-table-name","tab-adapters-table-description","tab-adapters-table-keywords","tab-adapters-table-installed","tab-adapters-table-available","tab-adapters-table-license","tab-adapters-table-install"];H.$grid.find("tbody tr").each(function(){var e=0;$(this).find("td").each(function(){$(this).addClass(R[e]),e++})})}H.$tab.find(".grid-main-div").removeClass("order-a-z order-popular order-updated").addClass(H.currentOrder?"order-"+H.currentOrder:""),H.$tab.find(".process-adapters").hide(),H.updateCounter(s)})):this.enableColResize(),this.restoreScroll()},this.saveScroll=function(){this.scrollTop=this.$tab.find(".grid-main-div").scrollTop()},this.restoreScroll=function(){this.scrollTop&&this.$tab.find(".grid-main-div").scrollTop(this.scrollTop)},this.updateCounter=function(e){if(void 0===e)this.getAdaptersInfo(this.main.currentHost,!1,!1,function(e,t){var n=0;for(var i in t)if(t.hasOwnProperty(i)){var a=t?t[i]:null;if(a&&!a.controller&&"hosts"!==i){var s="";e[i]&&e[i].version&&(s=e[i].version),a.version&&!H.main.upToDate(s,a.version)&&n++}}H.updateCounter(n)});else if(e){var t=$("#updates-for-adapters");t.length?t.text(e):$('<span id="updates-for-adapters" title="'+_("updates")+'" class="new badge updates-for-adapters" data-badge-caption="">'+e+"</span>").appendTo('.admin-sidemenu-items[data-tab="tab-adapters"] a')}else $("#updates-for-adapters").remove()},this.init=function(e,t){this.inited&&!e||(this.main.objectsLoaded?(this.inited||(this.inited=!0,this.main.subscribeObjects("system.host.*"),this.main.subscribeStates("system.host.*")),this.main.tabs.hosts.getHosts(function(){H._postInit(e,t)})):setTimeout(function(){H.init(e,t)},250))},this.destroy=function(){this.inited&&(this.saveScroll(),this.inited=!1,this.main.unsubscribeObjects("system.host.*"),this.main.unsubscribeStates("system.host.*"))},this.initButtons=function(r){this.$tab.find('.adapter-install-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var s=$(this).attr("data-adapter-name"),e=$(this).attr("data-adapter-desc");!function(e,t,n){if(H.main.tabs.hosts.list.length<=1&&!H.main.config.expertMode)return n(!0,H.main.currentHost,"");var i=$("#dialog-add-instance");i.find(".dialog-add-instance-name").html(e),i.find(".dialog-add-description").html(t);for(var a="",s=0;s<H.main.tabs.hosts.list.length;s++){var o=H.main.tabs.hosts.list[s];a+="<option "+(o.name===H.main.currentHost?"selected":"")+' value="'+o.name+'">'+o.name+"</option>"}H.main.tabs.hosts.list.length<=1?i.find(".dialog-add-instance-host").addClass("disabled").prop("disabled",!0):i.find(".dialog-add-instance-host").removeClass("disabled").prop("disabled",!1),i.find(".dialog-add-instance-host").html(a).select();for(var r=-1,c=[],l=0;l<H.main.tabs.instances.list.length;l++){var d=H.main.tabs.instances.list[l].split(".");if(d[d.length-2]===e){var u=parseInt(d[d.length-1],10);c.push(u),r<u&&(r=u)}}r+=10,a='<option selected value="">'+_("auto")+"</option>";for(var m=0;m<r;m++)-1===c.indexOf(m)&&(a+='<option value="'+m+'">'+m+"</option>");i.find(".dialog-add-instance-number").html(a).select(),i.find(".dialog-add-install-btn").off("click").on("click",function(e){n&&(n(!0,i.find(".dialog-add-instance-host").val(),i.find(".dialog-add-instance-number").val()),n=null),i.find(".dialog-add-cancel-btn").off("click"),i.find(".dialog-add-instance-number").off("click")}),i.find(".dialog-add-cancel-btn").off("click").on("click",function(e){n&&(n(!1),n=null),i.find(".dialog-add-cancel-btn").off("click"),i.find(".dialog-add-instance-number").off("click")}),i.modal({dismissible:!1,complete:function(){i.find(".dialog-add-instance-name").html("")}}).modal("open")}(s,e,function(e,i,a){e&&H.getAdaptersInfo(i,!1,!1,function(e,t){var n=e[s];n||(n=t[s]),n&&(n.license&&"MIT"!==n.license?function(i,a){var s=$("#dialog-license");if(!H.data[i].installed&&H.data[i].licenseUrl){var o=setTimeout(function(){a(!(o=null))},1e4);"object"==typeof H.data[i].licenseUrl&&(H.data[i].licenseUrl=H.data[i].licenseUrl[systemLang]||H.data[i].licenseUrl.en),H.main.socket.emit("httpGet",H.data[i].licenseUrl,function(e,t,n){o&&(clearTimeout(o),o=null,!e&&n?(s.css({"z-index":200}),n=(n=n.toString().replace(/\r\n/g,"<br>")).replace(/\n/g,"<br>"),s.find(".license_text").html(n),s.find(".license_agreement_name").text(_(" for %s",i)),s.modal({dismissible:!1,complete:function(){s.find(".license_text").html("")}}).modal("open"),s.find(".license_agree").off("click").on("click",function(e){a&&(a(!0),a=null),s.find(".license_agree").off("click"),s.find(".license_non_agree").off("click")}),s.find(".license_non_agree").off("click").on("click",function(e){a&&(a(!1),a=null),s.find(".license_agree").off("click"),s.find(".license_non_agree").off("click")})):(a&&a(!0),a=null))})}else a(!0)}(s,function(e){e&&H.main.cmdExec(null,"add "+s+" "+a+" --host "+i,function(e){e||H._postInit(!0)})}):H.main.cmdExec(null,"add "+s+" "+a+" --host "+i,function(e){e||H._postInit(!0)}))})})}),this.$tab.find('.adapter-delete-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var t=$(this).attr("data-adapter-name");H.main.confirmMessage(_("Are you sure you want to delete adapter %s?",t),_("Please confirm"),"help",function(e){e&&H.main.cmdExec(null,"del "+t,function(e){e||H._postInit(!0)})})}),this.$tab.find('.adapter-readme-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){H.main.navigate({tab:"adapters",dialog:"readme",params:$(this).data("adapter-name")})}),this.$tab.find('.adapter-update-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var e=$(this).attr("data-adapter-name");"admin"===e&&(H.main.waitForRestart=!0),H.main.cmdExec(null,"upgrade "+e,function(e){e||H._postInit(!0)})}),this.$tab.find('.adapter-upload-submit[data-adapter-name="'+r+'"]').off("click").on("click",function(){var e=$(this).attr("data-adapter-name");H.main.cmdExec(null,"upload "+e,function(e){e||H._postInit(!0)})});var e=this.$tab.find('.adapter-update-custom-submit[data-adapter-name="'+r+'"]');e.off("click").on("click",function(){var e=[];if(H.main.objects["system.adapter."+r].common.news){var t=H.main.objects["system.adapter."+r].common.news;for(var n in t)t.hasOwnProperty(n)&&e.push(n)}else e.push(H.main.objects["system.adapter."+r].common.version);for(var i='<div class="collection">',a=0;a<e.length;a++){var s=t[e[a]]?t[e[a]][systemLang]||t[e[a]].en:"";i+='<a data-version="'+e[a]+'" data-position="left" data-delay="50" title="'+s+'" data-adapter-name="'+$(this).data("adapter-name")+'" class="collection-item adapters-versions-link tooltipped"><span class="adapters-versions-link-version">'+e[a]+'</span> - <div class="adapters-versions-link-history">'+s+"</div></a>"}i+="</div>";var o=$("#adapters-menu");o.length||((o=$('<div id="adapters-menu" class="modal modal-fixed-footer"><div class="modal-content"><h4>Modal Header</h4><p></p></div><div class="modal-footer"><a class="modal-action modal-close waves-effect waves-green btn-flat ">'+_("Close")+"</a></div></div>")).appendTo($(".materialize-dialogs").first()),o.modal()),o.data("trigger",this),o.find("p").html(i),o.find("h4").html(_("Versions of %s",r)),o.find(".adapters-versions-link").off("click").on("click",function(){o.modal("close");var e=$(this).data("adapter-name"),t=$(this).data("version");t&&e&&H.main.cmdExec(null,"upgrade "+e+"@"+t,function(e){e||H._postInit(!0)})}),o.modal("open")}),H.main.objects["system.adapter."+r]||e.hide()},this.objectChange=function(e,t){if(e.match(/^system\.adapter\.[a-zA-Z0-9-_]+$/)){if(t)-1===this.list.indexOf(e)&&this.list.push(e);else{var n=this.list.indexOf(e);-1!==n&&this.list.splice(n,1)}void 0!==this.$grid&&this.$grid[0]._isInited&&this.init(!0)}},this.stateChange=function(e,t){if(e&&t){var n=e.match(/^system\.adapter\.([\w\d-]+)\.upload$/);if(n){var i=this.$tab.find('.adapter-upload-progress[data-adapter-name="'+n[1]+'"]'),a=W(t.val);i.html(a).css({opacity:t.val?.7:0}),this.$tab.find('.group-upload-progress[data-adapter-group="'+i.data("adapter-group")+'"]').html(a).css({opacity:t.val?.7:0})}}}}function Config(e){var t=this;this.$dialog=$("#dialog-config"),this.$configFrame=this.$dialog.find("#config-iframe"),this.main=e,this.prepare=function(){$iframeDialog=this},this.init=function(){if(!this.inited){this.inited=!0;var e=this.main.navigateGetParams(),t=e.split(".");this.main.objects[e]&&this.main.objects[e].common&&this.main.objects[e].common.materialize?this.$configFrame.attr("src","adapter/"+t[2]+"/index_m.html?"+t[3]):this.$configFrame.attr("src","adapter/"+t[2]+"/?"+t[3]);var n=e.replace(/^system\.adapter\./,"");this.$dialog.data("name",n),this.$dialog.find(".title").html(_("Adapter configuration")+": "+n)}},this.allStored=function(){return!window.frames["config-iframe"].changed},this.close=function(){t.main.navigate()},this.destroy=function(){if(this.inited&&(this.inited=!1,this.$configFrame.attr("src",""),void 0!==showConfig&&showConfig&&showConfig.length)){var e=showConfig.shift();setTimeout(function(){t.main.navigate({tab:"instances",dialog:"config",params:e})},1e3)}}}function Customs(C){var m,g,h,f,T,D,I,k,z,x,O,A,E="__different__",S=this;function Y(e){if(e)S.historyTimeout&&clearTimeout(S.historyTimeout);else if(S.historyTimeout)return;S.historyTimeout=setTimeout(function(){S.historyTimeout=null,O&&S.loadHistoryTable(O.data("id"),!0)},e||5e3)}function Q(t,n){$.ajax({headers:{Accept:"text/html"},cache:!0,url:"/adapter/"+t+"/custom_m.html",success:function(e){n(null,e)},error:function(e){$.ajax({headers:{Accept:"text/html"},cache:!0,url:"/adapter/"+t+"/custom.html",success:function(e){n(null,e)},error:function(e){n(e.responseText)}})}})}function P(e){e.stopPropagation(),e.preventDefault();var t=S.$dialog.find("#customs-tabs"),c=t.data("ids");S.currentCustoms=null;var l=_(E);if(t.find("input, select").each(function(){var e=$(this).data("instance"),t=$(this).data("field");if(t){var n;if("checkbox"===$(this).attr("type")){if(this.indeterminate)return;n=$(this).prop("checked")}else n=$(this).val();if(n!==l){null===n&&(n=""),void 0===n&&(n=""),"false"===n&&(n=!1),"true"===n&&(n=!0);var i=parseFloat(n);n.toString().replace(/^\+/,"").replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,"$1")===i.toString()&&(n=i);for(var a=0;a<c.length;a++){var s=S.main.objects[c[a]].common.custom;if(void 0===(s=S.main.objects[c[a]].common.custom=s||{})[e]){var o,r=e.split(".")[0];o=defaults[r]?"function"==typeof defaults[r]?defaults[r](S.main.objects[c[a]],S.main.objects["system.adapter."+e]):defaults[r]:S.defaults[r],s[e]=o||{}}s[e][t]=n}}}}),c){S.$dialog.find(".dialog-system-buttons .btn-save").addClass("disabled");for(var n=0;n<c.length;n++){var i=!1,a=S.main.objects[c[n]].common.custom;for(var s in a)a.hasOwnProperty(s)&&(a[s].enabled?i=!0:delete a[s]);i||(S.main.objects[c[n]].common.custom=null)}S.setCustoms(c,function(){S.loadHistoryChart(),S.main.navigate()})}}function U(e){switch(e){case"tab-customs-settings":S.loadHistoryChart();break;case"tab-customs-table":O.select(),S.loadHistoryChart();break;case"tab-customs-chart":S.$dialog.find("#tab-customs-chart .select-instance").select();var t=S.$dialog.find("#tabs-customs");S.loadHistoryChart(t.data("id"))}}return this.main=C,this.$dialog=$("#dialog-customs"),this.customEnabled=null,this.currentCustoms=null,this.check=function(){for(var e=0;e<this.main.instances.length;e++)if(this.main.objects[this.main.instances[e]].common&&("storage"===this.main.objects[this.main.instances[e]].common.type||this.main.objects[this.main.instances[e]].common.supportCustoms)&&this.main.objects[this.main.instances[e]].common.enabled)return null!==this.customEnabled&&!0!==this.customEnabled?(this.customEnabled=!0,this.inited&&this.init(null,!0)):this.customEnabled=!0,void!0;null!==this.customEnabled&&!1!==this.customEnabled?(this.customEnabled=!1,this.inited&&this.init(null,!0)):this.customEnabled=!1},this.stateChange=function(e){this.currentCustoms===e&&Y()},this.initCustomsTabs=function(e,t){var s=this.$dialog.find("#customs-tabs");e=e||[],s.html("");var o=_(E);this.defaults={};var n=this.main.config["object-customs-collapsed"];n=n?n.split(","):[];for(var r={},i=null,a=null,c=0;c<t.length;c++){var l=t[c].replace(/^system\.adapter\./,"");r[l]={};for(var d=0;d<e.length;d++){var u=C.objects[e[d]].common.custom,m=u?u[l]:null;if(C.objects[e[d]].common&&(null===i?i=C.objects[e[d]].common.type:""!==i&&i!==C.objects[e[d]].common.type&&(i=""),null===a?a=C.objects[e[d]].common.role:""!==a&&a!==C.objects[e[d]].common.role&&(a="")),m)for(var g in m)m.hasOwnProperty(g)&&(void 0===r[l][g]?r[l][g]=m[g]:r[l][g]!==m[g]&&(r[l][g]=E));else{var h=l.split(".")[0],f=null;for(var p in f=defaults[h]?"function"==typeof defaults[h]?defaults[h](S.main.objects[e[d]],S.main.objects["system.adapter."+l]):defaults[h]:this.defaults[h])f.hasOwnProperty(p)&&(void 0===r[l][p]?r[l][p]=f[p]:r[l][p]!==f[p]&&(r[l][p]=E))}}}for(var b=0;b<t.length;b++){var y=t[b].split("."),v=y[2],w=y[3],j=v+"."+w,L=this.main.objects["system.adapter."+v].common.icon;L="/adapter/"+v+"/"+L;var N='<li data-adapter="'+j+'" class="'+(-1===n.indexOf(j)?"active":"")+'"> <div class="collapsible-header"> <img src="'+L+'" />'+_("Settings for %s",j)+' <span class="activated" data-adapter="'+j+'" style="opacity: '+(!r[j]||!0!==r[j].enabled&&r[j].enabled!==E?"0":"1")+'">'+_("active")+'</span> </div> <div class="customs-settings collapsible-body">'+$('script[data-template-name="'+v+'"]').html()+" </div></li>",T=$(N);this.defaults[v]={},T.find("input, select").each(function(){var e=$(this);e.attr("data-instance",v+"."+w);var t=e.attr("data-field"),n=e.attr("data-default");"true"===n&&(n=!0),"false"===n&&(n=!1),void 0!==n&&n.toString().replace(/\+/,"")===parseFloat(n).toString()&&(n=parseFloat(n)),S.defaults[v][t]=n,"enabled"===t&&e.on("click",function(e){e.stopPropagation(),$(this).prop("checked")})}),s.append(T),customPostInits.hasOwnProperty(v)&&"function"==typeof customPostInits[v]&&customPostInits[v](T,r[v+"."+w],S.main.objects["system.adapter."+v+"."+w],i,a)}s.find("input, select").each(function(){var e,n=$(this),t=n.data("instance"),i=t.split(".")[0],a=n.data("field");void 0!==r[t][a]?"checkbox"===n.attr("type")?r[t][a]===E?n[0].indeterminate=!0:n.prop("checked",r[t][a]):r[t][a]===E?("number"===n.attr("type")&&n.attr("type","text"),"SELECT"===n.prop("tagName").toUpperCase()?(n.prepend('<option value="'+o+'">'+o+"</option>"),n.val(o)):n.val("").attr("placeholder",o)):n.val(r[t][a]):(S.defaults[i]&&void 0!==S.defaults[i][a]&&(e=S.defaults[i][a]),void 0!==e&&("checkbox"===n.attr("type")?n.prop("checked",e):n.val(e)));"checkbox"===n.attr("type")?n.on("change",function(){if(S.$dialog.find(".dialog-system-buttons .btn-save").removeClass("disabled"),"enabled"===$(this).data("field")){var e=n.data("instance"),t=s.find('.activated[data-adapter="'+e+'"]');$(this).prop("checked")?t.css("opacity",1):t.css("opacity",0)}}):n.on("change",function(){S.$dialog.find(".dialog-system-buttons .btn-save").removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")})}),this.showCustomsData(1<e.length?null:e[0]),this.$dialog.find(".dialog-system-buttons .btn-save").addClass("disabled"),translateAll("#dialog-customs"),S.$dialog.find(".collapsible").collapsible({onOpenEnd:function(e){var t=S.main.config["object-customs-collapsed"];t=t?t.split(","):[];var n=$(e).data("adapter"),i=t.indexOf(n);-1!==i&&t.splice(i,1),S.main.saveConfig("object-customs-collapsed",t.join(","))},onCloseEnd:function(e){var t=S.main.config["object-customs-collapsed"];t=t?t.split(","):[];var n=$(e).data("adapter");-1===t.indexOf(n)&&t.push(n),S.main.saveConfig("object-customs-collapsed",t.join(","))}}),S.$dialog.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||(e[0].indeterminate?(e[0].indeterminate=!1,e.prop("checked",!0).trigger("change")):e.prop("checked",!e.prop("checked")).trigger("change"))}),s.find("select").select(),M.updateTextFields("#dialog-customs"),this.resizeHistory()},this.loadHistoryTable=function(e,t,l){g=g||S.$dialog.find("#grid-history"),m=m||S.$dialog.find("#grid-history-body"),t||m.html('<tr><td colspan="5" style="text-align: center">'+_("Loading...")+"</td></tr>");var n={aggregate:"none",instance:O.val(),from:!0,ack:!0,q:!0};T||(T=this.$dialog.find("#tab-customs-table .datepicker.date-from"),D=this.$dialog.find("#tab-customs-table .datepicker.date-to"),I=this.$dialog.find("#tab-customs-table .timepicker.time-from"),k=this.$dialog.find("#tab-customs-table .timepicker.time-to"));var d,i=T.val()?M.Datepicker.getInstance(T).toString("yyyy.mm.dd"):"",a=I.val(),s=D.val()?M.Datepicker.getInstance(D).toString("yyyy.mm.dd"):"",o=k.val(),r=!0;if(s?(r=!1,(s=new Date(s)).setHours(23),s.setMinutes(59),s.setSeconds(59),s.setMilliseconds(999)):s=new Date,o){var c=o.split(":");s.setHours(c[0]),s.setMinutes(c[1]),s.setSeconds(59),s.setMilliseconds(999),r=!1}if(s=s.getTime(),r&&(s+=1e4),n.end=s,i||a){if(i=new Date(i||s),a){var u=a.split(":");i.setHours(u[0]),i.setMinutes(u[1])}else i.setHours(0),i.setMinutes(0);i.setSeconds(0),i.setMilliseconds(0),n.start=i.getTime()}else n.count=50;l&&(d=new Date(s).toISOString()+"_"+(n.start?new Date(n.start):n.count+"points")+"_"+e+"__"+n.instance+".csv"),C.socket.emit("getHistory",e,n,function(r,c){setTimeout(function(){var e,t,n,i="value;acknowledged;from;timestamp;lastchanged;\n";if(r)console.error(r),m.html('<tr><td colspan="5" style="text-align: center" class="error">'+r+"</td></tr>");else{var a="";if(c&&c.length){for(var s=c.length-1;0<=s;s--){var o=(c[s].from||"").replace("system.adapter.","").replace("system.","");a+='<tr class="'+(c[s].ts>f?"highlight":"")+'"> <td>'+c[s].val+"</td> <td>"+c[s].ack+"</td> <td>"+o+"</td> <td>"+C.formatDate(c[s].ts)+"</td> <td>"+C.formatDate(c[s].lc)+"</td></tr>\n",l&&(i+=c[s].val+";"+c[s].ack+";"+(o||"")+";"+(c[s].ts?new Date(c[s].ts).toISOString():"")+";"+(c[s].lc?new Date(c[s].lc).toISOString():"")+";\n")}f=c[c.length-1].ts}else a='<tr><td colspan="5" style="text-align: center">'+_("No data")+"</td></tr>";m.html(a)}!function e(){$.fn.colResizable&&(g.is(":visible")?(g.data("inited")||((h=new IobListHeader("grid-history-header",{list:g,colWidthOffset:1,prefix:"log-filter"})).add("text","val"),h.add("text","ack"),h.add("text","from"),h.add("text","ts"),h.add("text","lc")),g.colResizable({liveDrag:!0,partialRefresh:!0,marginLeft:5,postbackSafe:!0,onResize:function(e){return h.syncHeader()}}),h.syncHeader()):setTimeout(function(){e()},200))}(),l&&(e=d,t=i,(n=document.createElement("a")).setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(t)),n.setAttribute("download",e),n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n))},0)})},this.loadHistoryChart=function(e){if(z||(z=this.$dialog.find("#tab-customs-chart .datepicker.date-from"),x=this.$dialog.find("#tab-customs-chart .datepicker.date-to")),e){for(var t=0,n=!1,i=!1,a=0;a<this.main.instances.length&&("flot"===this.main.objects[C.instances[a]].common.name&&this.main.objects[this.main.instances[a]].common.enabled?n="flot":!n&&"rickshaw"===this.main.objects[C.instances[a]].common.name&&this.main.objects[this.main.instances[a]].common.enabled?n="rickshaw":"web"===this.main.objects[this.main.instances[a]].common.name&&this.main.objects[this.main.instances[a]].common.enabled&&(t=this.main.objects[this.main.instances[a]].native.port,i=this.main.objects[this.main.instances[a]].native.secure),"flot"!==n||!t);a++);var s=this.$dialog.find("#iframe-history-chart"),o="http{isSecure}://{hostname}:{port}/{chart}/index.html?range=1440&zoom=true&axeX=lines&axeY=inside&hoverDetail=true&aggregate=onchange&chartType=step&live=30&instance={instance}&l%5B0%5D%5Bid%5D={id}&l%5B0%5D%5Boffset%5D=0&l%5B0%5D%5Baggregate%5D=minmax&l%5B0%5D%5Bcolor%5D=%231868a8&l%5B0%5D%5Bthickness%5D=1&l%5B0%5D%5Bshadowsize%5D=1&l%5B0%5D%5Bsmoothing%5D=0&l%5B0%5D%5BafterComma%5D=0&l%5B0%5D%5BignoreNull%5D=false&aggregateType=step&aggregateSpan=300&relativeEnd=now&timeType=relative&noBorder=noborder&bg=rgba(0%2C0%2C0%2C0)&timeFormat=%25H%3A%25M&useComma={comma}&noedit=false&animation=0";o=(o=(o=(o=(o=(o=(o=o.replace("{isSecure}",i?"s":"")).replace("{hostname}",location.hostname)).replace("{port}",t)).replace("{chart}",n)).replace("{instance}",S.$dialog.find("#tab-customs-chart .select-instance").val())).replace("{id}",encodeURI(e))).replace("{comma}",S.main.systemConfig&&S.main.systemConfig.common&&S.main.systemConfig.isFloatComma),s.attr("src",o)}else this.$dialog.find("#iframe-history-chart").attr("src","")},this.showCustomsData=function(e){var t=this.$dialog.find("#tabs-customs"),n=0,i=!1;if(U("tab-customs-settings"),e){t.data("id",e);for(var a=0;a<C.instances.length&&("flot"===C.objects[C.instances[a]].common.name&&C.objects[C.instances[a]].common.enabled?i="flot":!i&&"rickshaw"===C.objects[C.instances[a]].common.name&&C.objects[C.instances[a]].common.enabled?i="rickshaw":"web"===C.objects[C.instances[a]].common.name&&C.objects[C.instances[a]].common.enabled&&(n=C.objects[C.instances[a]].native.port),"flot"!==i||!n);a++);S.loadHistoryTable(e),t.find(".tabs .tab-table").removeClass("disabled"),n&&i&&S.currentCustoms?t.find(".tabs .tab-chart").removeClass("disabled"):t.find(".tabs .tab-chart").addClass("disabled")}else t.find(".tabs .tab-table").addClass("disabled"),t.find(".tabs .tab-chart").addClass("disabled")},this.setCustoms=function(t,n){var e=t.pop();e?(this.$dialog.find("#tab-customs-settings .title").html(_("Adapter settings for %s states",t.length)),S.main.socket.emit("setObject",e,this.main.objects[e],function(e){e?S.main.showMessage(_(e),_("Error"),"error_outline"):setTimeout(function(){S.setCustoms(t,n)},50)})):n&&n()},this.resizeHistory=function(){var e=this.$dialog.find("#iframe-history-chart");if(e.attr("src")){var t=e.data("timeout");t&&clearTimeout(t),e.data("timeout",setTimeout(function(){S.$dialog.find("#iframe-history-chart").data("timeout",null),S.loadHistoryChart(S.$dialog.find("#tabs-customs").data("id"))},1e3))}},this.allStored=function(){return S.$dialog.find(".dialog-system-buttons .btn-save").hasClass("disabled")},this.init=function(e,t){if(!this.inited||t){var n=this.main.navigateGetParams();n&&(n=n.split(",")),n&&n.length||(n=this.ids,this.ids=void 0);var i=[];this.defaults={};for(var a=0,s="",o=[],r=0;r<this.main.instances.length;r++){var c=this.main.objects[this.main.instances[r]];if(c&&c.common&&("storage"===c.common.type||c.common.supportCustoms)){i.push(this.main.instances[r]);var l=this.main.instances[r].split(".");-1===o.indexOf(l[2])&&(o.push(l[2]),a++,Q(l[2],function(e,t){e&&console.error(e),t&&(s+=t),--a||(S.$dialog.find("#customs-templates").html(s),S.initCustomsTabs(n,i))}))}}var d,u=[];if(n)for(var m=n.length-1;0<=m;m--)if(this.main.objects[n[m]]){var g=this.main.objects[n[m]].common.custom;if(g){var h=!1;for(var f in g)g.hasOwnProperty(f)&&(!1===g[f].enabled?delete g[f]:(1===n.length&&u.push(f),h=!0));h||delete this.main.objects[n[m]].common.custom}}else console.warn("Null object: "+n[m]),n.splice(m,1);O=this.$dialog.find("#tab-customs-table .select-instance"),A=this.$dialog.find("#tab-customs-chart .select-instance");var p=this.$dialog.find("#tab-customs-table .refresh"),b=this.$dialog.find("#tab-customs-table .download"),M=this.$dialog.find("#tab-customs-chart .refresh");if(n&&1===n.length){d=_("Storage of %s",n[0]),this.currentCustoms=u.length?n[0]:null;for(var y="",v=0;v<u.length;v++){var w=this.main.objects["system.adapter."+u[v]];w&&w.common&&(w.common.enabled||this.main.states["system.adapter."+u[v]+".alive"]&&this.main.states["system.adapter."+u[v]+".alive"].val)&&(y+='<option value="'+u[v]+'" '+(v?"":"selected")+" >"+u[v]+"</option>\n")}if(y){O.data("id",n[0]).html(y).show().off("change").on("change",function(){S.main.saveConfig("object-history-table",O.val()),S.loadHistoryTable($(this).data("id"))}).select(),A.data("id",n[0]).html(y).show().off("change").on("change",function(){S.main.saveConfig("object-history-chart",A.val()),S.loadHistoryChart($(this).data("id"))}).select(),void 0!==this.main.config["object-history-table"]&&O.val(this.main.config["object-history-table"]),void 0!==this.main.config["object-history-chart"]&&A.val(this.main.config["object-history-chart"]),p.data("id",n[0]).show().off("click").on("click",function(){S.$dialog.find("#grid-history-body").html(""),S.loadHistoryTable($(this).data("id"))}),M.data("id",n[0]).show().off("click").on("click",function(){S.loadHistoryChart($(this).data("id"))}),b.data("id",n[0]).show().off("click").on("click",function(){S.loadHistoryTable($(this).data("id"),!1,!0)});var j=new Date;j.setDate(j.getDate()-1);for(var L={today:_("Today"),clear:_("Clear"),done:_("Ok"),months:[_("January"),_("February"),_("March"),_("April"),_("May"),_("June"),_("July"),_("August"),_("September"),_("October"),_("November"),_("December")],monthsShort:[_("Jan"),_("Feb"),_("Mar"),_("Apr"),_("May"),_("Jun"),_("Jul"),_("Aug"),_("Sep"),_("Oct"),_("Nov"),_("Dec")],weekdaysShort:[_("Sun"),_("Mon"),_("Tue"),_("Wed"),_("Thu"),_("Fri"),_("Sat")],weekdays:[_("Sunday"),_("Monday"),_("Tuesday"),_("Wednesday"),_("Thursday"),_("Friday"),_("Saturday")],weekdaysAbbrev:["S","M","T","W","T","F","S"]},N=0;N<L.weekdaysAbbrev.length;N++)L.weekdaysAbbrev[N]=L.weekdaysShort[N][0];T||(T=this.$dialog.find("#tab-customs-table .datepicker.date-from"),D=this.$dialog.find("#tab-customs-table .datepicker.date-to"),I=this.$dialog.find("#tab-customs-table .timepicker.time-from"),k=this.$dialog.find("#tab-customs-table .timepicker.time-to"),z=this.$dialog.find("#tab-customs-chart .datepicker.date-from"),x=this.$dialog.find("#tab-customs-chart .datepicker.date-to")),T.datepicker({defaultDate:j,showDaysInNextAndPreviousMonths:!0,minYear:2014,maxYear:2032,i18n:L,setDefaultDate:!0,firstDay:1,onSelect:function(e){T.datepicker("setInputValue"),T.datepicker("close")}}),T.on("change",function(){Y(1e3)}),I.timepicker({defaultTime:"00:00",twelveHour:!1,doneText:_("Ok"),clearText:_("Clear"),cancelText:_("Cancel"),autoClose:!0}),I.on("change",function(){Y(1e3)}),k.timepicker({defaultTime:"now",twelveHour:!1,doneText:_("Ok"),clearText:_("Clear"),cancelText:_("Cancel"),autoClose:!0}),k.on("change",function(){Y(1e3)}),D.datepicker({defaultDate:new Date,showDaysInNextAndPreviousMonths:!0,minYear:2014,maxYear:2032,i18n:L,setDefaultDate:!0,firstDay:1,onSelect:function(e){D.datepicker("setInputValue"),D.datepicker("close")}}),D.on("change",function(){Y(1e3)}),z.datepicker({defaultDate:j,showDaysInNextAndPreviousMonths:!0,minYear:2014,maxYear:2032,i18n:L,setDefaultDate:!0,firstDay:1,onSelect:function(e){z.datepicker("setInputValue"),z.datepicker("close")}}),z.on("change",function(){S.loadHistoryChart(A.data("id"))}),x.datepicker({defaultDate:new Date,showDaysInNextAndPreviousMonths:!0,minYear:2014,maxYear:2032,i18n:L,setDefaultDate:!0,firstDay:1,onSelect:function(e){x.datepicker("setInputValue"),x.datepicker("close")}}),x.on("change",function(){S.loadHistoryChart(A.data("id"))})}else O.hide(),A.hide(),p.hide(),M.hide(),b.hide();this.currentCustoms&&S.main.subscribeStates(this.currentCustoms),this.$dialog.find("#tab-customs-table .title").html(_("Values of %s",n[0])),this.$dialog.find("#tab-customs-chart .title").html(_("Chart for %s",n[0]))}else n&&(O.hide(),A.hide(),p.hide(),M.hide(),b.hide(),d=_("Storage of %s states",n.length),this.currentCustoms=null);this.$dialog.find("#tab-customs-settings .title").html(d),this.$dialog.find("#tabs-customs").find(".tabs").mtabs({onShow:function(e){e&&U($(e).attr("id"))}}),this.$dialog.find("#customs-tabs").data("ids",n),S.$dialog.find(".dialog-system-buttons .btn-save").off("click").on("click",P),S.$dialog.find(".dialog-system-buttons .btn-cancel").off("click").on("click",function(e){e.stopPropagation(),e.preventDefault(),S.$dialog.find(".dialog-system-buttons .btn-save").hasClass("disabled")?(S.loadHistoryChart(),S.main.navigate()):S.main.confirmMessage(_("Are you sure? Changes are not saved."),_("Please confirm"),"error_outline",function(e){e&&(S.$dialog.find(".dialog-system-buttons .btn-save").addClass("disabled"),S.loadHistoryChart(),S.main.navigate())})})}},this.destroy=function(){this.inited&&(this.$dialog.find(".collapsible").collapsible("destroy"),this.inited=!1,this.loadHistoryChart(),this.currentCustoms&&S.main.unsubscribeStates(this.currentCustoms))},this}function EditObject(e){var c=this;function a(e,t,n,i){var a="";for(var s in t)if(t.hasOwnProperty(s)&&("common"!==n||"name"!==s&&"icon"!==s)){a+='<div class="row">\n<div class="col s11">\n',"state"===i&&"common"===n&&"type"===s?a+='<select class="object-tab-edit-string" data-attr="'+s+'"><option value="boolean" '+("boolean"===t[s]?"selected":"")+">"+_("boolean")+'</option><option value="string" '+("string"===t[s]?"selected":"")+">"+_("string")+'</option><option value="number" '+("number"===t[s]?"selected":"")+">"+_("number")+'</option><option value="array" '+("array"===t[s]?"selected":"")+">"+_("array")+'</option><option value="object" '+("object"===t[s]?"selected":"")+">"+_("object")+'</option><option value="mixed" '+("mixed"===t[s]?"selected":"")+">"+_("mixed")+"</option></select>":"string"==typeof t[s]?a+='<input type="text" class="object-tab-edit-string" data-attr="'+s+'" value="'+t[s]+'" />\n':"number"==typeof t[s]?a+='<input type="text" class="object-tab-edit-number" data-attr="'+s+'" value="'+t[s]+'" />\n':"boolean"==typeof t[s]?a+='<input type="checkbox" class="object-tab-edit-boolean filled-in" data-attr="'+s+'" '+(t[s]?"checked":"")+" />\n":a+='<textarea class="object-tab-edit-object" style="width: 100%" rows="3" data-attr="'+s+'">'+JSON.stringify(t[s],null,2)+"</textarea>\n";var o=s;"common"===n&&systemDictionary["common_"+s]&&systemDictionary["common_"+s][systemLang]&&(o=_("common_"+s)),"boolean"==typeof t[s]?a+="<span>"+o+"</span>\n":a+="<label>"+o+"</label>\n",a+='</div>\n<div class="col s1"><a class="btn-floating waves-effect waves-light red object-tab-field-delete" data-attr="'+s+'" data-part="'+n+'"><i class="material-icons">delete</i></a></div>\n',a+="</div>\n"}c.$dialog.find(e).html(a)}function n(e,t){var n=c.$dialog.find(e);n.find(".object-tab-edit-string").each(function(){t[$(this).data("attr")]=$(this).val()}),n.find(".object-tab-edit-number").each(function(){t[$(this).data("attr")]=parseFloat($(this).val())}),n.find(".object-tab-edit-boolean").each(function(){t[$(this).data("attr")]=$(this).prop("checked")});var i=null;if(n.find(".object-tab-edit-object").each(function(){try{t[$(this).data("attr")]=JSON.parse($(this).val())}catch(e){return i=$(this).data("attr"),!1}}),void 0!==t.write&&("false"!==t.write&&"0"!==t.write&&0!==t.write||(t.write=!1),"true"!==t.write&&"1"!==t.write&&1!==t.write||(t.write=!0)),void 0!==t.read&&("false"!==t.read&&"0"!==t.read&&0!==t.read||(t.read=!1),"true"!==t.read&&"1"!==t.read&&1!==t.read||(t.read=!0)),null===t.min&&delete t.min,void 0!==t.min){var a=parseFloat(t.min);a.toString()===t.min.toString()&&(t.min=a),"false"===t.min&&(t.min=!1),"true"===t.min&&(t.min=!0)}if(null===t.max&&delete t.max,void 0!==t.max){var s=parseFloat(t.max);s.toString()===t.max.toString()&&(t.max=s),"false"===t.max&&(t.max=!1),"true"===t.max&&(t.max=!0)}if(null===t.def&&delete t.def,void 0!==t.def){var o=parseFloat(t.def);o.toString()===t.def.toString()&&(t.def=o),"false"===t.def&&(t.def=!1),"true"===t.def&&(t.def=!0)}if(-1!==e.indexOf("common"))for(var r in t)t.hasOwnProperty(r)&&("true"===t[r]&&(t[r]=!0),"false"===t[r]&&(t[r]=!1),parseFloat(t[r]).toString()===t[r]&&(t[r]=parseFloat(t[r])));return i}function s(e,t,n){"boolean"==typeof t&&(n=t,t=3e3),c.main.showToast(c.$dialog,e,null,t,n)}this.$dialog=$("#dialog-editobject"),this.$dialogNewField=$("#dialog-new-field"),this.main=e,this.prepared=!1,this.inited=!1,this.$dialogSave=this.$dialog.find(".dialog-editobject-buttons .btn-save"),this.iconVal=null,this._prepare=function(){this.prepared||(this.prepared=!0,this.$dialogSave.on("click",function(){c.save()}),this.$dialog.find(".dialog-editobject-buttons .btn-cancel").on("click",function(){c.editor.setValue(""),c.$dialogSave.addClass("disabled"),c.main.navigate()}),this.$dialog.find(".btn-add-common").on("click",function(){c.$dialogNewField.find(".object-tab-new-icon").show(),c.$dialogNewField.modal("open");var e=c.$dialogNewField.find(".object-tab-new-name");e.data("type","common").focus(),e.hasClass("autocomplete")||(e.addClass("autocomplete"),e.mautocomplete({data:{type:null,desc:null,min:null,max:null,def:null,role:null,unit:null,read:null,write:null,states:null},minLength:0})),e.focus()}),this.$dialog.find(".btn-add-native").on("click",function(){c.$dialogNewField.find(".object-tab-new-icon").hide(),c.$dialogNewField.modal("open");var e=c.$dialogNewField.find(".object-tab-new-name");e.hasClass("autocomplete")&&(e.mautocomplete("destroy"),e.removeClass("autocomplete")),M.updateTextFields("#dialog-new-field"),e.data("type","native").focus()}),this.$dialogNewField.find(".object-tab-new-name").keypress(function(e){13===e.which&&c.$dialogNewField.find(".btn-add").trigger("click")}),this.editor||(this.editor=ace.edit("view-object-raw"),this.editor.getSession().setMode("ace/mode/json"),this.editor.$blockScrolling=!0,this.editor.getSession().on("change",function(){c.$dialogSave.removeClass("disabled")})),this.$dialogNewField.modal(),this.$dialog.find(".tabs").mtabs({onShow:function(e){if(e){var t=$(e).attr("id");if("object-tab-common"===t)s(_("Drop the icons here"));else if("object-tab-raw"===t){var n=c.saveFromTabs();if(!n)return!1;c.editor.setValue(JSON.stringify(n,null,2))}else if("object-tab-raw"===t){var i;try{i=JSON.parse(c.editor.getValue())}catch(e){return c.main.showMessage(e,_("Parse error"),"error_outline"),c.main.noSelect||c.$dialog.find(".tabs").mtabs("select","object-tab-raw"),!1}c.load(i)}return c.main.saveConfig("object-edit-active",t),!0}}}),this.$dialogNewField.find(".btn-add").on("click",function(e){e.preventDefault(),e.stopPropagation();var t=c.$dialogNewField.find(".object-tab-new-name"),n=t.data("type")||"common",i=t.val().trim(),a=c.saveFromTabs();i&&-1===i.indexOf(" ")?void 0===a[n][i]?(a[n][i]="",c.load(a),c.$dialogNewField.find(".object-tab-new-name").val(""),c.$dialogNewField.modal("close"),c.$dialogSave.removeClass("disabled")):c.main.showError(_("Field %s yet exists!",i)):c.main.showError(_("Invalid field name: %s",i))}),this.$dialogNewField.find(".btn-cancel").on("click",function(e){c.$dialogNewField.find(".object-tab-new-name").val("")}),this.$dialog.find(".edit-object-name").on("change",function(){c.$dialogSave.removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")}),this.$dialog.find(".edit-object-type").on("change",function(){c.$dialogSave.removeClass("disabled")}),this.$dialog.find(".object-tab-rights input").on("change",function(){c.$dialogSave.removeClass("disabled")}),installFileUpload(this.$dialog.find("#object-tab-common"),5e4,function(e,t){if(e)s(e,!0);else{if(!t.match(/^data:image\//))return void s(_("Unsupported image format"),!0);c.$dialogSave.removeClass("disabled"),c.iconVal=t;var n=c.$dialog.find(".icon-editor");n.find(".icon").show().html('<img class="treetable-icon" />'),n.find(".icon .treetable-icon").attr("src",t)}}),this.$dialog.find(".icon-editor .icon-upload").off("click").on("click",function(){c.$dialog.find(".drop-file").trigger("click")}),this.$dialog.find(".icon-editor .icon-clear").off("click").on("click",function(){c.iconVal&&(c.iconVal=null,c.$dialog.find(".icon-editor").hide().appendTo(c.$dialog),c.$dialogSave.removeClass("disabled"))}))},this.init=function(){if(this._prepare(),!this.inited){this.inited=!0;var e=c.main.navigateGetParams(),t=!!(e||"").match(/,def$/);e=e.replace(/,def$/,"");var n=this.main.objects[e];if(n){void 0===this.main.config["object-edit-active"]||c.main.noSelect||this.$dialog.find(".tabs").mtabs("select",this.main.config["object-edit-active"]);for(var i,a="",s=0;s<this.main.tabs.users.list.length;s++)i=translateName(this.main.objects[this.main.tabs.users.list[s]].common.name),a+='<option value="'+this.main.tabs.users.list[s]+'">'+(i||this.main.tabs.users.list[s])+"</option>";for(this.$dialog.find(".object-tab-acl-owner").html(a),a="",s=0;s<this.main.tabs.users.groups.length;s++)i=translateName(this.main.objects[this.main.tabs.users.groups[s]].common.name),a+='<option value="'+this.main.tabs.users.groups[s]+'">'+(i||this.main.tabs.users.groups[s])+"</option>";this.$dialog.find(".object-tab-acl-group").html(a),this.load(n),t?this.$dialog.data("cb",function(n){"state"===n.type&&c.main.socket.emit("getState",n._id,function(e,t){t&&null!==t.val&&void 0!==t.val||c.main.socket.emit("setState",n._id,void 0===n.common.def?null:n.common.def,!0)})}):this.$dialog.data("cb",null),c.$dialogSave.addClass("disabled")}}},this.destroy=function(){this.inited&&(this.inited=!1)},this.load=function(e){if(e){e.common=e.common||{},e.native=e.native||{},e.acl=e.acl||{},this.$dialog.find(".title-id").text(e._id),this.$dialog.find(".edit-object-name").val(e.common?translateName(e.common.name):e._id),this.$dialog.find(".edit-object-type").val(e.type),this.$dialog.find(".object-tab-acl-owner").val(e.acl.owner||"system.user.admin"),this.$dialog.find(".object-tab-acl-group").val(e.acl.ownerGroup||"system.group.administrator"),this.$dialog.find(".icon-editor").hide().appendTo(this.$dialog),a(".object-tab-common-table",e.common||{},"common",e.type),a(".object-tab-native-table",e.native||{},"native",e.type),void 0!==e.common.icon?(this.iconVal=e.common.icon,this.$dialog.find(".object-tab-common-table").prepend(this.$dialog.find(".icon-editor").show()),this.$dialog.find(".icon-editor .icon").html(c.main.getIconFromObj(e))):this.iconVal=null,this.$dialog.find(".object-tab-field-delete").on("click",function(){var n=$(this).data("part"),i=$(this).data("attr");c.main.confirmMessage(_("Delete attribute"),_("Please confirm"),"error_outline",function(e){if(e){var t=c.saveFromTabs();delete t[n][i],c.load(t)}})}),e.acl=e.acl||{},void 0===e.acl.object&&(e.acl.object=1638),this.$dialog.find("#object-tab-acl-obj-owner-read").prop("checked",1024&e.acl.object),this.$dialog.find("#object-tab-acl-obj-owner-write").prop("checked",512&e.acl.object),this.$dialog.find("#object-tab-acl-obj-group-read").prop("checked",64&e.acl.object),this.$dialog.find("#object-tab-acl-obj-group-write").prop("checked",32&e.acl.object),this.$dialog.find("#object-tab-acl-obj-every-read").prop("checked",4&e.acl.object),this.$dialog.find("#object-tab-acl-obj-every-write").prop("checked",2&e.acl.object),"state"!==e.type?this.$dialog.find(".object-tab-acl-state").hide():(this.$dialog.find(".object-tab-acl-state").show(),void 0===e.acl.state&&(e.acl.state=1638),this.$dialog.find("#object-tab-acl-state-owner-read").prop("checked",1024&e.acl.state),this.$dialog.find("#object-tab-acl-state-owner-write").prop("checked",512&e.acl.state),this.$dialog.find("#object-tab-acl-state-group-read").prop("checked",64&e.acl.state),this.$dialog.find("#object-tab-acl-state-group-write").prop("checked",32&e.acl.state),this.$dialog.find("#object-tab-acl-state-every-read").prop("checked",4&e.acl.state),this.$dialog.find("#object-tab-acl-state-every-write").prop("checked",2&e.acl.state));var t=JSON.parse(JSON.stringify(e));if(this.editor.setValue(JSON.stringify(t,null,2)),t._id&&delete t._id,t.common&&delete t.common,t.type&&delete t.type,t.native&&delete t.native,t.acl&&delete t.acl,this.$dialog.find("#view-object-rest").val(JSON.stringify(t,null," ")),this.$dialog.find("select").select(),this.$dialog.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),this.$dialog.find("input").on("change",function(){c.$dialogSave.removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")}),this.$dialog.find("select").on("change",function(){c.$dialogSave.removeClass("disabled")}),this.$dialog.find("textarea").on("change",function(){c.$dialogSave.removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")}),void 0!==e.common.color){var n=Date.now(),i=this.$dialog.find('.object-tab-edit-string[data-attr="color"]').parent();i.prepend('<i class="material-icons prefix tab-enums-dialog-new-color-icon">color_lens</i><a class="btn edit-color translate">'+_("Color")+"</a>"),i.colorpicker({component:".btn",color:i,container:!0}).colorpicker("setValue",e.common.color||"#fff").on("showPicker.colorpicker",function(){}).on("changeColor.colorpicker",function(e){100<Date.now()-n&&i.find("input").val(e.color.toHex()).trigger("change")})}}},this.saveFromTabs=function(){var e;try{e=(e=this.$dialog.find("#view-object-rest").val())?JSON.parse(e):{}}catch(t){return this.main.showMessage(_("Cannot parse."),_("Error in %s",t),"error_outline"),!1}e.common={},e.native={},e.acl={},e._id=this.$dialog.find(".title-id").text(),e.common.name=this.$dialog.find(".edit-object-name").val(),e.type=this.$dialog.find(".edit-object-type").val();var t=n(".object-tab-common-table",e.common);return t?(this.main.showMessage(_("Cannot parse."),_("Error in %s",t),"error_outline"),!1):(t=n(".object-tab-native-table",e.native))?(this.main.showMessage(_("Cannot parse."),_("Error in %s",t),"error_outline"),!1):(e.acl.object=0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-owner-read").prop("checked")?1024:0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-owner-write").prop("checked")?512:0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-group-read").prop("checked")?64:0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-group-write").prop("checked")?32:0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-every-read").prop("checked")?4:0,e.acl.object|=this.$dialog.find("#object-tab-acl-obj-every-write").prop("checked")?2:0,e.acl.owner=this.$dialog.find(".object-tab-acl-owner").val(),e.acl.ownerGroup=this.$dialog.find(".object-tab-acl-group").val(),"state"===e.type&&(e.acl.state=0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-owner-read").prop("checked")?1024:0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-owner-write").prop("checked")?512:0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-group-read").prop("checked")?64:0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-group-write").prop("checked")?32:0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-every-read").prop("checked")?4:0,e.acl.state|=this.$dialog.find("#object-tab-acl-state-every-write").prop("checked")?2:0),null!==this.iconVal&&void 0!==this.iconVal&&(e.common.icon=this.iconVal),e)},this.saveFromRaw=function(){var e;try{e=JSON.parse(this.editor.getValue())}catch(e){return this.main.showMessage(e,_("Parse error"),"error_outline"),c.main.noSelect||this.$dialog.find(".tabs").mtabs("select","object-tab-raw"),!1}return e},this.save=function(){if("object-tab-raw"===this.main.config["object-edit-active"]){var n=this.saveFromRaw();if(!n)return;this.main.socket.emit("setObject",n._id,n,function(e){if(e)c.main.showError(e);else{var t=c.$dialog.data("cb");t&&t(n),c.$dialogSave.addClass("disabled"),c.main.navigate()}})}else{var i=c.saveFromTabs();if(!i)return;this.main.socket.emit("getObject",i._id,function(e,t){if(e)return c.main.showError(e);t.common=i.common,t.native=i.native,t.acl=i.acl,c.main.socket.emit("setObject",i._id,t,function(e){if(e)c.main.showError(e);else{var t=c.$dialog.data("cb");t&&t(i),c.$dialogSave.addClass("disabled"),c.main.navigate()}})})}},this.allStored=function(){return c.$dialogSave.hasClass("disabled")}}function Enums(t){var g=this;this.main=t,this.list=[],this.$gridEnum=$("#tab-enums"),this.$gridList=this.$gridEnum.find(".tab-enums-list"),this.$grid=this.$gridEnum.find(".tab-enums-objects"),this.updateTimers=null,this.editMode=!1,this.isTiles=!1;var d=[],a={"enum.rooms":{_id:"enum.rooms",common:{icon:"home",name:"Rooms",desc:{en:"List of the rooms",cn:"List of the rooms"},members:[],dontDelete:!0},type:"enum"},"enum.functions":{_id:"enum.functions",common:{icon:"lightbulb_outline",name:"Functions",desc:{en:"List of the functions",cn:"List of the functions"},members:[],dontDelete:!0},type:"enum"},"enum.favorites":{_id:"enum.favorites",common:{icon:"favorite_border",name:"Favorites",desc:{en:"List of favorites objects",cn:"List of favorites objects"},members:[]},type:"enum"}},s={"enum.rooms":{"enum.rooms.living_room":{_id:"enum.rooms.living_room",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ4MC4wNDYgNDgwLjA0NiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwLjA0NiA0ODAuMDQ2OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PGc+PHBhdGggZD0iTTMyOC4wMzQsMzIwLjA0NmgtMjR2LTg4YzAtNC40MTgtMy41ODItOC04LThoLTI1NmMtNC40MTgsMC04LDMuNTgyLTgsOHY4OGgtMjRjLTQuNDE4LDAtOCwzLjU4Mi04LDh2MTI4YzAsNC40MTgsMy41ODIsOCw4LDhoMjR2MTZoMTZ2LTE2aDI0MHYxNmgxNnYtMTZoMjRjNC40MTgsMCw4LTMuNTgyLDgtOHYtMTI4QzMzNi4wMzQsMzIzLjYyOCwzMzIuNDUyLDMyMC4wNDYsMzI4LjAzNCwzMjAuMDQ2eiBNODAuMDM0LDQ0OC4wNDZoLTY0di0xMTJoNjRWNDQ4LjA0NnogTTI0MC4wMzQsNDQ4LjA0NmgtMTQ0di02NGgxNDRWNDQ4LjA0NnogTTI0MC4wMzQsMzI4LjA0NnY0MGgtMTQ0di00MGMwLTQuNDE4LTMuNTgyLTgtOC04aC00MHYtODBoMjQwdjgwaC00MEMyNDMuNjE1LDMyMC4wNDYsMjQwLjAzNCwzMjMuNjI4LDI0MC4wMzQsMzI4LjA0NnogTTMyMC4wMzQsNDQ4LjA0NmgtNjR2LTExMmg2NFY0NDguMDQ2eiIvPjwvZz48L2c+PGc+PGc+PHBhdGggZD0iTTQ3OS45NTQsMTUxLjE2NmwtMTYtMTQ0Yy0wLjQ0Ny00LjA0MS0zLjg1NC03LjEwNC03LjkyLTcuMTJoLTExMmMtNC4wOTYtMC4wMjUtNy41NDksMy4wNDktOCw3LjEybC0xNiwxNDRjLTAuMjc2LDIuMjU4LDAuNDIyLDQuNTI4LDEuOTIsNi4yNGMxLjU1LDEuNzE4LDMuNzY3LDIuNjgsNi4wOCwyLjY0aDY0djI3MmgtMzJjLTQuNDE4LDAtOCwzLjU4Mi04LDh2MzJjMCw0LjQxOCwzLjU4Miw4LDgsOGg4MGM0LjQxOCwwLDgtMy41ODIsOC04di0zMmMwLTQuNDE4LTMuNTgyLTgtOC04aC0zMnYtMjcyaDY0YzIuMjg1LDAuMDE3LDQuNDY5LTAuOTQzLDYtMi42NEM0NzkuNTMyLDE1NS42OTQsNDgwLjIzLDE1My40MjUsNDc5Ljk1NCwxNTEuMTY2eiBNNDMyLjAzNCw0NDguMDQ2djE2aC02NHYtMTZINDMyLjAzNHogTTMzNi45OTQsMTQ0LjA0NmwxNC4yNC0xMjhoOTcuNmwxNC4yNCwxMjhIMzM2Ljk5NHoiLz48L2c+PC9nPjxnPjxnPjxwYXRoIGQ9Ik0yNzIuMDM0LDQ4LjA0NmgtNTIuNzJsLTQ1LjYtNDUuNjhjLTMuMTExLTMuMTM3LTguMTc3LTMuMTU4LTExLjMxNC0wLjA0NmMtMC4wMTYsMC4wMTUtMC4wMzEsMC4wMzEtMC4wNDYsMC4wNDZsLTQ1LjYsNDUuNjhoLTUyLjcyYy00LjQxOCwwLTgsMy41ODItOCw4djEyOGMwLDQuNDE4LDMuNTgyLDgsOCw4aDIwOGM0LjQxOCwwLDgtMy41ODIsOC04di0xMjhDMjgwLjAzNCw1MS42MjgsMjc2LjQ1Miw0OC4wNDYsMjcyLjAzNCw0OC4wNDZ6IE0xNjguMDM0LDE5LjMyNmwyOC43MiwyOC43MmgtNTcuNDRMMTY4LjAzNCwxOS4zMjZ6IE0yNjQuMDM0LDE3Ni4wNDZoLTE5MnYtMTEyaDE5MlYxNzYuMDQ2eiIvPjwvZz48L2c+PGc+PGc+PHBhdGggZD0iTTg4LjAzNCw4MC4wNDZ2ODBoMTYwdi04MEg4OC4wMzR6IE0yMzIuMDM0LDE0NC4wNDZoLTEyOHYtNDhoMTI4VjE0NC4wNDZ6Ii8+PC9nPjwvZz48L3N2Zz4=",name:"Living room",members:[]},type:"enum"},"enum.rooms.sleeping_room":{_id:"enum.rooms.sleeping_room",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTQ2NCwyNjRWODhIMTZ2MTc2SDB2ODBoNDh2NDhoNjR2LTQ4aDI1NnY0OGg2NHYtNDhoNDh2LTgwSDQ2NHogTTMyLDEwNGg0MTZ2MTYwaC0xNnYtMjRjMC0yMi4wOTEtMTcuOTA5LTQwLTQwLTQwDQoJCWgtMTIuNDhjMi45MDgtNC44MzIsNC40NTYtMTAuMzYsNC40OC0xNmMwLTE3LjY3My0xNC4zMjctMzItMzItMzJoLTY0Yy0xNy42NzMsMC0zMiwxNC4zMjctMzIsMzINCgkJYzAuMDI0LDUuNjQsMS41NzIsMTEuMTY4LDQuNDgsMTZoLTQwLjk2YzIuOTA4LTQuODMyLDQuNDU2LTEwLjM2LDQuNDgtMTZjMC0xNy42NzMtMTQuMzI3LTMyLTMyLTMyaC02NA0KCQljLTE3LjY3MywwLTMyLDE0LjMyNy0zMiwzMmMwLjAyNCw1LjY0LDEuNTcyLDExLjE2OCw0LjQ4LDE2SDg4Yy0yMi4wOTEsMC00MCwxNy45MDktNDAsNDB2MjRIMzJWMTA0eiBNMzkyLDIxNg0KCQljMTMuMjU1LDAsMjQsMTAuNzQ1LDI0LDI0djI0SDY0di0yNGMwLTEzLjI1NSwxMC43NDUtMjQsMjQtMjRIMzkyeiBNMTEyLDE4NGMwLTguODM3LDcuMTYzLTE2LDE2LTE2aDY0YzguODM3LDAsMTYsNy4xNjMsMTYsMTYNCgkJcy03LjE2MywxNi0xNiwxNmgtNjRDMTE5LjE2MywyMDAsMTEyLDE5Mi44MzcsMTEyLDE4NHogTTI3MiwxODRjMC04LjgzNyw3LjE2My0xNiwxNi0xNmg2NGM4LjgzNywwLDE2LDcuMTYzLDE2LDE2DQoJCXMtNy4xNjMsMTYtMTYsMTZoLTY0QzI3OS4xNjMsMjAwLDI3MiwxOTIuODM3LDI3MiwxODR6IE05NiwzNzZINjR2LTMyaDMyVjM3NnogTTQxNiwzNzZoLTMydi0zMmgzMlYzNzZ6IE00NjQsMzI4SDE2di00OGg0NDhWMzI4DQoJCXoiLz4NCjwvZz4NCjxnPg0KCTxyZWN0IHg9IjQ4IiB5PSIxMjAiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPg0KPC9nPg0KPGc+DQoJPHJlY3QgeD0iNDE2IiB5PSIxMjAiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIvPg0KPC9nPg0KPGc+DQoJPHJlY3QgeD0iODAiIHk9IjEyMCIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIxNiIvPg0KPC9nPg0KPGc+DQoJPHJlY3QgeD0iNDgiIHk9IjE1MiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjQwIi8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSI0MTYiIHk9IjE1MiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjQwIi8+DQo8L2c+DQoNCjwvc3ZnPg0K",name:"Sleeping room",members:[]},type:"enum"},"enum.rooms.kitchen":{_id:"enum.rooms.kitchen",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTAsMjA4djQ4aDE2djIyNGg0NDhWMjU2aDE2di00OEgweiBNMjA4LDQ2NEgzMlYyNTZoMTc2VjQ2NHogTTI4OCw0NjRoLTY0VjMyMGg2NFY0NjR6IE0zNjgsNDY0aC02NFYzMjBoNjRWNDY0eg0KCQkgTTQ0OCw0NjRoLTY0VjMyMGg2NFY0NjR6IE00NDgsMzA0SDIyNHYtNDhoMjI0VjMwNHogTTQ2NCwyNDBIMTZ2LTE2aDQ0OFYyNDB6Ii8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBkPSJNNDgsMzM2djExMmgxNDRWMzM2SDQ4eiBNMTc2LDQzMkg2NHYtODBoMTEyVjQzMnoiLz4NCjwvZz4NCjxnPg0KCTxwYXRoIGQ9Ik03MiwyNzJjLTEzLjI1NSwwLTI0LDEwLjc0NS0yNCwyNHMxMC43NDUsMjQsMjQsMjRzMjQtMTAuNzQ1LDI0LTI0Uzg1LjI1NSwyNzIsNzIsMjcyeiBNNzIsMzA0Yy00LjQxOCwwLTgtMy41ODItOC04DQoJCQlzMy41ODItOCw4LThzOCwzLjU4Miw4LDhTNzYuNDE4LDMwNCw3MiwzMDR6Ii8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBkPSJNMTY4LDI3MmMtMTMuMjU1LDAtMjQsMTAuNzQ1LTI0LDI0czEwLjc0NSwyNCwyNCwyNHMyNC0xMC43NDUsMjQtMjRTMTgxLjI1NSwyNzIsMTY4LDI3MnogTTE2OCwzMDRjLTQuNDE4LDAtOC0zLjU4Mi04LTgNCgkJczMuNTgyLTgsOC04czgsMy41ODIsOCw4UzE3Mi40MTgsMzA0LDE2OCwzMDR6Ii8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSIzMDQiIHk9IjI3MiIgd2lkdGg9IjY0IiBoZWlnaHQ9IjE2Ii8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSIyNTYiIHk9IjMzNiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSIzMzYiIHk9IjM2OCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjMyIi8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSI0MDAiIHk9IjM2OCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjMyIi8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBkPSJNMjA4LDB2ODYuMDhsLTI0LTQ4VjBINDB2MzguMDhMMC44OCwxMTYuNGMtMS45ODgsMy45NDYtMC40MDEsOC43NTYsMy41NDQsMTAuNzQ0QzUuNTM0LDEyNy43MDMsNi43NTgsMTI3Ljk5Niw4LDEyOGg0NzINCgkJVjBIMjA4eiBNNTYsMTZoMTEydjE2SDU2VjE2eiBNMjAuOTYsMTEybDMyLTY0aDExOC4wOGwzMiw2NEgyMC45NnogTTMzNiwxMTJIMjI0VjE2aDExMlYxMTJ6IE00NjQsMTEySDM1MlYxNmgxMTJWMTEyeiIvPg0KPC9nPg0KPGc+DQoJPHJlY3QgeD0iMzA0IiB5PSI4MCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+DQo8L2c+DQo8Zz4NCgk8cmVjdCB4PSIzNjgiIHk9IjgwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4NCjwvZz4NCjxnPg0KCTxyZWN0IHg9Ijk2IiB5PSIzNjgiIHdpZHRoPSI0OCIgaGVpZ2h0PSIxNiIvPg0KPC9nPg0KPC9zdmc+DQo=",name:"Kitchen",members:[]},type:"enum"},"enum.rooms.office":{_id:"enum.rooms.office",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJCTxwYXRoIGQ9Ik0yMjQsMTIwdjExMmgyMjRWMTIwSDIyNHogTTQzMiwyMTZIMjQwdi04MGgxOTJWMjE2eiIvPg0KPC9nPg0KPGc+DQoJCTxwYXRoIGQ9Ik0zMzYsMTUyYy0xMy4yNTUsMC0yNCwxMC43NDUtMjQsMjRzMTAuNzQ1LDI0LDI0LDI0czI0LTEwLjc0NSwyNC0yNFMzNDkuMjU1LDE1MiwzMzYsMTUyeiBNMzM2LDE4NGMtNC40MTgsMC04LTMuNTgyLTgtOA0KCQkJczMuNTgyLTgsOC04czgsMy41ODIsOCw4UzM0MC40MTgsMTg0LDMzNiwxODR6Ii8+DQo8L2c+DQo8Zz4NCgkJPHBhdGggZD0iTTE3Niw4OFY0OGMwLTQuNDE4LTMuNTgyLTgtOC04aC04VjE2YzAtNC40MTgtMy41ODItOC04LThINDBjLTQuNDE4LDAtOCwzLjU4Mi04LDh2MjRoLThjLTQuNDE4LDAtOCwzLjU4Mi04LDh2NDBIMHYzODQNCgkJCWgyMDhWMjY0aDIwOHYyMDhoNjRWODhIMTc2eiBNNDgsMjRoOTZ2MTZINDhWMjR6IE0zMiw1NmgxMjh2MzJIMzJWNTZ6IE0xOTIsNDU2SDE2VjIwMGgxNzZWNDU2eiBNMTkyLDE4NEgxNnYtODBoMTc2VjE4NHoNCgkJCSBNNDY0LDQ1NmgtMzJWMjY0aDMyVjQ1NnogTTQ2NCwyNDhIMjA4VjEwNGgyNTZWMjQ4eiIvPg0KPC9nPg0KPGc+DQoJCTxyZWN0IHg9IjgwIiB5PSIxMzYiIHdpZHRoPSI0OCIgaGVpZ2h0PSIxNiIvPg0KPC9nPg0KPGc+DQoJCTxwYXRoIGQ9Ik0xNTIsMjE2Yy0xMy4yNTUsMC0yNCwxMC43NDUtMjQsMjRzMTAuNzQ1LDI0LDI0LDI0czI0LTEwLjc0NSwyNC0yNFMxNjUuMjU1LDIxNiwxNTIsMjE2eiBNMTUyLDI0OGMtNC40MTgsMC04LTMuNTgyLTgtOA0KCQkJczMuNTgyLTgsOC04czgsMy41ODIsOCw4UzE1Ni40MTgsMjQ4LDE1MiwyNDh6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==",name:"Office",members:[]},type:"enum"},"enum.rooms.nursery":{_id:"enum.rooms.nursery",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTQwLDQzMmMtMTMuMjU1LDAtMjQsMTAuNzQ1LTI0LDI0czEwLjc0NSwyNCwyNCwyNHMyNC0xMC43NDUsMjQtMjRTNTMuMjU1LDQzMiw0MCw0MzJ6IE00MCw0NjRjLTQuNDE4LDAtOC0zLjU4Mi04LTgNCgkJczMuNTgyLTgsOC04czgsMy41ODIsOCw4UzQ0LjQxOCw0NjQsNDAsNDY0eiIvPg0KPC9nPg0KPGc+DQoJPHBhdGggZD0iTTQ0MCw0MzJjLTEzLjI1NSwwLTI0LDEwLjc0NS0yNCwyNHMxMC43NDUsMjQsMjQsMjRzMjQtMTAuNzQ1LDI0LTI0UzQ1My4yNTUsNDMyLDQ0MCw0MzJ6IE00NDAsNDY0Yy00LjQxOCwwLTgtMy41ODItOC04DQoJCXMzLjU4Mi04LDgtOHM4LDMuNTgyLDgsOFM0NDQuNDE4LDQ2NCw0NDAsNDY0eiIvPg0KPC9nPg0KPGc+DQoJPHBhdGggZD0iTTQxNiwxMTJ2NDhINjR2LTQ4SDE2djMyMGg0OHYtNDhoMzUydjQ4aDQ4VjExMkg0MTZ6IE00OCw0MTZIMzJWMTI4aDE2VjQxNnogTTY0LDIwOGgyNHY4MEg2NFYyMDh6IE02NCwzMDRoMjR2MzJINjRWMzA0DQoJCXogTTQxNiwzNjhINjR2LTE2aDM1MlYzNjh6IE0xMjAsMzA0djMyaC0xNnYtMzJIMTIweiBNMTA0LDI4OHYtODBoMTZ2ODBIMTA0eiBNMTUyLDMwNHYzMmgtMTZ2LTMySDE1MnogTTEzNiwyODh2LTgwaDE2djgwSDEzNnoNCgkJIE0xODQsMzA0djMyaC0xNnYtMzJIMTg0eiBNMTY4LDI4OHYtODBoMTZ2ODBIMTY4eiBNMjE2LDMwNHYzMmgtMTZ2LTMySDIxNnogTTIwMCwyODh2LTgwaDE2djgwSDIwMHogTTI0OCwzMDR2MzJoLTE2di0zMkgyNDh6DQoJCSBNMjMyLDI4OHYtODBoMTZ2ODBIMjMyeiBNMjgwLDMwNHYzMmgtMTZ2LTMySDI4MHogTTI2NCwyODh2LTgwaDE2djgwSDI2NHogTTMxMiwzMDR2MzJoLTE2di0zMkgzMTJ6IE0yOTYsMjg4di04MGgxNnY4MEgyOTZ6DQoJCSBNMzQ0LDMwNHYzMmgtMTZ2LTMySDM0NHogTTMyOCwyODh2LTgwaDE2djgwSDMyOHogTTM3NiwzMDR2MzJoLTE2di0zMkgzNzZ6IE0zNjAsMjg4di04MGgxNnY4MEgzNjB6IE00MTYsMzM2aC0yNHYtMzJoMjRWMzM2eg0KCQkgTTQxNiwyODhoLTI0di04MGgyNFYyODh6IE00MTYsMTkySDY0di0xNmgzNTJWMTkyeiBNNDQ4LDQxNmgtMTZWMTI4aDE2VjQxNnoiLz4NCjwvZz4NCjxnPg0KCTxwYXRoIGQ9Ik0yOTYsNTAuNzJjLTQuNTA5LDAuMDM0LTguOTE3LDEuMzM3LTEyLjcyLDMuNzZjLTEwLjMxMy03LjY4MS0yMi40OTUtMTIuNDYtMzUuMjgtMTMuODRWMGgtMTZ2NDAuNjQNCgkJYy0xMi43ODUsMS4zOC0yNC45NjcsNi4xNTktMzUuMjgsMTMuODRjLTMuODAzLTIuNDIzLTguMjExLTMuNzI2LTEyLjcyLTMuNzZjLTEzLjI1NSwwLTI0LDEwLjc0NS0yNCwyNGMwLDEzLjI1NSwxMC43NDUsMjQsMjQsMjQNCgkJczI0LTEwLjc0NSwyNC0yNGMtMC4wMTUtMi43MjMtMC40NzUtNS40MjUtMS4zNi04YzE5Ljg1NS0xNC41NjUsNDYuODY1LTE0LjU2NSw2Ni43MiwwYy0wLjg4NSwyLjU3NS0xLjM0NSw1LjI3Ny0xLjM2LDgNCgkJYzAsMTMuMjU1LDEwLjc0NSwyNCwyNCwyNHMyNC0xMC43NDUsMjQtMjRDMzIwLDYxLjQ2NSwzMDkuMjU1LDUwLjcyLDI5Niw1MC43MnogTTE4NCw4Mi43MmMtNC40MTgsMC04LTMuNTgyLTgtOA0KCQljMC00LjQxOCwzLjU4Mi04LDgtOHM4LDMuNTgyLDgsOEMxOTIsNzkuMTM4LDE4OC40MTgsODIuNzIsMTg0LDgyLjcyeiBNMjk2LDgyLjcyYy00LjQxOCwwLTgtMy41ODItOC04YzAtNC40MTgsMy41ODItOCw4LTgNCgkJczgsMy41ODIsOCw4QzMwNCw3OS4xMzgsMzAwLjQxOCw4Mi43MiwyOTYsODIuNzJ6Ii8+DQo8L2c+DQoNCjwvc3ZnPg0K",name:"Nursery",members:[]},type:"enum"},"enum.rooms.wc":{_id:"enum.rooms.wc",common:{icon:"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMiA1MTI7IiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMjU2cHgiIGhlaWdodD0iMjU2cHgiPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik00NTEsMzE3di0zMGMwLTI0LjgxMy0yMC4xODctNDUtNDUtNDVIMjI2Yy01LjI1OSwwLTEwLjMwNSwwLjkxNS0xNSwyLjU4Vjg3LjQyYzE3LjQ1OS02LjE5MiwzMC0yMi44NjUsMzAtNDIuNDIgICAgYzAtMjQuODEzLTIwLjE4Ny00NS00NS00NUg3NmMtOC4yODQsMC0xNSw2LjcxNi0xNSwxNWMwLDI3LjcxLDAsMjQ2LjM4NSwwLDI3MmMwLDE5LjU1NSwxMi41NDEsMzYuMjI4LDMwLDQyLjQyVjM3NyAgICBjMCwyNy41MTksMTAuODU1LDUzLjkyNywzMCw3My40ODJWNDk3YzAsOC4yODQsNi43MTYsMTUsMTUsMTVjMTcuMzMsMCwyNTQuODQ2LDAsMjcwLDBjOC4yODQsMCwxNS02LjcxNiwxNS0xNXMtNi43MTYtMTUtMTUtMTUgICAgaC00NXYtMTcuOTkxQzQxNS45ODgsNDM1Ljk0Myw0NTEsMzc5LjI4Myw0NTEsMzE3eiBNMjI2LDI3MmgxODBjOC4yNzEsMCwxNSw2LjcyOSwxNSwxNXYxNUgyMTF2LTE1ICAgIEMyMTEsMjc4LjcyOSwyMTcuNzI5LDI3MiwyMjYsMjcyeiBNOTEsMzBoMTA1YzguMjcxLDAsMTUsNi43MjksMTUsMTVzLTYuNzI5LDE1LTE1LDE1SDkxVjMweiBNMTA2LDMwMmMtOC4yNzEsMC0xNS02LjcyOS0xNS0xNSAgICBWOTBoOTBjMCwxNy4zOSwwLDIwMC4yNzEsMCwyMTJIMTA2eiBNMzM5Ljk5NCw0NDAuNzczYy01LjQ2MywyLjM4Ny04Ljk5NCw3Ljc4My04Ljk5NCwxMy43NDVWNDgySDE1MXYtMzcuOTE3ICAgIGMwLTQuMjY3LTEuODE3LTguMzMyLTQuOTk2LTExLjE3N0MxMzAuMTEzLDQxOC42ODQsMTIxLDM5OC4zMDcsMTIxLDM3N3YtNDUuMWMzNC41MzUsMCwyOTYuNTQ1LDAsMjk5LjE2OCwwICAgIEM0MTQuODY0LDM3OS40OTMsMzg0LjU3NSw0MjEuMjk1LDMzOS45OTQsNDQwLjc3M3oiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K",name:"WC",members:[]},type:"enum"},"enum.rooms.garage":{_id:"enum.rooms.kitchen",common:{icon:"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ4MC4wMTMgNDgwLjAxMyIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwLjAxMyA0ODAuMDEzOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjI1NnB4IiBoZWlnaHQ9IjI1NnB4Ij4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNMzkwLjk5OSwzMTYuOTUybC0zMC4yOTYtMjQuMjMyYy0xLjExMy0wLjg4Ny0xLjk2OS0yLjA1NS0yLjQ4LTMuMzg0bC0xMS42OC01NC40ICAgIGMtMi40MzItMTEuMDItMTIuMTc5LTE4Ljg4My0yMy40NjQtMTguOTI4SDE1Ni44MDdjLTExLjI2OC0wLjA1Mi0yMS4wMzYsNy43ODgtMjMuNDI0LDE4LjhsLTEyLDUzLjk1MiAgICBjLTAuNDAzLDEuNzgzLTEuMzk5LDMuMzc2LTIuODI0LDQuNTJsLTI5LjYsMjMuNjhjLTUuNjg3LDQuNTUyLTguOTg0LDExLjQ1Mi04Ljk1MiwxOC43MzZ2ODAuMzEyICAgIGMwLjAyMSw2Ljc4OCwyLjkzLDEzLjI0Niw4LDE3Ljc2djMwLjI0YzAsOC44MzcsNy4xNjMsMTYsMTYsMTZoMzJjOC44MzcsMCwxNi03LjE2MywxNi0xNnYtMjRoMTc2djI0YzAsOC44MzcsNy4xNjMsMTYsMTYsMTZoMzIgICAgYzguODM3LDAsMTYtNy4xNjMsMTYtMTZ2LTMwLjI0YzUuMDctNC41MTQsNy45NzktMTAuOTcyLDgtMTcuNzZ2LTgwLjMxMkM0MDAuMDI0LDMyOC40LDM5Ni43MDcsMzIxLjQ5NiwzOTAuOTk5LDMxNi45NTJ6ICAgICBNMjE4LjE0MywyMzguMzI4bDAtMC4wMDhsNC4yMDgtNi4zMmgxMDAuNzI4YzMuNzcyLTAuMDAxLDcuMDMyLDIuNjMyLDcuODI0LDYuMzJsMTAuNzA0LDQ5LjY4OEgyMjQuNzAzICAgIGM1Ljg4OC0xMS4wOTgsMy44NzEtMjQuNzM2LTQuOTc2LTMzLjY1NkMyMTUuNDYxLDI1MC4wNjQsMjE0Ljc5OSwyNDMuMzY4LDIxOC4xNDMsMjM4LjMyOHogTTE4NC4wNzksMjM4LjMyOHYtMC4wMDhsNC4yMDgtNi4zMiAgICBoMTUuMTQ0Yy01Ljg4LDExLjEwMS0zLjg2MSwyNC43MzYsNC45ODQsMzMuNjU2YzQuMjU4LDQuMjgsNC45MjYsMTAuOTYyLDEuNiwxNmwtNC4yMDgsNi4zMmgtMTUuMTYgICAgYzUuODgtMTEuMTAxLDMuODYxLTI0LjczNi00Ljk4NC0zMy42NTZDMTgxLjQxNCwyNTAuMDM3LDE4MC43NTMsMjQzLjM2MSwxODQuMDc5LDIzOC4zMjh6IE0xNDkuMDM5LDIzOC4yNjQgICAgYzAuNzkyLTMuNjU1LDQuMDI4LTYuMjYyLDcuNzY4LTYuMjU2aDEyLjU2Yy01Ljg4LDExLjEwMS0zLjg2MSwyNC43MzYsNC45ODQsMzMuNjU2YzQuMjU4LDQuMjgsNC45MjYsMTAuOTYyLDEuNiwxNmwtNC4yMDgsNi4zMiAgICBoLTMzLjc2TDE0OS4wMzksMjM4LjI2NHogTTEzNi4wMDcsNDY0LjAwOGgtMzJ2LTI0aDMyVjQ2NC4wMDh6IE0zNzYuMDA3LDQ2NC4wMDhoLTMydi0yNGgzMlY0NjQuMDA4eiBNMzg0LjAwNyw0MTYuMDA4ICAgIGMwLDQuNDE4LTMuNTgyLDgtOCw4aC0yNzJjLTQuNDE4LDAtOC0zLjU4Mi04LTh2LThoMjg4VjQxNi4wMDh6IE0zODQuMDA3LDM5Mi4wMDhoLTI4OHYtNTYuMzEyICAgIGMtMC4wMDYtMi40MzEsMS4xMDMtNC43MywzLjAwOC02LjI0bDI5LjYtMjMuNjhjMC42NDktMC41NTYsMS4yNjktMS4xNDYsMS44NTYtMS43NjhoMjE4LjkyOGMwLjQzMiwwLjQsMC44LDAuOCwxLjI5NiwxLjIgICAgbDMwLjMwNCwyNC4yNGMxLjksMS41MTcsMy4wMDcsMy44MTYsMy4wMDgsNi4yNDhWMzkyLjAwOHoiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik0xMzIuMDA3LDMyOC4wMDhjLTE1LjQ2NCwwLTI4LDEyLjUzNi0yOCwyOGMwLDE1LjQ2NCwxMi41MzYsMjgsMjgsMjhzMjgtMTIuNTM2LDI4LTI4ICAgIEMxNjAuMDA3LDM0MC41NDQsMTQ3LjQ3MSwzMjguMDA4LDEzMi4wMDcsMzI4LjAwOHogTTEzMi4wMDcsMzY4LjAwOGMtNi42MjcsMC0xMi01LjM3My0xMi0xMmMwLTYuNjI3LDUuMzczLTEyLDEyLTEyICAgIGM2LjYyNywwLDEyLDUuMzczLDEyLDEyQzE0NC4wMDcsMzYyLjYzNSwxMzguNjM0LDM2OC4wMDgsMTMyLjAwNywzNjguMDA4eiIgZmlsbD0iIzAwMDAwMCIvPgoJPC9nPgo8L2c+CjxnPgoJPGc+CgkJPHBhdGggZD0iTTM0OC4wMDcsMzI4LjAwOGMtMTUuNDY0LDAtMjgsMTIuNTM2LTI4LDI4YzAsMTUuNDY0LDEyLjUzNiwyOCwyOCwyOGMxNS40NjQsMCwyOC0xMi41MzYsMjgtMjggICAgQzM3Ni4wMDcsMzQwLjU0NCwzNjMuNDcxLDMyOC4wMDgsMzQ4LjAwNywzMjguMDA4eiBNMzQ4LjAwNywzNjguMDA4Yy02LjYyNywwLTEyLTUuMzczLTEyLTEyYzAtNi42MjcsNS4zNzMtMTIsMTItMTIgICAgYzYuNjI3LDAsMTIsNS4zNzMsMTIsMTJDMzYwLjAwNywzNjIuNjM1LDM1NC42MzQsMzY4LjAwOCwzNDguMDA3LDM2OC4wMDh6IiBmaWxsPSIjMDAwMDAwIi8+Cgk8L2c+CjwvZz4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNMjg4LjAwNywzMjguMDA4aC05NmMtOC44MzcsMC0xNiw3LjE2My0xNiwxNnYyNGMwLDguODM3LDcuMTYzLDE2LDE2LDE2aDk2YzguODM3LDAsMTYtNy4xNjMsMTYtMTZ2LTI0ICAgIEMzMDQuMDA3LDMzNS4xNzEsMjk2Ljg0NCwzMjguMDA4LDI4OC4wMDcsMzI4LjAwOHogTTI4OC4wMDcsMzY4LjAwOGgtOTZ2LTI0aDk2VjM2OC4wMDh6IiBmaWxsPSIjMDAwMDAwIi8+Cgk8L2c+CjwvZz4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNNDc1Ljg3MSwxMjlsLTIzMi0xMjhjLTIuNDA1LTEuMzI3LTUuMzIzLTEuMzI3LTcuNzI4LDBsLTIzMiwxMjhjLTMuODcsMi4xMzEtNS4yODEsNi45OTYtMy4xNSwxMC44NjYgICAgYzEuNDA3LDIuNTU2LDQuMDk1LDQuMTQ0LDcuMDEzLDQuMTQyaDh2MzM2aDQ4di0yOTZoMzUydjI5Nmg0OHYtMzM2aDhjNC40MTgsMC4wMDMsOC4wMDMtMy41NzYsOC4wMDYtNy45OTUgICAgQzQ4MC4wMTUsMTMzLjA5NSw0NzguNDI3LDEzMC40MDcsNDc1Ljg3MSwxMjl6IE0yNDAuMDA3LDE3LjE1MmwyMDAuOTM2LDExMC44NTZIMzkuMDcxTDI0MC4wMDcsMTcuMTUyeiBNNDQ4LjAwNyw0NjQuMDA4aC0xNiAgICB2LTI5NmgtMzg0djI5NmgtMTZ2LTMyMGg0MTZWNDY0LjAwOHoiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik0xNjguMDA3LDc1LjA2NHY0NC45NDRoNjRWNDMuMDY0TDE2OC4wMDcsNzUuMDY0eiBNMjE2LjAwNywxMDQuMDA4aC0zMlY4NC45NTJsMzItMTZWMTA0LjAwOHoiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik0yNDguMDA3LDQzLjA2NHY3Ni45NDRoNjRWNzUuMDY0TDI0OC4wMDcsNDMuMDY0eiBNMjk2LjAwNywxMDQuMDA4aC0zMlY2OC45NTJsMzIsMTZWMTA0LjAwOHoiIGZpbGw9IiMwMDAwMDAiLz4KCTwvZz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K",name:"Garage",members:[]},type:"enum"}},"enum.functions":{"enum.functions.light":{_id:"enum.functions.light",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgJy0vL1czQy8vRFREIFNWRyAxLjEvL0VOJyAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIj4KICA8Zz4KICAgIDxnPgogICAgICA8cGF0aCBkPSJtMjU2LDkyLjNjLTc0LjIsMC0xMjcuOCw1NS4zLTEzNi4zLDExNC43LTUuMywzOS42IDcuNSw3OC4yIDM0LjEsMTA3LjQgMjMuNCwyNSAzNi4yLDU4LjQgMzYuMiw5Mi44bC0uMSw1NC4yYzAsMjEuOSAxOC4xLDM5LjYgNDAuNSwzOS42aDUyLjJjMjIuNCwwIDQwLjUtMTcuNyA0MC41LTM5LjZsLjEtNTQuMmMwLTM1LjQgMTEuNy02Ny44IDM0LjEtOTAuNyAyNC41LTI1IDM3LjMtNTcuMyAzNy4zLTkwLjctMC4xLTc0LjEtNjMtMTMzLjUtMTM4LjYtMTMzLjV6bTQ2LjgsMzY5LjFjMCwxMC40LTguNSwxOC44LTE5LjIsMTguOGgtNTIuMmMtMTAuNywwLTE5LjItOC4zLTE5LjItMTguOHYtMjRoOTAuNXYyNHptMzkuNi0xNTkuNWMtMjYuNiwyNy4xLTQwLjUsNjQuNi00MC41LDEwNS4zdjkuNGgtOTAuNXYtOS40YzAtMzguNi0xNi03Ny4xLTQyLjYtMTA2LjMtMjMuNC0yNS0zMy01Ny4zLTI4LjgtOTAuNyA3LjUtNTAgNTQtOTcgMTE2LjEtOTcgNjUsMCAxMTcuMiw1MS4xIDExNy4yLDExMi42IDAsMjguMS0xMC43LDU1LjItMzAuOSw3Ni4xeiIvPgogICAgICA8cmVjdCB3aWR0aD0iMjEuMyIgeD0iMjQ1LjMiIHk9IjExIiBoZWlnaHQ9IjUwIi8+CiAgICAgIDxwb2x5Z29uIHBvaW50cz0iMzg1LjEsMTA3LjQgNDAwLDEyMi4zIDQzNi41LDg3LjIgNDIxLjUsNzIuMyAgICIvPgogICAgICA8cmVjdCB3aWR0aD0iNTIuMiIgeD0iNDQ4LjgiIHk9IjIzNi4yIiBoZWlnaHQ9IjIwLjkiLz4KICAgICAgPHJlY3Qgd2lkdGg9IjUyLjIiIHg9IjExIiB5PSIyMzYuMiIgaGVpZ2h0PSIyMC45Ii8+CiAgICAgIDxwb2x5Z29uIHBvaW50cz0iOTAuMSw3Mi4yIDc1LjEsODcuMSAxMTEuNiwxMjIuMiAxMjYuNSwxMDcuMyAgICIvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==",name:"Light",members:[]},type:"enum"},"enum.functions.blinds":{_id:"enum.functions.blinds",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJCTxwYXRoIGQ9Ik0wLDB2NTEyaDUxMlYwSDB6IE00ODIsNDgySDMwVjMwaDQ1MlY0ODJ6Ii8+DQo8L2c+DQo8Zz4NCgkJPHBhdGggZD0iTTYwLDYwdjM5MmgzOTJWNjBINjB6IE0yNDEsNDIySDkwVjI3MWgxNTFWNDIyeiBNMjQxLDI0MUg5MFY5MGgxNTFWMjQxeiBNNDIyLDQyMkgyNzFWMjcxaDE1MVY0MjJ6IE00MjIsMjQxSDI3MVY5MGgxNTENCgkJCVYyNDF6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==",name:"Blinds",members:[]},type:"enum"},"enum.functions.weather":{_id:"enum.functions.weather",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNjAgNjAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDYwIDYwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8cGF0aCBkPSJNNTQuOTQ5LDI4LjI1MWMwLjAxOC0wLjA2OSwwLjAzOS0wLjEzNSwwLjA0Mi0wLjIwN0M1NC45OTIsMjguMDI5LDU1LDI4LjAxNiw1NSwyOEM1NSwxNC41NSw0NC4zMjMsMy41NTMsMzEsMy4wMjVWMQ0KCWMwLTAuNTUzLTAuNDQ4LTEtMS0xcy0xLDAuNDQ3LTEsMXYyLjAyNUMxNS42NzcsMy41NTMsNSwxNC41NSw1LDI4YzAsMC4wMTYsMC4wMDgsMC4wMjksMC4wMDksMC4wNDUNCgljMC4wMDMsMC4wNzEsMC4wMjMsMC4xMzcsMC4wNDIsMC4yMDdjMC4wMTYsMC4wNTksMC4wMjUsMC4xMTgsMC4wNSwwLjE3MmMwLjAyNSwwLjA1MywwLjA2NCwwLjA5NywwLjA5OCwwLjE0NQ0KCWMwLjA0MiwwLjA1OSwwLjA4MSwwLjExOCwwLjEzNSwwLjE2N2MwLjAxMSwwLjAxLDAuMDE2LDAuMDI1LDAuMDI4LDAuMDM1YzAuMDM2LDAuMDMsMC4wOCwwLjA0LDAuMTE4LDAuMDY0DQoJYzAuMDU5LDAuMDM3LDAuMTE1LDAuMDc0LDAuMTgyLDAuMDk4YzAuMDcsMC4wMjYsMC4xNDEsMC4wMzQsMC4yMTMsMC4wNDNDNS45MTgsMjguOTgsNS45NTYsMjksNiwyOQ0KCWMwLjAxNSwwLDAuMDI3LTAuMDA4LDAuMDQyLTAuMDA4YzAuMDc2LTAuMDAzLDAuMTQ3LTAuMDI0LDAuMjItMC4wNDRjMC4wNTQtMC4wMTUsMC4xMDktMC4wMjMsMC4xNTgtMC4wNDcNCgljMC4wNTctMC4wMjYsMC4xMDQtMC4wNjgsMC4xNTYtMC4xMDVjMC4wNTUtMC4wNCwwLjExMS0wLjA3NywwLjE1Ny0wLjEyN2MwLjAxMS0wLjAxMiwwLjAyNi0wLjAxNywwLjAzNy0wLjAzDQoJQzguMTgsMjYuOTM3LDEwLjAzOCwyNiwxMiwyNnMzLjgyLDAuOTM3LDUuMjMsMi42MzljMC4wMTksMC4wMjMsMC4wNDgsMC4wMzIsMC4wNjksMC4wNTNjMC4wMjQsMC4wMjQsMC4wMzYsMC4wNTYsMC4wNjMsMC4wNzgNCgljMC4wNCwwLjAzMywwLjA4OCwwLjA0NSwwLjEzLDAuMDcxYzAuMDUxLDAuMDMxLDAuMDk4LDAuMDYyLDAuMTUyLDAuMDgyYzAuMDgyLDAuMDMyLDAuMTY0LDAuMDQ1LDAuMjQ5LDAuMDU0DQoJQzE3LjkzLDI4Ljk4MSwxNy45NjQsMjksMTgsMjljMC4wMTYsMCwwLjAzMS0wLjAwNywwLjA0Ni0wLjAwOGMwLjA1MS0wLjAwMiwwLjA5OC0wLjAxNSwwLjE0OC0wLjAyNQ0KCWMwLjA2OS0wLjAxNCwwLjEzNS0wLjAzLDAuMi0wLjA1OWMwLjA1LTAuMDIyLDAuMDk1LTAuMDUsMC4xNDEtMC4wODFjMC4wMzMtMC4wMjEsMC4wNy0wLjAzMiwwLjEwMS0wLjA1OA0KCWMwLjAyNC0wLjAyLDAuMDM1LTAuMDQ4LDAuMDU3LTAuMDdjMC4wMjMtMC4wMjMsMC4wNTQtMC4wMzUsMC4wNzUtMC4wNjFDMjAuMTgsMjYuOTM3LDIyLjAzOCwyNiwyNCwyNmMxLjg2LDAsMy42MiwwLjg1LDUsMi4zODZWNTUNCgljMCwxLjY1NC0xLjM0NiwzLTMsM3MtMy0xLjM0Ni0zLTNjMC0wLjU1My0wLjQ0OC0xLTEtMXMtMSwwLjQ0Ny0xLDFjMCwyLjc1NywyLjI0Myw1LDUsNXM1LTIuMjQzLDUtNVYyOC4zODYNCglDMzIuMzgsMjYuODUsMzQuMTQsMjYsMzYsMjZjMS45NjIsMCwzLjgyLDAuOTM3LDUuMjMsMi42MzljMC4wMTksMC4wMjMsMC4wNDgsMC4wMzIsMC4wNjksMC4wNTMNCgljMC4wMjQsMC4wMjQsMC4wMzYsMC4wNTYsMC4wNjMsMC4wNzhjMC4wNCwwLjAzMywwLjA4OCwwLjA0NCwwLjEzLDAuMDdjMC4wNTEsMC4wMzEsMC4wOTgsMC4wNjIsMC4xNTMsMC4wODMNCgljMC4wODEsMC4wMzEsMC4xNjMsMC4wNDUsMC4yNDksMC4wNTRDNDEuOTMsMjguOTgxLDQxLjk2NCwyOSw0MiwyOWMwLjAxNiwwLDAuMDMxLTAuMDA3LDAuMDQ2LTAuMDA4DQoJYzAuMDUxLTAuMDAyLDAuMDk5LTAuMDE1LDAuMTQ5LTAuMDI2YzAuMDY4LTAuMDE0LDAuMTM0LTAuMDMsMC4xOTktMC4wNThjMC4wNTEtMC4wMjIsMC4wOTYtMC4wNTEsMC4xNDItMC4wODENCgljMC4wMzMtMC4wMjEsMC4wNy0wLjAzMiwwLjEwMS0wLjA1N2MwLjAyNC0wLjAyLDAuMDM1LTAuMDQ4LDAuMDU2LTAuMDdjMC4wMjMtMC4wMjMsMC4wNTQtMC4wMzUsMC4wNzYtMC4wNjENCglDNDQuMTgsMjYuOTM3LDQ2LjAzOCwyNiw0OCwyNnMzLjgyLDAuOTM3LDUuMjMsMi42MzljMC4wMSwwLjAxMiwwLjAyNCwwLjAxNSwwLjAzNSwwLjAyN2MwLjA3LDAuMDc3LDAuMTU0LDAuMTM1LDAuMjQ1LDAuMTg4DQoJYzAuMDMxLDAuMDE4LDAuMDU1LDAuMDQ1LDAuMDg4LDAuMDU5QzUzLjcyMSwyOC45NjcsNTMuODU2LDI5LDU0LDI5aDBoMGMwLjEyMywwLDAuMjQ1LTAuMDI3LDAuMzYxLTAuMDczDQoJYzAuMDQ1LTAuMDE4LDAuMDgyLTAuMDQ3LDAuMTI0LTAuMDcxYzAuMDUxLTAuMDI5LDAuMTA2LTAuMDQ4LDAuMTUyLTAuMDg3YzAuMDEyLTAuMDEsMC4wMTctMC4wMjQsMC4wMjgtMC4wMzUNCgljMC4wNTQtMC4wNDksMC4wOTItMC4xMDcsMC4xMzUtMC4xNjdjMC4wMzQtMC4wNDgsMC4wNzMtMC4wOTMsMC4wOTgtMC4xNDVDNTQuOTI0LDI4LjM2OSw1NC45MzQsMjguMzEsNTQuOTQ5LDI4LjI1MXogTTQ4LDI0DQoJYy0yLjIxOCwwLTQuMzEyLDAuODk1LTYsMi41MzRDNDAuMzEyLDI0Ljg5NSwzOC4yMTgsMjQsMzYsMjRzLTQuMzEyLDAuODk1LTYsMi41MzRDMjguMzEyLDI0Ljg5NSwyNi4yMTgsMjQsMjQsMjQNCglzLTQuMzEyLDAuODk1LTYsMi41MzRDMTYuMzEyLDI0Ljg5NSwxNC4yMTgsMjQsMTIsMjRjLTEuNzUsMC0zLjQxOCwwLjU2Ni00Ljg3NSwxLjYwNUM4LjMyNywxNC4wNDQsMTguMTI3LDUsMzAsNQ0KCXMyMS42NzMsOS4wNDQsMjIuODc1LDIwLjYwNUM1MS40MTgsMjQuNTY2LDQ5Ljc1LDI0LDQ4LDI0eiIvPg0KPC9zdmc+DQo=",name:"Weather",members:[]},type:"enum"},"enum.functions.heating":{_id:"enum.functions.heating",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTQ0MC4zNzEsMTU5LjI5MWM4LjA1MSwwLDE1LjQwMy0zLjAzNSwyMC45ODMtOC4wMTZINTA0LjVjNC4xNDIsMCw3LjUtMy4zNTgsNy41LTcuNWMwLTQuMTQyLTMuMzU4LTcuNS03LjUtNy41aC0zMy43NjMNCgkJYzAuNzY0LTIuNzE2LDEuMTgyLTUuNTc2LDEuMTgyLTguNTMzYzAtMi45NTctMC40MTgtNS44MTYtMS4xODItOC41MzJINTA0LjVjNC4xNDIsMCw3LjUtMy4zNTgsNy41LTcuNQ0KCQljMC00LjE0Mi0zLjM1OC03LjUtNy41LTcuNWgtNDMuMTQ2Yy01LjU4LTQuOTgxLTEyLjkzMi04LjAxNi0yMC45ODMtOC4wMTZjLTYuMTMzLDAtMTEuODU5LDEuNzY1LTE2LjcwNyw0LjgwNQ0KCQljLTEuMzQyLTExLjcxMS0xMS4zMDktMjAuODM3LTIzLjM3My0yMC44MzdoLTI0LjA0OWMtMTAuMzU0LDAtMTkuMTYsNi43MjQtMjIuMywxNi4wMzJoLTE5LjUzDQoJCWMtMy4xMzktOS4zMDgtMTEuOTQ2LTE2LjAzMi0yMi4zLTE2LjAzMmgtMjQuMDQ4Yy0xMC4zNTQsMC0xOS4xNiw2LjcyNC0yMi4zLDE2LjAzMmgtMTkuNTMNCgkJYy0zLjEzOS05LjMwOC0xMS45NDYtMTYuMDMyLTIyLjMtMTYuMDMyaC0yNC4wNDhjLTEwLjM1NCwwLTE5LjE2LDYuNzI0LTIyLjMsMTYuMDMyaC0xOS41Mw0KCQljLTMuMTM5LTkuMzA4LTExLjk0Ni0xNi4wMzItMjIuMy0xNi4wMzJoLTI0LjA0OWMtMTAuMzU0LDAtMTkuMTYsNi43MjQtMjIuMywxNi4wMzJINjkuODgNCgkJYy0zLjEzOS05LjMwOC0xMS45NDYtMTYuMDMyLTIyLjMtMTYuMDMySDIzLjUzMkMxMC41NTcsODAuMTYxLDAsOTAuNzE4LDAsMTAzLjY5M3YzMDQuNjEzYzAsMTIuOTc2LDEwLjU1NywyMy41MzIsMjMuNTMyLDIzLjUzMg0KCQlINDcuNThjMTAuMzU0LDAsMTkuMTYtNi43MjQsMjIuMy0xNi4wMzJoMTkuNTNjMy4xMzksOS4zMDgsMTEuOTQ2LDE2LjAzMiwyMi4zLDE2LjAzMmgyNC4wNDljMTAuMzU0LDAsMTkuMTYtNi43MjQsMjIuMy0xNi4wMzINCgkJaDE5LjUzYzMuMTM5LDkuMzA4LDExLjk0NiwxNi4wMzIsMjIuMywxNi4wMzJoMjQuMDQ4YzEwLjM1NCwwLDE5LjE2LTYuNzI0LDIyLjMtMTYuMDMyaDE5LjUzDQoJCWMzLjEzOSw5LjMwOCwxMS45NDYsMTYuMDMyLDIyLjMsMTYuMDMyaDI0LjA0OGMxMC4zNTQsMCwxOS4xNi02LjcyNCwyMi4zLTE2LjAzMmgxOS41M2MzLjEzOSw5LjMwOCwxMS45NDYsMTYuMDMyLDIyLjMsMTYuMDMyDQoJCWgyNC4wNDljMTIuOTc2LDAsMjMuNTMyLTEwLjU1NywyMy41MzItMjMuNTMydi0wLjUxNkg1MDQuNWM0LjE0MiwwLDcuNS0zLjM1OCw3LjUtNy41YzAtNC4xNDItMy4zNTgtNy41LTcuNS03LjVoLTgwLjY3N3YtMTcuMDY1DQoJCUg1MDQuNWM0LjE0MiwwLDcuNS0zLjM1OCw3LjUtNy41YzAtNC4xNDItMy4zNTgtNy41LTcuNS03LjVoLTgwLjY3N1YxNTQuNTg3QzQyOC42MzcsMTU3LjU2Niw0MzQuMzA2LDE1OS4yOTEsNDQwLjM3MSwxNTkuMjkxeg0KCQkgTTQ0MC4zNzEsMTExLjE5M2M5LjEyNSwwLDE2LjU0OCw3LjQyMywxNi41NDgsMTYuNTQ4cy03LjQyMywxNi41NDktMTYuNTQ4LDE2LjU0OXMtMTYuNTQ4LTcuNDI0LTE2LjU0OC0xNi41NDkNCgkJUzQzMS4yNDYsMTExLjE5Myw0NDAuMzcxLDExMS4xOTN6IE02My42MTMsMzM2LjY3NmMtNC4xNDIsMC03LjUsMy4zNTgtNy41LDcuNXY2NC4xM2MwLDQuNzA1LTMuODI4LDguNTMzLTguNTMyLDguNTMzSDIzLjUzMg0KCQljLTQuNzA1LDAtOC41MzItMy44MjgtOC41MzItOC41MzJWMTAzLjY5M2MwLTQuNzA1LDMuODI4LTguNTMyLDguNTMyLTguNTMySDQ3LjU4YzQuNzA1LDAsOC41MzIsMy44MjgsOC41MzIsOC41MzJWMzEyLjExDQoJCWMwLDQuMTQyLDMuMzU4LDcuNSw3LjUsNy41YzQuMTQyLDAsNy41LTMuMzU4LDcuNS03LjVWMTU5LjI5aDE3LjA2NHYxOTMuNDE5SDcxLjExM3YtOC41MzMNCgkJQzcxLjExMywzNDAuMDM0LDY3Ljc1NSwzMzYuNjc2LDYzLjYxMywzMzYuNjc2eiBNODguMTc3LDQwMC44MDZINzEuMTEzdi0zMy4wOTdoMTcuMDY0VjQwMC44MDZ6IE04OC4xNzcsMTQ0LjI5SDcxLjExM3YtMzMuMDk3DQoJCWgxNy4wNjRWMTQ0LjI5eiBNMTQ0LjI5LDQwOC4zMDZjMC4wMDEsNC43MDUtMy44MjcsOC41MzMtOC41MzIsOC41MzNoLTI0LjA0OWMtNC43MDUsMC04LjUzMi0zLjgyOC04LjUzMi04LjUzMlYxMDMuNjkzDQoJCWMwLTQuNzA1LDMuODI4LTguNTMyLDguNTMyLTguNTMyaDI0LjA0OWM0LjcwNSwwLDguNTMyLDMuODI4LDguNTMyLDguNTMyVjQwOC4zMDZ6IE0xNzYuMzU1LDQwMC44MDZoLTE3LjA2NHYtMzMuMDk3aDE3LjA2NA0KCQlWNDAwLjgwNnogTTE3Ni4zNTUsMzUyLjcxaC0xNy4wNjRWMTU5LjI5MWgxNy4wNjRWMzUyLjcxeiBNMTc2LjM1NSwxNDQuMjkxaC0xNy4wNjR2LTMzLjA5N2gxNy4wNjRWMTQ0LjI5MXogTTIzMi40NjgsNDA4LjMwNg0KCQljMCw0LjcwNS0zLjgyOCw4LjUzMy04LjUzMiw4LjUzM2gtMjQuMDQ4Yy00LjcwNSwwLTguNTMyLTMuODI4LTguNTMyLTguNTMyVjEwMy42OTNjMC00LjcwNSwzLjgyOC04LjUzMiw4LjUzMi04LjUzMmgyNC4wNDgNCgkJYzQuNzA1LDAsOC41MzIsMy44MjgsOC41MzIsOC41MzJWNDA4LjMwNnogTTI2NC41MzIsNDAwLjgwNmgtMTcuMDY0di0zMy4wOTdoMTcuMDY0VjQwMC44MDZ6IE0yNjQuNTMyLDM1Mi43MWgtMTcuMDY0VjE1OS4yOTENCgkJaDE3LjA2NFYzNTIuNzF6IE0yNjQuNTMyLDE0NC4yOTFoLTE3LjA2NHYtMzMuMDk3aDE3LjA2NFYxNDQuMjkxeiBNMzIwLjY0NSw0MDguMzA2YzAsNC43MDUtMy44MjgsOC41MzMtOC41MzIsOC41MzNoLTI0LjA0OA0KCQljLTQuNzA1LDAtOC41MzItMy44MjgtOC41MzItOC41MzJWMTAzLjY5M2MwLTQuNzA1LDMuODI4LTguNTMyLDguNTMyLTguNTMyaDI0LjA0OGM0LjcwNSwwLDguNTMyLDMuODI4LDguNTMyLDguNTMyVjQwOC4zMDZ6DQoJCSBNMzM1LjY0NSwxMTEuMTkzaDE3LjA2NHYzMy4wOTdoLTE3LjA2NFYxMTEuMTkzeiBNMzUyLjcwOSw0MDAuODA3aC0xNy4wNjRWMzY3LjcxaDE3LjA2NFY0MDAuODA3eiBNNDA4LjgyMyw0MDguMzA3DQoJCWMwLDQuNzA1LTMuODI4LDguNTMyLTguNTMyLDguNTMyaC0yNC4wNDljLTQuNzA1LDAtOC41MzItMy44MjgtOC41MzItOC41MzJWMTk5Ljg5YzAtNC4xNDItMy4zNTgtNy41LTcuNS03LjUNCgkJYy00LjE0MiwwLTcuNSwzLjM1OC03LjUsNy41djE1Mi44MmgtMTcuMDY0VjE1OS4yOTFoMTcuMDY0djguNTMzYzAsNC4xNDIsMy4zNTgsNy41LDcuNSw3LjVjNC4xNDIsMCw3LjUtMy4zNTgsNy41LTcuNXYtNjQuMTMNCgkJYzAtNC43MDUsMy44MjgtOC41MzIsOC41MzItOC41MzJoMjQuMDQ5YzQuNzA1LDAsOC41MzIsMy44MjgsOC41MzIsOC41MzJWNDA4LjMwN3oiLz4NCjwvZz4NCjwvc3ZnPg0K",name:"Heating",members:[]},type:"enum"},"enum.functions.backlight":{_id:"enum.functions.backlight",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTExLjk5MSA1MTEuOTkxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTEuOTkxIDUxMS45OTE7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik05MS40OSwzMzYuNTcybC0yMS4zMzMsNDIuNjY3Yy0yLjYyNCw1LjI2OS0wLjQ5MSwxMS42NjksNC43NzksMTQuMzE1YzEuNTM2LDAuNzQ3LDMuMTU3LDEuMTA5LDQuNzU3LDEuMTA5DQoJCWMzLjkwNCwwLDcuNjU5LTIuMTc2LDkuNTM2LTUuODg4bDIxLjMzMy00Mi42NjdjMi42NDUtNS4yNjksMC41MTItMTEuNjY5LTQuNzU3LTE0LjMxNQ0KCQlDMTAwLjU1NywzMjkuMTY5LDk0LjE1NywzMzEuMzI0LDkxLjQ5LDMzNi41NzJ6Ii8+DQoJPHBhdGggZD0iTTUwNy41NTQsMTgzLjM1NmMtMi43NzMtMi4wMjctNi4zMzYtMi41MzktOS42LTEuNDkzbC00OS40MDgsMTYuNDY5Yy0xMy4wOTksNC4zNzMtMjEuODg4LDE2LjU3Ni0yMS44ODgsMzAuMzc5djM2Ljg4NQ0KCQljLTI0LjMyLTQuOTQ5LTQyLjY2Ny0yNi40OTYtNDIuNjY3LTUyLjI0NXYtODUuMzMzYzAtMzEuMjMyLTEyLjEzOS02MC43MTUtMzQuMzA0LTgzLjExNQ0KCQljLTIyLjMxNS0yMi4xMDEtNTEuNzk3LTM0LjI0LTgzLjAyOS0zNC4yNGMtNjQuNjgzLDAtMTE3LjMzMyw1Mi42NTEtMTE3LjMzMywxMTcuMzMzdjUzLjMzM2gtMzJjLTE3LjY0MywwLTMyLDE0LjM1Ny0zMiwzMg0KCQl2NDAuMTQ5TDEuMTIyLDQyMS45MDVjLTEuNjQzLDMuMzA3LTEuNDcyLDcuMjMyLDAuNDQ4LDEwLjM2OGMxLjk2MywzLjEzNiw1LjM5Nyw1LjA1Niw5LjA4OCw1LjA1Nmg3NS43NTUNCgkJYzUuMjI3LDM2LjA5NiwzNi4wNzUsNjQsNzMuNTc5LDY0czY4LjM1Mi0yNy45MDQsNzMuNTc5LTY0aDc1Ljc1NWMwLjE0OSwwLDAuMzIsMC4wMjEsMC40MjcsMA0KCQljNS44ODgsMCwxMC42NjctNC43NzksMTAuNjY3LTEwLjY2N2MwLTIuNzUyLTEuMDI0LTUuMjQ4LTIuNzMxLTcuMTI1bC04My4wMjktMTY2LjA1OXYtNDAuMTQ5YzAtMTcuNjQzLTE0LjM1Ny0zMi0zMi0zMmgtMzINCgkJdi01My4zMzNjMC01Mi45MjgsNDMuMDcyLTk2LDk2LTk2YzI1LjU1NywwLDQ5LjcyOCw5Ljk2Myw2Ny45NDcsMjcuOTg5YzE4LjA5MSwxOC4yODMsMjguMDUzLDQyLjQ1MywyOC4wNTMsNjguMDExdjg1LjMzMw0KCQljMCwzNy41MDQsMjcuOTA0LDY4LjM1Miw2NCw3My41Nzl2MzkuMDRjMCwxMy43ODEsOC43ODksMjYuMDA1LDIxLjg2NywzMC4zNTdsNDkuNDA4LDE2LjQ2OQ0KCQljMS4xMzEsMC4zNjMsMi4yNjEsMC41NTUsMy4zOTIsMC41NTVjMi4yMTksMCw0LjM5NS0wLjY4Myw2LjIyOS0yLjAyN2MyLjc5NS0xLjk4NCw0LjQzNy01LjIwNSw0LjQzNy04LjY0VjE5MS45OTYNCgkJQzUxMS45OTEsMTg4LjU2MSw1MTAuMzQ5LDE4NS4zNCw1MDcuNTU0LDE4My4zNTZ6IE0xNTkuOTkxLDQ3OS45OTZjLTI1Ljc0OSwwLTQ3LjMxNy0xOC4zNDctNTIuMjY3LTQyLjY2N2gxMDQuNTMzDQoJCUMyMDcuMzA5LDQ2MS42NDksMTg1Ljc0MSw0NzkuOTk2LDE1OS45OTEsNDc5Ljk5NnogTTI5Mi4wODcsNDE1Ljk5NmgtNjguMDk2aC0xMjhIMjcuOTE3bDc0LjY2Ny0xNDkuMzMzaDExNC44MzcNCgkJTDI5Mi4wODcsNDE1Ljk5NnogTTIwMi42NTgsMjAyLjY2MmM1Ljg2NywwLDEwLjY2Nyw0LjgsMTAuNjY3LDEwLjY2N3YzMkgxMDYuNjU4di0zMmMwLTUuODY3LDQuOC0xMC42NjcsMTAuNjY3LTEwLjY2N0gyMDIuNjU4eg0KCQkgTTQ5MC42NTgsMzQ3Ljg3OGwtMzUuMzcxLTExLjgxOWMtNC4zNzMtMS40MjktNy4yOTYtNS41MDQtNy4yOTYtMTAuMTEydi05Ny4yNTljMC00LjYwOCwyLjkyMy04LjY2MSw3LjI5Ni0xMC4xMTINCgkJbDM1LjM3MS0xMS43OTdWMzQ3Ljg3OHoiLz4NCjwvZz4NCjwvc3ZnPg0K",name:"Backlight",members:[]},type:"enum"},"enum.functions.household":{_id:"enum.functions.household",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgJy0vL1czQy8vRFREIFNWRyAxLjEvL0VOJyAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIj4KICA8Zz4KICAgIDxnPgogICAgICA8cGF0aCBkPSJtMjU2LDkyLjNjLTc0LjIsMC0xMjcuOCw1NS4zLTEzNi4zLDExNC43LTUuMywzOS42IDcuNSw3OC4yIDM0LjEsMTA3LjQgMjMuNCwyNSAzNi4yLDU4LjQgMzYuMiw5Mi44bC0uMSw1NC4yYzAsMjEuOSAxOC4xLDM5LjYgNDAuNSwzOS42aDUyLjJjMjIuNCwwIDQwLjUtMTcuNyA0MC41LTM5LjZsLjEtNTQuMmMwLTM1LjQgMTEuNy02Ny44IDM0LjEtOTAuNyAyNC41LTI1IDM3LjMtNTcuMyAzNy4zLTkwLjctMC4xLTc0LjEtNjMtMTMzLjUtMTM4LjYtMTMzLjV6bTQ2LjgsMzY5LjFjMCwxMC40LTguNSwxOC44LTE5LjIsMTguOGgtNTIuMmMtMTAuNywwLTE5LjItOC4zLTE5LjItMTguOHYtMjRoOTAuNXYyNHptMzkuNi0xNTkuNWMtMjYuNiwyNy4xLTQwLjUsNjQuNi00MC41LDEwNS4zdjkuNGgtOTAuNXYtOS40YzAtMzguNi0xNi03Ny4xLTQyLjYtMTA2LjMtMjMuNC0yNS0zMy01Ny4zLTI4LjgtOTAuNyA3LjUtNTAgNTQtOTcgMTE2LjEtOTcgNjUsMCAxMTcuMiw1MS4xIDExNy4yLDExMi42IDAsMjguMS0xMC43LDU1LjItMzAuOSw3Ni4xeiIvPgogICAgICA8cmVjdCB3aWR0aD0iMjEuMyIgeD0iMjQ1LjMiIHk9IjExIiBoZWlnaHQ9IjUwIi8+CiAgICAgIDxwb2x5Z29uIHBvaW50cz0iMzg1LjEsMTA3LjQgNDAwLDEyMi4zIDQzNi41LDg3LjIgNDIxLjUsNzIuMyAgICIvPgogICAgICA8cmVjdCB3aWR0aD0iNTIuMiIgeD0iNDQ4LjgiIHk9IjIzNi4yIiBoZWlnaHQ9IjIwLjkiLz4KICAgICAgPHJlY3Qgd2lkdGg9IjUyLjIiIHg9IjExIiB5PSIyMzYuMiIgaGVpZ2h0PSIyMC45Ii8+CiAgICAgIDxwb2x5Z29uIHBvaW50cz0iOTAuMSw3Mi4yIDc1LjEsODcuMSAxMTEuNiwxMjIuMiAxMjYuNSwxMDcuMyAgICIvPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==",name:"Household",members:[]},type:"enum"},"enum.functions.audio":{_id:"enum.functions.audio",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDc3LjIxNiA0NzcuMjE2IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0NzcuMjE2IDQ3Ny4yMTY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik00NTMuODU4LDEwNS4xMTZ2LTkxLjZjMC00LjMtMi4xLTguNC01LjUtMTAuOWMtMy41LTIuNS04LTMuMy0xMi4xLTJsLTI3Mi45LDg2LjdjLTUuNiwxLjgtOS40LDctOS40LDEyLjl2OTEuN3YwLjF2MTc1LjMNCgkJYy0xNC4zLTkuOS0zMi42LTE1LjMtNTEuOC0xNS4zYy0yMC4zLDAtMzkuNiw2LjEtNTQuMywxNy4xYy0xNS44LDExLjktMjQuNSwyOC0yNC41LDQ1LjVzOC43LDMzLjYsMjQuNSw0NS41DQoJCWMxNC43LDExLDMzLjksMTcuMSw1NC4zLDE3LjFzMzkuNi02LjEsNTQuMy0xNy4xYzE1LjgtMTEuOSwyNC41LTI4LDI0LjUtNDUuNXYtMjEyLjhsMjQ1LjktNzguMnYxNTYuNg0KCQljLTE0LjMtOS45LTMyLjYtMTUuMy01MS44LTE1LjNjLTIwLjMsMC0zOS42LDYuMS01NC4zLDE3LjFjLTE1LjgsMTEuOS0yNC41LDI4LTI0LjUsNDUuNXM4LjcsMzMuNiwyNC41LDQ1LjUNCgkJYzE0LjcsMTEsMzMuOSwxNy4xLDU0LjMsMTcuMXMzOS42LTYuMSw1NC4zLTE3LjFjMTUuOC0xMS45LDI0LjUtMjgsMjQuNS00NS41di0yMjIuMw0KCQlDNDUzLjg1OCwxMDUuMTE2LDQ1My44NTgsMTA1LjExNiw0NTMuODU4LDEwNS4xMTZ6IE0xMDIuMTU4LDQ1MC4yMTZjLTI4LjEsMC01MS44LTE2LjMtNTEuOC0zNS42YzAtMTkuMywyMy43LTM1LjYsNTEuOC0zNS42DQoJCXM1MS44LDE2LjMsNTEuOCwzNS42QzE1My45NTgsNDM0LjAxNiwxMzAuMjU4LDQ1MC4yMTYsMTAyLjE1OCw0NTAuMjE2eiBNMTgwLjk1OCwxNzMuNDE2di02My40bDI0NS45LTc4LjF2NjMuNEwxODAuOTU4LDE3My40MTZ6DQoJCSBNMzc1LjE1OCwzNjMuMTE2Yy0yOC4xLDAtNTEuOC0xNi4zLTUxLjgtMzUuNmMwLTE5LjMsMjMuNy0zNS42LDUxLjgtMzUuNnM1MS44LDE2LjMsNTEuOCwzNS42DQoJCUM0MjYuODU4LDM0Ni44MTYsNDAzLjE1OCwzNjMuMTE2LDM3NS4xNTgsMzYzLjExNnoiLz4NCjwvZz4NCjwvc3ZnPg0K",name:"Audio/Music",members:[]},type:"enum"},"enum.functions.security":{_id:"enum.functions.security",common:{icon:"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTEyIDUxMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggZD0iTTI1Niw0MC4wMWMtNS41MzgsMC05Ljk5LDQuNDYtOS45OSw5Ljk5YzAsNS4xNDcsMy44NzIsOS40Myw4Ljk5LDkuOTM4YzUuOTI1LDAuNTg4LDEwLjk5LTQuMDI3LDEwLjk5LTkuOTM4DQoJCUMyNjUuOTksNDQuNDYyLDI2MS41Myw0MC4wMSwyNTYsNDAuMDF6Ii8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBkPSJNNDU2LDYwYy0yNy41NywwLTUwLTIyLjQzLTUwLTUwYzAtNS41MjItNC40NzgtMTAtMTAtMTBIMTE2Yy01LjUyMiwwLTEwLDQuNDc4LTEwLDEwYzAsMjcuNTctMjIuNDMsNTAtNTAsNTANCgkJYy01LjUyMiwwLTEwLDQuNDc4LTEwLDEwdjE2My4xOWMwLDEyNy4xNzcsODIuODk1LDI0MS4xMzUsMjA3LjEyOCwyNzguMzg5YzAuOTM3LDAuMjgsMS45MDQsMC40MjEsMi44NzIsMC40MjENCgkJYzAuOTY4LDAsMS45MzctMC4xNDEsMi44NzMtMC40MjJDMzgwLjQxNSw0NzUuMTE5LDQ2NiwzNjMuMTQ5LDQ2NiwyMzMuMTlWNzBDNDY2LDY0LjQ3OCw0NjEuNTIyLDYwLDQ1Niw2MHogTTQ0NiwyMzMuMTkNCgkJYzAsMTE5LjQ0OC03Ni4yMjEsMjIyLjg5Mi0xOTAsMjU4LjM1M0MxNDMuMTI4LDQ1Ni4zNjUsNjYsMzUxLjk4NCw2NiwyMzMuMTlWNzkuMjg4Qzk2LjYxMSw3NC44OSwxMjAuODksNTAuNjExLDEyNS4yODgsMjANCgkJaDI2MS40MjRDMzkxLjExLDUwLjYxMSw0MTUuMzg5LDc0Ljg5LDQ0Niw3OS4yODhWMjMzLjE5eiIvPg0KPC9nPg0KPGc+DQoJPHBhdGggZD0iTTQyMC4wMTIsOTIuNDljLTIwLjg1NC05LjEzMy0zNy4zNjktMjUuNjQ4LTQ2LjUwMi00Ni41MDJDMzcxLjkxNiw0Mi4zNSwzNjguMzIyLDQwLDM2NC4zNSw0MGgtNjguMzcNCgkJYy01LjUyMiwwLTEwLDQuNDc4LTEwLDEwczQuNDc4LDEwLDEwLDEwaDYyLjA0N2MxMC41NjUsMjAuNjgxLDI3LjI5MiwzNy40MDcsNDcuOTczLDQ3Ljk3M1YyMzMuMTkNCgkJYzAsOTcuODYzLTU4Ljc0OSwxODIuMzAzLTE1MCwyMTYuMTA0Yy05MS4yNTEtMzMuODAyLTE1MC0xMTguMjQxLTE1MC0yMTYuMTA0VjEwNy45NzNDMTI2LjY4MSw5Ny40MDcsMTQzLjQwNyw4MC42ODEsMTUzLjk3Myw2MA0KCQloNjIuMDQ3YzUuNTIyLDAsMTAtNC40NzgsMTAtMTBzLTQuNDc4LTEwLTEwLTEwaC02OC4zN2MtMy45NzIsMC03LjU2NiwyLjM1MS05LjE2LDUuOTg4DQoJCWMtOS4xMzMsMjAuODU0LTI1LjY0OCwzNy4zNjktNDYuNTAyLDQ2LjUwMkM4OC4zNTEsOTQuMDg0LDg2LDk3LjY3OSw4NiwxMDEuNjV2MTMxLjU0YzAsMTA3LjIxMyw2Ni4zMTEsMjAwLjY1MywxNjYuNjY0LDIzNi4xNjYNCgkJYzEuMDc5LDAuMzgyLDIuMjA3LDAuNTczLDMuMzM2LDAuNTczYzEuMTI5LDAsMi4yNTctMC4xOTEsMy4zMzYtMC41NzNDMzU5LjYwNSw0MzMuODczLDQyNiwzNDAuNDksNDI2LDIzMy4xOVYxMDEuNjUNCgkJQzQyNiw5Ny42NzgsNDIzLjY0OSw5NC4wODQsNDIwLjAxMiw5Mi40OXoiLz4NCjwvZz4NCjxnPg0KCTxwYXRoIGQ9Ik0yNTYsMTQ2Yy00OS42MjYsMC05MCw0MC4zNzQtOTAsOTBjMCw0OS42MjYsNDAuMzc0LDkwLDkwLDkwYzQ5LjYyNiwwLDkwLTQwLjM3NCw5MC05MEMzNDYsMTg2LjM3NCwzMDUuNjI2LDE0NiwyNTYsMTQ2eg0KCQkgTTI1NiwzMDZjLTM4LjU5OCwwLTcwLTMxLjQwMi03MC03MGMwLTM4LjU5OCwzMS40MDItNzAsNzAtNzBjMzguNTk4LDAsNzAsMzEuNDAyLDcwLDcwQzMyNiwyNzQuNTk4LDI5NC41OTgsMzA2LDI1NiwzMDZ6Ii8+DQo8L2c+DQo8Zz4NCgk8cGF0aCBkPSJNMzAzLjA3MSwyMDguOTI4Yy0zLjkwNi0zLjkwNC0xMC4yMzYtMy45MDQtMTQuMTQzLDBMMjQ2LDI1MS44NTdsLTEyLjkyOS0xMi45MjhjLTMuOTA2LTMuOTA0LTEwLjIzNi0zLjkwNC0xNC4xNDMsMA0KCQljLTMuOTA1LDMuOTA1LTMuOTA1LDEwLjIzNywwLDE0LjE0M2wyMCwyMEMyNDAuODgyLDI3NS4wMjMsMjQzLjQ0LDI3NiwyNDYsMjc2czUuMTE4LTAuOTc3LDcuMDcxLTIuOTI5bDUwLTUwDQoJCUMzMDYuOTc2LDIxOS4xNjYsMzA2Ljk3NiwyMTIuODM0LDMwMy4wNzEsMjA4LjkyOHoiLz4NCjwvZz4NCg0KPC9zdmc+DQo=",name:"Security",members:[]},type:"enum"}}},o=function(){if(g.$grid&&g.$grid.selectId)return o=g.$grid.selectId.bind(g.$grid),g.$grid.selectId.apply(g.$grid,arguments)};function h(e,t,n,i){if(d.length){var a=d.shift();"delObject"===a.name?g.main.socket.emit(a.name,a.id,function(){setTimeout(function(){h(void 0,void 0,void 0,i)},0)}):g.main.socket.emit(a.name,a.id,a.obj,function(){setTimeout(function(){h(void 0,void 0,void 0,i)},0)})}else!function a(s,o,r,c){if(s!==o&&g.main.objects[o])b(_("Name yet exists!"),!0),g.init(!0),c&&c();else if(s===o)!r||void 0===r.name&&void 0===r.icon&&void 0===r.color||d.push({name:"extendObject",id:s,obj:{common:r}}),c&&c();else if(g.main.objects[s]&&g.main.objects[s].common&&g.main.objects[s].common.nondeletable)b(_('Change of enum\'s id "%s" is not allowed!',s),!0),g.init(!0),c&&c();else{for(var e=s.length+1,l=[],t=0;t<g.list.length;t++)g.list[t].substring(0,e)===s+"."&&l.push(g.list[t]);g.main.socket.emit("getObject",s,function(e,i){setTimeout(function(){if(i){i._id=o,i._rev&&delete i._rev,r&&void 0!==r.name&&(i.common.name=r.name),r&&void 0!==r.icon&&(i.common.icon=r.icon),r&&void 0!==r.color&&(i.common.color=r.color),d.push({name:"delObject",id:s}),d.push({name:"setObject",id:o,obj:i});for(var e=0,t=0;t<l.length;t++){var n=l[t].replace(s+".",o+".");e++,a(l[t],n,null,function(){!--e&&c&&c()})}!l.length&&c&&c()}},0)})}}(e,t,n,function(){d.length?h(void 0,void 0,void 0,i):i&&i()})}function f(e){var t,n="";if(e){var i=e.replace(/[.#\\\/&?]+/g,"-");if(s[e])for(t in s[e])s[e].hasOwnProperty(t)&&-1===g.list.indexOf(t)&&(n+='<li class="new-group-item" data-id="'+t+'" data-enum="'+e+'"><a>'+g.main.getIconFromObj(s[e][t])+p(s[e][t])+"</a></li>");n&&(n+='<li class="divider"></li>'),n+='<li class="new-group-item" data-enum="'+e+'"><a><i class="material-icons">control_point</i><span>'+_("custom group")+"</span></a></li>",g.$gridEnum.find("#btn-new-group-"+i).html(n),g.$gridEnum.find('.btn-new-group-btn[data-target="btn-new-group-'+i+'"]').dropdown({constrainWidth:!1}),g.$gridEnum.find("#btn-new-group-"+i).find(".new-group-item").off("click").on("click",function(){var e=$(this).data("id"),t=$(this).data("enum");if(e){var n=t.replace(/[.#\\\/&?]+/g,"-");g.main.saveConfig("enums-active","enum-"+n),g.main.socket.emit("setObject",e,s[t][e],function(e){e&&g.main.showError(e)})}else v(null,t)})}else{for(t in a)a.hasOwnProperty(t)&&-1===g.list.indexOf(t)&&(n+='<li class="new-enum-item" data-id="'+t+'"><a>'+g.main.getIconFromObj(a[t])+p(a[t])+"</a></li>");n&&(n+='<li class="divider"></li>'),n+='<li class="new-enum-item"><a><i class="material-icons">control_point</i><span>'+_("custom enum")+"</span></a></li>",g.$gridEnum.find("#btn-new-enum").html(n),g.$gridEnum.find(".btn-new-enum-btn").dropdown({constrainWidth:!1}),g.$gridEnum.find(".new-enum-item").off("click").on("click",function(){var e=$(this).data("id");if(e){var t=e.replace(/[.#\\\/&?]+/g,"-");g.main.saveConfig("enums-active","enum-"+t),g.main.socket.emit("setObject",e,a[e],function(e){e&&g.main.showError(e)})}else v(null)})}}function p(e,t){var n;(n=t?e[t]:e)&&n.common&&n.common.name?n=translateName(n.common.name):n=(n=t.split(".").pop())[0].toUpperCase()+n.substring(1).toLowerCase();return n}function r(e,t,n){var i,a,s,o=g.main.objects[e],r=e.replace(/[.#\\\/&?]+/g,"-"),c='<div class="row enum-buttons" data-id="'+e+'"> <div class="col s12 "> <a class="btn-floating waves-effect waves-light blue btn-small dropdown-trigger btn-new-group-btn" title="'+_("New enum")+'" data-target="btn-new-group-'+r+'"><i class="material-icons">library_add</i></a> <ul id="btn-new-group-'+r+'" class="dropdown-content" data-id="'+e+'"></ul> <a class="btn-floating waves-effect waves-light btn-small btn-edit-category" title="'+_("Edit category")+'" data-id="'+e+'"> <i class="material-icons">edit</i> </a> <a class="btn-floating waves-effect btn-small waves-light red lighten-2 btn-del-category '+(o&&o.common&&(o.common.dontDelete||o.common["object-non-deletable"])?"disabled":"")+'" title="'+_("Delete category")+'" data-id="'+e+'"> <i class="material-icons">delete</i> </a> <div class="input-field"><input type="text" class="filter-input autocomplete" placeholder="'+_("Filter")+'"><label></label>\n <a class="filter-clear btn-floating btn-very-small red lighten-3" title="'+_("clear")+'"><i class="material-icons">clear</i></a></div>\n </div></div>';c+='<div class="row enum-body"><div class="col s12 enum-collection" data-id="'+e+'"><ul class="collection">';for(var l=0;l<g.list.length;l++)if(g.list[l].substring(0,e.length+1)===e+"."){var d=g.main.objects[g.list[l]],u="";if(d&&d.common&&d.common.color&&(u="background: "+d.common.color+"; ",g.main.invertColor(d.common.color)&&(!0,u+="color: white;")),c+='<li class="collection-item avatar" data-id="'+g.list[l]+'" style="'+u+'">'+g.main.getIcon(g.list[l],null,null,"icon")+'<span class="title">'+p(g.main.objects,g.list[l])+"</span><p>"+g.list[l]+"</p><br>",d&&d.common&&d.common.members&&d.common.members.length)for(var m=0;m<d.common.members.length;m++)c+=(i=d.common.members[m],a=g.list[l],s=void 0,s="",s+='<div class="chip" title="'+i+'">'+g.main.getIcon(i)+'<span><span class="chip-name">'+p(g.main.objects,i)+'</span></span><i class="close material-icons" data-enum="'+a+'" data-id="'+i+'">close</i></div>');c+='<a class="edit-content" data-id="'+g.list[l]+'"><i class="material-icons">edit</i></a>',c+='<a class="delete-content '+(d&&d.common&&(d.common.dontDelete||d.common["object-non-deletable"])?"disabled":"")+'" data-id="'+g.list[l]+'"><i class="material-icons">delete</i></a>',c+="</li>"}c+="</ul></div></div>",t.html(c),f(e),n&&t.find(".enum-collection").scrollTop(n),function(n){for(var e=g.$gridList.find('.enum-buttons[data-id="'+n+'"] .filter-input'),t={},i=0;i<g.list.length;i++){var a=g.list[i];if(a.substring(0,n.length+1)===n+"."){var s=p(g.main.objects,a),o=null;g.main.objects[a]&&g.main.objects[a].common&&g.main.objects[a].common.icon&&(o=g.main.objects[a].common.icon),t[s]=o}}var r=g.$gridList.find('.enum-buttons[data-id="'+n+'"] .filter-clear');e.mautocomplete({data:t,minLength:0,limit:10}).on("change",function(){var i,a,e,t=$(this).val();i=n,a=t,e=g.$gridList.find('.enum-collection[data-id="'+i+'"] .collection-item'),a?(a=a.toLowerCase(),e.each(function(){var e=$(this),t=e.data("id"),n=p(g.main.objects,t);-1!==n.toLowerCase().indexOf(a)?e.show():-1!==t.substring(i.length).toLowerCase().indexOf(a)?e.show():e.hide()})):e.show(),$(this).val()?r.show():r.hide(),g.main.saveConfig("filter-"+n,t)}).on("keyup",function(){$(this).trigger("change")}),r.off("click").on("click",function(){e.val("").trigger("change")}),g.main.config["filter-"+n]?e.val(g.main.config["filter-"+n]).trigger("change"):r.hide()}(e)}function n(){var e=g.$gridList.find(".tree-table-body");g.$gridList.removeClass("tree-table-list").addClass("tree-table-tiles"),g.$gridList.find(".tree-table-buttons").remove(),g.$gridList.prepend('<div class="row tree-table-buttons">\n <a class="btn-floating btn-small translateT btn-switch-tiles" title="'+_("change view mode")+'"><i class="material-icons">view_list</i></a>\n <a class="btn-floating waves-effect waves-light btn-small blue dropdown-trigger btn-new-enum-btn translationT" title="'+_("New enum")+'" data-target="btn-new-enum"><i class="material-icons">note_add</i></a>\n <ul id="btn-new-enum" class="dropdown-content"></ul>\n <a class="btn-floating waves-effect waves-light blue btn-small btn-edit translateT" title="'+_("Edit")+'" id="tab-enums-list-edit">\n <i class="material-icons">queue_play_next</i>\n </a>\n </div>');var t='<div class="col s12 cron-main-tab">';t+='<ul class="tabs">';for(var n=0;n<g.list.length;n++)if(2===g.list[n].split(".").length){var i=p(g.main.objects,g.list[n]);t+='<li class="tab col"><a href="#enum-'+encodeURIComponent(g.list[n]).replace(/[.%]/g,"-")+'">'+g.main.getIcon(g.list[n])+'<span class="name">'+i+"</span></a></li>"}t+="</ul>",t+="</div>";for(var a=0;a<g.list.length;a++)2===g.list[a].split(".").length&&(t+='<div id="enum-'+encodeURIComponent(g.list[a]).replace(/[.%]/g,"-")+'" class="col s12 page" data-id="'+g.list[a]+'" data-type="second">',t+="</div>");var s={};e.find(".enum-collection").each(function(){s[$(this).data("id")]=$(this).scrollTop()});try{var o=g.$gridEnum.find(".tree-table-body .collection").find(".collection-item");try{o.droppable("instance")&&o.droppable("destroy")}catch(n){console.error(n)}}catch(n){}e.html(t),0<e.find(".tabs li").length&&(e.find(".tabs").mtabs({onShow:function(e){g.main.saveConfig("enums-active",$(e).attr("id"))}}),g.main.config["enums-active"]&&!g.main.noSelect&&e.find(".tabs").mtabs("select",g.main.config["enums-active"])),e.find(".page").each(function(){r($(this).data("id"),$(this),s[$(this).data("id")])}),e.find(".btn-new-category").on("click",function(){v(null,$(this).data("id"))}),e.find(".btn-edit-category").on("click",function(){v($(this).data("id"))}),e.find(".btn-del-category").on("click",function(){l($(this).data("id"))}),e.find(".edit-content").on("click",function(){v($(this).data("id"))}),e.find(".delete-content").on("click",function(){l($(this).data("id"))}),e.find(".close").on("click",function(){u($(this).data("id"),$(this).data("enum"))}),g.$gridList.find(".btn-edit").off("click").on("click",function(){w(!g.editMode)}),g.$gridList.find(".btn-switch-tiles").off("click").on("click",function(){g.isTiles=!1,g.main.saveConfig("enumIsTiles",g.isTiles),setTimeout(function(){c()},50)}),f(),y(g.$gridEnum.find(".tree-table-body .collection"))}function c(){try{var e=g.$gridEnum.find(".tree-table-main").find("tbody>tr.treetable-enum");e.droppable("instance")&&e.droppable("destroy")}catch(e){console.log(e)}g.$gridList.html("").removeClass("tree-table-tiles").addClass("tree-table-list"),g.$gridList.treeTable({objects:g.main.objects,root:"enum",columns:["title","name"],members:!0,colors:!0,icons:!0,widths:["calc(100% - 250px)","250px"],name:"enums",buttonsWidth:"40px",buttons:[{text:!1,icons:{primary:"ui-icon-trash"},click:function(t,e,n){g.main.objects[t]?"enum"===g.main.objects[t].type?e?g.main.confirmMessage(_("All sub-enums of %s will be deleted too?",t),null,"help",function(e){e&&g.main._delObjects(t,!0,function(e){e?b(_("Error: %s",e),!0):b(_("Deleted"))})}):g.main.confirmMessage(_("Are you sure to delete %s?",t),null,"help",function(e){e&&g.main._delObjects(t,!0,function(e){e?b(_("Error: %s",e),!0):b(_("Deleted"))})}):u(t,n):g.main.objects[n]&&"enum"===g.main.objects[n].type?u(t,n):b(_('Object "<b>%s</b>" does not exists. Update the page.',t))},width:26,height:20},{text:!1,icons:{primary:"ui-icon-pencil"},match:function(e){return g.main.objects[e]&&"enum"===g.main.objects[e].type},click:function(e,t,n){v(e)},width:26,height:20}],panelButtons:[{id:"tab-enums-btn-switch-tiles",title:_("change view mode"),icon:"view_module",click:function(){g.isTiles=!0,g.main.saveConfig("enumIsTiles",g.isTiles),setTimeout(function(){n()},50)}},{id:"tab-enums-list-new-enum",title:_("New enum"),icon:"note_add",click:function(){v(null)}},{id:"tab-enums-list-new-category",title:_("New category"),icon:"library_add",click:function(){v(null,g.enumEdit)}},{id:"tab-enums-list-edit",title:_("Edit"),icon:"edit",click:function(){w(!g.editMode)}}],onChange:function(e,t){if(e!==t){g.enumEdit=e;var n=g.main.objects[e];if(n&&"enum"===n.type)$("#tab-enums-list-new-enum").removeClass("disabled").attr("title",_("Create new enum, like %s","enum.newCategory")),2===e.split(".").length?g.$gridList.find("#tab-enums-list-new-category").removeClass("disabled").attr("title",_("Create new category, like %s",e+".newEnum")):g.$gridList.find("#tab-enums-list-new-category").addClass("disabled");else g.$gridList.find("#tab-enums-list-new-enum").addClass("disabled"),g.$gridList.find("#tab-enums-list-new-category").addClass("disabled")}},onReady:m}),g.$gridList.find(".tree-table-buttons a").addClass("btn-small"),g.$gridList.find("#tab-enums-list-new-enum").addClass("disabled"),g.$gridList.find("#tab-enums-list-new-category").addClass("disabled")}function l(t){if("enum"===g.main.objects[t].type){var e=function(e){for(var t=e.split("."),n=[],i=new RegExp("^"+e.replace(/\./g,"\\.")+"\\."),a=0;a<g.list.length;a++)g.list[a].split(".").length===t.length+1&&i.test(g.list[a])&&n.push(g.list[a]);return n}(t);e&&e.length?g.main.confirmMessage(_("All sub-enums of %s will be deleted too?",t),null,"help",function(e){e&&g.main._delObjects(t,!0,function(e){e?b(_("Error: %s",e),!0):b(_("Deleted"))})}):g.main.confirmMessage(_("Are you sure to delete %s?",t),null,"help",function(e){e&&g.main._delObjects(t,!0,function(e){e?b(_("Error: %s",e),!0):b(_("Deleted"))})})}}function u(i,e){g.main.socket.emit("getObject",e,function(e,t){if(t&&t.common&&t.common.members){var n=t.common.members.indexOf(i);-1!==n?(t.common.members.splice(n,1),g.main.socket.emit("setObject",t._id,t,function(e){e?b(_("Error: %s",e),!0):b(_("Removed"))})):b(_("%s is not in the list"))}})}function i(n,e){g.main.socket.emit("getObject",e,function(e,t){t&&t.common&&(t.common.members=t.common.members||[],-1===t.common.members.indexOf(n)?(t.common.members.push(n),t.common.members.sort(),g.main.socket.emit("setObject",t._id,t,function(e){e?b(_("Error: %s",e),!0):b(_("%s added to %s",n,t._id))})):b(_("Is yet in the list")))})}function b(e,t,n){"boolean"==typeof t&&(n=t,t=3e3),g.main.showToast(g.$gridEnum.find(".tree-table-buttons"),e,null,t,n)}function m(e){g.editMode&&(e||(e=g.$gridEnum.find(".tree-table-main")),e.find("tbody>tr.treetable-enum").droppable({accept:".fancytree-type-draggable",over:function(e,t){if($(this).addClass("tab-accept-item"),$(this).hasClass("not-empty")&&!$(this).hasClass("expanded")){var n;$(this).data("tt-id");(n=$(this).data("timer"))&&clearTimeout(n),$(this).data("timer",setTimeout(function(){g.$gridList.treeTable("expand",$(this).data("tt-id"))},1e3))}},out:function(e,t){var n;$(this).removeClass("tab-accept-item"),(n=$(this).data("timer"))&&(clearTimeout(n),$(this).data("timer",null))},tolerance:"pointer",drop:function(e,t){$(this).removeClass("tab-accept-item"),i(t.draggable.data("id"),$(this).data("tt-id"))}}))}function y(e){if(g.editMode){var t=(e=e||g.$gridEnum.find(".tree-table-body .collection")).find(".collection-item");try{t.droppable("instance")&&t.droppable("destroy")}catch(e){console.error(e)}t.droppable({accept:".fancytree-type-draggable",over:function(e,t){$(this).addClass("tab-accept-item")},out:function(e,t){$(this).removeClass("tab-accept-item")},tolerance:"pointer",drop:function(e,t){$(this).removeClass("tab-accept-item"),i(t.draggable.data("id"),$(this).data("id"))}})}}function v(e,a){var i=!1,s=g.$gridEnum.find("#tab-enums-dialog-new"),o="",t="",n="",r="",c="",l="",d=!0;if(installFileUpload(s,5e4,function(e,t){if(e)b(e,!0);else{if(!t.match(/^data:image\//))return void b(_("Unsupported image format"),!0);s.find(".tab-enums-dialog-create").removeClass("disabled"),c=t,s.find(".tab-enums-dialog-new-icon").show().html('<img class="" />'),s.find(".tab-enums-dialog-new-icon img").attr("src",t),s.find(".tab-enums-dialog-new-icon-clear").show()}}),d=e?(g.main.objects[e]&&g.main.objects[e].common&&(t=translateName(g.main.objects[e].common.name),c=g.main.objects[e].common.icon,l=g.main.objects[e].common.color),n=o=e,s.find("#tab-enums-dialog-preserve-id").prop("checked",!0),!1):(s.find("#tab-enums-dialog-preserve-id").prop("checked",!1),!0),s.find(".tab-enums-dialog-new-title").text(_(a?"Create new category":n?"Rename":"Create new enum")),n){var u=n.split(".");u.length<=2&&(e=!0),n=u.pop(),a=u.join("."),r=n}s.find("#tab-enums-dialog-new-name").val(t).off("change").on("change",function(){var e=s.find("#tab-enums-dialog-new-id"),t=e.val(),n=$(this).val();n=n.replace(FORBIDDEN_CHARS,"_").replace(/\./g,"_").trim().toLowerCase(),!d||t&&i||(e.val(n),s.find("#tab-enums-dialog-new-preview").val((a||"enum")+"."+(n||"#")),M.updateTextFields("#tab-enums-dialog-new")),e.val()&&!e.val().match(/[.\s]/)?(s.find(".tab-enums-dialog-create").removeClass("disabled"),e.removeClass("wrong")):(s.find(".tab-enums-dialog-create").addClass("disabled"),e.addClass("wrong"))}).off("keyup").on("keyup",function(){$(this).trigger("change")}),s.find("#tab-enums-dialog-new-id").val(n).off("change").on("change",function(){if(!s.find("#tab-enums-dialog-preserve-id").prop("checked")){i=!0;var e=$(this).val();s.find("#tab-enums-dialog-new-preview").val((a||"enum")+"."+($(this).val()||"#")),M.updateTextFields("#tab-enums-dialog-new"),e&&!e.match(/[.\s]/)?(s.find(".tab-enums-dialog-create").removeClass("disabled"),$(this).removeClass("wrong")):(s.find(".tab-enums-dialog-create").addClass("disabled"),$(this).addClass("wrong"))}}).off("keyup").on("keyup",function(){$(this).trigger("change")}),s.find("#tab-enums-dialog-new-id").prop("disabled",!d),s.find(".tab-enums-dialog-create").addClass("disabled").off("click").text(_(o?"Change":"Create")).on("click",function(){var e,t,n,i;o?(s.find("#tab-enums-dialog-preserve-id").prop("checked")?(e="object"==typeof g.main.objects[o].common.name?g.main.objects[o].common.name:{en:o.split(".").pop()})[systemLang]=s.find("#tab-enums-dialog-new-name").val():e=s.find("#tab-enums-dialog-new-name").val(),h(o,a+"."+s.find("#tab-enums-dialog-new-id").val(),{name:e,icon:c,color:l},function(e){e?b(_("Error: %s",e),!0):b(_("Updated"))})):(t=(a||"enum")+"."+s.find("#tab-enums-dialog-new-id").val(),n={name:s.find("#tab-enums-dialog-new-name").val(),icon:c,color:l},i=function(e){e?b(_("Error: %s",e),!0,5e3):b(_("Updated"))},g.main.objects[t]?b(_("Name yet exists!"),!0):g.main.socket.emit("setObject",t,{_id:t,common:{name:n.name,members:[],icon:n.icon,color:n.color},type:"enum"},i))}),s.find("#tab-enums-dialog-new-preview").val((a||"enum")+"."+(n||"#")),c?(s.find(".tab-enums-dialog-new-icon").show().html(g.main.getIcon(o)),s.find(".tab-enums-dialog-new-icon-clear").show()):(s.find(".tab-enums-dialog-new-icon").hide(),s.find(".tab-enums-dialog-new-icon-clear").hide()),(l=l||!1)?s.find(".tab-enums-dialog-new-color").val(l):s.find(".tab-enums-dialog-new-color").val(),M.updateTextFields("#tab-enums-dialog-new"),g.main.showToast(s,_("Drop the icons here")),s.find(".tab-enums-dialog-new-upload").off("click").on("click",function(){s.find(".drop-file").trigger("click")}),s.find(".tab-enums-dialog-new-icon-clear").off("click").on("click",function(){c&&(c="",s.find(".tab-enums-dialog-new-icon").hide(),s.find(".tab-enums-dialog-create").removeClass("disabled"),s.find(".tab-enums-dialog-new-icon-clear").hide())}),s.find(".tab-enums-dialog-new-color-clear").off("click").on("click",function(){l&&(s.find(".tab-enums-dialog-create").removeClass("disabled"),s.find(".tab-enums-dialog-new-color-clear").hide(),s.find(".tab-enums-dialog-new-colorpicker").colorpicker({component:".btn",color:l,container:s.find(".tab-enums-dialog-new-colorpicker")}).colorpicker("setValue",""),l="")});var m=Date.now();try{s.find(".tab-enums-dialog-new-colorpicker").colorpicker("destroy")}catch(e){}s.find(".tab-enums-dialog-new-colorpicker").colorpicker({component:".btn",color:l,container:s.find(".tab-enums-dialog-new-colorpicker")}).colorpicker("setValue",l).on("showPicker.colorpicker",function(){var e=s.find(".modal-content");e[0].scrollTop=e[0].scrollHeight}).on("changeColor.colorpicker",function(e){100<Date.now()-m&&(l=e.color.toHex(),s.find(".tab-enums-dialog-create").removeClass("disabled"),s.find(".tab-enums-dialog-new-icon-clear").show())}),l?s.find(".tab-enums-dialog-new-color-clear").show():s.find(".tab-enums-dialog-new-color-clear").hide(),s.find("#tab-enums-dialog-preserve-id").off("change").on("change",function(){$(this).prop("checked")?(s.find("#tab-enums-dialog-new-id").prop("disabled",!0).val(r),n=r,d=!1):(g.main.objects[e]&&g.main.objects[e].common&&(d=!g.main.objects[e].common["object-non-deletable"]&&!g.main.objects[e].common.dontDelete),d&&(n=(n=s.find("#tab-enums-dialog-new-name").val()).replace(FORBIDDEN_CHARS,"_").replace(/\./g,"_").trim().toLowerCase(),s.find("#tab-enums-dialog-new-id").prop("disabled",!1).val(n))),i=!1,s.find("#tab-enums-dialog-new-preview").val((a||"enum")+"."+(n||"#"))}),s.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),s.modal().modal("open")}function w(e){g.editMode=e;var t=g.$gridEnum.find("#tab-enums-list-edit");if(g.editMode)t.removeClass("blue").addClass("red"),g.$gridEnum.addClass("tab-enums-edit"),g._initObjectTree(),b(_("You can drag&drop the devices, channels and states to enums")),g.isTiles?y():m();else{o("destroy");try{var n=g.$gridEnum.find(".collection-item");n.droppable("instance")&&n.droppable("destroy")}catch(e){console.error(e)}try{var i=g.$gridEnum.find("tbody>tr.treetable-enum");i.droppable("instance")&&i.droppable("destroy")}catch(e){console.error(e)}t.removeClass("red").addClass("blue"),g.$gridEnum.removeClass("tab-enums-edit")}}this.prepare=function(){this.isTiles=void 0===this.main.config.enumIsTiles||null===this.main.config.enumIsTiles||this.main.config.enumIsTiles},this._initObjectTree=function(){var e={objects:t.objects,noDialog:!0,draggable:["device","channel","state"],name:"enum-objects",expertModeRegEx:/^system\.|^yunkong2\.|^_|^[\w-]+$|^enum\.|^[\w-]+\.admin|^script\./,texts:{select:_("Select"),cancel:_("Cancel"),all:_("All"),id:_("ID"),ID:_("ID"),name:_("Name"),role:_("Role"),room:_("Room"),function:_("Function"),value:_("Value"),type:_("Type"),selectid:_("Select ID"),from:_("From"),lc:_("Last changed"),ts:_("Time stamp"),wait:_("Processing..."),ack:_("Acknowledged"),edit:_("Edit"),push:_("Trigger event"),ok:_("Ok"),with:_("With"),without:_("Without"),copyToClipboard:_("Copy to clipboard"),expertMode:_("Toggle expert mode"),refresh:_("Update"),sort:_("Sort alphabetically"),button:_("Settings"),noData:_("No data")},filter:{type:"state"},columns:["ID","name","type","role"]};o("init",e).selectId("show"),function(){var e=g.$gridEnum.find(".fancytree-container>tbody");try{e.sortable("instance")&&e.sortable("destroy")}catch(e){console.error(e)}g.$gridEnum.find(".fancytree-container>tbody").sortable({connectWith:"#tab-enums .tab-enums-list .tree-table-main.treetable",items:".fancytree-type-draggable",appendTo:g.$gridEnum,refreshPositions:!0,helper:function(e,t){return $('<div class="fancytree-drag-helper">'+t.find(".fancytree-title").text()+"</div>")},zIndex:999990,revert:!1,scroll:!1,start:function(e,t){var n=t.item.prev();t.item.data("prev",n),g.$gridEnum.addClass("dragging")},stop:function(e,t){g.$gridEnum.removeClass("dragging")},update:function(e,t){var n=t.item.data("prev");n&&n.length?$(n).after(t.item):$(this).prepend(t.item)}}).disableSelection()}()},this._postInit=function(){void 0!==this.$gridList&&(this.main.objects["enum.rooms"]||(this.main.objects["enum.rooms"]={_id:"enum.rooms",common:{icon:"home",name:{en:"Rooms",cn:"场景"},desc:{en:"List of the rooms"},members:[],dontDelete:!0},type:"enum",acl:{owner:"system.user.admin",ownerGroup:"system.group.administrator",permissions:1911}},g.main.socket.emit("setObject","enum.rooms",this.main.objects["enum.rooms"]),this.list.unshift("enum.rooms")),this.main.objects["enum.functions"]||(this.main.objects["enum.functions"]={_id:"enum.functions",common:{icon:"lightbulb_outline",name:{en:"Functions",cn:"功能"},desc:{en:"List of the functions"},members:[],dontDelete:!0},type:"enum",acl:{owner:"system.user.admin",ownerGroup:"system.group.administrator",permissions:1911}},this.list.unshift("enum.functions"),g.main.socket.emit("setObject","enum.functions",this.main.objects["enum.functions"])),this.isTiles?n():c(),this.editMode?this._initObjectTree():o("destroy"))},this.init=function(e){this.inited&&!e||(this.main&&this.main.objectsLoaded?(this._postInit(),this.inited||(this.inited=!0,this.main.subscribeObjects("enum.*"))):setTimeout(function(){g.init(e)},250))},this.destroy=function(){this.inited&&(this.inited=!1,this.main.unsubscribeObjects("enum.*")),w(!1),this.$gridList.treeTable("destroy")},this.objectChange=function(e,t,n){if(e.match(/^enum\./)){if(t)-1===this.list.indexOf(e)&&this.list.push(e);else{var i=this.list.indexOf(e);-1!==i&&this.list.splice(i,1)}this.updateTimers&&clearTimeout(this.updateTimers),this.updateTimers=setTimeout(function(){g.updateTimers=null,g._postInit()},200)}this.$grid&&o("object",e,t,n)}}function Events(g){var h=this;this.main=g,this.$tab=$("#tab-events");var e,f,p,t,b,M="yunkong2.net"===location.hostname||"yunkong2.pro"===location.hostname,y={count:0,start:0,limit:500},n=null,v={list:[],mode:!1,counter:0,overflow:!1,$counterSpan:null},w={done:!1,timer:null};this.prepare=function(){t=this.$tab.find("#event-outer"),p=this.$tab.find("#event-table"),b=this.$tab.find("#event-pause"),e=this.$tab.find("#events-table-tr"),(f=new IobListHeader(e,{list:t,colWidthOffset:1,prefix:"event-filter"})).doFilter=i,f.add("combobox","type"),f.add("edit","id","ID"),f.add("edit","val","value"),f.add("combobox","ack","ack",[{val:"",name:"all"},{val:"true",name:"ack"},{val:"false",name:"not ack"}]),f.add("combobox","from","from"),f.add("text","ts"),f.add("text","lc"),Object.defineProperty(f,"getValues",{value:function(){f.ID.selectedVal=f.ID.selectedVal.toLocaleLowerCase(),"true"===f.ack.selectedVal&&(f.ack.selectedVal=!0),"false"===f.ack.selectedVal&&(f.ack.selectedVal=!1)},enumerateble:!1}),b.on("click",function(){h.pause()}),this.$tab.find("#event-clear").off("click").on("click",function(){y.count=0,y.start=0,h.$tab.find("#event-table").html("")})},this.init=function(){M?h.$tab.find("#grid-events").html(_("You can't see events via cloud")+'<br><i class="large material-icons">cloud_off</i>').addClass("no-cloud-events"):f&&(this.inited||(!function e(){if(!$.fn.colResizable)return;t.is(":visible")?(t.colResizable({liveDrag:!0,partialRefresh:!0,marginLeft:5,postbackSafe:!0,onResize:function(e){return f.syncHeader()}}),f.syncHeader()):setTimeout(function(){e()},200)}(),this.inited=!0,this.main.subscribeObjects("*"),this.main.subscribeStates("*")))};var j=!(this.destroy=function(){this.inited&&(this.inited=!1,this.main.unsubscribeObjects("*"),this.main.unsubscribeStates("*"))});function L(){w.timer=null,$(window).trigger("resize.JColResizer")}function i(){n&&(clearTimeout(n),n=null),f.getValues&&f.getValues(),p&&p.find(".event-line").each(function(e){var t=!0,n=$(this);f.type.selectedVal&&!n.hasClass("event-type-"+f.type.selectedVal)?t=!1:f.from.selectedVal&&!n.hasClass("event-from-"+f.from.selectedVal)?t=!1:""===f.ack.selectedVal||n.hasClass("event-ack-"+f.ack.selectedVal)?f.ID.selectedVal&&-1===$(this).find("td.event-column-id").text().toLocaleLowerCase().indexOf(f.ID.selectedVal)?t=!1:""!==f.value.selectedVal&&-1===$(this).find("td.event-column-value").text().indexOf(f.value.selectedVal)&&(t=!1):t=!1,t?n.show():n.hide()})}this.add=function(e,t,n,i){if(!M){var a,s,o,r,c=i?"stateChange":n?"message":"objChange",l="";if(f&&(f.getValues&&f.getValues(),f.type.checkAddOption(c)),w.done||(w.timer||(w.timer=setTimeout(L,1e3)),20<y.count&&(w.done=!0)),!v.mode)if(y.count>=h.limit){y.start++;var d=document.getElementById("event_"+y.start);d&&(d.outerHTML="")}else y.count++;n||i?i&&(t?(t.from=t.from||"",t.from=t.from.replace("system.adapter.",""),t.from=t.from.replace("system.",""),f&&f.from.checkAddOption(t.from,function(e){return{val:e.replace(/\./g,"-"),name:e}}),l=t.from,void 0!==(a=JSON.stringify(t.val))&&30<a.length&&(a='<div title="'+a.replace(/"/g,"")+'">'+a.substring(0,30)+"...</div>"),s=t.ack?"true":"false",o=g.formatDate(t.ts),r=g.formatDate(t.lc)):(a="deleted",o=g.formatDate(new Date))):o=t?(void 0!==(a=JSON.stringify(t,"\n",2))&&30<a.length&&(a='<span title="'+a.replace(/"/g,"'")+'">'+a.substring(0,30)+"...</span>"),g.formatDate(t.ts)):(a="deleted",g.formatDate(new Date));var u=!0;f&&(f.type.selectedVal&&f.type.selectedVal!==c?u=!1:f.ID.selectedVal&&-1===e.toLocaleLowerCase().indexOf(f.ID.selectedVal)?u=!1:""!==f.value.selectedVal&&null!=a&&-1===a.indexOf(f.value.selectedVal)?u=!1:""!==f.ack.selectedVal&&f.ack.selectedVal!==s?u=!1:f.from.selectedVal&&f.from.selectedVal!==l&&(u=!1));var m='<tr id="event_'+(y.start+y.count)+'" class="event-line event-type-'+c+" event-from-"+l.replace(".","-")+" event-ack-"+s+'" style="'+(u?"":"display:none")+'">';m+="<td>"+c+"</td>",m+='<td class="event-column-id">'+e+"</td>",isNaN(a)?m+='<td class="event-column-value">'+(a||"")+"</td>":m+='<td class="event-column-value" style="text-align: right; padding-right: 5px;">'+(a||"")+"</td>",m+="<td>"+(s||"")+"</td>",m+="<td>"+(l||"")+"</td>",m+="<td>"+(o||"")+"</td>",m+="<td>"+(r||"")+"</td>",m+="</tr>",v.mode?(v.list.push(m),v.counter++,v.counter>y.limit&&(v.overflow||(b.addClass("red lighten3").attr("title",_("Message buffer overflow. Losing oldest")),v.overflow=!0),v.list.shift()),v.$counterSpan.html(v.counter)):p&&(p.prepend(m),j||"#tab-events"!==window.location.hash&&"#events"!==window.location.hash||(f&&f.syncHeader(),j=!0))}},this.pause=function(){if(v.mode){v.mode=!1;for(var e=0;e<v.list.length;e++){if(500<=y.count){y.start++;var t=document.getElementById("event_"+y.start);t&&(t.outerHTML="")}else y.count++;p.prepend(v.list[e])}v.overflow=!1,v.list=[],v.counter=0,b.removeClass("yellow btn-pause-button-active").html('<i class="material-icons">pause</i>')}else b.addClass("yellow btn-pause-button-active"),v.$counterSpan=b,v.$counterSpan.html("0"),v.counter=0,v.mode=!0}}function fileHandler(e){e.preventDefault();var t=e.dataTransfer?e.dataTransfer.files[0]:e.target.files[0],n=$(this).find(".drop-zone"),i=$(this).data("drop-zone-cb"),a=$(this).data("limit");if(t.size>(a||1e4))return i&&i(_("File is too big!")),n.hide(),!1;n.show();var s=new FileReader;s.onload=function(e){n.hide(),i&&i(null,e.target.result)},s.readAsDataURL(t)}function installFileUpload(e,t,n){if(void 0!==window.FileReader&&!e.data("installed")){e.data("installed",!0),e.prepend('<div class="drop-zone" style="display: none"><input type="file" class="drop-file" style="display: none" /></div>');var i=e.find(".drop-zone");e[0].ondragover=function(){return i.off("click"),i.show(),!1},i[0].ondragleave=function(){return i.hide(),!1},i[0].ondrop=fileHandler.bind(e[0])}e.data("drop-zone-cb",n),e.data("limit",t),e.find(".drop-file").on("change",fileHandler.bind(e[0]))}function Hosts(s){var r=this;function n(e){var t=$("#dialog-host-update");if(e){var n=e.path,i=(n=n.replace(/\\/g,"/")).split("/");i.pop(),i.pop(),"linux"===e.platform||"darwin"===e.platform||"freebsd"===e.platform||"lin"===e.platform?t.find("#dialog-host-update-instructions").val("cd "+i.join("/")+"\nsudo yunkong2 stop\nsudo yunkong2 update\nsudo yunkong2 upgrade self\nsudo yunkong2 start"):t.find("#dialog-host-update-instructions").val("cd "+i.join("\\")+"\nyunkong2 stop\nyunkong2 update\nyunkong2 upgrade self\nyunkong2 start")}else t.find("#dialog-host-update-instructions").val("cd /opt/yunkong2\nsudo yunkong2 stop\nsudo yunkong2 update\nsudo yunkong2 upgrade self\nsudo yunkong2 start");t.data("inited")||(t.data("inited",!0),t.modal()),t.modal("open")}function i(e){if(e=(e||"").toLowerCase().trim()){var t=!1;r.$tab.find(".hosts-host").each(function(){-1!==$(this).data("host-filter").toLowerCase().indexOf(e)?($(this).show(),t=!0):$(this).hide()}),t?r.$tab.find(".hosts-host-filtered-out").hide():r.$tab.find(".hosts-host-filtered-out").show()}else r.$tab.find(".hosts-host").show(),r.$tab.find(".hosts-host-filtered-out").hide()}function a(e){var t=r.main.objects[r.list[e].id],n=r.main.states[t._id+".alive"]&&r.main.states[t._id+".alive"].val&&"null"!==r.main.states[t._id+".alive"].val;t.common=t.common||{},t.native=t.native||{};var i='<tr class="hosts-host" data-host-id="'+t._id+'" data-host-filter="'+(t.common.title||"")+" "+(t.common.hostname||"")+" "+(t.common.name||"")+'">';i+='<td class="tab-hosts-header-led"><div class="hosts-led '+(n?"led-green":"led-red")+'" data-host-id="'+t._id+'"></div></td>',i+='<td class="hosts-icon">'+r.main.getHostIcon(t)+"</td>",i+='<td class="hosts-name" style="font-weight: bold">'+t.common.hostname+"</td>",i+='<td class="tab-hosts-header-type">'+t.common.type+"</td>";var a=t.common.titleLang||t.common.title;return"object"==typeof a&&(a=a[systemLang]||a.en),i+='<td class="tab-hosts-header-title">'+a+"</td>",i+='<td class="tab-hosts-header-os">'+(t.native.os?t.native.os.platform:_("unknown"))+"</td>",i+='<td class="tab-hosts-header-available"><span data-host-id="'+t._id+'" data-type="'+t.common.type+'" class="hosts-version-available"></span><button class="small-button host-update-submit" data-host-name="'+t.common.hostname+'" style="display: none; opacity: 0;" title="'+_("update")+'"><i class="material-icons">refresh</i></button><button class="small-button host-update-hint-submit" data-host-name="'+t.common.hostname+'" style="display: none;" title="'+_("update")+'"><i class="material-icons">refresh</i></button></td>',i+='<td class="hosts-version-installed tab-hosts-header-installed" data-host-id="'+t._id+'">'+t.common.installedVersion+"</td>",r.main.states[t._id+".inputCount"]?i+='<td class="tab-hosts-header-events" style="text-align: center"><span title="in" data-host-id="'+t._id+'" class="host-in">⇥'+r.main.states[t._id+".inputCount"].val+'</span> / <span title="out" data-host-id="'+t._id+'" class="host-out">↦'+r.main.states[t._id+".outputCount"].val+"</span></td>":i+='<td class="tab-hosts-header-events" style="text-align: center"><span title="in" data-host-id="'+t._id+'" class="host-in"></span> / <span title="out" data-host-id="'+t._id+'" class="host-out"></span></td>',i+='<td class="tab-hosts-header-restart"><button class="small-button host-restart-submit" style="'+(n?"":"display: none")+'" data-host-id="'+t._id+'" title="'+_("restart")+'"><i class="material-icons">autorenew</i></button></td>',i+="</tr>"}function o(e){var t,n=r.main.objects[r.list[e].id],i=r.main.states[n._id+".alive"]&&r.main.states[n._id+".alive"].val&&"null"!==r.main.states[n._id+".alive"].val;n.common=n.common||{},n.native=n.native||{},n.common.color&&(t=r.main.invertColor(n.common.color));var a=' <div class="col s12 hosts-host" data-host-id="'+n._id+'" data-host-filter="'+(n.common.title||"")+" "+(n.common.hostname||"")+" "+(n.common.name||"")+'"> <div class="host z-depth-1 hoverable"> <div class="image center"> '+r.main.getHostIcon(n," ")+' <div class="hosts-led '+(i?"led-green":"led-red")+'" data-host-id="'+n._id+'"></div> </div> <div class="system" style="'+(n.common.color?"color: "+(t?"white":"black")+"; background: "+n.common.color:"")+'"> <span class="nameHost" title="name">'+n.common.hostname+'</span> <ul> <li class="tab-hosts-header-title"><span class="title-val">'+r.words.Type+':</span> <span class="type">'+n.common.type+'</span></li> <li><span class="title-val">'+r.words.Title+':</span> <span class="title">'+n.common.title+'</span></li> <li><span class="title-val">'+r.words.OS+':</span> <span class="os">'+(n.native.os?n.native.os.platform:_("unknown"))+'</span></li> <li><span class="title-val">'+r.words.Available+':</span> <span class="available hosts-version-available"></span></li> <li><span class="title-val">'+r.words.Installed+':</span> <span class="installed"> '+n.common.installedVersion+"</span></li>";return r.main.states[n._id+".inputCount"]?a+='<li class="tab-hosts-header-events"><span class="title-val">'+r.words.Events+':</span> <span title="in" data-host-id="'+n._id+'" class="host-in">⇥'+r.main.states[n._id+".inputCount"].val+'</span> / <span title="out" data-host-id="'+n._id+'" class="host-out">↦'+r.main.states[n._id+".outputCount"].val+"</span></li>":a+='<li class="tab-hosts-header-events"><span class="title-val">'+r.words.Events+':</span> <span title="in" data-host-id="'+n._id+'" class="host-in"></span> / <span title="out" data-host-id="'+n._id+'" class="host-out"></span></li>',a+='</ul> </div> <div class="icon center"> <i class="material-icons host-edit" data-host-id="'+n._id+'">edit</i> <i class="material-icons host-restart-submit" data-host-name="'+n.common.hostname+'" title="'+_("restart")+'">autorenew</i>',n.common.hostname!==r.main.currentHost&&(a+=' <i class="material-icons host-delete" data-host-name="'+n.common.hostname+'" title="'+_("remove")+'">delete</i>'),a+=' <i class="material-icons host-update-hint-submit" data-host-name="'+n.common.hostname+'" style="display: none">refresh</i> <i class="material-icons host-update-submit" data-host-name="'+n.common.hostname+'" style="display: none; opacity: 0">refresh</i> </div> </div> </div>'}this.main=s,this.list=[],this.$tab=$("#tab-hosts"),this.$grid=this.$tab.find("#hosts"),this.$table=this.$tab.find("#grid-hosts"),this.inited=!1,this.isTiles=!0,this.words={},this.prepare=function(){this.isTiles=void 0===this.main.config.hostsIsTiles||null===this.main.config.hostsIsTiles||this.main.config.hostsIsTiles,"ie"===this.main.browser&&this.main.browserVersion<=10&&(this.isTiles=!1,this.$tab.find(".btn-switch-tiles").hide()),this.$tab.find(".btn-reload").attr("title",_("Update")).on("click",function(){r.init(!0)}),this.$tab.find(".btn-switch-tiles").off("click").on("click",function(){r.isTiles=!r.isTiles,r.isTiles?$(this).find("i").text("view_list"):$(this).find("i").text("view_module"),r.main.saveConfig("hostsIsTiles",r.isTiles),setTimeout(function(){r._postInit()},50)}),this.isTiles?this.$tab.find(".btn-switch-tiles").find("i").text("view_list"):this.$tab.find(".btn-switch-tiles").find("i").text("view_module"),this.$tab.find(".filter-clear").on("click",function(){r.$tab.find(".filter-input").val("").trigger("change")});var e=this.$tab.find(".filter-input");e.on("change",function(){var e=$(this).val();e?($(this).addClass("input-not-empty"),r.$tab.find(".filter-clear").show()):(r.$tab.find(".filter-clear").hide(),$(this).removeClass("input-not-empty")),r.main.saveConfig("hostsFilter",e),i(e)}).on("keyup",function(){r.filterTimeout&&clearTimeout(r.filterTimeout),r.filterTimeout=setTimeout(function(){r.$tab.find(".filter-input").trigger("change")},300)}),this.main.config.hostsFilter&&"{"!==this.main.config.hostsFilter[0]?(e.val(r.main.config.hostsFilter).addClass("input-not-empty"),this.$tab.find(".filter-clear").show()):this.$tab.find(".filter-clear").hide(),this.words.Title=_("Title"),this.words.OS=_("OS"),this.words.Available=_("Available"),this.words.Installed=_("Installed"),this.words.Events=_("Events"),this.words.Title=_("Title"),r.words.Type=_("Type")},this.initButtons=function(e){var t=e?'[data-host-id="'+e+'"]':"";this.$tab.find(".host-update-submit"+t).off("click").on("click",function(){r.main.cmdExec($(this).attr("data-host-name"),"upgrade self",function(e){e||r.init(!0)})}),this.$tab.find(".host-restart-submit"+t).off("click").on("click",function(){r.main.waitForRestart=!0,r.main.cmdExec($(this).attr("data-host-name"),"_restart")}),this.$tab.find(".host-delete"+t).off("click").on("click",function(){r.main.cmdExec(r.main.currentHost,"host remove "+$(this).attr("data-host-name"))}),this.$tab.find(".host-edit"+t).off("click").on("click",function(){!function(t){var n=$("#tab-host-dialog-edit"),e="",i="",a="";installFileUpload(n,5e4,function(e,t){if(e)r.main.showToast(n,e);else{if(!t.match(/^data:image\//))return void r.main.showToast(n,_("Unsupported image format"));n.find(".tab-host-dialog-ok").removeClass("disabled"),i=t,n.find(".tab-host-dialog-edit-icon").show().html('<img class="" />'),n.find(".tab-host-dialog-edit-icon img").attr("src",t),n.find(".tab-host-dialog-edit-icon-clear").show()}}),r.main.objects[t]&&r.main.objects[t].common&&("object"==typeof(e=r.main.objects[t].common.title)&&(e=e[systemLang]||e.en),i=r.main.objects[t].common.icon,a=r.main.objects[t].common.color);n.find("#tab-host-dialog-edit-title").val(e).off("change").on("change",function(){n.find(".tab-host-dialog-ok").removeClass("disabled")}).off("keyup").on("keyup",function(){$(this).trigger("change")}),n.find(".tab-host-dialog-ok").addClass("disabled").off("click").on("click",function(){var e=JSON.parse(JSON.stringify(r.main.objects[t]));e.common.title=n.find("#tab-host-dialog-edit-title").val(),e.common.icon=i,e.common.color=a,JSON.stringify(e)!==JSON.stringify(r.main.objects[t])?r.main.socket.emit("setObject",e._id,e,function(e){r.main.showToast(n,_("Updated"))}):r.main.showToast(n,_("Nothing changed"))}),i?(n.find(".tab-host-dialog-edit-icon").show().html(r.main.getIcon(t)),n.find(".tab-host-dialog-edit-icon-clear").show()):(n.find(".tab-host-dialog-edit-icon").hide(),n.find(".tab-host-dialog-edit-icon-clear").hide());(a=a||!1)?n.find(".tab-host-dialog-edit-color").val(a):n.find(".tab-host-dialog-edit-color").val();M.updateTextFields("#tab-host-dialog-edit"),r.main.showToast(n,_("Drop the icons here")),n.find(".tab-host-dialog-edit-upload").off("click").on("click",function(){n.find(".drop-file").trigger("click")}),n.find(".tab-host-dialog-edit-icon-clear").off("click").on("click",function(){i&&(i="",n.find(".tab-host-dialog-edit-icon").hide(),n.find(".tab-host-dialog-ok").removeClass("disabled"),n.find(".tab-host-dialog-edit-icon-clear").hide())}),n.find(".tab-host-dialog-edit-color-clear").off("click").on("click",function(){a&&(n.find(".tab-host-dialog-ok").removeClass("disabled"),n.find(".tab-host-dialog-edit-color-clear").hide(),n.find(".tab-host-dialog-edit-colorpicker").colorpicker({component:".btn",color:a,container:n.find(".tab-host-dialog-edit-colorpicker")}).colorpicker("setValue",""),a="")});var s=Date.now();try{n.find(".tab-host-dialog-edit-colorpicker").colorpicker("destroy")}catch(e){}n.find(".tab-host-dialog-edit-colorpicker").colorpicker({component:".btn",color:a,container:n.find(".tab-host-dialog-edit-colorpicker")}).colorpicker("setValue",a).on("showPicker.colorpicker",function(){var e=n.find(".modal-content");e[0].scrollTop=e[0].scrollHeight}).on("changeColor.colorpicker",function(e){100<Date.now()-s&&(a=e.color.toHex(),n.find(".tab-host-dialog-ok").removeClass("disabled"),n.find(".tab-host-dialog-edit-icon-clear").show())}),a?n.find(".tab-host-dialog-edit-color-clear").show():n.find(".tab-host-dialog-edit-color-clear").hide();n.modal().modal("open")}($(this).attr("data-host-id"))}),this.$tab.find(".host-update-hint-submit"+t).off("click").on("click",function(){var t=setTimeout(function(){n(),t=null},1e3);r.main.socket.emit("sendToHost",$(this).attr("data-host-name"),"getLocationOnDisk",null,function(e){t&&clearTimeout(t),t=null,n(e)})})},this.updateCounter=function(e){if(void 0===e)this.main.tabs.adapters.getAdaptersInfo(this.main.currentHost,!1,!1,function(e,t){var n=0;if(t&&t.hosts){for(var i in t.hosts)if(t.hosts.hasOwnProperty(i)){var a=r.main.objects["system.host."+i];if(a&&a.common){var s=a.common.installedVersion,o=a.common&&e&&e[a.common.type]?e[a.common.type].version:"";s&&o&&!r.main.upToDate(o,s)&&(i="system.host."+i.trim().replace(FORBIDDEN_CHARS,"_").replace(/\./g,"_"),r.main.states[i+".alive"]&&r.main.states[i+".alive"].val&&"null"!==r.main.states[i+".alive"].val&&n++)}}r.updateCounter(n)}});else if(e){var t=$("#updates-for-hosts");t.length?t.text(e):$('<span id="updates-for-hosts" title="'+_("updates")+'" class="new badge updates-for-hosts" data-badge-caption="">'+e+"</span>").appendTo('.admin-sidemenu-items[data-tab="tab-hosts"] a')}else $("#updates-for-hosts").remove()},this._postInit=function(){if(void 0!==r.$grid){this.isTiles?function(){for(var e="",t=0;t<r.list.length;t++)e+=o(t);r.$table.html(""),r.$tab.find(".hosts-table").hide(),r.$grid.html(e).show(),r.$grid.append('<div class="col s12 hosts-host-filtered-out"><div class="host z-depth-1 hoverable">'+_("Filtered out")+"</div></div>")}():function(){for(var e="",t=0;t<r.list.length;t++)e+=a(t);r.$grid.html("").hide(),r.$table.html(e),r.$tab.find(".hosts-table").show(),r.$table.append('<tr class="hosts-host-filtered-out"><td colspan="9">'+_("Filtered out")+"</td></tr>")}(),i(this.$tab.find(".filter-input").val());var s=setTimeout(function(){console.warn("Timeout for repository"),s=null,r.initButtons()},2e3),e=r.main.currentHost;if(!e)for(var t=0;t<r.list.length;t++)if(r.main.states[r.list[t].id+".alive"]&&r.main.states[r.list[t].id+".alive"].val){e=r.list[t].id;break}r.main.tabs.adapters.getAdaptersInfo(e,!0,!1,function(a,e){if(e&&e.hosts){for(var t in e.hosts)if(e.hosts.hasOwnProperty(t)){var n=r.main.objects["system.host."+t],i=e.hosts[t].version;i!==e.hosts[t].runningVersion&&(i+="("+_("Running: ")+e.hosts[t].runningVersion+")"),!i&&n.common&&n.common.installedVersion&&(i=n.common.installedVersion),t="system.host."+t.trim().replace(FORBIDDEN_CHARS,"_").replace(/\./g,"_"),r.$tab.find('.hosts-version-installed[data-host-id="'+t+'"]').html(i)}r.$tab.find(".hosts-host").each(function(){var e=$(this).data("host-id"),t=r.main.objects[e],n=t.common.installedVersion,i=t.common&&a&&a[t.common.type]?a[t.common.type].version:"";n&&i&&(r.main.upToDate(i,n)||r.main.states[e+".alive"]&&r.main.states[e+".alive"].val&&"null"!==r.main.states[e+".alive"].val&&($(this).find(".host-update-submit").show(),$(this).find(".host-update-hint-submit").show(),$(this).find(".hosts-version-installed").addClass("updateReady"),$(this).find(".hosts-version-available").addClass("hosts-version-available-updatable"))),i&&$(this).find(".hosts-version-available").html(i)}),s&&(clearTimeout(s),s=null),r.initButtons()}})}},this.init=function(e){this.inited&&!e||(this.getHosts(function(){r._postInit()}),this.inited||(this.inited=!0,this.main.subscribeObjects("system.host.*"),this.main.subscribeStates("system.host.*")))},this.destroy=function(){this.inited&&(this.inited=!1,this.main.unsubscribeObjects("system.host.*"),this.main.unsubscribeStates("system.host.*"))},this.addHost=function(e){var t=null;if(e.native.hardware&&e.native.hardware.networkInterfaces)for(var n in e.native.hardware.networkInterfaces)if(e.native.hardware.networkInterfaces.hasOwnProperty(n)){for(var i=0;i<e.native.hardware.networkInterfaces[n].length;i++)if(!e.native.hardware.networkInterfaces[n][i].internal){t=e.native.hardware.networkInterfaces[n][i].address;break}if(t)break}t?this.list.push({name:e.common.hostname,address:t,id:e._id}):this.list.push({name:e.common.hostname,address:"127.0.0.1",id:e._id})},this.getHosts=function(a){this.main.socket.emit("getForeignObjects","system.host.*","state",function(e,t){for(var n in t)t.hasOwnProperty(n)&&(r.main.objects[n]=t[n]);r.main.socket.emit("getForeignStates","system.host.*",function(e,t){for(var n in t)t.hasOwnProperty(n)&&(r.main.states[n]=t[n]);r.main.socket.emit("getForeignObjects","system.host.*","host",function(e,t){for(var n in r.list=[],t)if(t.hasOwnProperty(n)){var i=t[n];"host"===(r.main.objects[n]=i).type&&r.addHost(i)}s.initHostsList(),a&&a()})})})},this.objectChange=function(e,t,n){if(e.match(/^system\.host\.[-\w]+$/)){var i,a=!1;for(i=0;i<this.list.length;i++)if(this.list[i].id===e){a=!0;break}t?a||this.list.push({id:e,address:t.common.address?t.common.address[0]:"",name:t.common.name}):a&&this.list.splice(i,1),this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(function(){r.updateTimer=null,r._postInit()},200)}},this.stateChange=function(e,t){e.match(/^system\.host\..+\.alive$/)?(e=e.substring(0,e.length-6),t&&t.val?this.$tab.find('.hosts-led[data-host-id="'+e+'"]').removeClass("led-red").addClass("led-green"):(this.$tab.find('.hosts-led[data-host-id="'+e+'"]').removeClass("led-green").addClass("led-red"),this.$tab.find('.host-update-submit[data-host-id="'+e+'"]').hide(),this.$tab.find('.host-update-hint-submit[data-host-id="'+e+'"]').hide(),this.$tab.find('.host-restart-submit[data-host-id="'+e+'"]').hide(),this.$tab.find('.hosts-version-available[data-host-id="'+e+'"]').removeClass("hosts-version-available-updatable"))):e.match(/^system\.host\..+\.outputCount$/)?(e=e.substring(0,e.length-12),this.$tab.find('.host-out[data-host-id="'+e+'"]').html('<span class="highlight">↦'+t.val+"</span>")):e.match(/^system\.host\..+\.inputCount$/)&&(e=e.substring(0,e.length-11),this.$tab.find('.host-in[data-host-id="'+e+'"]').html('<span class="highlight">↦'+t.val+"</span>"))}}function Instances(i){var p=this;function b(e,t,n,i,a){if("protocol"===n&&(n="secure"),"ip"===e)i=i.replace("%"+e+"%",location.hostname);else if("instance"===e)i=i.replace("%"+e+"%",a);else if(t){n.match(/^native_/)&&(n=n.substring(7));var s=t.native[n];"bind"!==e||s&&"0.0.0.0"!==s||(s=location.hostname),i="secure"===n?i.replace("%"+e+"%",s?"https":"http"):-1===i.indexOf("%"+e+"%")?i.replace("%native_"+e+"%",s):i.replace("%"+e+"%",s)}else i="secure"===n?i.replace("%"+e+"%","http"):-1===i.indexOf("%"+e+"%")?i.replace("%native_"+e+"%",""):i.replace("%"+e+"%","");return i}function o(e,t,n){var i,a,s,o=e.match(/%(\w+)%/g);if(o){for(a=o.length-1;0<=a;a--)s=(i=(i=o[a]).replace(/%/g,"")).split("_"),i.match(/^native_/)?(e=b(i,p.main.objects["system.adapter."+t+"."+n],i,e,n),o.splice(a,1)):1===s.length?(e=b(i,p.main.objects["system.adapter."+t+"."+n],s[0],e,n),o.splice(a,1)):s[0].match(/\.[0-9]+$/)&&(e=b(i,p.main.objects["system.adapter."+s[0]],s[1],e,n),o.splice(a,1));var r,c,l={},d=s[0];for(a=0;a<o.length;a++){if((i=(i=o[a]).replace(/%/g,"")).match(/^native_/)&&(i=i.substring(7)),s=i.split("_"),!r){r=[];for(var u=0;u<10;u++)p.main.objects["system.adapter."+d+"."+u]&&r.push(u)}for(var m=0;m<r.length;m++)l[d+"."+m]={instance:d+"."+m,link:b(i,p.main.objects["system.adapter."+d+"."+m],s[1],l[d+"."+m]?l[d+"."+m].link:e,m)}}if(r){c={};var g=0,h="";for(var f in l)l.hasOwnProperty(f)&&(c[l[f].instance]=l[f].link,h||(h=l[f].link),g++);g<2&&(e=h,c=null)}}return c||e}function f(e){var t=e.split("."),n=t[2],i=t[3],a=p.$tab.find('.instance-led[data-instance-id="'+e+'"]'),s=p.main.objects[e]&&p.main.objects[e].common||{},o="daemon"===s.mode?"green":"blue",r="";if(!s.enabled||s.webExtension&&p.main.objects[e].native.webInstance){if(o="daemon"===s.mode?"gray":"blue",r='<table style="border: 0">',r+='<tr style="border: 0"><td style="border: 0">'+_("Connected to host: ")+'</td><td style="border: 0">',p.main.states[e+".connected"]&&p.main.states[e+".connected"].val?r+='<span style="color: green">'+_("true")+"</span>":r+=_("false"),r+='</td></tr><tr style="border: 0">',r+='<td style="border: 0">'+_("Heartbeat: ")+'</td><td style="border: 0">',p.main.states[e+".alive"]&&p.main.states[e+".alive"].val?r+='<span style="color: green">'+_("true")+"</span>":r+=_("false"),r+="</td></tr>",p.main.states[n+"."+i+".info.connection"]||p.main.objects[n+"."+i+".info.connection"])r+='<tr style="border: 0"><td style="border: 0">'+_("Connected to %s: ",n)+"</td><td>",r+=(c=!!p.main.states[n+"."+i+".info.connection"]&&p.main.states[n+"."+i+".info.connection"].val)?!0===c?'<span style="color: green">'+_("true")+"</span>":'<span style="color: green">'+c+"</span>":_("false"),r+="</td></tr>";r+="</table>"}else{var c;if(r='<table style="border: 0">',r+='<tr style="border: 0"><td style="border: 0">'+_("Connected to host: ")+'</td><td style="border: 0">',p.main.states[e+".connected"]&&p.main.states[e+".connected"].val?r+='<span style="color: green">'+_("true")+"</span>":(r+="daemon"===s.mode?'<span style="color: red">'+_("false")+"</span>":_("false"),o="daemon"===s.mode?"red":"blue"),r+='</td></tr><tr style="border: 0"><td style="border: 0">'+_("Heartbeat: ")+'</td><td style="border: 0">',p.main.states[e+".alive"]&&p.main.states[e+".alive"].val?r+='<span style="color: green">'+_("true")+"</span>":(r+="daemon"===s.mode?'<span style="color: red">'+_("false")+"</span>":_("false"),o="daemon"===s.mode?"red":"blue"),r+="</td></tr>",p.main.states[n+"."+i+".info.connection"]||p.main.objects[n+"."+i+".info.connection"])r+='<tr style="border: 0"><td style="border: 0">'+_("Connected to %s: ",n)+"</td><td>",(c=!!p.main.states[n+"."+i+".info.connection"]&&p.main.states[n+"."+i+".info.connection"].val)?r+=!0===c?'<span style="color: green">'+_("true")+"</span>":'<span style="color: green">'+c+"</span>":(o="red"===o?"red":"orange",r+='<span style="color: red">'+_("false")+"</span>"),r+="</td></tr>";r+="</table>"}o="blue"===o?"":o,a.removeClass("led-red led-green led-orange led-blue").addClass("led-"+o).data("title",r),a.data("inited")||"gray"===o||(a.data("inited",!0),a.hover(function(){var e='<div class="instance-state-hover" style="left: '+Math.round($(this).position().left+$(this).width()+5)+'px;">'+$(this).data("title")+"</div>",t=$(e);t.insertAfter($(this)),$(this).data("big",t[0]);var n=parseFloat(t.height()),i=Math.round($(this).position().top-(n-parseFloat($(this).height()))/2);n+i>(window.innerHeight||document.documentElement.clientHeight)&&(i=(window.innerHeight||document.documentElement.clientHeight)-n),i<0&&(i=0),t.css({top:i}).on("click",function(){var e=$(this).data("big");$(e).remove(),$(this).data("big",void 0)})},function(){var e=$(this).data("big");$(e).remove(),$(this).data("big",void 0)}).on("click",function(){$(this).trigger("hover")}))}function r(){for(var e=p.main.states["system.host."+p.main.currentHost+".memRss"],t=1,n=e?e.val:0,i=0;i<p.list.length;i++){var a=p.main.objects[p.list[i]];if(a&&a.common&&(a.common.host===p.main.currentHost&&a.common.enabled&&"daemon"===a.common.mode)){var s=p.main.states[a._id+".memRss"];n+=s?s.val:0,t++}}n=Math.round(n);var o=p.$tab.find("#totalRam");n.toString()!==o.text()&&o.html('<span class="highlight">'+n+"</span>");var r=_("%s processes",t),c=p.$tab.find("#running_processes");r!==c.text()&&c.html('<span class="highlight">'+r+"</span>")}function c(){p.main.states["system.host."+p.main.currentHost+".memAvailable"]?p.memState="memAvailable":p.main.states["system.host."+p.main.currentHost+".freemem"]&&(p.memState="freemem");var e=p.main.states["system.host."+p.main.currentHost+"."+p.memState];if(e){p.totalmem=p.totalmem||p.main.objects["system.host."+p.main.currentHost].native.hardware.totalmem/1048576;var t=Math.round(e.val/p.totalmem*100),n=p.$tab.find("#freeMem"),i=tdp(e.val);i!==n.text()&&(n.html('<span class="highlight '+(t<10?"high-mem":"")+'">'+i+"</span>"),p.$tab.find("#freeMemPercent").html('<span class="highlight">'+t+"%</span>"))}else p.$tab.find(".free-mem-label").hide()}function l(){var e=p.main.states["system.host."+p.main.currentHost+".diskSize"],t=p.main.states["system.host."+p.main.currentHost+".diskFree"],n=p.main.states["system.host."+p.main.currentHost+".diskWarning"];if(t&&t.val&&e&&e.val){n=n?parseFloat(n.val):5;var i=p.$tab.find("#diskFree"),a=Math.round(t.val/e.val*1e3)/10;i.html('<span class="highlight '+(a<n?"system-warning":"")+'">'+a+"</span>"),i.parent().attr("title",_("Size: %s, Free: %s",p.main.formatBytes(1024*e.val*1024),p.main.formatBytes(1024*t.val*1024)))}else p.$tab.find(".tab-instances-info-disk").hide()}function M(e){var t,n=p.main.objects[e]&&p.main.objects[e].common||{};return t=n.enabled&&"daemon"===n.mode&&p.main.states[e+".memRss"]?(t=p.main.states[e+".memRss"].val,t=parseFloat(t)||0,n.memoryLimitMB&&n.memoryLimitMB<=t?'<span class="high-mem">'+t.toFixed(1)+" MB</span>":t.toFixed(1)+" MB"):""}function d(e,t,n,i){var a,s=p.main.objects[t]&&p.main.objects[t].common||{},o=t.split("."),r=o[2],c=o[3];if("tile"===n)a=i?"":'<div class="instance-adapter" data-instance-id="'+t+'">',a+=i?"":"</div>";else{a=i?"":'<tr class="instance-adapter" data-instance-id="'+t+'">';var l=s.localLinks||s.localLink||"",d=l?p.replaceInLink(l,r,c):"";l&&(l="object"==typeof d?'<a href="'+d.__first+'" target="_blank">':'<a href="'+d+'" target="_blank">'),a+='<td class="instance-state" style="text-align: center"><div class="instance-led" data-instance-id="'+t+'"></div></td>',a+="<td>"+(s.icon?l+'<img src="adapter/'+r+"/"+s.icon+'" class="instance-image" data-instance-id="'+t+'"/>':"")+(l?"</a>":"")+"</td>",a+='<td style="padding-left: 0.5em" data-instance-id="'+t+'" class="instance-name"><b>'+r+"."+c+"</b></td>";var u=s.onlyWWW||s.enabled;a+='<td style="text-align: left;" class="m"><button data-instance-id="'+t+'" class="instance-stop-run small-button '+(s.onlyWWW?"small-button-empty":"")+'" title="dynamic" ><i class="material-icons">pause</i></button><button data-instance-id="'+t+'" class="instance-settings small-button '+(s.noConfig?"small-button-empty":"")+'" title="'+_("config")+'"><i class="material-icons">build</i></button><button data-instance-id="'+t+'" class="instance-reload small-button '+(s.onlyWWW?"small-button-empty":"")+" "+(u?"":"disabled")+'" title="'+_("reload")+'"><i class="material-icons">refresh</i></button>',a+='<button data-instance-id="'+t+'" class="instance-del small-button" title="'+_("delete")+'"><i class="material-icons">delete</i></button>'+(d?'<button data-instance-id="'+t+'" class="instance-web small-button '+(d?"":"small-button-empty")+" "+(u?"":"disabled")+'" title="'+_("open web page")+'" data-link="'+("object"!=typeof d?d:"")+'"><i class="material-icons">input</i></button>':"")+"</td>";var m=s.titleLang||s.title;if("object"==typeof m&&(m=m[systemLang]||m.en),a+='<td title="'+(l?_("Click on icon"):"")+'" style="padding-left: 0.5em" data-name="title" data-value="'+(m||"")+'" class="instance-editable" data-instance-id="'+t+'">'+(m||"")+"</td>",1<p.main.tabs.hosts.list.length){if(!p.hostsText){p.hostsText="";for(var g=0;g<p.main.tabs.hosts.list.length;g++){var h=p.main.tabs.hosts.list[g]||"";p.hostsText+=(p.hostsText?";":"")+h.name}}a+='<td style="padding-left: 0.5em" data-name="host" data-value="'+(s.host||"")+'" class="instance-editable" data-instance-id="'+t+'" data-options="'+p.hostsText+'">'+(s.host||"")+"</td>"}a+='<td data-name="schedule" data-value="'+("schedule"===s.mode&&s.schedule||"")+'" style="text-align: center" class="'+("schedule"===s.mode?"instance-schedule":"")+'" data-instance-id="'+t+'">'+("schedule"===s.mode&&s.schedule||"")+"</td>",p.main.config.expertMode&&(a+='<td data-name="restartSchedule" data-value="'+(s.restartSchedule||"")+'" style="text-align: center" class="instance-schedule m" data-instance-id="'+t+'">'+(s.restartSchedule||"")+"</td>",a+='<td data-name="loglevel" data-value="'+(s.loglevel||"")+'" style="text-align: center" class="instance-editable" data-instance-id="'+t+'" data-options="silly:silly;debug:debug;info:info;warn:warn;error:error">'+(s.loglevel||"")+"</td>",a+='<td data-name="memoryLimitMB" data-value="'+(s.memoryLimitMB||"")+'" style="text-align: center" class="instance-editable" data-instance-id="'+t+'">'+(s.memoryLimitMB||"")+"</td>",u&&p.main.states[t+".inputCount"]&&p.main.states[t+".outputCount"]?a+='<td style="text-align: center"><span title="in" data-instance-id="'+t+'" class="instance-in">⇥'+p.main.states[t+".inputCount"].val+'</span> / <span title="out" data-instance-id="'+t+'" class="instance-out">↦'+p.main.states[t+".outputCount"].val+"</span></td>":a+='<td style="text-align: center"><span title="in" data-instance-id="'+t+'" class="instance-in"></span> / <span title="out" data-instance-id="'+t+'" class="instance-out"></span></td>'),a+='<td class="memUsage" style="text-align: center" data-instance-id="'+t+'">'+M(t)+"</td>",a+=i?"":"</tr>"}i?p.$tab.find('.instance-adapter[data-instance-id="'+t+'"]').html(a):e.append(a),p.initButtons(t,d),f(t),p.$tab.find('.instance-editable[data-instance-id="'+t+'"]').on("click",y).addClass("select-id-quick-edit"),p.$tab.find('.instance-schedule[data-instance-id="'+t+'"]').each(function(){$(this).find("button").length||($(this).append('<button class="instance-schedule-button small-button" data-instance-id="'+t+'" data-name="'+$(this).data("name")+'" title="'+_("Set CRON schedule for restarts")+'"><i class="material-icons">schedule</i></button>'),$(this).find("button").on("click",function(){var n=$(this).data("name"),i=$(this).data("instance-id");!function(e,t){e=(e||"").replace(/"/g,"").replace(/'/g,"");try{setupCron(e,t)}catch(e){alert(_("Cannot parse value as cron"))}}(p.main.objects[i].common[n]||"",function(e){if(null!==e){var t={common:{}};t.common[n]=e,p.main.socket.emit("extendObject",i,t,function(e){e&&p.main.showError(e)})}})}))}),p.$tab.find('.instance-name[data-instance-id="'+t+'"]').on("click",function(){var e=p.$tab.find('.instance-settings[data-instance-id="'+$(this).data("instance-id")+'"]');e.hasClass("small-button-empty")||e.trigger("click")}).css("cursor","pointer")}function u(e){void 0===e&&(e=p.$tab.find(".instances-filter").val());var t=[];if(e)for(var n=new RegExp(e),i=0;i<p.list.length;i++){var a=p.main.objects[p.list[i]];if(a&&a.common){var s="hide",o=a.common.titleLang||a.common.title;"object"==typeof o&&(o=o[systemLang]||o.en),a.common.name&&n.test(a.common.name)?s="show":o&&n.test(o)?s="show":"true"===e?s=p.$grid.find('.instance-adapter[data-instance-id="'+p.list[i]+'"]').find("instance-led").hasClass("led-green")?"show":"hide":"false"===e&&(s=p.$grid.find('.instance-adapter[data-instance-id="'+p.list[i]+'"]').find("instance-led").hasClass("led-green")?"hide":"show"),"show"===s&&p.filterHost&&a.common.host!==p.main.currentHost&&(s="hide"),"hide"===s&&t.push(p.list[i]),p.$grid.find('.instance-adapter[data-instance-id="'+p.list[i]+'"]')[s]()}else p.$grid.find('.instance-adapter[data-instance-id="'+p.list[i]+'"]').hide()}else if(p.filterHost)for(var r=0;r<p.list.length;r++){var c=p.main.objects[p.list[r]];if(c&&c.common){var l="hide";c.common.host===p.main.currentHost&&(l="show"),p.$grid.find('.instance-adapter[data-instance-id="'+p.list[r]+'"]')[l]()}else p.$grid.find('.instance-adapter[data-instance-id="'+p.list[r]+'"]').hide()}else p.$grid.find(".instance-adapter").show();var d=!1;p.$grid.find(".instance-adapter").each(function(){if($(this).is(":visible"))return!(d=!0)}),d?p.$grid.find(".filtered-out").hide():p.$grid.find(".filtered-out").show()}function y(e){var t=$(this),i=t.data("instance-id"),a=t.data("name"),n=t.data("options"),s=t.data("value"),o=this.innerHTML,r=t.css("text-align");t.css("text-align","left"),t.off("click").removeClass("select-id-quick-edit").css("position","relative");var c,l="cursor: pointer; position: absolute;width: 16px; height: 16px; top: 2px; border-radius: 6px; z-index: 3; background-color: lightgray";if(n){var d=n.split(";");c='<select style="width: calc(100% - 50px); z-index: 2">';for(var u=0;u<d.length;u++){var m=d[u].split(":");c+='<option value="'+m[0]+'">'+(m[1]||m[0])+"</option>"}c+="</select>"}c=c||'<input style="width: 100%; z-index: 2" type="text"/>';var g=null;t.html(c+'<div class="ui-icon ui-icon-check select-id-quick-edit-ok" style="margin-top: 0.45em;'+l+';right: 22px"></div><div class="cancel ui-icon ui-icon-close select-id-quick-edit-cancel" style="margin-top: 0.45em;'+l+';right: 2px" title="'+_("cancel")+'" ></div>');var h=n?t.find("select"):t.find("input");t.find(".select-id-quick-edit-cancel").off("click").on("click",function(e){g&&clearTimeout(g),g=null,e.preventDefault(),e.stopPropagation(),t.html(o).off("click").on("click",y).addClass("select-id-quick-edit").css("text-align",r)}),t.find(".select-id-quick-edit-ok").off("click").on("click",function(){t.trigger("blur")}),h.val(s),h.blur(function(){g&&clearTimeout(g),g=setTimeout(function(){g=null;var n=$(this).val();s=JSON.stringify(n)!==JSON.stringify(s)?(p.main.socket.emit("getObject",i,function(e,t){t?(t.common=t.common||{},t.common[a]=n,"title"===a&&t.common.titleLang&&delete t.common.titleLang,p.main.socket.emit("setObject",t._id,t,function(e){e&&p.main.showError(e)})):console.log("Object "+i+" does not exist: "+e)}),'<span style="color: pink">'+s+"</span>"):o,t.html(s).off("click").on("click",y).addClass("select-id-quick-edit").css("text-align",r)}.bind(this),100)}).on("keyup",function(e){13===e.which&&$(this).trigger("blur"),27===e.which&&(void 0===s&&(s=""),t.html(s).off("click").on("click",y).addClass("select-id-quick-edit").css("text-align",r))}),"object"==typeof e&&(e.preventDefault(),e.stopPropagation()),setTimeout(function(){h.focus()},100)}this.$tab=$("#tab-instances"),this.$grid=$("#grid-instances"),this.$gridHead=$("#grid-instances-head"),this.inited=!1,this.main=i,this.list=[],this.hostsText=null,this.filterHost=!1,this.memState="memAvailable",window.tdp||(window.tdp=function(e,t){return isNaN(e)?"":e.toFixed(t||0).replace(".",",").replace(/\B(?=(\d{3})+(?!\d))/g,".")}),this.replaceInLink=function(e,t,n){if("object"!=typeof e)return o(e,t,n);var i,a=JSON.parse(JSON.stringify(e));for(var s in a)a.hasOwnProperty(s)&&(a[s]=o(a[s],t,n),i||(i=a[s]));return a.__first=i,a},this.prepare=function(){var e=p.$tab.find(".instances-filter"),t=p.$tab.find(".instances-filter-clear");e.on("change",function(){var e=$(this).val();e?($(this).addClass("input-not-empty"),t.show()):($(this).removeClass("input-not-empty"),t.hide()),p.main.saveConfig("instancesFilter",e),u(e)}).on("keyup",function(){p.filterTimeout&&clearTimeout(p.filterTimeout),p.filterTimeout=setTimeout(function(){e.trigger("change")},300)}),p.main.config.instancesFilter&&"{"!==p.main.config.instancesFilter[0]?(e.addClass("input-not-empty").val(p.main.config.instancesFilter),t.show()):t.hide(),p.$tab.find(".btn-instances-expert-mode").on("click",function(){p.main.config.expertMode=!p.main.config.expertMode,p.main.saveConfig("expertMode",p.main.config.expertMode),p.updateExpertMode(),p.main.tabs.adapters.updateExpertMode()}),p.main.config.expertMode&&p.$tab.find(".btn-instances-expert-mode").addClass("red lighten-3"),p.$tab.find(".btn-instances-reload").on("click",function(){p.init(!0,!0)}),t.on("click",function(){e.val("").trigger("change")}),this.$tab.find(".btn-instances-host").off("click").on("click",function(){p.filterHost=!p.filterHost,p.filterHost?p.$tab.find(".btn-instances-host").addClass("red lighten-3"):p.$tab.find(".btn-instances-host").removeClass("red lighten-3"),p.main.saveConfig("instancesFilterHost",p.filterHost),setTimeout(function(){u()},50)}),this.filterHost=this.main.config.instancesFilterHost||!1,this.filterHost?this.$tab.find(".btn-instances-host").addClass("red lighten-3"):this.$tab.find(".btn-instances-host").removeClass("red lighten-3")},this.updateExpertMode=function(){p.init(!0),p.main.config.expertMode?p.$tab.find(".btn-instances-expert-mode").addClass("red lighten-3"):p.$tab.find(".btn-instances-expert-mode").removeClass("red lighten-3")},this.replaceLink=function(n,i,a,s){var o;(n=n.replace(/%/g,"")).match(/^native_/)&&(n=n.substring(7)),-1===n.indexOf("_")?o=[i+"."+a,n]:(o=n.split("_"))[0].match(/\.[0-9]+$/)||(o[0]+=".0"),"protocol"===o[1]&&(o[1]="secure"),"instance"!==n?this.main.socket.emit("getObject","system.adapter."+o[0],function(e,t){t&&setTimeout(function(){var e;(e=s?p.$tab.find("#"+s).data("src"):p.$tab.find("#a_"+i+"_"+a).attr("href"))&&(e="secure"===o[1]?e.replace("%"+n+"%",t.native[o[1]]?"https":"http"):-1===e.indexOf("%"+n+"%")?e.replace("%native_"+n+"%",t.native[o[1]]):e.replace("%"+n+"%",t.native[o[1]]),s?p.$tab.find("#"+s).data("src",e):p.$tab.find("#a_"+i+"_"+a).attr("href",e))},0)}):setTimeout(function(){var e;e=(e=s?p.$tab.find("#"+s).data("src"):p.$tab.find("#a_"+i+"_"+a).attr("href")).replace("%instance%",a),s?p.$tab.find("#"+s).data("src",e):p.$tab.find("#a_"+i+"_"+a).attr("href",e)},0)},this._replaceLink=function(n,i,a,s,o){var r;(i=i.replace(/%/g,"")).match(/^native_/)&&(i=i.substring(7)),-1===i.indexOf("_")?r=[a+"."+s,i]:(r=i.split("_"))[0].match(/\.[0-9]+$/)||(r[0]+=".0"),"protocol"===r[1]&&(r[1]="secure"),this.main.socket.emit("getObject","system.adapter."+r[0],function(e,t){n=t&&n?"secure"===r[1]?n.replace("%"+i+"%",t.native[r[1]]?"https":"http"):-1===n.indexOf("%"+i+"%")?n.replace("%native_"+i+"%",t.native[r[1]]):n.replace("%"+i+"%",t.native[r[1]]):(console.log("Cannot get link "+r[1]),n.replace("%"+i+"%","")),setTimeout(function(){o(n,a,s)},0)})},this._replaceLinks=function(e,t,n,i,a){if(!e)return a(e,t,n,i);var s=e.match(/%(\w+)%/g);return s?"%ip%"===s[0]?(e=e.replace("%ip%",location.hostname),void this._replaceLinks(e,t,n,i,a)):"%instance%"===s[0]?(e=e.replace("%instance%",n),void this._replaceLinks(e,t,n,i,a)):void this._replaceLink(e,s[0],t,n,function(e,t,n){this._replaceLinks(e,t,n,i,a)}.bind(this)):a(e,t,n,i)},this._postInit=function(e,t){if(this.main.currentHost&&void 0!==this.$grid&&(!this.$grid.data("inited")||e)){this.$grid.data("inited",!0),this.list.sort();for(var n=[],i=this.list.length-1;0<=i;i--)this.main.objects[this.list[i]]&&this.main.objects[this.list[i]].common&&!this.main.objects[this.list[i]].common.localLink&&!this.main.objects[this.list[i]].common.localLinks&&this.main.objects[this.list[i]].common.noConfig&&(n.push(this.list[i]),this.list.splice(i,1));for(this.list.sort(),n.sort(),i=0;i<n.length;i++)this.list.push(n[i]);o="<tr>",o+='<th style="width: calc(2em - 6px); border-right-color: transparent; overflow: visible"><span style="overflow:visible;" >'+_("instance")+"</span></th>",o+='<th style="width: calc(2em - 6px); border-left-color: transparent; border-right-color: transparent;"></th>',o+='<th style="width: '+(p.main.config.expertMode?10:12)+'em; border-left-color: transparent;"></th>',o+='<th style="width: 12.8em">'+_("actions")+"</th>",o+='<th style="text-align: left">'+_("title")+"</th>",1<p.main.tabs.hosts.list.length&&(o+='<th style="width: 10em">'+_("host")+"</th>"),o+='<th style="width: 8em">'+_("schedule_group")+"</th>",p.main.config.expertMode&&(o+='<th style="width: 8em">'+_("restart")+"</th>",o+='<th style="width: 8em">'+_("loglevel")+"</th>",o+='<th style="width: 8em">'+_("memlimit")+"</th>",o+='<th style="width: 8em">'+_("events")+"</th>"),o+='<th style="width: 8em">'+_("RAM usage")+"</th>",p.$gridHead.html(o),this.$grid.html("");for(var a=Date.now(),s=0;s<this.list.length;s++){this.main.objects[this.list[s]]&&d(this.$grid,this.list[s],this.main.config.instanceForm)}console.log(Date.now()-a),this.$grid.append('<tr class="filtered-out"><td></td><td></td><td colspan="20" style="padding-left: 1em">'+_("Filtered out")+"</td></tr>"),p.$tab.find("#currentHost").html(this.main.currentHost),1<p.main.tabs.hosts.list.length?this.$tab.find(".btn-instances-host").show():(this.$tab.find(".btn-instances-host").hide(),this.filterHost=!1),u(),r(),c(),l(),p.restoreScroll(),t&&p.main.showToast(p.$tab.find(".main-toolbar-table"),_("Updated"))}var o},this.getInstances=function(a){this.main.socket.emit("getForeignObjects","system.adapter.*","state",function(e,t){for(var n in t)t.hasOwnProperty(n)&&(p.main.objects[n]=t[n]);p.main.socket.emit("getForeignStates","*.info.connection",function(e,t){for(var n in t)t.hasOwnProperty(n)&&(p.main.states[n]=t[n]);p.main.socket.emit("getForeignStates","system.adapter.*",function(e,t){for(var n in t)t.hasOwnProperty(n)&&(p.main.states[n]=t[n]);p.main.socket.emit("getForeignObjects","system.adapter.*","instance",function(e,t){for(var n in p.main.instances.splice(0,p.main.instances.length),t)if(t.hasOwnProperty(n)){var i=t[n];"instance"===(p.main.objects[n]=i).type&&p.main.instances.push(n)}a&&a()})})})})},this.init=function(e,t){if(!this.inited||e)if(this.main.objectsLoaded){var n=0;n++,this.getInstances(function(){--n||p._postInit(e,t)}),n++,this.main.tabs.hosts.getHosts(function(){--n||p._postInit(e,t)}),this.inited||(this.inited=!0,this.main.subscribeObjects("system.adapter.*"),this.main.subscribeStates("system.adapter.*"),this.main.subscribeObjects("system.host.*"),this.main.subscribeStates("system.host.*"),this.main.subscribeStates("*.info.connection"))}else setTimeout(function(){p.init(e,t)},250)},this.saveScroll=function(){this.scrollTop=this.$tab.find(".grid-main-div").scrollTop()},this.restoreScroll=function(){this.scrollTop&&this.$tab.find(".grid-main-div").scrollTop(this.scrollTop)},this.destroy=function(){this.inited&&(this.saveScroll(),this.$grid.data("inited",!1),this.inited=!1,this.main.unsubscribeObjects("system.adapter.*"),this.main.unsubscribeStates("system.host.*"),this.main.unsubscribeObjects("system.host.*"),this.main.unsubscribeStates("system.adapter.*"),this.main.unsubscribeStates("*.info.connection"))},this.stateChange=function(e,t){if(this.main.states[e]=t,this.$grid){var n=e.split("."),i=n.pop();if(e=n.join("."),t){if("diskFree"===i||"diskWarning"===i)l();else if(i===p.memState)c();else if("memRss"===i){r();var a=p.$tab.find('.memUsage[data-instance-id="'+e+'"]'),s=M(e);a.length&&a.text()!==s&&a.html('<span class="highlight">'+s+"</span>")}else"outputCount"===i?p.$tab.find('.instance-out[data-instance-id="'+e+'"]').html('<span class="highlight">↦'+t.val+"</span>"):"inputCount"===i&&p.$tab.find('.instance-in[data-instance-id="'+e+'"]').html('<span class="highlight">⇥'+t.val+"</span>");if(-1!==this.list.indexOf(e))return void("alive"!==i&&"connected"!==i||f(e));e="system.adapter."+n[0]+"."+n[1],-1!==this.list.indexOf(e)&&"connection"===i&&f(e)}}},this.objectChange=function(e,t,n){if(e.match(/^system\.adapter\.[-\w]+\.[0-9]+$/))if(t)-1===this.list.indexOf(e)?(this.list.push(e),this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(function(){p.updateTimer=null,p.init(!0)},200),t.common.noConfig||setTimeout(function(){-1===window.location.hash.indexOf("/config/")&&p.main.navigate({tab:"instances",dialog:"config",params:e})},2e3)):-1!==e.indexOf(".web.")?(this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(function(){p.updateTimer=null,p.init(!0)},200)):this.$grid.find('.instance-adapter[data-instance-id="'+e+'"]').html(d(this.$grid,e,this.main.config.instanceForm,!0));else{var i=this.list.indexOf(e);-1!==i&&(this.list.splice(i,1),this.$grid.find('.instance-adapter[data-instance-id="'+e+'"]').remove())}else e.match(/^system\.host\.[-\w]+$/)&&(this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(function(){p.updateTimer=null,p.init(!0)},200))},this.initButtons=function(e,t){e=e?'[data-instance-id="'+e+'"]':"";var n=p.$grid.find(".instance-edit"+e).off("click").on("click",function(){p.onEdit($(this).attr("data-instance-id"))});n.find(".ui-button-icon-primary").length||n.attr("title",_("edit")),(n=p.$grid.find(".instance-settings"+e).off("click").on("click",function(){p.main.navigate({tab:"instances",dialog:"config",params:$(this).data("instance-id")})})).each(function(){var e=$(this).attr("data-instance-id");i.objects[e]&&i.objects[e].common&&i.objects[e].common.noConfig&&$(this).addClass("disabled")}),n=p.$grid.find(".instance-reload"+e).off("click").on("click",function(){p.main.socket.emit("extendObject",$(this).attr("data-instance-id"),{},function(e){e&&p.main.showError(e)})}),n=p.$grid.find(".instance-del"+e).off("click").on("click",function(){var t=$(this).attr("data-instance-id");if(p.main.objects[t]&&p.main.objects[t].common&&p.main.objects[t].common.host){var e=t.replace(/^system\.adapter\./,"");p.main.confirmMessage(_("Are you sure you want to delete the instance <b>%s</b>?",e),null,"help",function(e){e&&p.main.cmdExec(p.main.objects[t].common.host,"del "+t.replace("system.adapter.",""),function(e){e||p.main.tabs.adapters.init(!0)})})}}),n=p.$grid.find(".instance-issue"+e).off("click").on("click",function(){p.main.navigate({tab:"instances",dialog:"issue",params:$(this).data("instance-id")})}),p.$grid.find(".instance-image"+e).each(function(){$(this).data("installed")||($(this).data("installed",!0),$(this).hover(function(){var e='<div class="icon-large" style="left: '+Math.round($(this).position().left+$(this).width()+5)+'px;"><img src="'+$(this).attr("src")+'"/></div>',t=$(e);t.insertAfter($(this)),$(this).data("big",t[0]);var n=parseFloat(t.height()),i=Math.round($(this).position().top-(n-parseFloat($(this).height()))/2);n+i>(window.innerHeight||document.documentElement.clientHeight)&&(i=(window.innerHeight||document.documentElement.clientHeight)-n),i<0&&(i=0),t.css({top:i})},function(){var e=$(this).data("big");$(e).remove(),$(this).data("big",void 0)}))}),(n=p.$grid.find(".instance-stop-run"+e).off("click").on("click",function(){var e=$(this).attr("data-instance-id");$(this).addClass("disabled"),p.main.socket.emit("extendObject",e,{common:{enabled:!p.main.objects[e].common.enabled}},function(e){e&&p.main.showError(e)})})).find(".ui-button-icon-primary").length||n.each(function(){var e=$(this).attr("data-instance-id");p.main.objects[e].common.enabled?n.addClass("instance-running").attr("title",_("Activated. Click to stop.")).find("i").html("pause"):n.removeClass("instance-running").attr("title",_("Deactivated. Click to start.")).find("i").html("play_arrow")}),n=p.$grid.find(".instance-web"+e).off("click").on("click",function(){var e=$(this).data("link");if("object"==typeof e){var t="";for(var n in e)if(e.hasOwnProperty(n)&&"__first"!==n){var i=e[n].match(/^https?:\/\/[-.\w]+:(\d+)\/?/),a=e[n].match(/^https:\/\//);t+='<li data-link="'+e[n]+'" data-instance-id="'+$(this).data("instance-id")+'" class="instances-menu-link"><b>'+n+(i?" :"+i[1]:"")+(a?" - SSL":"")+"</b></li>"}t+='<li class="instances-menu-link">'+_("Close")+"</li>";var s=$("#instances-menu");s.data("inited")&&s.menu("destroy");var o=$(this).position();s.html(t),s.data("inited")||(s.data("inited",!0),s.mouseleave(function(){$(this).hide()})),s.menu().css({left:o.left,top:o.top}).show(),s.find(".instances-menu-link").off("click").on("click",function(){$(this).data("link")&&window.open($(this).data("link"),$(this).data("instance-id")),$("#instances-menu").hide()})}else window.open($(this).data("link"),$(this).data("instance-id"))}),"object"==typeof t&&n.data("link",t)},this.resize=function(e,t){}}function Intro(e){var T=this;function t(e){var t=Math.floor(e/86400);e%=86400;var n=Math.floor(e/3600);n<10&&(n="0"+n),e%=3600;var i=Math.floor(e/60);i<10&&(i="0"+i),e%=60,(e=Math.floor(e))<10&&(e="0"+e);var a="";return t&&(a+=t+" "+_("daysShortText")+" "),a+=n+":"+i+":"+e}this.$tab=$("#tab-intro"),this.$tiles=this.$tab.find(".tab-intro-cards"),this.main=e,this.inited=!1,this.$template=$("#intro-template");var d={Uptime:t,"System uptime":t,RAM:function(e){var t=Math.floor(e/1073741824*10)/10;e%=1073741824;var n=Math.floor(e/1048576*10)/10,i="";return i+=1<t?t+" GB ":n+" MB "},Speed:function(e){return e+" MHz"},"Disk size":T.main.formatBytes,"Disk free":T.main.formatBytes};function u(e){var t=$("<textarea>");$(this).append(t),t.val($(this).data("clippy")),t.trigger("select"),document.execCommand("copy"),t.remove(),e.preventDefault(),e.stopPropagation(),T.main.showToast(T.$tiles,_("copied"))}function C(e){var t,c=T.$template.clone();if(c.removeAttr("id"),c.addClass("card-system-info"),c.find(".btn-small").addClass("disabled"),c.find(".card-titles").text(e.name),c.find(".btn-card-enabled").data("host",e.id),!1===T.main.systemConfig.common.intro[e.id]){if(!T.$tab.hasClass("edit-active"))return null;c.addClass("card-disabled").find(".btn-card-enabled").removeClass("blue").addClass("gray").find("i").text("close")}T.main.objects[e.id]&&T.main.objects[e.id].common&&(t=T.main.objects[e.id].common.icon),c.find(".card-image-img").attr("src",t||"img/no-image.png"),c.find(".card-content-text").html('<div class="preloader-wrapper small active">\n <div class="spinner-layer spinner-green-only">\n <div class="circle-clipper left">\n <div class="circle"></div>\n </div><div class="gap-patch">\n <div class="circle"></div>\n </div><div class="circle-clipper right">\n <div class="circle"></div>\n </div>\n </div>\n </div>');var l=setTimeout(function(){l&&(l=null,c.find(".btn-small").addClass("disabled"),c.find(".card-content-text").html(_("offline")))},6e3);return d["Disk size"]=d["Disk size"]||T.main.formatBytes,d["Disk free"]=d["Disk size"]||T.main.formatBytes,T.main.socket.emit("sendToHost",e.id,"getHostInfo",null,function(e){clearTimeout(l),l=null,"permissionError"===e?console.error('May not read "getHostInfo"'):e?c.find(".btn-small").removeClass("disabled"):console.error('Cannot read "getHostInfo"');var t=T.main.states["system.host."+T.main.currentHost+".diskWarning"];t=t?parseFloat(t.val):5;var n=0<e["Disk size"]&&e["Disk free"]&&Math.round(e["Disk free"]/e["Disk size"]*100)<t,i='<div class="card-content-text">';if(e){for(var a in i+="<ul>",e)!e.hasOwnProperty(a)||"Platform"!==a&&"NPM"!==a&&"RAM"!==a&&"Node.js"!==a||(i+="<li><b>"+_(a)+": </b>",i+='<span class="system-info" data-attribute="'+a+'">'+(d[a]?d[a](e[a]):e[a]||" --")+"</span></li>");n&&(i+="<li><b>"+_("Disk free")+": </b>",i+='<span class="system-info system-warning" data-attribute="Disk free">'+(d["Disk free"]?d["Disk free"](e["Disk free"]):e["Disk free"]||" --")+"</span></li>",i+="<li><b>"+_("Disk size")+": </b>",i+='<span class="system-info" data-attribute="Disk size">'+(d["Disk size"]?d["Disk size"](e["Disk size"]):e["Disk size"]||" --")+"</span></li>"),i+="</ul>"}i+="</div>",c.find(".card-content-text").replaceWith($(i)),i='<div class="card-reveal"><h5>'+_("Info")+'</h5><a class="btn-info" title="'+_("Copy to clipboard")+'"><i class="material-icons">content_copy</i></a><span class="card-title grey-text text-darken-4"><i class="material-icons right">close</i></span>';var s=[];if(e){for(var o in i+="<ul>",e)if(e.hasOwnProperty(o)){i+="<li><b>"+_(o)+": </b>";var r=d[o]?d[o](e[o]):e[o];s.push(o+": "+r),i+="Disk free"===o&&n?'<span class="system-info system-warning" data-attribute="'+o+'">'+r+"</span></li>":'<span class="system-info" data-attribute="'+o+'">'+r+"</span></li>"}i+="</ul>"}i+="</div>",c.find(".card-reveal").replaceWith($(i)),T.$tab.hasClass("edit-active")?c.find(".btn-small").hide():c.find(".btn-info").data("clippy",s.join("\r\n")).on("click",u)}),c}function D(e,t,n,i,a,s,o){var r=T.$template.clone();r.removeAttr("id");var c=a.replace(/^https?:\/\//,""),l=c.indexOf("/");if(-1!==l&&(c=c.substring(0,l)),"admin"===e&&c===location.host)return null;if("web"===e)return null;if("vis-web-admin"!==e&&e.match(/^vis-/))return null;if(e.match(/^icons-/))return null;if(i&&i.noIntro)return null;r.find(".btn-card-enabled").data("instance",e+"."+t+(n&&n.name?"."+n.name:"")).data("web",s),o?r.on("click",function(){T.$tab.hasClass("edit-active")||window.open($(this).find(".url").attr("href"))}):r.addClass("card-disabled").find(".btn-card-enabled").removeClass("blue").addClass("gray").find("i").text("close"),r.find(".url").attr("href","object"==typeof a?a._first:a||"").text(c+(s?" ("+s+")":"")),r.find(".card-image-img").attr("src",i.icon?"adapter/"+e+"/"+i.icon:"img/no-image.png"),n&&n.color&&r.find(".card-image").css("background",n.color);var d=n&&n.name||i.titleLang||i.title;"object"==typeof d&&(d=d[systemLang]||d.en),r.find(".card-titles").text(d||e);var u=i.desc;return"object"==typeof u&&(u=u[systemLang]||u.en),r.find(".card-content-text").text(u||""),r}function n(e,i){!function(e,t){var n,i,a,s=JSON.parse(JSON.stringify(e)),o=[];s.sort(function(e,t){return e=T.main.objects[e]&&T.main.objects[e].common,t=(t=T.main.objects[t]&&T.main.objects[t].common)||{},void 0===(e=e||{}).order&&void 0===t.order?e.name.toLowerCase()>t.name.toLowerCase()?1:e.name.toLowerCase()<t.name.toLowerCase()?-1:0:void 0===e.order?-1:void 0===t.order?1:e.order>t.order?1:e.order<t.order?-1:e.name.toLowerCase()>t.name.toLowerCase()?1:e.name.toLowerCase()<t.name.toLowerCase()?-1:0});var r=T.$tab.hasClass("edit-active"),c=[];for(n=0;n<s.length;n++){var l=T.main.objects[s[n]],d=l&&l.common;if(d&&(d.enabled||d.onlyWWW)&&(d.localLinks||d.localLink)){var u=d.localLinks||d.localLink||"",m=s[n].substring("system.adapter.".length).split("."),g=m[1];m=m[0];var h=u?T.main.tabs.instances.replaceInLink(u,m,g):"";a=null;var f=T.main.systemConfig.common.intro[m+"."+g];if("object"==typeof h){var p=!0;for(var b in h)if(h.hasOwnProperty(b)){if(i=!0,void 0!==f){if(p&&"object"!=typeof f){var M=f;f={},(T.main.systemConfig.common.intro[m+"."+g]=f)[b]=M}!1===f[b]&&(i=!1)}if(p=!1,!r&&!i)continue;-1===c.indexOf(h[b])&&((a=D(m,g,null,d,h[b],b,i))&&o.push(a),c.push(h[b]))}}else{if(i=!0,!r&&void 0!==f){if("object"==typeof f)for(var y in f)if(f.hasOwnProperty(y)){f=f[y],T.main.systemConfig.common.intro[m+"."+g]=f;break}!1===f&&(i=!1)}for(var v=d.welcomeScreen;v;){if(f=T.main.systemConfig.common.intro[m+"."+g+"."+v.name],!r&&void 0!==f){if("object"==typeof f)for(var w in f)if(f.hasOwnProperty(w)){f=f[w],T.main.systemConfig.common.intro[m+"."+g+"."+v.name]=f;break}!1===f&&(i=!1)}if(T.main.systemConfig.common.intro[m+"."+g+"."+v.name]=f,r||i){var j=h,L=j.match(/https?:\/\/[.\w\d-]+:\d+\/(.*)$/);L?j=j.replace(L[1],v.link):j+=v.link,j!==h&&-1===c.indexOf(j)&&((a=D(m,g,v,d,j,null,i))&&o.push(a),c.push(j))}v=v===d.welcomeScreenPro?d.welcomeScreen:null}if(!r&&!i)continue;-1===c.indexOf(h)&&((a=D(m,g,null,d,h,null,i))&&o.push(a),c.push(h))}}}for(var N=0;N<T.main.tabs.hosts.list.length;N++)(a=C(T.main.tabs.hosts.list[N]))&&o.push(a);t(null,o)}(e=e||T.main.instances,function(e,t){T.$tiles.html("");for(var n=0;n<t.length;n++)T.$tiles.append(t[n]);T.$tab.hasClass("edit-active")&&T.$tiles.find(".btn-card-enabled").on("click",function(){!$(this).hasClass("gray")?($(this).removeClass("blue").addClass("gray").find("i").text("close"),$(this).parent().addClass("card-disabled")):($(this).addClass("blue").removeClass("gray").find("i").text("check"),$(this).parent().removeClass("card-disabled"))}),i&&i()})}this.prepare=function(){this.$tab.find(".btn-edit").off("click").on("click",function(){T.$tab.addClass("edit-active"),n()}),this.$tab.find(".btn-edit-ok").off("click").on("click",function(){!function(n){var t=[];T.$tiles.find(".btn-card-enabled").each(function(){var e=$(this).data("instance");e?t.push({id:e,enabled:!$(this).hasClass("gray"),web:$(this).data("web")}):t.push({id:$(this).data("host"),enabled:!$(this).hasClass("gray")})});for(var e=T.main.systemConfig.common.intro,i=!0,a=0;a<t.length;a++){var s,o=t[a].id;if(t[a].web){if(void 0!==e[o]&&"object"!=typeof e[o]){var r=e[o];e[o]={},e[o][t[a].web]=r}s=!e[o]||void 0===e[o][t[a].web]||e[o][t[a].web]}else{if(void 0!==e[o]&&"object"==typeof e[o])for(var c in e[o])if(e[o].hasOwnProperty(c)){e[o]=e[o][c];break}s=void 0===e[o]||e[o]}t[a].enabled!==s&&(i=!0,t[a].web?(e[o]=e[o]||{},e[o][t[a].web]=t[a].enabled):e[o]=t[a].enabled)}i?T.main.socket.emit("getObject","system.config",function(e,t){t?(t.common.intro=T.main.systemConfig.common.intro,T.main.socket.emit("setObject",t._id,t,function(e){n&&n()})):n&&n()}):n&&n()}(function(){T.$tab.removeClass("edit-active"),n(),T.main.showToast(T.$tiles,_("Updated"))})}),this.$tab.find(".btn-edit-cancel").off("click").on("click",function(){T.$tab.removeClass("edit-active"),n()})},this.init=function(e){var i;this.inited&&!e||(this.main.objectsLoaded?(T.main.systemConfig.common.intro=T.main.systemConfig.common.intro||{},i=function(e,t){n(t,function(){T.restoreScroll()})},T.main.socket.emit("getObjectView","system","instance",{startkey:"system.adapter.",endkey:"system.adapter.香"},function(e,t){if(e)i&&i(e,[]);else if(0===t.rows.length)i&&i(e,[]);else{T.main.instances=[];for(var n=0;n<t.rows.length;n++)T.main.instances.push(t.rows[n].id),T.main.objects[t.rows[n].id]=t.rows[n].value;i&&i(e,T.main.instances)}}),this.inited||(this.inited=!0,this.main.subscribeObjects("system.adapter.*"),this.main.subscribeObjects("system.host.*"))):setTimeout(function(){T.init(e)},250))},this.saveScroll=function(){this.scrollTop=this.$tiles.scrollTop()},this.restoreScroll=function(){T.scrollTop&&T.$tiles.scrollTop(T.scrollTop)},this.destroy=function(){this.inited&&(this.saveScroll(),this.inited=!1,this.main.unsubscribeObjects("system.adapter.*"),this.main.unsubscribeObjects("system.host.*"))},this.objectChange=function(e){this.inited&&(e.match(/^system\.adapter\.[a-zA-Z0-9-_]+\.\d+$/)||e.match(/^system\.host\./))&&(this.updateTimeout&&(this.updateTimeout=clearTimeout(this.updateTimeout)),this.updateTimeout=setTimeout(function(){n()},1e3))}}function Issue(e){var a=this;this.$dialogIssue=$("#dialog-issue"),this.main=e,this.prepare=function(){},this.init=function(){if(!this.inited){this.inited=!0,showdown.setFlavor("github");var e=this.main.navigateGetParams(),t=e.replace(/^system\.adapter\./,""),n=this.main.objects[e];if(n&&n.common&&n.common.extIcon){var i=n.common.extIcon.split("/"),r=a.$dialogIssue.find("#result-issue");r.html('<div class="loader"><svg class="spinner" width="100%" height="100%" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg">\n <circle class="path" fill="none" stroke-width="6" stroke-linecap="round" cx="33" cy="33" r="30"></circle>\n</svg></div>');$.getJSON("https://api.github.com/repos/"+i[3]+"/"+i[4]+"/issues",function(e){var t=!1;for(var n in r.empty(),e)if(e.hasOwnProperty(n)){if("remove"===n)break;var i=e[n];if(!i.hasOwnProperty("pull_request")){t=!0;var a=$("#issueTable").children().clone(!0,!0);a.find(".collapsible-header-title").text(i.title),a.find(".goto").attr("href",i.html_url),a.find(".user").text(i.user.login),a.find(".form-row").html((new showdown.Converter).makeHtml(i.body).replace(/src="/g,'class="responsive-img" src="'));var s=new Date(new Date(i.created_at));if(a.find(".created").text(s.toLocaleDateString(systemLang,{weekday:"short",year:"numeric",month:"long",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})),0<i.labels.length)for(var o in i.labels)if(i.labels.hasOwnProperty(o)){if("remove"===o)break;a.find(".category").append('<a class="btn-floating btn-small translateT" style="background:#'+i.labels[o].color+';" title="'+i.labels[o].name+'"><span>'+i.labels[o].name+"</span></a>")}r.append(a),0}}t||r.append($('<li><h3 class="title">'+_("No bug")+"</h3></li>"))}).done(a.$dialogIssue.find(".collapsible").collapsible())}a.$dialogIssue.data("name",t),a.$dialogIssue.find(".title").html(_("Known bugs for")+": "+t),a.$dialogIssue.find(".dialog-system-buttons .btn-add").attr("href","https://github.com/"+i[3]+"/"+i[4]+"/issues/new"),a.$dialogIssue.find(".dialog-system-buttons .btn-cancel").off("click").on("click",function(e){e.stopPropagation(),e.preventDefault(),a.main.navigate()})}},this.destroy=function(){this.inited&&(this.$dialogIssue.find(".collapsible").collapsible("destroy"),this.inited=!1)}}function Logs(t){var c=this;this.main=t,this.$tab=$("#tab-logs");var s,l,o,d,r={count:0,start:0,limit:2e3},u={host:"",severity:"",message:""},m={list:[],mode:!1,counter:0,overflow:!1,$counterSpan:null};this.prepare=function(){l=this.$tab.find("#log-outer"),s=this.$tab.find("#log-table"),o=this.$tab.find("#log-pause"),(d=new IobListHeader("log-outer-header",{list:l,colWidthOffset:1,prefix:"log-filter"})).doFilter=c.filter,d.add("combobox","from","host"),d.add("text","Time"),d.add("combobox","","severity",[{val:"",name:"debug"},{val:"silly",name:"silly"},{val:"info",name:"info"},{val:"warn",name:"warn"},{val:"error",name:"error"}]).$filter.attr("title",_("severity")),d.add("edit","Message","message"),this.$tab.find("#log-clear-on-disk").on("click",function(){c.main.confirmMessage(_("Log file will be deleted. Are you sure?"),null,null,function(e){e&&c.main.socket.emit("sendToHost",t.currentHost,"delLogs",null,function(e){e?c.main.showError(e):c.clear()})})}).addClass("ui-state-error"),this.$tab.find("#log-refresh").on("click",function(){c.clear()}),o.attr("title",_("Pause output")).on("click",function(){c.pause()}),m.$counterSpan=o.find("ui-button-text"),this.$tab.find("#log-clear").on("click",function(){c.clear(!1)}),$("#log-copy-text").on("click",function(){$(this).hide().html("")}),this.$tab.find("#log-copy").on("click",function(){var e='<span class="error">'+_("copy note")+"</span>";$("#log-copy-text").show().html(e+'<br><table style="width: 100%; font-size: 12px" id="log-copy-table">'+s.html()+"</table>");for(var t=c.$tab.find("#log-copy-table").find(".log-column-4"),n=0;n<t.length;n++){var i=$(t[n]);i.html(i.attr("title")),i.attr("title","")}})},this.init=function(e){if(!this.inited||e)if(this.main.currentHost){s.html("");var r=!this.inited;this.inited=!0,this.main.socket.emit("sendToHost",this.main.currentHost,"getLogs",200,function(o){setTimeout(function(){var e={message:"",severity:"debug",from:"",ts:""},t=o?o.pop():-1;-1!==t&&(t=parseInt(t),c.$tab.find("#log-size").html((_("Log size:")+" "+(t/1048576).toFixed(2)+" MB ").replace(/ /g," ")));for(var n=0,i=o.length;n<i;n++)if(o[n]){var a=o[n];if("-"===a[4]&&"-"===a[7]){a=a.replace(/(\[[0-9]+m)/g,""),e.ts=a.substring(0,23);var s=(a=a.substring(27)).indexOf(":");e.severity=a.substring(0,s),27===e.severity.charCodeAt(e.severity.length-1)&&(e.severity=e.severity.substring(0,e.severity.length-1)),27===e.severity.charCodeAt(0)&&(e.severity=e.severity.substring(1)),s=(a=a.substring(s+2)).indexOf(" "),e.from=a.substring(0,s),e.message=a.substring(s)}else e.message=a;c.add(e)}!function e(){$.fn.colResizable&&(l.is(":visible")?(l.colResizable({liveDrag:!0,partialRefresh:!0,marginLeft:5,postbackSafe:!0,onResize:function(e){return d.syncHeader()}}),d&&d.syncHeader()):setTimeout(function(){e()},200))}(),u.host=d.host.val(),u.message=d.message.val(),u.severity=d.severity.val(),r&&c.main.subscribeLogs(!0),c.main.socket.emit("readLogs",function(e,t){if(t&&t.length){var n="";t.reverse();for(var i=0;i<t.length;i++){var a=t[i].split("/").pop().replace(/yunkong2\.?/,"").replace(".log","");a[0]<="9"&&(n+='<li><a data-value="'+t[i]+'">'+a+"</a></li>")}t.sort();for(var s=0;s<t.length;s++){var o=t[s].split("/").pop().replace(/yunkong2\.?/,"").replace(".log","");"9"<o[0]&&(n+='<li><a data-value="'+t[s]+'">'+o+"</a></li>")}c.$tab.find("#log-files-btn").show().dropdown(),c.$tab.find("#log-files").html(n).find("a").on("click",function(){var e=$(this).data("value");e&&($(this).val(""),window.open(e,"_blank").focus())})}else c.$tab.find("#log-files").hide(),c.$tab.find("#log-files-btn").hide()})},0)})}else setTimeout(function(){c.init(e)},100)},this.destroy=function(){this.inited&&(this.inited=!1,this.main.subscribeLogs(!1))},this.add=function(e){if(s){if(e.message.substring(0,e.from.length)===e.from&&(e.message=e.message.substring(e.from.length+1)),m.mode)return m.list.push(e),m.counter++,m.counter>r.limit&&(m.overflow||(o.addClass("ui-state-error").attr("title",_("Message buffer overflow. Losing oldest")),m.overflow=!0),m.list.shift()),void m.$counterSpan.html(tdp(m.counter));if(r.count>=r.limit){var t=document.getElementById("log-line-"+(r.start+1));t&&(t.outerHTML=""),r.start++}else r.count++;e.from&&d&&d.host.checkAddOption(e.from,function(e){return{val:e.replace(/\./g,"-"),name:e}});var n="",i=e.from?e.from.replace(/\./g,"-"):"";u.host&&u.host!==i&&(n="display: none"),!n&&u.severity&&("debug"===u.severity&&"silly"===e.severity?n="display: none":"info"!==u.severity||"debug"!==e.severity&&"silly"!==e.severity?"warn"===u.severity&&"warn"!==e.severity&&"error"!==e.severity?n="display: none":"error"===u.severity&&"error"!==e.severity&&(n="display: none"):n="display: none"),!n&&u.message&&-1===e.message.indexOf(u.message)&&(n="display: none"),"error"===e.severity&&(c.$tabLogs=c.$tabLogs||$('a[href="#tab-logs"]'),c.$tabLogs.addClass("errorLog"));var a='<tr id="log-line-'+(r.start+r.count)+'" class="log-line log-severity-'+e.severity+" "+(i?"log-from-"+i:"")+'" style="'+n+'">';a+='<td class="log-column-1">'+(e.from||"")+"</td>",a+='<td class="log-column-2">'+this.main.formatDate(e.ts)+"</td>",a+='<td class="log-column-3">'+e.severity+"</td>",a+='<td class="log-column-4" title="'+e.message.replace(/"/g,"'")+'">'+e.message.substring(0,200).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")+"</td></tr>",s.prepend(a)}},this.filter=function(){u.host=d.host.val(),u.message=d.message.val(),u.severity=d.severity.val(),"error"===u.severity?(l.find(".log-severity-silly").hide(),l.find(".log-severity-debug").hide(),l.find(".log-severity-info").hide(),l.find(".log-severity-warn").hide()):("warn"===u.severity?(l.find(".log-severity-silly").hide(),l.find(".log-severity-debug").hide(),l.find(".log-severity-info").hide()):("info"===u.severity?(l.find(".log-severity-silly").hide(),l.find(".log-severity-debug").hide()):("silly"===u.severity?l.find(".log-severity-silly").show():l.find(".log-severity-silly").hide(),l.find(".log-severity-debug").show()),l.find(".log-severity-info").show()),l.find(".log-severity-warn").show()),l.find(".log-severity-error").show(),(u.host||u.message)&&l.find(".log-line").each(function(){u.host&&!$(this).hasClass("log-from-"+u.host)?$(this).hide():u.message&&-1===$(this).html().indexOf(u.message)&&$(this).hide()})},this.clear=function(e){void 0===e&&(e=!0),s.html(""),r.count=0,r.start=0,c.$tabLogs=c.$tabLogs||$('a[href="#tab-logs"]'),c.$tabLogs.removeClass("errorLog"),e&&setTimeout(function(){c.init(e)},0)},this.pause=function(){if(m.mode){m.mode=!1;for(var e=0;e<m.list.length;e++)this.add(m.list[e]);m.overflow=!1,m.list=[],m.counter=0,o.removeClass("yellow btn-pause-button-active").html('<i class="material-icons">pause</i>')}else o.addClass("yellow btn-pause-button-active"),m.$counterSpan=o,m.$counterSpan.html("0"),m.counter=0,m.mode=!0}}function Issue(e){var a=this;this.$dialog=$("#dialog-issue"),this.main=e,this.prepare=function(){},this.init=function(){if(!this.inited){this.inited=!0,showdown.setFlavor("github");var e=this.main.navigateGetParams(),t=e.replace(/^system\.adapter\./,""),n=this.main.objects[e];if(n&&n.common&&n.common.extIcon){var i=n.common.extIcon.split("/"),r=$("#result-issue");r.html('<div class="loader"><svg class="spinner" width="100%" height="100%" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg">\n <circle class="path" fill="none" stroke-width="6" stroke-linecap="round" cx="33" cy="33" r="30"></circle>\n</svg></div>');$.getJSON("https://api.github.com/repos/"+i[3]+"/"+i[4]+"/issues",function(e){var t=!1;for(var n in r.empty(),e)if(e.hasOwnProperty(n)){if("remove"===n)break;var i=e[n];if(!i.hasOwnProperty("pull_request")){t=!0;var a=$("#issueTable").children().clone(!0,!0);a.find(".collapsible-header-title").text(i.title),a.find(".goto").attr("href",i.html_url),a.find(".user").text(i.user.login),a.find(".form-row").html((new showdown.Converter).makeHtml(i.body).replace(/src="/g,'class="responsive-img" src="'));var s=new Date(new Date(i.created_at));if(a.find(".created").text(s.toLocaleDateString(systemLang,{weekday:"short",year:"numeric",month:"long",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})),0<i.labels.length)for(var o in i.labels)if(i.labels.hasOwnProperty(o)){if("remove"===o)break;a.find(".category").append('<a class="btn-floating btn-small translateT" style="background:#'+i.labels[o].color+';" title="'+i.labels[o].name+'"><span>'+i.labels[o].name+"</span></a>")}r.append(a),0}}t||r.append($('<li><h3 class="title">'+_("No bug")+"</h3></li>"))}).done(a.$dialog.find(".collapsible").collapsible())}a.$dialog.data("name",t),a.$dialog.find(".title").html(_("Known bugs for")+": "+t),a.$dialog.find(".dialog-system-buttons .btn-add").attr("href","https://github.com/"+i[3]+"/"+i[4]+"/issues/new"),a.$dialog.find(".dialog-system-buttons .btn-cancel").off("click").on("click",function(e){e.stopPropagation(),e.preventDefault(),a.main.navigate()})}},this.destroy=function(){this.inited&&(this.$dialog.find(".collapsible").collapsible("destroy"),this.inited=!1)}}function Objects(e){var c=this;this.$grid=$("#grid-objects"),this.subscribes={},this.main=e;var o=function(){if(c.$grid&&c.$grid.selectId)return o=c.$grid.selectId.bind(c.$grid),c.$grid.selectId.apply(c.$grid,arguments)};function r(t,e,n){for(var i=c.main.tabs.enums.list,a=[],s=0;s<i.length;s++)i[s].substring(0,"enum.".length+e.length+1)==="enum."+e+"."&&a.push(i[s]);!function t(n,i,a,s){if(i&&i.length){var e=i.pop();if(c.main.objects[e]&&c.main.objects[e].common){var o=0;if(c.main.objects[e].common.members&&c.main.objects[e].common.members.length){var r=c.main.objects[e].common.members.indexOf(n);-1!==r&&-1===a.indexOf(e)&&(c.main.objects[e].common.members.splice(r,1),o++,c.main.socket.emit("setObject",e,c.main.objects[e],function(e){e&&c.main.showError(e),--o||setTimeout(function(){t(n,i,a,s)},0)}))}-1===a.indexOf(e)||c.main.objects[e].common.members&&-1!==c.main.objects[e].common.members.indexOf(n)||(c.main.objects[e].common.members=c.main.objects[e].common.members||[],c.main.objects[e].common.members.push(n),o++,c.main.socket.emit("setObject",e,c.main.objects[e],function(e){e&&c.main.showError(e),--o||setTimeout(function(){t(n,i,a,s)},0)}))}o||setTimeout(function(){t(n,i,a,s)},0)}else s&&s()}(t,a,n,function(e){e&&c.main.showError(e),o("object",t,c.main.objects[t])})}function a(e){console.log("Subscribe: "+e),c.main.subscribeStates(e),c.main.socket.emit("getForeignStates",e,function(e,t){if(t)for(var n in t)console.log("Update "+n),t.hasOwnProperty(n)&&(!t[n]&&c.main.states[n]?(c.main.states[n]={val:null},c.stateChange(n,c.main.states[n])):c.main.states[n]&&c.main.states[n].ts===t[n].ts||(c.main.states[n]=t[n],c.stateChange(n,t[n])));else e&&console.error("requestStates error: "+e)})}function n(){for(var e in c.subscribes){if(c.subscribes.hasOwnProperty(e))c.main.objects[e]&&"state"===c.main.objects[e].type?(c.main.unsubscribeStates(e),console.log("Unsubscribe: "+e)):(c.main.unsubscribeStates(e+".*"),console.log("Unsubscribe: "+e+".*"))}}function s(n,i){if(n)for(var e in n)if(n.hasOwnProperty(e)&&n[e]){var a=n[e];return n[e]=null,void c.main.socket.emit("setObject",e,a,function(e){e?c.main.showError(e):"state"===a.type?c.main.socket.emit("getState",a._id,function(e,t){t&&null!==t.val||c.main.socket.emit("setState",a._id,a.common&&void 0!==a.common.def?a.common.def:null,!0),setTimeout(s,0,n,i)}):setTimeout(s,0,n,i)})}i&&i()}this.prepare=function(){$(document).on("click",".jump",function(e){return c.main.navigate({dialog:"editobject",params:$(this).attr("data-jump-to")}),e.preventDefault(),!1}),$("#load_grid-objects").show();var o=$("#dialog-new-object");o.modal(),o.find(".btn-add").off("click").on("click",function(){var e=o.find("#object-tab-new-object-name").val(),t=e.trim(),n=o.find("#object-tab-new-object-parent").val();t=n?n+"."+t:t;var i,a=o.find("#object-tab-new-object-type").val(),s=o.find("#object-tab-new-state-type").val();(t=t.replace(FORBIDDEN_CHARS,"_"),c.main.objects[t])?c.main.showError(_('Object "%s" yet exists!',t)):("state"===a?(i={_id:t,type:"state",common:{name:e,role:"",type:s,read:!0,write:!0,desc:_("Manually created")},native:{}},"boolean"===s?i.common.def=!1:"switch"===s?(i.common.type="boolean",i.common.def=!1,i.common.states="false:no;true:yes"):"string"===s?i.common.def="":"number"===s?(i.common.min=0,i.common.max=100,i.common.def=0,i.common.unit="%"):"enum"===s&&(i.common.type="number",i.common.min=0,i.common.max=5,i.common.def=0,i.common.states="0:zero;1:one;2:two;3:three;4:four;5:five")):i="channel"===a?{_id:t,type:"channel",common:{name:e,role:"",icon:"",desc:_("Manually created")},native:{}}:{_id:t,type:"device",common:{name:e,role:"",icon:"",desc:_("Manually created")},native:{}},c.main.socket.emit("setObject",t,i,function(e){e?c.main.showError(e):setTimeout(function(){c.main.navigate({dialog:"editobject",params:t+",def"})},1e3)}))}),o.find("#object-tab-new-object-type").select(),o.find("#object-tab-new-state-type").select(),o.find("#object-tab-new-object-name").on("keyup",function(){$(this).trigger("change")}).on("change",function(){var e=o.find("#object-tab-new-object-parent").val(),t=o.find("#object-tab-new-object-name").val();t=e?e+"."+t:t,o.find(".title").html(_("Add new object: %s",t))}),o.find("#object-tab-new-object-type").on("change",function(){"state"===$(this).val()?o.find(".object-tabe-new-object-tr").show():o.find(".object-tab-new-object-tr").hide()})},this.stateChange=function(e,t){this.$grid&&o("state",e,t)},this.objectChange=function(e,t,n){this.$grid&&o("object",e,t,n)},this.reinit=function(){this.main.dialogs.customs.check(),this.$grid&&(o("option","useHistory",this.main.dialogs.customs.customEnabled),o("reinit"))},this.saveScroll=function(){this.scrollTop=this.$grid.find(".grid-main-wh-div").scrollTop()},this.restoreScroll=function(){this.scrollTop&&this.$grid.find(".grid-main-wh-div").scrollTop(this.scrollTop)},this.init=function(e){if(!this.inited||e){if(e&&(n(),this.subscribes={}),void 0!==this.$grid){null===this.main.dialogs.customs.customEnabled&&this.main.dialogs.customs.check();var t={objects:this.main.objects,states:this.main.states,noDialog:!0,stats:!0,name:"admin-objects",useValues:["ID","name","value.from","value.q","value.ts","value.lc","value.val","button"],useHistory:this.main.dialogs.customs.customEnabled,showButtonsForNotExistingObjects:!0,expertModeRegEx:/^system\.|^yunkong2\.|^_|^[\w-]+$|^enum\.|^[\w-]+\.admin|^script\./,texts:{select:_("Select"),cancel:_("Cancel"),all:_("All"),id:_("ID"),ID:_("ID"),name:_("Name"),role:_("Role"),room:_("Room"),function:_("Function"),value:_("Value"),type:_("Type"),selectid:_("Select ID"),from:_("From"),lc:_("Last changed"),ts:_("Time stamp"),wait:_("Processing..."),ack:_("Acknowledged"),expand:_("Expand all nodes"),collapse:_("Collapse all nodes"),refresh:_("Rebuild tree"),edit:_("Edit"),push:_("Trigger event"),ok:_("Ok"),with:_("With"),without:_("Without"),copyToClipboard:_("Copy to clipboard"),expertMode:_("Toggle expert mode"),sort:_("Sort alphabetically"),button:_("Settings"),editDialog:_("Edit in dialog"),noData:_("No data"),Objects:_("Objects"),States:_("States"),toggleValues:_("Toggle states view"),user:_("User")},columns:["ID","name","type","role","room","function","value","button"],expandedCallback:function(e,t,n){n&&function(e){"string"==typeof e&&(e=[e]);for(var t=0;t<e.length;t++){if(console.log("Expanded: "+e[t]),c.subscribes[e[t]])return c.subscribes[e[t]]++;for(var n in c.subscribes)if(c.subscribes.hasOwnProperty(n)&&e[t].substring(0,n.length)+"."==n+".")return c.subscribes[n]++;c.subscribes[e[t]]=1;var i=c.main.objects[e[t]];i&&"state"===i.type?a(e[t]):a(e[t]+".*")}}(e)},collapsedCallback:function(e,t,n){!function(e){if(console.log("Collapsed: "+e),c.subscribes[e]){if(c.subscribes[e]--,!c.subscribes[e]){var t=c.main.objects[e];t&&"state"===t.type?(console.log("Unsubscribe: "+e),c.main.unsubscribeStates(e)):(console.log("Unsubscribe: "+e+".*"),c.main.unsubscribeStates(e+".*")),delete c.subscribes[e]}}else for(var n in c.subscribes)if(c.subscribes.hasOwnProperty(n)&&n.substring(0,e.length)+"."==e+"."&&(c.subscribes[n]--,!c.subscribes[n])){var i=c.main.objects[n];i&&"state"===i.type?(c.main.unsubscribeStates(n),console.log("Unsubscribe: "+n)):(c.main.unsubscribeStates(n+".*"),console.log("Unsubscribe: "+n+".*")),delete c.subscribes[n]}}(e)},buttons:[{text:!1,icons:{primary:"ui-icon-pencil"},"material-icon":"edit",click:function(e){c.main.navigate({dialog:"editobject",params:e})},match:function(e){c.main.objects[e]||(this[0].outerHTML='<div class="td-button-placeholder"></div>')},width:26,height:20},{text:!1,icons:{primary:"ui-icon-trash"},"material-icon":"delete",click:function(e){e&&c.main.delObject(c.$grid,e,function(e){e&&c.main.showError(e)})},match:function(e){c.main.objects[e]&&c.main.objects[e].common&&c.main.objects[e].common.dontDelete&&this.hide()},width:26,height:20},{text:!1,icons:{primary:"ui-icon-gear"},"material-icon":"build",click:function(e){c.main.dialogs.customs.ids=null,c.main.navigate({dialog:"customs",params:e})},width:26,height:20,match:function(e){if(c.main.objects[e]&&c.main.dialogs.customs.customEnabled&&!e.match(/\.messagebox$/)&&"state"===c.main.objects[e].type){var t=!1;if(c.main.objects[e]&&c.main.objects[e].common&&c.main.objects[e].common.custom){var n=c.main.objects[e].common.custom;for(var i in void 0!==n.enabled&&(n=c.main.objects[e].common.custom=n.enabled?{"history.0":n}:{}),n)if(n.hasOwnProperty(i)){t=!0;break}}t?this.addClass("custom-enabled").removeClass("custom-disabled"):(delete c.main.objects[e].common.custom,this.addClass("custom-disabled").removeClass("custom-enabled"))}else this.hide()}}],panelButtons:[{text:!1,icons:{primary:"ui-icon-plus"},"material-icon":"add",title:_("Add new child object to selected parent"),click:function(){var e=o("getActual")||"",t=$("#dialog-new-object");t.find("#object-tab-new-object-parent").val(e),t.find("#object-tab-new-object-name").val(_("newObject")),c.main.objects[e]&&"device"===c.main.objects[e].type?t.find("#object-tab-new-object-type").val("channel"):(c.main.objects[e]&&c.main.objects[e].type,t.find("#object-tab-new-object-type").val("state")),t.modal("open"),t.find("h6").html(_("Add new object: %s",(e?e+".":"")+_("newObject"))),t.find("#object-tab-new-object-name").focus()}},{text:!1,id:"add_object_tree","material-icon":"file_upload",icons:{primary:"ui-icon-arrowthickstop-1-n"},title:_("Add Objecttree from JSON File"),click:function(){var e=document.createElement("input");e.setAttribute("type","file"),e.setAttribute("id","files"),e.setAttribute("opacity",0),e.addEventListener("change",function(e){!function(e){var t=e.target.files[0];if(t){var n=new FileReader;n.onload=function(e){var t=e.target.result,n=JSON.parse(t),i=Object.keys(n).length,a=n._id;void 0===a&&1<i?s(n,function(){c.main.showToast(c.$grid.find(".main-toolbar-table"),_("%s object(s) processed",Object.keys(n).length))}):c.main.socket.emit("setObject",n._id,n,function(e){e?c.main.showError(e):("state"===n.type&&c.main.socket.emit("setState",n._id,void 0===n.common.def?null:n.common.def,!0),c.main.showToast(c.$grid.find(".main-toolbar-table"),_("%s was imported",n._id)))})},n.readAsText(t)}else alert("Failed to open JSON File")}(e)},!1),e.click()}},{text:!1,id:"save_object_tree",icons:{primary:"ui-icon-arrowthickstop-1-s"},"material-icon":"file_download",title:_("Save Objecttree as JSON File"),click:function(){var e,t,n,i=o("getActual")||"",a={};$.map(c.main.objects,function(e,t){t.search(i)||(a[t]=e)}),void 0!==a?(e=i+".json",t=a,(n=document.createElement("a")).setAttribute("href","data:application/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(t,null,2))),n.setAttribute("download",e),n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n)):alert(_("Save of objects-tree is not possible"))}}],quickEdit:["name","value","role","function","room","value.val"],quickEditCallback:function(n,i,a,e,t){if("room"===i)r(n,"rooms",a);else if("function"===i)r(n,"functions",a);else if("value"===i){if(c.main.objects[n]&&c.main.objects[n].common&&c.main.objects[n].common.type)switch(c.main.objects[n].common.type){case"number":var s=parseFloat(a);isNaN(s)&&(s="false"===a?0:~~a),a=s;break;case"boolean":"true"===a&&(a=!0),"false"===a&&(a=!1);break;case"string":a=a.toString();break;default:"true"===a&&(a=!0),"false"===a&&(a=!1),parseFloat(a).toString()===a.toString().replace(/[.,]0*$/,"")&&(a=parseFloat(a))}t=t||!1,c.main.socket.emit("setState",n,{val:a,ack:t},function(e){if(e)return c.main.showError(e)})}else c.main.socket.emit("getObject",n,function(e,t){if(e)return c.main.showError(e);t||(t={type:"meta",common:{typ:"meta.user",role:""},native:{},_id:n}),t.common[i]=a,c.main.socket.emit("setObject",t._id,t,function(e){e&&c.main.showError(e)})})}};this.main.dialogs.customs.customEnabled?t.customButtonFilter={icons:{primary:"ui-icon-gear"},"material-icon":"build",text:!1,callback:function(){for(var e=o("getFilteredIds"),t=[],n=0;n<e.length;n++)c.main.objects[e[n]]&&"state"===c.main.objects[e[n]].type&&t.push(e[n]);t&&t.length?t.length<10?(c.main.dialogs.customs.ids=null,c.main.navigate({dialog:"customs",params:t.join(",")})):(c.main.dialogs.customs.ids=t,c.main.navigate({dialog:"customs"})):c.main.showMessage(_("No states selected!"),"","info_outline")}}:t.customButtonFilter=null,o("init",t).selectId("show",null,null,function(){c.restoreScroll()})}this.inited||(this.inited=!0,this.main.subscribeObjects("*"),function(){for(var e in c.subscribes)c.subscribes.hasOwnProperty(e)&&(c.main.objects[e]&&"state"===c.main.objects[e].type?a(e):a(e+".*"))}())}},this.destroy=function(){this.inited&&(this.saveScroll(),c.main.unsubscribeObjects("*"),this.inited=!1,n())}}function Readme(e){var o=this;function r(e,t){var n=(new showdown.Converter).makeHtml(e);return(n=(n=(n=(n=n.replace(/id="/g,'id="mdid-')).replace(/src="(?!http)/g,'class="responsive-img" src="'+t)).replace(/href="#/g,'href="" class="goto-link" data-goto="#mdid-')).replace(/href="(\S*).md/g,function(e){return'href="" class="md-link" data-url="'+o.mainUrl+e.replace('href="',"")})).replace(/href="http/g,'target="_blank" href="http')}function c(e){for(var t=e.length-1;0<=t&&!e[t];)t--;return t!==e.length-1&&e.splice(t),e}this.$dialog=$("#dialog-readme"),this.$divReadme=this.$dialog.find(".result-readme"),this.$divChangeLog=this.$dialog.find(".result-changelog"),this.$divLicense=this.$dialog.find(".result-license"),this.$divLogo=this.$dialog.find(".result-logo"),this.$tabs=this.$dialog.find(".tabs"),this.mainUrl="",this.main=e,this.prepare=function(){},this.init=function(){if(!this.inited){this.inited=!0,this.$tabs.data("inited")||(this.$tabs.data("inited",!0),this.$tabs.mtabs()),showdown.setFlavor("github");var e=this.main.navigateGetParams(),t=o.main.tabs.adapters.$tab.find('.adapter-readme-submit[data-adapter-name="'+e+'"]').data("adapter-url");if(t||(t=localStorage.getItem("original-md-url")),t){localStorage.setItem("original-md-url",t);var n=(t=t.replace("https://github.com","https://raw.githubusercontent.com").replace("blob/","")).split("/");o.mainUrl="https://raw.githubusercontent.com/"+n[3]+"/"+n[4]+"/master/",o.$dialog.find(".title").html(e),o.$divReadme.empty(),o.fillDiv(t)}o.$dialog.find(".dialog-system-buttons .btn-cancel").off("click").on("click",function(e){e.stopPropagation(),e.preventDefault(),localStorage.removeItem("original-md-url"),o.main.navigate()})}},this.fillDiv=function(i){$.get(i,function(e){var t=i.replace("https://raw.githubusercontent.com","https://github.com").replace("/master/","/blob/master/");o.$dialog.find(".dialog-system-buttons .btn-open-org").attr("href",t);var n=function(e,t){var n={logo:"",readme:[],changeLog:[],license:[]},i=e.trim().split(/\r\n|\n/);i[2].match(/^#\sio/)&&i.splice(2,1),i[1].match(/^#\sio/)&&i.splice(1,1),i[0].match(/!\[[-_\w\d]*]\([-._\w\d\/]+\.png\)/)&&(n.logo=t+i[0].match(/\((.+)\)/)[1],i.splice(0,1));for(var a="readme",s=0;s<i.length;)i[s].match(/^====/)||(i[s].match(/^###?\s+Changelog/)?a="changeLog":i[s].match(/^###?\s+License/)?a="license":(n[a].length||i[s])&&n[a].push(i[s])),s++;return n.logo?o.$divLogo.html('<img src="'+n.logo+'" />').show():o.$divLogo.html("").hide(),c(n.readme),c(n.changeLog),c(n.license),n.readme.length?n.readme=r(n.readme.join("\n"),t):n.readme="",n.changeLog.length?n.changeLog=r(n.changeLog.join("\n"),t):delete n.changeLog,n.license.length?(n.license[0]="## "+n.license[0],n.license=r(n.license.join("\n"),t)):delete n.license,n}(e,i.substring(0,i.lastIndexOf("/")+1));o.$divReadme.html(n.readme),n.changeLog?(o.$divChangeLog.html(n.changeLog),o.$tabs.find(".tab-changelog").show()):(o.$divChangeLog.html(""),o.$tabs.find(".tab-changelog").hide()),n.license?(o.$divLicense.html(n.license),o.$tabs.find(".tab-license").show()):(o.$divLicense.html(""),o.$tabs.find(".tab-license").hide())}).done(function(){o.$divReadme.on("click",".md-link",function(e){e.stopPropagation(),e.preventDefault(),o.fillDiv($(this).data("url"))}),o.$divReadme.on("click",".goto-link",function(e){e.stopPropagation(),e.preventDefault();var t=$($(this).data("goto"));t.length&&o.$divReadme.animate({scrollTop:o.$divReadme.scrollTop()-o.$divReadme.offset().top+t.offset().top},2e3)})})},this.destroy=function(){this.inited&&(localStorage.removeItem("original-md-url"),this.inited=!1)}}function initMap(){gMain.dialogs.system.mapLoaded=!0,gMain.dialogs.system.updateMap(!0)}function System(s){var a,o,r,c,l=this;this.$dialog=$("#dialog-system"),this.main=s,this.systemRepos=null,this.systemCerts=null;var d=!(this.mapLoaded=!1);function u(e,t){if(t.length<700&&(-1!==t.indexOf("/")||-1!==t.indexOf("\\")))return t;if(t.length<"-----BEGIN CERTIFICATE-----==-----END CERTIFICATE-----".length)return h(_('Invalid certificate "%s". To short.',e),!0),"";var n=[];if("-----BEGIN RSA PRIVATE KEY-----"===t.substring(0,"-----BEGIN RSA PRIVATE KEY-----".length)){if("-----END RSA PRIVATE KEY-----"!==t.substring(t.length-"-----END RSA PRIVATE KEY-----".length))return h(_('Certificate "%s" must end with "-----END RSA PRIVATE KEY-----".',e),!0),"";for(t=(t=(t=t.substring("-----BEGIN RSA PRIVATE KEY-----".length)).substring(0,t.length-"-----END RSA PRIVATE KEY-----".length)).replace(/\s/g,"");t.length;)n.push(t.substring(0,64)),t=t.substring(64);return"-----BEGIN RSA PRIVATE KEY-----\r\n"+n.join("\r\n")+"\r\n-----END RSA PRIVATE KEY-----\r\n"}if("-----BEGIN PRIVATE KEY-----"===t.substring(0,"-----BEGIN PRIVATE KEY-----".length)){if("-----END PRIVATE KEY-----"!==t.substring(t.length-"-----END PRIVATE KEY-----".length))return h(_('Certificate "%s" must end with "-----BEGIN PRIVATE KEY-----".',e),!0),"";for(t=(t=(t=t.substring("-----BEGIN PRIVATE KEY-----".length)).substring(0,t.length-"-----END PRIVATE KEY-----".length)).replace(/\s/g,"");t.length;)n.push(t.substring(0,64)),t=t.substring(64);return"-----BEGIN PRIVATE KEY-----\r\n"+n.join("\r\n")+"\r\n-----END PRIVATE KEY-----\r\n"}if("-----BEGIN CERTIFICATE-----"!==t.substring(0,"-----BEGIN CERTIFICATE-----".length))return h(_('Certificate "%s" must start with "-----BEGIN CERTIFICATE-----".',e),!0),"";if("-----END CERTIFICATE-----"!==t.substring(t.length-"-----END CERTIFICATE-----".length))return h(_('Certificate "%s" must end with "-----END CERTIFICATE-----".',e),!0),"";for(var i=t.split("-----END CERTIFICATE-----"),a=i.length-1;0<=a;a--)if(i[a].replace(/[\r\n|\r|\n]+/,"").trim()){for(t=(t=(t=i[a]).substring("-----BEGIN CERTIFICATE-----".length)).replace(/\s/g,""),n=[];t.length;)n.push(t.substring(0,64)),t=t.substring(64);i[a]="-----BEGIN CERTIFICATE-----\r\n"+n.join("\r\n")+"\r\n-----END CERTIFICATE-----\r\n"}else i.splice(a,1);return i.join("")}function m(e,t){for(var n,i=table2values("tab-system-certs"),a=[],s=0;s<i.length;s++)a.push(i[s].name);for(var o=e||_("New"),r=1;(n=-1!==a.indexOf(o+r))&&r++,n;);i.push({name:o+r,certificate:t||""}),values2table("tab-system-certs",i)}function g(){if(l.systemRepos&&l.systemRepos.native.repositories){var e=[];for(var t in l.systemRepos.native.repositories)if(l.systemRepos.native.repositories.hasOwnProperty(t)){var n=l.systemRepos.native.repositories[t];e.push({name:t,link:"object"==typeof n?n.link:n})}if(values2table("tab-system-repo",e,{onChange:function(e){l.$dialog.find(".btn-save").removeClass("disabled"),e&&"name"!==e||function(){var e=l.$dialog.find("#system_activeRepo"),t=e.val(),n=!1;e.html("");for(var i=table2values("tab-system-repo"),a=0;a<i.length;a++)e.append('<option value="'+i[a].name+'">'+i[a].name+"</option>"),t===i[a].name&&(n=!0);n&&e.val(t);e.select()}()}}),l.systemRepos.nonEdit&&l.systemRepos.nonEdit.native&&l.systemRepos.nonEdit.native.repositories){var i=l.$dialog.find("#grid-repos");i.find("input").each(function(){$(this).prop("disabled",!0).addClass("disabled")}),i.find("select").each(function(){$(this).prop("disabled",!0).addClass("disabled")}),i.find(".btn-floating").each(function(){$(this).addClass("disabled")}),l.$dialog.find("#tab-system-repo .table-button-add").addClass("disabled")}}else l.$dialog.find("#tab-system-repo").html(_("permissionError"))}function h(e,t,n){l.main.showToast(l.$dialog.find("#tab-system-certs"),e,null,n,t)}function f(){var n=l.main.systemConfig.common,i=!1,a=!1;!function(){l.main.systemConfig.common.defaultNewAcl=l.main.systemConfig.common.defaultNewAcl||{};var e=l.main.systemConfig.common.defaultNewAcl,t=JSON.stringify(e);e.object=0,e.object|=l.$dialog.find("#tab-system-acl-obj-owner-read").prop("checked")?1024:0,e.object|=l.$dialog.find("#tab-system-acl-obj-owner-write").prop("checked")?512:0,e.object|=l.$dialog.find("#tab-system-acl-obj-group-read").prop("checked")?64:0,e.object|=l.$dialog.find("#tab-system-acl-obj-group-write").prop("checked")?32:0,e.object|=l.$dialog.find("#tab-system-acl-obj-every-read").prop("checked")?4:0,e.object|=l.$dialog.find("#tab-system-acl-obj-every-write").prop("checked")?2:0,e.owner=l.$dialog.find("#tab-system-acl-owner").val(),e.ownerGroup=l.$dialog.find("#tab-system-acl-group").val(),e.state=0,e.state|=l.$dialog.find("#tab-system-acl-state-owner-read").prop("checked")?1024:0,e.state|=l.$dialog.find("#tab-system-acl-state-owner-write").prop("checked")?512:0,e.state|=l.$dialog.find("#tab-system-acl-state-group-read").prop("checked")?64:0,e.state|=l.$dialog.find("#tab-system-acl-state-group-write").prop("checked")?32:0,e.state|=l.$dialog.find("#tab-system-acl-state-every-read").prop("checked")?4:0,e.state|=l.$dialog.find("#tab-system-acl-state-every-write").prop("checked")?2:0,e.file=0,e.file|=l.$dialog.find("#tab-system-acl-file-owner-read").prop("checked")?1024:0,e.file|=l.$dialog.find("#tab-system-acl-file-owner-write").prop("checked")?512:0,e.file|=l.$dialog.find("#tab-system-acl-file-group-read").prop("checked")?64:0,e.file|=l.$dialog.find("#tab-system-acl-file-group-write").prop("checked")?32:0,e.file|=l.$dialog.find("#tab-system-acl-file-every-read").prop("checked")?4:0,e.file|=l.$dialog.find("#tab-system-acl-file-every-write").prop("checked")?2:0,JSON.stringify(e)}(),l.$dialog.find(".system-settings.value").each(function(){var e=$(this),t=e.attr("id");t&&(t=t.substring("system_".length),"checkbox"===e.attr("type")?n[t]=e.prop("checked"):("language"===t&&n.language!==e.val()&&(i=!0),"activeRepo"===t&&n.activeRepo!==e.val()&&(a=!0),n[t]=e.val(),"isFloatComma"===t&&(n[t]="true"===n[t]||!0===n[t])))});var e={};if(l.systemRepos){for(var t in l.systemRepos.native.repositories)l.systemRepos.native.repositories.hasOwnProperty(t)&&"object"==typeof l.systemRepos.native.repositories[t]&&l.systemRepos.native.repositories[t].json&&(e[l.systemRepos.native.repositories[t].link]=l.systemRepos.native.repositories[t].json);l.systemRepos.native.repositories={}}var s=table2values("tab-system-repo");if(l.systemRepos){for(var o=null,r=0;r<s.length;r++)l.systemRepos.native.repositories[s[r].name]={link:s[r].link,json:null},e[s[r].link]&&(l.systemRepos.native.repositories[s[r].name].json=e[s[r].link]),o||(o=s[r].name);o?l.systemRepos.native.repositories[n.activeRepo]||(a=!0,n.activeRepo=o):n.activeRepo&&(a=!0,n.activeRepo="")}if(n.diag=l.$dialog.find("#diagMode").val(),l.systemCerts){l.systemCerts.native.certificates={},s=table2values("tab-system-certs");for(var c=0;c<s.length;c++)l.systemCerts.native.certificates[s[c].name]=u(s[c].name,s[c].certificate);l.$dialog.find(".system-le-settings.value").each(function(){var e=$(this),t=e.data("name");"checkbox"===e.attr("type")?l.systemCerts.native.letsEncrypt[t]=e.prop("checked"):l.systemCerts.native.letsEncrypt[t]=e.val()})}l.$dialog.find(".btn-save").addClass("disabled"),l.main.socket.emit("extendObject","system.config",{common:n},function(e){e?l.main.showError(e):l.main.socket.emit("extendObject","system.repositories",l.systemRepos,function(){l.main.socket.emit("extendObject","system.certificates",l.systemCerts,function(){i?window.location.reload():(l.main.navigate(),a&&setTimeout(function(){l.main.tabs.adapters.init(!0)},0))})})})}function p(e){"tab-system-main"===e&&l.updateMap(),("tab-system-letsencrypt"===e||"tab-system-main"===e||"tab-system-acl"===e)&&window.M&&window.M.toast?(M.updateTextFields("#"+e),l.$dialog.find("optgroup").each(function(){if(!$(this).data("lang")){var e=$(this).attr("label");$(this).data("lang",e),$(this).attr("label",_(e))}}),l.$dialog.find("select").select()):"tab-system-certs"===e&&h(_("Drop the files here"))}this.updateMap=function(e){if(d){if("undefined"==typeof ol)return setTimeout(l.updateMap,200);var t=ol.proj.fromLonLat([parseFloat(r),parseFloat(c)]);l.OSM||(l.OSM={},l.OSM.markerSource=new ol.source.Vector,l.OSM.markerStyle=new ol.style.Style({image:new ol.style.Icon({anchor:[.5,49],anchorXUnits:"fraction",anchorYUnits:"pixels",opacity:.75,src:"img/pin.png"})}),l.OSM.oMap=new ol.Map({target:"map",layers:[new ol.layer.Tile({source:new ol.source.OSM}),new ol.layer.Vector({source:l.OSM.markerSource,style:l.OSM.markerStyle})],view:new ol.View({center:t,zoom:17})}),l.OSM.marker=new ol.Feature({geometry:new ol.geom.Point(t),name:_("Your home")}),l.OSM.markerSource.addFeature(l.OSM.marker),l.OSM.oMap.on("singleclick",function(e){var t=ol.proj.toLonLat(e.coordinate);r=t[0],l.$dialog.find("#system_longitude").val(t[0]),c=t[1],l.$dialog.find("#system_latitude").val(t[1]).trigger("change")}));var n=l.OSM.oMap.getView().getZoom();l.OSM.marker.setGeometry(new ol.geom.Point(t)),l.OSM.oMap.setView(new ol.View({center:t,zoom:n}))}else{if(!this.mapLoaded)return;if(!e)return clearTimeout(a),void(a=setTimeout(function(){l.updateMap(!0)},1e3));if(a&&(clearTimeout(a),a=null),c||r){var i=new google.maps.Map(l.$dialog.find(".map")[0],{zoom:14,center:{lat:parseFloat(c),lng:parseFloat(r)}});new google.maps.Marker({position:{lat:parseFloat(c),lng:parseFloat(r)},map:i,title:_("Your home")})}}},this.init=function(){var a;this.inited||(this.inited=!0,a=function(e){if(e)return console.error(e),void h(e,!0);var t=l.$dialog.find("#system_activeRepo");if(t.html(""),l.systemRepos&&l.systemRepos.native.repositories)for(var n in l.systemRepos.native.repositories)t.append('<option value="'+n+'">'+n+"</option>");else l.$dialog.find("#tab-system-repo").html(_("permissionError"));l.$dialog.find("#diagMode").val(l.main.systemConfig.common.diag).on("change",function(){l.main.socket.emit("sendToHost",l.main.currentHost,"getDiagData",$(this).val(),function(e){l.$dialog.find("#diagSample").html(JSON.stringify(e,null,2))})}).trigger("change");var i=l.$dialog.find("#system_defaultHistory");i.html('<option value=""></option>');for(var a=0;a<l.main.instances.length;a++)"storage"===s.objects[s.instances[a]].common.type&&i.append('<option value="'+l.main.instances[a].substring("system.adapter.".length)+'">'+s.instances[a].substring("system.adapter.".length)+"</option>");r=l.main.systemConfig.common.longitude,c=l.main.systemConfig.common.latitude,o||(o=!0,d?(l.mapLoaded=!0,$.ajax({url:"lib/js/ol.js",dataType:"script",cache:!0}).done(function(){setTimeout(l.updateMap,500)}),$.ajax({url:"lib/css/ol.css",success:function(e){$("head").append("<style>"+e+"</style>")}})):$.ajax({url:"https://maps.googleapis.com/maps/api/js?key=AIzaSyCIrBRZfZAE_0C1OplAUy7OXhiWLoZc3eY&signed_in=true&callback=initMap",dataType:"script",cache:!0})),l.$dialog.find(".system-settings.value").each(function(){var e=$(this),t=e.attr("id");t&&(t=t.substring("system_".length),"checkbox"===e.attr("type")?e.prop("checked",l.main.systemConfig.common[t]):"isFloatComma"===t?e.val(l.main.systemConfig.common[t]?"true":"false"):e.val(l.main.systemConfig.common[t]),l.main.systemConfig.nonEdit&&l.main.systemConfig.nonEdit.common&&void 0!==l.main.systemConfig.nonEdit.common[t]&&(e.addClass("disabled"),e.prop("disabled",!0)))}),l.$dialog.find("#system_latitude").off("change").on("change",function(){c=$(this).val(),l.updateMap()}).off("keyup").on("keyup",function(){$(this).trigger("change")}),l.$dialog.find("#system_longitude").off("change").on("change",function(){r=$(this).val(),l.updateMap()}).off("keyup").on("keyup",function(){$(this).trigger("change")}),l.systemCerts.native.letsEncrypt||(l.systemCerts.native.letsEncrypt={path:"letsencrypt"}),l.$dialog.find(".system-le-settings.value").each(function(){var e=$(this),t=e.data("name");l.systemCerts&&l.systemCerts.native.letsEncrypt&&("checkbox"===e.attr("type")?e.prop("checked",l.systemCerts.native.letsEncrypt[t]):e.val(l.systemCerts.native.letsEncrypt[t])),l.systemCerts.nonEdit&&l.systemCerts.nonEdit.native&&l.systemCerts.nonEdit.native.letsEncrypt&&void 0!==l.systemCerts.nonEdit.native.letsEncrypt[t]&&(e.addClass("disabled"),e.prop("disabled",!0))}),l.$dialog.find("#tabs-system").find(".tabs").mtabs({onShow:function(e){e&&p($(e).attr("id"))}}),l.$dialog.find(".dialog-system-buttons .btn-save").off("click").on("click",f),l.$dialog.find(".dialog-system-buttons .btn-cancel").off("click").on("click",function(){l.main.navigate()}),g(),function(){l.main.systemConfig.common.defaultNewAcl=l.main.systemConfig.common.defaultNewAcl||{};for(var e,t=l.main.systemConfig.common.defaultNewAcl,n="",i=0;i<l.main.tabs.users.list.length;i++)e=translateName(l.main.objects[l.main.tabs.users.list[i]].common.name),n+='<option value="'+l.main.tabs.users.list[i]+'">'+(e||l.main.tabs.users.list[i])+"</option>";for(l.$dialog.find("#tab-system-acl-owner").html(n).val(t.owner||"system.user.admin"),n="",i=0;i<l.main.tabs.users.groups.length;i++)e=translateName(l.main.objects[l.main.tabs.users.groups[i]].common.name),n+='<option value="'+l.main.tabs.users.groups[i]+'">'+(e||l.main.tabs.users.groups[i])+"</option>";l.$dialog.find("#tab-system-acl-group").html(n).val(t.ownerGroup||"system.group.administrator"),void 0===t.object&&(t.object=1636),l.$dialog.find("#tab-system-acl-obj-owner-read").prop("checked",1024&t.object),l.$dialog.find("#tab-system-acl-obj-owner-write").prop("checked",512&t.object),l.$dialog.find("#tab-system-acl-obj-group-read").prop("checked",64&t.object),l.$dialog.find("#tab-system-acl-obj-group-write").prop("checked",32&t.object),l.$dialog.find("#tab-system-acl-obj-every-read").prop("checked",4&t.object),l.$dialog.find("#tab-system-acl-obj-every-write").prop("checked",2&t.object),void 0===t.state&&(t.state=1636),l.$dialog.find("#tab-system-acl-state-owner-read").prop("checked",1024&t.state),l.$dialog.find("#tab-system-acl-state-owner-write").prop("checked",512&t.state),l.$dialog.find("#tab-system-acl-state-group-read").prop("checked",64&t.state),l.$dialog.find("#tab-system-acl-state-group-write").prop("checked",32&t.state),l.$dialog.find("#tab-system-acl-state-every-read").prop("checked",4&t.state),l.$dialog.find("#tab-system-acl-state-every-write").prop("checked",2&t.state),void 0===t.file&&(t.file=1636),l.$dialog.find("#tab-system-acl-file-owner-read").prop("checked",1024&t.file),l.$dialog.find("#tab-system-acl-file-owner-write").prop("checked",512&t.file),l.$dialog.find("#tab-system-acl-file-group-read").prop("checked",64&t.file),l.$dialog.find("#tab-system-acl-file-group-write").prop("checked",32&t.file),l.$dialog.find("#tab-system-acl-file-every-read").prop("checked",4&t.file),l.$dialog.find("#tab-system-acl-file-every-write").prop("checked",2&t.file),l.$dialog.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")})}(),function(){var e,t=l.$dialog.find("#tab-system-certs");if(l.systemCerts&&l.systemCerts.native.certificates){var n=[];for(var i in l.systemCerts.native.certificates)l.systemCerts.native.certificates.hasOwnProperty(i)&&n.push({name:i,certificate:(e=l.systemCerts.native.certificates[i],e.replace(/(?:\\[rn]|[\r\n]+)+/g,""))});if(values2table("tab-system-certs",n,{onChange:function(e){l.$dialog.find(".btn-save").removeClass("disabled")}}),l.systemCerts.nonEdit&&l.systemCerts.nonEdit.native&&l.systemCerts.nonEdit.native.certificates){var a=l.$dialog.find("#grid-certs");a.find("input").each(function(){$(this).prop("disabled",!0).addClass("disabled")}),a.find("select").each(function(){$(this).prop("disabled",!0).addClass("disabled")}),a.find(".btn-floating").each(function(){$(this).addClass("disabled")})}}else t.html(_("permissionError"));installFileUpload(t,1e4,function(e,t){if(e)h(e,!0);else{try{t=atob(t.split(",")[1])}catch(e){return void h(_("Cannot read file!"),!0)}if(-1!==(t=t.replace(/(\r\n|\n|\r)/gm,"")).indexOf("BEGIN RSA PRIVATE KEY"))m("private",t);else if(-1!==t.indexOf("BEGIN PRIVATE KEY"))m("private",t);else if(-1!==t.indexOf("BEGIN CERTIFICATE")){for(var n=t.split("-----END CERTIFICATE-----"),i=0,a=0;a<n.length;a++)n[a].replace(/[\r\n]+|\n|\r/,"").trim()&&i++;m(1<i?"chained":"public",t)}else h(_("Unknown file format!"),!0)}})}(),l.$dialog.find(".value").on("change",function(){l.$dialog.find(".btn-save").removeClass("disabled")}).on("keyup",function(){$(this).trigger("change")}),l.$dialog.find(".btn-save").addClass("disabled"),p("tab-system-main")},l.main.socket.emit("getObject","system.repositories",function(i,e){l.systemRepos=e,l.main.socket.emit("getObject","system.certificates",function(n,e){l.systemCerts=e,l.main.socket.emit("getObject","system.config",function(e,t){l.main.systemConfig=t,a(i||n||e)})})}))},this.destroy=function(){this.inited&&(this.inited=!1)},this.allStored=function(){return l.$dialog.find(".btn-save").hasClass("disabled")},this.prepare=function(){l.main.systemConfig.error?$("#button-system").hide():$("#button-system").off("click").on("click",function(){l.main.navigate({dialog:"system"})})}}function Users(e){var g=this;function c(t,n,i){var e;n=n||[];for(var a=0;a<g.groups.length;a++){var s,o=g.main.objects[g.groups[a]]&&g.main.objects[g.groups[a]].common&&g.main.objects[g.groups[a]].common.members;if(-1===n.indexOf(g.groups[a])&&o&&-1!==(s=o.indexOf(t)))return o.splice(s,1),e={common:{members:o}},void g.main.socket.emit("extendObject",g.groups[a],e,function(e){e?(u(e,!0,5e3),i&&i(e)):setTimeout(function(){c(t,n,i)},0)});if(-1!==n.indexOf(g.groups[a])&&(!o||-1===o.indexOf(t)))return(o=o||[]).push(t),e={common:{members:g.main.objects[g.groups[a]].common.members=o}},void g.main.socket.emit("extendObject",g.groups[a],e,function(e){e?(u(e,!0,5e3),i&&i(e)):setTimeout(function(){c(t,n,i)},0)})}i&&i()}function h(e,t,n){"boolean"==typeof t&&(n=t,t=3e3),g.main.showToast(g.$grid,e,null,t,n)}function u(e,t,n){"boolean"==typeof t&&(n=t,t=3e3),g.main.showToast(g.$grid.find("#tab-users-dialog-new"),e,null,t,n)}function f(e){return e?e[0].toUpperCase()+e.substring(1).toLowerCase():e}function p(e){g.main.objects[e]&&"user"===g.main.objects[e].type?g.main.objects[e].common&&g.main.objects[e].common.dontDelete?h(_("Object may not be deleted"),!0):function t(n,i){for(var e=0;e<g.groups.length;e++){var a=g.main.objects[g.groups[e]];if(a&&a.common&&a.common.members&&-1!==a.common.members.indexOf(n))return a.common.members.splice(a.common.members.indexOf(n),1),void g.main.socket.emit("extendObject",g.groups[e],{common:{members:a.common.members}},function(e){e?h(_("Cannot modify groups: %s",e),!0):setTimeout(function(){t(n,i)},0)})}i&&i()}(e,function(){g.main.socket.emit("delObject",e,function(e){e?h(_("User may not be deleted: %s",e),!0):h(_("User deleted"))})}):h(_("Invalid object: %s",e),!0)}function r(e,s,o){var r=g.$grid.find("#tab-users-dialog-new-password").val(),t=g.$grid.find("#tab-users-dialog-new-password-repeat").val();if("__pass_not_set__"!==r&&r!==t)return e.stopPropagation(),void u(_("Password and confirmation are not equal!"),!0);if(!r)return e.stopPropagation(),void u(_("Password cannot be empty!"),!0);if("system.user.admin"===s&&"admin"!==o.id)return e.stopPropagation(),void u(_('Cannot change name of "%s"',"admin"),!0);if(!o.id)return e.stopPropagation(),void u(_("ID may not be empty"),!0);if(s)if("system.user."+o.id!==s){if(g.main.objects["system.user."+o.id])return e.stopPropagation(),void u(_("User yet exists"),!0);g.main.socket.emit("getObject",s,function(e,t){if(e)h(_("Cannot change user: ")+e,!0);else{var n=o.id,i="system.user."+n;t.common.name=o.name,t.common.color=o.color,t.common.icon=o.icon,t.common.desc=o.desc,delete o.id;var a=function(e){for(var t=[],n=0;n<g.groups.length;n++)-1===t.indexOf(g.groups[n])&&g.main.objects[g.groups[n]].common.members&&-1!==g.main.objects[g.groups[n]].common.members.indexOf(e)&&t.push(g.groups[n]);return t}(s);g.main.socket.emit("delObject",s,function(e){e?h(_("Cannot rename user: ")+e,!0):c(s,[],function(){g.main.socket.emit("setObject",i,t,function(e){e?h(_("Cannot change group: ")+e,!0):c(i,a,function(){"__pass_not_set__"!==r?g.main.socket.emit("changePassword",n,r,function(e){e?h(_("Cannot set password: ")+_(e),!0):h(_("Updated"))}):h(_("Updated"))})})})})}})}else delete o.id,"__pass_not_set__"!==r?g.main.socket.emit("changePassword",s.replace("system.user.",""),r,function(e){e?h(_("Cannot set password: ")+_(e),!0):g.main.socket.emit("extendObject",s,{common:o},function(e,t){e?h(_("Cannot change group: ")+e,!0):h(_("Updated"))})}):g.main.socket.emit("extendObject",s,{common:o},function(e,t){e?h(_("Cannot change group: ")+e,!0):h(_("Updated"))});else{if(g.main.objects["system.user."+o.id])return e.stopPropagation(),void u(_("User yet exists"),!0);var n=o.id,i={_id:"system.user."+n,common:o,type:"user",native:{}};o.enabled=!0,delete o.id,g.main.socket.emit("setObject",i._id,i,function(e){e?h(_("Cannot add user: ")+e,!0):"__pass_not_set__"!==r?g.main.socket.emit("changePassword",n,r,function(e){e?h(_("Cannot set password: ")+_(e),!0):h(_("Created"))}):h(_("Created"))})}}function m(e,n){if("system.group.administrator"===e)for(var t in n={},g.aclGroups)if(g.aclGroups.hasOwnProperty(t)){n[t]={};for(var i=0;i<g.aclGroups[t].length;i++)n[t][g.aclGroups[t][i]]=!0}g.$grid.find(".edit-group-permissions").prop("disabled","system.group.administrator"===e).each(function(){var e=$(this).data("type"),t=$(this).data("operation");$(this).prop("checked",!!n[e]&&n[e][t])})}function b(e){var t=g.$grid.find("#tab-users-dialog-new-id"),n=t.val();n&&!n.match(/[.\s]/)?(e.find(".tab-dialog-create").removeClass("disabled"),t.removeClass("wrong")):(e.find(".tab-dialog-create").addClass("disabled"),t.addClass("wrong"))}function y(e){var i,a=!1,c=g.$grid.find("#tab-users-dialog-new"),l={name:"",icon:"",color:"",desc:"",id:"",acl:{}},s=!0===e?"system.group":"system.user",d="",o=!0===e;if(installFileUpload(c,5e4,function(e,t){if(e)h(e,!0);else{if(!t.match(/^data:image\//))return void h(_("Unsupported image format"),!0);b(c),l.icon=t,c.find(".tab-dialog-new-icon").show().html('<img class="treetable-icon" />'),c.find(".tab-dialog-new-icon .treetable-icon").attr("src",t),c.find(".tab-dialog-new-icon-clear").show()}}),"string"==typeof e&&(g.main.objects[e]&&g.main.objects[e].common&&(l.name=g.main.objects[e].common.name,l.icon=g.main.objects[e].common.icon,l.color=g.main.objects[e].common.color,l.desc=g.main.objects[e].common.desc,(o="group"===g.main.objects[e].type)&&(l.acl=g.main.objects[e].common.acl)),d=e,l.id=e),c.find(".tab-dialog-new-title").text(!0===e?_("Create new group"):l.id?_("Change"):_("Create new user")),l.id){var t=l.id.split(".");l.id=t.pop(),s=t.join(".")}c.find("#tab-users-dialog-new-name").val(translateName(l.name)).off("change").on("change",function(){var e=g.$grid.find("#tab-users-dialog-new-id"),t=e.val(),n=$(this).val();n=n.trim().replace(FORBIDDEN_CHARS,"_").replace(/\./g,"_").toLowerCase(),t&&a||!(o&&"administrator"!==t&&"user"!==t||!o&&"admin"!==t)||(e.val(n),i=n,c.find("#tab-users-dialog-new-preview").val(s+"."+(n||"#")),M.updateTextFields("#tab-users-dialog-new")),b(c)}).off("keyup").on("keyup",function(){$(this).trigger("change")}),c.find("#tab-users-dialog-new-desc").val(l.desc).off("change").on("change",function(){b(c)}).off("keyup").on("keyup",function(){$(this).trigger("change")}),i=l.id,c.find("#tab-users-dialog-new-id").val(l.id).off("change").on("change",function(){var e=$(this).val();i!==e&&(a=!0,i=e,c.find("#tab-users-dialog-new-preview").val(s+"."+(e||"#")),M.updateTextFields("#tab-users-dialog-new"),b(c))}).off("keyup").on("keyup",function(){$(this).trigger("change")}),c.find(".tab-dialog-create").addClass("disabled").off("click").text(_(d?"Change":"Create")).on("click",function(e){var n;l.name=c.find("#tab-users-dialog-new-name").val(),l.id=c.find("#tab-users-dialog-new-id").val(),l.desc=c.find("#tab-users-dialog-new-desc").val(),o?(n=l.acl,g.$grid.find(".edit-group-permissions").each(function(){var e=$(this).data("type"),t=$(this).data("operation");n[e]=n[e]||{},n[e][t]=$(this).prop("checked")}),function(i,a,s){if("system.group.administrator"===a&&"administrator"!==s.id)return i.stopPropagation(),u(_('Cannot change name of "%s"',"administrator"),!0);if("system.group.user"===a&&"user"!==s.id)return i.stopPropagation(),u(_('Cannot change name of "%s"',"user"),!0);if(!s.id)return i.stopPropagation(),u(_("ID may not be empty"),!0);if(a)if("system.group."+s.id!==a){if(g.main.objects["system.group."+s.id])return i.stopPropagation(),u(_("ID yet exists"),!0);g.main.socket.emit("getObject",a,function(e,t){if(e)h(_("Cannot change group: ")+e,!0);else{var n=s.id;t.common.name=s.name,t.common.color=s.color,t.common.icon=s.icon,t.common.desc=s.desc,delete s.id,g.main.socket.emit("delObject",a,function(e){e?(h(_("Cannot rename group: ")+e,!0),i.stopPropagation()):g.main.socket.emit("setObject",n,t,function(e){e?h(_("Cannot change group: ")+e,!0):h(_("Updated"))})})}})}else delete s.id,g.main.socket.emit("extendObject",a,{common:s},function(e,t){e?h(_("Cannot change group: ")+e,!0):h(_("Updated"))});else{if(!s.id)return i.stopPropagation(),u(_("ID may not be empty"),!0);g.main.socket.emit("addGroup",s.id,s.desc,null,function(e,t){e?h(_("Cannot create group: ")+e,!0):g.main.socket.emit("extendObject",t._id,{common:s},function(e){e?h(_("Cannot add group: ")+e,!0):h(_("Created"))})})}}(e,d,l)):(delete l.acl,r(e,d,l))}),c.find("#tab-users-dialog-new-preview").val(s+"."+(l.id||"#")),l.icon?(c.find(".tab-dialog-new-icon").show().html(g.main.getIcon(d)),c.find(".tab-dialog-new-icon-clear").show()):(c.find(".tab-dialog-new-icon").hide(),c.find(".tab-dialog-new-icon-clear").hide()),l.color=l.color||!1,l.color?c.find(".tab-dialog-new-color").val(l.color):c.find(".tab-dialog-new-color").val(),u(_("Drop the icons here")),c.find(".tab-dialog-new-upload").off("click").on("click",function(){c.find(".drop-file").trigger("click")}),c.find(".tab-dialog-new-icon-clear").off("click").on("click",function(){l.icon&&(l.icon="",c.find(".tab-dialog-new-icon").hide(),c.find(".tab-dialog-new-icon-clear").hide(),b(c))}),c.find(".tab-dialog-new-color-clear").off("click").on("click",function(){l.color&&(b(c),c.find(".tab-dialog-new-color-clear").hide(),c.find(".tab-dialog-new-colorpicker").colorpicker({component:".btn",color:l.color,container:c.find(".tab-dialog-new-colorpicker")}).colorpicker("setValue",""),l.color="")});var n=Date.now();try{c.find(".tab-dialog-new-colorpicker").colorpicker("destroy")}catch(e){}c.find(".tab-dialog-new-colorpicker").colorpicker({component:".btn",color:l.color,container:c.find(".tab-dialog-new-colorpicker")}).colorpicker("setValue",l.color).on("showPicker.colorpicker",function(){var e=c.find(".modal-content");e[0].scrollTop=e[0].scrollHeight}).on("changeColor.colorpicker",function(e){100<Date.now()-n&&(l.color=e.color.toHex(),b(c),c.find(".tab-users-dialog-new-icon-clear").show())}),c.find("#tab-users-dialog-new-password").off("change").on("change",function(){b(c)}),c.find("#tab-users-dialog-new-password-repeat").off("change").on("change",function(){b(c)}),l.color?c.find(".tab-dialog-new-color-clear").show():c.find(".tab-dialog-new-color-clear").hide(),o?(c.find(".tab-users-dialog-new-password").hide(),"system.group.administrator"===d||"system.group.user"===d?c.find("#tab-users-dialog-new-id").prop("disabled",!0):c.find("#tab-users-dialog-new-id").prop("disabled",!1)):(c.find(".tab-users-dialog-new-password").show(),d?(c.find("#tab-users-dialog-new-password").val("__pass_not_set__"),c.find("#tab-users-dialog-new-password-repeat").val("__pass_not_set__")):(c.find("#tab-users-dialog-new-password").val(""),c.find("#tab-users-dialog-new-password-repeat").val("")),"system.user.admin"===d?c.find("#tab-users-dialog-new-id").prop("disabled",!0):c.find("#tab-users-dialog-new-id").prop("disabled",!1)),o?(g.aclGroups?(m(d,l.acl),M.updateTextFields("#tab-users-dialog-new")):g.main.socket.emit("listPermissions",function(e){g.aclGroups={};var t=[];for(var n in e)e.hasOwnProperty(n)&&e[n]&&e[n].type&&(g.aclGroups[e[n].type]=g.aclGroups[e[n].type]||[],-1===g.aclGroups[e[n].type].indexOf(e[n].operation)&&g.aclGroups[e[n].type].push(e[n].operation),-1===t.indexOf(e[n].operation)&&t.push(e[n].operation));var i="<table><tr>";for(var a in i+="</tr>",g.aclGroups)if(g.aclGroups.hasOwnProperty(a)){i+='<tr class="group-titles"><td colspan="'+t.length+'">'+_(a+" permissions")+"</td></tr>",i+='<tr class="group-sub-titles">';for(var s=0;s<t.length;s++)-1!==g.aclGroups[a].indexOf(t[s])?i+="<td>"+t[s]+"</td>":i+="<td></td>";i+="</tr>",i+="<tr>";for(var o=0;o<t.length;o++)if(-1!==g.aclGroups[a].indexOf(t[o])){var r="acl_"+a+"_"+o;i+='<td><input id="'+r+'" data-type="'+a+'" data-operation="'+t[o]+'" class="edit-group-permissions filled-in" type="checkbox" checked="checked" /><span for="'+r+'"></span></td>'}else i+="<td></td>";i+="</tr>"}i+="</table>",c.find("#tab-users-dialog-new-rights").html(i),c.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=$(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),c.find('input[type="checkbox"]').off("change").on("change",function(){b(c)}),m(d,l.acl),M.updateTextFields("#tab-users-dialog-new")}),c.find("ul.tabs .tab-dialog-new-tabs").show()):(c.find("ul.tabs .tab-dialog-new-tabs").each(function(){$(this).find('a[href="#tab-users-dialog-new-rights"]').length&&$(this).hide()}),M.updateTextFields("#tab-users-dialog-new")),c.find("ul.tabs").mtabs(),g.main.noSelect||c.find("ul.tabs").mtabs("select","tab-users-dialog-new-main"),c.modal().modal("open")}function t(){g.list.sort(),g.groups.sort();var e="";e+='<ul class="collection">';for(var t=function(e,t){for(var n={},i=0;i<t.length;i++)if(e[t[i]]&&e[t[i]].common&&e[t[i]].common.members)for(var a=e[t[i]].common.members,s=0;s<a.length;s++)n[a[s]]=n[a[s]]||[],n[a[s]].push({id:t[i],name:e[t[i]].common.name||id.replace("system.group.","")});return n}(g.main.objects,g.groups),n=0;n<g.list.length;n++){var i,a;a=g.main.objects[g.list[n]]&&g.main.objects[g.list[n]].common?g.main.objects[g.list[n]].common:{},"system.user.admin"===g.list[n]&&(a.enabled=!0),i=a.name?translateName(a.name):f(g.list[n].replace(/^system\.user\./));var s="";if(t[g.list[n]])for(var o=t[g.list[n]],r=0;r<o.length;r++){var c=o[r].id,l=translateName(o[r].name);s+='<div class="chip">'+g.main.getIcon(c)+l+'<i class="close material-icons tab-users-remove-group" data-group="'+c+'" data-user="'+g.list[n]+'">close</i></div>'}var d="",u=!1;a.color&&(d="background: "+a.color+"; ",g.main.invertColor(a.color)&&(u=!0,d+="color: white;"));var m=a.desc;"object"==typeof m&&(m=m[systemLang]||m.en),e+='<li class="collection-item avatar users-type-draggable '+(u?"inverted":"")+'" data-tt-id="'+g.list[n]+'" style="'+d+'">',e+=" "+(g.main.getIcon(g.list[n],null,null,"icon")||'<img class="icon" src="img/account_circle.png"/>'),e+='<span class="title">'+i+"</span>",e+="<p>"+g.list[n]+((m?" ("+m+")":"")||"")+"</p>",e+=' <a class="secondary-content '+(a.dontDelete?"disabled":"tab-users-enabled-user")+'" data-user="'+g.list[n]+'"><i class="material-icons">'+(a.enabled?"check_box":"check_box_outline_blank")+"</i></a>",e+=' <a class="edit-content" data-user="'+g.list[n]+'"><i class="material-icons">edit</i></a>',e+=' <a class="delete-content'+(a.dontDelete?" disabled":"")+'" data-user="'+g.list[n]+'"><i class="material-icons">delete</i></a><br>',e+=s||"",e+="</li>"}e+="</ul>",g.$gridUsers.html(e),g.$grid.find("#tab-users-btn-new-user").on("click",function(){y(!1)}),g.$gridUsers.find(".tab-users-enabled-user").on("click",function(){var e=$(this).data("user");if("system.user.admin"===e)return h(_("Cannot disable admin!"),!0),!1;var t=$(this),n=g.main.objects[e]&&g.main.objects[e].common&&g.main.objects[e].common.enabled;n=!n,g.main.socket.emit("extendObject",e,{common:{enabled:n}},function(e){e?h(_("Cannot modify user!")+e,!0):(h(_("Updated")),t.find("i").text(n?"check_box":"check_box_outline_blank"))})}),g.$gridUsers.find(".delete-content").off("click").on("click",function(){var t=$(this).data("user");$(this).hasClass("disabled")||(g.main.objects[t]&&"user"===g.main.objects[t].type?g.main.confirmMessage(_("Are you sure to delete %s?",t),null,"help",function(e){e&&p(t)}):h(_('Object "<b>%s</b>" does not exists. Update the page.',t),!0))}),g.$gridUsers.find(".edit-content").on("click",function(){y($(this).data("user"))}),g.$gridUsers.find(".tab-users-remove-group").on("click",function(){var i=$(this).data("user"),e=$(this).data("group");g.main.socket.emit("getObject",e,function(e,t){if(t&&t.common&&t.common.members){var n=t.common.members.indexOf(i);-1!==n?(t.common.members.splice(n,1),g.main.socket.emit("setObject",t._id,t,function(e){e?h(_("Error: %s",e),!0):h(_("Removed"))})):h(_("%s is not in the list"),!0)}})})}function n(){var e="";e+='<ul class="collection">';for(var t=0;t<g.groups.length;t++){var n,i;n=(i=g.main.objects[g.groups[t]]&&g.main.objects[g.groups[t]].common?g.main.objects[g.groups[t]].common:{}).name?translateName(i.name):f(g.groups[t].replace(/^system\.group\./));var a="";if(i.members&&i.members.length)for(var s=i.members,o=0;o<s.length;o++){var r,c=s[o];r=g.main.objects[c]&&g.main.objects[c].common&&g.main.objects[c].common.name?translateName(g.main.objects[c].common.name):f(c.replace(/^system\.user\./)),a+='<div class="chip">'+g.main.getIcon(c)+r+'<i class="close material-icons tab-users-remove-user" data-group="'+g.groups[t]+'" data-user="'+c+'">close</i></div>'}var l="",d=!1;i.color&&(l="background: "+i.color+"; ",g.main.invertColor(i.color)&&(d=!0,l+="color: white;"));var u=i.desc;"object"==typeof u&&(u=u[systemLang]||u.en),e+='<li class="collection-item avatar '+(d?"inverted":"")+'" data-tt-id="'+g.groups[t]+'" style="'+l+'">',e+=" "+(g.main.getIcon(g.groups[t],null,null,"icon")||'<img class="icon" src="img/group.png"/>'),e+=' <span class="title">'+n+"</span>",e+=" <p>"+g.groups[t]+((u?" ("+u+")":"")||"")+"</p>",e+=' <a class="edit-content" data-group="'+g.groups[t]+'"><i class="material-icons">edit</i></a>',e+=' <a class="delete-content'+(i.dontDelete?" disabled":"")+'" data-group="'+g.groups[t]+'"><i class="material-icons">delete</i></a><br>',e+=a||"",e+="</li>"}e+="</ul>",g.$gridGroups.html(e),g.$grid.find("#tab-users-btn-new-group").on("click",function(){y(!0)}),g.$gridGroups.find(".delete-content").on("click",function(){var n=$(this).data("group");$(this).hasClass("disabled")||(g.main.objects[n]&&"group"===g.main.objects[n].type?g.main.confirmMessage(_("Are you sure to delete %s?",n),null,"help",function(e){var t;e&&(t=n,g.main.objects[t]&&"group"===g.main.objects[t].type?g.main.objects[t].common&&g.main.objects[t].common.dontDelete?h(_("Object may not be deleted"),!0):g.main.socket.emit("delObject",t,function(e){e?h(_("Group may not be deleted: %s",e),!0):h(_("Group deleted"))}):h(_("Invalid object: %s",t),!0))}):h(_('Object "<b>%s</b>" does not exists. Update the page.',n),!0))}),g.$gridGroups.find(".edit-content").on("click",function(){y($(this).data("group"))}),g.$gridGroups.find(".tab-users-remove-user").on("click",function(){var i=$(this).data("user"),e=$(this).data("group");g.main.socket.emit("getObject",e,function(e,t){if(t&&t.common&&t.common.members){var n=t.common.members.indexOf(i);if(-1!==n){if(t.common.members.splice(n,1),!t._id)return void console.error("INVLAID ID");g.main.socket.emit("setObject",t._id,t,function(e){e?h(_("Error: %s",e),!0):h(_("Removed"))})}else h(_("%s is not in the list"),!0)}})})}this.groups=[],this.list=[],this.$grid=$("#tab-users"),this.$gridUsers=this.$grid.find(".tab-users-list-users .tab-users-body"),this.$gridGroups=this.$grid.find(".tab-users-list-groups .tab-users-body"),this.main=e,this.aclGroups=null,this.prepare=function(){},this._postInit=function(){var e;t(),g.$gridUsers.find("ul").sortable({connectWith:"#tab-users .tab-users-list-groups .treetable",items:".users-type-draggable",appendTo:g.$gridUsers,refreshPositions:!0,helper:function(e,t){return $('<div class="users-drag-helper">'+t.find(".treetable-icon-empty+span").text()+"</div>")},zIndex:999990,revert:!1,scroll:!1,start:function(e,t){var n=t.item.prev();t.item.data("prev",n),g.$grid.addClass("dragging")},stop:function(e,t){g.$grid.removeClass("dragging")},update:function(e,t){var n=t.item.data("prev");n&&n.length?$(n).after(t.item):$(this).prepend(t.item)}}).disableSelection(),n(),(e=g.$gridGroups.find("ul>li")).droppable("instance")&&e.droppable("destroy"),e.droppable({accept:".users-type-draggable",over:function(e,t){if($(this).addClass("tab-accept-item"),$(this).hasClass("not-empty")&&!$(this).hasClass("expanded")){var n,i=$(this).data("tt-id");(n=$(this).data("timer"))&&clearTimeout(n),$(this).data("timer",setTimeout(function(){g.$gridGroups.treeTable("expand",i)},1e3))}},out:function(e,t){var n;$(this).removeClass("tab-accept-item"),(n=$(this).data("timer"))&&(clearTimeout(n),$(this).data("timer",null))},tolerance:"pointer",drop:function(e,t){$(this).removeClass("tab-accept-item");var n=t.draggable.data("tt-id"),i=$(this).data("tt-id");g.main.socket.emit("getObject",i,function(e,t){t&&t.common&&(t.common.members=t.common.members||[],-1===t.common.members.indexOf(n)?(t.common.members.push(n),t.common.members.sort(),g.main.socket.emit("setObject",t._id,t,function(e){e?h(_("Error: %s",e),!0):h(_("%s added to %s",n,t._id))})):h(_("Is yet in the list")))})}})},this.init=function(e){this.inited&&!e||(void 0!==this.$gridUsers&&this._postInit(),this.inited||(h(_("You can drag&drop users to groups"),5e3),this.inited=!0,this.main.subscribeObjects("system.user.*"),this.main.subscribeObjects("system.group.*")))},this.destroy=function(){this.inited&&(this.inited=!1,this.main.unsubscribeObjects("system.user.*"),this.main.unsubscribeObjects("system.group.*"))},this.objectChange=function(e,t,n){if(e.match(/^system\.user\./)){if(t)-1===this.list.indexOf(e)&&this.list.push(e);else{var i=this.list.indexOf(e);-1!==i&&this.list.splice(i,1)}this.timer&&clearTimeout(this.timer),this.timer=setTimeout(function(){g.timer=null,g._postInit()},200)}else if(e.match(/^system\.group\./)){if(t)-1===this.groups.indexOf(e)&&this.groups.push(e);else{var a=this.groups.indexOf(e);-1!==a&&this.groups.splice(a,1)}this.timer&&clearTimeout(this.timer),this.timer=setTimeout(function(){g.timer=null,g._postInit()},200)}}}!function(C){C(document).ready(function(){var e=location.pathname+"socket.io";location.pathname.match(/^\/admin\//)&&(e="/socket.io");var s,y={},v={objects:{},states:{},currentHost:"",currentTab:null,currentDialog:null,currentUser:"",subscribesStates:{},subscribesObjects:{},subscribesLogs:0,socket:io.connect("/",{path:e}),systemConfig:null,instances:null,objectsLoaded:!1,waitForRestart:!1,tabs:null,dialogs:{},selectId:null,config:{},ignoreJSupdate:!1,addEventMessage:function(e,t,n,i){g.events.add(e,t,n,i)},saveConfig:function(e,t){e&&(v.config[e]=t),"undefined"!=typeof storage&&storage.set("adminConfig",JSON.stringify(v.config))},saveTabs:function(){this.socket.emit("setObject","system.config",this.systemConfig,function(e){e&&this.showError(e)})},upToDate:function(e,t){return e=e.split("."),t=t.split("."),e[0]=parseInt(e[0],10),t[0]=parseInt(t[0],10),!(e[0]>t[0])&&(e[0]!==t[0]||(e[1]=parseInt(e[1],10),t[1]=parseInt(t[1],10),!(e[1]>t[1])&&(e[1]!==t[1]||(e[2]=parseInt(e[2],10),t[2]=parseInt(t[2],10),e[2]<=t[2]))))},cmdExec:function(e,t,n){e=e||v.currentHost,c.val(""),l.modal("open"),s="$ ./yunkong2 "+t,l.data("finished",!1).find(".btn").html(_("In background")),l.find(".command").html(s),l.find(".progress-dont-close").removeClass("disabled"),p.find(".button-command").removeClass("error").addClass("in-progress"),l.data("max",null),l.data("error",""),h.addClass("indeterminate").removeClass("determinate"),t.match(/^upload /)?l.find(".progress-text").html(_("Upload started...")).removeClass("error"):t.match(/^del [-_\w\d]+\.[\d]+$/)?l.find(".progress-text").html(_("Removing of instance...")).removeClass("error"):t.match(/^del /)?l.find(".progress-text").html(_("Removing of adapter...")).removeClass("error"):t.match(/^url /)?l.find(".progress-text").html(_("Install or update from URL...")).removeClass("error"):t.match(/^add /)?l.find(".progress-text").html(_("Add instance...")).removeClass("error"):l.find(".progress-text").html(_("Started...")).removeClass("error"),c.val(s),r=Math.floor(268435454*Math.random())+1,o=n,v.socket.emit("cmdExec",e,r,t,function(e){e?(s+="\n"+_(e),c.val(s),o=null,n(e)):n&&n()})},confirmMessage:function(e,t,n,i,a){if("function"==typeof i)a=i,m.find(".modal-footer").html('<a class="modal-action modal-close waves-effect waves-green btn-flat translate" data-result="true">'+_("Ok")+'</a><a class="modal-action modal-close waves-effect waves-green btn-flat translate">'+_("Cancel")+"</a>"),m.find(".modal-footer .modal-action").on("click",function(){var e=m.data("callback");e&&e(C(this).data("result"))});else if("object"==typeof i){for(var s="",o=i.length-1;0<=o;o--)s+='<a class="modal-action modal-close waves-effect waves-green btn-flat translate" data-id="'+o+'">'+i[o]+"</a>";m.find(".modal-footer").html(s),m.find(".modal-footer .modal-action").on("click",function(){var e=m.data("callback");e&&e(C(this).data("id"))})}m.find(".dialog-title").text(t||_("Please confirm")),n?m.find(".dialog-icon").show().html(n):m.find(".dialog-icon").hide(),m.find(".dialog-text").html(e),m.data("callback",a),m.modal("open")},showMessage:function(e,t,n){u.find(".dialog-title").text(t||_("Message")),n?u.find(".dialog-icon").show().html(n):u.find(".dialog-icon").hide(),u.find(".dialog-text").html(e),u.modal("open")},showError:function(e){v.showMessage(_(e),_("Error"),"error_outline")},showToast:function(e,t,n,i,a,s){e&&e instanceof jQuery&&(e=e[0]),"string"==typeof(s=s||[])&&(s=[s]),a&&s.push("dropZone-error"),M.toast({parentSelector:e||C("body")[0],html:t+(n?'<i class="material-icons">'+n+"</i>":""),displayLength:i||3e3,classes:s})},formatDate:function(e,t){if(!e)return"";var n,i=typeof e;return"string"===i?t?e.substring(8):e:("object"!==i&&(e=e<9466812e5?new Date(1e3*e):new Date(e)),t?i=(n=e.getDate())<10?"0"+n:n:(i=e.getFullYear(),i+=(n=e.getMonth()+1)<10?"-0"+n:"-"+n,i+=(n=e.getDate())<10?"-0"+n:"-"+n),i+=(n=e.getHours())<10?" 0"+n:" "+n,i+=(n=e.getMinutes())<10?":0"+n:":"+n,i+=(n=e.getSeconds())<10?":0"+n:":"+n,i+=(n=e.getMilliseconds())<10?".00"+n:n<100?".0"+n:"."+n)},updateWizard:function(){var e=C("#button-wizard");v.objects["system.adapter.discovery.0"]?(e.data("inited")||(e.data("inited",!0),e.on("click",function(){v.navigate({tab:"instances",dialog:"config",params:"system.adapter.discovery.0"})}).attr("title",_("Device discovery"))),e.show(),!v.systemConfig.common.wizard&&v.systemConfig.common.licenseConfirmed&&e.trigger("click")):e.hide()},getUser:function(){if(v.currentUser){if(v.objects[v.currentUser]){var e=v.objects[v.currentUser],t="";if(t=e&&e.common&&e.common.name?translateName(e.common.name):(t=v.currentUser.replace(/^system\.user\./))[0].toUpperCase()+t.substring(1).toLowerCase(),e&&e.common&&e.common.icon){var n={};n[v.currentUser]=e,C("#current-user-icon").html(v.getIcon(v.currentUser,null,n))}else C("#current-user-icon").html('<i class="large material-icons">account_circle</i>');C("#current-user").html(t);for(var i=[],a=0;a<g.users.groups.length;a++){var s=v.objects[g.users.groups[a]];s&&s.common&&s.common.members&&-1!==s.common.members.indexOf(v.currentUser)&&i.push(_(translateName(s.common.name)))}C("#current-group").html(i.join(", "))}}else v.socket.emit("authEnabled",function(e,t){v.currentUser="system.user."+t,e?(v._lastTimer=(new Date).getTime(),function e(){if(v._timer)return;var t=(new Date).getTime();3e4<t-v._lastTimer?location.reload():v._lastTimer=t;v._timer=setTimeout(function(){v._timer=null,e()},1e4)}()):C("#button-logout").remove()})},_delObject:function(e,i){var a;if(!Array.isArray(e)){if("string"!=typeof e)return i&&i("invalid idOrList parameter");e=[e]}!function t(){if(0===e.length)return i&&setTimeout(i,0,null,a);if(a=e.pop(),v.objects[a]&&v.objects[a].common&&(v.objects[a].common["object-non-deletable"]||v.objects[a].common.dontDelete))v.showMessage(_('Cannot delete "%s" because not allowed',a),"","notifications"),setTimeout(t,0);else{var n=v.objects[a];v.socket.emit("delObject",a,function(e){if(e&&"Not exists"!==e)return v.showError(e),i(e);n&&"state"===n.type?v.socket.emit("delState",a,function(e){if(e&&"Not exists"!==e)return v.showError(e),i(e);setTimeout(t,0)}):setTimeout(t,0)})}}()},_delObjects:function(e,t,n){if(t){var i=[];for(var a in v.objects)v.objects.hasOwnProperty(a)&&a.substring(0,e.length+1)===e+"."&&i.push(a);i.push(e),i.sort(),this._delObject(i,function(){n&&n()})}else this._delObject(e,n)},delObject:function(e,t,n){var i=e?e.selectId("getTreeInfo",t):null;v.objects[t]?i&&i.children?v.confirmMessage(_('Do you want to delete just <span style="color: blue">one object</span> or <span style="color: red">all</span> children of %s too?',t),null,"help_outline",[_("_All"),_("Only one"),_("Cancel")],function(e){0===e?v._delObjects(t,!0,n):1===e&&v._delObjects(t,!1,n)}):v.confirmMessage(_("Are you sure to delete %s?",t),null,"help_outline",function(e){e&&v._delObjects(t,!0,n)}):i&&i.children?v.confirmMessage(_("Are you sure to delete all children of %s?",t),null,"help_outline",function(e){e&&v._delObjects(t,!0,n)}):v.showMessage(_('Object "<b>%s</b>" does not exists. Update the page.',t),_("Error"),"help_outline",function(e){e&&v._delObjects(t,!0,n)})}},g={hosts:new Hosts(gMain=v),objects:new Objects(v),adapters:new Adapters(v),instances:new Instances(v),users:new Users(v),enums:new Enums(v),events:new Events(v),logs:new Logs(v),states:null,intro:new Intro(v)};"undefined"!=typeof States&&(g.states=new States(v)),v.instances=g.instances.list,v.tabs=g,v.dialogs={system:new System(v),customs:new Customs(v),config:new Config(v),editobject:new EditObject(v),issue:new Issue(v),readme:new Readme(v)};var o=null,r=null,c=C("#stdout"),l=C("#dialog-command"),d=C("#dialog-license-main"),u=C("#dialog-message"),m=C("#dialog-confirm"),h=l.find(".progress div"),f=C("#admin_sidemenu_menu"),p=C("#admin_sidemenu_main"),t=!0;if("ontouchstart"in window||navigator.maxTouchPoints||C("body").addClass("desktop-screen"),-1!==navigator.userAgent.indexOf("Safari")&&-1===navigator.userAgent.indexOf("Chrome")&&-1===navigator.userAgent.indexOf("Android")?(C("body").addClass("safari"),v.browser="safari",v.noSelect=!0):detectIE()&&(C("body").addClass("ie"),v.browser="ie",v.browserVersion=detectIE(),v.noSelect=!0,C("#host-adapters-btn").css("margin-top","10px")),"undefined"!=typeof storage)try{v.config=storage.get("adminConfig"),v.config?v.config=JSON.parse(v.config):v.config={}}catch(e){console.log("Cannot load edit config"),v.config={}}function b(e){C("#admin_sidemenu_dialog").html(""),C("html").off("click",b)}function w(){if(function(){var e="",i=[];C(".admin-tab").each(function(){var e=C(this).attr("id");v.systemConfig.common.tabs&&-1===v.systemConfig.common.tabs.indexOf(e)||i.push({line:'<li class="admin-sidemenu-items" data-tab="'+e+'"><a href="#'+e+'">'+(T[e]&&T[e].icon?'<i class="material-icons left">'+T[e].icon+"</i>":'<i class="material-icons left">live_help</i>')+_(C(this).data("name"))+"</a></li>",id:e})}),C(".tab-custom").each(function(){var e=C(this).attr("id");if(!v.systemConfig.common.tabs||-1!==v.systemConfig.common.tabs.indexOf(e)){var t;if(T[e]&&T[e].icon)t=T[e].icon;else{var n="system.adapter."+e.substring(4);v.objects[n]&&v.objects[n].adminTab&&v.objects[n]["fa-icon"]&&(t=v.objects[n]["fa-icon"])}i.push({line:'<li class="admin-sidemenu-items" data-tab="'+e+'"><a href="#'+e+'">'+(t?'<i class="material-icons left">'+t+"</i>":'<i class="material-icons left">live_help</i>')+C(this).data("name")+"</a></li>",id:e})}}),i.sort(function(e,t){return T[e.id]||T[t.id]?T[e.id]?T[t.id]?T[e.id].order<T[t.id].order?-1:T[e.id].order>T[t.id].order?1:0:-1:1:0});for(var t=0;t<i.length;t++)e+=i[t].line;f.find(".admin-sidemenu-menu").html(e),C(".admin-sidemenu-close").off("click").on("click",function(){p.toggleClass("admin-sidemenu-closed"),f.toggleClass("admin-sidemenu-closed"),C(".admin-sidemenu-close i").toggleClass("hide"),setTimeout(function(){C(window).trigger("resize")},400)}),C(".admin-sidemenu-items").off("click").on("click",function(e){e.preventDefault(),e.stopPropagation(),window.location.hash="#"+C(this).data("tab")}),C(".admin-sidemenu-items a").off("click").on("click",function(e){e.preventDefault(),e.stopPropagation(),window.location.hash="#"+C(this).parent().data("tab")}),g.hosts.updateCounter(),g.adapters.updateCounter()}(),v.tabsInited){var e=f,t=e.data("problem-link");if(t){var n=C(t);if(n.length){var i=n.data("src");if(i&&-1===i.indexOf("%")){var a=n.find("iframe");a.length&&!a.attr("src")&&(a.attr("src",i),e.data("problem-link",null))}}}v.currentHash=null,v.navigateDo()}else v.tabsInited=!0,v.socket.emit("getVersion",function(e,t){var n=C(".button-version");n.hasClass("vendor")||n.text("yunkong2.admin "+t)}),C(".choose-tabs-config-button").off("click").on("click",function(e){var t=C("#admin_sidemenu_dialog");if(t.html())return t.html(""),void C("html").off("click",b);setTimeout(function(){C("html").on("click",b)},100);var n=C(e.target),i=n.offset();i.top+=n.height()-2;var a='<dialog open class="tab-selector m" style="top: '+i.top+"px; left: "+i.left+'px;"><div><ul style="">';for(var s in y){var o=y[s],r="chk-"+s;a+="<li><input "+(f.find('.admin-sidemenu-items[data-tab="'+s+'"]').length?"checked":"unchecked")+' class="chk-tab filled-in" type="checkbox" id="'+r+'" /><span for="'+r+'">'+_(o)+"</span></id>"}a+="</ul></div></dialog>",t.append(a),t.find(".chk-tab").off("change").on("change",function(e){var t=C(this).attr("id").substr(4);if(C(this).prop("checked"))v.systemConfig.common.tabs.push(t);else{var n=v.systemConfig.common.tabs.indexOf(t);-1!==t&&v.systemConfig.common.tabs.splice(n,1)}v.saveTabs(),j()}),t.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=C(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")})}),v.updateWizard(),C("#button-logout").on("click",function(){window.location.href="/logout/"}),window.onhashchange=function(){v.navigateDo()},v.navigateDo(),C("#events_threshold").on("click",function(){v.socket.emit("eventsThreshold",!1)})}function j(){var n=[],e=[];y={};for(var t=0;t<v.instances.length;t++){var i=v.instances[t],a=v.objects[i];if(a.common&&a.common.adminTab)if(a.common.adminTab.singleton){for(var s=!1,o=i.replace(/\.(\d+)$/,"."),r=0;r<e.length;r++){if(o===e[r].replace(/\.(\d+)$/,".")){s=!0;break}}s||e.push(i)}else e.push(i)}C(".admin-tab").each(function(){var e=C(this),t=e.attr("id");n.push(t),y[t]=e.data("name")});for(var c=0;c<e.length;c++){var l=v.objects[e[c]],d="tab-"+l.common.name,u=l.common.adminTab.link||"/adapter/"+l.common.name+"/tab.html";l.common.materializeTab&&(u=l.common.adminTab.link||"/adapter/"+l.common.name+"/tab_m.html");var m,g=e[c].split(".");if(m=l.common.adminTab.name?"object"==typeof l.common.adminTab.name?l.common.adminTab.name[systemLang]?l.common.adminTab.name[systemLang]:l.common.adminTab.name.en?_(l.common.adminTab.name.en):_(l.common.name):_(l.common.adminTab.name):_(l.common.name),l.common.adminTab.singleton?g[3]=0:(-1!==u.indexOf("?")?u+="&instance="+g[3]:u+="?instance="+g[3],m+="."+g[3],d+="-"+g[3]),n.push(d),y[d]=m,v.systemConfig.common.tabs&&-1===v.systemConfig.common.tabs.indexOf(d))C("#"+d).hide().appendTo(C("body"));else{var h=!1;if(u?h=-1!==u.indexOf("%"):(u="/adapter/"+g[2]+"/tab.html",l.common.materilizeTab&&(u="/adapter/"+g[2]+"/tab_m.html")),'<li><a href="#'+d+'">'+m+"</a></li>\n",C("#"+d).length)C("#"+d).hide().appendTo(C("body"));else{var f='<div id="'+d+'" data-name="'+m+'" class="tab-custom '+(h?"link-replace":"")+'" data-adapter="'+g[2]+'" data-instance="'+g[3]+'" data-src="'+u+'"><iframe class="iframe-in-tab" style="border: 0; solid #FFF; display: block; left: 0; top: 0; width: 100%; height: 100%"></iframe></div>';C(f).hide().appendTo(C("body")),C("#"+d).find(".iframe-in-tab").on("load",function(){var e=C(this).contents().find("body>header");e&&e.length||(e=C(this).contents().find("head")),e&&e.length&&e.append('<link rel="stylesheet" type="text/css" href="../../lib/css/iob/selectID.css"/>')})}}}if(C(".tab-custom").each(function(){-1===n.indexOf(C(this).attr("id"))&&C("#"+C(this).attr("id")).remove()}),v.systemConfig.common.tabs||(v.systemConfig.common.tabs=n),C(".link-replace").length){var p=0,b=setTimeout(function(){b=null,w()},100);C(".link-replace").each(function(){p++,v.tabs.instances._replaceLinks(C(this).data("src"),C(this).data("adapter"),C(this).data("instance"),C(this).attr("id"),function(e,t,n,i){C("#"+i).data("src",e).removeClass("link-replace"),--p||b&&(clearTimeout(b),b=null,w())})})}else w()}function L(a){v.socket.emit("getAllObjects",function(e,i){e?window.alert(_(e)):setTimeout(function(){var e;for(var t in v.objects=i,v.objects)v.objects.hasOwnProperty(t)&&"_design"!==t.slice(0,7)&&("instance"===(e=v.objects[t]).type&&v.instances.push(t),"enum"===e.type&&g.enums.list.push(t),"user"===e.type&&g.users.list.push(t),"group"===e.type&&g.users.groups.push(t),"adapter"===e.type&&g.adapters.list.push(t),"host"===e.type&&g.hosts.addHost(e),e.common&&e.common.history&&(e.common.custom=JSON.parse(JSON.stringify(e.common.history)),delete e.common.history));for(var n in v.objectsLoaded=!0,v.initHostsList(!0),j(),v.dialogs)v.dialogs.hasOwnProperty(n)&&"function"==typeof v.dialogs[n].prepare&&v.dialogs[n].prepare();!function n(i,a){a=a||0,i&&a<i.length&&v.socket.emit("sendToHost",i[a].name,"getHostInfo",null,function(e){if(e&&e["Node.js"]){var t=parseInt(e["Node.js"].split(".").shift().replace("v",""),10);(t<6||7===t||9===t)&&v.showMessage(_('This version of node.js "%s" on "%s" is deprecated. Please install node.js 6, 8 or newer',e["Node.js"],i[a].name),_("Suggestion"),"error_outline")}setTimeout(function(){n(i,a+1)},100)})}(g.hosts.list),v.getUser(),"function"==typeof a&&a()},0)})}function n(e,t){(e=e?e.replace(/\s/g,"_"):"")&&e.match(/\.messagebox$/)?v.addEventMessage(e,t,!0,!0):(g.states&&g.states.stateChange(e,t),g.objects.stateChange(e,t),g.hosts.stateChange(e,t),g.instances.stateChange(e,t),g.adapters.stateChange(e,t),v.dialogs.customs.stateChange(e,t),v.selectId&&v.selectId.selectId("state",e,t),v.addEventMessage(e,t,!1,!0))}function i(e,t){var n="update";t?(t._rev&&v.objects[e]&&(v.objects[e]._rev=t._rev),v.objects[e]||(n="add"),"add"!==n&&JSON.stringify(v.objects[e])===JSON.stringify(t)||(v.objects[e]=t)):v.objects[e]&&(n="delete",delete v.objects[e]),v.addEventMessage(e,t,!1,!1),g.objects.objectChange(e,t,n),v.selectId&&v.selectId.selectId("object",e,t,n),g.enums.objectChange(e,t,n),g.intro.objectChange(e,t,n),"system.config"===e&&(v.systemConfig.common.language!==t.common.language&&window.location.reload(),v.systemConfig=t,j()),"system.adapter.discovery.0"===e&&v.updateWizard(),e.match(/^system\.host\.[-\w]+$/)&&v.initHostsList(),g.instances.objectChange(e,t,n),e.match(/^script\.js\.global\..*/)&&(v.ignoreJSupdate=!0),t&&e.match(/^system\.adapter\.[\w-]+\.[0-9]+$/)&&(t.common&&t.common.adminTab&&!t.common.adminTab.ignoreConfigUpdate&&(e.match(/^system\.adapter\.javascript\.[0-9]+$/)&&v.ignoreJSupdate?v.ignoreJSupdate=!1:j()),t&&"instance"===t.type&&t.common.supportCustoms&&g.objects.reinit()),g.hosts.objectChange(e,t,n),g.users.objectChange(e,t,n),e===v.currentUser&&v.getUser()}function N(e,t){var n,i,a=e&&e.common;if(a.icon){if(a.icon.match(/^data:image\//))n=a.icon;else{if(-1===a.icon.indexOf("."))return'<i class="material-icons '+(t||"treetable-icon")+'">'+a.icon+"</i>";var s;n="instance"===e.type?"/adapter/"+e.common.name+"/"+e.common.icon:e._id.match(/^system\.adapter\./)?(s=e._id.split(".",3),"/"===a.icon[0]?s[2]+=a.icon:s[2]+="/"+a.icon,"/adapter/"+s[2]):(s=e._id.split(".",2),"/"===a.icon[0]?s[0]+=a.icon:s[0]+="/"+a.icon,"/adapter/"+s[0])}i=e.type}return{icon:n,alt:i}}v.initHostsList=function(e){var t=C("#host-adapters");if(!e||!t.data("inited")){t.data("inited",!0),v.currentHost=v.currentHost||v.config.currentHost||"";for(var n,i=[],a=0;a<v.tabs.hosts.list.length;a++)i.push('<li><a data-value="'+v.tabs.hosts.list[a].name+'">'+v.getHostIcon(v.objects[v.tabs.hosts.list[a].id],"imgHost left")+v.tabs.hosts.list[a].name+"</a></li>"),v.currentHost||(v.currentHost=v.tabs.hosts.list[a].name),v.currentHost===v.tabs.hosts.list[a].name&&(n=v.tabs.hosts.list[a].id);t.html(i);var s=C("#host-adapters-btn").show();s.text(_("Host:")+" "+v.currentHost).dropdown(),v.objects[n]&&v.objects[n].common&&v.objects[n].common.color,s.append(C(v.getHostIcon(v.objects[n],"imgHost left"))),v.tabs.hosts.list.length<2?s.addClass("disabled"):s.removeClass("disabled"),t.find("a").on("click",function(){var e=C(this).data("value"),t="system.host."+e+".alive";v.states[t]&&v.states[t].val&&"null"!==v.states[t].val?(v.currentHost=e,C("#host-adapters-btn").text(_("Host:")+" "+v.currentHost).append(C(this).find(".imgHost").clone()),console.log(v.currentTab),T["tab-"+v.currentTab]&&T["tab-"+v.currentTab].host&&(v.tabs[v.currentTab]&&"function"==typeof v.tabs[v.currentTab].destroy&&v.tabs[v.currentTab].destroy(),v.tabs[v.currentTab]&&"function"==typeof v.tabs[v.currentTab].init&&v.tabs[v.currentTab].init()),v.saveConfig("currentHost",v.currentHost)):v.showMessage(_("Host %s is offline",C(this).val()))})}},v.resubscribeStates=function(){for(var e in v.subscribesStates)v.subscribesStates.hasOwnProperty(e)&&v.subscribesStates[e]&&(console.debug("Re-Subscribe: "+e),v.socket.emit("subscribe",e))},v.resubscribeObjects=function(){for(var e in v.subscribesObjects)v.subscribesObjects.hasOwnProperty(e)&&v.subscribesObjects[e]&&v.socket.emit("subscribeObjects",e)},v.resubscribeLogs=function(){v.subscribesLogs&&(console.debug("Subscribe LOG"),v.socket.emit("requireLog",!0))},v.subscribeStates=function(e){if(e)if("object"==typeof e)for(var t=0;t<e.length;t++)v.subscribesStates[e[t]]=v.subscribesStates[e[t]]||0,v.subscribesStates[e[t]]++,1===v.subscribesStates[e[t]]&&(console.debug("Subscribe: "+e[t]),v.socket.emit("subscribe",e[t]));else v.subscribesStates[e]=v.subscribesStates[e]||0,v.subscribesStates[e]++,1===v.subscribesStates[e]&&(console.debug("Subscribe: "+e),v.socket.emit("subscribe",e))},v.unsubscribeStates=function(e){if(e)if("object"==typeof e)for(var t=0;t<e.length;t++)v.subscribesStates[e[t]]&&v.subscribesStates[e[t]]--,0===v.subscribesStates[e[t]]&&(console.debug("Unsibscribe: "+e[t]),v.socket.emit("unsubscribe",e[t]),delete v.subscribesStates[e[t]]);else v.subscribesStates[e]&&v.subscribesStates[e]--,0===v.subscribesStates[e]&&(console.debug("Unsibscribe: "+e),v.socket.emit("unsubscribe",e),delete v.subscribesStates[e])},v.subscribeObjects=function(e){if(e)if("object"==typeof e)for(var t=0;t<e.length;t++)v.subscribesObjects[e[t]]=v.subscribesObjects[e[t]]||0,v.subscribesObjects[e[t]]++,1===v.subscribesObjects[e[t]]&&v.socket.emit("subscribeObjects",e[t]);else v.subscribesObjects[e]=v.subscribesObjects[e]||0,v.subscribesObjects[e]++,1===v.subscribesObjects[e]&&v.socket.emit("subscribeObjects",e)},v.unsubscribeObjects=function(e){if(e)if("object"==typeof e)for(var t=0;t<e.length;t++)v.subscribesObjects[e[t]]&&v.subscribesObjects[e[t]]--,0===v.subscribesObjects[e[t]]&&(v.socket.emit("unsubscribeObjects",e[t]),delete v.subscribesObjects[e[t]]);else v.subscribesObjects[e]&&v.subscribesObjects[e]--,0===v.subscribesObjects[e]&&(v.socket.emit("unsubscribeObjects",e),delete v.subscribesObjects[e])},v.subscribeLogs=function(e){e?(v.subscribesLogs++,1===v.subscribesLogs&&(console.debug("Subscribe Logs"),v.socket.emit("requireLog",!0))):(v.subscribesLogs--,v.subscribesLogs<=0&&(v.subscribesLogs=0,console.debug("Unsubscribe Logs"),v.socket.emit("requireLog",!1)))},v.navigateCheckDialog=function(t){if(v.currentDialog&&v.dialogs[v.currentDialog]&&"function"==typeof v.dialogs[v.currentDialog].allStored){if(!1===v.dialogs[v.currentDialog].allStored())return v.confirmMessage(_("Some data are not stored. Discard?"),_("Please confirm"),null,function(e){t(!e)})}else if(configNotSaved)return v.confirmMessage(_("Some data are not stored. Discard?"),_("Please confirm"),null,function(e){t(!e)});t(!1)},v.navigateGetParams=function(){var e=decodeURI(window.location.hash).split("/");return e[2]?decodeURIComponent(e[2]):null},v.navigate=function(e){if(e||(e={}),"string"==typeof e&&(e={tab:e,dialog:"",params:""}),!e.tab){var t=decodeURI(window.location.hash).split("/");e.tab=t[0].replace(/^#/,"").replace(/^tab-/,"")}window.location.hash="#tab-"+encodeURIComponent(e.tab)+(e.dialog?"/"+e.dialog+(e.params?"/"+encodeURIComponent(e.params):""):"")},v.navigateDo=function(){window.location.hash!==v.currentHash&&v.navigateCheckDialog(function(e){if(e)window.location.hash=v.currentHash||"";else{configNotSaved=null,v.currentHash=window.location.hash;var t=v.currentHash.split("/"),n=t[0].replace(/^#/,"").replace(/^tab-/,""),i=t[1],a=decodeURIComponent(t[2]);n&&"!"!==n||(n=v.systemConfig.common.tabs&&-1===v.systemConfig.common.tabs.indexOf("tab-intro")?-1!==v.systemConfig.common.tabs.indexOf("tab-adapters")?"adapters":v.systemConfig.common.tabs[0].replace(/^#/,"").replace(/^tab-/,""):"intro");var s=C(".admin-sidemenu-body"),o=s.find(".admin-sidemenu-body-content"),r=C("#tab-"+n);if(s.find(".admin-preloader").remove(),r.length||(n="intro"),v.currentTab!==n||!o.length){var c;if(v.currentTab&&g[v.currentTab]&&"function"==typeof g[v.currentTab].destroy)g[v.currentTab].destroy();else if(v.currentTab){var l=C("#tab-"+v.currentTab);if(l.length&&(c=l.data("src"))){var d=l.find(">iframe");d.attr("src")&&(console.log("clear"),d.attr("src",""))}}if(v.currentTab=n,o.hide().appendTo("body"),i||(r.addClass("admin-sidemenu-body-content").show().appendTo(s),o=r),g[n]&&"function"==typeof g[n].init&&g[n].init(),r.length&&(c=r.data("src")))if(-1===c.indexOf("%")){var u=r.find(">iframe");u.length&&!u.attr("src")&&u.attr("src",c)}else f.data("problem-link","tab-"+n)}var m=f.find('.admin-sidemenu-items[data-tab="tab-'+n+'"]');f.find(".admin-sidemenu-items").not(m).removeClass("admin-sidemenu-active"),m.addClass("admin-sidemenu-active"),T["tab-"+n]&&T["tab-"+n].host?C("#host-adapters-btn").css("opacity",1):C("#host-adapters-btn").css("opacity",.3),document.title="云控2 - "+n,v.currentDialog!==i&&(v.dialogs[v.currentDialog]&&"function"==typeof v.dialogs[v.currentDialog].destroy&&v.dialogs[v.currentDialog].destroy(),(v.currentDialog=i)&&v.dialogs[i]?("function"==typeof v.dialogs[i].init&&v.dialogs[i].init(a?a.split(","):void 0),g[v.currentTab]&&g[v.currentTab].saveScroll&&g[v.currentTab].saveScroll(),o.hide().appendTo("body"),C("#dialog-"+i).addClass("admin-sidemenu-body-content").show().appendTo(s)):o.attr("id")!==r.attr("id")&&(o.hide().appendTo("body"),r.addClass("admin-sidemenu-body-content").show().appendTo(s),g[v.currentTab]&&g[v.currentTab].restoreScroll&&g[v.currentTab].restoreScroll()))}})},v.getIconFromObj=function(e,t,n){var i="",a="";if(e&&e.common)if(e.common.icon){var s=N(e);i=s.icon,a=s.alt}else t=t||"lib/css/fancytree/","device"===e.type?(i=t+"device.png",a="device"):"channel"===e.type?(i=t+"channel.png",a="channel"):"state"===e.type&&(i=t+"state.png",a="state");return i?'<img class="'+(n||"treetable-icon")+'" src="'+i+'" alt="'+(a||"")+'" />':""},v.getIcon=function(e,t,n,i){return v.getIconFromObj((n||v.objects)[e],t,i)},v.getHostIcon=function(e,t){var n="",i="";if(e&&e.common&&e.common.icon){var a=N(e);n=a.icon,i=a.alt}return'<img class="'+(t||"treetable-icon")+'" src="'+(n=n||"img/no-image.png")+'" alt="'+(i=i||"")+'" />'},v.formatBytes=function(e){if(Math.abs(e)<1024)return e+" B";for(var t=["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],n=-1;e/=1024,++n,1024<=Math.abs(e)&&n<t.length-1;);return e.toFixed(1)+" "+t[n]},v.invertColor=function(e){return 0===e.indexOf("#")&&(e=e.slice(1)),3===e.length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),6===e.length&&.299*parseInt(e.slice(0,2),16)+.587*parseInt(e.slice(2,4),16)+.114*parseInt(e.slice(4,6),16)<=186};var T={"tab-intro":{order:1,icon:"apps"},"tab-adapters":{order:2,icon:"store",host:!0},"tab-instances":{order:3,icon:"subtitles",host:!0},"tab-objects":{order:4,icon:"view_list"},"tab-enums":{order:5,icon:"art_track"},"tab-logs":{order:6,icon:"view_headline",host:!0},"tab-scenes":{order:7,icon:"subscriptions"},"tab-events":{order:8,icon:"flash_on"},"tab-users":{order:10,icon:"person_outline"},"tab-javascript":{order:11,icon:"code"},"tab-text2command-0":{order:12,icon:"ac_unit"},"tab-text2command-1":{order:12,icon:"ac_unit"},"tab-text2command-2":{order:12,icon:"ac_unit"},"tab-node-red-0":{order:20,icon:"device_hub"},"tab-node-red-1":{order:21,icon:"device_hub"},"tab-node-red-2":{order:22,icon:"device_hub"},"tab-hosts":{order:100,icon:"storage"},"tab-fullcalendar-0":{order:30,icon:"perm_contact_calendar"},"tab-fullcalendar-1":{order:31,icon:"perm_contact_calendar"},"tab-fullcalendar-2":{order:32,icon:"perm_contact_calendar"}};v.socket.on("log",function(e){g.logs.add(e)}),v.socket.on("error",function(e){console.log(e)}),v.socket.on("permissionError",function(e){v.showMessage(_("Has no permission to %s %s %s",e.operation,e.type,e.id||""))}),v.socket.on("stateChange",function(e,t){setTimeout(n,0,e,t)}),v.socket.on("objectChange",function(e,t){setTimeout(i,0,e,t)}),v.socket.on("cmdStdout",function(e,t){if(r===e){var n=t.match(/^upload \[(\d+)]/);if(n){null===l.data("max")&&(l.data("max",parseInt(n[1],10)),h.removeClass("indeterminate").addClass("determinate"));var i=l.data("max"),a=parseInt(n[1],10);h.css("width",100-Math.round(a/i*100)+"%")}else(n=t.match(/^got [-_:\/\\.\w\d]+\/admin$/))?(l.find(".progress-text").html(_("Upload admin started")),l.data("max",null)):(n=t.match(/^got [-_:\/\\.\w\d]+\/www$/))&&(l.find(".progress-text").html(_("Upload www started")),l.data("max",null));s+="\n"+t,c.val(s),c.scrollTop(c[0].scrollHeight-c.height())}}),v.socket.on("cmdStderr",function(e,t){r===e&&(l.data("error")||l.data("error",t),s+="\nERROR: "+t,c.val(s),c.scrollTop(c[0].scrollHeight-c.height()))}),v.socket.on("cmdExit",function(e,t){if(r===e){t=parseInt(t,10),s+="\n"+(0!==t?"ERROR: ":"")+"process exited with code "+t,c.val(s),c.scrollTop(c[0].scrollHeight-c.height()),l.find(".progress-dont-close").addClass("disabled"),h.removeClass("indeterminate").css({width:"100%"}),l.find(".btn").html(_("Close")),l.data("finished",!0),l.data("max",!0);var n=p.find(".button-command");if(n.removeClass("in-progress"),t){var i=l.data("error");if(i){var a=i.match(/error: (.*)$/);a&&(i=a[1]),l.find(".progress-text").html(_("Done with error: %s",_(i))).addClass("error")}else l.find(".progress-text").html(_("Done with error")).addClass("error");n.addClass("error"),n.show()}else l.find(".progress-text").html(_("Success!")),n.hide(),l.find(".progress-dont-close input").prop("checked")&&setTimeout(function(){l.modal("close")},1500);o&&(o(t),o=null)}}),v.socket.on("eventsThreshold",function(e){e?C("#events_threshold").show():C("#events_threshold").hide()}),v.socket.on("connect",function(){C("#connecting").hide(),t?(t=!1,v.getUser(),v.socket.emit("getUserPermissions",function(e,t){v.acl=t,v.socket.emit("getObject","system.config",function(a,e){if((v.systemConfig=e)&&e.native&&e.native.vendor){var t=e.native.vendor;if(t.icon&&C(".admin-sidemenu-header .button-icon img").attr("src",e.native.vendor.icon),t.name&&C(".admin-sidemenu-header .button-version").html(e.native.vendor.name).addClass("vendor"),t.admin&&t.admin.noCustomInstall&&C("#btn_filter_custom_url").hide(),t.admin&&t.admin.css){if(t.admin.css.sideNavUser&&C(".side-nav .user-view").css(t.admin.css.sideNavUser),t.admin.css.sideNavMenu&&C(".side-nav").css(t.admin.css.sideNavMenu),t.admin.css.header&&p.find(".admin-sidemenu-header nav").css(t.admin.css.header),t.admin.css.rules)for(var n=0;n<t.admin.css.rules.length;n++)C(t.admin.css.rules[n].selector).css(t.admin.css.rules[n].css);t.admin.styles&&C("head").append('<style type="text/css">'+t.admin.styles+"</style>")}}if(v.systemConfig&&v.systemConfig.common&&v.systemConfig.common.tabs){var i=v.systemConfig.common.tabs.indexOf("tab-log");-1!==i&&(v.systemConfig.common.tabs[i]="tab-logs")}v.socket.emit("getObject","system.repositories",function(e,t){v.dialogs.system.systemRepos=t,v.socket.emit("getObject","system.certificates",function(e,t){setTimeout(function(){if(v.dialogs.system.systemCerts=t,"permissionError"===a)v.systemConfig={common:{language:systemLang},error:"permissionError"};else if(!a&&v.systemConfig&&v.systemConfig.common){if(systemLang=v.systemConfig.common.language||systemLang,v.systemConfig.common.city=v.systemConfig.common.city||"",v.systemConfig.common.country=v.systemConfig.common.country||"",v.systemConfig.common.longitude=v.systemConfig.common.longitude||"",v.systemConfig.common.latitude=v.systemConfig.common.latitude||"",!v.systemConfig.common.licenseConfirmed){var n=(v.systemConfig.common.language||window.navigator.userLanguage||window.navigator.language||"").substring(0,2);"en"!==n&&(n="cn"),systemLang=n,d.find(".license_text").html(license[n]||license.en),d.find(".license_checkbox").prop("checked",!1),d.find(".license_language").data("licenseConfirmed",!1).val(n).on("change",function(){n=C(this).val(),d.find(".license_language_label").html(translateWord("Select language",n)),d.find(".license_text").html(license[n]||license.en),d.find(".license_checkbox").html(translateWord("license_checkbox",n)),d.find(".license_agree .translate").html(translateWord("agree",n)),d.find(".license_non_agree .translate").html(translateWord("not agree",n)),d.find(".license_terms").html(translateWord("License terms",n)),d.find(".license_agreement_label").html(translateWord("license agreement",n))}).select(),d.find(".license_diag").on("change",function(){C(this).prop("checked")?d.find(".license_agree").removeClass("disabled"):d.find(".license_agree").addClass("disabled")}),d.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=C(this).prev();e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),d.modal({dismissible:!1,complete:function(){d.find(".license_text").html(""),location.reload()}}).modal("open"),d.find(".license_agree").addClass("disabled").off("click").on("click",function(e){e.preventDefault(),e.stopPropagation(),v.socket.emit("getObject","system.config",function(e,t){!e&&t?(t.common=t.common||{},t.common.licenseConfirmed=!0,t.common.language=n,v.socket.emit("setObject","system.config",t,function(e){e&&v.showError(e),d.modal("close"),d.find(".license_agree").off("click"),d.find(".license_non_agree").off("click")})):v.showError(_("Cannot confirm: "+e))})}),d.find(".license_non_agree").off("click").on("click",function(e){location.reload()})}}else v.systemConfig={type:"config",common:{name:"system.config",city:"",country:"",longitude:"",latitude:"",language:"",tempUnit:"°C",currency:"",dateFormat:"DD.MM.YYYY",isFloatComma:!0,licenseConfirmed:!1,defaultHistory:"",tabs:["tab-intro","tab-adapters","tab-instances","tab-objects","tab-logs","tab-scenes","tab-javascript","tab-text2command-0"]}},v.systemConfig.common.language=window.navigator.userLanguage||window.navigator.language,"en"!==v.systemConfig.common.language&&(v.systemConfig.common.language="cn");for(var e in translateCron(),translateAll(),"function"==typeof initGridLanguage&&initGridLanguage(v.systemConfig.common.language),l.modal({dismissible:!1}),u.modal(),m.modal({dismissible:!1}),l.find(".progress-show-more").off("change").on("change",function(){var e=C(this).prop("checked");v.saveConfig("progressMore",e),e?l.find(".textarea").show():l.find(".textarea").hide()}),void 0===v.config.progressClose&&(v.config.progressClose=!0),l.find(".progress-dont-close input").on("change",function(){v.saveConfig("progressClose",C(this).prop("checked"))}),l.find('input[type="checkbox"]+span').off("click").on("click",function(){var e=C(this).prev();e.parent().parent().hasClass("switch")||e.prop("disabled")||e.prop("checked",!e.prop("checked")).trigger("change")}),l.find(".progress-dont-close input").prop("checked",v.config.progressClose),l.find(".progress-show-more").prop("checked",!!v.config.progressMore).trigger("change"),l.find(".btn").on("click",function(){l.data("finished")?p.find(".button-command").hide():p.find(".button-command").show()}),p.find(".button-command").on("click",function(){l.modal("open")}),g)g.hasOwnProperty(e)&&g[e]&&"function"==typeof g[e].prepare&&g[e].prepare();var i;i=L,g.states&&g.states.clear(),v.socket.emit("getStates",function(e,t){v.states=t,"function"==typeof i&&setTimeout(function(){i()},0)})},0)})})})})):(v.resubscribeStates(),v.resubscribeObjects(),v.resubscribeLogs()),v.waitForRestart&&location.reload()}),v.socket.on("disconnect",function(){C("#connecting").show()}),v.socket.on("reconnect",function(){C("#connecting").hide(),v.waitForRestart&&location.reload()}),v.socket.on("repoUpdated",function(){setTimeout(function(){g.adapters.init(!0)},0)}),v.socket.on("reauthenticate",function(){location.reload()})})}(jQuery);var license={en:'The MIT License (MIT)<br><br>Copyright © 2014-2018 spacen<br><br>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:<br>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<br>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>',cn:'The MIT License (MIT)<br><br>Copyright © 2014-2018 spacen<br><br>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:<br>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<br>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<br>'},addAll2FilterCombobox=!1;function IobListHeader(e,h){if(!(this instanceof IobListHeader))return new IobListHeader(e,h);var f,a,p;void 0===h&&(h={}),void 0===h.colWidthOffset&&(h.colWidthOffset=0),"TABLE"===(p="object"==typeof e?$(e):$("#"+e))[0].tagName&&(p=p.find("tr:first")),e=p[0];var n,b=this;b.selectIdOffset=[],p.html(""),this.setList=function(e){var t;(t="string"==typeof e?("#"!==e[0]&&(e="#"+e),$(e)):e)&&t.length&&("TD"!==t[0].tagName&&"TH"!==t[0].tagName&&((t=t.find(">thead>tr:first>th,>thead>tr:first>td")).length||(t=e.find(">tbody>tr:first>th,>tr:first>th,>tbody>tr:first>td, >tr:first>td"))),a=t)},h.list&&this.setList(h.list),this.syncHeader=function(){if("object"==typeof a){var e=function(){a.each(function(e,t){if(!(e>=a.length-1)){var n=$(t).width(),i=b.selectIdOffset[e]||0;n+i&&$(f[e]).width(Math.round(n+i))}}),a.length&&!b.selectIdOffset.length&&(b.selectIdOffset[0]=0,a.each(function(e,t){var n=$(a[e]).offset().left;n&&(b.selectIdOffset[e]=n-$(f[e]).offset().left)}),e())};e()}},$(window).on("resize",function(e,t){n&&clearTimeout(n),n=setTimeout(b.syncHeader.bind(b),100)}),this.doFilter=function(){},b.ids=[],b.add=function(t,m,e,n){void 0===e&&(e=m);var i,a,s=!(i=e)||a&&"#"===i[0]?i:(h.prefix&&i.substr(0,h.prefix.length)!==h.prefix&&(i=h.prefix+"-"+i),(a?"#":"")+i);m=_(m);var o="";switch(t){case"combobox":o=' <select class="list-header-input" id="'+s+'" title="'+m+'"></select> <button class="list-header-clear" id="'+s+'-clear" role="button" title=""></button>';break;case"edit":o=' <input class="list-header-input" placeholder="'+m+'" id="'+s+'" title="'+m+'"> <button class="list-header-clear" id="'+s+'-clear" role="button" title="'+m+'"></button>';break;case"text":o='<span class="list-header-text">'+m+"</span>"}p.append("<th>"+o+"</th>");var r="#"+s,g=$(r),c=b[e]={$filter:g,val:g.val.bind(g),selectedVal:g.val()||""};if(b.ids.push(e),"combobox"===t&&(c.options=[],c.checkAddOption=function(e,t,n){if(-1===this.options.indexOf(e)){this.options.push(e),this.options.sort();for(var i,a,s=g.val(),o=n?"":(i=m,a=s,addAll2FilterCombobox&&(i=i?_(i)+" ("+_("all")+")":_("all")),'<option value="" '+(""===a?"selected":"")+">"+i+"</option>"),r=0,c=this.options.length;r<c;r++){var l=this.options[r];if(t){var d=t(l,r);"object"==typeof d?u(d.val,d.name):o+=d}else u(l,l)}g.html(o)}function u(e,t){o+='<option value="'+e+'" '+(t===s?"selected":"")+">"+t+"</option>"}},n))for(var l=0;l<n.length;l++)c.checkAddOption(n[l].name,function(e,t){return n[t]},!0);var d,u=$(r+"-clear");return u.on("click",function(){""!==g.val()&&g.val("").trigger("change")}),"undefined"==typeof M?u.button({icons:{primary:"ui-icon-close"},text:!1}):u.prepend('<i class="material-icons">close</i>'),g.on("change",function(e){d&&clearTimeout(d),c.selectedVal=g.val(),d=setTimeout(b.doFilter,"combobox"!==t?400:0),c.selectedVal?g.parent().addClass("filter-active"):g.parent().removeClass("filter-active")}).on("keyup",function(e){13===e.which?b.doFilter():g.trigger("change")}),f=p.find(">th"),c}}function values2table(r,c,e){"object"==typeof r&&(e=c,c=r,r="");var l=e&&e.maxRaw||null,d=e&&e.onChange||null,u=e&&e.onReady||null;c=c||[];var o,s=[],m=(o=r?$("#"+r):$("body")).find(".table-button-add");if(m.data("raw",c.length),l&&m.data("maxRaw",l),m.data("inited")||(m.data("inited",!0),m.on("click",function(){if(!m.data("maxRaw")||m.data("raw")<m.data("maxRaw")){for(var e=o.find(".table-values"),t=e.data("values"),n=e.data("names"),i=e.data("maxRaw"),a={},s=0;s<n.length;s++)n[s]&&(a[n[s].name]=n[s].def);t.push(a),d&&d(),setTimeout(function(){values2table(r,t,d,u,i)},100),m.data("raw",m.data("raw")+1)}else confirmMessage(_("maxTableRaw")+": "+m.data("maxRaw"),_("maxTableRawInfo"),"alert",["Ok"])})),c){var g=[],h=o.find(".table-values");if(h.data("values",c),!h.data("rooms")&&h.find('th[data-name="room"]').length)return void getEnums("rooms",function(e,t){var n={},i=_("nonerooms");n[_("none")]="nonerooms"!==i?i:"";var a=[];for(var s in t)t.hasOwnProperty(s)&&a.push(s);a.sort(function(e,t){return e=e.toLowerCase(),(t=t.toLowerCase())<e?1:e<t?-1:0});for(var o=0;o<a.length;o++)n[a[o]]=t[a[o]].common.name||o;h.data("rooms",n),values2table(r,c,d,u,l)});if(!h.data("functions")&&h.find('th[data-name="func"]').length)return void getEnums("functions",function(e,t){var n={},i=_("nonefunctions");n[_("none")]="nonefunctions"!==i?i:"";var a=[];for(var s in t)t.hasOwnProperty(s)&&a.push(s);a.sort(function(e,t){return e=e.toLowerCase(),(t=t.toLowerCase())<e?1:e<t?-1:0});for(var o=0;o<a.length;o++)n[a[o]]=t[a[o]].common.name||o;h.data("functions",n),values2table(r,c,d,u,l)});h.find("th").each(function(){var e=$(this).data("name");if(e){var t={name:e,type:$(this).data("type")||"text",def:$(this).data("default"),class:($(this).attr("class")||"").replace("translate",""),style:$(this).data("style"),readOnly:$(this).data("readOnly"),tdstyle:$(this).data("tdstyle")};if("checkbox"===t.type)"false"===t.def&&(t.def=!1),"true"===t.def&&(t.def=!0),t.def=!!t.def;else if("select"===t.type||"select multiple"===t.type){var n=($(this).data("options")||"").split(";");t.options={};for(var i=0;i<n.length;i++){var a=n[i].split("/");t.options[a[0]]=_(a[1]||a[0]),0===i&&(t.def=void 0===t.def?a[0]:t.def)}}else t.def=t.def||"";s.push(t)}else s.push(null);(e=$(this).data("buttons"))?g.push({btn:e.split(" "),class:($(this).attr("class")||"").replace("translate",""),style:$(this).data("style"),tdstyle:$(this).data("tdstyle")}):g.push(null)}),h.data("names",s);for(var t="",n=0;n<c.length;n++){var i=c[n]&&c[n].id;!i&&c[n]&&(i="_index"===s[0]?c[n][s[1]]:c[n][s[0]]),t+='<tr data-id="'+i+'" data-index="'+n+'">';for(var a=0;a<s.length;a++){t+="<td";var f="",p="",b="";if(s[a])if(s[a].class&&(t+=' class="'+s[a].class+'" '),"_index"!==s[a].name&&(b=s[a].tdstyle||"")&&";"!==b[0]&&(b=";"+b),"_index"===s[a].name)p=s[a].style?s[a].style:"text-align: right;",f+=n+1;else if("checkbox"===s[a].type)f+='<input style="'+(s[a].style||"")+'" class="values-input" type="checkbox" data-index="'+n+'" data-name="'+s[a].name+'" '+(c[n][s[a].name]?"checked":"")+'" data-old-value="'+(void 0===c[n][s[a].name]?"":c[n][s[a].name])+'"/>';else if("select"===s[a].type.substring(0,6)){f+=("multiple"===s[a].type.substring(7,16)?'<select multiple style="':'<select style="')+(s[a].style?s[a].style:"width: 100%")+'" class="values-input" data-index="'+n+'" data-name="'+s[a].name+'">',"room"===s[a].name?e=h.data("rooms"):"func"===s[a].name?(e=h.data("functions"),"select multiple"===s[a].type&&delete e[_("none")]):e=s[a].options;var M=void 0===c[n][s[a].name]?"":c[n][s[a].name];for(var y in"object"!=typeof M&&(M=[M]),e)f+='<option value="'+y+'" '+(-1!==M.indexOf(y)?" selected":"")+">"+e[y]+"</option>";f+="</select>"}else f+='<input class="values-input" style="'+(s[a].style?s[a].style:"width: 100%")+'" type="'+s[a].type+'" data-index="'+n+'" data-name="'+s[a].name+'"/>';if(g[a]){p="text-align: center; "+(g[a].style||"")+(g[a].tdstyle||"");for(var v=0;v<g[a].btn.length;v++)!n&&"up"===g[a].btn[v]||n===c.length-1&&"down"===g[a].btn[v]?f+='<a class="btn-floating disabled" data-command="'+g[a].btn[v]+'" class="values-buttons"><i class="material-icons"></i></a>':f+='<a class="btn-floating" data-index="'+n+'" data-command="'+g[a].btn[v]+'" class="values-buttons"><i class="material-icons"></i></a>';g[a].class&&(t+=' class="'+g[a].class+'" ')}p.length||b.length?t+=' style="'+p+b+'">'+f+"</td>":t+=">"+f+"</td>"}t+="</tr>"}var w=h.find(".table-lines");w.length||(h.append('<tbody class="table-lines"></tbody>'),w=h.find(".table-lines")),w.html(t),w.find(".values-input").each(function(){var e=$(this),t=e.attr("type"),n=e.data("name"),i=e.data("index");e.data("old-value",c[i][n]),"checkbox"===t?e.prop("checked",c[i][n]):e.val(c[i][n])}),w.find("a[data-command]").each(function(){var e=$(this).data("command");"delete"===e?$(this).on("click",function(){var e=$(this).data("index"),t=c[e];c.splice(e,1),d&&d(),setTimeout(function(){"function"==typeof tableEvents&&tableEvents(e,t,"delete"),values2table(r,c,d,u,l)},100),m.data("maxRaw")&&m.data("raw",m.data("raw")-1)}).addClass("red").find(".material-icons").html("delete"):"up"===e?$(this).on("click",function(){var e=$(this).data("index"),t=c[e];c.splice(e,1),c.splice(e-1,0,t),d&&d(),setTimeout(function(){values2table(e,c,d,u,l)},100)}).find("i").html("arrow_upward"):"down"===e?$(this).on("click",function(){var e=$(this).data("index"),t=c[e];c.splice(e,1),c.splice(e+1,0,t),d&&d(),setTimeout(function(){values2table(e,c,d,u,l)},100)}).find("i").html("arrow_downward"):"pair"===e?$(this).on("click",function(){if("function"==typeof tableEvents){var e=$(this).data("index"),t=c[e];tableEvents(e,t,"pair")}}).attr("title",_("pair")).find("i").html("insert_link"):"unpair"===e&&$(this).on("click",function(){if("function"==typeof tableEvents){var e=$(this).data("index"),t=c[e];tableEvents(e,t,"unpair")}}).attr("title",_("unpair")).find("i").html("not_interested")}),w.find(".values-input").on("change.adaptersettings",function(){var e=$(this).data("index"),t=$(this).data("name");"checkbox"===$(this).attr("type")?($(this).prop("checked").toString()!==$(this).data("old-value")&&d&&d(t,e),c[e][t]=$(this).prop("checked")):($(this).val()!==$(this).data("old-value")&&d&&d(t,e),c[e][t]=$(this).val())}).on("keyup",function(){$(this).trigger("change.adaptersettings")})}"function"==typeof u&&u()}function table2values(e){var t;t=e?$("#"+e):$("body");var n=[];t.find(".table-values th").each(function(){var e=$(this).data("name");e?n.push(e):n.push("___ignore___")});var i=[],a=0;return t.find(".table-lines tr").each(function(){i[a]={},$(this).find("td").each(function(){var e=$(this).find("input");if(e.length){var t=e.data("name");"checkbox"===e.attr("type")?i[a][t]=e.prop("checked"):i[a][t]=e.val()}var n=$(this).find("select");if(n.length){t=n.data("name");i[a][t]=n.val()||""}}),a++}),i}var systemLang="en",systemDictionary={};function translateWord(e,t,n){if(!e)return"";if(t=t||systemLang,(n=n||systemDictionary)[e=e.toString()]){var i=n[e][t];if(i)return i;if("en"!==t&&(i=n[e].en))return i}else"string"!=typeof e||e.match(/_tooltip$/)?"string"!=typeof e&&console.warn("Trying to translate non-text:"+e):console.log('"'+e+'": {"en": "'+e+'", "cn": "'+e+'"},');return e}function translateAll(e,i,a){i=i||systemLang,a=a||systemDictionary,e||(e="body");var t=$(e);t.find(".translate").each(function(e){var t=$(this).attr("data-lang");t||(t=$(this).html(),$(this).attr("data-lang",t));var n=translateWord(t,i,a);n&&$(this).html(n)}),t.find(".translateV").each(function(e){var t=$(this).attr("data-lang-value");t||(t=$(this).attr("value"),$(this).attr("data-lang-value",t));var n=translateWord(t,i,a);n&&$(this).attr("value",n)}),t.find(".translateT").each(function(e){var t=$(this).attr("data-lang-title");t||(t=$(this).attr("title"),$(this).attr("data-lang-title",t));var n=translateWord(t,i,a);n&&$(this).attr("title",n)}),t.find(".translateP").each(function(e){var t=$(this).attr("data-lang-placeholder");t||(t=$(this).attr("placeholder"),$(this).attr("data-lang-placeholder",t));var n=translateWord(t,i,a);n&&$(this).attr("placeholder",n)})}function translateName(e){return e&&"object"==typeof e?e[systemLang]||e.en:e}var _=function(e,t,n,i){var a=(e=translateWord(e)).indexOf("%s");return-1===a||-1===(a=(e=e.replace("%s",t)).indexOf("%s"))||-1!==(a=(e=e.replace("%s",n)).indexOf("%s"))&&(e=e.replace("%s",i)),e};!function(X){if(!X.fn.treeTable){var t={init:function(e){e.imgPath=e.imgPath||"lib/css/fancytree/";for(var t=0;t<this.length;t++)if(p.call(this[t],e),"undefined"!=typeof Storage){var n=window.localStorage.getItem(e.name+"-treetable");if(n){n=JSON.parse(n);for(var i=X(this[t]).find(".tree-table-main"),a=0;a<n.length;a++)try{i.treetable("expandNode",n[a])}catch(a){}}}return this},destroy:function(){for(var e=0;e<this.length;e++){var t=X(this[e]).find(".tree-table-main");t.length&&t.data("options")&&(t.data("options",null),X(this[e]).html(""))}},expand:function(e){for(var t=0;t<this.length;t++){var n=X(this[t]).find(".tree-table-main");try{e?n.treetable("expandNode",e):n.treetable("expandAll",e)}catch(e){}}},collapse:function(e){for(var t=0;t<this.length;t++){var n=X(this[t]).find(".tree-table-main");try{e?n.treetable("collapseNode",e):n.treetable("collapseAll")}catch(e){}}},show:function(e,t,n){"function"==typeof t&&(n=t,t=void 0),"function"==typeof e&&(n=e,e=void 0);for(var i=0;i<this.length;i++){var a=X(this[i]).find(".tree-table-main");a.find(".selected").removeClass("selected");try{a.treetable("reveal",e)}catch(e){}var s=a.treetable("node",e);s&&s.row.addClass("selected")}return n&&n(),this},reinit:function(){for(var e=0;e<this.length;e++)s.call(this[e]);return this},object:function(e,t){for(var n=0;n<this.length;n++){var i=X(this[n]).find(".tree-table-main");i.updateTimer&&clearTimeout(i.updateTimer);var a=i.data("options");if(!a||!a.root||e.match("^"+a.root.replace(/\./g,"\\.")+"\\."))!function(e,t){i.updateTimer=setTimeout(function(){s.call(e)},300)}(this[n])}return this}};X.fn.treeTable=function(e){return t[e]?t[e].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof e&&e?void X.error('Method "'+e+'" not found in jQuery.treeTable'):t.init.apply(this,arguments)}}function q(){var e=this.id,t=this.row.parent().parent(),n=t.data("options");n.name&&(n.expanded=n.expanded||[],-1===n.expanded.indexOf(e)&&(n.expanded.push(e),"undefined"!=typeof Storage&&window.localStorage.setItem(n.name+"-treetable",JSON.stringify(n.expanded))));t.treetable("node",e)}function ee(){var e=this.id,t=this.row.parent().parent(),n=t.data("options");if(n.name&&n.expanded){var i=n.expanded.indexOf(e);-1!==i&&(n.expanded.splice(i,1),"undefined"!=typeof Storage&&window.localStorage.setItem(n.name+"-treetable",JSON.stringify(n.expanded)))}t.treetable("node",e)}function te(e,t){var n=t?"":'<div class="treetablelist-buttons"><button class="treetable-list-btn-ok"></button><button class="treetable-list-btn-cancel"></button></div>';n+='<ul class="treetable-list">';for(var i=e.rows,a=0;a<i.length;a++){for(var s=0,o=i[a];o.parent;){for(var r=!1,c=0;c<i.length;c++)if(i[c].id===o.parent){o=i[c],r=!0;break}if(!r)break;s++}var l=i[a].title;"object"==typeof l&&(l=l[systemLang]||l.en);var d=void 0===i[a].instance?0:1;n+='<li data-id="'+i[a].id+'" class="'+(d?"treetable-list-item":"treetable-list-folder")+'" style="margin-left: '+19*s+"px; width: calc(100% - "+(15*s+2+7*d)+"px);"+("script.js.global"===i[a].id?"color: rgb(0, 128, 0);":"")+'">'+(d?"":'<span class="fancytree-expander"></span>')+'<span class="fancytree-icon"></span>'+l+"</li>"}n+="</ul>";var u=X(this),m=X(n);u.find(".treetablelist-buttons").remove(),u.find(".treetable-list").remove(),u.find(".tree-table-buttons").remove(),u.find(".tree-table-main").remove(),u.prepend(m);var g=X(m).find(".treetablelist-buttons"),h=X(m).find(".treetable-list");h.sortable({cancel:".treetable-list-folder",axis:"y"}).data("options",e);var f=this;g.find(".treetable-list-btn-ok").button({icons:{primary:"ui-icon-check"},text:!1}).css({width:24,height:24}).on("click",function(){var i="",a=[];h.find("li").each(function(){var e=X(this).data("id");if(X(this).hasClass("treetable-list-folder"))i=e;else{var t=e.split("."),n=t.pop();t.join(".")!==i&&a.push({oldId:e,newId:i+"."+n})}}),function t(n,i,a){if(i&&i.length){var e=i.shift();n.moveId&&n.moveId(e.oldId,e.newId,function(e){setTimeout(function(){t(n,i,a)},50)})}else a&&a()}(e,a,function(){p.call(f,e)})}),g.find(".treetable-list-btn-cancel").button({icons:{primary:"ui-icon-cancel"},text:!1}).css({width:24,height:24}).on("click",function(){p.call(f,e)})}function ne(e,t,n){var i="",a="",s=e&&e.common;if(s)if(s.icon){if(s.icon.match(/^data:image\//))i=s.icon;else{if(-1===s.icon.indexOf("."))return'<i class="material-icons '+(n||"treetable-icon")+'">'+s.icon+"</i>";var o;i="instance"===e.type?"/adapter/"+e.common.name+"/"+e.common.icon:e._id.match(/^system\.adapter\./)?(o=e._id.split(".",3),"/"===e.common.icon[0]?o[2]+=e.common.icon:o[2]+="/"+e.common.icon,"/adapter/"+o[2]):(o=e._id.split(".",2),"/"===e.common.icon[0]?o[0]+=e.common.icon:o[0]+="/"+e.common.icon,"/adapter/"+o[0])}a=e.type}else t=t||"lib/css/fancytree/","device"===e.type?(i=t+"device.png",a="device"):"channel"===e.type?(i=t+"channel.png",a="channel"):"state"===e.type&&(i=t+"state.png",a="state");return i?'<img class="'+(n||"treetable-icon")+'" src="'+i+'" alt="'+a+'" />':""}function p(i){var e="",t=window.M&&window.M.toast?"a":"button";if(i.panelButtons){e+='<div class="row tree-table-buttons m">';for(var n=0;n<i.panelButtons.length;n++)e+="<"+t+' class="btn-floating waves-effect waves-light blue btn-custom-'+n+'" title="'+(i.panelButtons[n].title||"")+'" '+(i.panelButtons[n].id?'id="'+i.panelButtons[n].id+'"':"")+">",window.M&&window.M.toast&&(e+='<i class="material-icons">'+(i.panelButtons[n].icon||"")+"</i>"),e+="</"+t+">";i.moveId&&(e+="<"+t+' class="btn-floating waves-effect waves-light blue treetable-sort" title="'+_("reorder")+'">',window.M&&window.M.toast&&(e+='<i class="material-icons">import_export</i>'),e+="</"+t+">"),e+="</div>"}e+='<div class="row tree-table-body"><table class="tree-table-main">',e+=" <thead>",e+=' <tr class="tree-table-main-header">';for(var a=0;a<i.columns.length;a++)"name"===i.columns[a]?(e+=" <th"+(i.widths&&i.widths[a]?' class="treetable-th-name" style="width: '+i.widths[a]+'"':"")+">",e+=' <input placeholder="'+_("name")+'" class="filter_name treetable-filter" />',e+=' <button data-id="filter_name" role="button" class="filter-clear"></button>',e+=" </th>"):e+=" <th"+(i.widths&&i.widths[a]?' style="width: '+i.widths[a]+'"':"")+">"+_(i.columns[a])+"</th>";i.buttons&&(e+=" <th"+(i.buttonsWidth?' style="width: '+i.buttonsWidth+'"':"")+"></th>"),e+=" </tr>",e+="</thead>",e+="<tbody>";var s=[],o=i.root?new RegExp("^"+i.root.replace(/\./g,"\\.")+"\\."):null,r=-1!==i.columns.indexOf("instance")?[]:null;for(var c in i.objects){var l;if(i.objects.hasOwnProperty(c))if(r&&"instance"===i.objects[c].type&&(l=c.match(/^system\.adapter\.javascript\.(\d+)$/))&&r.push(l[1]),!o||o.test(c)){var d=i.objects[c].common,u={id:c,parent:null,_class:"treetable-"+i.objects[c].type};"channel"===i.objects[c].type&&(u.folder=!0);for(var m=0;m<i.columns.length;m++)if("instance"===i.columns[m])"script"===i.objects[c].type&&(u.instance=d?d.engine.split(".").pop():0);else if(d&&"id"!==i.columns[m]){var g=d[i.columns[m]];void 0!==g&&(u[i.columns[m]]=g)}i.members&&(u.members=d.members),i.colors&&(u.color=d.color),s.push(u)}}s.sort(function(e,t){return e.id>t.id?1:e.id<t.id?-1:0});for(var h=0;h<s.length;h++){var f=s[h].id.split("."),p=f.pop(),b=f.join(".");s[h].title=p;for(var M=0;M<s.length;M++)if(s[M].id===b){s[h].parent=b,s[M].children=s[M].children||[],s[M].children.push(h);break}1===f.length&&(s[h]._class+=" treetable-root")}for(var y=0;y<s.length;y++)s[y].realChildren=!!s[y].children&&!!s[y].children.length;if(i.groups)for(var v=function(e,t){for(var n={},i=0;i<t.length;i++)if(e[t[i]]&&e[t[i]].common&&e[t[i]].common.members)for(var a=e[t[i]].common.members,s=0;s<a.length;s++){n[a[s]]=n[a[s]]||[];var o=e[t[i]].common.name;o&&"object"==typeof o&&(o=o[systemLang]||"en"),n[a[s]].push({id:t[i],name:o||id.replace("system.group.","")})}return n}(i.objects,i.groups),w=s.length-1;0<=w;w--)s[w].groups=v[s[w].id]||[];if(i.members)for(var j=s.length-1;0<=j;j--)if(s[j].members){s[j].children=s[j].children||[];var L=Object.assign([],s[j].members);L.sort();for(var N=0;N<L.length;N++){if(u={id:L[N],title:L[N],parent:s[j].id,_class:"treetable-member"},s[j].children.push(L[N]),i.objects[u.id]){var T=i.objects[u.id].common;if(T){for(var C=0;C<i.columns.length;C++){var D=i.columns[C];if("members"!==D&&"id"!==D&&"title"!==D&&"icon"!==D){var I=T[i.columns[C]];void 0!==I&&(u[D]=I)}}i.colors&&(u.color=d.color)}}s.splice(j+1,0,u)}delete s[j].members}for(var k="",z=0;z<s.length;z++){e+='<tr data-tt-id="'+s[z].id+'"'+(s[z].children?' data-tt-branch="true"':"")+(s[z].parent?' data-tt-parent-id="'+s[z].parent+'"':"")+' class="',s[z]._class&&(e+=s[z]._class+" "),i.draggable&&(e+=i.draggable+" "),s[z].children&&s[z].children.length?e+="not-empty":e+="is-empty",e+='">';for(var x=0;x<i.columns.length;x++){var O=i.columns[x],A="",$=i.classes&&i.classes[x]||"";if("groups"===O&&($+=" m"),!x&&s[z].hasOwnProperty("children")?($+=" treetable-folder fancytree-exp-c fancytree-has-children fancytree-ico-cf","script.js.global"===s[z].id?A+=" color: rgb(0, 128, 0);":A+=" color: rgb(0, 0, 128);",e+='<td style="'+A+'" class="'+$+'">',s[z].children&&s[z].children.length&&(e+='<span class="treetable-counter">'+s[z].children.length+"</span>")):e+='<td style="'+A+'" class="'+$+'">',!x&&i.colors&&s[z].color&&(e+='<div style="background: '+s[z].color+'" class="treetable-color"></div>'),!x&&i.icons&&(e+=ne(i.objects[s[z].id],i.imgPath)||'<div class="treetable-icon-empty"> </div>'),"enabled"===O)e+='<input data-attr="'+O+'" data-id="'+s[z].id+'" class="treetable-input" type="checkbox" '+(s[z][O]?"checked":"")+" "+(i.readOnly&&!1!==i.readOnly[x]?"disabled":"")+">";else if("groups"===O)for(var E=0;E<s[z].groups.length;E++){var S=s[z].groups[E].id;e+='<div class="chip">'+ne(i.objects[S],null,"")+s[z].groups[E].name+"</div>"}else if("instance"===O)if(void 0!==s[z].instance&&1<r.length){k='<select class="treetable-instance" data-id="'+s[z].id+'">';for(var Y=0;Y<r.length;Y++)k+='<option value="'+r[Y]+'" '+(r[Y]===s[z].instance?"selected":"")+">"+r[Y]+"</option>";e+=k+="</select>"}else e+="<span>"+(void 0===s[z].instance?"":s[z].instance)+"</span>";else if("icon"===O)e+=ne(i.objects[s[z].id],i.imgPath);else{var Q=s[z][O]||"";Q&&"object"==typeof Q&&Q.en&&(Q=Q[systemLang]||Q.en),e+="<span>"+Q+"</span>"}e+="</td>"}if(i.buttons){e+='<td class="treetable-buttons" style="'+(i.buttonsStyle||"")+'">';for(var P="",U=0;U<i.buttons.length;U++)i.buttons[U].match&&!i.buttons[U].match(s[z].id,s[z].parent)?P+='<div class="treetable-button-empty"> </div>':(P+="<"+t+' data-id="'+s[z].id+'" class="select-button-'+U+' select-button-custom td-button" style="margin-right: 3px;" data-parent="'+s[z].parent+'" data-children="'+!!s[z].realChildren+'" title="'+(i.buttons[U].title||"")+'">',window.M&&window.M.toast&&(P+='<i class="material-icons">'+(i.buttons[U].icon||"")+"</i>"),P+="</"+t+">");e+=P+"</td>"}e+="</tr>"}e+="</body>";var R=X(this),H=X(e);R.find("span:first-child").remove(),R.find(".treetablelist-buttons").remove(),R.find(".treetable-list").remove(),R.find(".tree-table-buttons").remove(),R.find(".tree-table-main").remove(),R.prepend(H),i.rows=s;var B=X(H[1]).find(">table"),G=X(H[0]);B.data("options",i),B.treetable({expandable:!0,clickableNodeNames:!0,expanderTemplate:"",indenterTemplate:'<span class="fancytree-expander"></span><span class="fancytree-icon"></span>',onNodeExpand:q,onNodeCollapse:ee,stringCollapse:_("collapse"),stringExpand:_("expand")});var F=B.find("tbody");if(F.on("click","tr",function(){X(".selected").not(this).removeClass("selected"),X(this).addClass("selected");var e=X(this).parent().parent().data("options"),t=X(this).data("tt-id");e.onChange&&e.onChange(X(this).data("tt-id"),e.oldId),e.oldId=t}),i.buttons)for(var Z=0;Z<i.buttons.length;Z++){var J=F.find(".select-button-"+Z).button(i.buttons[Z]).on("click",function(){var e=X(this).data("callback");e&&e.call(X(this),X(this).data("id"),X(this).data("children"),X(this).data("parent"))}).data("callback",i.buttons[Z].click).attr("title",i.buttons[Z].title||"");0!==J.length&&(i.buttons[Z].width&&J.css({width:i.buttons[Z].width}),i.buttons[Z].height&&J.css({height:i.buttons[Z].height}))}if(i.panelButtons)for(var W=0;W<i.panelButtons.length;W++){var V=G.find(".btn-custom-"+W);V.on("click",i.panelButtons[W].click).attr("title",i.panelButtons[W].title||""),window.M&&window.M.toast||V.button(i.panelButtons[W]).css({width:24,height:24})}B.find(".filter_name").on("change",function(){var e=X(this).data("timer");e&&clearTimeout(e);var t=X(this);t.data("timer",setTimeout(function(){t.data("timer",null),H.find(".filter_name").val()?t.addClass("input-not-empty"):t.removeClass("input-not-empty"),function(e,t){if(t){t=t.toLowerCase(),e.data("options"),e.find("tr").each(function(){X(this).hasClass("tree-table-main-header")||(X(this).data("tt-branch")||-1!==X(this).find("td:first-child").text().indexOf(t)?X(this).removeClass("filtered-out"):X(this).addClass("filtered-out"))});var n="",i=!1;e.find("tr").each(function(){X(this).data("tt-branch")?(n&&(i?e.find('tr[data-tt-id="'+n+'"]').removeClass("filtered-out"):e.find('tr[data-tt-id="'+n+'"]').addClass("filtered-out")),i=!1,n=X(this).data("tt-id")):n&&(X(this).hasClass("filtered-out")||(i=!0))}),n&&(i?e.find('tr[data-tt-id="'+n+'"]').removeClass("filtered-out"):e.find('tr[data-tt-id="'+n+'"]').addClass("filtered-out"))}else e.find("tr").removeClass("filtered-out")}(X(H[1]),H.find(".filter_name").val())}))}).on("keyup",function(){X(this).trigger("change")}),B.find(".filter-clear").button({icons:{primary:"ui-icon-close"},text:!1}).on("click",function(){var e=X(this).data("id");H.find("."+e).val("").trigger("change")});var K=this;G.find(".treetable-sort").button({icons:{primary:"ui-icon-arrowthick-2-n-s"},text:!1}).css({width:24,height:24}).on("click",function(){te.call(K,i)}),i.onEdit?(B.find(".treetable-instance").on("change",function(){i.onEdit(X(this).data("id"),"instance",X(this).val())}),B.find(".treetable-input").on("change",function(e){var t;e.stopPropagation(),t="checkbox"===X(this).attr("type")?X(this).prop("checked"):X(this).val();var n=X(this).data("id");i.onEdit&&!1===i.onEdit(n,X(this).data("attr"),t)&&X(this).prop("checked",!0)}).on("keyup",function(){X(this).trigger("change")})):B.find(".treetable-instance").prop("disabled",!0),"function"==typeof i.onReady&&i.onReady(B)}function s(){var e=X(this).find(".tree-table-main"),t=e.find(".selected").data("tt-id"),n=e.find(".expanded"),i=[];n.each(function(e){i.push(X(this).data("tt-id"))});var a=e.find(".filter_name").val(),s=e.data("options");p.call(this,s),e=X(this).find(".tree-table-main");for(var o=0;o<i.length;o++)try{e.treetable("expandNode",i[o])}catch(o){}if(t){var r=e.treetable("node",t);r&&e.treetable("reveal",t),r&&r.row&&r.row.addClass("selected")}a&&e.find(".filter_name").val(a).trigger("change")}}(jQuery),systemDictionary={"Username:":{cn:"用户名",en:"用户名"},"Password:":{cn:"密码",en:"密码"}," for %s":{cn:" for %s",en:" for %s"},"%s added to %s":{cn:"%s added to %s",en:"%s added to %s"},"%s processes":{cn:"%s processes",en:"%s processes"},"(without prefix)":{cn:"(without prefix)",en:"(without prefix)"},"1 %d days ago":{cn:"%d 天前",en:"%d days ago"},"2 %d days ago":{cn:"%d 天前",en:"%d days ago"},"5 %d days ago":{cn:"%d 天前",en:"%d days ago"},"A-Z":{cn:"A-Z",en:"A-Z"},"Access control":{cn:"访问控制",en:"Access control"},"Access control list":{cn:"控制列表",en:"Access control list"},Acknowledged:{cn:"已确认",en:"Acknowledged"},"Activated. Click to stop.":{cn:"点击停止.",en:"Activated. Click to stop."},"Active instances":{cn:"活跃实例",en:"Active instances"},"Active repository:":{cn:"缺省的软件仓库",en:"Active repository"},"Adapter configuration":{cn:"适配器配置",en:"Adapter configuration"},"Adapter settings for %s states":{cn:"Adapter settings for %s states",en:"Adapter settings for %s states"},Adapters:{cn:"适配器",en:"Adapters"},"Adapters from this Group installed":{cn:"个适配器",en:"Adapters from this group installed"},Add:{cn:"添加",en:"Add"},"Add Objecttree from JSON File":{cn:"从 JSON 文件添加",en:"Add objects tree from JSON file"},"Add certificate from file":{cn:"Add certificate from file",en:"Add certificate from file"},"Add instance...":{cn:"添加实例...",en:"Adding instance..."},"Add member":{cn:"Add member",en:"Add member"},"Add new child object to selected parent":{cn:"Add new child object to selected parent",en:"Add new child object to selected parent"},"Add new field":{cn:"Add new field",en:"Add new field"},"Add new issue":{cn:"Report a bug",en:"Report a bug"},"Add new object: ":{cn:"Add new object: ",en:"Add new object: "},"Add new object: %s":{cn:"Add new object: %s",en:"Add new object: %s"},"Address:":{cn:"地址",en:"Address"},"Admin is not enabled in cloud settings!":{cn:"Admin is not enabled in cloud settings!",en:"Admin is not enabled in cloud settings!"},Administrator:{cn:"Administrator",en:"Administrator"},All:{cn:"全部",en:"All"},Apr:{cn:"Apr",en:"Apr"},April:{cn:"April",en:"April"},Architecture:{cn:"架构",en:"Architecture"},"Are you sure to delete %s?":{cn:'确定删除 <b>"%s"</b>?',en:'Are you sure to delete <b>"%s"</b>?'},'Are you sure to delete <span style="color: red">all</span> children of %s?':{cn:'确定删除 <b>%s</b> <span style="color: red">的全部子项</span>?',en:'Are you sure to delete <span style="color: red">all</span> children of <b>%s</b>?'},"Are you sure to delete all children of %s?":{cn:'你确定删除 <b>"%s"</b> 及 <span style="color: red; font-weight: bold">全部的</span>子项目?',en:'Are you sure to delete <b>"%s"</b> and <span style="color: red; font-weight: bold">all</span> children?'},"Are you sure to delete script %s?":{cn:"你确定删除脚本 '%s'?",en:"Are you sure to delete script '%s'?"},"Are you sure you want to delete adapter %s?":{cn:"你确定删除适配器: %s?",en:"Are you sure you want to delete adapter %s?"},"Are you sure you want to delete the instance <b>%s</b>?":{cn:"你确定要删除这个实例: <b>%s</b>?",en:"Are you sure you want to delete the instance <b>%s</b>?"},"Are you sure?":{cn:"你确定吗?",en:"Are you sure?"},"Are you sure? Changes are not saved.":{cn:"数据没有保存,你确定啊吗?",en:"Are you sure? Changes are not saved."},Aug:{cn:"Aug",en:"Aug"},August:{cn:"August",en:"August"},Available:{cn:"可用的",en:"Available"},"Available version:":{cn:"最新版本",en:"Available version"},CPUs:{cn:"CPUs",en:"CPUs"},Calendar:{cn:"计划",en:"Calendar"},Cancel:{cn:"取消",en:"Cancel"},"Cannot create user: ":{cn:"不能创建用户: ",en:"Cannot create user: "},"Cannot delete user: ":{cn:"不能删除用户: ",en:"Cannot delete user: "},"Cannot disable admin!":{cn:"不能停用管理员!",en:"Cannot disable admin!"},"Cannot read file!":{cn:"无法读取文件!",en:"Cannot read file!"},"Cannot read version from NPM":{cn:"Could not read version from NPM",en:"Could not read version from NPM"},"Cannot set password: ":{cn:"不能设置密码: ",en:"Cannot set password: "},Certificates:{cn:"证书",en:"Certificates"},Change:{cn:"修改",en:"Change"},Changelog:{cn:"Change log",en:"Change log"},Channel:{cn:"Channel",en:"Channel"},Chart:{cn:"Chart",en:"Chart"},"Chart for %s":{cn:"Chart for %s",en:"Chart for %s"},"Check all":{cn:"检查所有",en:"Check all"},China:{cn:"中国",en:"China"},"City:":{cn:"城市",en:"City"},Clear:{cn:"清除",en:"Clear"},"Clear list":{cn:"清除",en:"Clear list"},"Clear log":{cn:"清除",en:"Clear log"},"Clear on disk permanent":{cn:"Clear on disk permanent",en:"Clear on disk permanent"},"Click do activate events again, or just wait one minute":{cn:"Click do activate events again, or just wait one minute",en:"Click do activate events again, or just wait one minute"},"Click on icon":{cn:"点击图标打开链接",en:"Click on icon to open a link"},Close:{cn:"关闭",en:"close"},"Collapse all nodes":{cn:"收起全部",en:"Collapse all nodes"},Color:{cn:"颜色",en:"Color"},"Configuration not saved.":{cn:"配置信息没有存储.",en:"Configuration not saved."},"Connected to %s: ":{cn:"Connected to %s: ",en:"Connected to %s: "},"Connected to host: ":{cn:"Connected to host: ",en:"Connected to host: "},"Copy log":{cn:"复制",en:"Copy log"},"Copy to clipboard":{cn:"拷贝",en:"Copy to clipboard"},"Country:":{cn:"国家/地区",en:"Country"},Create:{cn:"创建",en:"Create"},"Create new category":{cn:"新建分类",en:"Create new category"},"Create new category, like %s":{cn:"创建新的分类, like %s",en:"Create new category, like %s"},"Create new enum":{cn:"新建枚举",en:"Create new enum"},"Create new enum, like %s":{cn:"创建新的枚举, like %s",en:"Create new enum, like %s"},"Create new group":{cn:"新建群组",en:"Create new group"},"Create new user":{cn:"创建新用户",en:"Create new user"},Created:{cn:"Created",en:"Created"},Croatia:{cn:"Croatia",en:"Croatia"},"Cron expression":{cn:"Cron expression",en:"Cron expression"},"Currency:":{cn:"货币",en:"Currency"},Custom:{cn:"自定义",en:"Custom"},D$ecember:{cn:"D$ecember",en:"D$ecember"},"DD.MM.YY":{cn:"DD.MM.YY",en:"DD.MM.YY"},"DD.MM.YYYY":{cn:"DD.MM.YYYY",en:"DD.MM.YYYY"},"DD/MM/YYYY":{cn:"DD/MM/YYYY",en:"DD/MM/YYYY"},"Date From":{cn:"Date From",en:"Date From"},"Date To":{cn:"Date To",en:"Date To"},"Date format:":{cn:"时间格式",en:"Date format"},"Deactivated. Click to start.":{cn:"Deactivated. Click to start.",en:"Deactivated. Click to start."},"Debug outputs:":{cn:"调试输出",en:"Debug outputs"},Dec:{cn:"Dec",en:"Dec"},December:{cn:"December",en:"December"},"Default ACL":{cn:"缺省 ACL",en:"Default ACL"},"Default history instance:":{cn:"缺省的数据记录实例",en:"Default history instance"},"Delete attribute":{cn:"删除",en:"Delete attribute"},"Delete category":{cn:"删除",en:"Delete category"},"Delete enum":{cn:"删除",en:"Delete enum"},"Delete member":{cn:"删除",en:"Delete member"},"Delete object":{cn:"删除",en:"Delete object"},Denmark:{cn:"Denmark",en:"Denmark"},Description:{cn:"说明",en:"Description"},Device:{cn:"Device",en:"Device"},"Device discovery":{cn:"Device discovery",en:"Device discovery"},"Disk free":{cn:"磁盘空闲",en:"Disk free"},"Disk free:":{cn:"磁盘空闲:",en:"Disk free:"},"Disk size":{cn:"磁盘大小",en:"Disk size"},'Do you want to delete just <span style="color: blue">one object</span> or <span style="color: red">all</span> children of %s too?':{cn:'Do you want to delete just <span style="color: blue">one object</span> or <span style="color: red">all</span> children of %s too?',en:'Do you want to delete just <span style="color: blue">one object</span> or <span style="color: red">all</span> children of %s too?'},"Do you want to upgrade all adapters?":{cn:"Do you want to upgrade all adapters?",en:"Do you want to upgrade all adapters?"},"Domains:":{cn:"Domains",en:"Domains"},Dominica:{cn:"Dominica",en:"Dominica"},"Done with error: %s":{cn:"Done with error: %s",en:"Done with error: %s"},"Download log":{cn:"下载",en:"Download log"},"Drop the files here":{cn:"拖放文件到这里",en:"Drop the files here"},"Drop the icons here":{cn:"拖放图标文件到这里",en:"Drop the icons here"},Ecuador:{cn:"Ecuador",en:"Ecuador"},Edit:{cn:"编辑",en:"Edit"},"Edit category":{cn:"编辑 category",en:"Edit category"},"Edit enum":{cn:"编辑 enum",en:"Edit enum"},"Edit in dialog":{cn:"编辑 in dialog",en:"Edit in dialog"},"Edit object":{cn:"编辑 object",en:"Edit object"},Egypt:{cn:"Egypt",en:"Egypt"},"El Salvador":{cn:"El Salvador",en:"El Salvador"},"Email for account:":{cn:"Email for account",en:"Email for account"},Enums:{cn:"枚举",en:"Enums"},Error:{cn:"错误",en:"Error"},Event:{cn:"类型",en:"Type"},Events:{cn:"事件",en:"Events"},Everyone:{cn:"Everyone",en:"Everyone"},"Expand all nodes":{cn:"Expand all nodes",en:"Expand all nodes"},"Failed to open JSON File":{cn:"Failed to open JSON file",en:"Failed to open JSON file"},"Falkland Islands (Malvinas)":{cn:"Falkland Islands (Malvinas)",en:"Falkland Islands (Malvinas)"},"Faroe Islands":{cn:"Faroe Islands",en:"Faroe Islands"},Feb:{cn:"Feb",en:"Feb"},February:{cn:"February",en:"February"},"File is too big!":{cn:"文件太大!",en:"File is too big!"},"File rights":{cn:"File rights",en:"File rights"},"Filter:":{cn:"查找",en:"Filter"},"Filtered out":{cn:"Everything is filtered out",en:"Everything is filtered out"},"Find coordinates...":{cn:"Find coordinates...",en:"Find coordinates..."},"Float divider:":{cn:"小数点",en:"Float divider"},"Free RAM:":{cn:"Free:",en:"Free:"},Fri:{cn:"Fri",en:"Fri"},From:{cn:"From: ",en:"From: "},"From github":{cn:"软件仓库",en:"From github"},Function:{cn:"Function",en:"Function"},"Generated ID:":{cn:"Generated ID",en:"Generated ID"},"Go to Github...":{cn:"Go to Github...",en:"Go to Github..."},Group:{cn:"用户组",en:"Group"},Groups:{cn:"用户组",en:"Groups"},"Has no permission to %s %s %s":{cn:"Has no permission to %s %s %s",en:"Has no permission to %s %s %s"},"Heard and Mc Donald Islands":{cn:"Heard and Mc Donald Islands",en:"Heard and Mc Donald Islands"},"Heartbeat: ":{cn:"心跳: ",en:"Heartbeat: "},"Hong Kong":{cn:"中国香港",en:"Hong Kong"},Host:{cn:"Host",en:"Host"},"Host %s is offline":{cn:"主机 %s 离线",en:"Host %s is offline"},"Host:":{cn:"Host",en:"Host"},Hosts:{cn:"Hosts",en:"Hosts"},ID:{cn:"ID",en:"ID"},"Icon upload":{cn:"上传图标",en:"Icon upload"},"In background":{cn:"后台运行",en:"In background"},Info:{cn:"信息",en:"Info"},Insert:{cn:"插入",en:"Insert"},Install:{cn:"操作",en:"Install"},"Install adapter from URL":{cn:"安装或升级",en:"Install or update the adapter from URL"},"Install adapter from github":{cn:"软件仓库安装或升级",en:"Install or update the adapter from Github"},"Install from custom URL":{cn:"自定义 URL 安装",en:"Install from custom URL"},"Install or update from URL...":{cn:"正在安装...",en:"Install or update from URL..."},"Installation counter":{cn:"Installations counter",en:"Installations counter"},"Installations counter":{cn:"Installations counter",en:"Installations counter"},Installed:{cn:"已安装",en:"Installed"},"Installed from group":{cn:"Installed from group",en:"Installed from group"},"Installed instances":{cn:"已安装的实例",en:"Installed instances"},"Installed version":{cn:"已安装版本",en:"Installed version"},Instances:{cn:"实例",en:"Instances"},Instructions:{cn:"指令",en:"Instructions"},Intro:{cn:"总览",en:"Overview"},"Invalid version of %s":{cn:"Invalid version of %s",en:"Invalid version of %s"},"Invalid version of %s. Required %s":{cn:"Invalid version of %s. Required %s",en:"Invalid version of %s. Required %s"},"Is yet in the list":{cn:"已经在列表中",en:"It's already in the list"},Jan:{cn:"Jan",en:"Jan"},January:{cn:"January",en:"January"},Jul:{cn:"七月",en:"Jul"},July:{cn:"July",en:"July"},Jun:{cn:"Jun",en:"Jun"},June:{cn:"June",en:"June"},"Known bugs for":{cn:"Known bugs for",en:"Known bugs for"},"Last changed":{cn:"上次修改",en:"Last changed"},"Last update":{cn:"上次更新",en:"Last update"},"Latitude:":{cn:"纬度",en:"Latitude"},"Let's Encrypt settings":{cn:"Let's Encrypt settings",en:"Let's Encrypt settings"},"Let's encrypt SSL":{cn:"Let's encrypt SSL",en:"Let's encrypt SSL"},License:{cn:"许可",en:"License"},"License terms":{cn:"许可条款",en:"License terms"},"Listen on all IPs":{cn:"Listen on all IPs",en:"Listen on all IPs"},"Loading...":{cn:"正在加载...",en:"Loading..."},Log:{cn:"日志",en:"Log"},"Log file will be deleted. Are you sure?":{cn:"日志文件将被删除,你确定吗?",en:"Log file will be deleted. Are you sure?"},"Log size:":{cn:"文件大小",en:"Log size"},"Login timeout(sec):":{cn:"登录超时 (秒)",en:"Login timeout (sec)"},Logout:{cn:"退出",en:"Logout"},"Longitude:":{cn:"经度",en:"Longitude"},MB:{cn:"Mb",en:"Mb"},Main:{cn:"Main",en:"Main"},"Main settings":{cn:"主设置",en:"Main settings"},"Manually created":{cn:"手工创建",en:"Manually created"},Mar:{cn:"三月",en:"Mar"},March:{cn:"三月",en:"March"},Members:{cn:"Members",en:"Members"},Message:{cn:"消息",en:"Message"},"Message buffer overflow. Losing oldest":{cn:"Message buffer overflow. Losing oldest.",en:"Message buffer overflow. Losing oldest."},Model:{cn:"型号",en:"Model"},Mon:{cn:"Mon",en:"Mon"},NPM:{cn:"NPM",en:"NPM"},Name:{cn:"名称",en:"Name"},"Name:":{cn:"名称",en:"Name"},New:{cn:"新建",en:"New"},"New category":{cn:"新类别",en:"New category"},"New enum":{cn:"新类别",en:"New enum"},"New group":{cn:"新群组",en:"New group"},"New object":{cn:"新对象",en:"New object"},"New objekt":{cn:"新对象",en:"New object"},"New user":{cn:"新用户",en:"New user"},"No data":{cn:"暂无数据",en:"No data"},"No states selected!":{cn:"No states selected!",en:"No states selected!"},"No version of %s":{cn:"No version of %s",en:"No version of %s"},"Node.js":{cn:"Node.js",en:"Node.js"},Norway:{cn:"Norway",en:"Norway"},"Not exists":{cn:"不存在",en:"Does not exist"},"Note:":{cn:"Note",en:"Note"},Nov:{cn:"十一月",en:"Nov"},November:{cn:"十一月",en:"November"},OS:{cn:"OS",en:"OS"},'Object "<b>%s</b>" does not exists. Update the page.':{cn:'Object "<b>%s</b>" 不存在,请刷新.',en:'Object "<b>%s</b>" does not exist. Update the page.'},"Object may not be deleted":{cn:"对象不能被删除",en:"Object may not be deleted"},"Object rights":{cn:"对象权限",en:"Object rights"},Objects:{cn:"对象",en:"Objects"},Oct:{cn:"十月",en:"Oct"},October:{cn:"十月",en:"October"},Ok:{cn:"确认",en:"Ok"},"Only one":{cn:"Only one",en:"Only one"},"Open original":{cn:"在新标签中打开",en:"Open on new tab"},Owner:{cn:"Owner",en:"Owner"},"Owner group":{cn:"Owner group",en:"Owner group"},"Owner user":{cn:"Owner user",en:"Owner user"},Parent:{cn:"父类",en:"Parent"},"Parse error":{cn:"Parse error",en:"Parse error"},Password:{cn:"密码",en:"Password"},"Password and confirmation are not equal!":{cn:"Password and confirmation are not equal!",en:"Password and confirmation are not equal!"},"Password cannot be empty!":{cn:"密码不能为空!",en:"Password cannot be empty!"},"Password repeat":{cn:"Password repeat",en:"Password repeat"},"Path to storage:":{cn:"存储路径",en:"Path to storage"},"Pause output":{cn:"暂停输出",en:"Pause output"},Platform:{cn:"平台",en:"Platform"},"Please confirm":{cn:"请确认",en:"Please confirm"},"Port to check the domain:":{cn:"Port to check the domain",en:"Port to check the domain"},"Preserve ID":{cn:"Preserve ID",en:"Preserve ID"},Preview:{cn:"Preview",en:"Preview"},"Processing...":{cn:"处理中...",en:"Processing..."},RAM:{cn:"内存",en:"RAM"},"RAM total usage:":{cn:"RAM总使用量:",en:"Total RAM usage:"},"RAM usage":{cn:"使用内存",en:"RAM usage"},"Rebuild tree":{cn:"重建树",en:"Rebuild tree"},"Recently updated":{cn:"Recently updated",en:"Recently updated"},"Refresh log":{cn:"刷新",en:"Refresh log"},Removed:{cn:"已删除",en:"Removed"},"Removing of adapter...":{cn:"Removing of adapter...",en:"Removing of adapter..."},"Removing of instance...":{cn:"Removing of instance...",en:"Removing of instance..."},Rename:{cn:"重命名",en:"Rename"},Repositories:{cn:"软件仓库",en:"Repositories"},Rights:{cn:"权限",en:"Access rights"},Role:{cn:"角色",en:"Role"},Room:{cn:"场景",en:"Room"},"Running: ":{cn:"Running: ",en:"Running: "},"Sao Tome and Principe":{cn:"Sao Tome and Principe",en:"Sao Tome and Principe"},Sat:{cn:"星期六",en:"Sat"},Save:{cn:"保存",en:"Save"},"Save Objecttree as JSON File":{cn:"将对象保存为 JSON 文件",en:"Save objects tree as JSON file"},"Save Objecttree is not possible":{cn:"Saving the objects tree is not possible",en:"Saving the objects tree is not possible"},"Save configuration":{cn:"保存配置",en:"Save configuration"},Script:{cn:"脚本",en:"Script"},Scripts:{cn:"脚本",en:"Scripts"},Select:{cn:"Select",en:"Select"},"Select ID":{cn:"Select ID",en:"Select ID"},"Select adapter:":{cn:"选择适配器",en:"Select adapter"},"Select language":{cn:"选择语言",en:"Select language"},"Select options":{cn:"选项",en:"Select options"},"Sent data:":{cn:"Sent data",en:"Sent data"},Sep:{cn:"九月",en:"Sep"},September:{cn:"九月",en:"September"},Set:{cn:"Set",en:"Set"},"Set CRON":{cn:"Set",en:"Set"},"Set CRON schedule for restarts":{cn:"Set CRON schedule for restarts",en:"Set CRON schedule for restarts"},Settings:{cn:"设置",en:"Settings"},"Settings for %s":{cn:"Settings for %s",en:"Settings for %s"},"Show instances only for current host":{cn:"Show instances only for current host",en:"Show instances only for current host"},"Show values of instance":{cn:"Show values of instance",en:"Show values of instance"},"Show...":{cn:"显示...",en:"Show..."},"Size: %s, Available: %s":{cn:"大小: %s, 可用: %s"},"Some data are not stored. Discard?":{cn:"有一些修改了的配置信息没有保存. 确认吗?",en:"Some data are not stored. Discard?"},"Sort alphabetically":{cn:"Sort alphabetically by name",en:"Sort alphabetically by name"},"Started...":{cn:"Started...",en:"Started..."},State:{cn:"Datapoint",en:"Datapoint"},"State type":{cn:"State type",en:"State type"},States:{cn:"状态",en:"States"},"States rights":{cn:"状态权限",en:"States rights"},Statistics:{cn:"统计",en:"Statistics"},"Statistics:":{cn:"统计",en:"Statistics"},"Storage of %s":{cn:'Storage of <span class="name">%s</span>',en:'Storage of <span class="name">%s</span>'},"Storage of %s states":{cn:'Storage of <span class="name">%s</span> states',en:'Storage of <span class="name">%s</span> states'},"Success!":{cn:"成功!",en:"Success!"},Suggestion:{cn:"推荐",en:"Recommendation"},Sun:{cn:"星期天",en:"Sun"},System:{cn:"系统",en:"System"},"System language:":{cn:"语言",en:"System language"},"System settings":{cn:"系统设置",en:"System settings"},"System uptime":{cn:"运行",en:"System uptime"},Table:{cn:"Table",en:"Table"},Taiwan:{cn:"中国台湾",en:"Taiwan"},"Temperature units:":{cn:"温度单位",en:"Temperature units"},'This version of node.js "%s" on "%s" is deprecated. Please install node.js 6, 8 or newer':{cn:'yunkong2 supports the LTS versions 6, 8, 10 or newer of node.js. Please update your version ("%s") on host "%s" to one of the supported versions. We recommend to use Node.js 6.',en:'yunkong2 supports the LTS versions 6, 8, 10 or newer of node.js. Please update your version ("%s") on host "%s" to one of the supported versions. We recommend to use Node.js 6.'},Thu:{cn:"Thu",en:"Thu"},Time:{cn:"Time",en:"Time"},"Time From":{cn:"Time From",en:"Time From"},"Time To":{cn:"Time To",en:"Time To"},"Time stamp":{cn:"Time stamp",en:"Time stamp"},Title:{cn:"标题",en:"Title"},To:{cn:"To",en:"To"},Today:{cn:"今日",en:"Today"},"Toggle expert mode":{cn:"切换模式",en:"Toggle expert mode"},"Toggle states view":{cn:"切换状态视图",en:"Toggle the states view"},"Too many events":{cn:"Too many events",en:"Too many events"},"Total count in group":{cn:"Total count in group",en:"Total count in group"},"Trigger event":{cn:"触发事件",en:"Trigger event"},Type:{cn:"Type",en:"Type"},"URL or file path:":{cn:"URL或安装包路径",en:"URL or file path"},"Unknown file format!":{cn:"文件格式无效!",en:"Unknown file format!"},"Unsupported image format":{cn:"不支持的格式",en:"Unsupported image format"},Update:{cn:"更新",en:"Update"},"Update objects":{cn:"更新",en:"Update objects"},"Update states":{cn:"更新",en:"Update states"},Updated:{cn:"已更新",en:"Updated"},"Upgrade all adapters":{cn:"升级所有适配器",en:"Upgrade all adapters"},Upload:{cn:"文件上传",en:"File upload"},"Upload admin started":{cn:"上传配置",en:"Upload of configuration is started"},"Upload started...":{cn:"上传开始...",en:"Upload started..."},Uptime:{cn:"Uptime",en:"Uptime"},Uruguay:{cn:"Uruguay",en:"Uruguay"},"Use Lets Encrypt certificates:":{cn:"Use Let's Encrypt certificates",en:"Use Let's Encrypt certificates"},"Use this instance for automatic update:":{cn:"Use this instance for automatic update",en:"Use this instance for automatic update"},User:{cn:"用户",en:"User"},"User deleted":{cn:"用户已删除",en:"User deleted"},"User does not exist":{cn:"这个用户不存在",en:"User does not exist"},"User yet exists":{cn:"这个用户已经存在",en:"User already exists"},Users:{cn:"用户",en:"Users"},Value:{cn:"Value",en:"Value"},"Values of %s":{cn:"Values of %s",en:"Values of %s"},"Vatican City State":{cn:"Vatican City State",en:"Vatican City State"},Wed:{cn:"Wed",en:"Wed"},With:{cn:"With",en:"With"},Without:{cn:"Without",en:"Without"},"You are going to add new instance: ":{cn:"添加新的实例: ",en:"You are going to add new instance: "},"You can check changelog here":{cn:'You can check the changelog <a href="https://git.spacen.net/yunkong2/yunkong2.js-controller/blob/master/CHANGELOG.md" target="_blank">here</a>',en:'You can check the changelog <a href="https://github.com/yunkong2/yunkong2.js-controller/blob/master/CHANGELOG.md" target="_blank">here</a>'},"You can drag&drop the devices, channels and states to enums":{cn:"可将 devices,channels,states 拖放到枚举区",en:"You can drag&drop the devices, channels and states to enums"},"You can drag&drop users to groups":{cn:"支持拖放用户",en:"You can drag&drop users to groups"},"You can't see events via cloud":{cn:"You can't see events via cloud",en:"You can't see events via cloud"},"Your home":{cn:"Your home",en:"Your home"},_All:{cn:"全部",en:"All"},"_Toggle expert mode":{cn:"切换模式",en:"Toggle expert mode"},__different__:{cn:"different",en:"different"},"a-z":{cn:"a-z",en:"a-z"},ack:{cn:"ack",en:"ack"},actions:{cn:"actions",en:"actions"},active:{cn:"active",en:"active"},"adapter with updates":{cn:"adapters with updates",en:"adapters with updates"},"adapters count":{cn:"适配器数",en:"adapters count"},add:{cn:"添加",en:"Add"},"add children":{cn:"添加子节点",en:"add children"},"add instance":{cn:"添加实例",en:"add instance"},"add repository":{cn:"添加仓库",en:"add repository"},agree:{cn:"同意",en:"agree"},alarm_group:{cn:"Alarm",en:"Alarm"},alive:{cn:"alive",en:"alive"},all:{cn:"all",en:"all"},alpha:{cn:"alpha",en:"alpha"},array:{cn:"array",en:"array"},auto:{cn:"auto",en:"auto"},available:{cn:"最新",en:"available"},beta:{cn:"beta",en:"beta"},boolean:{cn:"boolean",en:"boolean"},bug:{cn:"bugtracker",en:"bugtracker"},cancel:{cn:"取消",en:"Cancel"},cert_path_note:{cn:"例如 '/opt/certs/cert.pem', 也可以直接拖放文件",en:"You can use an absolute path to the certificate, like '/opt/certs/cert.pem', or just upload it per drag&drop"},certificate:{cn:"certificate",en:"certificate"},"change view mode":{cn:"模式",en:"change view mode"},channel:{cn:"channel",en:"channel"},clear:{cn:"清除",en:"clear"},"climate-control_group":{cn:"Climate Control",en:"Climate Control"},"close on ready":{cn:"完成后自动关闭",en:"close on ready"},collapse:{cn:"收起",en:"collapse"},"collapse all":{cn:"收起",en:"collapse all"},comma:{cn:"comma",en:"comma"},"command execution":{cn:"执行命令 ",en:"Command execution"},common:{cn:"公共",en:"common"},"common adapters_group":{cn:"公共",en:"Common"},common_color:{cn:"颜色",en:"color"},common_def:{cn:"缺省值",en:"default value"},common_desc:{cn:"说明",en:"description"},common_icon:{cn:"图标",en:"icon"},common_max:{cn:"最大值",en:"max value"},common_min:{cn:"最小值",en:"minimal value"},common_read:{cn:"允许读",en:"read allowed"},common_role:{cn:"角色",en:"role"},common_states:{cn:"预定义值",en:"predefined values"},common_type:{cn:"类型",en:"type"},common_unit:{cn:"量度单位",en:"measure unit"},common_write:{cn:"允许写",en:"write allowed"},communication_group:{cn:"通信",en:"Communication"},config:{cn:"设置",en:"Settings"},"config instance":{cn:"配置实例",en:"config instance"},"confirm password":{cn:"密码确认",en:"Confirm password"},connected:{cn:"已连接",en:"connected"},copy:{cn:"复制",en:"copy"},"copy note":{cn:"Press Ctrl+A and Ctrl+C to copy the log to the clipboard and click with the mouse anywhere to close.",en:"Press Ctrl+A and Ctrl+C to copy the log to the clipboard and click with the mouse anywhere to close."},"create operation":{cn:"创建",en:"create"},"custom enum":{cn:"自定义枚举",en:"?ustom enum"},"custom group":{cn:"自定义群组",en:"Custom group"},daemon:{cn:"daemon",en:"daemon"},"date-and-time_group":{cn:"日期和时间",en:"Date and Time"},daysShortText:{cn:"d.",en:"d."},debug:{cn:"debug",en:"debug"},delete:{cn:"删除",en:"delete"},"delete adapter":{cn:"删除",en:"delete adapter"},"delete group":{cn:"删除",en:"delete group"},"delete instance":{cn:"删除",en:"delete instance"},"delete operation":{cn:"删除",en:"delete"},"delete script":{cn:"删除",en:"delete script"},"delete user":{cn:"删除",en:"delete user"},desc:{cn:"desc",en:"desc"},description:{cn:"说明",en:"Description"},device:{cn:"device",en:"device"},"diag-note":{cn:"We worked hard to create this project. In return we expect from you some usage statistics.<br>Every time the adapter list is updated, the anonymized statistics are sent. We respect your privacy, so no private information will be transmitted.<br>Thank you!",en:"We worked hard to create this project. In return we expect from you some usage statistics.<br>Every time the adapter list is updated, the anonymized statistics are sent. We respect your privacy, so no private information will be transmitted.<br>Thank you!"},edit:{cn:"编辑",en:"edit"},"edit enum":{cn:"编辑",en:"edit enum"},"edit file":{cn:"编辑",en:"edit file"},"edit group":{cn:"编辑",en:"edit group"},"edit instance":{cn:"编辑",en:"edit instance"},"edit script":{cn:"编辑",en:"edit script"},"edit user":{cn:"修改",en:"edit user"},"edit value":{cn:"编辑",en:"Edit value"},enabled:{cn:"enabled",en:"enabled"},energy_group:{cn:"能源",en:"Energy"},engine:{cn:"engine",en:"engine"},"engine type":{cn:"engine type",en:"engine type"},error:{cn:"错误",en:"error"},events:{cn:"events",en:"events"},"execute operation":{cn:"Execute operation",en:"Execute operation"},expand:{cn:"展开",en:"expand"},"expand all":{cn:"展开所有",en:"expand all"},extended:{cn:"extended",en:"extended"},false:{cn:"false",en:"false"},"file permissions":{cn:"文件许可",en:"File permissions"},from:{cn:"来自",en:"from"},garden_group:{cn:"农业",en:"Garden"},general_group:{cn:"基本",en:"General"},geoposition_group:{cn:"地理位置",en:"Geo position"},groups:{cn:"groups",en:"groups"},hardware_group:{cn:"硬件",en:"Hardware"},history:{cn:"数据",en:"history"},"history data":{cn:"数据",en:"history data"},host:{cn:"主机",en:"host"},household_group:{cn:"Household",en:"Household"},"http operation":{cn:"http",en:"http"},id:{cn:"ID",en:"ID"},info:{cn:"信息",en:"info"},infrastructure_group:{cn:"环境",en:"Infrastructure"},install:{cn:"安装",en:"install"},"install specific version":{cn:"安装指定版本",en:"Install a specific version"},installed:{cn:"已安装",en:"installed"},"installed adapters":{cn:"Filter adapters with existing instances",en:"Filter adapters with existing instances"},instance:{cn:"实例",en:"instance"},"instance number":{cn:"Desired instance number",en:"Desired instance number"},"yunkong2 Enums":{cn:"yunkong2 enums",en:"yunkong2 enums"},"yunkong2 States":{cn:"yunkong2 states",en:"yunkong2 states"},"yunkong2 adapter instances":{cn:"yunkong2 adapter instances",en:"yunkong2 adapter instances"},"yunkong2 adapter scripts":{cn:"yunkong2 adapter scripts",en:"yunkong2 adapter scripts"},"yunkong2 adapters":{cn:"yunkong2 adapters",en:"yunkong2 adapters"},"yunkong2 certificates":{cn:"yunkong2 certificates",en:"yunkong2 certificates"},"yunkong2 groups":{cn:"yunkong2 groups",en:"yunkong2 groups"},"yunkong2 hosts":{cn:"yunkong2 hosts",en:"yunkong2 hosts"},"yunkong2 repositories":{cn:"yunkong2 repositories",en:"yunkong2 repositories"},"yunkong2 users":{cn:"yunkong2 users",en:"yunkong2 users"},"iot-system_group":{cn:"物联网",en:"IoT systems"},"iot-systems_group":{cn:"物联网系统",en:"IoT Systems"},keywords:{cn:"关键字",en:"keywords"},lc:{cn:"Last change",en:"Last change"},less:{cn:"精简",en:"less"},letsnecrypt_help:{cn:'This are settings for Let\'s Encrypt account. To get the free certificates for your domain. You can read more <a href="https://letsencrypt.org/" target="_blank">here</a>.',en:'This are settings for Let\'s Encrypt account. To get the free certificates for your domain. You can read more <a href="https://letsencrypt.org/" target="_blank">here</a>.'},letsnecrypt_help_domains:{cn:"E.g: 'example.com, www.example.com'",en:"E.g: 'example.com, www.example.com'"},letsnecrypt_help_email:{cn:"Please use your email address. It will be used for your account.",en:"Please use your email address. It will be used for your account."},letsnecrypt_help_path:{cn:"Directory name where the certificates will be stored. This is always relative to configuration directory",en:"Directory name where the certificates will be stored. This is always relative to configuration directory"},license:{cn:"许可",en:"license"},"license agreement":{cn:"许可协议",en:"license agreement"},"license not agree":{cn:"不同意!",en:"Do not agree with the license!"},license_checkbox:{cn:"同意全部的许可条款",en:"I agree with the collection of anonymous statistics.<br>(This can be disabled in settings)"},lighting_group:{cn:"照明",en:"Lighting"},link:{cn:"link",en:"link"},list:{cn:"list",en:"list"},"list operation":{cn:"list elements",en:"list elements"},logic_group:{cn:"逻辑",en:"Logic"},loglevel:{cn:"loglevel",en:"loglevel"},media_group:{cn:"媒体",en:"Media"},members:{cn:"members",en:"members"},memlimit:{cn:"RAM limit",en:"RAM limit"},message:{cn:"消息",en:"message"},messaging_group:{cn:"信使",en:"Messaging"},"misc-data_group":{cn:"Misc. data",en:"Misc. data"},mixed:{cn:"mixed",en:"mixed"},mode:{cn:"mode",en:"mode"},more:{cn:"详细",en:"more"},multi:{cn:"multistate",en:"multistate"},multimedia_group:{cn:"多媒体",en:"Multimedia"},name:{cn:"名称",en:"name"},native:{cn:"native",en:"native"},network_group:{cn:"网络",en:"Network"},"new certificate":{cn:"new certificate",en:"new certificate"},"new group":{cn:"new group",en:"new group"},"new script":{cn:"new script",en:"new script"},"new user":{cn:"新建用户",en:"new user"},newObject:{cn:"New object",en:"New object"},"no-city":{cn:"no city",en:"no city"},"node-red":{cn:"node-red",en:"node-red"},none:{cn:"none",en:"none"},normal:{cn:"normal",en:"normal"},"not ack":{cn:"not ack",en:"not ack"},"not agree":{cn:"不同意",en:"not agree"},"npm error":{cn:"npm error",en:"npm error"},number:{cn:"number",en:"number"},object:{cn:"object",en:"object"},"object permissions":{cn:"Object permissions",en:"Object permissions"},of:{cn:"/",en:"of"},ok:{cn:"确定",en:"Ok"},"open web page":{cn:"Open web page of adapter",en:"Open web page of adapter"},os:{cn:"OS",en:"operating system"},"other permissions":{cn:"Other permissions",en:"Other permissions"},"parent name":{cn:"parent name",en:"parent name"},password:{cn:"密码",en:"Password"},permissionError:{cn:"Permission error",en:"Permission error"},planned:{cn:"planned",en:"planned"},platform:{cn:"平台",en:"platform"},point:{cn:"point",en:"point"},process:{cn:"process",en:"process"},protocols_group:{cn:"协议",en:"Protocols"},raw:{cn:"Raw (开发)",en:"Raw (experts only)"},read:{cn:"read",en:"read"},"read operation":{cn:"read",en:"read"},readme:{cn:"readme",en:"readme"},reload:{cn:"刷新",en:"reload"},"reload instance":{cn:"reload instance",en:"reload instance"},rest:{cn:"REST (read only)",en:"rest (read only)"},restart:{cn:"重启",en:"auto restart"},"restart script":{cn:"重启脚本",en:"restart script"},role:{cn:"角色",en:"role"},save:{cn:"保存",en:"save"},schedule_group:{cn:"计划",en:"Schedule"},script_group:{cn:"逻辑和脚本",en:"Scripts and Logic"},"select member by double click":{cn:"select member by double clicking",en:"select member by double clicking"},"sendto operation":{cn:"Send-to operation",en:"Send-to operation"},service_group:{cn:"Maintenance",en:"Maintenance"},severity:{cn:"安防",en:"severity"},stable:{cn:"stable",en:"stable"},state:{cn:"state",en:"state"},"state permissions":{cn:"状态许可",en:"State permissions"},storage_group:{cn:"存储",en:"Storage"},string:{cn:"string",en:"string"},subscribe:{cn:"subscribe",en:"subscribe"},switch:{cn:"switch",en:"switch"},terminal:{cn:"Terminal",en:"Terminal"},"third-party_group":{cn:"第三方",en:"Third party"},"this adapter does not allow multiple instances":{cn:"这个适配器不允许运行多个实例",en:"This adapter does not allow multiple instances"},title:{cn:"标题",en:"title"},today:{cn:"今日",en:"today"},true:{cn:"true",en:"true"},ts:{cn:"时间",en:"Timestamp"},type:{cn:"type",en:"type"},unit:{cn:"unit",en:"unit"},update:{cn:"更新",en:"update"},"update adapter information":{cn:"update adapter information",en:"update adapter information"},"update-part1":{cn:"Because yunkong2 runs on many very different platforms, only manual updating is possible at the moment. To start the manual update, please go to your controller via console and execute the following:",en:"Because yunkong2 runs on many very different platforms, only manual updating is possible at the moment. To start the manual update, please go to your controller via console and execute the following:"},updated:{cn:"已更新",en:"updated"},updates:{cn:"updates",en:"updates"},upload:{cn:"上传",en:"Upload"},"user permissions":{cn:"用户权限",en:"user permissions"},users:{cn:"用户",en:"users"},"users permissions":{cn:"用户权限",en:"User permissions"},utility_group:{cn:"公用",en:"Utility"},val:{cn:"val",en:"val"},value:{cn:"value",en:"value"},"value.from":{cn:"Changed from",en:"Changed from"},"value.lc":{cn:"Last change",en:"Last change"},"value.q":{cn:"Quality code",en:"Quality code"},"value.ts":{cn:"Timestamp",en:"Timestamp"},"value.val":{cn:"value",en:"value"},version:{cn:"版本",en:"version"},vis_group:{cn:"yunkong2.vis",en:"yunkong2.vis"},visualisation_group:{cn:"可视化",en:"Visualisation"},"visualization-icons_group":{cn:"可视化 图标",en:"Visualization Icons"},"visualization-widgets_group":{cn:"可视化 部件",en:"Visualization Widgets"},visualization_group:{cn:"可视化",en:"Visualisation"},warn:{cn:"warn",en:"warn"},weather_group:{cn:"天气",en:"Weather"},wetty:{cn:"Wetty",en:"Wetty"},write:{cn:"write",en:"write"},"write operation":{cn:"write",en:"write"},yesterday:{cn:"昨天",en:"yesterday"},Speed:{cn:"主频",en:"Speed"},"%s object(s) processed":{cn:"%s objects were processed",en:"%s objects were processed"},"%s was imported":{cn:"%s was imported",en:"%s was imported"},"Ignore warning":{cn:"Ignore warning",en:"Ignore warning"},Filter:{cn:"查找",en:"Filter"},Afghanistan:{cn:"Afghanistan",en:"Afghanistan"},Albania:{cn:"Albania",en:"Albania"},Algeria:{cn:"Algeria",en:"Algeria"},"American Samoa":{cn:"American Samoa",en:"American Samoa"},Andorra:{cn:"Andorra",en:"Andorra"},Angola:{cn:"Angola",en:"Angola"},Anguilla:{cn:"Anguilla",en:"Anguilla"},Antarctica:{cn:"Antarctica",en:"Antarctica"},"Antigua and Barbuda":{cn:"Antigua and Barbuda",en:"Antigua and Barbuda"},Argentina:{cn:"Argentina",en:"Argentina"},Armenia:{cn:"Armenia",en:"Armenia"},Aruba:{cn:"Aruba",en:"Aruba"},Australia:{cn:"Australia",en:"Australia"},Austria:{cn:"Austria",en:"Austria"},"Authentication was deactivated":{cn:"Authentication was deactivated",en:"Authentication was deactivated"},Azerbaijan:{cn:"Azerbaijan",en:"Azerbaijan"},Background:{cn:"Background",en:"Background"},"Background color of the login screen":{cn:"Background color of the login screen",en:"Background color of the login screen"},"Background image":{cn:"Background image",en:"Background image"},Bahamas:{cn:"Bahamas",en:"Bahamas"},Bahrain:{cn:"Bahrain",en:"Bahrain"},Bangladesh:{cn:"Bangladesh",en:"Bangladesh"},Barbados:{cn:"Barbados",en:"Barbados"},Belarus:{cn:"Belarus",en:"Belarus"},Belgium:{cn:"Belgium",en:"Belgium"},Belize:{cn:"Belize",en:"Belize"},Benin:{cn:"Benin",en:"Benin"},Bermuda:{cn:"Bermuda",en:"Bermuda"},Bhutan:{cn:"Bhutan",en:"Bhutan"},Bolivia:{cn:"Bolivia",en:"Bolivia"},"Bosnia and Herzegovina":{cn:"Bosnia and Herzegovina",en:"Bosnia and Herzegovina"},Botswana:{cn:"Botswana",en:"Botswana"},"Bouvet Island":{cn:"Bouvet Island",en:"Bouvet Island"},Brazil:{cn:"Brazil",en:"Brazil"},"British Indian Ocean Territory":{cn:"British Indian Ocean Territory",en:"British Indian Ocean Territory"},"Brunei Darussalam":{cn:"Brunei Darussalam",en:"Brunei Darussalam"},Bulgaria:{cn:"Bulgaria",en:"Bulgaria"},"Burkina Faso":{cn:"Burkina Faso",en:"Burkina Faso"},Burundi:{cn:"Burundi",en:"Burundi"},Cambodia:{cn:"Cambodia",en:"Cambodia"},Cameroon:{cn:"Cameroon",en:"Cameroon"},Canada:{cn:"Canada",en:"Canada"},"Cape Verde":{cn:"Cape Verde",en:"Cape Verde"},"Cayman Islands":{cn:"Cayman Islands",en:"Cayman Islands"},"Central African Republic":{cn:"Central African Republic",en:"Central African Republic"},Chad:{cn:"Chad",en:"Chad"},Chile:{cn:"Chile",en:"Chile"},"Christmas Island":{cn:"Christmas Island",en:"Christmas Island"},"Cocos Islands":{cn:"Cocos Islands",en:"Cocos Islands"},Colombia:{cn:"Colombia",en:"Colombia"},Comoros:{cn:"Comoros",en:"Comoros"},Congo:{cn:"Congo",en:"Congo"},"Cook Islands":{cn:"Cook Islands",en:"Cook Islands"},"Costa Rica":{cn:"Costa Rica",en:"Costa Rica"},Cuba:{cn:"Cuba",en:"Cuba"},Cyprus:{cn:"Cyprus",en:"Cyprus"},"Czech Republic":{cn:"Czech Republic",en:"Czech Republic"},"Disable authentication":{cn:"Disable authentication",en:"Disable authentication"},Djibouti:{cn:"Djibouti",en:"Djibouti"},"Dominican Republic":{cn:"Dominican Republic",en:"Dominican Republic"},"East Timor":{cn:"East Timor",en:"East Timor"},"Enabled:":{cn:"Enabled",en:"Enabled"},"Equatorial Guinea":{cn:"Equatorial Guinea",en:"Equatorial Guinea"},Eritrea:{cn:"Eritrea",en:"Eritrea"},Estonia:{cn:"Estonia",en:"Estonia"},Ethiopia:{cn:"Ethiopia",en:"Ethiopia"},Fiji:{cn:"Fiji",en:"Fiji"},Finland:{cn:"Finland",en:"Finland"},France:{cn:"France",en:"France"},"French Guiana":{cn:"French Guiana",en:"French Guiana"},"French Polynesia":{cn:"French Polynesia",en:"French Polynesia"},"French Southern Territories":{cn:"French Southern Territories",en:"French Southern Territories"},Gabon:{cn:"Gabon",en:"Gabon"},Gambia:{cn:"Gambia",en:"Gambia"},Georgia:{cn:"Georgia",en:"Georgia"},Germany:{cn:"Germany",en:"Germany"},Ghana:{cn:"Ghana",en:"Ghana"},Gibraltar:{cn:"Gibraltar",en:"Gibraltar"},Greece:{cn:"Greece",en:"Greece"},Greenland:{cn:"Greenland",en:"Greenland"},Grenada:{cn:"Grenada",en:"Grenada"},Guadeloupe:{cn:"Guadeloupe",en:"Guadeloupe"},Guam:{cn:"Guam",en:"Guam"},Guatemala:{cn:"Guatemala",en:"Guatemala"},Guernsey:{cn:"Guernsey",en:"Guernsey"},Guinea:{cn:"Guinea",en:"Guinea"},"Guinea-Bissau":{cn:"Guinea-Bissau",en:"Guinea-Bissau"},Guyana:{cn:"Guyana",en:"Guyana"},Haiti:{cn:"Haiti",en:"Haiti"},Honduras:{cn:"Honduras",en:"Honduras"},Hungary:{cn:"Hungary",en:"Hungary"},Iceland:{cn:"Iceland",en:"Iceland"},India:{cn:"India",en:"India"},Indonesia:{cn:"Indonesia",en:"Indonesia"},Iran:{cn:"Iran",en:"Iran"},Iraq:{cn:"Iraq",en:"Iraq"},Ireland:{cn:"Ireland",en:"Ireland"},"Isle of Man":{cn:"Isle of Man",en:"Isle of Man"},Israel:{cn:"Israel",en:"Israel"},Italy:{cn:"Italy",en:"Italy"},"Ivory Coast":{cn:"Ivory Coast",en:"Ivory Coast"},Jamaica:{cn:"Jamaica",en:"Jamaica"},Japan:{cn:"Japan",en:"Japan"},Jersey:{cn:"Jersey",en:"Jersey"},Jordan:{cn:"Jordan",en:"Jordan"},Kazakhstan:{cn:"Kazakhstan",en:"Kazakhstan"},Kenya:{cn:"Kenya",en:"Kenya"},Kiribati:{cn:"Kiribati",en:"Kiribati"},Korea:{cn:"Korea",en:"Korea"},Kosovo:{cn:"Kosovo",en:"Kosovo"},Kuwait:{cn:"Kuwait",en:"Kuwait"},Kyrgyzstan:{cn:"Kyrgyzstan",en:"Kyrgyzstan"},"Lao People's Democratic Republic":{cn:"Lao People's Democratic Republic",en:"Lao People's Democratic Republic"},Latvia:{cn:"Latvia",en:"Latvia"},Lebanon:{cn:"Lebanon",en:"Lebanon"},Lesotho:{cn:"Lesotho",en:"Lesotho"},Liberia:{cn:"Liberia",en:"Liberia"},"Libyan Arab Jamahiriya":{cn:"Libyan Arab Jamahiriya",en:"Libyan Arab Jamahiriya"},Liechtenstein:{cn:"Liechtenstein",en:"Liechtenstein"},Lithuania:{cn:"Lithuania",en:"Lithuania"},Luxembourg:{cn:"Luxembourg",en:"Luxembourg"},Macau:{cn:"Macau",en:"Macau"},Macedonia:{cn:"Macedonia",en:"Macedonia"},Madagascar:{cn:"Madagascar",en:"Madagascar"},Mai:{cn:"Mai",en:"Mai"},Malawi:{cn:"Malawi",en:"Malawi"},Malaysia:{cn:"Malaysia",en:"Malaysia"},Maldives:{cn:"Maldives",en:"Maldives"},Mali:{cn:"Mali",en:"Mali"},Malta:{cn:"Malta",en:"Malta"},"Marshall Islands":{cn:"Marshall Islands",en:"Marshall Islands"},Martinique:{cn:"Martinique",en:"Martinique"},Mauritania:{cn:"Mauritania",en:"Mauritania"},Mauritius:{cn:"Mauritius",en:"Mauritius"},Mayotte:{cn:"Mayotte",en:"Mayotte"},Mexico:{cn:"Mexico",en:"Mexico"},Micronesia:{cn:"Micronesia",en:"Micronesia"},Moldova:{cn:"Moldova",en:"Moldova"},Monaco:{cn:"Monaco",en:"Monaco"},Mongolia:{cn:"Mongolia",en:"Mongolia"},Montenegro:{cn:"Montenegro",en:"Montenegro"},Montserrat:{cn:"Montserrat",en:"Montserrat"},Morocco:{cn:"Morocco",en:"Morocco"},Mozambique:{cn:"Mozambique",en:"Mozambique"},Myanmar:{cn:"Myanmar",en:"Myanmar"},Namibia:{cn:"Namibia",en:"Namibia"},Nauru:{cn:"Nauru",en:"Nauru"},Nepal:{cn:"Nepal",en:"Nepal"},Netherlands:{cn:"Netherlands",en:"Netherlands"},"Netherlands Antilles":{cn:"Netherlands Antilles",en:"Netherlands Antilles"},"New Caledonia":{cn:"New Caledonia",en:"New Caledonia"},"New Zealand":{cn:"New Zealand",en:"New Zealand"},Nicaragua:{cn:"Nicaragua",en:"Nicaragua"},Niger:{cn:"Niger",en:"Niger"},Nigeria:{cn:"Nigeria",en:"Nigeria"},Niue:{cn:"Niue",en:"Niue"},"Norfolk Island":{cn:"Norfolk Island",en:"Norfolk Island"},"Northern Mariana Islands":{cn:"Northern Mariana Islands",en:"Northern Mariana Islands"},Oman:{cn:"Oman",en:"Oman"},Pakistan:{cn:"Pakistan",en:"Pakistan"},Palau:{cn:"Palau",en:"Palau"},Palestine:{cn:"Palestine",en:"Palestine"},Panama:{cn:"Panama",en:"Panama"},"Papua New Guinea":{cn:"Papua New Guinea",en:"Papua New Guinea"},Paraguay:{cn:"Paraguay",en:"Paraguay"},Peru:{cn:"Peru",en:"Peru"},Philippines:{cn:"Philippines",en:"Philippines"},Pitcairn:{cn:"Pitcairn",en:"Pitcairn"},Poland:{cn:"Poland",en:"Poland"},Popular:{cn:"Popular",en:"Popular"},"Popular first":{cn:"Popular first",en:"Popular first"},Portugal:{cn:"Portugal",en:"Portugal"},"Puerto Rico":{cn:"Puerto Rico",en:"Puerto Rico"},Qatar:{cn:"Qatar",en:"Qatar"},Reunion:{cn:"Reunion",en:"Reunion"},Romania:{cn:"Romania",en:"Romania"},"Russian Federation":{cn:"Russian Federation",en:"Russian Federation"},Rwanda:{cn:"Rwanda",en:"Rwanda"},"Saint Kitts and Nevis":{cn:"Saint Kitts and Nevis",en:"Saint Kitts and Nevis"},"Saint Lucia":{cn:"Saint Lucia",en:"Saint Lucia"},"Saint Vincent and the Grenadines":{cn:"Saint Vincent and the Grenadines",en:"Saint Vincent and the Grenadines"},Samoa:{cn:"Samoa",en:"Samoa"},"San Marino":{cn:"San Marino",en:"San Marino"},"Saudi Arabia":{cn:"Saudi Arabia",en:"Saudi Arabia"},Senegal:{cn:"Senegal",en:"Senegal"},Serbia:{cn:"Serbia",en:"Serbia"},Slovakia:{cn:"Slovakia",en:"Slovakia"},Slovenia:{cn:"Slovenia",en:"Slovenia"},"Solomon Islands":{cn:"Solomon Islands",en:"Solomon Islands"},Somalia:{cn:"Somalia",en:"Somalia"},"South Africa":{cn:"South Africa",en:"South Africa"},"South Georgia South Sandwich Islands":{cn:"South Georgia South Sandwich Islands",en:"South Georgia South Sandwich Islands"},Spain:{cn:"Spain",en:"Spain"},"Sri Lanka":{cn:"Sri Lanka",en:"Sri Lanka"},"St. Helena":{cn:"St. Helena",en:"St. Helena"},"St. Pierre and Miquelon":{cn:"St. Pierre and Miquelon",en:"St. Pierre and Miquelon"},Sudan:{cn:"Sudan",en:"Sudan"},Suriname:{cn:"Suriname",en:"Suriname"},"Svalbard and Jan Mayen Islands":{cn:"Svalbard and Jan Mayen Islands",en:"Svalbard and Jan Mayen Islands"},Swaziland:{cn:"Swaziland",en:"Swaziland"},Sweden:{cn:"Sweden",en:"Sweden"},Switzerland:{cn:"Switzerland",en:"Switzerland"},"Syrian Arab Republic":{cn:"Syrian Arab Republic",en:"Syrian Arab Republic"},Tajikistan:{cn:"Tajikistan",en:"Tajikistan"},Tanzania:{cn:"Tanzania",en:"Tanzania"},Thailand:{cn:"Thailand",en:"Thailand"},Togo:{cn:"Togo",en:"Togo"},Tokelau:{cn:"Tokelau",en:"Tokelau"},Tonga:{cn:"Tonga",en:"Tonga"},"Trinidad and Tobago":{cn:"Trinidad and Tobago",en:"Trinidad and Tobago"},Tue:{cn:"Tue",en:"Tue"},Tunisia:{cn:"Tunisia",en:"Tunisia"},Turkey:{cn:"Turkey",en:"Turkey"},Turkmenistan:{cn:"Turkmenistan",en:"Turkmenistan"},"Turks and Caicos Islands":{cn:"Turks and Caicos Islands",en:"Turks and Caicos Islands"},Tuvalu:{cn:"Tuvalu",en:"Tuvalu"},Uganda:{cn:"Uganda",en:"Uganda"},Ukraine:{cn:"Ukraine",en:"Ukraine"},"Uncheck All":{cn:"Uncheck All",en:"Uncheck All"},"United Arab Emirates":{cn:"United Arab Emirates",en:"United Arab Emirates"},"United Kingdom":{cn:"United Kingdom",en:"United Kingdom"},"United States":{cn:"United States",en:"United States"},"United States minor outlying islands":{cn:"United States minor outlying islands",en:"United States minor outlying islands"},Unsecure_Auth:{cn:"The password will be sent via unsecure connection. To protect your passwords enable the secure connection (HTTPS)!",en:"The password will be sent via unsecure connection. To protect your passwords enable the secure connection (HTTPS)!"},Uzbekistan:{cn:"Uzbekistan",en:"Uzbekistan"},Vanuatu:{cn:"Vanuatu",en:"Vanuatu"},Venezuela:{cn:"Venezuela",en:"Venezuela"},Vietnam:{cn:"Vietnam",en:"Vietnam"},"Virgin Islands (British)":{cn:"Virgin Islands (British)",en:"Virgin Islands (British)"},"Virgin Islands (U.S.)":{cn:"Virgin Islands (U.S.)",en:"Virgin Islands (U.S.)"},"Wallis and Futuna Islands":{cn:"Wallis and Futuna Islands",en:"Wallis and Futuna Islands"},"Warning!":{cn:"Warning!",en:"Warning!"},"Western Sahara":{cn:"Western Sahara",en:"Western Sahara"},Yemen:{cn:"Yemen",en:"Yemen"},Zaire:{cn:"Zaire",en:"Zaire"},Zambia:{cn:"Zambia",en:"Zambia"},Zimbabwe:{cn:"Zimbabwe",en:"Zimbabwe"},silly:{cn:"silly",en:"silly"},Seychelles:{en:"Seychelles"},"Sierra Leone":{en:"Sierra Leone"},Singapore:{en:"Singapore"},"Size: %s, Free: %s":{en:"Size: %s, Available: %s"},"edit enums":{en:"Edit enumerations for"},"place here":{en:"place the files here"},popular:{en:"popular"}};
|
||
//# sourceMappingURL=app.js.map
|