<?xml version="1.0" encoding="UTF-8" ?>
<!-- created at 2025-12-19 11:10:25 -->
<UANodeSet xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd">
	<Extensions>
		<atvise Version="3.13"/>
	</Extensions>
	<NamespaceUris>
		<Uri>http://www.atvise.com/atServer/UA/</Uri>
	</NamespaceUris>
	<Aliases>
		<!-- data types -->
		<Alias Alias="Boolean">i=1</Alias>
		<Alias Alias="SByte">i=2</Alias>
		<Alias Alias="Byte">i=3</Alias>
		<Alias Alias="Int16">i=4</Alias>
		<Alias Alias="UInt16">i=5</Alias>
		<Alias Alias="Int32">i=6</Alias>
		<Alias Alias="UInt32">i=7</Alias>
		<Alias Alias="Int64">i=8</Alias>
		<Alias Alias="UInt64">i=9</Alias>
		<Alias Alias="Float">i=10</Alias>
		<Alias Alias="Double">i=11</Alias>
		<Alias Alias="String">i=12</Alias>
		<Alias Alias="DateTime">i=13</Alias>
		<Alias Alias="ByteString">i=15</Alias>
		<Alias Alias="XmlElement">i=16</Alias>
		<Alias Alias="NodeId">i=17</Alias>
		<Alias Alias="LocalizedText">i=21</Alias>
		<!-- references -->
		<Alias Alias="Organizes">i=35</Alias>
		<Alias Alias="HasEventSource">i=36</Alias>
		<Alias Alias="HasModellingRule">i=37</Alias>
		<Alias Alias="HasTypeDefinition">i=40</Alias>
		<Alias Alias="HasSubtype">i=45</Alias>
		<Alias Alias="HasProperty">i=46</Alias>
		<Alias Alias="HasComponent">i=47</Alias>
		<Alias Alias="HasNotifier">i=48</Alias>
		<Alias Alias="HasCondition">i=9006</Alias>
		<Alias Alias="HasHistoricalConfiguration">i=56</Alias>
		<!-- types -->
		<Alias Alias="BaseDataType">i=24</Alias>
		<Alias Alias="BaseObjectType">i=58</Alias>
		<Alias Alias="FolderType">i=61</Alias>
		<Alias Alias="BaseVariableType">i=62</Alias>
		<Alias Alias="BaseDataVariableType">i=63</Alias>
		<Alias Alias="PropertyType">i=68</Alias>
		<Alias Alias="AlarmConditionStateType">ns=1;i=1001</Alias>
		<!-- modelling rules -->
		<Alias Alias="New">i=78</Alias>
		<Alias Alias="Shared">i=79</Alias>
		<Alias Alias="SharedExclusive">i=336</Alias>
		<!-- other -->
		<Alias Alias="Server">i=2253</Alias>
		<Alias Alias="Objects">i=85</Alias>
	</Aliases>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup" ExportedBrowseName="1:popup" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS" BrowseName="1:OBJECTDISPLAYS">
		<DisplayName Locale="en">OBJECTDISPLAYS</DisplayName>
		<Description Locale="en">OBJECTDISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup" BrowseName="1:popup">
		<DisplayName Locale="en">popup</DisplayName>
		<Description Locale="en">popup</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.add_alarm" BrowseName="1:add_alarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">add_alarm</DisplayName>
		<Description Locale="en">add_alarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="280" version="1.2" width="500" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <desc>Dialog to add a new alarm configuration and condition.</desc>
 <title>Add Dialog</title>
 <metadata>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="address" name="address" substitute="$ADDRESS$" valuetype="string"/>
  <atv:parameter behavior="mandatory" defaultvalue="false" desc="alarmIsThere" name="alarmIsThere" valuetype="bool"/>
  <atv:parameter behavior="mandatory" defaultvalue="null" desc="conditionType" name="conditionType" valuetype="string"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <svg atv:refpx="340" atv:refpy="245.701" height="30" id="btn_add" transform="matrix(1.5,0,0,1.3333,0,0)" width="80" x="186.667" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="165.004">
  <atv:argument name="label" value="T{Add}"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.6667,0,0,0.75,0,0)" x="50" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.6667,0,0,0.75,0,0)" width="116"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.6667,0,0,0.75,0,0)" width="120"/>
 </svg>
 <svg atv:refpx="160" atv:refpy="244.559" height="30" id="btn_cancel" transform="matrix(1.5,0,0,1.3333,0,0)" width="80" x="66.667" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="165.004">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="4"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.6667,0,0,0.75,0,0)" x="50" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.6667,0,0,0.75,0,0)" width="116"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.6667,0,0,0.75,0,0)" width="120"/>
 </svg>
 <svg atv:refpx="380" atv:refpy="40.001" height="30" id="name_conf" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="224" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="15">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite id="input_label" transform="matrix(0.8,0,0,0.75,0,0)" x="192.055" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
 </svg>
 <svg atv:refpx="380" atv:refpy="100.002" height="30" id="combobox_conditiontype" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="224" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="60.002">
  <atv:argument name="text1" value="T{Discrete}"/>
  <atv:argument name="text1value" value="Discrete"/>
  <atv:argument name="text2" value="T{Discrete Retrigger}"/>
  <atv:argument name="text2value" value="Retrigger"/>
  <atv:argument name="text3" value="T{Limit}"/>
  <atv:argument name="text3value" value="Limit"/>
  <atv:argument name="tabIndex" value="2"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" x="175" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.8,0,0,0.75,0,0)" x="175" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" x="175" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.8,0,0,0.75,0,0)" x="165.5" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="168"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="168"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
 </svg>
 <svg atv:refpx="380" atv:refpy="160.004" height="30" id="name_condition" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="224" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="105.003">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="tabIndex" value="3"/>
  <atv:overwrite id="input_label" transform="matrix(0.8,0,0,0.75,0,0)" x="192.055" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
 </svg>
 <text atv:refpx="127.5" atv:refpy="40.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_4" x="25" y="46.5">T{Alarm Configuration Name}:</text>
 <text atv:refpx="86" atv:refpy="98.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_5" x="25" y="104.5">T{Condition type}:</text>
 <text atv:refpx="89.809" atv:refpy="160.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_8" x="24.5" y="166.5">T{Condition name}:</text>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var address = webMI.query.address;
var alarmName = webMI.query.alarmName !== "null" ? webMI.query.alarmName : null;
var conditionType = webMI.query.conditionType !== "null" ? webMI.query.conditionType : null;
var conditionName = null;
var newConfig;
var existingConditions = [];

webMI.data.call("GetConditions", {address: address}, function(e){
	for(var i = 0; i < e.length; i++){
		existingConditions.push(e[i].name);
	}
});

/**
 ** if on selected node is already a alarmconfiguration the get inserted in the fields
 **/
if (alarmName) {
	webMI.trigger.fire("setValue", alarmName, "name_conf");
	webMI.trigger.fire("com.atvise.setActive", false, "name_conf");
	if (conditionType) {
		webMI.trigger.fire("setSelectedItem", conditionType, "combobox_conditiontype");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_conditiontype");
	}
	newConfig = false;
} else {
	newConfig = true;
}

/**
 ** Function checks with regex
 **/
function checkName(input) {
	// RegEx to check the allowed characters: A-Z, a-z, 0-9, -, ., _
	const regex = /^[A-Za-z0-9\-._]+$/;
	return regex.test(input);
}

/**
 ** checks the input for configuration name
 **/
webMI.trigger.connect("valuechanged", function (e) {
	e.value = webMI.secureString(e.value);
	if (checkName(e.value)) {
		webMI.trigger.fire("com.atvise.setActive", true, "btn_add");
		alarmName = e.value;
		if (webMI.gfx.getStroke("name_conf") !== null) {
			webMI.gfx.setStroke("name_conf", null);
		}
	} else {
		webMI.gfx.setStroke("name_conf", "#ff0000");
		conditionName = null;
	}
}, "name_conf");

/**
 ** safes the selected condition type
 **/
webMI.trigger.connect("valuechanged", function (e) {
	conditionType = e.value;
}, "combobox_conditiontype");

/**
 ** checks the input for condition name
 **/
webMI.trigger.connect("valuechanged", function (e) {
	e.value = webMI.secureString(e.value);
	if(existingConditions.indexOf(e.value) >= 0){
		webMI.gfx.setStroke("name_condition", "#ff0000");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_add");
	} else {
		if (checkName(e.value)) {
			conditionName = e.value;
			webMI.trigger.fire("com.atvise.setActive", true, "btn_add");
			if (webMI.gfx.getStroke("name_condition") !== null) {
				webMI.gfx.setStroke("name_condition", null);
			}
		} else {
			webMI.trigger.fire("com.atvise.setActive", false, "btn_add");
			webMI.gfx.setStroke("name_condition", "#ff0000");
			conditionName = null;
		}
	}
}, "name_condition");

/**
 ** Click on Add button
 **/
webMI.trigger.connect("clicked", function (e) {
	if (conditionName === null || alarmName === null || conditionType === null) {
		alert("Fehler bei der Configuration - Alle Felder müssen beschrieben sein!");
	} else {
		webMI.query.name = conditionName;
		webMI.query.currLocation = address;
		webMI.query.conditionType = conditionType;
		webMI.query.triggerName = "reloadAtCurrLocation";
		webMI.query.alarmName = alarmName;
		webMI.query.isMod = false;
		webMI.query.isDiscrete = conditionType === "Discrete" || conditionType === "Retrigger";
		webMI.query.newConfig = newConfig;
		webMI.display.openWindow({
			display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.edit_alarm",
			height: 740, width: 1280, remember: true,
			modal: true, resizable: false, movable: true,
			scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
		});
	}
}, "btn_add");

/**
 ** click on cancle button
 **/
webMI.trigger.connect("clicked", function (e) {
	webMI.display.closeWindow()
}, "btn_cancel");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.delete_alarm" BrowseName="1:delete_alarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">delete_alarm</DisplayName>
		<Description Locale="en">delete_alarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="290" version="1.2" width="600" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <desc>Dialog to delete an alarm condition.</desc>
 <title>Delete Dialog</title>
 <defs/>
 <metadata>
  <atv:parameter behavior="mandatory" defaultvalue="T{Title}" desc="title" name="dialogTitle" substitute="$TITLE$" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" defaultvalue="T{Message}" desc="message line 1" name="dialogMessageLine1" substitute="$MESSAGE1$" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" defaultvalue="T{Message}" desc="message line 2" name="dialogMessageLine2" substitute="$MESSAGE2$" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="trigger name" name="triggerName" substitute="$T$" valuetype="string"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <text atv:refpx="273" atv:refpy="26" fill="#575757" font-family="Arial" font-size="20" id="id_1" text-anchor="middle" x="300" y="33.5">$TITLE$</text>
 <svg atv:refpx="510" atv:refpy="265.696" height="30" id="btn_delete" transform="matrix(1.75,0,0,1.3333,0,0)" width="80" x="251.429" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="180">
  <atv:argument name="label" value="T{Delete}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:overwrite height="38" id="id_6" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="31.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="16.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="24.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="34.625"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="13.292"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5714,0,0,0.75,0,0)" x="60" y="10"/>
  <atv:overwrite height="36" id="button_stroke" transform="matrix(0.5714,0,0,0.75,0,0)" width="136"/>
  <atv:overwrite height="38" id="button_bg" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite height="40" id="outer_frame" transform="matrix(0.5714,0,0,0.75,0,0)" width="140"/>
 </svg>
 <svg atv:refpx="350.001" atv:refpy="264.554" height="30" id="btn_cancel" transform="matrix(1.75,0,0,1.3333,0,0)" width="80" x="160" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="180">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite height="38" id="id_6" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="31.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="16.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="24.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="34.625"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="13.292"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5714,0,0,0.75,0,0)" x="60" y="10"/>
  <atv:overwrite height="36" id="button_stroke" transform="matrix(0.5714,0,0,0.75,0,0)" width="136"/>
  <atv:overwrite height="38" id="button_bg" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite height="40" id="outer_frame" transform="matrix(0.5714,0,0,0.75,0,0)" width="140"/>
 </svg>
 <text atv:refpx="283.578" atv:refpy="112.194" fill="#575757" font-family="Arial" font-size="20" id="id_3" text-anchor="middle" x="300" y="119.694">$MESSAGE1$</text>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[/**
 ** button delete click
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire(webMI.query.triggerName);
	webMI.display.closeWindow();
}, "btn_delete");

/**
 ** button cancle click
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.display.closeWindow();
}, "btn_cancel");]]]]><![CDATA[></script>
 <text atv:refpx="299.306" atv:refpy="152.194" fill="#575757" font-family="Arial" font-size="20" id="id_0" text-anchor="middle" x="299.306" y="159.694">$MESSAGE2$</text>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.edit_alarm" BrowseName="1:edit_alarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">edit_alarm</DisplayName>
		<Description Locale="en">edit_alarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="720" version="1.2" width="1280" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <desc>Dialog to edit alarm conditions.</desc>
 <title>Edit Dialog</title>
 <metadata>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="Name der Alarmconfig" name="name" substitute="" valuetype="string"/>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="Addresse der Config" name="address" substitute="" valuetype="string"/>
  <atv:parameter behavior="mandatory" defaultvalue="true" name="isMod" valuetype="bool"/>
  <atv:parameter behavior="mandatory" defaultvalue="true" name="isDiskrete" valuetype="bool"/>
  <atv:parameter behavior="optional" defaultvalue="SYSTEM.GLOBALS.atvFillColor" desc="$FILLCOLOR$" name="$FILLCOLOR$" substitute="$FILLCOLOR$" valuetype="global"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="5" width="5"/>
 </metadata>
 <rect atv:refpx="640.5" atv:refpy="40.5" fill="$FILLCOLOR$" height="80" id="id_14" rx="0" ry="0" stroke="#000000" stroke-width="1" width="1280" x="0.5" y="0.5"/>
 <svg atv:refpx="395.208" atv:refpy="240.5" height="30" id="active_message" transform="matrix(2.8094,0,0,1.3333,0,0)" width="160" x="60.691" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="165.375">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="allowDirectInput" value="Yes"/>
  <atv:argument name="tabIndex" value="11"/>
  <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
  <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
  <atv:overwrite id="input_label" transform="matrix(0.3559,0,0,0.75,0,0)" x="441.559" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.3559,0,0,0.75,0,0)" width="441.504"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.3559,0,0,0.75,0,0)" width="445.504"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.3559,0,0,0.75,0,0)" width="441.504"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.3559,0,0,0.75,0,0)" width="447.504"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.3559,0,0,0.75,0,0)" width="449.504"/>
 </svg>
 <svg atv:refpx="1015.456" atv:refpy="240.5" height="30" id="inactive_message" transform="matrix(2.8125,0,0,1.3333,0,0)" width="160" x="281.066" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="165.375">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="allowDirectInput" value="Yes"/>
  <atv:argument name="tabIndex" value="12"/>
  <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
  <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
  <atv:overwrite id="input_label" transform="matrix(0.3556,0,0,0.75,0,0)" x="442.055" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.3556,0,0,0.75,0,0)" width="442"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.3556,0,0,0.75,0,0)" width="446"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.3556,0,0,0.75,0,0)" width="442"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.3556,0,0,0.75,0,0)" width="448"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.3556,0,0,0.75,0,0)" width="450"/>
 </svg>
 <svg atv:refpx="894.999" atv:refpy="420.008" height="30" id="explicit_acknowledgement" transform="matrix(0.1875,0,0,1,0,0)" width="160" x="4693.333" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.checkbox" y="405">
  <atv:argument name="label" value=""/>
  <atv:argument name="tabIndex" value="18"/>
  <atv:overwrite id="checkbox_item" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_symbol" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="blinking_frame" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="focus_frame" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_bg" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_frame" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_stroke" transform="matrix(5.3333,0,0,1,0,0)"/>
 </svg>
 <svg atv:refpx="255.147" atv:refpy="120.5" height="30" id="category" transform="matrix(1.0579,0,0,1.3333,0,0)" width="160" x="161.169" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="75.375">
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.9453,0,0,0.75,0,0)" width="165.264"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.9453,0,0,0.75,0,0)" x="144.264" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.9453,0,0,0.75,0,0)" x="144.264" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.9453,0,0,0.75,0,0)" x="144.264" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.9453,0,0,0.75,0,0)" x="134.764" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.9453,0,0,0.75,0,0)" width="137.264"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.9453,0,0,0.75,0,0)" width="137.264"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.9453,0,0,0.75,0,0)" width="167.264"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.9453,0,0,0.75,0,0)" width="169.264"/>
 </svg>
 <svg atv:refpx="985.001" atv:refpy="360.01" height="30" id="modify_script" transform="matrix(2.4375,0,0,1.3333,0,0)" width="160" x="324.103" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="255.006">
  <atv:argument name="tabIndex" value="16"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="386"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.4103,0,0,0.75,0,0)" x="355.5" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.4103,0,0,0.75,0,0)" width="388"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.4103,0,0,0.75,0,0)" width="390"/>
 </svg>
 <svg atv:refpx="985.491" atv:refpy="300.5" height="30" id="prevention_script" transform="matrix(2.4375,0,0,1.3333,0,0)" width="160" x="324.306" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="210.375">
  <atv:argument name="tabIndex" value="14"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="386"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.4103,0,0,0.75,0,0)" x="355.5" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.4103,0,0,0.75,0,0)" width="388"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.4103,0,0,0.75,0,0)" width="390"/>
 </svg>
 <svg atv:refpx="220.5" atv:refpy="300.5" height="30" id="max_time_shelved" transform="matrix(0.625,0,0,1.3333,0,0)" width="160" x="272.8" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_value" y="210.375">
  <atv:argument name="min" value="0"/>
  <atv:argument name="tooltip" value="T{Value in seconds}"/>
  <atv:argument name="tabIndex" value="13"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite id="clickarea_dec" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="clickarea_inc" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="input_label" transform="matrix(1.6,0,0,0.75,0,0)" x="65.5" y="25.249"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="37.999" id="id_0" transform="matrix(1.6,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="bg" transform="matrix(1.6,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="220.5" atv:refpy="360.5" height="30" id="on_delay" transform="matrix(0.625,0,0,1.3333,0,0)" width="160" x="272.8" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_value" y="255.375">
  <atv:argument name="min" value="0"/>
  <atv:argument name="tooltip" value="T{Value in seconds}"/>
  <atv:argument name="tabIndex" value="15"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite id="clickarea_dec" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="clickarea_inc" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="input_label" transform="matrix(1.6,0,0,0.75,0,0)" x="65.5" y="25.249"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="37.999" id="id_0" transform="matrix(1.6,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="bg" transform="matrix(1.6,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="220.5" atv:refpy="420.5" height="30" id="off_delay" transform="matrix(0.625,0,0,1.3333,0,0)" width="160" x="272.8" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_value" y="300.375">
  <atv:argument name="min" value="0"/>
  <atv:argument name="tooltip" value="T{Value in seconds}"/>
  <atv:argument name="tabIndex" value="17"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite id="clickarea_dec" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="clickarea_inc" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="input_label" transform="matrix(1.6,0,0,0.75,0,0)" x="65.5" y="25.249"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="37.999" id="id_0" transform="matrix(1.6,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="bg" transform="matrix(1.6,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="1160.525" atv:refpy="660.799" height="30" id="btn_safe" transform="matrix(2,0,0,1.3531,0,0)" width="80" x="540.25" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="473.357">
  <atv:argument name="label" value="T{Save}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="21"/>
  <atv:overwrite height="38.593" id="id_6" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="31.796"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="16.796"/>
  <atv:overwrite id="button_label" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="24.796"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="35.119"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="13.786"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5,0,0,0.739,0,0)" x="70" y="10.296"/>
  <atv:overwrite height="36.593" id="button_stroke" transform="matrix(0.5,0,0,0.739,0,0)" width="156"/>
  <atv:overwrite height="38.593" id="button_bg" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite height="40.593" id="outer_frame" transform="matrix(0.5,0,0,0.739,0,0)" width="160"/>
 </svg>
 <svg atv:refpx="980" atv:refpy="660.297" height="30" id="btn_cancel" transform="matrix(2,0,0,1.3531,0,0)" width="80" x="450" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="472.988">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="19"/>
  <atv:overwrite height="38.593" id="id_6" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="31.796"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="16.796"/>
  <atv:overwrite id="button_label" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="24.796"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="35.12"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="13.786"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5,0,0,0.739,0,0)" x="70" y="10.296"/>
  <atv:overwrite height="36.593" id="button_stroke" transform="matrix(0.5,0,0,0.739,0,0)" width="156"/>
  <atv:overwrite height="38.593" id="button_bg" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite height="40.593" id="outer_frame" transform="matrix(0.5,0,0,0.739,0,0)" width="160"/>
 </svg>
 <svg atv:refpx="1212.775" atv:refpy="300.47" height="30" id="btn_clear_prev" transform="matrix(0.6937,0,0,1.3333,0,0)" width="80" x="1708.108" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="210.375">
  <atv:argument name="label" value="T{Clear}"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite id="button_label_2" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(1.4414,0,0,0.75,0,0)" x="17.75" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(1.4414,0,0,0.75,0,0)" width="51.5"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(1.4414,0,0,0.75,0,0)" width="55.5"/>
 </svg>
 <svg atv:refpx="1212.751" atv:refpy="360.499" height="30" id="btn_clear_mod" transform="matrix(0.6937,0,0,1.3333,0,0)" width="80" x="1708.108" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="255.375">
  <atv:argument name="label" value="T{Clear}"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite id="button_label_2" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(1.4414,0,0,0.75,0,0)" x="17.75" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(1.4414,0,0,0.75,0,0)" width="51.5"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(1.4414,0,0,0.75,0,0)" width="55.5"/>
 </svg>
 <svg atv:refpx="1160.025" atv:refpy="660.3" height="30" id="btn_create" transform="matrix(2,0,0,1.3531,0,0)" width="80" x="540" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="472.988">
  <atv:argument name="label" value="T{Create}"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="tabIndex" value="20"/>
  <atv:overwrite height="38.593" id="id_6" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="31.796"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="16.796"/>
  <atv:overwrite id="button_label" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="24.796"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="35.12"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="13.786"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5,0,0,0.739,0,0)" x="70" y="10.296"/>
  <atv:overwrite height="36.593" id="button_stroke" transform="matrix(0.5,0,0,0.739,0,0)" width="156"/>
  <atv:overwrite height="38.593" id="button_bg" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite height="40.593" id="outer_frame" transform="matrix(0.5,0,0,0.739,0,0)" width="160"/>
 </svg>
 <svg atv:refpx="50.5" atv:refpy="40.5" height="60" id="id_15" width="60" x="20.5" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Symbols.60x60.alarm" y="10.5"/>
 <text atv:refpx="156.5" atv:refpy="54" fill="$FONTCOLOR$" font-family="Arial" font-size="48" id="label_name" x="105.5" y="60">Name of Alarm</text>
 <text atv:refpx="1059.772" atv:refpy="60" fill="$FONTCOLOR$" font-family="Arial" font-size="22" id="id_13" x="1035" y="64.5">T{Type}:</text>
 <text atv:refpx="1171.5" atv:refpy="57" fill="$FONTCOLOR$" font-family="Arial" font-size="22" id="label_type" x="1104.5" y="64.5">Type of Alarm</text>
 <text atv:refpx="87.5" atv:refpy="119.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_18" x="45" y="125.5">T{Category}:</text>
 <text atv:refpx="101.5" atv:refpy="239.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_19" x="45" y="245.5">T{To active Text}:</text>
 <text atv:refpx="111" atv:refpy="299.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_21" x="45" y="305.5">T{Max. timeshelve}:</text>
 <text atv:refpx="86" atv:refpy="359.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_22" x="45" y="365.5">T{Delay on}:</text>
 <text atv:refpx="86" atv:refpy="419.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_23" x="45" y="425.5">T{Delay off}:</text>
 <text atv:refpx="706" atv:refpy="239.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_24" x="645" y="245.5">T{To inactive text}:</text>
 <text atv:refpx="713.5" atv:refpy="299.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_25" x="645" y="305.5">T{Prevention script}:</text>
 <text atv:refpx="719" atv:refpy="359.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_27" x="645" y="365.5">T{Modification script}:</text>
 <text atv:refpx="746" atv:refpy="418.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_29" x="645" y="424.5">T{Explicit Acknowledgement}:</text>
 <g atv:refpx="330" atv:refpy="180" id="group_discrete">
  <svg atv:refpx="519.979" atv:refpy="180.004" height="30" id="value" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="336" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="120.003">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="allowDirectInput" value="Yes"/>
   <atv:argument name="tabIndex" value="4"/>
   <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
   <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
   <atv:overwrite id="input_label" transform="matrix(0.8,0,0,0.75,0,0)" x="192.055" y="24.464"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
  </svg>
  <svg atv:refpx="350" atv:refpy="180.004" height="30" id="value_compare" transform="matrix(0.375,0,0,1.3333,0,0)" width="160" x="853.333" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="120.003">
   <atv:argument name="text1" value="T{==}"/>
   <atv:argument name="text1value" value="=="/>
   <atv:argument name="text2" value="T{!=}"/>
   <atv:argument name="text2value" value="!="/>
   <atv:argument name="tabIndex" value="3"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(2,0,0,0.75,0,0)" width="76"/>
   <atv:overwrite id="button_stroke" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(2,0,0,0.75,0,0)" x="55" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(2,0,0,0.75,0,0)" x="45.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(2,0,0,0.75,0,0)" width="78"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(2,0,0,0.75,0,0)" width="80"/>
  </svg>
  <svg atv:refpx="235" atv:refpy="180.004" height="30" id="combobox_value" transform="matrix(0.8125,0,0,1.3333,0,0)" width="160" x="209.231" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="120.003">
   <atv:argument name="text1" value="T{Value}"/>
   <atv:argument name="text1value" value="Value"/>
   <atv:argument name="text2" value="T{Node absolute}"/>
   <atv:argument name="text2value" value="Node absolute"/>
   <atv:argument name="text3" value="T{Node relative}"/>
   <atv:argument name="text3value" value="Node relative"/>
   <atv:argument name="tabIndex" value="2"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.2308,0,0,0.75,0,0)" width="126"/>
   <atv:overwrite id="button_stroke" transform="matrix(1.2308,0,0,0.75,0,0)" x="105" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(1.2308,0,0,0.75,0,0)" x="105" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(1.2308,0,0,0.75,0,0)" x="105" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(1.2308,0,0,0.75,0,0)" x="95.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.2308,0,0,0.75,0,0)" width="98"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(1.2308,0,0,0.75,0,0)" width="98"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(1.2308,0,0,0.75,0,0)" width="128"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(1.2308,0,0,0.75,0,0)" width="130"/>
  </svg>
  <text atv:refpx="65.5" atv:refpy="179.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_30" x="45" y="185.5">T{Value}:</text>
  <svg atv:refpx="410" atv:refpy="180" height="30" id="nodeselect_discrete" transform="matrix(0.25,0,0,1.3333,0,0)" width="80" x="1600" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="120">
   <atv:argument name="label" value="T{...}"/>
   <atv:overwrite height="38" id="id_6" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite id="button_label_2" transform="matrix(4,0,0,0.75,0,0)" x="10" y="31.5"/>
   <atv:overwrite id="button_label_1" transform="matrix(4,0,0,0.75,0,0)" x="10" y="16.5"/>
   <atv:overwrite id="button_label" transform="matrix(4,0,0,0.75,0,0)" x="10" y="24.5"/>
   <atv:overwrite id="button_symbol_bottom" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="34.625"/>
   <atv:overwrite id="button_symbol_top" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="13.292"/>
   <atv:overwrite id="button_symbol" transform="matrix(4,0,0,0.75,0,0)" x="0" y="10"/>
   <atv:overwrite height="36" id="button_stroke" transform="matrix(4,0,0,0.75,0,0)" width="16"/>
   <atv:overwrite height="38" id="button_bg" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite height="40" id="outer_frame" transform="matrix(4,0,0,0.75,0,0)" width="20"/>
  </svg>
 </g>
 <g atv:refpx="640" atv:refpy="180" id="group_limit" transform="matrix(1,0,0,1,0,-340)">
  <svg atv:refpx="1173.781" atv:refpy="569.038" height="30" id="upper_limit" transform="matrix(1.125,0,0,1.3333,0,0)" width="160" x="942.222" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="375.009">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="tabIndex" value="10"/>
   <atv:overwrite id="input_label" transform="matrix(0.8889,0,0,0.75,0,0)" x="172.055" y="24.465"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="176"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8889,0,0,0.75,0,0)" width="178"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8889,0,0,0.75,0,0)" width="180"/>
  </svg>
  <svg atv:refpx="350" atv:refpy="-29.993" height="30" id="lower_limit_compare" transform="matrix(0.375,0,0,1.3333,0,0)" width="160" x="853.333" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument name="text1" value="T{>}"/>
   <atv:argument name="text1value" value=">"/>
   <atv:argument name="text2" value="T{>=}"/>
   <atv:argument name="text2value" value=">="/>
   <atv:argument name="tabIndex" value="6"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(2.6667,0,0,0.75,0,0)" width="56"/>
   <atv:overwrite id="button_stroke" transform="matrix(2.6667,0,0,0.75,0,0)" x="35" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(2.6667,0,0,0.75,0,0)" x="35" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(2.6667,0,0,0.75,0,0)" x="35" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(2.6667,0,0,0.75,0,0)" x="25.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(2.6667,0,0,0.75,0,0)" width="28"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(2.6667,0,0,0.75,0,0)" width="28"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(2.6667,0,0,0.75,0,0)" width="58"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(2.6667,0,0,0.75,0,0)" width="60"/>
  </svg>
  <svg atv:refpx="982" atv:refpy="240" height="30" id="upper_limit_compare" transform="matrix(0.5,0,0,1.3333,0,0)" width="160" x="1880" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument value="T{&lt;}" name="text1"/>
   <atv:argument value="&lt;" name="text1value"/>
   <atv:argument value="T{&lt;=}" name="text2"/>
   <atv:argument value="&lt;=" name="text2value"/>
   <atv:argument name="tabIndex" value="9"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(2,0,0,0.75,0,0)" width="76"/>
   <atv:overwrite id="button_stroke" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(2,0,0,0.75,0,0)" x="55" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(2,0,0,0.75,0,0)" x="45.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(2,0,0,0.75,0,0)" width="78"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(2,0,0,0.75,0,0)" width="80"/>
  </svg>
  <svg atv:refpx="545.423" atv:refpy="-15.961" height="30" id="lower_limit" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="336" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="375.009">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="tabIndex" value="7"/>
   <atv:overwrite id="input_label" transform="matrix(0.8889,0,0,0.75,0,0)" x="172.055" y="24.465"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="176"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8889,0,0,0.75,0,0)" width="178"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8889,0,0,0.75,0,0)" width="180"/>
  </svg>
  <svg atv:refpx="235.53" atv:refpy="190.005" height="30" id="combobox_lower_limit" transform="matrix(0.8188,0,0,1.3333,0,0)" width="160" x="207.621" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument name="text1" value="T{Value}"/>
   <atv:argument name="text1value" value="Value"/>
   <atv:argument name="text2" value="T{Node absolute}"/>
   <atv:argument name="text2value" value="Node absolute"/>
   <atv:argument name="text3" value="T{Node relative}"/>
   <atv:argument name="text3value" value="Node relative"/>
   <atv:argument name="tabIndex" value="5"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.2213,0,0,0.75,0,0)" width="127.008"/>
   <atv:overwrite id="button_stroke" transform="matrix(1.2213,0,0,0.75,0,0)" x="106.008" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(1.2213,0,0,0.75,0,0)" x="106.008" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(1.2213,0,0,0.75,0,0)" x="106.008" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(1.2213,0,0,0.75,0,0)" x="96.508" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.2213,0,0,0.75,0,0)" width="99.008"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(1.2213,0,0,0.75,0,0)" width="99.008"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(1.2213,0,0,0.75,0,0)" width="129.008"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(1.2213,0,0,0.75,0,0)" width="131.008"/>
  </svg>
  <svg atv:refpx="853.969" atv:refpy="190.005" height="30" id="combobox_upper_limit" transform="matrix(0.8004,0,0,1.3333,0,0)" width="160" x="987.006" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument name="text1" value="T{Value}"/>
   <atv:argument name="text1value" value="Value"/>
   <atv:argument name="text2" value="T{Node absolute}"/>
   <atv:argument name="text2value" value="Node absolute"/>
   <atv:argument name="text3" value="T{Node relative}"/>
   <atv:argument name="text3value" value="Node relative"/>
   <atv:argument name="tabIndex" value="8"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.2494,0,0,0.75,0,0)" width="124.064"/>
   <atv:overwrite id="button_stroke" transform="matrix(1.2494,0,0,0.75,0,0)" x="103.064" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(1.2494,0,0,0.75,0,0)" x="103.064" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(1.2494,0,0,0.75,0,0)" x="103.064" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(1.2494,0,0,0.75,0,0)" x="93.564" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.2494,0,0,0.75,0,0)" width="96.064"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(1.2494,0,0,0.75,0,0)" width="96.064"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(1.2494,0,0,0.75,0,0)" width="126.064"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(1.2494,0,0,0.75,0,0)" width="128.064"/>
  </svg>
  <text atv:refpx="668.006" atv:refpy="519.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_32" x="645" y="525.5">T{To Value}:</text>
  <text atv:refpx="78.126" atv:refpy="519.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_33" x="45" y="525.5">T{From Value}:</text>
  <svg atv:refpx="410" atv:refpy="520" height="30" id="nodeselect_lower" transform="matrix(0.25,0,0,1.3333,0,0)" width="80" x="1584" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="375.009">
   <atv:argument name="label" value="T{...}"/>
   <atv:overwrite height="37.999" id="id_6" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite id="button_label_2" transform="matrix(4,0,0,0.75,0,0)" x="10" y="31.499"/>
   <atv:overwrite id="button_label_1" transform="matrix(4,0,0,0.75,0,0)" x="10" y="16.499"/>
   <atv:overwrite id="button_label" transform="matrix(4,0,0,0.75,0,0)" x="10" y="24.499"/>
   <atv:overwrite id="button_symbol_bottom" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="34.624"/>
   <atv:overwrite id="button_symbol_top" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="13.291"/>
   <atv:overwrite id="button_symbol" transform="matrix(4,0,0,0.75,0,0)" x="0" y="9.999"/>
   <atv:overwrite height="35.999" id="button_stroke" transform="matrix(4,0,0,0.75,0,0)" width="16"/>
   <atv:overwrite height="37.999" id="button_bg" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite height="39.999" id="outer_frame" transform="matrix(4,0,0,0.75,0,0)" width="20"/>
  </svg>
  <svg atv:refpx="1050" atv:refpy="520" height="30" id="nodeselect_upper" transform="matrix(0.25,0,0,1.3333,0,0)" width="80" x="4160" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="375.009">
   <atv:argument name="label" value="T{...}"/>
   <atv:overwrite height="37.999" id="id_6" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite id="button_label_2" transform="matrix(4,0,0,0.75,0,0)" x="10" y="31.499"/>
   <atv:overwrite id="button_label_1" transform="matrix(4,0,0,0.75,0,0)" x="10" y="16.499"/>
   <atv:overwrite id="button_label" transform="matrix(4,0,0,0.75,0,0)" x="10" y="24.499"/>
   <atv:overwrite id="button_symbol_bottom" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="34.624"/>
   <atv:overwrite id="button_symbol_top" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="13.291"/>
   <atv:overwrite id="button_symbol" transform="matrix(4,0,0,0.75,0,0)" x="0" y="9.999"/>
   <atv:overwrite height="35.999" id="button_stroke" transform="matrix(4,0,0,0.75,0,0)" width="16"/>
   <atv:overwrite height="37.999" id="button_bg" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite height="39.999" id="outer_frame" transform="matrix(4,0,0,0.75,0,0)" width="20"/>
  </svg>
 </g>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var name = webMI.query.name;
var address = webMI.query.address;
var isMod = webMI.query.isMod === "true";
var isDiscrete = webMI.query.isDiscrete === "true";
var parentAddress = webMI.query.currLocation;
var parentDataType;
webMI.data.read(parentAddress, function(e) {
	parentDataType = typeof e.value;
});
var config;
var alarmName = webMI.query.alarmName;
var conditionType = webMI.query.conditionType;
var gAccessControlManager;
var datafilled = false;
//states for the writing to variant in server script
var stateValue;
var stateLower;
var stateUpper;
var statesObj;
if(isDiscrete){
	stateValue = "Value";
}else{
	stateLower = "Value";
	stateUpper = "Value";
}

/**
 ** loads Access Controll if isnt
 **/
if (webMI.getAccessControlSupport()) {
	gAccessControlManager = webMI.callExtension("SYSTEM.LIBRARY.ATVISE.QUICKDYNAMICS.Access Control Manager");
}

/**
 ** Access Controll Handler
 **/
function handleAccessControlResponse(compareRights, successCallback, failCallback) {
	if (!gAccessControlManager) {
		successCallback();
		return;
	}
	
	var requiredRights = {
		nodeIds: [],
		rights: []
	};
	
	compareRights = [].concat(compareRights);
	compareRights.forEach(function(r) {
		requiredRights.nodeIds.push(r.node);
		requiredRights.rights.push(r.right);
	});

	gAccessControlManager.getRightsDict(requiredRights.nodeIds, requiredRights.rights, function(response) {
		// do the checks
		var allRights = true;

		for (var c in compareRights) {
			if (
				typeof response[compareRights[c].node] != "undefined" &&
				typeof response[compareRights[c].node][compareRights[c].right] != "undefined"
			) {
				allRights = allRights && response[compareRights[c].node][compareRights[c].right];
			} else {
				allRights = false;
				break;
			}
		}
		if (allRights) {
			successCallback();
		} else {
			failCallback();
		}
	});
}

/**
 ** if no rights to engineer disable all fileds so read only
 **/
handleAccessControlResponse([{ node: parentAddress, right: "engineer" },{ node: "AGENT.ALARMING", right: "read" }], function() {}, function() {
		webMI.trigger.fire("com.atvise.setActive", false, "value_compare");
		webMI.trigger.fire("com.atvise.setActive", false, "value");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_value");	
		webMI.trigger.fire("com.atvise.setActive", false, "nodeselect_discrete");
		webMI.trigger.fire("com.atvise.setActive", false, "lower_limit");
		webMI.trigger.fire("com.atvise.setActive", false, "lower_limit_compare");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_lower_limit");		
		webMI.trigger.fire("com.atvise.setActive", false, "nodeselect_lower");
		webMI.trigger.fire("com.atvise.setActive", false, "upper_limit");
		webMI.trigger.fire("com.atvise.setActive", false, "upper_limit_compare");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_upper_limit");		
		webMI.trigger.fire("com.atvise.setActive", false, "nodeselector_upper");
		webMI.trigger.fire("com.atvise.setActive", false, "active_message");
		webMI.trigger.fire("com.atvise.setActive", false, "inactive_message");
		webMI.trigger.fire("com.atvise.setActive", false, "explicit_acknowledgement");
		webMI.trigger.fire("com.atvise.setActive", false, "max_time_shelved");
		webMI.trigger.fire("com.atvise.setActive", false, "on_delay");
		webMI.trigger.fire("com.atvise.setActive", false, "off_delay");
		webMI.trigger.fire("com.atvise.setActive", false, "modify_script");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_clear_mod");
		webMI.trigger.fire("com.atvise.setActive", false, "prevention_script");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_clear_prev");
		webMI.trigger.fire("com.atvise.setActive", false, "category");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_safe");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_create");
	}
);

/**
 ** Create empty config for adding a new alarmcondition 
 **/
if(!isMod){
	var add_to_config;
	config = {
			active_message: {"":""},
			inactive_message: {"":""},
			explicit_acknowledgement: false,
			max_time_shelved: 0,
			on_delay: 0,
			off_delay: 0,
			prevention_script: "",
			modify_script: "",
			category: "Error",
		}
	if(conditionType === "Discrete" || conditionType === "Retrigger"){
		isDiscrete = true;
		add_to_config = {
			value: null,
			value_compare: "==",		
		}
	}else{
		add_to_config = {
			lower_limit: null,
			lower_limit_compare: ">",
			lower_limit_deadband: null,
			upper_limit: null,
			upper_limit_compare: "<",
			upper_limit_deadband: null,
		}
	}
	config = {...config, ...add_to_config};
}

/**
 ** Function loads the config from the condition
 **/
function getCondition(){
	return new Promise((resolve) => {
		webMI.data.call("GetConditions",{"address":address, "justOneConfig":true},function (e){
			config = e;
			resolve();
		});
	})
}

/**
 ** Function to parse xml to relative path - for Node relative comparison
 **/
function xmlToPointNotation(xmlString) {
    const parser = new DOMParser();
    const xmlDoc = parser.parseFromString(xmlString, "text/xml");
    const elements = xmlDoc.getElementsByTagName("RelativePathElement");
    let result = "";
    for (let element of elements) {
        const name = element.querySelector("Name").textContent;
        result += `.${name}`;
    }
    return result;
}

/**
 ** get the state from the value (Node absolute, Node relative, Value) and change data in correct form
 **/
function getState(input){
	var state;
	input = typeof input === "boolean" ? input.toString() : input;
	if(input){
		if(input.toString().startsWith("ns=1;s")){
			state = "Node absolute";
			input = input.replace("ns=1;s=", "");
		}else if(input.toString().trim().startsWith("<") && input.toString().trim().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(input.toString().trim())){
			state = "Node relative";
			input = xmlToPointNotation(input)
		}else{
			state = "Value";
		}
	}else{
		state = input === null ? "Value": undefined;
	}
	return {state: state, changed: input}
}

/**
 ** Function fills all the field from config
 **/
function fillForm(config){
	if(isDiscrete){
		//set value fields visible and vanish limit fields
		webMI.gfx.setVisible("group_limit", false);
		webMI.gfx.setVisible("group_discrete", null);
		//sets value fields from config
		var TMPvalue = getState(config.value);
		webMI.trigger.fire("setSelectedItem", config.value_compare, "value_compare");
		config.value = TMPvalue.changed;
		webMI.trigger.fire("setSelectedItem", "T{" + TMPvalue.state + "}", "combobox_value");
		webMI.trigger.fire("setValue", config.value, "value");
		if(TMPvalue.state !== "Value"){
			webMI.gfx.setVisible("nodeselect_discrete", null);
		}else{
			webMI.gfx.setVisible("nodeselect_discrete", false);
		}
	}else{
		//set limit fields visible and vanish value fields
		webMI.gfx.setVisible("group_limit", null);
		webMI.gfx.setVisible("group_discrete", false);
		//sets lower limit fields
		var TMPlower = getState(config.lower_limit);
		webMI.trigger.fire("setSelectedItem", config.lower_limit_compare, "lower_limit_compare");
		config.lower_limit = TMPlower.changed;
		webMI.trigger.fire("setSelectedItem", "T{" + TMPlower.state + "}", "combobox_lower_limit");
		webMI.trigger.fire("setValue", config.lower_limit, "lower_limit");
		if(TMPlower.state !== "Value"){
			webMI.gfx.setVisible("nodeselect_lower", null);
		}else{
			webMI.gfx.setVisible("nodeselect_lower", false);
		}
		//sets upper limit fields
		var TMPupper = getState(config.upper_limit);
		webMI.trigger.fire("setSelectedItem", config.upper_limit_compare, "upper_limit_compare");
		config.upper_limit = TMPupper.changed;
		webMI.trigger.fire("setSelectedItem", "T{" + TMPupper.state + "}", "combobox_upper_limit");
		webMI.trigger.fire("setValue", config.upper_limit, "upper_limit");
		if(TMPupper.state !== "Value"){
			webMI.gfx.setVisible("nodeselect_upper", null);
		}else{
			webMI.gfx.setVisible("nodeselect_upper", false);
		}
	}
	webMI.trigger.fire("setValue", config.active_message[""], "active_message");
	webMI.trigger.fire("setValue", config.inactive_message[""], "inactive_message");
	webMI.trigger.fire("setChecked", config.explicit_acknowledgement, "explicit_acknowledgement");
	webMI.trigger.fire("setValue", config.max_time_shelved / 1000, "max_time_shelved"); // ms * 1000 = s
	webMI.trigger.fire("setValue", config.on_delay / 1000, "on_delay");
	webMI.trigger.fire("setValue", config.off_delay / 1000, "off_delay");
	if(config.modify_script !== "i=0"){
		webMI.trigger.fire("setSelectedItem", config.modify_script.split('.').pop(), "modify_script");
	}
	if(config.prevention_script !== "i=0"){
		webMI.trigger.fire("setSelectedItem", config.prevention_script.split('.').pop(), "prevention_script");
	}
	webMI.trigger.fire("setSelectedItem", config.category, "category");
	datafilled = true;
}

/**
 ** Presets the fields, that are always equal
 **/
webMI.gfx.setText("label_name", name);
webMI.gfx.setText("label_type", conditionType);
webMI.data.call("GetAlarmScripts", {type: "VariableTypes.ATVISE.ScriptCode.AlarmModification"}, function(entries){
	webMI.trigger.fire("setItems", entries, "modify_script");
});
webMI.data.call("GetAlarmScripts", {type: "VariableTypes.ATVISE.ScriptCode.AlarmPrevention"} ,function(entries){
	webMI.trigger.fire("setItems", entries, "prevention_script");
});
webMI.data.call("GetAlarmCategories", {} ,function(entries){
	webMI.trigger.fire("setItems", entries, "category");
});

/**
 ** show discrete fields / limit fields
 **/
if(isDiscrete){
	webMI.gfx.setVisible("group_limit", false);
	webMI.gfx.setVisible("group_discrete", null);
}else{
	webMI.gfx.setVisible("group_limit", null);
	webMI.gfx.setVisible("group_discrete", false);
}

/**
 ** Fill fields with data or initialize it empty
 **/
if(isMod){
	getCondition().then(() => {
		webMI.gfx.setVisible("btn_safe", null);
		webMI.gfx.setVisible("btn_create", false);
		fillForm(config);
	});
}else{
	webMI.gfx.setVisible("btn_safe", false);
	webMI.gfx.setVisible("btn_create", null);
	
	if(isDiscrete){
		webMI.trigger.fire("setSelectedItem", "==", "value_compare");
		webMI.trigger.fire("setValue", "", "value");
		webMI.trigger.fire("setSelectedItem", "T{Value}", "combobox_value");
		webMI.gfx.setVisible("nodeselect_discrete", false);
	}
	else{
		webMI.trigger.fire("setSelectedItem", ">", "lower_limit_compare");
		webMI.trigger.fire("setSelectedItem", "T{Value}", "combobox_lower_limit");
		webMI.trigger.fire("setValue", "", "lower_limit");
		webMI.gfx.setVisible("nodeselect_lower", false);
		webMI.trigger.fire("setSelectedItem", "<", "upper_limit_compare");
		webMI.trigger.fire("setSelectedItem", "T{Value}", "combobox_upper_limit");		
		webMI.trigger.fire("setValue", "", "upper_limit");
		webMI.gfx.setVisible("nodeselect_upper", false);
	}
	webMI.trigger.fire("setChecked", false, "explicit_acknowledgement");
	webMI.trigger.fire("setSelectedItem", "Error", "category");
}

/**
 ** checkfunction for the value input
 **/
function checkInputType(input,type = ""){
	if(input !== undefined){
		if(input.length > 0){
			if(input !== "null" && input !== null){
				if(type === "Value"){
					if(parentDataType === "boolean"){
						switch(input){
								case "true":
								case "false":
								case "0":
								case "1":
								case "TRUE":
								case "FALSE":
									return true;
									break;
								default:
									return false;
									break;
						}
					}else if(parentDataType === "number"){
						const numberRegex = /^-?\d+(\.\d+)?$/;
						return numberRegex.test(input.trim());
					}else if(parentDataType === "string"){
						if(input.length > 0){
							return true;	
						}else{
							return false;		
						}
					}
				}else{
					return true;				
				}
			}else{
				return true;
			}
		}
	}
	return false;
}

/**
 ** trigger called from selector
 **/
webMI.trigger.connect("getTargetAddress", function(e) {
	var targetAddress = e.value.targetAddress;
	if(e.value.state === "Node absolute"){
		webMI.trigger.fire("setValue", targetAddress, e.value.id);
	}else if(e.value.state === "Node relative"){
		webMI.trigger.fire("setValue", targetAddress.replace(parentAddress, ""), e.value.id)
	}
});

/**
 ** function opens nodeselector for path
 */
function openNodeSelector(value, id, state){
	var title = "T{Select node:}";
	if(!datafilled && isMod) return;
	if(value === "Value"){
		return;
	}else if(value === "Node absolute"){
		webMI.query.startAddress = "";
	}else if(value === "Node relative"){
		webMI.query.startAddress = parentAddress;
	}
	webMI.query.isCopy = false;
	webMI.query.newTriggerName = "getTargetAddress";
	webMI.query.id = id;
	webMI.query.state = state;			
	webMI.display.openWindow({
		display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.selector",
		height: 580, width: 380, remember: true, title: title,
		modal: true, resizable: false, movable: true,
		scrollbars: true, menubar: false, status: false, toolbar: false, query:webMI.query
	});
}

/**
 ** Value changed write to config
 **/
if(isDiscrete){
	//opens nodeselector for path
	webMI.trigger.connect("valuechanged", function(e) {
		stateValue = e.value;
		openNodeSelector(e.value, "value", stateValue);
		if(e.value !== "Value"){
			webMI.gfx.setVisible("nodeselect_discrete", null);
		}else{
			webMI.gfx.setVisible("nodeselect_discrete", false);
		}
	}, "combobox_value");

	//value_compare
	webMI.trigger.connect("valuechanged", function(e) { config.value_compare = e.value; }, "value_compare");
	
	//value check and coler if wrong
	webMI.trigger.connect("valuechanged", function(e) {
		e.value = webMI.secureString(e.value);
		config.value = e.value;
		if(checkInputType(e.value, stateValue)){
			if(webMI.gfx.getStroke("value") !== null){
				webMI.gfx.setStroke("value", null);
			}
			correct = false;
		}else{
			webMI.gfx.setStroke("value", "#ff0000");
			correct = false;
		}
	}, "value");
}else{
	//lower_limit opens nodeselector for path
	webMI.trigger.connect("valuechanged", function(e) {
		stateLower = e.value;
		openNodeSelector(e.value,"lower_limit",stateLower);
		if(e.value !== "Value"){
			webMI.gfx.setVisible("nodeselect_lower", null);
		}else{
			webMI.gfx.setVisible("nodeselect_lower", false);
		}
	}, "combobox_lower_limit");
	
	//lower_limit check and coler if wrong
	webMI.trigger.connect("valuechanged", function(e) {
		e.value = webMI.secureString(e.value);
		config.lower_limit = e.value;
		if(checkInputType(e.value,stateLower)){
			if(webMI.gfx.getStroke("lower_limit") !== null){
				webMI.gfx.setStroke("lower_limit", null);
			}
			correct = false;
		}else{
			webMI.gfx.setStroke("lower_limit", "#ff0000");
			correct = false;
		}
	}, "lower_limit");
	
	//lower_limit_compare
	webMI.trigger.connect("valuechanged", function(e) { config.lower_limit_compare = e.value; }, "lower_limit_compare");
	
	//opens nodeselector for path
	webMI.trigger.connect("valuechanged", function(e) {
		stateUpper = e.value;
		openNodeSelector(e.value, "upper_limit", stateUpper);
		if(e.value !== "Value"){
			webMI.gfx.setVisible("nodeselect_upper", null);
		}else{
			webMI.gfx.setVisible("nodeselect_upper", false);
		}
	}, "combobox_upper_limit");
	
	//upper_limit check and coler if wrong
	webMI.trigger.connect("valuechanged", function(e) {
		e.value = webMI.secureString(e.value);
		config.upper_limit = e.value;
		if(checkInputType(e.value, stateUpper)){
			if(webMI.gfx.getStroke("upper_limit") !== null){
				webMI.gfx.setStroke("upper_limit", null);
			}
			correct = false;
		}else{
			webMI.gfx.setStroke("upper_limit", "#ff0000");
			correct = false;
		}
	}, "upper_limit");
	
	//upper_limit_compare
	webMI.trigger.connect("valuechanged", function(e) { config.upper_limit_compare = e.value; }, "upper_limit_compare");
}

/**
 ** Buttons (...) onclicks open nodeselector
 **/
webMI.trigger.connect("clicked", function(){
	webMI.trigger.fire("getSelectedItem", function(e){
		openNodeSelector(e.value, "value", stateValue);
	},"combobox_value");
}, "nodeselect_discrete");

webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("getSelectedItem", function(e){
		openNodeSelector(e.value, "lower_limit", stateLower);
	},"combobox_lower_limit");
}, "nodeselect_lower");

webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("getSelectedItem", function(e){
		openNodeSelector(e.value, "upper_limit", stateUpper);
	},"combobox_upper_limit");
}, "nodeselect_upper");

//active_message
webMI.trigger.connect("valuechanged", function(e) {
	e.value = webMI.secureString(e.value);
	config.active_message[""] = e.value;
}, "active_message");
//inactive_message
webMI.trigger.connect("valuechanged", function(e) {
	e.value = webMI.secureString(e.value); 
	config.inactive_message[""] = e.value;
}, "inactive_message");
//explicit_acknowledgement
webMI.trigger.connect("valuechanged", function(e) { config.explicit_acknowledgement = e.value; }, "explicit_acknowledgement");
//max_time_shelved
webMI.trigger.connect("valuechanged", function(e) { config.max_time_shelved = e.value; }, "max_time_shelved");
//on_delay
webMI.trigger.connect("valuechanged", function(e) { config.on_delay = e.value; }, "on_delay");
//off_delay
webMI.trigger.connect("valuechanged", function(e) { config.off_delay = e.value; }, "off_delay");
//modify_script
webMI.trigger.connect("valuechanged", function(e) {
	if(e.value === "") {
		config.modify_script = "i=0"
	}else{
		config.modify_script = "ns=1;s=" + e.value;
	}
}, "modify_script");
webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("setSelectedItem", "", "modify_script");
}, "btn_clear_mod");
//prevention_script
webMI.trigger.connect("valuechanged", function(e) {
	if(e.value === "") {
		config.prevention_script = "i=0"
	}else{
		config.prevention_script = "ns=1;s=" + e.value;
	}
}, "prevention_script");
webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("setSelectedItem", "", "prevention_script");
}, "btn_clear_prev");
//category
webMI.trigger.connect("valuechanged", function(e) {
	setTimeout(() => {
		webMI.trigger.fire("getSelectedItem", function(e){config.category = e.text},"category");
	}, "500");
}, "category");

/**
 ** button cancel clicked, close window
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.display.closeWindow();
	if(!isMod)
	webMI.trigger.fire("closeAddPage");
}, "btn_cancel");

/**
 ** checks the value again and calls script EditCondition
 **/
webMI.trigger.connect("clicked", function(e){
	if(checkInputType(config.value, stateValue) || checkInputType(config.lower_limit, stateLower) || checkInputType(config.upper_limit,stateUpper)){
		stateObj = {value:stateValue, lower_limit:stateLower, upper_limit:stateUpper};
		webMI.data.call("EditCondition", {address:address, config:JSON.stringify(config), isDiscrete:isDiscrete, parentAddress:parentAddress, parentDataType:parentDataType, states:JSON.stringify(stateObj)} ,function(){});
		setTimeout(() => {
			webMI.display.closeWindow();
			webMI.trigger.fire(webMI.query.triggerName);
		}, "100");
	}
}, "btn_safe");

/**
 ** calls the script AddCondition
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.data.call("AddCondition", {
		newConfig:webMI.query.newConfig, //Bool
		alarmName:webMI.query.alarmName,//newAlarm
		conditionName:name,	//condition Name 1
		conditionType:webMI.query.conditionType, //Discrete
		config:JSON.stringify(config), //Obj mit werten
		parentDataType:parentDataType, //Datentyp des Parents
		address:parentAddress,
		states:JSON.stringify({value:stateValue,lower_limit:stateLower,upper_limit:stateUpper})
	} ,function(){});
	setTimeout(() => {
		webMI.display.closeWindow();
		webMI.trigger.fire(webMI.query.triggerName);
		webMI.trigger.fire("closeAddPage");
	}, "200");
}, "btn_create");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.selector" BrowseName="1:selector" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">selector</DisplayName>
		<Description Locale="en">selector</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="520" version="1.2" width="380" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <title>Selector Dialog</title>
 <metadata>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <foreignObject height="330" id="address_treeview_copy" width="320" x="30" y="30">
  <div id="address_treeview_copy" style="width:100%;height:100%" xmlns="http://www.w3.org/1999/xhtml"/>
 </foreignObject>
 <svg atv:refpx="310" atv:refpy="480.009" height="30" id="btn_copy" transform="matrix(1.25,0,0,1.3333,0,0)" width="80" x="208" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="345.009">
  <atv:argument name="label" value="T{Copy}"/>
  <atv:argument name="tabIndex" value="4"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,0.75,0,0)" x="40" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="190" atv:refpy="480.009" height="30" id="btn_cancel" transform="matrix(1.25,0,0,1.3333,0,0)" width="80" x="112" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="345.009">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="tabIndex" value="2"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,0.75,0,0)" x="40" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="310" atv:refpy="480.009" height="30" id="btn_select" transform="matrix(1.25,0,0,1.3333,0,0)" width="80" x="208" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="345.009">
  <atv:argument name="label" value="T{Select}"/>
  <atv:argument name="tabIndex" value="3"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,0.75,0,0)" x="40" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="100"/>
 </svg>
 <g atv:refpx="190" atv:refpy="410" id="group_name">
  <svg atv:refpx="249.976" atv:refpy="410.006" height="30" id="conf_name" transform="matrix(1.375,0,0,1.3333,0,0)" width="160" x="101.818" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="292.507">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="allowDirectInput" value="Yes"/>
   <atv:argument name="tabIndex" value="1"/>
   <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
   <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
   <atv:overwrite id="input_label" transform="matrix(0.7273,0,0,0.75,0,0)" x="212.055" y="24.465"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.7273,0,0,0.75,0,0)" width="212"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.7273,0,0,0.75,0,0)" width="216"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.7273,0,0,0.75,0,0)" width="212"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.7273,0,0,0.75,0,0)" width="218"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.7273,0,0,0.75,0,0)" width="220"/>
  </svg>
  <text atv:refpx="79" atv:refpy="409.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_19" x="25" y="415.5">T{Alarm Name}:</text>
 </g>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var id_treeview_copy = document.getElementById("address_treeview_copy").id;
var treeViewCopy;
var targetAddress = "";
var gAccessControlManager;
var isCopy = webMI.query.isCopy === "true";
var startaddress = webMI.query.startAddress;
var triggerName = webMI.query.newTriggerName;
var id = webMI.query.id;
var state = webMI.query.state;
var alarmName;
var newConfig;

/**
 ** de/activates button select/copy depending from where the display is called
 **/
if(isCopy){
	webMI.gfx.setVisible("btn_select", false);
	webMI.gfx.setVisible("btn_copy", null);
	webMI.trigger.fire("com.atvise.setActive", false, "conf_name");
	webMI.gfx.setVisible("group_name", null);
	webMI.trigger.fire("com.atvise.setActive", false, "btn_copy");
}else{
	webMI.gfx.setVisible("btn_select", null);
	webMI.gfx.setVisible("btn_copy", false);
	webMI.gfx.setVisible("group_name", false);
	webMI.trigger.fire("com.atvise.setActive", false, "btn_select");
}


/**
 ** load Accesscontrol if not loaded
 **/
if (webMI.getAccessControlSupport()) {
	gAccessControlManager = webMI.callExtension("SYSTEM.LIBRARY.ATVISE.QUICKDYNAMICS.Access Control Manager");
}

/**
 ** Access Control handler
 **/
function handleAccessControlResponse(compareRights, successCallback, failCallback) {
	if (!gAccessControlManager) {
		successCallback();
		return;
	}
	
	
	var requiredRights = {
		nodeIds: [],
		rights: []
	};
	
	compareRights = [].concat(compareRights);
	compareRights.forEach(function(r) {
		requiredRights.nodeIds.push(r.node);
		requiredRights.rights.push(r.right);
	});

	gAccessControlManager.getRightsDict(requiredRights.nodeIds, requiredRights.rights, function(response) {
		// do the checks
		var allRights = true;

		for (var c in compareRights) {
			if (
				typeof response[compareRights[c].node] != "undefined" &&
				typeof response[compareRights[c].node][compareRights[c].right] != "undefined"
			) {
				allRights = allRights && response[compareRights[c].node][compareRights[c].right];
			} else {
				allRights = false;
				break;
			}
		}
		if (allRights) {
			successCallback();
		} else {
			failCallback();
		}
	});
}

/**
 ** Function to build the treeview
 **/
function buildTree(startaddress = "AGENT.OBJECTS", dataSource = "treeView/datasources/opcua.js", dataSourceType = "opcUA") {
	if(startaddress === "") startaddress = "AGENT.OBJECTS";
	treeViewCopy = webMI.callExtension("SYSTEM.LIBRARY.PROJECT.QUICKDYNAMICS.TreeView", {
		busyIndicatorTolerance: "100",
		expandoOffset: "3",
		imagePaths:
		'{"baseVariableImage":"/treeView/icons/baseVariable.svg","folderImage":"/treeView/icons/folder.svg","aggregateFunctionImage":"/treeView/icons/aggregateFunction.svg","collapsedLeafImage":"/treeView/icons/leafCollapsed.svg","expandedLeafImage":"/treeView/icons/leafExpanded.svg"}',
		fontSize: "18",
		startAddress: startaddress,
		id: "address_treeview_copy",//id_treeview_copy,
		leafIndentation: "15",
		leafPadding: "2",
		nodesWithAlarm: true,
		renderTo: "address_treeview_copy",//id_treeview_copy,
		dataSourceFilePath: dataSource,
		dataSourceType: dataSourceType,
	});

	
	//Onclick sobald auf ein Leave gedrückt wird
	treeViewCopy.on("select", function (e) {
		targetAddress =e.data.address;
		webMI.data.call("HasAlarmConfiguration",{address: targetAddress}, function (x){
			if(x.result){
				webMI.trigger.fire("com.atvise.setActive", false, "conf_name");
				webMI.trigger.fire("setValue", x.result, "conf_name");
				newConfig = false;
			}else{
				webMI.trigger.fire("com.atvise.setActive", true, "conf_name");
				webMI.trigger.fire("setValue", "New_Alarm_Name", "conf_name");
				newConfig = true;		
			}
			webMI.trigger.fire("com.atvise.setActive", true, "btn_copy");
			webMI.trigger.fire("com.atvise.setActive", true, "btn_select");
		});
	});
}

buildTree(startaddress);


webMI.trigger.connect("valuechanged", function(e) {
	e.value = webMI.secureString(e.value);
	alarmName = e.value;
}, "conf_name");

/**
 ** button cancle click
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.display.closeWindow();
}, "btn_cancel");

/**
 ** button copy click
 **/
webMI.trigger.connect("clicked", function(e){
	if(targetAddress === "" || alarmName === ""){
		alert("T{Choose a target node! / Choose an Alarm Name}");
	}else{
		handleAccessControlResponse([{ node: targetAddress, right: "engineer" }], function() {
			webMI.trigger.fire(triggerName, {targetAddress: targetAddress, alarmName: alarmName, newConfig:newConfig});
			webMI.display.closeWindow(); 
		},function(){
			alert("T{Insufficient Rights to write to} " + targetAddress);		
		});
	}
}, "btn_copy");

/**
 ** button select click
 **/
webMI.trigger.connect("clicked", function(e){
	if(targetAddress === ""){
		alert("T{Choose a target node!}");
	}else{
		handleAccessControlResponse([{ node: targetAddress, right: "read" }], function() {
			webMI.trigger.fire(triggerName, {targetAddress:targetAddress, id:id, state:state});
			webMI.display.closeWindow();
		},function(){
			alert("T{Insufficient Rights to read from} " + targetAddress);		
		});
	}
}, "btn_select");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager" ExportedBrowseName="1:alarmmanager" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS" BrowseName="1:OBJECTDISPLAYS">
		<DisplayName Locale="en">OBJECTDISPLAYS</DisplayName>
		<Description Locale="en">OBJECTDISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup" BrowseName="1:popup">
		<DisplayName Locale="en">popup</DisplayName>
		<Description Locale="en">popup</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.add_alarm" BrowseName="1:add_alarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">add_alarm</DisplayName>
		<Description Locale="en">add_alarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="280" version="1.2" width="500" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <desc>Dialog to add a new alarm configuration and condition.</desc>
 <title>Add Dialog</title>
 <metadata>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="address" name="address" substitute="$ADDRESS$" valuetype="string"/>
  <atv:parameter behavior="mandatory" defaultvalue="false" desc="alarmIsThere" name="alarmIsThere" valuetype="bool"/>
  <atv:parameter behavior="mandatory" defaultvalue="null" desc="conditionType" name="conditionType" valuetype="string"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <svg atv:refpx="340" atv:refpy="245.701" height="30" id="btn_add" transform="matrix(1.5,0,0,1.3333,0,0)" width="80" x="186.667" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="165.004">
  <atv:argument name="label" value="T{Add}"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.6667,0,0,0.75,0,0)" x="50" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.6667,0,0,0.75,0,0)" width="116"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.6667,0,0,0.75,0,0)" width="120"/>
 </svg>
 <svg atv:refpx="160" atv:refpy="244.559" height="30" id="btn_cancel" transform="matrix(1.5,0,0,1.3333,0,0)" width="80" x="66.667" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="165.004">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="4"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.6667,0,0,0.75,0,0)" x="50" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.6667,0,0,0.75,0,0)" width="116"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.6667,0,0,0.75,0,0)" width="120"/>
 </svg>
 <svg atv:refpx="380" atv:refpy="40.001" height="30" id="name_conf" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="224" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="15">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite id="input_label" transform="matrix(0.8,0,0,0.75,0,0)" x="192.055" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
 </svg>
 <svg atv:refpx="380" atv:refpy="100.002" height="30" id="combobox_conditiontype" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="224" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="60.002">
  <atv:argument name="text1" value="T{Discrete}"/>
  <atv:argument name="text1value" value="Discrete"/>
  <atv:argument name="text2" value="T{Discrete Retrigger}"/>
  <atv:argument name="text2value" value="Retrigger"/>
  <atv:argument name="text3" value="T{Limit}"/>
  <atv:argument name="text3value" value="Limit"/>
  <atv:argument name="tabIndex" value="2"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" x="175" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.8,0,0,0.75,0,0)" x="175" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" x="175" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.8,0,0,0.75,0,0)" x="165.5" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="168"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="168"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
 </svg>
 <svg atv:refpx="380" atv:refpy="160.004" height="30" id="name_condition" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="224" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="105.003">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="tabIndex" value="3"/>
  <atv:overwrite id="input_label" transform="matrix(0.8,0,0,0.75,0,0)" x="192.055" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
 </svg>
 <text atv:refpx="127.5" atv:refpy="40.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_4" x="25" y="46.5">T{Alarm Configuration Name}:</text>
 <text atv:refpx="86" atv:refpy="98.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_5" x="25" y="104.5">T{Condition type}:</text>
 <text atv:refpx="89.809" atv:refpy="160.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_8" x="24.5" y="166.5">T{Condition name}:</text>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var address = webMI.query.address;
var alarmName = webMI.query.alarmName !== "null" ? webMI.query.alarmName : null;
var conditionType = webMI.query.conditionType !== "null" ? webMI.query.conditionType : null;
var conditionName = null;
var newConfig;
var existingConditions = [];

webMI.data.call("GetConditions", {address: address}, function(e){
	for(var i = 0; i < e.length; i++){
		existingConditions.push(e[i].name);
	}
});

/**
 ** if on selected node is already a alarmconfiguration the get inserted in the fields
 **/
if (alarmName) {
	webMI.trigger.fire("setValue", alarmName, "name_conf");
	webMI.trigger.fire("com.atvise.setActive", false, "name_conf");
	if (conditionType) {
		webMI.trigger.fire("setSelectedItem", conditionType, "combobox_conditiontype");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_conditiontype");
	}
	newConfig = false;
} else {
	newConfig = true;
}

/**
 ** Function checks with regex
 **/
function checkName(input) {
	// RegEx to check the allowed characters: A-Z, a-z, 0-9, -, ., _
	const regex = /^[A-Za-z0-9\-._]+$/;
	return regex.test(input);
}

/**
 ** checks the input for configuration name
 **/
webMI.trigger.connect("valuechanged", function (e) {
	e.value = webMI.secureString(e.value);
	if (checkName(e.value)) {
		webMI.trigger.fire("com.atvise.setActive", true, "btn_add");
		alarmName = e.value;
		if (webMI.gfx.getStroke("name_conf") !== null) {
			webMI.gfx.setStroke("name_conf", null);
		}
	} else {
		webMI.gfx.setStroke("name_conf", "#ff0000");
		conditionName = null;
	}
}, "name_conf");

/**
 ** safes the selected condition type
 **/
webMI.trigger.connect("valuechanged", function (e) {
	conditionType = e.value;
}, "combobox_conditiontype");

/**
 ** checks the input for condition name
 **/
webMI.trigger.connect("valuechanged", function (e) {
	e.value = webMI.secureString(e.value);
	if(existingConditions.indexOf(e.value) >= 0){
		webMI.gfx.setStroke("name_condition", "#ff0000");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_add");
	} else {
		if (checkName(e.value)) {
			conditionName = e.value;
			webMI.trigger.fire("com.atvise.setActive", true, "btn_add");
			if (webMI.gfx.getStroke("name_condition") !== null) {
				webMI.gfx.setStroke("name_condition", null);
			}
		} else {
			webMI.trigger.fire("com.atvise.setActive", false, "btn_add");
			webMI.gfx.setStroke("name_condition", "#ff0000");
			conditionName = null;
		}
	}
}, "name_condition");

/**
 ** Click on Add button
 **/
webMI.trigger.connect("clicked", function (e) {
	if (conditionName === null || alarmName === null || conditionType === null) {
		alert("Fehler bei der Configuration - Alle Felder müssen beschrieben sein!");
	} else {
		webMI.query.name = conditionName;
		webMI.query.currLocation = address;
		webMI.query.conditionType = conditionType;
		webMI.query.triggerName = "reloadAtCurrLocation";
		webMI.query.alarmName = alarmName;
		webMI.query.isMod = false;
		webMI.query.isDiscrete = conditionType === "Discrete" || conditionType === "Retrigger";
		webMI.query.newConfig = newConfig;
		webMI.display.openWindow({
			display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.edit_alarm",
			height: 740, width: 1280, remember: true,
			modal: true, resizable: false, movable: true,
			scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
		});
	}
}, "btn_add");

/**
 ** click on cancle button
 **/
webMI.trigger.connect("clicked", function (e) {
	webMI.display.closeWindow()
}, "btn_cancel");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.delete_alarm" BrowseName="1:delete_alarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">delete_alarm</DisplayName>
		<Description Locale="en">delete_alarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="290" version="1.2" width="600" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <desc>Dialog to delete an alarm condition.</desc>
 <title>Delete Dialog</title>
 <defs/>
 <metadata>
  <atv:parameter behavior="mandatory" defaultvalue="T{Title}" desc="title" name="dialogTitle" substitute="$TITLE$" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" defaultvalue="T{Message}" desc="message line 1" name="dialogMessageLine1" substitute="$MESSAGE1$" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" defaultvalue="T{Message}" desc="message line 2" name="dialogMessageLine2" substitute="$MESSAGE2$" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="trigger name" name="triggerName" substitute="$T$" valuetype="string"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <text atv:refpx="273" atv:refpy="26" fill="#575757" font-family="Arial" font-size="20" id="id_1" text-anchor="middle" x="300" y="33.5">$TITLE$</text>
 <svg atv:refpx="510" atv:refpy="265.696" height="30" id="btn_delete" transform="matrix(1.75,0,0,1.3333,0,0)" width="80" x="251.429" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="180">
  <atv:argument name="label" value="T{Delete}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:overwrite height="38" id="id_6" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="31.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="16.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="24.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="34.625"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="13.292"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5714,0,0,0.75,0,0)" x="60" y="10"/>
  <atv:overwrite height="36" id="button_stroke" transform="matrix(0.5714,0,0,0.75,0,0)" width="136"/>
  <atv:overwrite height="38" id="button_bg" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite height="40" id="outer_frame" transform="matrix(0.5714,0,0,0.75,0,0)" width="140"/>
 </svg>
 <svg atv:refpx="350.001" atv:refpy="264.554" height="30" id="btn_cancel" transform="matrix(1.75,0,0,1.3333,0,0)" width="80" x="160" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="180">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite height="38" id="id_6" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="31.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="16.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="24.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="34.625"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="13.292"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5714,0,0,0.75,0,0)" x="60" y="10"/>
  <atv:overwrite height="36" id="button_stroke" transform="matrix(0.5714,0,0,0.75,0,0)" width="136"/>
  <atv:overwrite height="38" id="button_bg" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite height="40" id="outer_frame" transform="matrix(0.5714,0,0,0.75,0,0)" width="140"/>
 </svg>
 <text atv:refpx="283.578" atv:refpy="112.194" fill="#575757" font-family="Arial" font-size="20" id="id_3" text-anchor="middle" x="300" y="119.694">$MESSAGE1$</text>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[/**
 ** button delete click
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire(webMI.query.triggerName);
	webMI.display.closeWindow();
}, "btn_delete");

/**
 ** button cancle click
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.display.closeWindow();
}, "btn_cancel");]]]]><![CDATA[></script>
 <text atv:refpx="299.306" atv:refpy="152.194" fill="#575757" font-family="Arial" font-size="20" id="id_0" text-anchor="middle" x="299.306" y="159.694">$MESSAGE2$</text>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.edit_alarm" BrowseName="1:edit_alarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">edit_alarm</DisplayName>
		<Description Locale="en">edit_alarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="720" version="1.2" width="1280" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <desc>Dialog to edit alarm conditions.</desc>
 <title>Edit Dialog</title>
 <metadata>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="Name der Alarmconfig" name="name" substitute="" valuetype="string"/>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="Addresse der Config" name="address" substitute="" valuetype="string"/>
  <atv:parameter behavior="mandatory" defaultvalue="true" name="isMod" valuetype="bool"/>
  <atv:parameter behavior="mandatory" defaultvalue="true" name="isDiskrete" valuetype="bool"/>
  <atv:parameter behavior="optional" defaultvalue="SYSTEM.GLOBALS.atvFillColor" desc="$FILLCOLOR$" name="$FILLCOLOR$" substitute="$FILLCOLOR$" valuetype="global"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="5" width="5"/>
 </metadata>
 <rect atv:refpx="640.5" atv:refpy="40.5" fill="$FILLCOLOR$" height="80" id="id_14" rx="0" ry="0" stroke="#000000" stroke-width="1" width="1280" x="0.5" y="0.5"/>
 <svg atv:refpx="395.208" atv:refpy="240.5" height="30" id="active_message" transform="matrix(2.8094,0,0,1.3333,0,0)" width="160" x="60.691" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="165.375">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="allowDirectInput" value="Yes"/>
  <atv:argument name="tabIndex" value="11"/>
  <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
  <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
  <atv:overwrite id="input_label" transform="matrix(0.3559,0,0,0.75,0,0)" x="441.559" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.3559,0,0,0.75,0,0)" width="441.504"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.3559,0,0,0.75,0,0)" width="445.504"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.3559,0,0,0.75,0,0)" width="441.504"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.3559,0,0,0.75,0,0)" width="447.504"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.3559,0,0,0.75,0,0)" width="449.504"/>
 </svg>
 <svg atv:refpx="1015.456" atv:refpy="240.5" height="30" id="inactive_message" transform="matrix(2.8125,0,0,1.3333,0,0)" width="160" x="281.066" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="165.375">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="allowDirectInput" value="Yes"/>
  <atv:argument name="tabIndex" value="12"/>
  <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
  <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
  <atv:overwrite id="input_label" transform="matrix(0.3556,0,0,0.75,0,0)" x="442.055" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.3556,0,0,0.75,0,0)" width="442"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.3556,0,0,0.75,0,0)" width="446"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.3556,0,0,0.75,0,0)" width="442"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.3556,0,0,0.75,0,0)" width="448"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.3556,0,0,0.75,0,0)" width="450"/>
 </svg>
 <svg atv:refpx="894.999" atv:refpy="420.008" height="30" id="explicit_acknowledgement" transform="matrix(0.1875,0,0,1,0,0)" width="160" x="4693.333" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.checkbox" y="405">
  <atv:argument name="label" value=""/>
  <atv:argument name="tabIndex" value="18"/>
  <atv:overwrite id="checkbox_item" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_symbol" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="blinking_frame" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="focus_frame" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_bg" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_frame" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_stroke" transform="matrix(5.3333,0,0,1,0,0)"/>
 </svg>
 <svg atv:refpx="255.147" atv:refpy="120.5" height="30" id="category" transform="matrix(1.0579,0,0,1.3333,0,0)" width="160" x="161.169" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="75.375">
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.9453,0,0,0.75,0,0)" width="165.264"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.9453,0,0,0.75,0,0)" x="144.264" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.9453,0,0,0.75,0,0)" x="144.264" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.9453,0,0,0.75,0,0)" x="144.264" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.9453,0,0,0.75,0,0)" x="134.764" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.9453,0,0,0.75,0,0)" width="137.264"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.9453,0,0,0.75,0,0)" width="137.264"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.9453,0,0,0.75,0,0)" width="167.264"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.9453,0,0,0.75,0,0)" width="169.264"/>
 </svg>
 <svg atv:refpx="985.001" atv:refpy="360.01" height="30" id="modify_script" transform="matrix(2.4375,0,0,1.3333,0,0)" width="160" x="324.103" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="255.006">
  <atv:argument name="tabIndex" value="16"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="386"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.4103,0,0,0.75,0,0)" x="355.5" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.4103,0,0,0.75,0,0)" width="388"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.4103,0,0,0.75,0,0)" width="390"/>
 </svg>
 <svg atv:refpx="985.491" atv:refpy="300.5" height="30" id="prevention_script" transform="matrix(2.4375,0,0,1.3333,0,0)" width="160" x="324.306" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="210.375">
  <atv:argument name="tabIndex" value="14"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="386"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.4103,0,0,0.75,0,0)" x="355.5" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.4103,0,0,0.75,0,0)" width="388"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.4103,0,0,0.75,0,0)" width="390"/>
 </svg>
 <svg atv:refpx="220.5" atv:refpy="300.5" height="30" id="max_time_shelved" transform="matrix(0.625,0,0,1.3333,0,0)" width="160" x="272.8" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_value" y="210.375">
  <atv:argument name="min" value="0"/>
  <atv:argument name="tooltip" value="T{Value in seconds}"/>
  <atv:argument name="tabIndex" value="13"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite id="clickarea_dec" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="clickarea_inc" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="input_label" transform="matrix(1.6,0,0,0.75,0,0)" x="65.5" y="25.249"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="37.999" id="id_0" transform="matrix(1.6,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="bg" transform="matrix(1.6,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="220.5" atv:refpy="360.5" height="30" id="on_delay" transform="matrix(0.625,0,0,1.3333,0,0)" width="160" x="272.8" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_value" y="255.375">
  <atv:argument name="min" value="0"/>
  <atv:argument name="tooltip" value="T{Value in seconds}"/>
  <atv:argument name="tabIndex" value="15"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite id="clickarea_dec" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="clickarea_inc" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="input_label" transform="matrix(1.6,0,0,0.75,0,0)" x="65.5" y="25.249"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="37.999" id="id_0" transform="matrix(1.6,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="bg" transform="matrix(1.6,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="220.5" atv:refpy="420.5" height="30" id="off_delay" transform="matrix(0.625,0,0,1.3333,0,0)" width="160" x="272.8" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_value" y="300.375">
  <atv:argument name="min" value="0"/>
  <atv:argument name="tooltip" value="T{Value in seconds}"/>
  <atv:argument name="tabIndex" value="17"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite id="clickarea_dec" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="clickarea_inc" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="input_label" transform="matrix(1.6,0,0,0.75,0,0)" x="65.5" y="25.249"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="37.999" id="id_0" transform="matrix(1.6,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="bg" transform="matrix(1.6,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="1160.525" atv:refpy="660.799" height="30" id="btn_safe" transform="matrix(2,0,0,1.3531,0,0)" width="80" x="540.25" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="473.357">
  <atv:argument name="label" value="T{Save}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="21"/>
  <atv:overwrite height="38.593" id="id_6" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="31.796"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="16.796"/>
  <atv:overwrite id="button_label" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="24.796"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="35.119"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="13.786"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5,0,0,0.739,0,0)" x="70" y="10.296"/>
  <atv:overwrite height="36.593" id="button_stroke" transform="matrix(0.5,0,0,0.739,0,0)" width="156"/>
  <atv:overwrite height="38.593" id="button_bg" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite height="40.593" id="outer_frame" transform="matrix(0.5,0,0,0.739,0,0)" width="160"/>
 </svg>
 <svg atv:refpx="980" atv:refpy="660.297" height="30" id="btn_cancel" transform="matrix(2,0,0,1.3531,0,0)" width="80" x="450" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="472.988">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="19"/>
  <atv:overwrite height="38.593" id="id_6" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="31.796"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="16.796"/>
  <atv:overwrite id="button_label" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="24.796"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="35.12"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="13.786"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5,0,0,0.739,0,0)" x="70" y="10.296"/>
  <atv:overwrite height="36.593" id="button_stroke" transform="matrix(0.5,0,0,0.739,0,0)" width="156"/>
  <atv:overwrite height="38.593" id="button_bg" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite height="40.593" id="outer_frame" transform="matrix(0.5,0,0,0.739,0,0)" width="160"/>
 </svg>
 <svg atv:refpx="1212.775" atv:refpy="300.47" height="30" id="btn_clear_prev" transform="matrix(0.6937,0,0,1.3333,0,0)" width="80" x="1708.108" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="210.375">
  <atv:argument name="label" value="T{Clear}"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite id="button_label_2" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(1.4414,0,0,0.75,0,0)" x="17.75" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(1.4414,0,0,0.75,0,0)" width="51.5"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(1.4414,0,0,0.75,0,0)" width="55.5"/>
 </svg>
 <svg atv:refpx="1212.751" atv:refpy="360.499" height="30" id="btn_clear_mod" transform="matrix(0.6937,0,0,1.3333,0,0)" width="80" x="1708.108" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="255.375">
  <atv:argument name="label" value="T{Clear}"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite id="button_label_2" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(1.4414,0,0,0.75,0,0)" x="17.75" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(1.4414,0,0,0.75,0,0)" width="51.5"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(1.4414,0,0,0.75,0,0)" width="55.5"/>
 </svg>
 <svg atv:refpx="1160.025" atv:refpy="660.3" height="30" id="btn_create" transform="matrix(2,0,0,1.3531,0,0)" width="80" x="540" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="472.988">
  <atv:argument name="label" value="T{Create}"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="tabIndex" value="20"/>
  <atv:overwrite height="38.593" id="id_6" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="31.796"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="16.796"/>
  <atv:overwrite id="button_label" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="24.796"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="35.12"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="13.786"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5,0,0,0.739,0,0)" x="70" y="10.296"/>
  <atv:overwrite height="36.593" id="button_stroke" transform="matrix(0.5,0,0,0.739,0,0)" width="156"/>
  <atv:overwrite height="38.593" id="button_bg" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite height="40.593" id="outer_frame" transform="matrix(0.5,0,0,0.739,0,0)" width="160"/>
 </svg>
 <svg atv:refpx="50.5" atv:refpy="40.5" height="60" id="id_15" width="60" x="20.5" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Symbols.60x60.alarm" y="10.5"/>
 <text atv:refpx="156.5" atv:refpy="54" fill="$FONTCOLOR$" font-family="Arial" font-size="48" id="label_name" x="105.5" y="60">Name of Alarm</text>
 <text atv:refpx="1059.772" atv:refpy="60" fill="$FONTCOLOR$" font-family="Arial" font-size="22" id="id_13" x="1035" y="64.5">T{Type}:</text>
 <text atv:refpx="1171.5" atv:refpy="57" fill="$FONTCOLOR$" font-family="Arial" font-size="22" id="label_type" x="1104.5" y="64.5">Type of Alarm</text>
 <text atv:refpx="87.5" atv:refpy="119.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_18" x="45" y="125.5">T{Category}:</text>
 <text atv:refpx="101.5" atv:refpy="239.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_19" x="45" y="245.5">T{To active Text}:</text>
 <text atv:refpx="111" atv:refpy="299.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_21" x="45" y="305.5">T{Max. timeshelve}:</text>
 <text atv:refpx="86" atv:refpy="359.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_22" x="45" y="365.5">T{Delay on}:</text>
 <text atv:refpx="86" atv:refpy="419.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_23" x="45" y="425.5">T{Delay off}:</text>
 <text atv:refpx="706" atv:refpy="239.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_24" x="645" y="245.5">T{To inactive text}:</text>
 <text atv:refpx="713.5" atv:refpy="299.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_25" x="645" y="305.5">T{Prevention script}:</text>
 <text atv:refpx="719" atv:refpy="359.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_27" x="645" y="365.5">T{Modification script}:</text>
 <text atv:refpx="746" atv:refpy="418.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_29" x="645" y="424.5">T{Explicit Acknowledgement}:</text>
 <g atv:refpx="330" atv:refpy="180" id="group_discrete">
  <svg atv:refpx="519.979" atv:refpy="180.004" height="30" id="value" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="336" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="120.003">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="allowDirectInput" value="Yes"/>
   <atv:argument name="tabIndex" value="4"/>
   <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
   <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
   <atv:overwrite id="input_label" transform="matrix(0.8,0,0,0.75,0,0)" x="192.055" y="24.464"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
  </svg>
  <svg atv:refpx="350" atv:refpy="180.004" height="30" id="value_compare" transform="matrix(0.375,0,0,1.3333,0,0)" width="160" x="853.333" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="120.003">
   <atv:argument name="text1" value="T{==}"/>
   <atv:argument name="text1value" value="=="/>
   <atv:argument name="text2" value="T{!=}"/>
   <atv:argument name="text2value" value="!="/>
   <atv:argument name="tabIndex" value="3"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(2,0,0,0.75,0,0)" width="76"/>
   <atv:overwrite id="button_stroke" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(2,0,0,0.75,0,0)" x="55" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(2,0,0,0.75,0,0)" x="45.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(2,0,0,0.75,0,0)" width="78"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(2,0,0,0.75,0,0)" width="80"/>
  </svg>
  <svg atv:refpx="235" atv:refpy="180.004" height="30" id="combobox_value" transform="matrix(0.8125,0,0,1.3333,0,0)" width="160" x="209.231" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="120.003">
   <atv:argument name="text1" value="T{Value}"/>
   <atv:argument name="text1value" value="Value"/>
   <atv:argument name="text2" value="T{Node absolute}"/>
   <atv:argument name="text2value" value="Node absolute"/>
   <atv:argument name="text3" value="T{Node relative}"/>
   <atv:argument name="text3value" value="Node relative"/>
   <atv:argument name="tabIndex" value="2"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.2308,0,0,0.75,0,0)" width="126"/>
   <atv:overwrite id="button_stroke" transform="matrix(1.2308,0,0,0.75,0,0)" x="105" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(1.2308,0,0,0.75,0,0)" x="105" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(1.2308,0,0,0.75,0,0)" x="105" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(1.2308,0,0,0.75,0,0)" x="95.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.2308,0,0,0.75,0,0)" width="98"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(1.2308,0,0,0.75,0,0)" width="98"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(1.2308,0,0,0.75,0,0)" width="128"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(1.2308,0,0,0.75,0,0)" width="130"/>
  </svg>
  <text atv:refpx="65.5" atv:refpy="179.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_30" x="45" y="185.5">T{Value}:</text>
  <svg atv:refpx="410" atv:refpy="180" height="30" id="nodeselect_discrete" transform="matrix(0.25,0,0,1.3333,0,0)" width="80" x="1600" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="120">
   <atv:argument name="label" value="T{...}"/>
   <atv:overwrite height="38" id="id_6" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite id="button_label_2" transform="matrix(4,0,0,0.75,0,0)" x="10" y="31.5"/>
   <atv:overwrite id="button_label_1" transform="matrix(4,0,0,0.75,0,0)" x="10" y="16.5"/>
   <atv:overwrite id="button_label" transform="matrix(4,0,0,0.75,0,0)" x="10" y="24.5"/>
   <atv:overwrite id="button_symbol_bottom" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="34.625"/>
   <atv:overwrite id="button_symbol_top" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="13.292"/>
   <atv:overwrite id="button_symbol" transform="matrix(4,0,0,0.75,0,0)" x="0" y="10"/>
   <atv:overwrite height="36" id="button_stroke" transform="matrix(4,0,0,0.75,0,0)" width="16"/>
   <atv:overwrite height="38" id="button_bg" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite height="40" id="outer_frame" transform="matrix(4,0,0,0.75,0,0)" width="20"/>
  </svg>
 </g>
 <g atv:refpx="640" atv:refpy="180" id="group_limit" transform="matrix(1,0,0,1,0,-340)">
  <svg atv:refpx="1173.781" atv:refpy="569.038" height="30" id="upper_limit" transform="matrix(1.125,0,0,1.3333,0,0)" width="160" x="942.222" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="375.009">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="tabIndex" value="10"/>
   <atv:overwrite id="input_label" transform="matrix(0.8889,0,0,0.75,0,0)" x="172.055" y="24.465"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="176"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8889,0,0,0.75,0,0)" width="178"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8889,0,0,0.75,0,0)" width="180"/>
  </svg>
  <svg atv:refpx="350" atv:refpy="-29.993" height="30" id="lower_limit_compare" transform="matrix(0.375,0,0,1.3333,0,0)" width="160" x="853.333" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument name="text1" value="T{>}"/>
   <atv:argument name="text1value" value=">"/>
   <atv:argument name="text2" value="T{>=}"/>
   <atv:argument name="text2value" value=">="/>
   <atv:argument name="tabIndex" value="6"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(2.6667,0,0,0.75,0,0)" width="56"/>
   <atv:overwrite id="button_stroke" transform="matrix(2.6667,0,0,0.75,0,0)" x="35" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(2.6667,0,0,0.75,0,0)" x="35" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(2.6667,0,0,0.75,0,0)" x="35" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(2.6667,0,0,0.75,0,0)" x="25.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(2.6667,0,0,0.75,0,0)" width="28"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(2.6667,0,0,0.75,0,0)" width="28"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(2.6667,0,0,0.75,0,0)" width="58"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(2.6667,0,0,0.75,0,0)" width="60"/>
  </svg>
  <svg atv:refpx="982" atv:refpy="240" height="30" id="upper_limit_compare" transform="matrix(0.5,0,0,1.3333,0,0)" width="160" x="1880" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument value="T{&lt;}" name="text1"/>
   <atv:argument value="&lt;" name="text1value"/>
   <atv:argument value="T{&lt;=}" name="text2"/>
   <atv:argument value="&lt;=" name="text2value"/>
   <atv:argument name="tabIndex" value="9"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(2,0,0,0.75,0,0)" width="76"/>
   <atv:overwrite id="button_stroke" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(2,0,0,0.75,0,0)" x="55" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(2,0,0,0.75,0,0)" x="45.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(2,0,0,0.75,0,0)" width="78"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(2,0,0,0.75,0,0)" width="80"/>
  </svg>
  <svg atv:refpx="545.423" atv:refpy="-15.961" height="30" id="lower_limit" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="336" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="375.009">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="tabIndex" value="7"/>
   <atv:overwrite id="input_label" transform="matrix(0.8889,0,0,0.75,0,0)" x="172.055" y="24.465"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="176"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8889,0,0,0.75,0,0)" width="178"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8889,0,0,0.75,0,0)" width="180"/>
  </svg>
  <svg atv:refpx="235.53" atv:refpy="190.005" height="30" id="combobox_lower_limit" transform="matrix(0.8188,0,0,1.3333,0,0)" width="160" x="207.621" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument name="text1" value="T{Value}"/>
   <atv:argument name="text1value" value="Value"/>
   <atv:argument name="text2" value="T{Node absolute}"/>
   <atv:argument name="text2value" value="Node absolute"/>
   <atv:argument name="text3" value="T{Node relative}"/>
   <atv:argument name="text3value" value="Node relative"/>
   <atv:argument name="tabIndex" value="5"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.2213,0,0,0.75,0,0)" width="127.008"/>
   <atv:overwrite id="button_stroke" transform="matrix(1.2213,0,0,0.75,0,0)" x="106.008" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(1.2213,0,0,0.75,0,0)" x="106.008" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(1.2213,0,0,0.75,0,0)" x="106.008" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(1.2213,0,0,0.75,0,0)" x="96.508" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.2213,0,0,0.75,0,0)" width="99.008"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(1.2213,0,0,0.75,0,0)" width="99.008"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(1.2213,0,0,0.75,0,0)" width="129.008"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(1.2213,0,0,0.75,0,0)" width="131.008"/>
  </svg>
  <svg atv:refpx="853.969" atv:refpy="190.005" height="30" id="combobox_upper_limit" transform="matrix(0.8004,0,0,1.3333,0,0)" width="160" x="987.006" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument name="text1" value="T{Value}"/>
   <atv:argument name="text1value" value="Value"/>
   <atv:argument name="text2" value="T{Node absolute}"/>
   <atv:argument name="text2value" value="Node absolute"/>
   <atv:argument name="text3" value="T{Node relative}"/>
   <atv:argument name="text3value" value="Node relative"/>
   <atv:argument name="tabIndex" value="8"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.2494,0,0,0.75,0,0)" width="124.064"/>
   <atv:overwrite id="button_stroke" transform="matrix(1.2494,0,0,0.75,0,0)" x="103.064" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(1.2494,0,0,0.75,0,0)" x="103.064" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(1.2494,0,0,0.75,0,0)" x="103.064" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(1.2494,0,0,0.75,0,0)" x="93.564" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.2494,0,0,0.75,0,0)" width="96.064"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(1.2494,0,0,0.75,0,0)" width="96.064"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(1.2494,0,0,0.75,0,0)" width="126.064"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(1.2494,0,0,0.75,0,0)" width="128.064"/>
  </svg>
  <text atv:refpx="668.006" atv:refpy="519.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_32" x="645" y="525.5">T{To Value}:</text>
  <text atv:refpx="78.126" atv:refpy="519.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_33" x="45" y="525.5">T{From Value}:</text>
  <svg atv:refpx="410" atv:refpy="520" height="30" id="nodeselect_lower" transform="matrix(0.25,0,0,1.3333,0,0)" width="80" x="1584" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="375.009">
   <atv:argument name="label" value="T{...}"/>
   <atv:overwrite height="37.999" id="id_6" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite id="button_label_2" transform="matrix(4,0,0,0.75,0,0)" x="10" y="31.499"/>
   <atv:overwrite id="button_label_1" transform="matrix(4,0,0,0.75,0,0)" x="10" y="16.499"/>
   <atv:overwrite id="button_label" transform="matrix(4,0,0,0.75,0,0)" x="10" y="24.499"/>
   <atv:overwrite id="button_symbol_bottom" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="34.624"/>
   <atv:overwrite id="button_symbol_top" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="13.291"/>
   <atv:overwrite id="button_symbol" transform="matrix(4,0,0,0.75,0,0)" x="0" y="9.999"/>
   <atv:overwrite height="35.999" id="button_stroke" transform="matrix(4,0,0,0.75,0,0)" width="16"/>
   <atv:overwrite height="37.999" id="button_bg" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite height="39.999" id="outer_frame" transform="matrix(4,0,0,0.75,0,0)" width="20"/>
  </svg>
  <svg atv:refpx="1050" atv:refpy="520" height="30" id="nodeselect_upper" transform="matrix(0.25,0,0,1.3333,0,0)" width="80" x="4160" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="375.009">
   <atv:argument name="label" value="T{...}"/>
   <atv:overwrite height="37.999" id="id_6" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite id="button_label_2" transform="matrix(4,0,0,0.75,0,0)" x="10" y="31.499"/>
   <atv:overwrite id="button_label_1" transform="matrix(4,0,0,0.75,0,0)" x="10" y="16.499"/>
   <atv:overwrite id="button_label" transform="matrix(4,0,0,0.75,0,0)" x="10" y="24.499"/>
   <atv:overwrite id="button_symbol_bottom" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="34.624"/>
   <atv:overwrite id="button_symbol_top" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="13.291"/>
   <atv:overwrite id="button_symbol" transform="matrix(4,0,0,0.75,0,0)" x="0" y="9.999"/>
   <atv:overwrite height="35.999" id="button_stroke" transform="matrix(4,0,0,0.75,0,0)" width="16"/>
   <atv:overwrite height="37.999" id="button_bg" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite height="39.999" id="outer_frame" transform="matrix(4,0,0,0.75,0,0)" width="20"/>
  </svg>
 </g>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var name = webMI.query.name;
var address = webMI.query.address;
var isMod = webMI.query.isMod === "true";
var isDiscrete = webMI.query.isDiscrete === "true";
var parentAddress = webMI.query.currLocation;
var parentDataType;
webMI.data.read(parentAddress, function(e) {
	parentDataType = typeof e.value;
});
var config;
var alarmName = webMI.query.alarmName;
var conditionType = webMI.query.conditionType;
var gAccessControlManager;
var datafilled = false;
//states for the writing to variant in server script
var stateValue;
var stateLower;
var stateUpper;
var statesObj;
if(isDiscrete){
	stateValue = "Value";
}else{
	stateLower = "Value";
	stateUpper = "Value";
}

/**
 ** loads Access Controll if isnt
 **/
if (webMI.getAccessControlSupport()) {
	gAccessControlManager = webMI.callExtension("SYSTEM.LIBRARY.ATVISE.QUICKDYNAMICS.Access Control Manager");
}

/**
 ** Access Controll Handler
 **/
function handleAccessControlResponse(compareRights, successCallback, failCallback) {
	if (!gAccessControlManager) {
		successCallback();
		return;
	}
	
	var requiredRights = {
		nodeIds: [],
		rights: []
	};
	
	compareRights = [].concat(compareRights);
	compareRights.forEach(function(r) {
		requiredRights.nodeIds.push(r.node);
		requiredRights.rights.push(r.right);
	});

	gAccessControlManager.getRightsDict(requiredRights.nodeIds, requiredRights.rights, function(response) {
		// do the checks
		var allRights = true;

		for (var c in compareRights) {
			if (
				typeof response[compareRights[c].node] != "undefined" &&
				typeof response[compareRights[c].node][compareRights[c].right] != "undefined"
			) {
				allRights = allRights && response[compareRights[c].node][compareRights[c].right];
			} else {
				allRights = false;
				break;
			}
		}
		if (allRights) {
			successCallback();
		} else {
			failCallback();
		}
	});
}

/**
 ** if no rights to engineer disable all fileds so read only
 **/
handleAccessControlResponse([{ node: parentAddress, right: "engineer" },{ node: "AGENT.ALARMING", right: "read" }], function() {}, function() {
		webMI.trigger.fire("com.atvise.setActive", false, "value_compare");
		webMI.trigger.fire("com.atvise.setActive", false, "value");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_value");	
		webMI.trigger.fire("com.atvise.setActive", false, "nodeselect_discrete");
		webMI.trigger.fire("com.atvise.setActive", false, "lower_limit");
		webMI.trigger.fire("com.atvise.setActive", false, "lower_limit_compare");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_lower_limit");		
		webMI.trigger.fire("com.atvise.setActive", false, "nodeselect_lower");
		webMI.trigger.fire("com.atvise.setActive", false, "upper_limit");
		webMI.trigger.fire("com.atvise.setActive", false, "upper_limit_compare");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_upper_limit");		
		webMI.trigger.fire("com.atvise.setActive", false, "nodeselector_upper");
		webMI.trigger.fire("com.atvise.setActive", false, "active_message");
		webMI.trigger.fire("com.atvise.setActive", false, "inactive_message");
		webMI.trigger.fire("com.atvise.setActive", false, "explicit_acknowledgement");
		webMI.trigger.fire("com.atvise.setActive", false, "max_time_shelved");
		webMI.trigger.fire("com.atvise.setActive", false, "on_delay");
		webMI.trigger.fire("com.atvise.setActive", false, "off_delay");
		webMI.trigger.fire("com.atvise.setActive", false, "modify_script");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_clear_mod");
		webMI.trigger.fire("com.atvise.setActive", false, "prevention_script");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_clear_prev");
		webMI.trigger.fire("com.atvise.setActive", false, "category");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_safe");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_create");
	}
);

/**
 ** Create empty config for adding a new alarmcondition 
 **/
if(!isMod){
	var add_to_config;
	config = {
			active_message: {"":""},
			inactive_message: {"":""},
			explicit_acknowledgement: false,
			max_time_shelved: 0,
			on_delay: 0,
			off_delay: 0,
			prevention_script: "",
			modify_script: "",
			category: "Error",
		}
	if(conditionType === "Discrete" || conditionType === "Retrigger"){
		isDiscrete = true;
		add_to_config = {
			value: null,
			value_compare: "==",		
		}
	}else{
		add_to_config = {
			lower_limit: null,
			lower_limit_compare: ">",
			lower_limit_deadband: null,
			upper_limit: null,
			upper_limit_compare: "<",
			upper_limit_deadband: null,
		}
	}
	config = {...config, ...add_to_config};
}

/**
 ** Function loads the config from the condition
 **/
function getCondition(){
	return new Promise((resolve) => {
		webMI.data.call("GetConditions",{"address":address, "justOneConfig":true},function (e){
			config = e;
			resolve();
		});
	})
}

/**
 ** Function to parse xml to relative path - for Node relative comparison
 **/
function xmlToPointNotation(xmlString) {
    const parser = new DOMParser();
    const xmlDoc = parser.parseFromString(xmlString, "text/xml");
    const elements = xmlDoc.getElementsByTagName("RelativePathElement");
    let result = "";
    for (let element of elements) {
        const name = element.querySelector("Name").textContent;
        result += `.${name}`;
    }
    return result;
}

/**
 ** get the state from the value (Node absolute, Node relative, Value) and change data in correct form
 **/
function getState(input){
	var state;
	input = typeof input === "boolean" ? input.toString() : input;
	if(input){
		if(input.toString().startsWith("ns=1;s")){
			state = "Node absolute";
			input = input.replace("ns=1;s=", "");
		}else if(input.toString().trim().startsWith("<") && input.toString().trim().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(input.toString().trim())){
			state = "Node relative";
			input = xmlToPointNotation(input)
		}else{
			state = "Value";
		}
	}else{
		state = input === null ? "Value": undefined;
	}
	return {state: state, changed: input}
}

/**
 ** Function fills all the field from config
 **/
function fillForm(config){
	if(isDiscrete){
		//set value fields visible and vanish limit fields
		webMI.gfx.setVisible("group_limit", false);
		webMI.gfx.setVisible("group_discrete", null);
		//sets value fields from config
		var TMPvalue = getState(config.value);
		webMI.trigger.fire("setSelectedItem", config.value_compare, "value_compare");
		config.value = TMPvalue.changed;
		webMI.trigger.fire("setSelectedItem", "T{" + TMPvalue.state + "}", "combobox_value");
		webMI.trigger.fire("setValue", config.value, "value");
		if(TMPvalue.state !== "Value"){
			webMI.gfx.setVisible("nodeselect_discrete", null);
		}else{
			webMI.gfx.setVisible("nodeselect_discrete", false);
		}
	}else{
		//set limit fields visible and vanish value fields
		webMI.gfx.setVisible("group_limit", null);
		webMI.gfx.setVisible("group_discrete", false);
		//sets lower limit fields
		var TMPlower = getState(config.lower_limit);
		webMI.trigger.fire("setSelectedItem", config.lower_limit_compare, "lower_limit_compare");
		config.lower_limit = TMPlower.changed;
		webMI.trigger.fire("setSelectedItem", "T{" + TMPlower.state + "}", "combobox_lower_limit");
		webMI.trigger.fire("setValue", config.lower_limit, "lower_limit");
		if(TMPlower.state !== "Value"){
			webMI.gfx.setVisible("nodeselect_lower", null);
		}else{
			webMI.gfx.setVisible("nodeselect_lower", false);
		}
		//sets upper limit fields
		var TMPupper = getState(config.upper_limit);
		webMI.trigger.fire("setSelectedItem", config.upper_limit_compare, "upper_limit_compare");
		config.upper_limit = TMPupper.changed;
		webMI.trigger.fire("setSelectedItem", "T{" + TMPupper.state + "}", "combobox_upper_limit");
		webMI.trigger.fire("setValue", config.upper_limit, "upper_limit");
		if(TMPupper.state !== "Value"){
			webMI.gfx.setVisible("nodeselect_upper", null);
		}else{
			webMI.gfx.setVisible("nodeselect_upper", false);
		}
	}
	webMI.trigger.fire("setValue", config.active_message[""], "active_message");
	webMI.trigger.fire("setValue", config.inactive_message[""], "inactive_message");
	webMI.trigger.fire("setChecked", config.explicit_acknowledgement, "explicit_acknowledgement");
	webMI.trigger.fire("setValue", config.max_time_shelved / 1000, "max_time_shelved"); // ms * 1000 = s
	webMI.trigger.fire("setValue", config.on_delay / 1000, "on_delay");
	webMI.trigger.fire("setValue", config.off_delay / 1000, "off_delay");
	if(config.modify_script !== "i=0"){
		webMI.trigger.fire("setSelectedItem", config.modify_script.split('.').pop(), "modify_script");
	}
	if(config.prevention_script !== "i=0"){
		webMI.trigger.fire("setSelectedItem", config.prevention_script.split('.').pop(), "prevention_script");
	}
	webMI.trigger.fire("setSelectedItem", config.category, "category");
	datafilled = true;
}

/**
 ** Presets the fields, that are always equal
 **/
webMI.gfx.setText("label_name", name);
webMI.gfx.setText("label_type", conditionType);
webMI.data.call("GetAlarmScripts", {type: "VariableTypes.ATVISE.ScriptCode.AlarmModification"}, function(entries){
	webMI.trigger.fire("setItems", entries, "modify_script");
});
webMI.data.call("GetAlarmScripts", {type: "VariableTypes.ATVISE.ScriptCode.AlarmPrevention"} ,function(entries){
	webMI.trigger.fire("setItems", entries, "prevention_script");
});
webMI.data.call("GetAlarmCategories", {} ,function(entries){
	webMI.trigger.fire("setItems", entries, "category");
});

/**
 ** show discrete fields / limit fields
 **/
if(isDiscrete){
	webMI.gfx.setVisible("group_limit", false);
	webMI.gfx.setVisible("group_discrete", null);
}else{
	webMI.gfx.setVisible("group_limit", null);
	webMI.gfx.setVisible("group_discrete", false);
}

/**
 ** Fill fields with data or initialize it empty
 **/
if(isMod){
	getCondition().then(() => {
		webMI.gfx.setVisible("btn_safe", null);
		webMI.gfx.setVisible("btn_create", false);
		fillForm(config);
	});
}else{
	webMI.gfx.setVisible("btn_safe", false);
	webMI.gfx.setVisible("btn_create", null);
	
	if(isDiscrete){
		webMI.trigger.fire("setSelectedItem", "==", "value_compare");
		webMI.trigger.fire("setValue", "", "value");
		webMI.trigger.fire("setSelectedItem", "T{Value}", "combobox_value");
		webMI.gfx.setVisible("nodeselect_discrete", false);
	}
	else{
		webMI.trigger.fire("setSelectedItem", ">", "lower_limit_compare");
		webMI.trigger.fire("setSelectedItem", "T{Value}", "combobox_lower_limit");
		webMI.trigger.fire("setValue", "", "lower_limit");
		webMI.gfx.setVisible("nodeselect_lower", false);
		webMI.trigger.fire("setSelectedItem", "<", "upper_limit_compare");
		webMI.trigger.fire("setSelectedItem", "T{Value}", "combobox_upper_limit");		
		webMI.trigger.fire("setValue", "", "upper_limit");
		webMI.gfx.setVisible("nodeselect_upper", false);
	}
	webMI.trigger.fire("setChecked", false, "explicit_acknowledgement");
	webMI.trigger.fire("setSelectedItem", "Error", "category");
}

/**
 ** checkfunction for the value input
 **/
function checkInputType(input,type = ""){
	if(input !== undefined){
		if(input.length > 0){
			if(input !== "null" && input !== null){
				if(type === "Value"){
					if(parentDataType === "boolean"){
						switch(input){
								case "true":
								case "false":
								case "0":
								case "1":
								case "TRUE":
								case "FALSE":
									return true;
									break;
								default:
									return false;
									break;
						}
					}else if(parentDataType === "number"){
						const numberRegex = /^-?\d+(\.\d+)?$/;
						return numberRegex.test(input.trim());
					}else if(parentDataType === "string"){
						if(input.length > 0){
							return true;	
						}else{
							return false;		
						}
					}
				}else{
					return true;				
				}
			}else{
				return true;
			}
		}
	}
	return false;
}

/**
 ** trigger called from selector
 **/
webMI.trigger.connect("getTargetAddress", function(e) {
	var targetAddress = e.value.targetAddress;
	if(e.value.state === "Node absolute"){
		webMI.trigger.fire("setValue", targetAddress, e.value.id);
	}else if(e.value.state === "Node relative"){
		webMI.trigger.fire("setValue", targetAddress.replace(parentAddress, ""), e.value.id)
	}
});

/**
 ** function opens nodeselector for path
 */
function openNodeSelector(value, id, state){
	var title = "T{Select node:}";
	if(!datafilled && isMod) return;
	if(value === "Value"){
		return;
	}else if(value === "Node absolute"){
		webMI.query.startAddress = "";
	}else if(value === "Node relative"){
		webMI.query.startAddress = parentAddress;
	}
	webMI.query.isCopy = false;
	webMI.query.newTriggerName = "getTargetAddress";
	webMI.query.id = id;
	webMI.query.state = state;			
	webMI.display.openWindow({
		display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.selector",
		height: 580, width: 380, remember: true, title: title,
		modal: true, resizable: false, movable: true,
		scrollbars: true, menubar: false, status: false, toolbar: false, query:webMI.query
	});
}

/**
 ** Value changed write to config
 **/
if(isDiscrete){
	//opens nodeselector for path
	webMI.trigger.connect("valuechanged", function(e) {
		stateValue = e.value;
		openNodeSelector(e.value, "value", stateValue);
		if(e.value !== "Value"){
			webMI.gfx.setVisible("nodeselect_discrete", null);
		}else{
			webMI.gfx.setVisible("nodeselect_discrete", false);
		}
	}, "combobox_value");

	//value_compare
	webMI.trigger.connect("valuechanged", function(e) { config.value_compare = e.value; }, "value_compare");
	
	//value check and coler if wrong
	webMI.trigger.connect("valuechanged", function(e) {
		e.value = webMI.secureString(e.value);
		config.value = e.value;
		if(checkInputType(e.value, stateValue)){
			if(webMI.gfx.getStroke("value") !== null){
				webMI.gfx.setStroke("value", null);
			}
			correct = false;
		}else{
			webMI.gfx.setStroke("value", "#ff0000");
			correct = false;
		}
	}, "value");
}else{
	//lower_limit opens nodeselector for path
	webMI.trigger.connect("valuechanged", function(e) {
		stateLower = e.value;
		openNodeSelector(e.value,"lower_limit",stateLower);
		if(e.value !== "Value"){
			webMI.gfx.setVisible("nodeselect_lower", null);
		}else{
			webMI.gfx.setVisible("nodeselect_lower", false);
		}
	}, "combobox_lower_limit");
	
	//lower_limit check and coler if wrong
	webMI.trigger.connect("valuechanged", function(e) {
		e.value = webMI.secureString(e.value);
		config.lower_limit = e.value;
		if(checkInputType(e.value,stateLower)){
			if(webMI.gfx.getStroke("lower_limit") !== null){
				webMI.gfx.setStroke("lower_limit", null);
			}
			correct = false;
		}else{
			webMI.gfx.setStroke("lower_limit", "#ff0000");
			correct = false;
		}
	}, "lower_limit");
	
	//lower_limit_compare
	webMI.trigger.connect("valuechanged", function(e) { config.lower_limit_compare = e.value; }, "lower_limit_compare");
	
	//opens nodeselector for path
	webMI.trigger.connect("valuechanged", function(e) {
		stateUpper = e.value;
		openNodeSelector(e.value, "upper_limit", stateUpper);
		if(e.value !== "Value"){
			webMI.gfx.setVisible("nodeselect_upper", null);
		}else{
			webMI.gfx.setVisible("nodeselect_upper", false);
		}
	}, "combobox_upper_limit");
	
	//upper_limit check and coler if wrong
	webMI.trigger.connect("valuechanged", function(e) {
		e.value = webMI.secureString(e.value);
		config.upper_limit = e.value;
		if(checkInputType(e.value, stateUpper)){
			if(webMI.gfx.getStroke("upper_limit") !== null){
				webMI.gfx.setStroke("upper_limit", null);
			}
			correct = false;
		}else{
			webMI.gfx.setStroke("upper_limit", "#ff0000");
			correct = false;
		}
	}, "upper_limit");
	
	//upper_limit_compare
	webMI.trigger.connect("valuechanged", function(e) { config.upper_limit_compare = e.value; }, "upper_limit_compare");
}

/**
 ** Buttons (...) onclicks open nodeselector
 **/
webMI.trigger.connect("clicked", function(){
	webMI.trigger.fire("getSelectedItem", function(e){
		openNodeSelector(e.value, "value", stateValue);
	},"combobox_value");
}, "nodeselect_discrete");

webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("getSelectedItem", function(e){
		openNodeSelector(e.value, "lower_limit", stateLower);
	},"combobox_lower_limit");
}, "nodeselect_lower");

webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("getSelectedItem", function(e){
		openNodeSelector(e.value, "upper_limit", stateUpper);
	},"combobox_upper_limit");
}, "nodeselect_upper");

//active_message
webMI.trigger.connect("valuechanged", function(e) {
	e.value = webMI.secureString(e.value);
	config.active_message[""] = e.value;
}, "active_message");
//inactive_message
webMI.trigger.connect("valuechanged", function(e) {
	e.value = webMI.secureString(e.value); 
	config.inactive_message[""] = e.value;
}, "inactive_message");
//explicit_acknowledgement
webMI.trigger.connect("valuechanged", function(e) { config.explicit_acknowledgement = e.value; }, "explicit_acknowledgement");
//max_time_shelved
webMI.trigger.connect("valuechanged", function(e) { config.max_time_shelved = e.value; }, "max_time_shelved");
//on_delay
webMI.trigger.connect("valuechanged", function(e) { config.on_delay = e.value; }, "on_delay");
//off_delay
webMI.trigger.connect("valuechanged", function(e) { config.off_delay = e.value; }, "off_delay");
//modify_script
webMI.trigger.connect("valuechanged", function(e) {
	if(e.value === "") {
		config.modify_script = "i=0"
	}else{
		config.modify_script = "ns=1;s=" + e.value;
	}
}, "modify_script");
webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("setSelectedItem", "", "modify_script");
}, "btn_clear_mod");
//prevention_script
webMI.trigger.connect("valuechanged", function(e) {
	if(e.value === "") {
		config.prevention_script = "i=0"
	}else{
		config.prevention_script = "ns=1;s=" + e.value;
	}
}, "prevention_script");
webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("setSelectedItem", "", "prevention_script");
}, "btn_clear_prev");
//category
webMI.trigger.connect("valuechanged", function(e) {
	setTimeout(() => {
		webMI.trigger.fire("getSelectedItem", function(e){config.category = e.text},"category");
	}, "500");
}, "category");

/**
 ** button cancel clicked, close window
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.display.closeWindow();
	if(!isMod)
	webMI.trigger.fire("closeAddPage");
}, "btn_cancel");

/**
 ** checks the value again and calls script EditCondition
 **/
webMI.trigger.connect("clicked", function(e){
	if(checkInputType(config.value, stateValue) || checkInputType(config.lower_limit, stateLower) || checkInputType(config.upper_limit,stateUpper)){
		stateObj = {value:stateValue, lower_limit:stateLower, upper_limit:stateUpper};
		webMI.data.call("EditCondition", {address:address, config:JSON.stringify(config), isDiscrete:isDiscrete, parentAddress:parentAddress, parentDataType:parentDataType, states:JSON.stringify(stateObj)} ,function(){});
		setTimeout(() => {
			webMI.display.closeWindow();
			webMI.trigger.fire(webMI.query.triggerName);
		}, "100");
	}
}, "btn_safe");

/**
 ** calls the script AddCondition
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.data.call("AddCondition", {
		newConfig:webMI.query.newConfig, //Bool
		alarmName:webMI.query.alarmName,//newAlarm
		conditionName:name,	//condition Name 1
		conditionType:webMI.query.conditionType, //Discrete
		config:JSON.stringify(config), //Obj mit werten
		parentDataType:parentDataType, //Datentyp des Parents
		address:parentAddress,
		states:JSON.stringify({value:stateValue,lower_limit:stateLower,upper_limit:stateUpper})
	} ,function(){});
	setTimeout(() => {
		webMI.display.closeWindow();
		webMI.trigger.fire(webMI.query.triggerName);
		webMI.trigger.fire("closeAddPage");
	}, "200");
}, "btn_create");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.selector" BrowseName="1:selector" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">selector</DisplayName>
		<Description Locale="en">selector</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="520" version="1.2" width="380" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <title>Selector Dialog</title>
 <metadata>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <foreignObject height="330" id="address_treeview_copy" width="320" x="30" y="30">
  <div id="address_treeview_copy" style="width:100%;height:100%" xmlns="http://www.w3.org/1999/xhtml"/>
 </foreignObject>
 <svg atv:refpx="310" atv:refpy="480.009" height="30" id="btn_copy" transform="matrix(1.25,0,0,1.3333,0,0)" width="80" x="208" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="345.009">
  <atv:argument name="label" value="T{Copy}"/>
  <atv:argument name="tabIndex" value="4"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,0.75,0,0)" x="40" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="190" atv:refpy="480.009" height="30" id="btn_cancel" transform="matrix(1.25,0,0,1.3333,0,0)" width="80" x="112" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="345.009">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="tabIndex" value="2"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,0.75,0,0)" x="40" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="310" atv:refpy="480.009" height="30" id="btn_select" transform="matrix(1.25,0,0,1.3333,0,0)" width="80" x="208" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="345.009">
  <atv:argument name="label" value="T{Select}"/>
  <atv:argument name="tabIndex" value="3"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,0.75,0,0)" x="40" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="100"/>
 </svg>
 <g atv:refpx="190" atv:refpy="410" id="group_name">
  <svg atv:refpx="249.976" atv:refpy="410.006" height="30" id="conf_name" transform="matrix(1.375,0,0,1.3333,0,0)" width="160" x="101.818" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="292.507">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="allowDirectInput" value="Yes"/>
   <atv:argument name="tabIndex" value="1"/>
   <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
   <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
   <atv:overwrite id="input_label" transform="matrix(0.7273,0,0,0.75,0,0)" x="212.055" y="24.465"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.7273,0,0,0.75,0,0)" width="212"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.7273,0,0,0.75,0,0)" width="216"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.7273,0,0,0.75,0,0)" width="212"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.7273,0,0,0.75,0,0)" width="218"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.7273,0,0,0.75,0,0)" width="220"/>
  </svg>
  <text atv:refpx="79" atv:refpy="409.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_19" x="25" y="415.5">T{Alarm Name}:</text>
 </g>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var id_treeview_copy = document.getElementById("address_treeview_copy").id;
var treeViewCopy;
var targetAddress = "";
var gAccessControlManager;
var isCopy = webMI.query.isCopy === "true";
var startaddress = webMI.query.startAddress;
var triggerName = webMI.query.newTriggerName;
var id = webMI.query.id;
var state = webMI.query.state;
var alarmName;
var newConfig;

/**
 ** de/activates button select/copy depending from where the display is called
 **/
if(isCopy){
	webMI.gfx.setVisible("btn_select", false);
	webMI.gfx.setVisible("btn_copy", null);
	webMI.trigger.fire("com.atvise.setActive", false, "conf_name");
	webMI.gfx.setVisible("group_name", null);
	webMI.trigger.fire("com.atvise.setActive", false, "btn_copy");
}else{
	webMI.gfx.setVisible("btn_select", null);
	webMI.gfx.setVisible("btn_copy", false);
	webMI.gfx.setVisible("group_name", false);
	webMI.trigger.fire("com.atvise.setActive", false, "btn_select");
}


/**
 ** load Accesscontrol if not loaded
 **/
if (webMI.getAccessControlSupport()) {
	gAccessControlManager = webMI.callExtension("SYSTEM.LIBRARY.ATVISE.QUICKDYNAMICS.Access Control Manager");
}

/**
 ** Access Control handler
 **/
function handleAccessControlResponse(compareRights, successCallback, failCallback) {
	if (!gAccessControlManager) {
		successCallback();
		return;
	}
	
	
	var requiredRights = {
		nodeIds: [],
		rights: []
	};
	
	compareRights = [].concat(compareRights);
	compareRights.forEach(function(r) {
		requiredRights.nodeIds.push(r.node);
		requiredRights.rights.push(r.right);
	});

	gAccessControlManager.getRightsDict(requiredRights.nodeIds, requiredRights.rights, function(response) {
		// do the checks
		var allRights = true;

		for (var c in compareRights) {
			if (
				typeof response[compareRights[c].node] != "undefined" &&
				typeof response[compareRights[c].node][compareRights[c].right] != "undefined"
			) {
				allRights = allRights && response[compareRights[c].node][compareRights[c].right];
			} else {
				allRights = false;
				break;
			}
		}
		if (allRights) {
			successCallback();
		} else {
			failCallback();
		}
	});
}

/**
 ** Function to build the treeview
 **/
function buildTree(startaddress = "AGENT.OBJECTS", dataSource = "treeView/datasources/opcua.js", dataSourceType = "opcUA") {
	if(startaddress === "") startaddress = "AGENT.OBJECTS";
	treeViewCopy = webMI.callExtension("SYSTEM.LIBRARY.PROJECT.QUICKDYNAMICS.TreeView", {
		busyIndicatorTolerance: "100",
		expandoOffset: "3",
		imagePaths:
		'{"baseVariableImage":"/treeView/icons/baseVariable.svg","folderImage":"/treeView/icons/folder.svg","aggregateFunctionImage":"/treeView/icons/aggregateFunction.svg","collapsedLeafImage":"/treeView/icons/leafCollapsed.svg","expandedLeafImage":"/treeView/icons/leafExpanded.svg"}',
		fontSize: "18",
		startAddress: startaddress,
		id: "address_treeview_copy",//id_treeview_copy,
		leafIndentation: "15",
		leafPadding: "2",
		nodesWithAlarm: true,
		renderTo: "address_treeview_copy",//id_treeview_copy,
		dataSourceFilePath: dataSource,
		dataSourceType: dataSourceType,
	});

	
	//Onclick sobald auf ein Leave gedrückt wird
	treeViewCopy.on("select", function (e) {
		targetAddress =e.data.address;
		webMI.data.call("HasAlarmConfiguration",{address: targetAddress}, function (x){
			if(x.result){
				webMI.trigger.fire("com.atvise.setActive", false, "conf_name");
				webMI.trigger.fire("setValue", x.result, "conf_name");
				newConfig = false;
			}else{
				webMI.trigger.fire("com.atvise.setActive", true, "conf_name");
				webMI.trigger.fire("setValue", "New_Alarm_Name", "conf_name");
				newConfig = true;		
			}
			webMI.trigger.fire("com.atvise.setActive", true, "btn_copy");
			webMI.trigger.fire("com.atvise.setActive", true, "btn_select");
		});
	});
}

buildTree(startaddress);


webMI.trigger.connect("valuechanged", function(e) {
	e.value = webMI.secureString(e.value);
	alarmName = e.value;
}, "conf_name");

/**
 ** button cancle click
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.display.closeWindow();
}, "btn_cancel");

/**
 ** button copy click
 **/
webMI.trigger.connect("clicked", function(e){
	if(targetAddress === "" || alarmName === ""){
		alert("T{Choose a target node! / Choose an Alarm Name}");
	}else{
		handleAccessControlResponse([{ node: targetAddress, right: "engineer" }], function() {
			webMI.trigger.fire(triggerName, {targetAddress: targetAddress, alarmName: alarmName, newConfig:newConfig});
			webMI.display.closeWindow(); 
		},function(){
			alert("T{Insufficient Rights to write to} " + targetAddress);		
		});
	}
}, "btn_copy");

/**
 ** button select click
 **/
webMI.trigger.connect("clicked", function(e){
	if(targetAddress === ""){
		alert("T{Choose a target node!}");
	}else{
		handleAccessControlResponse([{ node: targetAddress, right: "read" }], function() {
			webMI.trigger.fire(triggerName, {targetAddress:targetAddress, id:id, state:state});
			webMI.display.closeWindow();
		},function(){
			alert("T{Insufficient Rights to read from} " + targetAddress);		
		});
	}
}, "btn_select");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.alarm_manager" BrowseName="1:alarm_manager" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">alarm_manager</DisplayName>
		<Description Locale="en">alarm_manager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="890" version="1.2" width="1675" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <desc>Overview and management of alarms and conditions.</desc>
 <title>Alarm Manager</title>
 <metadata>
  <atv:parameter behavior="optional" defaultvalue="SYSTEM.GLOBALS.atvFillColor" desc="$FILLCOLOR$" name="$FILLCOLOR$" substitute="$FILLCOLOR$" valuetype="global"/>
  <atv:parameter behavior="optional" defaultvalue="SYSTEM.GLOBALS.atvFontColor" desc="$FONTCOLOR$" name="$FONTCOLOR$" substitute="$FONTCOLOR$" valuetype="global"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <rect atv:refpx="837.5" atv:refpy="40" fill="$FILLCOLOR$" height="80" id="id_1" rx="0" ry="0" stroke="#000000" stroke-width="1" width="1675" x="0" y="0"/>
 <foreignObject height="620" id="address_treeview" width="390" x="30" y="180">
  <div id="address_treeview" style="width:100%;height:100%" xmlns="http://www.w3.org/1999/xhtml"/>
 </foreignObject>
 <svg atv:refpx="1029.472" atv:refpy="519.974" height="640" id="id_2" transform="matrix(1.9047,0,0,1.0625,0,0)" width="640" x="220.507" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.slickgrid.table" y="169.412">
  <atv:argument name="tableID" value="table_1"/>
 </svg>
 <svg atv:refpx="1209.603" atv:refpy="130.003" height="30" id="btnAdd" transform="matrix(1.74,0,0,2,0,0)" width="80" x="655.172" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="50">
  <atv:argument name="label" value="T{Add}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="3"/>
  <atv:overwrite height="58" id="id_6" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="41.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="26.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="34.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="51.292"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="29.959"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5747,0,0,0.5,0,0)" x="59.6" y="20"/>
  <atv:overwrite height="56" id="button_stroke" transform="matrix(0.5747,0,0,0.5,0,0)" width="135.2"/>
  <atv:overwrite height="58" id="button_bg" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite height="60" id="outer_frame" transform="matrix(0.5747,0,0,0.5,0,0)" width="139.2"/>
 </svg>
 <svg atv:refpx="1389.601" atv:refpy="130.002" height="30" id="btnDelete" transform="matrix(1.74,0,0,2,0,0)" width="80" x="758.62" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="50">
  <atv:argument name="label" value="T{Remove}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="4"/>
  <atv:overwrite height="58" id="id_6" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="41.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="26.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="34.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="51.292"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="29.959"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5747,0,0,0.5,0,0)" x="59.6" y="20"/>
  <atv:overwrite height="56" id="button_stroke" transform="matrix(0.5747,0,0,0.5,0,0)" width="135.2"/>
  <atv:overwrite height="58" id="button_bg" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite height="60" id="outer_frame" transform="matrix(0.5747,0,0,0.5,0,0)" width="139.2"/>
 </svg>
 <svg atv:refpx="1569.601" atv:refpy="130.003" height="30" id="btnCopy" transform="matrix(1.74,0,0,2,0,0)" width="80" x="862.068" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="50">
  <atv:argument name="label" value="T{Copy to Node}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:overwrite height="58" id="id_6" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="41.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="26.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="34.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="51.292"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="29.959"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5747,0,0,0.5,0,0)" x="59.6" y="20"/>
  <atv:overwrite height="56" id="button_stroke" transform="matrix(0.5747,0,0,0.5,0,0)" width="135.2"/>
  <atv:overwrite height="58" id="button_bg" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite height="60" id="outer_frame" transform="matrix(0.5747,0,0,0.5,0,0)" width="139.2"/>
 </svg>
 <svg atv:refpx="250" atv:refpy="129.999" height="30" id="picker_address" transform="matrix(1.375,0,0,2,0,0)" width="160" x="101.818" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_address" y="50">
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite height="60" id="addresspicker_clickarea" transform="matrix(0.7273,0,0,0.5,0,0)" x="192"/>
  <atv:overwrite height="56" id="focus_frame" transform="matrix(0.7273,0,0,0.5,0,0)" width="216"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.7273,0,0,0.5,0,0)" x="195" y="20"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.7273,0,0,0.5,0,0)" x="194.75" y="20"/>
  <atv:overwrite id="button_bg" transform="matrix(0.7273,0,0,0.5,0,0)" x="195" y="20"/>
  <atv:overwrite id="input_label" transform="matrix(0.7273,0,0,0.5,0,0)" x="186" y="34.25"/>
  <atv:overwrite height="52" id="blinking_frame" transform="matrix(0.7273,0,0,0.5,0,0)" width="188"/>
  <atv:overwrite height="52" id="addresspicker_bg" transform="matrix(0.7273,0,0,0.5,0,0)" width="188"/>
  <atv:overwrite height="58" id="id_0" transform="matrix(0.7273,0,0,0.5,0,0)" width="218"/>
  <atv:overwrite height="60" id="addresspicker_stroke" transform="matrix(0.7273,0,0,0.5,0,0)" width="220"/>
 </svg>
 <svg atv:refpx="402.44" atv:refpy="124.567" height="30" id="checkBox_alarms" transform="matrix(1.4056,0,0,0.9712,0,0)" width="160" x="270.348" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.checkbox" y="119.436">
  <atv:argument name="label" value="T{Filter for Alarms}"/>
  <atv:argument name="valueOn" value="0"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="tooltip" value="T{Show only nodes with Alarmconfiguration}"/>
  <atv:argument name="tabIndex" value="2"/>
  <atv:overwrite id="checkbox_item" transform="matrix(0.7114,0,0,1.0297,0,0)" y="19.568"/>
  <atv:overwrite id="checkbox_symbol" transform="matrix(0.7114,0,0,1.0297,0,0)" y="4.318"/>
  <atv:overwrite id="blinking_frame" transform="matrix(0.7114,0,0,1.0297,0,0)" y="3.318"/>
  <atv:overwrite height="24.936" id="focus_frame" transform="matrix(0.7114,0,0,1.0297,0,0)"/>
  <atv:overwrite id="checkbox_bg" transform="matrix(0.7114,0,0,1.0297,0,0)" y="3.318"/>
  <atv:overwrite height="27.136" id="checkbox_frame" transform="matrix(0.7114,0,0,1.0297,0,0)"/>
  <atv:overwrite height="29.136" id="checkbox_stroke" transform="matrix(0.7114,0,0,1.0297,0,0)"/>
 </svg>
 <svg atv:refpx="40" atv:refpy="35" height="60" id="id_3" transform="matrix(1,0,0,1.1667,0,0)" width="60" x="10" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Symbols.60x60.alarm" y="0"/>
 <text atv:refpx="191.375" atv:refpy="43" fill="$FONTCOLOR$" font-family="Arial" font-size="28" id="id_8" text-anchor="start" x="84" y="50.5">Alarm Manager</text>
 <text atv:refpx="63.248" atv:refpy="130" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_5" x="25" y="134.5">T{Start address}:</text>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var TableController;
var treeView;
var startAddress = "";
var allNodes = true;
var treeReady = false;
var currLocation = "";
var gAccessControlManager;
var id_treeview = document.getElementById("address_treeview").id;
webMI.trigger.fire("reloadButtons");
webMI.trigger.fire("setChecked", false, "checkBox_alarms");

/**
 ** Onload build the treeview
 **/
webMI.addOnload(function (e) {
	buildTree();
});

/**
 ** Reloads the AccessControl
 **/
if (webMI.getAccessControlSupport()) {
	gAccessControlManager = webMI.callExtension("SYSTEM.LIBRARY.ATVISE.QUICKDYNAMICS.Access Control Manager");
}

/**
 ** AccessControl Handler
 **/
function handleAccessControlResponse(compareRights, successCallback, failCallback) {
	if (!gAccessControlManager) {
		successCallback();
		return;
	}


	var requiredRights = {
		nodeIds: [],
		rights: []
	};

	compareRights = [].concat(compareRights);
	compareRights.forEach(function (r) {
		requiredRights.nodeIds.push(r.node);
		requiredRights.rights.push(r.right);
	});

	gAccessControlManager.getRightsDict(requiredRights.nodeIds, requiredRights.rights, function (response) {
		// do the checks
		var allRights = true;

		for (var c in compareRights) {
			if (
				typeof response[compareRights[c].node] != "undefined" &&
				typeof response[compareRights[c].node][compareRights[c].right] != "undefined"
			) {
				allRights = allRights && response[compareRights[c].node][compareRights[c].right];
			} else {
				allRights = false;
				break;
			}
		}
		if (allRights) {
			successCallback();
		} else {
			failCallback();
		}
	});
}

/**
 ** Function to build the treeview
 **/
function buildTree(startaddress = "AGENT.OBJECTS", dataSource = "treeView/datasources/opcua.js", dataSourceType = "opcUA") {
	if (startaddress === "") startaddress = "AGENT.OBJECTS";
	treeView = webMI.callExtension("SYSTEM.LIBRARY.PROJECT.QUICKDYNAMICS.TreeView", {
		busyIndicatorTolerance: "100",
		expandoOffset: "3",
		imagePaths:
			'{"baseVariableImage":"/treeView/icons/baseVariable.svg","folderImage":"/treeView/icons/folder.svg","aggregateFunctionImage":"/treeView/icons/aggregateFunction.svg","collapsedLeafImage":"/treeView/icons/leafCollapsed.svg","expandedLeafImage":"/treeView/icons/leafExpanded.svg"}',
		fontSize: "18",
		startAddress: startaddress,
		id: id_treeview,
		leafIndentation: "15",
		leafPadding: "2",
		nodesWithAlarm: true,
		renderTo: id_treeview,
		dataSourceFilePath: dataSource,
		dataSourceType: dataSourceType,
	});

	//tree ready loaded
	treeView.on("ready", function (e) {
		treeReady = true;
	});

	//onclick
	treeView.on("select", function (e) {
		currLocation = e.data.address;
		loadNode(currLocation);
	});
}

/**
 ** Create the table
 **/
webMI.table.loadResources(function () {
	var config = [];

	//Table definition
	config.columns = [
		{ id: "type", name: "T{Type}", field: "type", sortable: true, filter: true, visible: true, width: 90, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "edit", name: "T{Edit}", field: "edit", sortable: false, filter: false, visible: true, width: 50, sortByDefault: false, sortByDefaultAsc: true, formatter: function (row, cell, value, columnDef, dataContext) { return "<div style='width:100%; text-align:center;'><i class='fas fa-edit'></i></div>"; } },
		{ id: "name", name: "T{Name}", field: "name", sortable: true, filter: true, visible: true, width: 300, sortByDefault: true, sortByDefaultAsc: true },
		{ id: "category", name: "T{Category}", field: "category", sortable: true, filter: true, visible: true, width: 200, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "value_string", name: "T{Limits}", field: "value_string", sortable: false, filter: false, visible: true, width: 300, sortByDefault: false, sortByDefaultAsc: false, formatter: function (row, cell, value, columnDef, dataContext) { return value; } },
		{ id: "activeText", name: "T{Active Message}", field: "activeText", sortable: true, filter: true, visible: true, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "inactiveText", name: "T{Inactive Message}", field: "inactiveText", sortable: true, filter: true, visible: true, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "delay_on", name: "T{Delay on}", field: "delay_on", sortable: false, filter: true, visible: true, width: 90, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "delay_off", name: "T{Delay off}", field: "delay_off", sortable: false, filter: true, visible: true, width: 90, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "prevention_script", name: "T{Prevention Script}", field: "prevention_script", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "modification_script", name: "T{Modification Script}", field: "modification_script", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "value", name: "T{value}", field: "value", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "value_compare", name: "T{value_compare}", field: "value_compare", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "lower_limit_compare", name: "T{lower_limit_compare}", field: "lower_limit_compare", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "lower_limit", name: "T{lower_limit}", field: "lower_limit", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "upper_limit_compare", name: "T{upper_limit_compare}", field: "upper_limit_compare", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "upper_limit", name: "T{upper_limit}", field: "upper_limit", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },

	];

	config.mode = "once";

	//Insert Data
	config.dataRequestFunction = function customDataRequest() {
		TableController = this;
		loadNode();
	};

	//Onclick
	config.onClickCallback = function (e, clickinfo) {
		if (clickinfo.column.id === "edit" || clickinfo.column.id === "atvise_marker") {
			clickHandler(clickinfo);
		}
	};

	//onclick
	config.onHeaderClickCallback = function (e, clickinfo) {
		if (clickinfo.column.id === "atvise_marker") {
			clickHandler(clickinfo);
		}
	};

	// *** END CONFIGURATION SECTION ***
	webMI.table.register("table_1", "config", config);
	webMI.table.setReady("table_1", "config");
});

/**
 ** Function called by the on click listener from the table, opens the edit page or reloadButtons
 **/
function clickHandler(clickinfo) {
	if (clickinfo.column.id === "edit") {
		webMI.query.name = clickinfo.item.name;
		webMI.query.address = clickinfo.item.address;
		webMI.query.conditionType = clickinfo.item.type;
		webMI.query.triggerName = "reloadAtCurrLocation";
		webMI.query.currLocation = currLocation;
		webMI.query.isMod = true;
		if (clickinfo.item.type === "Discrete" || clickinfo.item.type === "Retrigger") {
			webMI.query.isDiscrete = true;
		} else {
			webMI.query.isDiscrete = false;
		}
		webMI.display.openWindow({
			display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.edit_alarm",
			height: 740, width: 1280, remember: true,
			modal: true, resizable: false, movable: true,
			scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
		});
	}
	webMI.trigger.fire("reloadButtons");
}

/**
 ** Trigger to de/activate the buttons based on rights and selected data
 **/
webMI.trigger.connect("reloadButtons", function (e) {
	setTimeout(() => {
		if (currLocation !== "") {
			handleAccessControlResponse([{ node: currLocation, right: "engineer" }, { node: "AGENT.ALARMING", right: "read" }], function () {
				if (TableController) {
					webMI.trigger.fire("com.atvise.setActive", true, "btnAdd");
					if (TableController.getSelectedItems().length > 0) {
						webMI.trigger.fire("com.atvise.setActive", true, "btnDelete");
						webMI.trigger.fire("com.atvise.setActive", true, "btnCopy");
					} else {
						webMI.trigger.fire("com.atvise.setActive", false, "btnDelete");
						webMI.trigger.fire("com.atvise.setActive", false, "btnCopy");
					}
				}
			}, function () {
				webMI.trigger.fire("com.atvise.setActive", false, "btnAdd");
				webMI.trigger.fire("com.atvise.setActive", false, "btnDelete");
				webMI.trigger.fire("com.atvise.setActive", false, "btnCopy");
			});
		} else {
			webMI.trigger.fire("com.atvise.setActive", false, "btnAdd");
			webMI.trigger.fire("com.atvise.setActive", false, "btnDelete");
			webMI.trigger.fire("com.atvise.setActive", false, "btnCopy");
		}
	}, 100);
});

/**
 ** Function to clear the table
 **/
function clearTable() {
	if (TableController) {
		TableController.clearData();
	}
}

/**
 ** Function to clear the table and insert new data
 **/
function loadNode(address = "") {
	if (address !== "") {
		var data = { result: [] };
		webMI.data.call("GetConditions", { "address": address, "justOneConfig": false }, function (param) {
			if (param.length > 0) {
				param.forEach(item => {
					data.result.push(item);
				});
				clearTable()
				if (TableController) {
					TableController.addData(data);
				}
			} else {
				clearTable()
			}
		});
	} else {
		clearTable()
	}
	webMI.trigger.fire("reloadButtons");
}

/**
 ** Trigger to reload table
 **/
webMI.trigger.connect("reloadAtCurrLocation", function (e) {
	setTimeout(() => {
		loadNode(currLocation);
	}, 100);
});

/**
 ** Trigger checkbox filter for nodes with alarm configuration
 **/
webMI.trigger.connect("valuechanged", function (e) {
	if (treeReady) {
		treeView.destroy();
		if (Boolean(Number(e.value))) {
			buildTree(startAddress, "treeView/datasources/opcuaAlarms.js", "opcUA_Alarms")
		} else {
			buildTree(startAddress)
		}	//Tabelle leeren
		loadNode();
	}
	currLocation = "";
	webMI.trigger.fire("reloadButtons");
}, "checkBox_alarms");

/**
 ** Trigger valuechanged address picker
 **/
webMI.trigger.connect("valuechanged", function (e) {
	startAddress = e.value;
	if (treeReady) {
		treeView.destroy();
		buildTree(startAddress);
		treeReady = false;
		webMI.trigger.fire("setChecked", false, "checkBox_alarms");
		loadNode();
	}
}, "picker_address");

/**
 ** Add alarm Section
 **/
var addPage;
webMI.trigger.connect("clicked", function (e) {
	webMI.data.call("HasAlarmConfiguration", { "address": currLocation }, function (e) {
		webMI.query.address = currLocation;
		webMI.query.alarmName = e.result ? e.result : null;
		webMI.data.call("GetConditionType", { "address": currLocation }, function (x) {
			webMI.query.conditionType = x.result ? x.result : null;
			addPage = webMI.display.openWindow({
				display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.add_alarm",
				height: 280, width: 500, remember: true,
				modal: true, resizable: false, movable: true,
				scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
			});
		});
	});
}, "btnAdd");

/**
 ** Remove alarm Section
 **/
webMI.trigger.connect("remove_alarm", function (e) {
	var del_list = TableController.getSelectedItems();
	del_list.forEach(item => {
		webMI.data.call("DeleteCondition", { "address": item.address }, function () {
			loadNode(treeView.getSelectedNode().address);
		});
	});
});

webMI.trigger.connect("closeAddPage", function (e) {
	addPage.close();
});

webMI.trigger.connect("clicked", function (e) {
	webMI.query.triggerName = "remove_alarm";
	webMI.query.dialogTitle = "T{Remove Alarm Config}:";
	webMI.query.dialogMessageLine1 = "T{Do you want to delete the selected alarm(s)}";
	webMI.query.dialogMessageLine2 = "";
	webMI.display.openWindow({
		display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.delete_alarm",
		height: 310, width: 600, remember: true,
		modal: true, resizable: false, movable: true,
		scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
	});
}, "btnDelete");

/**
 ** Copy alarm Section
 **/

function getStates(config_table) {
	var obj = { value: null, lower_limit: null, upper_limit: null };
	if (config_table.type !== "Limit") { //discrete
		if (config_table.value === null) {
			obj.value = "Value";
		} else {
			if (config_table.value.toString().startsWith("ns=1;s")) {
				obj.value = "Node absolute";
			}
			else if (config_table.value.toString().trim().startsWith("<") && config_table.value.toString().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(config_table.value.toString().trim())) {
				obj.value = "Node relative";
			} else {
				obj.value = "Value";
			}
		}
	} else {
		if (config_table.lower_limit === null) {
			obj.lower_limit = "Value";
		} else {
			if (config_table.lower_limit.toString().startsWith("ns=1;s")) {
				obj.lower_limit = "Node absolute";
			}
			else if (config_table.lower_limit.toString().trim().startsWith("<") && config_table.lower_limit.toString().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(config_table.lower_limit.toString().trim())) {
				obj.lower_limit = "Node relative";
			} else {
				obj.lower_limit = "Value";
			}
		}
		if (config_table.upper_limit == null) {
			obj.upper_limit = "Value";
		} else {
			if (config_table.upper_limit.toString().startsWith("ns=1;s")) {
				obj.upper_limit = "Node absolute";
			} else if (config_table.upper_limit.toString().trim().startsWith("<") && config_table.upper_limit.toString().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(config_table.upper_limit.toString().trim())) {
				obj.upper_limit = "Node relative";
			} else {
				obj.upper_limit = "Value";
			}
		}
	}
	return obj;
}

webMI.trigger.connect("StartToCopy", function (e) {
	webMI.data.call("CopyCondition", { config_table: JSON.stringify(config_table), targetAddress: e.value.targetAddress, states: JSON.stringify(getStates(config_table[0])), alarmName: e.value.alarmName, newConfig: e.value.newConfig }, function (x) {
		if (!x.result) {
			webMI.query.message = "T{Something unexpected happend\nTo see more take a look in the Log\nNo copies were made}";
		} else {
			webMI.query.message = "T{Copy completed successfully}"
		}
		webMI.query.headline = "T{Copy to Node}";
		webMI.display.openWindow({
			display: "SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.dialogs.message_dialog_small",
			width: 450,
			height: 140,
			query: webMI.query
		});
	});
});

webMI.trigger.connect("clicked", function (e) {
	webMI.query.isCopy = true;
	webMI.query.startAddress = "";
	webMI.query.newTriggerName = "StartToCopy";

	config_table = TableController.getSelectedItems();
	webMI.display.openWindow({
		display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.selector",
		height: 420, width: 380, remember: true,
		modal: true, resizable: false, movable: true,
		scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
	});
}, "btnCopy");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.QUICKDYNAMICS.TreeView" ExportedBrowseName="1:TreeView" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.QUICKDYNAMICS" BrowseName="1:QUICKDYNAMICS">
		<DisplayName Locale="en">QUICKDYNAMICS</DisplayName>
		<Description Locale="en">QUICKDYNAMICS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.QUICKDYNAMICS.TreeView" BrowseName="1:TreeView" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">TreeView</DisplayName>
		<Description Locale="en">TreeView</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.QUICKDYNAMICS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.QuickDynamic</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <icon type="image/png">iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAA9klEQVRYR+2U0Q3DIAxEM0JG6GKVulkzSkbqBtQnsArWVTW0xIrUj2cJ25wdTFhSSqFkc72vwiYkB8hbrdAo2fiLK5sVGiUbpzDiJe/B4iNk82rgYhNqENdcGxslG/miIhx2AuF3IPYveAcKWh8DDQk78j+AnKb5RsiCTdbHKMKsIGNv9tYLCzZYH6MSv7E4QEzzGn+9sOiGDn7fgPUxJC98BLGX8BuoUzlNAzhWIW4ERZgVZPRdwk7CfsPwBuaNwPoYkvd/B4ahTsXbAI5ViBtBEWYFGSd6B7yoMIqwOEBM8xp/vRhFROeMwIuIzrmER0Cdx5GWJ2HIp5zjmg5LAAAAAElFTkSuQmCC</icon>
    <visible>1</visible>
    <title>Tree View</title>
    <description>Creates a tree view to display nodes.</description>
  </metadata>
  <parameter behavior="mandatory" desc="foreign object ID" name="renderTo" valuetype="string"/>
  <parameter behavior="optional" defaultvalue="AGENT.OBJECTS" desc="start address" name="startAddress" valuetype="address"/>
  <parameter behavior="mandatory" defaultvalue="100" desc="busy indicator delay" name="busyIndicatorTolerance" valuetype="number"/>
  <parameter behavior="optional" defaultvalue="3" desc="icon offset" name="expandoOffset" valuetype="number"/>
  <parameter behavior="optional" defaultvalue="12" desc="font size" name="fontSize" valuetype="number"/>
  <parameter behavior="optional" defaultvalue="{&quot;baseVariableImage&quot;:&quot;/treeView/icons/baseVariable.svg&quot;,&quot;folderImage&quot;:&quot;/treeView/icons/folder.svg&quot;,&quot;aggregateFunctionImage&quot;:&quot;/treeView/icons/aggregateFunction.svg&quot;,&quot;collapsedLeafImage&quot;:&quot;/treeView/icons/leafCollapsed.svg&quot;,&quot;expandedLeafImage&quot;:&quot;/treeView/icons/leafExpanded.svg&quot;}" desc="image paths" name="imagePaths" valuetype="string"/>
  <parameter behavior="optional" defaultvalue="15" desc="child indentation" name="leafIndentation" valuetype="number"/>
  <parameter behavior="optional" defaultvalue="2" desc="margin" name="leafPadding" valuetype="number"/>
  <parameter behavior="optional" defaultvalue="[&quot;baseVariable&quot;, &quot;aggregateFunction&quot;]" desc="type filter" name="selectableTypes" valuetype="string"/>
  <parameter behavior="optional" defaultvalue="100" desc="search depth" name="searchDepth" valuetype="string"/>
  <parameter behavior="mandatory" defaultvalue="treeView/datasources/opcua.js" desc="filename of datasource implementation" name="dataSourceFilePath" valuetype="string"/>
  <parameter behavior="mandatory" defaultvalue="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.dialogs.message_dialog_small" desc="display for error message" name="dialogDisplay" valuetype="display"/>
  <parameter behavior="mandatory" defaultvalue="opcUA" desc="name of data source" name="dataSourceType" valuetype="string"/>
  <parameter behavior="mandatory" defaultvalue="{}" desc="options for data source" name="dataSourceOptions" valuetype="string"/>
  <parameter behavior="optional" defaultvalue="true" desc="set caching behavior for tree view" name="nodeCacheActive" valuetype="bool"/>
  <code><![CDATA[return (function (window, document) {
	/**
	 * @callback {function} TreeView#eventCallback
	 * @param {object} data The corresponding node information.
	 * @param {HTMLNode} target The clicked html node.
	 */

	/**
	 * Fired when a node is expanded.
	 * @event TreeView#expand
	 * @type {object}
	 * @property {object} data The corresponding node information.
	 * @property {HTMLNode} target The clicked html node.
	 */

	/**
	 * Fired when all nodes are expanded by calling {@link TreeView#expandAll}
	 * @event TreeView#expandAll
	 * @type {object}
	 * @property {object} data The corresponding node information.
	 * @property {HTMLNode} target The clicked html node.
	 */

	/**
	 * Fired when a node is collapsed.
	 * @event TreeView#collapse
	 * @type {object}
	 * @property {object} data The corresponding node information.
	 * @property {HTMLNode} target The clicked html node.
	 */

	/**
	 * Fired when all nodes are collapsed by calling {@link TreeView#collapseAll}
	 * @event TreeView#collapseAll
	 * @type {object}
	 * @property {object} data The corresponding node information.
	 * @property {HTMLNode} target The clicked html node.
	 */

	/**
	 * Fired a node is selected.
	 * @event TreeView#select
	 * @type {object}
	 * @property {object} data The corresponding node information.
	 * @property {HTMLNode} target The clicked html node.
	 */

	/**
	 * Fired a single node that is rendered the first time. (The first time it is appended to the DOM)
	 * @event TreeView#render
	 * @type {object}
	 * @property {object} data The corresponding node information.
	 * @property {HTMLNode} target The clicked html node.
	 */

	/**
	 * Fired when the TreeView has finished its' initialization.
	 * @event TreeView#ready
	 * @type {object}
	 * @property {object} TreeViewInstance The instance of the TreeView to work on.
	 */
	var events = ["expand", "expandAll", "collapse", "collapseAll", "select", "notFound", "render", "ready"];

	let datasource;

	/**
	 * The configuration object for the TreeView.
	 * @typedef {object} TreeView#options
	 * @property {string} renderTo The id of the container to render the tree to.
	 * @property {string} [startAddress="AGENT.OBJECTS"] The opcUA Address to start displaying the tree from.
	 * @property {array} [selectableTypes = "[baseVariable, aggregateFunction]"] The types of leaves that can be selected. See {@link TreeView#types}
	 * @property {number} [fontSize=12] The font size for the treeView [px].
	 * @property {number} [leafPadding=2] The padding top and bottom between the leaves [px]
	 * @property {number} [leafIndentation=15] The indentation for child leaves [px]
	 * @property {number} [expandoOffset=3] The distance from the expando to the leaf icon[px]
	 * @property {number} [expandoOffset=3] The distance from the expando to the leaf icon[px]
	 * @property {number} [busyIndicatorTolerance=100] The time to has to pass by to start displaying the busy indicator [ms]
	 * @property {number} [searchDepth=100] The folder depth to use for filtering internally.
	 * @property {number} [navigationDepth=100] The folder depth to use for navigating internally.
	 * @property {object} imagePaths The image paths for the tree icons.
	 *     See default:
	 *        <p>- baseVariableImage: "/treeView/icons/baseVariable.svg" </p>
	 *        <p>- folderImage: "/treeView/icons/folder.svg" </p>
	 *        <p>- aggregateFunctionImage: "/treeView/icons/aggregateFunction.svg" </p>
	 *        <p>- collapsedLeafImage: "/treeView/icons/leafCollapsed.svg" </p>
	 *        <p>- expandedLeafImage: "/treeView/icons/leafExpanded.svg" </p>
	 */
	var defaultOptions = {
		renderTo: "",
		startAddress: "AGENT.OBJECTS",
		aggregateAddressPrefix: "AGENT.HISTORY.AGGREGATETEMPLATES",
		dataSourceFilePath: "treeView/datasources/opcua.js",
		fontSize: 12,
		leafPadding: 2,
		leafIndentation: 15,
		busyIndicatorTolerance: 100,
		expandoOffset: 3,
		searchDepth: 100,
		navigationDepth: 1,
		imagePaths: {
			baseVariableImage: "/treeView/icons/baseVariable.svg",
			folderImage: "/treeView/icons/folder.svg",
			aggregateFunctionImage: "/treeView/icons/aggregateFunction.svg",
			collapsedLeafImage: "/treeView/icons/leafCollapsed.svg",
			expandedLeafImage: "/treeView/icons/leafExpanded.svg"
		}
	};

	/**
	 * A helper method for parsing the data-item of a node
	 * @param {HTMLElement} node The corresponding DOM-node
	 * @return {string} object The parsed data-item
	 * @memberOf TreeView
	 * @private
	 */
	function getDataFromNode(node) {
		if (node) {
			return JSON.parse(node.getAttribute("data-item"));
		} else {
			return undefined;
		}
	}

	/**
	 * A class that represents a tree view that shows opcUA nodes.
	 * @param {TreeView#options} options Configuration options.
	 * @class
	 * @alias TreeView
	 */
	function TreeView(options) {
		this.internal = {};
		this.internal.doc = document;
		this.internal.win = window;
		this.internal.options = mergeData(defaultOptions, options);
		this.internal.eventListeners = [];
		this.internal.selectedNodeData = {};
		this.internal.selectedNode = undefined;
		this.internal.scrollWrapper = null;
		this.internal.container = null;
		this.internal.busyIndicator = null;
		this.internal.busyIndicatorWrapper = null;
		this.internal.handlers = {};
		this.internal.node = options.renderTo;
		this.internal.availableAddresses = [];
		this.internal.initialized = false;

		initialize(this);
		webMI.data.loadScript(options.dataSourceFilePath, () => {
			const type = options.dataSourceType;
			datasource = new webMI.rootWindow.treeViewDatasources[type](this.internal.options);
			this.internal.options.selectableTypes = datasource.getSelectableTypes();
			datasource.fetchTreeStructure().then(this.renderDataToDOM.bind(this));
		});
		webMI.addOnunload(this.destroy.bind(this));
	}

	/**
	 * Expands a leaflet by the expando or the leaf text
	 * @param {HTMLElement} node The node that has the data-item attribute on it.
	 * @param {boolean} skipEmit Option to prevent treeView event
	 */
	TreeView.prototype.expand = function (node, skipEmit) {
		var data = getDataFromNode(node);
		var leaves = getChildLeaves(node);

		if (data.hasChildren) {
			if (leaves) {
				leaves.classList.remove("hidden");
				var expando = node.querySelector(".tree-expando");
				expando.src = this.internal.options.languagePrefix + this.internal.options.imagePaths.expandedLeafImage;
				updateScroller(this);
				if (!skipEmit) {
					emit(this, "expand", {
						target: node,
						data: getDataFromNode(node)
					});
				}
			} else {
				showBusyIndicator(this);
				datasource
					.fetchTreeStructure(data.address, node)
					.then((response) => {
						this.renderDataToDOM.bind(this)(response, node);
					})
					.catch((error) => {
						let message = error.toString();

						// Limit message to 200 character and append ellipsis
						if (message.length > 200) {
							message = error.toString().substring(0, 200) + " …";
						}

						this.dialog = webMI.display.openWindow({
							display: base.dialogDisplay,
							height: 160,
							width: 400,
							modal: true,
							resizable: false,
							movable: true,
							scrollbars: false,
							menubar: false,
							status: false,
							toolbar: false,
							query: {
								headline: "T{Tree View} T{Error}!",
								message: message,
								action_btn1: "com.atvise.tree_view_error_dialog"
							}
						});

						if (this.dialog) {
							this.dialog.cuba = function () {
								this.dialog = null;
							};
						}

						webMI.trigger.connect("com.atvise.tree_view_error_dialog", () => {
							webMI.display.closeWindow(this.dialog);
							this.dialog = null;
						});
						console.error(error);
						hideBusyIndicator(this);
					});
			}
		}
	};

	/**
	 * Expands all leaves
	 */
	TreeView.prototype.expandAll = function () {
		var self = this;
		if (self.expandAllInProgress) {
			return;
		}
		self.expandAllInProgress = true;
		showBusyIndicator(self);

		datasource.fetchAvailableNodeAdresses(function (addresses) {
			self.internal.availableAddresses = addresses;
			expandNodeList(self, flattenAddresses(self.internal.availableAddresses), function () {
				emit(self, "expandAll", {});
				hideBusyIndicator(self);
				self.expandAllInProgress = false;
			});
		});
	};

	/**
	 * Collapses a leaf by the expando or the leaf text
	 * @param {HTMLElement} node  The node that has the data-item attribute on it.
	 * @param {boolean} skipEmit Option to prevent treeView event
	 */
	TreeView.prototype.collapse = function (node, skipEmit) {
		var leaves = getChildLeaves(node);

		leaves.classList.add("hidden");
		var expando = node.querySelector(".tree-expando");
		expando.src = this.internal.options.languagePrefix + this.internal.options.imagePaths.collapsedLeafImage;
		updateScroller(this);
		if (skipEmit) {
			return;
		}
		emit(this, "collapse", {
			target: node,
			data: getDataFromNode(node)
		});
	};

	/**
	 * Collapses all leaves
	 */
	TreeView.prototype.collapseAll = function () {
		var self = this;
		var nodes = this.internal.container.querySelectorAll(".tree-expando");
		forEach(nodes, function (node) {
			var parent = node.parentNode;
			var leaves = parent.parentNode.querySelector(".tree-child-leaves");
			if (parent && leaves && parent.hasAttribute("data-item")) {
				self.collapse(parent, true);
			}
		});
		emit(this, "collapseAll", {});
	};

	/**
	 * Get the data for the currently selected tree element
	 * @return {object} data Data from selected element
	 */
	TreeView.prototype.getSelectedNode = function () {
		return this.internal.selectedNodeData;
	};

	/**
	 * Select a specifc node in the tree.
	 * @param {string} nodePath Nodeaddress to select
	 * @param {string} aggregatePath Aggreateaddress to select. (in relation to the nodePath)
	 * @param {boolean} skipCollapse Omit collapsing all nodes.
	 */
	TreeView.prototype.selectNode = function (nodePath, aggregatePath, skipCollapse) {
		var self = this;
		var nodeAddresses = [];
		if (!isNaN(nodePath.substr(0, nodePath.indexOf(".")))) nodeAddresses.push(nodePath);
		// if has dbSpace => is Portal node
		else nodeAddresses = buildAddressList(self, nodePath, aggregatePath);

		if(!self || !self.internal)
			return;

		if (self.selectInProgress) {
			return;
		}

		self.selectInProgress = true;
		showBusyIndicator(self);

		if (!skipCollapse) {
			this.collapseAll();
		}

		expandNodeList(self, nodeAddresses, function (result) {
			var selectElement = result.relatedNode;
			if (selectElement === null) {
				selectElement = result.lastValidNode;
			}
			if (selectElement) {
				processSelection(self, selectElement.querySelector(".tree-leaf-text"), null);
				self.internal.scroller.scrollToElement(selectElement);
			} else {
				processSelection(self);
			}

			self.selectInProgress = false;
			hideBusyIndicator(self);
		});
	};

	/**
	 * Only show nodes in the tree that contain the search-string in their path.
	 * @param {string} searchString The string to filter for.
	 * @param {boolean} refreshSearchData Refresh the nodesdata used for filter. (use this when the nodes have been updated on the server side)
	 */
	TreeView.prototype.filter = function (searchString, refreshSearchData) {
		var self = this;
		var results = {};
		
		if(!self || !self.internal)
			return;

		if (self.filterInProgress) {
			console.warn("Filtering for term: " + searchString + " omitted, because filterprocess is busy.");
			return;
		}

		self.filterInProgress = true;
		showBusyIndicator(self);

		if (refreshSearchData || self.internal.availableAddresses.length < 1) {
			datasource.fetchAvailableNodeAdresses(function (availableAddresses) {
				self.internal.availableAddresses = availableAddresses;
				results = getSearchResults(self, searchString);

				self.collapseAll();
				filterNodes(self, results.searchResults, results.negativeResults, searchString, function () {
					self.filterInProgress = false;
					hideBusyIndicator(self);
				});
			});
		} else {
			results = getSearchResults(self, searchString);
			self.collapseAll();
			filterNodes(self, results.searchResults, results.negativeResults, searchString, function () {
				self.filterInProgress = false;
				hideBusyIndicator(self);
			});
		}
	};

	/**
	 * Attach an event handler to the tree view
	 * @param {string} name Name of the event to attach
	 * @param {TreeView#eventCallback} callback The callback to execute on the event
	 * @param {object} scope The context to call the callback with
	 */
	TreeView.prototype.on = function (name, callback, scope) {
		if (events.indexOf(name) > -1) {
			if (!this.internal.handlers[name]) {
				this.internal.handlers[name] = [];
			}
			this.internal.handlers[name].push({
				callback: callback,
				context: scope
			});

			//execute ready callback immediately if initialization is already complete
			if (name === "ready" && this.internal.initialized === true) {
				emit(this, "ready", this);
			}
		} else {
			throw new Error(name + " is not supported by TreeView.");
		}
	};

	/**
	 * Attach an event handler to the tree view and remove it automatically after it has been executed the first time.
	 * @param {string} name Name of the event to attach
	 * @param {TreeView#eventCallback} callback The callback to execute on the event
	 * @param {object} scope The context to call the callback with
	 */
	TreeView.prototype.one = function (name, callback, scope) {
		if (events.indexOf(name) > -1) {
			if (!this.internal.handlers[name]) {
				this.internal.handlers[name] = [];
			}
			this.internal.handlers[name].push({
				callback: callback,
				context: scope,
				one: true
			});
		} else {
			throw new Error(name + " is not supported by TreeView.");
		}
	};

	/**
	 * Detach an event handler from the tree view
	 * @param {string} name Name of the event to detach
	 * @param {TreeView#eventCallback} callback The function to detach
	 */
	TreeView.prototype.off = function (name, callback) {
		var index,
			found = false;
		if (this.internal.handlers[name] instanceof Array) {
			this.internal.handlers[name].forEach(function (handle, i) {
				index = i;
				if (handle.callback === callback && !found) {
					found = true;
				}
			});
			if (found) {
				this.internal.handlers[name].splice(index, 1);
			}
		}
	};

	/**
	 * Destroy the TreeView and release memory
	 */
	TreeView.prototype.destroy = function () {
		if(this.internal === null) return;
		this.internal.handlers = null;
		for (var i = 0; i < this.internal.eventListeners.length; i++) {
			var listenerObj = this.internal.eventListeners[i];
			listenerObj.node.removeEventListener(listenerObj.event, listenerObj.callback, false);
		}
		while (this.internal.scrollWrapper.firstChild) {
			this.internal.scrollWrapper.removeChild(this.internal.scrollWrapper.firstChild);
		}
		if (this.internal.busyIndicatorTimeout) {
			this.internal.win.clearTimeout(this.internal.busyIndicatorTimeout);
		}
		this.internal.scroller.destroy();
		this.internal.scroller = null;
		this.internal.doc = null;
		this.internal.win = null;
		this.internal.scrollWrapper = null;
		this.internal.selectedNodeData = null;
		this.internal.selectedNode = null;
		this.internal.busyIndicator = null;
		this.internal.busyIndicatorWrapper = null;
		this.internal.container = null;
		this.internal.eventListeners = null;
		this.internal.availableAddresses = null;
		this.internal.initialized = null;
		this.internal = null;

		this.selectInProgress = null;
		this.filterInProgress = null;
		this.expandAllInProgress = null;
	};

	/**
	 * Initialize the tree view
	 * @param {object} self The TreeView instance
	 * @memberOf TreeView
	 * @private
	 */
	function initialize(self) {
		self.internal.scrollWrapper = self.internal.doc.getElementById(self.internal.node);
		if (self.internal.scrollWrapper === null) {
			self.internal.doc = self.internal.win.frameElement.ownerDocument;
			self.internal.win = self.internal.doc.defaultView;
			self.internal.scrollWrapper = self.internal.doc.getElementById(self.internal.node);
			if (self.internal.scrollWrapper === null) {
				throw new Error("Node '" + self.internal.node + "' not found!");
			}
		}
		self.internal.scrollWrapper.classList.add("tree-wrapper");
		self.internal.container = self.internal.doc.createElement("div");
		self.internal.scrollWrapper.appendChild(self.internal.container);
		self.internal.container.style.fontSize = self.internal.options.fontSize + "px";
		self.internal.container.classList.add("tree-container");
		self.internal.busyIndicator = self.internal.doc.createElement("div");
		self.internal.busyIndicator.classList.add("tree-busy-indicator");
		self.internal.busyIndicatorWrapper = self.internal.doc.createElement("div");
		self.internal.busyIndicatorWrapper.classList.add("tree-busy-indicator-wrapper");
		self.internal.busyIndicatorWrapper.classList.add("hidden");
		self.internal.busyIndicatorWrapper.appendChild(self.internal.busyIndicator);
		self.internal.scrollWrapper.appendChild(self.internal.busyIndicatorWrapper);

		var languageName = "";
		for (var language in project.languages) {
			languageName = language;
			break;
		}
		self.internal.options.languagePrefix = languageName;

		loadRelatedCSS(self);
		webMI.data.loadScript("other/atvise.iscroll.js", initScrollbars.bind(self));
	}

	/**
	 * Initialize the scrollbar (IScroll)
	 * @memberOf TreeView
	 * @private
	 */
	function initScrollbars() {
		this.internal.scroller = new this.internal.win.IScroll(this.internal.scrollWrapper, {
			preventDefaultException: { className: /(^|\s)tree-leaf-text|tree-expando(\s|$)/ },
			preventDefault: true,
			useTransform: false,
			useTransition: false,
			mouseWheel: true,
			scrollbars: true,
			bounce: false,
			mouseWheelSpeed: 1,
			disablePointer: true,
			disableMouse: false,
			disableTouch: false,
			momentum: true,
			scrollX: true,
			scrollY: true,
			tap: false,
			bindToWrapper: true,
			interactiveScrollbars: true,
			HWCompositing: false
		});
	}

	/**
	 * @param {object} self The treeview instance.
	 * @memberOf TreeView
	 * @private
	 */
	function loadRelatedCSS(self) {
		if (self.internal.doc.getElementById("treeViewStyle") == null) {
			var fileref = self.internal.doc.createElement("link");
			fileref.rel = "stylesheet";
			fileref.id = "treeViewStyle";
			fileref.type = "text/css";
			fileref.href = "/treeView/css/treeViewStyle.css";
			self.internal.doc.getElementsByTagName("head")[0].appendChild(fileref);
		}
	}

	/**
	 * Update the scrollbar when content has changed
	 * @param {object} self The TreeView instance
	 * @memberOf TreeView
	 * @private
	 */
	function updateScroller(self) {
		if (!self.internal)
			return;

		self.internal.win.setTimeout(function () {
			if (self.internal && self.internal.scroller) {
				self.internal.scroller.refresh();
			}
		}, 0);
	}

	/**
	 * Emit an event from the tree view
	 * @param {object} self The TreeView instance
	 * @param {string} name The name of the event to emit
	 * @memberOf TreeView
	 * @private
	 */
	function emit(self, name) {
		var args = [].slice.call(arguments, 2);
		if (events.indexOf(name) > -1) {
			if (self.internal.handlers[name] && self.internal.handlers[name] instanceof Array) {
				forEach(self.internal.handlers[name], function (handle) {
					self.internal.win.setTimeout(function () {
						handle.callback.apply(handle.context, args);
						if (handle.one) {
							self.off(name, handle.callback);
						}
					}, 0);
				});
			}
		} else {
			throw new Error(name + " event cannot be found on TreeView.");
		}
	}

	/**
	 * A Handler that is executed for every dblclick on a leaf.
	 * @param {Event} e The event object passed by the browser
	 * @memberOf TreeView
	 * @private
	 */
	function dblClickHandler(e) {
		var targetNode = e.target || e.currentTarget;
		if (targetNode.classList.contains("tree-leaf-text")) {
			handleLeafClick(this, targetNode.parentNode);
		}
	}

	/**
	 * A Handler that is executed for every click on a leaf.
	 * @param {Event} e The event object passed by the browser
	 * @memberOf TreeView
	 * @private
	 */
	function clickHandler(e) {
		e.preventDefault();
		var targetNode = e.target || e.currentTarget;
		if (targetNode.classList.contains("tree-leaf-text")) {
			processSelection(this, targetNode, e);
		} else if (targetNode.classList.contains("tree-expando")) {
			handleLeafClick(this, targetNode.parentNode);
		}
	}

	/**
	 * A method that adds the selection class to the leaf text.
	 * @param {object} self The treeVIew instance
	 * @param {HTMLElement} targetNode The HTMLElement the user has clicked on
	 * @param {Event} event The event delivered by the browser
	 * @memberOf TreeView
	 * @private
	 */
	function processSelection(self, targetNode, event) {
		if (self.internal.selectedNode && self.internal.selectedNode !== null) {
			self.internal.selectedNode.classList.remove("selected");
			self.internal.selectedNode = null;
			self.internal.selectedNodeData = null;
		}

		if (targetNode) {
			var data = getDataFromNode(targetNode.parentNode);
			if (data.type == "folder") {
				handleLeafClick(self, targetNode.parentNode);
				return;
			}

			if (!event) {
				// User hasn't clicked or touched anything. Create a pseudo event for handling in opt_series display.
				event = {
					target: targetNode
				};
			}

			var selectableValid = false;
			for (var i = 0; i < self.internal.options.selectableTypes.length; i++) {
				if (self.internal.options.selectableTypes[i] == data.type) {
					selectableValid = true;
					break;
				}
			}

			if (selectableValid) {
				emit(self, "select", {
					event: event,
					data: data
				});

				self.internal.selectedNode = targetNode;
				self.internal.selectedNodeData = data;
				targetNode.classList.add("selected");
			}
		} else {
			emit(self, "notFound", {});
		}
	}

	/**
	 * A method that triggers collapsing or expanding of a node.
	 * @param {object} self The TreeView instance
	 * @param {HTMLElement} targetNode The node that has the data-item attribute.
	 * @memberOf TreeView
	 * @private
	 */
	function handleLeafClick(self, targetNode) {
		var leaves = getChildLeaves(targetNode);
		if (leaves) {
			if (leaves.classList.contains("hidden")) {
				self.expand(targetNode);
			} else {
				self.collapse(targetNode);
			}
		} else {
			self.expand(targetNode);
		}
	}

	/**
	 * A method that displays the busy indicator.
	 * @param {object} self The TreeView instance
	 * @memberOf TreeView
	 * @private
	 */
	function showBusyIndicator(self) {
		if (!self.internal.busyIndicatorTimeout || self.internal.busyIndicatorTimeout === null) {
			self.internal.busyIndicatorTimeout = self.internal.win.setTimeout(function () {
				self.internal.busyIndicatorWrapper.classList.remove("hidden");
			}, self.internal.options.busyIndicatorTolerance);
		}
	}

	/**
	 * A method that hides the busy indicator.
	 * @param {object} self The TreeView instance
	 * @memberOf TreeView
	 * @private
	 */
	function hideBusyIndicator(self) {
		self.internal.win.clearTimeout(self.internal.busyIndicatorTimeout);
		self.internal.busyIndicatorTimeout = null;
		self.internal.busyIndicatorWrapper.classList.add("hidden");
	}

	/**
	 * A method that takes the data to display in the treeView and appends the HTML elements to the DOM
	 * @param {HTMLElement} container The DOM element the data should be rendered to (can also be a leaf element)
	 * @param {object} data The data that should be appended to the dom
	 * @param {object} self The TreeView instance
	 * @fires TreeView#render
	 * @memberOf TreeView
	 * @private
	 */
	TreeView.prototype.renderDataToDOM = function (data, container) {
		const self = this;
		//console.log(data);
		if(!self || !self.internal)
			return;
		
		if (!container) {
			container = self.internal.container;
		}
		var leaves = [],
			click;

		forEach(data, function (item) {
			leaves.push(renderLeaf.call(self, item));
		});

		if (container !== self.internal.container) {
			var childContainer = self.internal.doc.createElement("div");
			childContainer.setAttribute("class", "tree-child-leaves");
			childContainer.style.marginLeft = self.internal.options.leafIndentation + "px";
			container.parentNode.appendChild(childContainer);
			container = childContainer;
		}
		
		if(data.length !== 0){
			container.innerHTML = leaves
				.map(function (leaf) {
					return leaf.outerHTML;
				})
				.join("");
		}else{
			showNoNodesAvailable(self);
		}
		

		forEach(container.querySelectorAll(".tree-leaf-text"), function (node) {
			if (isMobileTouchDevice) {
				node.addEventListener("touchstart", clickHandler.bind(self), false);
				self.internal.eventListeners.push({
					node: node,
					event: "touchstart",
					callback: clickHandler.bind(self)
				});
			} else {
				node.addEventListener("click", clickHandler.bind(self), false);
				self.internal.eventListeners.push({
					node: node,
					event: "click",
					callback: clickHandler.bind(self)
				});
			}
			node.addEventListener("dblclick", dblClickHandler.bind(self), false);
			self.internal.eventListeners.push({
				node: node,
				event: "dblclick",
				callback: dblClickHandler.bind(self)
			});
		});
		forEach(container.querySelectorAll(".tree-expando"), function (node) {
			if (isMobileTouchDevice) {
				node.addEventListener("touchstart", clickHandler.bind(self), false);
				self.internal.eventListeners.push({
					node: node,
					event: "touchstart",
					callback: clickHandler.bind(self)
				});
			} else {
				node.addEventListener("click", clickHandler.bind(self), false);
				self.internal.eventListeners.push({
					node: node,
					event: "click",
					callback: clickHandler.bind(self)
				});
			}
		});

		if (self.internal.initialized === false) {
			emit(self, "ready", self);
			self.internal.initialized = true;
		}

		//when child leaves were loaded from server or selection or filtering, emit expand event
		if (
			container !== self.internal.container &&
			!self.selectInProgress &&
			!self.filterInProgress &&
			!self.expandAllInProgress
		) {
			var targetNode = container.parentNode.querySelector(".tree-leaf-content");
			emit(self, "expand", {
				target: targetNode,
				data: getDataFromNode(targetNode)
			});
			hideBusyIndicator(self);
		}
		emit(self, "render", {
			target: targetNode,
			data: getDataFromNode(targetNode)
		});
		updateScroller(self);
	};

	/**
	 * A method that render a single leaf and returns the created HTML elements
	 * @param {object} item The data that represents the leaf
	 * @return {HTMLElement} leaf The HTML node that was created
	 * @memberOf TreeView
	 * @private
	 */
	function renderLeaf(item) {
		if (!this.internal)
			return;

		if (item.dataID) {
			var dataID = item.dataID;
			delete item.dataID;
		}

		var leaf = this.internal.doc.createElement("div");
		var content = this.internal.doc.createElement("div");
		var text = this.internal.doc.createElement("div");
		var expando = this.internal.doc.createElement("img");
		var icon = item.icon;

		// Check if icon is an img element
		if (icon && icon.tagName !== "IMG") {
			var iconImgElement = webMI.rootWindow.document.createElement("img");
			iconImgElement.src = this.internal.options.languagePrefix + icon;

			icon = iconImgElement;
		} else if (!icon) {
			var iconImgElement = webMI.rootWindow.document.createElement("img");
			iconImgElement.style.height = 0;
			iconImgElement.style.width = 0;

			icon = iconImgElement;
		}

		icon.setAttribute("class", "tree-icon");
		icon.style.marginLeft = this.internal.options.fontSize + this.internal.options.expandoOffset + "px";
		leaf.setAttribute("class", "tree-leaf");
		content.setAttribute("class", "tree-leaf-content");
		content.style.height = this.internal.options.fontSize + "px";
		content.style.paddingTop = this.internal.options.leafPadding + "px";
		content.style.paddingBottom = this.internal.options.leafPadding + "px";
		content.setAttribute("data-item", JSON.stringify(item));
		if (dataID) {
			content.setAttribute("data-id", dataID);
		}
		content.id = "address-" + item.address;
		text.setAttribute("class", "tree-leaf-text");
		text.textContent = item.name;
		if (item.hasChildren) {
			expando.setAttribute("class", "tree-expando");
			expando.style.top = this.internal.options.leafPadding + "px";
			expando.src = this.internal.options.languagePrefix + this.internal.options.imagePaths.collapsedLeafImage;
			content.appendChild(expando);
		}
		content.appendChild(icon);
		content.appendChild(text);
		leaf.appendChild(content);
		return leaf;
	}

	/**
	 * A method that searches for the occurence of a string in nodepaths.
	 * @param {object} self The TreeView instance
	 * @param {string} searchString The string to filter for.
	 * @return {object} results
	 * @memberOf TreeView
	 * @private
	 */
	function getSearchResults(self, searchString) {
		var negativeResults = [];
		var searchResults = [];

		for (var i = 0; i < self.internal.availableAddresses.length; i++) {
			var aggregateReference = self.internal.availableAddresses[i].aggregateReference;
			if (aggregateReference) {
				var aggregatePathString = aggregateReference.substring(
					aggregateReference.indexOf(aggregateReference.split(".")[4])
				);
			} else {
				aggregatePathString = "";
			}

			if (
				self.internal.availableAddresses[i].address.indexOf(searchString) !== -1 ||
				aggregatePathString.indexOf(searchString) !== -1
			) {
				searchResults.push(self.internal.availableAddresses[i]);
			} else {
				negativeResults.push(self.internal.availableAddresses[i]);
			}
		}

		if (searchString !== "") {
			return ensureFullPath(searchResults, negativeResults);
		}

		return { searchResults: searchResults, negativeResults: negativeResults };
	}

	/**
	 * A method that shows the information, that no nodes are available under current startAddress
	 * @param {object} self The TreeView instance
	 * @memberOf TreeView
	 * @private
	 */
	function showNoNodesAvailable(self) {
		var message = "T{The node}" + " '" + self.internal.options.startAddress + "' " + "T{does not have sub-objects!}";
		var messageEl = self.internal.doc.createElement("div");
		messageEl.innerText = message;
		console.log(messageEl);
		self.internal.container.appendChild(messageEl);
	}

	/**
	 * A method that ensures that the full path of a filtered node is shown in the treeView.
	 * @param {array} searchResults An array that contains the node addresses that should be displayed.
	 * @param {array} negativeResults An array that contains the node addresses that should not be displayed.
	 * @return {object} updatedAddresses
	 * @memberOf TreeView
	 * @private
	 */
	function ensureFullPath(searchResults, negativeResults) {
		//ensure that the full path is filtered
		var additionalSearchResults = [];
		for (var i = 0; i < negativeResults.length; i++) {
			var negativeResult = negativeResults[i].address;
			for (var h = 0; h < searchResults.length; h++) {
				var searchResult = searchResults[h].address;
				if (searchResult.indexOf(negativeResult + ".") !== -1) {
					additionalSearchResults.push({
						additionalResult: negativeResults[i],
						insertBefore: searchResults[h]
					});
				}
			}
		}

		for (var j = 0; j < additionalSearchResults.length; j++) {
			var additionalResult = additionalSearchResults[j].additionalResult;
			var insertBefore = additionalSearchResults[j].insertBefore;

			searchResults.splice(searchResults.indexOf(insertBefore), 0, additionalResult);

			if (negativeResults.indexOf(additionalResult) !== -1) {
				negativeResults.splice(negativeResults.indexOf(additionalResult), 1);
			}
		}

		return { searchResults: searchResults, negativeResults: negativeResults };
	}

	/**
	 * A method that invokes the expandation of nodes and hides non relevant ones for filtering.
	 * @param {object} self The TreeView instance
	 * @param {array} searchResults An array that contains the node addresses that should be displayed.
	 * @param {array} negativeResults An array that contains the node addresses that should not be displayed.
	 * @param {string} searchString The string to filter for.
	 * @param {function} doneCallback The callbacl function that is invoked when the filtering is complete.
	 * @memberOf TreeView
	 * @private
	 */
	function filterNodes(self, searchResults, negativeResults, searchString, doneCallback) {
		var nodeExpandations = [];

		for (var h = 0; h < searchResults.length; h++) {
			var address = searchResults[h].address;
			var aggregateReference = searchResults[h].aggregateReference;

			var htmlNode = self.internal.doc.getElementById("address-" + address);
			if (htmlNode) {
				htmlNode.style.display = "";
			}

			if (searchString !== "") {
				nodeExpandations.push(
					function (address, aggregateReference) {
						var nodeAddresses = buildAddressList(self, address, aggregateReference);

						return new Promise(function (resolve) {
							expandNodeList(self, nodeAddresses, function () {
								resolve();
							});
						});
					}.bind(self, address, aggregateReference)
				);
			} else {
				nodeExpandations.push(function () {
					return Promise.resolve();
				});
			}
		}

		//run promise chain
		nodeExpandations
			.reduce(function (prev, curr) {
				return prev.then(curr);
			}, Promise.resolve())
			.then(function () {
				for (var j = 0; j < negativeResults.length; j++) {
					var address = negativeResults[j].address;
					var htmlNode = self.internal.doc.getElementById("address-" + address);
					if (htmlNode) {
						htmlNode.style.display = "none";
					}
				}
				doneCallback();
			});
	}

	/**
	 * A method that builds out of the nodeAddress and aggregateAddress a sequential list of nodes that have to be expanded after each other.
	 * @param {object} self The TreeView instance
	 * @param {string} nodePath The address of the node.
	 * @param {string} aggregatePath The address of the aggregate.
	 * @return {Array} nodeAddresses
	 * @memberOf TreeView
	 * @private
	 */
	function buildAddressList(self, nodePath, aggregatePath) {
		var nodeAddresses = [];

		try {
			var startAddress = self.internal.options.startAddress;
			var aggregateAddressPrefix = self.internal.options.aggregateAddressPrefix;

			var subPath = nodePath.substring(nodePath.indexOf(startAddress) + startAddress.length + 1); //+ 1 cut off first dot
			var nodeFragments = subPath.split(".");


			if (subPath != "") nodePath = startAddress;

			//build nodeAddresses
			for (var i = 0; i < nodeFragments.length; i++) {
				if (nodeFragments[i]) nodePath = nodePath + "." + nodeFragments[i];
				nodeAddresses.push(nodePath);
			}

			if (aggregatePath && aggregatePath.length > 0) {
				var aggregateSubPath = aggregatePath.substring(
					aggregatePath.indexOf(aggregateAddressPrefix) + aggregateAddressPrefix.length + 1
				); //+ 1 cut off first dot
				var aggregateTemplateName = aggregateSubPath.split(".", 1)[0];
				aggregateAddressPrefix = aggregateAddressPrefix + "." + aggregateTemplateName;
                nodeAddresses.push(aggregateAddressPrefix);
				var aggregateFragments = aggregateSubPath.split(".");

				//build nodeAddresses for aggregates
				for (var h = 1; h < aggregateFragments.length; h++) {
					aggregateAddressPrefix = aggregateAddressPrefix + "." + aggregateFragments[h];
					nodeAddresses.push(aggregateAddressPrefix);
				}
			}
		} catch(ex) {
			// already invalidated
			// console.error(ex);
		}

		return nodeAddresses;
	}

	/**
	 * A method that expands nodes from a list sequentially.
	 * @param {object} self The TreeView instance.
	 * @param {array} nodeAddresses A list of addresses of nodes and aggregates.
	 * @param {function} doneCallback A callback function that is invoked after all nodes have been expanded.
	 * @memberOf TreeView
	 * @private
	 */
	function expandNodeList(self, nodeAddresses, doneCallback) {
		var expandSteps = [];
		var lastValidHtmlNode = null;

		//push functions for loading nodeAddresses into array
		for (var h = 0; h < nodeAddresses.length; h++) {
			var address = nodeAddresses[h];

			expandSteps.push(
				function (address) {
					var htmlNode = self.internal.doc.getElementById("address-" + address);

					//do not expand last element and ensure htmlNode exists
					if (address !== nodeAddresses[nodeAddresses.length - 1] && htmlNode !== null) {
						if (address.indexOf(this.internal.options.aggregateAddressPrefix) === -1) {
							lastValidHtmlNode = htmlNode;
						}

						self.expand(htmlNode, true);
						var data = getDataFromNode(htmlNode);

						//if node has children and it's childleaves are not loaded yet, wait for expand event
						if (data.hasChildren && !getChildLeaves(htmlNode)) {
							return new Promise(function (resolve) {
								self.one("render", function () {
									resolve({ relatedNode: htmlNode, lastValidNode: lastValidHtmlNode });
								});
							});
						} else {
							return Promise.resolve({ relatedNode: htmlNode, lastValidNode: lastValidHtmlNode });
						}
					} else {
						return Promise.resolve({ relatedNode: htmlNode, lastValidNode: lastValidHtmlNode });
					}
				}.bind(self, address)
			);
		}

		//run promise chain
		expandSteps
			.reduce(function (prev, curr) {
				return prev.then(curr);
			}, Promise.resolve())
			.then(function (result) {
				doneCallback(result);
			});
	}

	/**
	 * A helper method that returns the child leaves of a node.
	 * @param {HTMLElement} node
	 * @return {boolean}
	 * @memberOf TreeView
	 * @private
	 */
	function getChildLeaves(node) {
		var leaves = node.parentNode.querySelector(".tree-child-leaves");
		if (leaves) {
			return leaves;
		} else {
			return false;
		}
	}

	/**
	 * A helper method that builds a flat array of an array of objects (object-specific)
	 * @param {array} addresses
	 * @return {array} flattenedArray
	 * @memberOf TreeView
	 * @private
	 */
	function flattenAddresses(addresses) {
		var flattenedArray = [];

		for (var i = 0; i < addresses.length; i++) {
			flattenedArray.push(addresses[i].address);
			if (addresses[i].aggregateReference) {
				flattenedArray.push(addresses[i].aggregateReference);
			}
		}

		return flattenedArray;
	}

	/**
	 * A helper method to merge to objects recursively
	 * @param {object} data The base-object
	 * @param {object} addData The data to add recursively to the base object
	 * @memberOf TreeView
	 * @private
	 */
	function mergeData(data, addData) {
		for (var p in addData) {
			try {
				// Property in destination object set; update its value.
				if (addData[p].constructor === Object) {
					data[p] = mergeData(data[p], addData[p]);
				} else {
					data[p] = addData[p];
				}
			} catch (e) {
				// Property in destination object not set; create it and set its value.
				data[p] = addData[p];
			}
		}
		return data;
	}

	/**
	 * A forEach that will work with a NodeList and generic Arrays
	 * @param {Array} arr The array to iterate over
	 * @param {function} callback Function that executes for each element. First parameter is element, second is index
	 * @param {object} scope The context to execute callback with
	 * @memberOf TreeView
	 * @private
	 */
	function forEach(arr, callback, scope) {
		var i,
			len = arr.length;
		for (i = 0; i < len; i += 1) {
			callback.call(scope, arr[i], i);
		}
	}

	// Ensure correct types for options
	var options = {};
	for (var key in base) {
		switch (key) {
			// Strings
			case "renderTo":
			case "dataSourceType":
			case "dataSourceFilePath":
			case "startAddress":
				options[key] = base[key];
				break;
			// Booleans
			case "nodeCacheActive":
				options[key] = base[key] === "true" ? true : false;
                break;
			// JSON-Strings
			case "selectableTypes":
			case "imagePaths":
				options[key] = JSON.parse(base[key]);
				break;
			// Numbers
			case "searchDepth":
			case "fontSize":
			case "leafPadding":
			case "leafIndentation":
			case "busyIndicatorTolerance":
			case "expandoOffset":
				options[key] = parseFloat(base[key]);
				break;
		}
	}

	if (typeof options["dataSourceFilePath"] === "undefined") {
		options["dataSourceFilePath"] = "treeView/datasources/opcua.js";
	}

	if (typeof base.dataSourceOptions === "object") {
		options.dataSourceOptions = base.dataSourceOptions;
	} else if (typeof base.dataSourceOptions === "string") {
		try {
			options.dataSourceOptions = JSON.parse(base.dataSourceOptions);
		} catch (err) {
			if (err instanceof SyntaxError) {
				if (options.dataSourceType === "scope") {
					// Fallback for legacy scope options
					options.dataSourceOptions = { host: base.dataSourceOptions };
				} else {
					throw new Error("dataSourceOptions must be an object or a JSON string.");
				}
			}
		}
	} else {
		throw new Error("dataSourceOptions must be an object or a JSON string.");
	}

	// Move dataSourceOptions up one level
	for (var key in options.dataSourceOptions) {
		options[key] = options.dataSourceOptions[key];
	}

	delete options.dataSourceOptions;

	return new TreeView(options);
})(window, document);]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources/opcuaAlarms.js" ExportedBrowseName="1:opcuaAlarms.js" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView" BrowseName="1:treeView">
		<DisplayName Locale="en">treeView</DisplayName>
		<Description Locale="en">treeView</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources" BrowseName="1:datasources">
		<DisplayName Locale="en">datasources</DisplayName>
		<Description Locale="en">datasources</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources/opcuaAlarms.js" BrowseName="1:opcuaAlarms.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">opcuaAlarms.js</DisplayName>
		<Description Locale="en">opcuaAlarms.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>KCgpID0+IHsKCS8vIEhlcmUgdGhlIHNhbWUgbmFtZSBzaG91bGQgYmUgdXNlZCBhcyBmb3IgdGhlIHJlc3BlY3RpdmUgaGlnaGNoYXJ0cyBkYXRhc291cmNlCgljb25zdCBkYXRhU291cmNlTmFtZSA9ICJvcGNVQV9BbGFybXMiOwoKCXZhciB0eXBlcyA9IHsKCQliYXNlVmFyaWFibGU6ICJiYXNlVmFyaWFibGUiLAoJCWZvbGRlcjogImZvbGRlciIsCgkJcHJvamVjdFZhcmlhYmxlczogImJhc2VWYXJpYWJsZSIsCgkJYWdncmVnYXRlVGVtcGxhdGU6ICJhZ2dyZWdhdGVUZW1wbGF0ZSIsCgkJYWdncmVnYXRlRnVuY3Rpb246ICJhZ2dyZWdhdGVGdW5jdGlvbiIsCgkJYWdncmVnYXRlRnVuY3Rpb25UeXBlOiAiYWdncmVnYXRlRnVuY3Rpb25UeXBlIgoJfTsKCgl2YXIgYWdncmVnYXRlT3B0aW9ucyA9IHsKCQlpbnRlcnZhbFVuaXQ6ICJpbnRlcnZhbF91bml0IiwKCQlpbnRlcnZhbFZhbHVlOiAiaW50ZXJ2YWxfdmFsdWUiLAoJCW9mZnNldFVuaXQ6ICJvZmZzZXRfdW5pdCIsCgkJb2Zmc2V0VmFsdWU6ICJvZmZzZXRfdmFsdWUiLAoJCXN0ZXBwZWQ6ICJzdGVwcGVkIiwKCQlhZ2dyZWdhdGVUeXBlOiAiYWdncmVnYXRlIiwKCQlyZWxhdGVkTm9kZUFkZHJlc3M6ICJyZWxhdGVkTm9kZUFkZHJlc3MiCgl9OwoKCXZhciBvcGNVQVR5cGVzID0gewoJCWJhc2VWYXJpYWJsZURhdGFUeXBlOiAiaT02MyIsCgkJYmFzZVZhcmlhYmxlOiAiaT02MiIsCgkJZm9sZGVyOiAiaT02MSIsCgkJcHJvamVjdDogIk9iamVjdFR5cGVzLlBST0pFQ1QiLAoJCXByb2plY3RWYXJpYWJsZXM6ICJWYXJpYWJsZVR5cGVzLlBST0pFQ1QiLAoJCWFnZ3JlZ2F0ZVRlbXBsYXRlOiAiT2JqZWN0VHlwZXMuQVRWSVNFLkFnZ3JlZ2F0ZVRlbXBsYXRlIiwKCQlhZ2dyZWdhdGVGdW5jdGlvbjogIk9iamVjdFR5cGVzLkFUVklTRS5BZ2dyZWdhdGVGdW5jdGlvbiIsCgkJYWdncmVnYXRlRnVuY3Rpb25UeXBlOiAiaT0yMzQwIgoJfTsKCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCBmb3IgcGFyc2luZyB0aGUgZGF0YS1pdGVtIG9mIGEgbm9kZQoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBUaGUgY29ycmVzcG9uZGluZyBET00tbm9kZQoJICogQHJldHVybiB7c3RyaW5nfSBvYmplY3QgVGhlIHBhcnNlZCBkYXRhLWl0ZW0KCSAqLwoJZnVuY3Rpb24gZ2V0RGF0YUZyb21Ob2RlKG5vZGUpIHsKCQlpZiAobm9kZSkgewoJCQlyZXR1cm4gSlNPTi5wYXJzZShub2RlLmdldEF0dHJpYnV0ZSgiZGF0YS1pdGVtIikpOwoJCX0gZWxzZSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoJfQoKCS8qKgoJICogQSBoZWxwZXIgbWV0aG9kIGZvciBhZGRpbmcgYWRkaXRpb25hbCBkYXRhIHRvIHRoZSBkYXRhLWl0ZW0gb2YgYSBub2RlCgkgKiBAcGFyYW0ge29iamVjdH0gaXRlbSBUaGUgaXRlbSAob2JqZWN0KSB0byBiZSBhZGRlZAoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYWRkRGF0YSBUaGUgY29ycmVzcG9uZGluZyBET00tbm9kZQoJICovCglmdW5jdGlvbiBhZGREYXRhVG9JdGVtKGl0ZW0sIGFkZERhdGEpIHsKCQl2YXIgZGF0YSA9IEpTT04ucGFyc2UoaXRlbS5nZXRBdHRyaWJ1dGUoImRhdGEtaXRlbSIpKTsKCQlpdGVtLnNldEF0dHJpYnV0ZSgiZGF0YS1pdGVtIiwgSlNPTi5zdHJpbmdpZnkobWVyZ2VEYXRhKGRhdGEsIGFkZERhdGEpKSk7Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBtZXRob2QgdG8gbWVyZ2UgdG8gb2JqZWN0cyByZWN1cnNpdmVseQoJICogQHBhcmFtIHtvYmplY3R9IGRhdGEgVGhlIGJhc2Utb2JqZWN0CgkgKiBAcGFyYW0ge29iamVjdH0gYWRkRGF0YSBUaGUgZGF0YSB0byBhZGQgcmVjdXJzaXZlbHkgdG8gdGhlIGJhc2Ugb2JqZWN0CgkgKi8KCWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLCBhZGREYXRhKSB7CgkJZm9yICh2YXIgcCBpbiBhZGREYXRhKSB7CgkJCXRyeSB7CgkJCQkvLyBQcm9wZXJ0eSBpbiBkZXN0aW5hdGlvbiBvYmplY3Qgc2V0OyB1cGRhdGUgaXRzIHZhbHVlLgoJCQkJaWYgKGFkZERhdGFbcF0uY29uc3RydWN0b3IgPT09IE9iamVjdCkgewoJCQkJCWRhdGFbcF0gPSBtZXJnZURhdGEoZGF0YVtwXSwgYWRkRGF0YVtwXSk7CgkJCQl9IGVsc2UgewoJCQkJCWRhdGFbcF0gPSBhZGREYXRhW3BdOwoJCQkJfQoJCQl9IGNhdGNoIChlKSB7CgkJCQkvLyBQcm9wZXJ0eSBpbiBkZXN0aW5hdGlvbiBvYmplY3Qgbm90IHNldDsgY3JlYXRlIGl0IGFuZCBzZXQgaXRzIHZhbHVlLgoJCQkJZGF0YVtwXSA9IGFkZERhdGFbcF07CgkJCX0KCQl9CgkJcmV0dXJuIGRhdGE7Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBnZXRzIHRoZSByZWxhdGVkIG5vZGUgYWRkcmVzcyBvZiBhIGh0bWwgZWxlbWVudC4KCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZU5vZGUgQSBodG1sIG5vZGUgdGhhdCBoYXMgYSBkYXRhLWl0ZW0gYXR0cmlidXRlLgoJICogQHJldHVybiB7c3RyaW5nfSByZWxhdGVkQWRkcmVzcwoJICovCglmdW5jdGlvbiBnZXRSZWxhdGVkTm9kZUFkZHJlc3MocmVmZXJlbmNlTm9kZSkgewoJCXZhciBjdXJyZW50Tm9kZSA9IHJlZmVyZW5jZU5vZGU7CgkJdmFyIHJlbGF0ZWRBZGRyZXNzID0gZ2V0RGF0YUZyb21Ob2RlKGN1cnJlbnROb2RlKS5hZGRyZXNzOwoKCQl3aGlsZSAocmVsYXRlZEFkZHJlc3MuaW5kZXhPZigiSElTVE9SWSIpICE9PSAtMSkgewoJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7CgkJCXZhciBub2RlRGF0YSA9IHt9OwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJCW5vZGVEYXRhID0gZ2V0RGF0YUZyb21Ob2RlKGN1cnJlbnROb2RlLmNoaWxkTm9kZXNbaV0pOwoJCQkJaWYgKG5vZGVEYXRhKSB7CgkJCQkJcmVsYXRlZEFkZHJlc3MgPSBub2RlRGF0YS5hZGRyZXNzOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmVsYXRlZEFkZHJlc3M7Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBzZWFyY2hlcyB0aGUgcmVzcG9uc2UgY2FjaGUgZm9yIHRoZSBzZWFyY2h0ZXJtLgoJICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3Mgbm9kZUlkIG9mIHRoZSBub2RlIHRvIHNlYXJjaCBmb3IuCgkgKiBAcGFyYW0ge29iamVjdH0gbm9kZVRyZWUgQSBjYWNoZWQgcmVzcG9uc2Ugb2YgYWxsIG5vZGVzIGluIHRoZSBwcm9qZWN0LgoJICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29uYXRpbmluZyB0aGUgbm9kZXMgcmVxdWlyZWQgaW5mbwoJICovCglmdW5jdGlvbiBmaW5kQ2hpbGRyZW4oYWRkcmVzcywgbm9kZVRyZWUpIHsKCQlsZXQgcmVzdWx0OwoJCWlmIChub2RlVHJlZS5hZGRyZXNzID09PSBhZGRyZXNzKSB7CgkJCXJldHVybiBub2RlVHJlZTsKCQl9CgkJZm9yIChsZXQgbm9kZU5hbWUgaW4gbm9kZVRyZWUpIHsKCQkJaWYgKG5vZGVUcmVlW25vZGVOYW1lXS5hZGRyZXNzID09PSBhZGRyZXNzKSB7CgkJCQlyZXR1cm4gbm9kZVRyZWVbbm9kZU5hbWVdLmNoaWxkczsKCQkJfSBlbHNlIHsKCQkJCWlmIChub2RlVHJlZVtub2RlTmFtZV0uY2hpbGRzKSB7CgkJCQkJcmVzdWx0ID0gZmluZENoaWxkcmVuKGFkZHJlc3MsIG5vZGVUcmVlW25vZGVOYW1lXS5jaGlsZHMpOwoJCQkJfQoJCQl9CgoJCQlpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0OwoJCX0KCX0KCglmdW5jdGlvbiBUcmVlVmlld0RhdGFzb3VyY2Uob3B0aW9ucykgewoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCWNvbnN0IGRlZmF1bHRPcHRpb25zID0gewoJCQlyZW5kZXJUbzogIiIsCgkJCXN0YXJ0QWRkcmVzczogIkFHRU5ULk9CSkVDVFMiLAoJCQlhZ2dyZWdhdGVBZGRyZXNzUHJlZml4OiAiQUdFTlQuSElTVE9SWS5BR0dSRUdBVEVURU1QTEFURVMiLAoJCQlzZWxlY3RhYmxlVHlwZXM6IFt0eXBlcy5iYXNlVmFyaWFibGUsIHR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uXSwKCQkJZm9udFNpemU6IDEyLAoJCQlsZWFmUGFkZGluZzogMiwKCQkJbGVhZkluZGVudGF0aW9uOiAxNSwKCQkJYnVzeUluZGljYXRvclRvbGVyYW5jZTogMTAwLAoJCQlleHBhbmRvT2Zmc2V0OiAzLAoJCQlzZWFyY2hEZXB0aDogMTAwLAoJCQluYXZpZ2F0aW9uRGVwdGg6IDEsCgkJCXR5cGVJbWFnZVBhdGhzOiB7CgkJCQliYXNlVmFyaWFibGU6ICIvdHJlZVZpZXcvaWNvbnMvYmFzZVZhcmlhYmxlLnN2ZyIsCgkJCQlmb2xkZXI6ICIvdHJlZVZpZXcvaWNvbnMvZm9sZGVyLnN2ZyIsCgkJCQlhZ2dyZWdhdGVGdW5jdGlvbjogIi90cmVlVmlldy9pY29ucy9hZ2dyZWdhdGVGdW5jdGlvbi5zdmciCgkJCX0KCQl9OwoKCQl0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzID0gZmFsc2U7CgkJdGhpcy5idWlsZGluZ05vZGVzQ2FjaGUgPSBmYWxzZTsKCQl0aGlzLmJyb3dzZU5vZGVzQmFja2xvZyA9IFtdOwoKCQlzZWxmLm9wdGlvbnMgPSB7fTsKCQlPYmplY3QuYXNzaWduKHNlbGYub3B0aW9ucywgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpOwoKCQl2YXIgbGFuZ3VhZ2VOYW1lID0gIiI7CgkJZm9yICh2YXIgbGFuZ3VhZ2UgaW4gcHJvamVjdC5sYW5ndWFnZXMpIHsKCQkJbGFuZ3VhZ2VOYW1lID0gbGFuZ3VhZ2U7CgkJCWJyZWFrOwoJCX0KCQlzZWxmLm9wdGlvbnMubGFuZ3VhZ2VQcmVmaXggPSBsYW5ndWFnZU5hbWU7CgogICAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9kZUNhY2hlQWN0aXZlKSB7CiAgICAgICAgICAgIHRoaXMuZmV0Y2hBdmFpbGFibGVOb2RlQWRyZXNzZXMoKCkgPT4gewogICAgICAgICAgICAgICAgLy8gQ2FjaGUgaXMgcmVhZHkuCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCX0KCgkvKioKCSAqIEEgbWV0aG9kIHRoYXQgZmV0Y2hlcyBhbGwgbm9kZXMgdGhhdCBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSB0cmVlVmlldyBhbmQgYnVpbGRzIGFuIGFycmF5IGZvciB0cmVlIGZpbHRlcmluZy4KCSAqIEBwYXJhbSB7b2JqZWN0fSBzZWxmIFRoZSBUcmVlVmlldyBpbnN0YW5jZS4KCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGRhdGFDYWxsYmFjayBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aXRoIGFsbCB0aGUgYXZhaWxhYmxlIG5vZGVzLgoJICovCglUcmVlVmlld0RhdGFzb3VyY2UucHJvdG90eXBlLmZldGNoQXZhaWxhYmxlTm9kZUFkcmVzc2VzID0gZnVuY3Rpb24gKGRhdGFDYWxsYmFjaykgewoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCQoJCWlmICh0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzICYmIHRoaXMub3B0aW9ucy5ub2RlQ2FjaGVBY3RpdmUpIHsKCQkJdGhpcy5idWlsZEFkZHJlc3Nlc0FycmF5KGZ1bmN0aW9uIChhZGRyZXNzZXMpIHsKCQkJCXZhciBvcmRlcmVkQWRyZXNzZXMgPSBbXTsKCQkJCXZhciBsYXN0VmFsaWRBZGRyZXNzID0gbnVsbDsKCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkrKykgewoJCQkJCXZhciBhZGRyZXNzID0gd2ViTUkuZXNjYXBlSFRNTChhZGRyZXNzZXNbaV0pOwoJCQkJCWlmIChhZGRyZXNzLmluZGV4T2Yoc2VsZi5vcHRpb25zLmFnZ3JlZ2F0ZUFkZHJlc3NQcmVmaXgpID09PSAtMSkgewoJCQkJCQlsYXN0VmFsaWRBZGRyZXNzID0gYWRkcmVzczsKCQkJCQkJb3JkZXJlZEFkcmVzc2VzLnB1c2goeyBhZGRyZXNzOiBhZGRyZXNzIH0pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCW9yZGVyZWRBZHJlc3Nlcy5wdXNoKHsgYWRkcmVzczogbGFzdFZhbGlkQWRkcmVzcywgYWdncmVnYXRlUmVmZXJlbmNlOiBhZGRyZXNzIH0pOwoJCQkJCX0KCQkJCX0KCQkJCWRhdGFDYWxsYmFjayhvcmRlcmVkQWRyZXNzZXMpOwoJCQl9LCB0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKHRoaXMuYnVpbGRpbmdOb2Rlc0NhY2hlKSB7CgkJCXRoaXMuYnJvd3NlTm9kZXNCYWNrbG9nLnB1c2goZGF0YUNhbGxiYWNrKTsKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5idWlsZGluZ05vZGVzQ2FjaGUgPSB0cnVlOwoKCQl3ZWJNSS5kYXRhLmNhbGwoCgkJCSJCcm93c2VOb2Rlc1dpdGhBbGFybSIsCgkJCXsKCQkJCXN0YXJ0QWRkcmVzczogdGhpcy5vcHRpb25zLnN0YXJ0QWRkcmVzcywKCQkJCWVuZExldmVsOiB0aGlzLm9wdGlvbnMuc2VhcmNoRGVwdGgsCgkJCQl2VHlwZXM6IFsKCQkJCQlvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZURhdGFUeXBlLAoJCQkJCW9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlLAoJCQkJCW9wY1VBVHlwZXMuZm9sZGVyLAoJCQkJCW9wY1VBVHlwZXMucHJvamVjdCwKCQkJCQlvcGNVQVR5cGVzLnByb2plY3RWYXJpYWJsZXMsCgkJCQkJb3BjVUFUeXBlcy5hZ2dyZWdhdGVUZW1wbGF0ZSwKCQkJCQlvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uCgkJCQldLAoJCQkJbWFwcGluZzogWwoJCQkJCXthbGlhczogImFkZHJlc3MiLCBrZXlzOiBbIm5vZGVJZCIsICJ4bWwiXSwgcmVtb3ZlTnNUYWc6IHRydWV9LAoJCQkJCXthbGlhczogIm5hbWUiLCBrZXlzOiBbImJyb3dzZU5hbWUiLCAibmFtZSJdfSwKCQkJCQl7YWxpYXM6ICJ0eXBlIiwga2V5czogWyJ0eXBlRGVmaW5pdGlvbiIsICJ4bWwiXSwgcmVtb3ZlTnNUYWc6IHRydWV9CgkJCQldLAoJCQkJaW5jbHVkZVN0YXJ0QWRkcmVzczogZmFsc2UKCQkJfSwKCQkJKHJlc3BvbnNlKSA9PiB7CgkJCQl0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzID0gcmVzcG9uc2U7CgkJCQl0aGlzLmJ1aWxkQWRkcmVzc2VzQXJyYXkoZnVuY3Rpb24gKGFkZHJlc3NlcykgewoJCQkJCXZhciBvcmRlcmVkQWRyZXNzZXMgPSBbXTsKCQkJCQl2YXIgbGFzdFZhbGlkQWRkcmVzcyA9IG51bGw7CgoJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSsrKSB7CgkJCQkJCXZhciBhZGRyZXNzID0gd2ViTUkuZXNjYXBlSFRNTChhZGRyZXNzZXNbaV0pOwoJCQkJCQlpZiAoYWRkcmVzcy5pbmRleE9mKHNlbGYub3B0aW9ucy5hZ2dyZWdhdGVBZGRyZXNzUHJlZml4KSA9PT0gLTEpIHsKCQkJCQkJCWxhc3RWYWxpZEFkZHJlc3MgPSBhZGRyZXNzOwoJCQkJCQkJb3JkZXJlZEFkcmVzc2VzLnB1c2goeyBhZGRyZXNzOiBhZGRyZXNzIH0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJb3JkZXJlZEFkcmVzc2VzLnB1c2goeyBhZGRyZXNzOiBsYXN0VmFsaWRBZGRyZXNzLCBhZ2dyZWdhdGVSZWZlcmVuY2U6IGFkZHJlc3MgfSk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXNlbGYuY2FjaGVkQXZhaWxhYmxlTm9kZXM7CgoJCQkJCWRhdGFDYWxsYmFjayhvcmRlcmVkQWRyZXNzZXMpOwoKCQkJCQlzZWxmLmJyb3dzZU5vZGVzQmFja2xvZy5mb3JFYWNoKChjYWxsYmFjaykgPT4gewoJCQkJCQljYWxsYmFjayhvcmRlcmVkQWRyZXNzZXMpOwoJCQkJCX0pOwoJCQkJfSwgcmVzcG9uc2UpOwoJCQl9CgkJKTsKCX07CgoJLyoqCgkgKiBQcm92aWRlcyB0aGUgdHJlZSB2aWV3IHdpdGggdGhlIGRhdGEgdHlwZXMgdGhhdCBhY3R1YWxseSBhcmUgc2VsZWN0YWJsZSBpbnN0ZWFkIG9mIGp1c3QgYnJvd3NhYmxlLgoJICogQHJldHVybnMge2FycmF5fSBTZWxlY3RhYmxlIHR5cGVzCgkgKi8KCVRyZWVWaWV3RGF0YXNvdXJjZS5wcm90b3R5cGUuZ2V0U2VsZWN0YWJsZVR5cGVzID0gZnVuY3Rpb24gKCkgewoJCXJldHVybiBbdHlwZXMuYmFzZVZhcmlhYmxlLCB0eXBlcy5hZ2dyZWdhdGVGdW5jdGlvbl07Cgl9OwoKCS8qKgoJICogQSBtZXRob2QgdGhhdCBpcyB1c2VkIGJ5IHtAbGluayBUcmVlVmlld0RhdGFzb3VyY2UjZmV0Y2hBdmFpbGFibGVOb2RlQWRyZXNzZXN9IGFzIGEgY2FsbGJhY2suCgkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBkYXRhQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aXRoIHRoZSBwcm9jZXNzZWQgZGF0YS4KCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlU3RydWN0dXJlIFRoZSBub2RlIHN0cnVjdHVyZSBkZWxpdmVyZWQgZnJvbSB0aGUgc2VydmVyLgoJICogQHJldHVybiB7QXJyYXl9IGFkZHJlc3NlcwoJICovCglUcmVlVmlld0RhdGFzb3VyY2UucHJvdG90eXBlLmJ1aWxkQWRkcmVzc2VzQXJyYXkgPSBmdW5jdGlvbiAoZGF0YUNhbGxiYWNrLCBub2RlU3RydWN0dXJlKSB7CgkJdmFyIGFkZHJlc3NlcyA9IFtdOwoKCQlmb3IgKGVsZW1lbnQgaW4gbm9kZVN0cnVjdHVyZSkgewoJCQl2YXIgbm9kZUVudHJ5ID0gbm9kZVN0cnVjdHVyZVtlbGVtZW50XTsKCgkJCWlmIChjaGVja0lnbm9yZWRQcm9wZXJ0aWVzKG5vZGVFbnRyeSkgJiYgb3BjVUFUeXBlcy5hZ2dyZWdhdGVUZW1wbGF0ZS5pbmRleE9mKG5vZGVFbnRyeVsidHlwZSJdKSA9PT0gLTEpIHsKCQkJCWFkZHJlc3Nlcy5wdXNoKG5vZGVFbnRyeVsiYWRkcmVzcyJdKTsKCQkJfQoKCQkJaWYgKG5vZGVFbnRyeVsiY2hpbGRzIl0gIT09IG51bGwpIHsKCQkJCWFkZHJlc3NlcyA9IGFkZHJlc3Nlcy5jb25jYXQodGhpcy5idWlsZEFkZHJlc3Nlc0FycmF5KG51bGwsIG5vZGVFbnRyeVsiY2hpbGRzIl0pKTsKCQkJfQoJCX0KCQlpZiAodHlwZW9mIGRhdGFDYWxsYmFjayA9PT0gImZ1bmN0aW9uIikgewoJCQlkYXRhQ2FsbGJhY2soYWRkcmVzc2VzKTsKCQl9CgoJCXJldHVybiBhZGRyZXNzZXM7Cgl9OwoKCS8qKgoJICogQSBtZXRob2QgdGhhdCByZXF1ZXN0cyB0aGUgbm9kZSBzdHJ1Y3R1cmUgZnJvbSB0aGUgc2VydmVyCgkgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlQWRkcmVzcyBUaGUgbm9kZSBhZGRyZXNzIHRvIGdldCB0aGUgZGF0YSBmb3IKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZU5vZGUgVGhlIG5vZGUgdGhlIGRhdGEgaXMgcmVxdWVzdGVkIGZvcgoJICovCglUcmVlVmlld0RhdGFzb3VyY2UucHJvdG90eXBlLmZldGNoVHJlZVN0cnVjdHVyZSA9IGZ1bmN0aW9uIChyZWZlcmVuY2VBZGRyZXNzLCByZWZlcmVuY2VOb2RlKSB7CgkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKCQkJaWYgKHdlYk1JLmdldE1ldGhvZFN1cHBvcnQoKS5pbmRleE9mKCJCcm93c2VOb2RlcyIpID09IC0xKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXZhciBzdGFydEFkZHJlc3MgPSB0aGlzLm9wdGlvbnMuc3RhcnRBZGRyZXNzOwoKCQkJaWYgKHJlZmVyZW5jZUFkZHJlc3MpIHsKCQkJCXN0YXJ0QWRkcmVzcyA9IHJlZmVyZW5jZUFkZHJlc3M7CgkJCX0gZWxzZSB7CgkJCQl2YXIgZGF0YSA9IGdldERhdGFGcm9tTm9kZShyZWZlcmVuY2VOb2RlKTsKCQkJCWlmIChkYXRhKSB7CgkJCQkJc3RhcnRBZGRyZXNzID0gZGF0YS5hZGRyZXNzOwoJCQkJfQoJCQl9CgoJCQl0cnkgewoJCQkJdmFyIGFnZ3JlZ2F0ZUZ1bmN0aW9uID0gc3RhcnRBZGRyZXNzLmluZGV4T2YoIkFHRU5ULkhJU1RPUlkuQUdHUkVHQVRFVEVNUExBVEVTLiIpID4gLTE7CgkJCX0gY2F0Y2ggKGVycikgewoJCQkJY29uc29sZS5sb2coZXJyKTsKCQkJfQoKCQkJaWYgKHRoaXMuY2FjaGVkQXZhaWxhYmxlTm9kZXMgJiYgdGhpcy5vcHRpb25zLm5vZGVDYWNoZUFjdGl2ZSkgewoJCQkJbGV0IHJlc3BvbnNlID0gZmluZENoaWxkcmVuKHN0YXJ0QWRkcmVzcywgdGhpcy5jYWNoZWRBdmFpbGFibGVOb2Rlcyk7CgkJCQljb25zdCBkYXRhID0gdGhpcy5wYXJzZU5vZGVTdHJ1Y3R1cmUuYmluZCh0aGlzLCByZWZlcmVuY2VOb2RlKShyZXNwb25zZSk7CgkJCQlyZXNvbHZlKGRhdGEsIHJlZmVyZW5jZU5vZGUpOwoJCQl9IGVsc2UgewoJCQkJd2ViTUkuZGF0YS5jYWxsKAoJCQkJCSJCcm93c2VOb2Rlc1dpdGhBbGFybSIsCgkJCQkJewoJCQkJCQlzdGFydEFkZHJlc3M6IHN0YXJ0QWRkcmVzcywKCQkJCQkJZW5kTGV2ZWw6IGFnZ3JlZ2F0ZUZ1bmN0aW9uID8gMiA6IHRoaXMub3B0aW9ucy5uYXZpZ2F0aW9uRGVwdGgsCgkJCQkJCXZUeXBlczogWwoJCQkJCQkJb3BjVUFUeXBlcy5iYXNlVmFyaWFibGVEYXRhVHlwZSwKCQkJCQkJCW9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlLAoJCQkJCQkJb3BjVUFUeXBlcy5mb2xkZXIsCgkJCQkJCQlvcGNVQVR5cGVzLnByb2plY3QsCgkJCQkJCQlvcGNVQVR5cGVzLnByb2plY3RWYXJpYWJsZXMsCgkJCQkJCQlvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uVHlwZSwKCQkJCQkJCW9wY1VBVHlwZXMuYWdncmVnYXRlVGVtcGxhdGUsCgkJCQkJCQlvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uCgkJCQkJCV0sCgkJCQkJCW1hcHBpbmc6IFsKCQkJCQkJCXsgYWxpYXM6ICJhZGRyZXNzIiwga2V5czogWyJub2RlSWQiLCAieG1sIl0sIHJlbW92ZU5zVGFnOiB0cnVlIH0sCgkJCQkJCQl7IGFsaWFzOiAibmFtZSIsIGtleXM6IFsiYnJvd3NlTmFtZSIsICJuYW1lIl0gfSwKCQkJCQkJCXsgYWxpYXM6ICJ0eXBlIiwga2V5czogWyJ0eXBlRGVmaW5pdGlvbiIsICJ4bWwiXSwgcmVtb3ZlTnNUYWc6IHRydWUgfQoJCQkJCQldLAoJCQkJCQlpbmNsdWRlU3RhcnRBZGRyZXNzOiBmYWxzZQoJCQkJCX0sCgkJCQkJKHJlc3BvbnNlKSA9PiB7CgkJCQkJCWlmIChyZXNwb25zZS5lcnJvciAmJiB0eXBlb2YgcmVzcG9uc2UuZXJyb3IgPT09ICJudW1iZXIiKSB7CgkJCQkJCQlyZWplY3QocmVzcG9uc2UpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJY29uc3QgZGF0YSA9IHRoaXMucGFyc2VOb2RlU3RydWN0dXJlLmJpbmQodGhpcywgcmVmZXJlbmNlTm9kZSkocmVzcG9uc2UpOwoJCQkJCQkJcmVzb2x2ZShkYXRhLCByZWZlcmVuY2VOb2RlKTsKCQkJCQkJfQoJCQkJCX0KCQkJCSk7CgkJCX0KCQl9KTsKCX07CgoJLyoqCgkgKiBBIG1ldGhvZCB0aGF0IHBhcnNlcyB0aGUgZmV0Y2hlZCBub2RlIHN0cnVjdHVyZSBhbmQgcmVxdWVzdHMgYWRkaXRpb25hbCBub2RlIGluZm9ybWF0aW9uCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2VOb2RlIFRoZSBub2RlIHRoZSBkYXRhIGlzIHJlcXVlc3RlZCBmb3IKCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlU3RydWN0dXJlIFRoZSBub2RlIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIKCSAqLwoJVHJlZVZpZXdEYXRhc291cmNlLnByb3RvdHlwZS5wYXJzZU5vZGVTdHJ1Y3R1cmUgPSBmdW5jdGlvbiAocmVmZXJlbmNlTm9kZSwgbm9kZVN0cnVjdHVyZSkgewoJCWlmIChub2RlU3RydWN0dXJlLmVycm9yICYmIHR5cGVvZiBub2RlU3RydWN0dXJlLmVycm9yID09PSAibnVtYmVyIikgcmV0dXJuOwoKCQkvLyBDaGVjayBpZiB0d28gREIgc3BhY2VzIGV4aXN0CgkJdmFyIGRic3BhY2VzID0ge307CgkJZm9yICh2YXIgcHJvcGVydHkgaW4gbm9kZVN0cnVjdHVyZSkgewoJCQlpZiAoIWlzTmFOKHByb3BlcnR5LnN1YnN0cigwLCBwcm9wZXJ0eS5pbmRleE9mKCIuIikpKSkgZGJzcGFjZXNbcHJvcGVydHkuc3Vic3RyKDAsIHByb3BlcnR5LmluZGV4T2YoIi4iKSldID0gdHJ1ZTsKCQl9CgoJCWlmIChPYmplY3Qua2V5cyhkYnNwYWNlcykubGVuZ3RoID4gMSkgewoJCQlmb3IgKHZhciBwcm9wZXJ0eSBpbiBub2RlU3RydWN0dXJlKSB7CgkJCQlub2RlU3RydWN0dXJlW3Byb3BlcnR5XS5uYW1lID0gbm9kZVN0cnVjdHVyZVtwcm9wZXJ0eV0uYWRkcmVzczsKCQkJfQoJCX0KCgkJdmFyIGRhdGEgPSBbXTsKCQlmb3IgKHZhciBlbGVtZW50IGluIG5vZGVTdHJ1Y3R1cmUpIHsKCQkJdmFyIG5vZGVFbnRyeSA9IG5vZGVTdHJ1Y3R1cmVbZWxlbWVudF07CgkJCXZhciBkYXRhSUQgPSBnZW5lcmF0ZURhdGFJRCgpOwoJCQl2YXIgaGFzQ2hpbGRyZW4gPSBub2RlRW50cnkuY2hpbGRzICE9IG51bGw7CgoJCQl2YXIgcHJvamVjdFZhcmlhYmxlTmFtZSA9IGZhbHNlOwoKCQkJLy8gV29ya2Fyb3VuZCBmw4PCvHIgYWx0ZSBQb3J0YWx2ZXJzaW9uZW4sIHdvIEJyb3dzZU5vZGVzIG5vY2gga2VpbiAidHlwZSIgbGllZmVydAoJCQlpZiAodHlwZW9mIG5vZGVFbnRyeS50eXBlID09ICJ1bmRlZmluZWQiKSB7CgkJCQlpZiAoaGFzQ2hpbGRyZW4pIG5vZGVFbnRyeS50eXBlID0gImk9NjEiOwoJCQkJZWxzZSBub2RlRW50cnkudHlwZSA9ICJpPTYyIjsKCQkJfQoKCQkJaWYgKG5vZGVFbnRyeS50eXBlLmluZGV4T2YoIlZhcmlhYmxlVHlwZXMuUFJPSkVDVCIpID09PSAwKSB7CgkJCQlwcm9qZWN0VmFyaWFibGVOYW1lID0gbm9kZUVudHJ5LnR5cGU7CgkJCX0KCgkJCXN3aXRjaCAobm9kZUVudHJ5LnR5cGUpIHsKCQkJCWNhc2Ugb3BjVUFUeXBlcy5iYXNlVmFyaWFibGVEYXRhVHlwZToKCQkJCQlkYXRhLnB1c2goewoJCQkJCQluYW1lOiBub2RlRW50cnkubmFtZSwKCQkJCQkJYWRkcmVzczogbm9kZUVudHJ5LmFkZHJlc3MsCgkJCQkJCXR5cGU6IHR5cGVzLmJhc2VWYXJpYWJsZSwKCQkJCQkJaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLAoJCQkJCQljaGlsZHJlbjogW10sCgkJCQkJCWRhdGFJRDogZGF0YUlECgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlOgoJCQkJCWlmIChjaGVja0lnbm9yZWRQcm9wZXJ0aWVzKG5vZGVFbnRyeSkpIHsKCQkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJCW5hbWU6IG5vZGVFbnRyeS5uYW1lLAoJCQkJCQkJYWRkcmVzczogbm9kZUVudHJ5LmFkZHJlc3MsCgkJCQkJCQl0eXBlOiB0eXBlcy5iYXNlVmFyaWFibGUsCgkJCQkJCQloYXNDaGlsZHJlbjogaGFzQ2hpbGRyZW4sCgkJCQkJCQljaGlsZHJlbjogW10sCgkJCQkJCQlkYXRhSUQ6IGRhdGFJRAoJCQkJCQl9KTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHByb2plY3RWYXJpYWJsZU5hbWU6CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5wcm9qZWN0VmFyaWFibGVzLAoJCQkJCQloYXNDaGlsZHJlbjogaGFzQ2hpbGRyZW4sCgkJCQkJCWNoaWxkcmVuOiBbXSwKCQkJCQkJZGF0YUlEOiBkYXRhSUQKCQkJCQl9KTsKCQkJCQlicmVhazsKCQkJCWNhc2Ugb3BjVUFUeXBlcy5mb2xkZXI6CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5mb2xkZXIsCgkJCQkJCWhhc0NoaWxkcmVuOiBoYXNDaGlsZHJlbiwKCQkJCQkJY2hpbGRyZW46IFtdCgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYWdncmVnYXRlVGVtcGxhdGUuc2xpY2UoNyk6CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5mb2xkZXIsCgkJCQkJCWhhc0NoaWxkcmVuOiBoYXNDaGlsZHJlbiwKCQkJCQkJY2hpbGRyZW46IFtdCgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYWdncmVnYXRlRnVuY3Rpb246CgkJCQkJZmV0Y2hBZ2dyZWdhdGVPcHRpb25zKG5vZGVFbnRyeSwgZGF0YUlELCByZWZlcmVuY2VOb2RlKTsKCQkJCQloYXNDaGlsZHJlbiA9IGNoZWNrQ2hpbGRyZW4obm9kZUVudHJ5LmNoaWxkcyk7CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5hZ2dyZWdhdGVGdW5jdGlvbiwKCQkJCQkJaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLAoJCQkJCQljaGlsZHJlbjogaGFzQ2hpbGRyZW4gPyBub2RlRW50cnkuY2hpbGRzIDogW10sCgkJCQkJCWRhdGFJRDogZGF0YUlECgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYWdncmVnYXRlRnVuY3Rpb25UeXBlOgoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlkYXRhLnB1c2goewoJCQkJCQluYW1lOiBub2RlRW50cnkubmFtZSwKCQkJCQkJYWRkcmVzczogbm9kZUVudHJ5LmFkZHJlc3MsCgkJCQkJCXR5cGU6IHR5cGVzLmZvbGRlciwKCQkJCQkJaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLAoJCQkJCQljaGlsZHJlbjogW10KCQkJCQl9KTsKCQkJCQlicmVhazsKCQkJfQoJCX0KCgkJLy8gQXNzaWduIGljb25zCgkJZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7CgkJCXZhciBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CgkJCWljb24uc3JjID0gdGhpcy5vcHRpb25zLmxhbmd1YWdlUHJlZml4ICsgdGhpcy5vcHRpb25zLnR5cGVJbWFnZVBhdGhzW2l0ZW0udHlwZV07CgkJCWl0ZW0uaWNvbiA9IGljb247CgkJfSk7CgoJCXJldHVybiBkYXRhOwoJfTsKCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IGNoZWNrcyBpZiB0aGVyZSBhcmUgY2hpbGRyZW4gdGhhdCBhcmUgd29ydGggdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0cmVlLgoJICogQHBhcmFtIHtvYmplY3R9IGNoaWxkcmVuIFRoZSBlbGVtZW50IG9mIHRoZSBub2RlIHN0cnVjdHVyZSB0byBjaGVjayB0aGUgY2hpbGRyZW4gZm9yCgkgKi8KCWZ1bmN0aW9uIGNoZWNrQ2hpbGRyZW4oY2hpbGRyZW4pIHsKCQl2YXIgaWdub3JlZE5vZGVzID0gWwoJCQl7bmFtZTogYWdncmVnYXRlT3B0aW9ucy5vZmZzZXRVbml0LCB0eXBlOiBvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZX0sCgkJCXtuYW1lOiBhZ2dyZWdhdGVPcHRpb25zLm9mZnNldFZhbHVlLCB0eXBlOiBvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZX0sCgkJCXtuYW1lOiBhZ2dyZWdhdGVPcHRpb25zLmludGVydmFsVW5pdCwgdHlwZTogb3BjVUFUeXBlcy5iYXNlVmFyaWFibGV9LAoJCQl7bmFtZTogYWdncmVnYXRlT3B0aW9ucy5pbnRlcnZhbFZhbHVlLCB0eXBlOiBvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZX0sCgkJCXtuYW1lOiBhZ2dyZWdhdGVPcHRpb25zLnN0ZXBwZWQsIHR5cGU6IG9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlfSwKCQkJe25hbWU6ICIqIiwgdHlwZTogb3BjVUFUeXBlcy5hZ2dyZWdhdGVGdW5jdGlvblR5cGV9CgkJXTsKCQl2YXIgdmFsaWRDaGlsZHJlbiA9IGZhbHNlOwoKCQlpZiAoY2hpbGRyZW4gIT09ICJvbmRlbWFuZCIpIHsKCQkJZm9yIChlbGVtZW50IGluIGNoaWxkcmVuKSB7CgkJCQl2YXIgbm9kZUVudHJ5ID0gY2hpbGRyZW5bZWxlbWVudF07CgkJCQl2YXIgaWdub3JlTm9kZSA9IGZhbHNlOwoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBpZ25vcmVkTm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJCQlpZiAoCgkJCQkJCShub2RlRW50cnkubmFtZSA9PSBpZ25vcmVkTm9kZXNbaV0ubmFtZSB8fCBpZ25vcmVkTm9kZXNbaV0ubmFtZSA9PSAiKiIpICYmCgkJCQkJCW5vZGVFbnRyeS50eXBlID09IGlnbm9yZWROb2Rlc1tpXS50eXBlCgkJCQkJKSB7CgkJCQkJCWlnbm9yZU5vZGUgPSB0cnVlOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoIWlnbm9yZU5vZGUpIHsKCQkJCQl2YWxpZENoaWxkcmVuID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHZhbGlkQ2hpbGRyZW47Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBtZXRob2QgdGhhdCBjaGVja3MgdGhlIGJhc2UgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIGRpc3BsYXlpbmcKCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRW50cnkgVGhlIGVsZW1lbnQgb2YgdGhlIG5vZGUgc3RydWN0dXJlIHRvIGJlIGV2ZW50dWFsbHkgaWdub3JlZAoJICovCglmdW5jdGlvbiBjaGVja0lnbm9yZWRQcm9wZXJ0aWVzKG5vZGVFbnRyeSkgewoJCXZhciBpc05vZGVPcHRpb24gPSBmYWxzZTsKCQlmb3IgKG9wdGlvbiBpbiBhZ2dyZWdhdGVPcHRpb25zKSB7CgkJCWlmIChhZ2dyZWdhdGVPcHRpb25zW29wdGlvbl0gPT0gbm9kZUVudHJ5Lm5hbWUpIHsKCQkJCWlzTm9kZU9wdGlvbiA9IHRydWU7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlyZXR1cm4gIWlzTm9kZU9wdGlvbjsKCX0KCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IGdldHMgdGhlIG9wdGlvbnMgZm9yIG5vZGVzIHRoYXQgcmVwcmVzZW50IGFnZ3JlZ2F0ZSBmdW5jdGlvbnMKCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRW50cnkgVGhlIGVsZW1lbnQgb2YgdGhlIG5vZGUgc3RydWN0dXJlIHRoYXQgaXMgYW4gYWdncmVnYXRlIGZ1bmN0aW9uCgkgKi8KCWZ1bmN0aW9uIGZldGNoQWdncmVnYXRlT3B0aW9ucyhub2RlRW50cnksIGRhdGFJRCwgcmVmZXJlbmNlTm9kZSkgewoJCXZhciByZWxhdGVkTm9kZUFkZHJlc3MgPSBnZXRSZWxhdGVkTm9kZUFkZHJlc3MocmVmZXJlbmNlTm9kZSk7CgkJdmFyIGFnZ3JlZ2F0ZUFkZHJlc3MgPSBub2RlRW50cnkuYWRkcmVzczsKCgkJdmFyIGFnZ3JlZ2F0ZVR5cGU7CgkJd2ViTUkuZGF0YS5jYWxsKAoJCQkiQnJvd3NlTm9kZXNXaXRoQWxhcm0iLAoJCQl7CgkJCQlzdGFydEFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJZW5kTGV2ZWw6IDEsCgkJCQl2VHlwZXM6IFtvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uVHlwZV0sCgkJCQltYXBwaW5nOiBbCgkJCQkJe2FsaWFzOiAiYWRkcmVzcyIsIGtleXM6IFsibm9kZUlkIiwgInhtbCJdLCByZW1vdmVOc1RhZzogdHJ1ZX0sCgkJCQkJe2FsaWFzOiAibmFtZSIsIGtleXM6IFsiYnJvd3NlTmFtZSIsICJuYW1lIl19LAoJCQkJCXthbGlhczogInR5cGUiLCBrZXlzOiBbInR5cGVEZWZpbml0aW9uIiwgInhtbCJdLCByZW1vdmVOc1RhZzogdHJ1ZX0KCQkJCV0sCgkJCQlpbmNsdWRlU3RhcnRBZGRyZXNzOiBmYWxzZQoJCQl9LAoJCQlmdW5jdGlvbiAoZSkgewoJCQkJYWdncmVnYXRlVHlwZSA9IGVbT2JqZWN0LmtleXMoZSlbMF1dLm5hbWU7CgkJCQl3ZWJNSS5kYXRhLnJlYWQoCgkJCQkJWwoJCQkJCQlhZ2dyZWdhdGVBZGRyZXNzICsgIi4iICsgYWdncmVnYXRlT3B0aW9ucy5pbnRlcnZhbFZhbHVlLAoJCQkJCQlhZ2dyZWdhdGVBZGRyZXNzICsgIi4iICsgYWdncmVnYXRlT3B0aW9ucy5pbnRlcnZhbFVuaXQsCgkJCQkJCWFnZ3JlZ2F0ZUFkZHJlc3MgKyAiLiIgKyBhZ2dyZWdhdGVPcHRpb25zLm9mZnNldFZhbHVlLAoJCQkJCQlhZ2dyZWdhdGVBZGRyZXNzICsgIi4iICsgYWdncmVnYXRlT3B0aW9ucy5vZmZzZXRVbml0CgkJCQkJXSwKCQkJCQlmdW5jdGlvbiAoZGF0YSkgewoJCQkJCQl2YXIgYWdncmVnYXRlRGF0YSA9IHthZ2dyZWdhdGVJbmZvOiB7fX07CgkJCQkJCWFnZ3JlZ2F0ZURhdGEuYWdncmVnYXRlSW5mb1thZ2dyZWdhdGVPcHRpb25zLmludGVydmFsVmFsdWVdID0gZGF0YVswXS52YWx1ZTsKCQkJCQkJYWdncmVnYXRlRGF0YS5hZ2dyZWdhdGVJbmZvW2FnZ3JlZ2F0ZU9wdGlvbnMuaW50ZXJ2YWxVbml0XSA9IGRhdGFbMV0udmFsdWU7CgkJCQkJCWFnZ3JlZ2F0ZURhdGEuYWdncmVnYXRlSW5mb1thZ2dyZWdhdGVPcHRpb25zLm9mZnNldFZhbHVlXSA9IGRhdGFbMl0udmFsdWU7CgkJCQkJCWFnZ3JlZ2F0ZURhdGEuYWdncmVnYXRlSW5mb1thZ2dyZWdhdGVPcHRpb25zLm9mZnNldFVuaXRdID0gZGF0YVszXS52YWx1ZTsKCQkJCQkJYWdncmVnYXRlRGF0YS5hZ2dyZWdhdGVJbmZvW2FnZ3JlZ2F0ZU9wdGlvbnMuYWdncmVnYXRlVHlwZV0gPSBhZ2dyZWdhdGVUeXBlOwoJCQkJCQlhZ2dyZWdhdGVEYXRhLmFnZ3JlZ2F0ZUluZm9bYWdncmVnYXRlT3B0aW9ucy5yZWxhdGVkTm9kZUFkZHJlc3NdID0gcmVsYXRlZE5vZGVBZGRyZXNzOwoJCQkJCQlhZGREYXRhVG9JdGVtKHJlZmVyZW5jZU5vZGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCJkaXZbZGF0YS1pZD0nIiArIGRhdGFJRCArICInXSIpLCBhZ2dyZWdhdGVEYXRhKTsKCQkJCQl9CgkJCQkpOwoJCQl9CgkJKTsKCX0KCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IGdlbmVyYXRlcyBhIHVuaXF1ZSBkYXRhLWlkCgkgKiBAcmV0dXJuIHtzdHJpbmd9IGlkIEEgdW5pcXVlIGRhdGEgaWQKCSAqLwoJZnVuY3Rpb24gZ2VuZXJhdGVEYXRhSUQoKSB7CgkJdmFyIFM0ID0gZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkgfCAwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpOwoJCX07CgkJcmV0dXJuIFM0KCkgKyBTNCgpICsgIi0iICsgUzQoKSArICItIiArIFM0KCkgKyAiLSIgKyBTNCgpICsgIi0iICsgUzQoKSArIFM0KCkgKyBTNCgpOwoJfQoKCWlmICghd2luZG93LnRyZWVWaWV3RGF0YXNvdXJjZXMpIHsKCQl3aW5kb3cudHJlZVZpZXdEYXRhc291cmNlcyA9IHt9OwoJfQoJd2luZG93LnRyZWVWaWV3RGF0YXNvdXJjZXNbZGF0YVNvdXJjZU5hbWVdID0gVHJlZVZpZXdEYXRhc291cmNlOwp9KSh3aW5kb3csIGRvY3VtZW50KTsK</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView" ExportedBrowseName="1:treeView" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView" BrowseName="1:treeView">
		<DisplayName Locale="en">treeView</DisplayName>
		<Description Locale="en">treeView</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources" BrowseName="1:datasources">
		<DisplayName Locale="en">datasources</DisplayName>
		<Description Locale="en">datasources</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources/opcuaAlarms.js" BrowseName="1:opcuaAlarms.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">opcuaAlarms.js</DisplayName>
		<Description Locale="en">opcuaAlarms.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>KCgpID0+IHsKCS8vIEhlcmUgdGhlIHNhbWUgbmFtZSBzaG91bGQgYmUgdXNlZCBhcyBmb3IgdGhlIHJlc3BlY3RpdmUgaGlnaGNoYXJ0cyBkYXRhc291cmNlCgljb25zdCBkYXRhU291cmNlTmFtZSA9ICJvcGNVQV9BbGFybXMiOwoKCXZhciB0eXBlcyA9IHsKCQliYXNlVmFyaWFibGU6ICJiYXNlVmFyaWFibGUiLAoJCWZvbGRlcjogImZvbGRlciIsCgkJcHJvamVjdFZhcmlhYmxlczogImJhc2VWYXJpYWJsZSIsCgkJYWdncmVnYXRlVGVtcGxhdGU6ICJhZ2dyZWdhdGVUZW1wbGF0ZSIsCgkJYWdncmVnYXRlRnVuY3Rpb246ICJhZ2dyZWdhdGVGdW5jdGlvbiIsCgkJYWdncmVnYXRlRnVuY3Rpb25UeXBlOiAiYWdncmVnYXRlRnVuY3Rpb25UeXBlIgoJfTsKCgl2YXIgYWdncmVnYXRlT3B0aW9ucyA9IHsKCQlpbnRlcnZhbFVuaXQ6ICJpbnRlcnZhbF91bml0IiwKCQlpbnRlcnZhbFZhbHVlOiAiaW50ZXJ2YWxfdmFsdWUiLAoJCW9mZnNldFVuaXQ6ICJvZmZzZXRfdW5pdCIsCgkJb2Zmc2V0VmFsdWU6ICJvZmZzZXRfdmFsdWUiLAoJCXN0ZXBwZWQ6ICJzdGVwcGVkIiwKCQlhZ2dyZWdhdGVUeXBlOiAiYWdncmVnYXRlIiwKCQlyZWxhdGVkTm9kZUFkZHJlc3M6ICJyZWxhdGVkTm9kZUFkZHJlc3MiCgl9OwoKCXZhciBvcGNVQVR5cGVzID0gewoJCWJhc2VWYXJpYWJsZURhdGFUeXBlOiAiaT02MyIsCgkJYmFzZVZhcmlhYmxlOiAiaT02MiIsCgkJZm9sZGVyOiAiaT02MSIsCgkJcHJvamVjdDogIk9iamVjdFR5cGVzLlBST0pFQ1QiLAoJCXByb2plY3RWYXJpYWJsZXM6ICJWYXJpYWJsZVR5cGVzLlBST0pFQ1QiLAoJCWFnZ3JlZ2F0ZVRlbXBsYXRlOiAiT2JqZWN0VHlwZXMuQVRWSVNFLkFnZ3JlZ2F0ZVRlbXBsYXRlIiwKCQlhZ2dyZWdhdGVGdW5jdGlvbjogIk9iamVjdFR5cGVzLkFUVklTRS5BZ2dyZWdhdGVGdW5jdGlvbiIsCgkJYWdncmVnYXRlRnVuY3Rpb25UeXBlOiAiaT0yMzQwIgoJfTsKCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCBmb3IgcGFyc2luZyB0aGUgZGF0YS1pdGVtIG9mIGEgbm9kZQoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBUaGUgY29ycmVzcG9uZGluZyBET00tbm9kZQoJICogQHJldHVybiB7c3RyaW5nfSBvYmplY3QgVGhlIHBhcnNlZCBkYXRhLWl0ZW0KCSAqLwoJZnVuY3Rpb24gZ2V0RGF0YUZyb21Ob2RlKG5vZGUpIHsKCQlpZiAobm9kZSkgewoJCQlyZXR1cm4gSlNPTi5wYXJzZShub2RlLmdldEF0dHJpYnV0ZSgiZGF0YS1pdGVtIikpOwoJCX0gZWxzZSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoJfQoKCS8qKgoJICogQSBoZWxwZXIgbWV0aG9kIGZvciBhZGRpbmcgYWRkaXRpb25hbCBkYXRhIHRvIHRoZSBkYXRhLWl0ZW0gb2YgYSBub2RlCgkgKiBAcGFyYW0ge29iamVjdH0gaXRlbSBUaGUgaXRlbSAob2JqZWN0KSB0byBiZSBhZGRlZAoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYWRkRGF0YSBUaGUgY29ycmVzcG9uZGluZyBET00tbm9kZQoJICovCglmdW5jdGlvbiBhZGREYXRhVG9JdGVtKGl0ZW0sIGFkZERhdGEpIHsKCQl2YXIgZGF0YSA9IEpTT04ucGFyc2UoaXRlbS5nZXRBdHRyaWJ1dGUoImRhdGEtaXRlbSIpKTsKCQlpdGVtLnNldEF0dHJpYnV0ZSgiZGF0YS1pdGVtIiwgSlNPTi5zdHJpbmdpZnkobWVyZ2VEYXRhKGRhdGEsIGFkZERhdGEpKSk7Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBtZXRob2QgdG8gbWVyZ2UgdG8gb2JqZWN0cyByZWN1cnNpdmVseQoJICogQHBhcmFtIHtvYmplY3R9IGRhdGEgVGhlIGJhc2Utb2JqZWN0CgkgKiBAcGFyYW0ge29iamVjdH0gYWRkRGF0YSBUaGUgZGF0YSB0byBhZGQgcmVjdXJzaXZlbHkgdG8gdGhlIGJhc2Ugb2JqZWN0CgkgKi8KCWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLCBhZGREYXRhKSB7CgkJZm9yICh2YXIgcCBpbiBhZGREYXRhKSB7CgkJCXRyeSB7CgkJCQkvLyBQcm9wZXJ0eSBpbiBkZXN0aW5hdGlvbiBvYmplY3Qgc2V0OyB1cGRhdGUgaXRzIHZhbHVlLgoJCQkJaWYgKGFkZERhdGFbcF0uY29uc3RydWN0b3IgPT09IE9iamVjdCkgewoJCQkJCWRhdGFbcF0gPSBtZXJnZURhdGEoZGF0YVtwXSwgYWRkRGF0YVtwXSk7CgkJCQl9IGVsc2UgewoJCQkJCWRhdGFbcF0gPSBhZGREYXRhW3BdOwoJCQkJfQoJCQl9IGNhdGNoIChlKSB7CgkJCQkvLyBQcm9wZXJ0eSBpbiBkZXN0aW5hdGlvbiBvYmplY3Qgbm90IHNldDsgY3JlYXRlIGl0IGFuZCBzZXQgaXRzIHZhbHVlLgoJCQkJZGF0YVtwXSA9IGFkZERhdGFbcF07CgkJCX0KCQl9CgkJcmV0dXJuIGRhdGE7Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBnZXRzIHRoZSByZWxhdGVkIG5vZGUgYWRkcmVzcyBvZiBhIGh0bWwgZWxlbWVudC4KCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZU5vZGUgQSBodG1sIG5vZGUgdGhhdCBoYXMgYSBkYXRhLWl0ZW0gYXR0cmlidXRlLgoJICogQHJldHVybiB7c3RyaW5nfSByZWxhdGVkQWRkcmVzcwoJICovCglmdW5jdGlvbiBnZXRSZWxhdGVkTm9kZUFkZHJlc3MocmVmZXJlbmNlTm9kZSkgewoJCXZhciBjdXJyZW50Tm9kZSA9IHJlZmVyZW5jZU5vZGU7CgkJdmFyIHJlbGF0ZWRBZGRyZXNzID0gZ2V0RGF0YUZyb21Ob2RlKGN1cnJlbnROb2RlKS5hZGRyZXNzOwoKCQl3aGlsZSAocmVsYXRlZEFkZHJlc3MuaW5kZXhPZigiSElTVE9SWSIpICE9PSAtMSkgewoJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7CgkJCXZhciBub2RlRGF0YSA9IHt9OwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJCW5vZGVEYXRhID0gZ2V0RGF0YUZyb21Ob2RlKGN1cnJlbnROb2RlLmNoaWxkTm9kZXNbaV0pOwoJCQkJaWYgKG5vZGVEYXRhKSB7CgkJCQkJcmVsYXRlZEFkZHJlc3MgPSBub2RlRGF0YS5hZGRyZXNzOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmVsYXRlZEFkZHJlc3M7Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBzZWFyY2hlcyB0aGUgcmVzcG9uc2UgY2FjaGUgZm9yIHRoZSBzZWFyY2h0ZXJtLgoJICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3Mgbm9kZUlkIG9mIHRoZSBub2RlIHRvIHNlYXJjaCBmb3IuCgkgKiBAcGFyYW0ge29iamVjdH0gbm9kZVRyZWUgQSBjYWNoZWQgcmVzcG9uc2Ugb2YgYWxsIG5vZGVzIGluIHRoZSBwcm9qZWN0LgoJICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29uYXRpbmluZyB0aGUgbm9kZXMgcmVxdWlyZWQgaW5mbwoJICovCglmdW5jdGlvbiBmaW5kQ2hpbGRyZW4oYWRkcmVzcywgbm9kZVRyZWUpIHsKCQlsZXQgcmVzdWx0OwoJCWlmIChub2RlVHJlZS5hZGRyZXNzID09PSBhZGRyZXNzKSB7CgkJCXJldHVybiBub2RlVHJlZTsKCQl9CgkJZm9yIChsZXQgbm9kZU5hbWUgaW4gbm9kZVRyZWUpIHsKCQkJaWYgKG5vZGVUcmVlW25vZGVOYW1lXS5hZGRyZXNzID09PSBhZGRyZXNzKSB7CgkJCQlyZXR1cm4gbm9kZVRyZWVbbm9kZU5hbWVdLmNoaWxkczsKCQkJfSBlbHNlIHsKCQkJCWlmIChub2RlVHJlZVtub2RlTmFtZV0uY2hpbGRzKSB7CgkJCQkJcmVzdWx0ID0gZmluZENoaWxkcmVuKGFkZHJlc3MsIG5vZGVUcmVlW25vZGVOYW1lXS5jaGlsZHMpOwoJCQkJfQoJCQl9CgoJCQlpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0OwoJCX0KCX0KCglmdW5jdGlvbiBUcmVlVmlld0RhdGFzb3VyY2Uob3B0aW9ucykgewoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCWNvbnN0IGRlZmF1bHRPcHRpb25zID0gewoJCQlyZW5kZXJUbzogIiIsCgkJCXN0YXJ0QWRkcmVzczogIkFHRU5ULk9CSkVDVFMiLAoJCQlhZ2dyZWdhdGVBZGRyZXNzUHJlZml4OiAiQUdFTlQuSElTVE9SWS5BR0dSRUdBVEVURU1QTEFURVMiLAoJCQlzZWxlY3RhYmxlVHlwZXM6IFt0eXBlcy5iYXNlVmFyaWFibGUsIHR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uXSwKCQkJZm9udFNpemU6IDEyLAoJCQlsZWFmUGFkZGluZzogMiwKCQkJbGVhZkluZGVudGF0aW9uOiAxNSwKCQkJYnVzeUluZGljYXRvclRvbGVyYW5jZTogMTAwLAoJCQlleHBhbmRvT2Zmc2V0OiAzLAoJCQlzZWFyY2hEZXB0aDogMTAwLAoJCQluYXZpZ2F0aW9uRGVwdGg6IDEsCgkJCXR5cGVJbWFnZVBhdGhzOiB7CgkJCQliYXNlVmFyaWFibGU6ICIvdHJlZVZpZXcvaWNvbnMvYmFzZVZhcmlhYmxlLnN2ZyIsCgkJCQlmb2xkZXI6ICIvdHJlZVZpZXcvaWNvbnMvZm9sZGVyLnN2ZyIsCgkJCQlhZ2dyZWdhdGVGdW5jdGlvbjogIi90cmVlVmlldy9pY29ucy9hZ2dyZWdhdGVGdW5jdGlvbi5zdmciCgkJCX0KCQl9OwoKCQl0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzID0gZmFsc2U7CgkJdGhpcy5idWlsZGluZ05vZGVzQ2FjaGUgPSBmYWxzZTsKCQl0aGlzLmJyb3dzZU5vZGVzQmFja2xvZyA9IFtdOwoKCQlzZWxmLm9wdGlvbnMgPSB7fTsKCQlPYmplY3QuYXNzaWduKHNlbGYub3B0aW9ucywgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpOwoKCQl2YXIgbGFuZ3VhZ2VOYW1lID0gIiI7CgkJZm9yICh2YXIgbGFuZ3VhZ2UgaW4gcHJvamVjdC5sYW5ndWFnZXMpIHsKCQkJbGFuZ3VhZ2VOYW1lID0gbGFuZ3VhZ2U7CgkJCWJyZWFrOwoJCX0KCQlzZWxmLm9wdGlvbnMubGFuZ3VhZ2VQcmVmaXggPSBsYW5ndWFnZU5hbWU7CgogICAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9kZUNhY2hlQWN0aXZlKSB7CiAgICAgICAgICAgIHRoaXMuZmV0Y2hBdmFpbGFibGVOb2RlQWRyZXNzZXMoKCkgPT4gewogICAgICAgICAgICAgICAgLy8gQ2FjaGUgaXMgcmVhZHkuCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCX0KCgkvKioKCSAqIEEgbWV0aG9kIHRoYXQgZmV0Y2hlcyBhbGwgbm9kZXMgdGhhdCBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSB0cmVlVmlldyBhbmQgYnVpbGRzIGFuIGFycmF5IGZvciB0cmVlIGZpbHRlcmluZy4KCSAqIEBwYXJhbSB7b2JqZWN0fSBzZWxmIFRoZSBUcmVlVmlldyBpbnN0YW5jZS4KCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGRhdGFDYWxsYmFjayBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aXRoIGFsbCB0aGUgYXZhaWxhYmxlIG5vZGVzLgoJICovCglUcmVlVmlld0RhdGFzb3VyY2UucHJvdG90eXBlLmZldGNoQXZhaWxhYmxlTm9kZUFkcmVzc2VzID0gZnVuY3Rpb24gKGRhdGFDYWxsYmFjaykgewoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCQoJCWlmICh0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzICYmIHRoaXMub3B0aW9ucy5ub2RlQ2FjaGVBY3RpdmUpIHsKCQkJdGhpcy5idWlsZEFkZHJlc3Nlc0FycmF5KGZ1bmN0aW9uIChhZGRyZXNzZXMpIHsKCQkJCXZhciBvcmRlcmVkQWRyZXNzZXMgPSBbXTsKCQkJCXZhciBsYXN0VmFsaWRBZGRyZXNzID0gbnVsbDsKCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkrKykgewoJCQkJCXZhciBhZGRyZXNzID0gd2ViTUkuZXNjYXBlSFRNTChhZGRyZXNzZXNbaV0pOwoJCQkJCWlmIChhZGRyZXNzLmluZGV4T2Yoc2VsZi5vcHRpb25zLmFnZ3JlZ2F0ZUFkZHJlc3NQcmVmaXgpID09PSAtMSkgewoJCQkJCQlsYXN0VmFsaWRBZGRyZXNzID0gYWRkcmVzczsKCQkJCQkJb3JkZXJlZEFkcmVzc2VzLnB1c2goeyBhZGRyZXNzOiBhZGRyZXNzIH0pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCW9yZGVyZWRBZHJlc3Nlcy5wdXNoKHsgYWRkcmVzczogbGFzdFZhbGlkQWRkcmVzcywgYWdncmVnYXRlUmVmZXJlbmNlOiBhZGRyZXNzIH0pOwoJCQkJCX0KCQkJCX0KCQkJCWRhdGFDYWxsYmFjayhvcmRlcmVkQWRyZXNzZXMpOwoJCQl9LCB0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKHRoaXMuYnVpbGRpbmdOb2Rlc0NhY2hlKSB7CgkJCXRoaXMuYnJvd3NlTm9kZXNCYWNrbG9nLnB1c2goZGF0YUNhbGxiYWNrKTsKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5idWlsZGluZ05vZGVzQ2FjaGUgPSB0cnVlOwoKCQl3ZWJNSS5kYXRhLmNhbGwoCgkJCSJCcm93c2VOb2Rlc1dpdGhBbGFybSIsCgkJCXsKCQkJCXN0YXJ0QWRkcmVzczogdGhpcy5vcHRpb25zLnN0YXJ0QWRkcmVzcywKCQkJCWVuZExldmVsOiB0aGlzLm9wdGlvbnMuc2VhcmNoRGVwdGgsCgkJCQl2VHlwZXM6IFsKCQkJCQlvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZURhdGFUeXBlLAoJCQkJCW9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlLAoJCQkJCW9wY1VBVHlwZXMuZm9sZGVyLAoJCQkJCW9wY1VBVHlwZXMucHJvamVjdCwKCQkJCQlvcGNVQVR5cGVzLnByb2plY3RWYXJpYWJsZXMsCgkJCQkJb3BjVUFUeXBlcy5hZ2dyZWdhdGVUZW1wbGF0ZSwKCQkJCQlvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uCgkJCQldLAoJCQkJbWFwcGluZzogWwoJCQkJCXthbGlhczogImFkZHJlc3MiLCBrZXlzOiBbIm5vZGVJZCIsICJ4bWwiXSwgcmVtb3ZlTnNUYWc6IHRydWV9LAoJCQkJCXthbGlhczogIm5hbWUiLCBrZXlzOiBbImJyb3dzZU5hbWUiLCAibmFtZSJdfSwKCQkJCQl7YWxpYXM6ICJ0eXBlIiwga2V5czogWyJ0eXBlRGVmaW5pdGlvbiIsICJ4bWwiXSwgcmVtb3ZlTnNUYWc6IHRydWV9CgkJCQldLAoJCQkJaW5jbHVkZVN0YXJ0QWRkcmVzczogZmFsc2UKCQkJfSwKCQkJKHJlc3BvbnNlKSA9PiB7CgkJCQl0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzID0gcmVzcG9uc2U7CgkJCQl0aGlzLmJ1aWxkQWRkcmVzc2VzQXJyYXkoZnVuY3Rpb24gKGFkZHJlc3NlcykgewoJCQkJCXZhciBvcmRlcmVkQWRyZXNzZXMgPSBbXTsKCQkJCQl2YXIgbGFzdFZhbGlkQWRkcmVzcyA9IG51bGw7CgoJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSsrKSB7CgkJCQkJCXZhciBhZGRyZXNzID0gd2ViTUkuZXNjYXBlSFRNTChhZGRyZXNzZXNbaV0pOwoJCQkJCQlpZiAoYWRkcmVzcy5pbmRleE9mKHNlbGYub3B0aW9ucy5hZ2dyZWdhdGVBZGRyZXNzUHJlZml4KSA9PT0gLTEpIHsKCQkJCQkJCWxhc3RWYWxpZEFkZHJlc3MgPSBhZGRyZXNzOwoJCQkJCQkJb3JkZXJlZEFkcmVzc2VzLnB1c2goeyBhZGRyZXNzOiBhZGRyZXNzIH0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJb3JkZXJlZEFkcmVzc2VzLnB1c2goeyBhZGRyZXNzOiBsYXN0VmFsaWRBZGRyZXNzLCBhZ2dyZWdhdGVSZWZlcmVuY2U6IGFkZHJlc3MgfSk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXNlbGYuY2FjaGVkQXZhaWxhYmxlTm9kZXM7CgoJCQkJCWRhdGFDYWxsYmFjayhvcmRlcmVkQWRyZXNzZXMpOwoKCQkJCQlzZWxmLmJyb3dzZU5vZGVzQmFja2xvZy5mb3JFYWNoKChjYWxsYmFjaykgPT4gewoJCQkJCQljYWxsYmFjayhvcmRlcmVkQWRyZXNzZXMpOwoJCQkJCX0pOwoJCQkJfSwgcmVzcG9uc2UpOwoJCQl9CgkJKTsKCX07CgoJLyoqCgkgKiBQcm92aWRlcyB0aGUgdHJlZSB2aWV3IHdpdGggdGhlIGRhdGEgdHlwZXMgdGhhdCBhY3R1YWxseSBhcmUgc2VsZWN0YWJsZSBpbnN0ZWFkIG9mIGp1c3QgYnJvd3NhYmxlLgoJICogQHJldHVybnMge2FycmF5fSBTZWxlY3RhYmxlIHR5cGVzCgkgKi8KCVRyZWVWaWV3RGF0YXNvdXJjZS5wcm90b3R5cGUuZ2V0U2VsZWN0YWJsZVR5cGVzID0gZnVuY3Rpb24gKCkgewoJCXJldHVybiBbdHlwZXMuYmFzZVZhcmlhYmxlLCB0eXBlcy5hZ2dyZWdhdGVGdW5jdGlvbl07Cgl9OwoKCS8qKgoJICogQSBtZXRob2QgdGhhdCBpcyB1c2VkIGJ5IHtAbGluayBUcmVlVmlld0RhdGFzb3VyY2UjZmV0Y2hBdmFpbGFibGVOb2RlQWRyZXNzZXN9IGFzIGEgY2FsbGJhY2suCgkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBkYXRhQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aXRoIHRoZSBwcm9jZXNzZWQgZGF0YS4KCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlU3RydWN0dXJlIFRoZSBub2RlIHN0cnVjdHVyZSBkZWxpdmVyZWQgZnJvbSB0aGUgc2VydmVyLgoJICogQHJldHVybiB7QXJyYXl9IGFkZHJlc3NlcwoJICovCglUcmVlVmlld0RhdGFzb3VyY2UucHJvdG90eXBlLmJ1aWxkQWRkcmVzc2VzQXJyYXkgPSBmdW5jdGlvbiAoZGF0YUNhbGxiYWNrLCBub2RlU3RydWN0dXJlKSB7CgkJdmFyIGFkZHJlc3NlcyA9IFtdOwoKCQlmb3IgKGVsZW1lbnQgaW4gbm9kZVN0cnVjdHVyZSkgewoJCQl2YXIgbm9kZUVudHJ5ID0gbm9kZVN0cnVjdHVyZVtlbGVtZW50XTsKCgkJCWlmIChjaGVja0lnbm9yZWRQcm9wZXJ0aWVzKG5vZGVFbnRyeSkgJiYgb3BjVUFUeXBlcy5hZ2dyZWdhdGVUZW1wbGF0ZS5pbmRleE9mKG5vZGVFbnRyeVsidHlwZSJdKSA9PT0gLTEpIHsKCQkJCWFkZHJlc3Nlcy5wdXNoKG5vZGVFbnRyeVsiYWRkcmVzcyJdKTsKCQkJfQoKCQkJaWYgKG5vZGVFbnRyeVsiY2hpbGRzIl0gIT09IG51bGwpIHsKCQkJCWFkZHJlc3NlcyA9IGFkZHJlc3Nlcy5jb25jYXQodGhpcy5idWlsZEFkZHJlc3Nlc0FycmF5KG51bGwsIG5vZGVFbnRyeVsiY2hpbGRzIl0pKTsKCQkJfQoJCX0KCQlpZiAodHlwZW9mIGRhdGFDYWxsYmFjayA9PT0gImZ1bmN0aW9uIikgewoJCQlkYXRhQ2FsbGJhY2soYWRkcmVzc2VzKTsKCQl9CgoJCXJldHVybiBhZGRyZXNzZXM7Cgl9OwoKCS8qKgoJICogQSBtZXRob2QgdGhhdCByZXF1ZXN0cyB0aGUgbm9kZSBzdHJ1Y3R1cmUgZnJvbSB0aGUgc2VydmVyCgkgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlQWRkcmVzcyBUaGUgbm9kZSBhZGRyZXNzIHRvIGdldCB0aGUgZGF0YSBmb3IKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZU5vZGUgVGhlIG5vZGUgdGhlIGRhdGEgaXMgcmVxdWVzdGVkIGZvcgoJICovCglUcmVlVmlld0RhdGFzb3VyY2UucHJvdG90eXBlLmZldGNoVHJlZVN0cnVjdHVyZSA9IGZ1bmN0aW9uIChyZWZlcmVuY2VBZGRyZXNzLCByZWZlcmVuY2VOb2RlKSB7CgkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKCQkJaWYgKHdlYk1JLmdldE1ldGhvZFN1cHBvcnQoKS5pbmRleE9mKCJCcm93c2VOb2RlcyIpID09IC0xKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXZhciBzdGFydEFkZHJlc3MgPSB0aGlzLm9wdGlvbnMuc3RhcnRBZGRyZXNzOwoKCQkJaWYgKHJlZmVyZW5jZUFkZHJlc3MpIHsKCQkJCXN0YXJ0QWRkcmVzcyA9IHJlZmVyZW5jZUFkZHJlc3M7CgkJCX0gZWxzZSB7CgkJCQl2YXIgZGF0YSA9IGdldERhdGFGcm9tTm9kZShyZWZlcmVuY2VOb2RlKTsKCQkJCWlmIChkYXRhKSB7CgkJCQkJc3RhcnRBZGRyZXNzID0gZGF0YS5hZGRyZXNzOwoJCQkJfQoJCQl9CgoJCQl0cnkgewoJCQkJdmFyIGFnZ3JlZ2F0ZUZ1bmN0aW9uID0gc3RhcnRBZGRyZXNzLmluZGV4T2YoIkFHRU5ULkhJU1RPUlkuQUdHUkVHQVRFVEVNUExBVEVTLiIpID4gLTE7CgkJCX0gY2F0Y2ggKGVycikgewoJCQkJY29uc29sZS5sb2coZXJyKTsKCQkJfQoKCQkJaWYgKHRoaXMuY2FjaGVkQXZhaWxhYmxlTm9kZXMgJiYgdGhpcy5vcHRpb25zLm5vZGVDYWNoZUFjdGl2ZSkgewoJCQkJbGV0IHJlc3BvbnNlID0gZmluZENoaWxkcmVuKHN0YXJ0QWRkcmVzcywgdGhpcy5jYWNoZWRBdmFpbGFibGVOb2Rlcyk7CgkJCQljb25zdCBkYXRhID0gdGhpcy5wYXJzZU5vZGVTdHJ1Y3R1cmUuYmluZCh0aGlzLCByZWZlcmVuY2VOb2RlKShyZXNwb25zZSk7CgkJCQlyZXNvbHZlKGRhdGEsIHJlZmVyZW5jZU5vZGUpOwoJCQl9IGVsc2UgewoJCQkJd2ViTUkuZGF0YS5jYWxsKAoJCQkJCSJCcm93c2VOb2Rlc1dpdGhBbGFybSIsCgkJCQkJewoJCQkJCQlzdGFydEFkZHJlc3M6IHN0YXJ0QWRkcmVzcywKCQkJCQkJZW5kTGV2ZWw6IGFnZ3JlZ2F0ZUZ1bmN0aW9uID8gMiA6IHRoaXMub3B0aW9ucy5uYXZpZ2F0aW9uRGVwdGgsCgkJCQkJCXZUeXBlczogWwoJCQkJCQkJb3BjVUFUeXBlcy5iYXNlVmFyaWFibGVEYXRhVHlwZSwKCQkJCQkJCW9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlLAoJCQkJCQkJb3BjVUFUeXBlcy5mb2xkZXIsCgkJCQkJCQlvcGNVQVR5cGVzLnByb2plY3QsCgkJCQkJCQlvcGNVQVR5cGVzLnByb2plY3RWYXJpYWJsZXMsCgkJCQkJCQlvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uVHlwZSwKCQkJCQkJCW9wY1VBVHlwZXMuYWdncmVnYXRlVGVtcGxhdGUsCgkJCQkJCQlvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uCgkJCQkJCV0sCgkJCQkJCW1hcHBpbmc6IFsKCQkJCQkJCXsgYWxpYXM6ICJhZGRyZXNzIiwga2V5czogWyJub2RlSWQiLCAieG1sIl0sIHJlbW92ZU5zVGFnOiB0cnVlIH0sCgkJCQkJCQl7IGFsaWFzOiAibmFtZSIsIGtleXM6IFsiYnJvd3NlTmFtZSIsICJuYW1lIl0gfSwKCQkJCQkJCXsgYWxpYXM6ICJ0eXBlIiwga2V5czogWyJ0eXBlRGVmaW5pdGlvbiIsICJ4bWwiXSwgcmVtb3ZlTnNUYWc6IHRydWUgfQoJCQkJCQldLAoJCQkJCQlpbmNsdWRlU3RhcnRBZGRyZXNzOiBmYWxzZQoJCQkJCX0sCgkJCQkJKHJlc3BvbnNlKSA9PiB7CgkJCQkJCWlmIChyZXNwb25zZS5lcnJvciAmJiB0eXBlb2YgcmVzcG9uc2UuZXJyb3IgPT09ICJudW1iZXIiKSB7CgkJCQkJCQlyZWplY3QocmVzcG9uc2UpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJY29uc3QgZGF0YSA9IHRoaXMucGFyc2VOb2RlU3RydWN0dXJlLmJpbmQodGhpcywgcmVmZXJlbmNlTm9kZSkocmVzcG9uc2UpOwoJCQkJCQkJcmVzb2x2ZShkYXRhLCByZWZlcmVuY2VOb2RlKTsKCQkJCQkJfQoJCQkJCX0KCQkJCSk7CgkJCX0KCQl9KTsKCX07CgoJLyoqCgkgKiBBIG1ldGhvZCB0aGF0IHBhcnNlcyB0aGUgZmV0Y2hlZCBub2RlIHN0cnVjdHVyZSBhbmQgcmVxdWVzdHMgYWRkaXRpb25hbCBub2RlIGluZm9ybWF0aW9uCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2VOb2RlIFRoZSBub2RlIHRoZSBkYXRhIGlzIHJlcXVlc3RlZCBmb3IKCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlU3RydWN0dXJlIFRoZSBub2RlIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIKCSAqLwoJVHJlZVZpZXdEYXRhc291cmNlLnByb3RvdHlwZS5wYXJzZU5vZGVTdHJ1Y3R1cmUgPSBmdW5jdGlvbiAocmVmZXJlbmNlTm9kZSwgbm9kZVN0cnVjdHVyZSkgewoJCWlmIChub2RlU3RydWN0dXJlLmVycm9yICYmIHR5cGVvZiBub2RlU3RydWN0dXJlLmVycm9yID09PSAibnVtYmVyIikgcmV0dXJuOwoKCQkvLyBDaGVjayBpZiB0d28gREIgc3BhY2VzIGV4aXN0CgkJdmFyIGRic3BhY2VzID0ge307CgkJZm9yICh2YXIgcHJvcGVydHkgaW4gbm9kZVN0cnVjdHVyZSkgewoJCQlpZiAoIWlzTmFOKHByb3BlcnR5LnN1YnN0cigwLCBwcm9wZXJ0eS5pbmRleE9mKCIuIikpKSkgZGJzcGFjZXNbcHJvcGVydHkuc3Vic3RyKDAsIHByb3BlcnR5LmluZGV4T2YoIi4iKSldID0gdHJ1ZTsKCQl9CgoJCWlmIChPYmplY3Qua2V5cyhkYnNwYWNlcykubGVuZ3RoID4gMSkgewoJCQlmb3IgKHZhciBwcm9wZXJ0eSBpbiBub2RlU3RydWN0dXJlKSB7CgkJCQlub2RlU3RydWN0dXJlW3Byb3BlcnR5XS5uYW1lID0gbm9kZVN0cnVjdHVyZVtwcm9wZXJ0eV0uYWRkcmVzczsKCQkJfQoJCX0KCgkJdmFyIGRhdGEgPSBbXTsKCQlmb3IgKHZhciBlbGVtZW50IGluIG5vZGVTdHJ1Y3R1cmUpIHsKCQkJdmFyIG5vZGVFbnRyeSA9IG5vZGVTdHJ1Y3R1cmVbZWxlbWVudF07CgkJCXZhciBkYXRhSUQgPSBnZW5lcmF0ZURhdGFJRCgpOwoJCQl2YXIgaGFzQ2hpbGRyZW4gPSBub2RlRW50cnkuY2hpbGRzICE9IG51bGw7CgoJCQl2YXIgcHJvamVjdFZhcmlhYmxlTmFtZSA9IGZhbHNlOwoKCQkJLy8gV29ya2Fyb3VuZCBmw4PCvHIgYWx0ZSBQb3J0YWx2ZXJzaW9uZW4sIHdvIEJyb3dzZU5vZGVzIG5vY2gga2VpbiAidHlwZSIgbGllZmVydAoJCQlpZiAodHlwZW9mIG5vZGVFbnRyeS50eXBlID09ICJ1bmRlZmluZWQiKSB7CgkJCQlpZiAoaGFzQ2hpbGRyZW4pIG5vZGVFbnRyeS50eXBlID0gImk9NjEiOwoJCQkJZWxzZSBub2RlRW50cnkudHlwZSA9ICJpPTYyIjsKCQkJfQoKCQkJaWYgKG5vZGVFbnRyeS50eXBlLmluZGV4T2YoIlZhcmlhYmxlVHlwZXMuUFJPSkVDVCIpID09PSAwKSB7CgkJCQlwcm9qZWN0VmFyaWFibGVOYW1lID0gbm9kZUVudHJ5LnR5cGU7CgkJCX0KCgkJCXN3aXRjaCAobm9kZUVudHJ5LnR5cGUpIHsKCQkJCWNhc2Ugb3BjVUFUeXBlcy5iYXNlVmFyaWFibGVEYXRhVHlwZToKCQkJCQlkYXRhLnB1c2goewoJCQkJCQluYW1lOiBub2RlRW50cnkubmFtZSwKCQkJCQkJYWRkcmVzczogbm9kZUVudHJ5LmFkZHJlc3MsCgkJCQkJCXR5cGU6IHR5cGVzLmJhc2VWYXJpYWJsZSwKCQkJCQkJaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLAoJCQkJCQljaGlsZHJlbjogW10sCgkJCQkJCWRhdGFJRDogZGF0YUlECgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlOgoJCQkJCWlmIChjaGVja0lnbm9yZWRQcm9wZXJ0aWVzKG5vZGVFbnRyeSkpIHsKCQkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJCW5hbWU6IG5vZGVFbnRyeS5uYW1lLAoJCQkJCQkJYWRkcmVzczogbm9kZUVudHJ5LmFkZHJlc3MsCgkJCQkJCQl0eXBlOiB0eXBlcy5iYXNlVmFyaWFibGUsCgkJCQkJCQloYXNDaGlsZHJlbjogaGFzQ2hpbGRyZW4sCgkJCQkJCQljaGlsZHJlbjogW10sCgkJCQkJCQlkYXRhSUQ6IGRhdGFJRAoJCQkJCQl9KTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHByb2plY3RWYXJpYWJsZU5hbWU6CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5wcm9qZWN0VmFyaWFibGVzLAoJCQkJCQloYXNDaGlsZHJlbjogaGFzQ2hpbGRyZW4sCgkJCQkJCWNoaWxkcmVuOiBbXSwKCQkJCQkJZGF0YUlEOiBkYXRhSUQKCQkJCQl9KTsKCQkJCQlicmVhazsKCQkJCWNhc2Ugb3BjVUFUeXBlcy5mb2xkZXI6CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5mb2xkZXIsCgkJCQkJCWhhc0NoaWxkcmVuOiBoYXNDaGlsZHJlbiwKCQkJCQkJY2hpbGRyZW46IFtdCgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYWdncmVnYXRlVGVtcGxhdGUuc2xpY2UoNyk6CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5mb2xkZXIsCgkJCQkJCWhhc0NoaWxkcmVuOiBoYXNDaGlsZHJlbiwKCQkJCQkJY2hpbGRyZW46IFtdCgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYWdncmVnYXRlRnVuY3Rpb246CgkJCQkJZmV0Y2hBZ2dyZWdhdGVPcHRpb25zKG5vZGVFbnRyeSwgZGF0YUlELCByZWZlcmVuY2VOb2RlKTsKCQkJCQloYXNDaGlsZHJlbiA9IGNoZWNrQ2hpbGRyZW4obm9kZUVudHJ5LmNoaWxkcyk7CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5hZ2dyZWdhdGVGdW5jdGlvbiwKCQkJCQkJaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLAoJCQkJCQljaGlsZHJlbjogaGFzQ2hpbGRyZW4gPyBub2RlRW50cnkuY2hpbGRzIDogW10sCgkJCQkJCWRhdGFJRDogZGF0YUlECgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYWdncmVnYXRlRnVuY3Rpb25UeXBlOgoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlkYXRhLnB1c2goewoJCQkJCQluYW1lOiBub2RlRW50cnkubmFtZSwKCQkJCQkJYWRkcmVzczogbm9kZUVudHJ5LmFkZHJlc3MsCgkJCQkJCXR5cGU6IHR5cGVzLmZvbGRlciwKCQkJCQkJaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLAoJCQkJCQljaGlsZHJlbjogW10KCQkJCQl9KTsKCQkJCQlicmVhazsKCQkJfQoJCX0KCgkJLy8gQXNzaWduIGljb25zCgkJZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7CgkJCXZhciBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CgkJCWljb24uc3JjID0gdGhpcy5vcHRpb25zLmxhbmd1YWdlUHJlZml4ICsgdGhpcy5vcHRpb25zLnR5cGVJbWFnZVBhdGhzW2l0ZW0udHlwZV07CgkJCWl0ZW0uaWNvbiA9IGljb247CgkJfSk7CgoJCXJldHVybiBkYXRhOwoJfTsKCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IGNoZWNrcyBpZiB0aGVyZSBhcmUgY2hpbGRyZW4gdGhhdCBhcmUgd29ydGggdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0cmVlLgoJICogQHBhcmFtIHtvYmplY3R9IGNoaWxkcmVuIFRoZSBlbGVtZW50IG9mIHRoZSBub2RlIHN0cnVjdHVyZSB0byBjaGVjayB0aGUgY2hpbGRyZW4gZm9yCgkgKi8KCWZ1bmN0aW9uIGNoZWNrQ2hpbGRyZW4oY2hpbGRyZW4pIHsKCQl2YXIgaWdub3JlZE5vZGVzID0gWwoJCQl7bmFtZTogYWdncmVnYXRlT3B0aW9ucy5vZmZzZXRVbml0LCB0eXBlOiBvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZX0sCgkJCXtuYW1lOiBhZ2dyZWdhdGVPcHRpb25zLm9mZnNldFZhbHVlLCB0eXBlOiBvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZX0sCgkJCXtuYW1lOiBhZ2dyZWdhdGVPcHRpb25zLmludGVydmFsVW5pdCwgdHlwZTogb3BjVUFUeXBlcy5iYXNlVmFyaWFibGV9LAoJCQl7bmFtZTogYWdncmVnYXRlT3B0aW9ucy5pbnRlcnZhbFZhbHVlLCB0eXBlOiBvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZX0sCgkJCXtuYW1lOiBhZ2dyZWdhdGVPcHRpb25zLnN0ZXBwZWQsIHR5cGU6IG9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlfSwKCQkJe25hbWU6ICIqIiwgdHlwZTogb3BjVUFUeXBlcy5hZ2dyZWdhdGVGdW5jdGlvblR5cGV9CgkJXTsKCQl2YXIgdmFsaWRDaGlsZHJlbiA9IGZhbHNlOwoKCQlpZiAoY2hpbGRyZW4gIT09ICJvbmRlbWFuZCIpIHsKCQkJZm9yIChlbGVtZW50IGluIGNoaWxkcmVuKSB7CgkJCQl2YXIgbm9kZUVudHJ5ID0gY2hpbGRyZW5bZWxlbWVudF07CgkJCQl2YXIgaWdub3JlTm9kZSA9IGZhbHNlOwoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBpZ25vcmVkTm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJCQlpZiAoCgkJCQkJCShub2RlRW50cnkubmFtZSA9PSBpZ25vcmVkTm9kZXNbaV0ubmFtZSB8fCBpZ25vcmVkTm9kZXNbaV0ubmFtZSA9PSAiKiIpICYmCgkJCQkJCW5vZGVFbnRyeS50eXBlID09IGlnbm9yZWROb2Rlc1tpXS50eXBlCgkJCQkJKSB7CgkJCQkJCWlnbm9yZU5vZGUgPSB0cnVlOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoIWlnbm9yZU5vZGUpIHsKCQkJCQl2YWxpZENoaWxkcmVuID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHZhbGlkQ2hpbGRyZW47Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBtZXRob2QgdGhhdCBjaGVja3MgdGhlIGJhc2UgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIGRpc3BsYXlpbmcKCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRW50cnkgVGhlIGVsZW1lbnQgb2YgdGhlIG5vZGUgc3RydWN0dXJlIHRvIGJlIGV2ZW50dWFsbHkgaWdub3JlZAoJICovCglmdW5jdGlvbiBjaGVja0lnbm9yZWRQcm9wZXJ0aWVzKG5vZGVFbnRyeSkgewoJCXZhciBpc05vZGVPcHRpb24gPSBmYWxzZTsKCQlmb3IgKG9wdGlvbiBpbiBhZ2dyZWdhdGVPcHRpb25zKSB7CgkJCWlmIChhZ2dyZWdhdGVPcHRpb25zW29wdGlvbl0gPT0gbm9kZUVudHJ5Lm5hbWUpIHsKCQkJCWlzTm9kZU9wdGlvbiA9IHRydWU7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlyZXR1cm4gIWlzTm9kZU9wdGlvbjsKCX0KCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IGdldHMgdGhlIG9wdGlvbnMgZm9yIG5vZGVzIHRoYXQgcmVwcmVzZW50IGFnZ3JlZ2F0ZSBmdW5jdGlvbnMKCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRW50cnkgVGhlIGVsZW1lbnQgb2YgdGhlIG5vZGUgc3RydWN0dXJlIHRoYXQgaXMgYW4gYWdncmVnYXRlIGZ1bmN0aW9uCgkgKi8KCWZ1bmN0aW9uIGZldGNoQWdncmVnYXRlT3B0aW9ucyhub2RlRW50cnksIGRhdGFJRCwgcmVmZXJlbmNlTm9kZSkgewoJCXZhciByZWxhdGVkTm9kZUFkZHJlc3MgPSBnZXRSZWxhdGVkTm9kZUFkZHJlc3MocmVmZXJlbmNlTm9kZSk7CgkJdmFyIGFnZ3JlZ2F0ZUFkZHJlc3MgPSBub2RlRW50cnkuYWRkcmVzczsKCgkJdmFyIGFnZ3JlZ2F0ZVR5cGU7CgkJd2ViTUkuZGF0YS5jYWxsKAoJCQkiQnJvd3NlTm9kZXNXaXRoQWxhcm0iLAoJCQl7CgkJCQlzdGFydEFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJZW5kTGV2ZWw6IDEsCgkJCQl2VHlwZXM6IFtvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uVHlwZV0sCgkJCQltYXBwaW5nOiBbCgkJCQkJe2FsaWFzOiAiYWRkcmVzcyIsIGtleXM6IFsibm9kZUlkIiwgInhtbCJdLCByZW1vdmVOc1RhZzogdHJ1ZX0sCgkJCQkJe2FsaWFzOiAibmFtZSIsIGtleXM6IFsiYnJvd3NlTmFtZSIsICJuYW1lIl19LAoJCQkJCXthbGlhczogInR5cGUiLCBrZXlzOiBbInR5cGVEZWZpbml0aW9uIiwgInhtbCJdLCByZW1vdmVOc1RhZzogdHJ1ZX0KCQkJCV0sCgkJCQlpbmNsdWRlU3RhcnRBZGRyZXNzOiBmYWxzZQoJCQl9LAoJCQlmdW5jdGlvbiAoZSkgewoJCQkJYWdncmVnYXRlVHlwZSA9IGVbT2JqZWN0LmtleXMoZSlbMF1dLm5hbWU7CgkJCQl3ZWJNSS5kYXRhLnJlYWQoCgkJCQkJWwoJCQkJCQlhZ2dyZWdhdGVBZGRyZXNzICsgIi4iICsgYWdncmVnYXRlT3B0aW9ucy5pbnRlcnZhbFZhbHVlLAoJCQkJCQlhZ2dyZWdhdGVBZGRyZXNzICsgIi4iICsgYWdncmVnYXRlT3B0aW9ucy5pbnRlcnZhbFVuaXQsCgkJCQkJCWFnZ3JlZ2F0ZUFkZHJlc3MgKyAiLiIgKyBhZ2dyZWdhdGVPcHRpb25zLm9mZnNldFZhbHVlLAoJCQkJCQlhZ2dyZWdhdGVBZGRyZXNzICsgIi4iICsgYWdncmVnYXRlT3B0aW9ucy5vZmZzZXRVbml0CgkJCQkJXSwKCQkJCQlmdW5jdGlvbiAoZGF0YSkgewoJCQkJCQl2YXIgYWdncmVnYXRlRGF0YSA9IHthZ2dyZWdhdGVJbmZvOiB7fX07CgkJCQkJCWFnZ3JlZ2F0ZURhdGEuYWdncmVnYXRlSW5mb1thZ2dyZWdhdGVPcHRpb25zLmludGVydmFsVmFsdWVdID0gZGF0YVswXS52YWx1ZTsKCQkJCQkJYWdncmVnYXRlRGF0YS5hZ2dyZWdhdGVJbmZvW2FnZ3JlZ2F0ZU9wdGlvbnMuaW50ZXJ2YWxVbml0XSA9IGRhdGFbMV0udmFsdWU7CgkJCQkJCWFnZ3JlZ2F0ZURhdGEuYWdncmVnYXRlSW5mb1thZ2dyZWdhdGVPcHRpb25zLm9mZnNldFZhbHVlXSA9IGRhdGFbMl0udmFsdWU7CgkJCQkJCWFnZ3JlZ2F0ZURhdGEuYWdncmVnYXRlSW5mb1thZ2dyZWdhdGVPcHRpb25zLm9mZnNldFVuaXRdID0gZGF0YVszXS52YWx1ZTsKCQkJCQkJYWdncmVnYXRlRGF0YS5hZ2dyZWdhdGVJbmZvW2FnZ3JlZ2F0ZU9wdGlvbnMuYWdncmVnYXRlVHlwZV0gPSBhZ2dyZWdhdGVUeXBlOwoJCQkJCQlhZ2dyZWdhdGVEYXRhLmFnZ3JlZ2F0ZUluZm9bYWdncmVnYXRlT3B0aW9ucy5yZWxhdGVkTm9kZUFkZHJlc3NdID0gcmVsYXRlZE5vZGVBZGRyZXNzOwoJCQkJCQlhZGREYXRhVG9JdGVtKHJlZmVyZW5jZU5vZGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCJkaXZbZGF0YS1pZD0nIiArIGRhdGFJRCArICInXSIpLCBhZ2dyZWdhdGVEYXRhKTsKCQkJCQl9CgkJCQkpOwoJCQl9CgkJKTsKCX0KCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IGdlbmVyYXRlcyBhIHVuaXF1ZSBkYXRhLWlkCgkgKiBAcmV0dXJuIHtzdHJpbmd9IGlkIEEgdW5pcXVlIGRhdGEgaWQKCSAqLwoJZnVuY3Rpb24gZ2VuZXJhdGVEYXRhSUQoKSB7CgkJdmFyIFM0ID0gZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkgfCAwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpOwoJCX07CgkJcmV0dXJuIFM0KCkgKyBTNCgpICsgIi0iICsgUzQoKSArICItIiArIFM0KCkgKyAiLSIgKyBTNCgpICsgIi0iICsgUzQoKSArIFM0KCkgKyBTNCgpOwoJfQoKCWlmICghd2luZG93LnRyZWVWaWV3RGF0YXNvdXJjZXMpIHsKCQl3aW5kb3cudHJlZVZpZXdEYXRhc291cmNlcyA9IHt9OwoJfQoJd2luZG93LnRyZWVWaWV3RGF0YXNvdXJjZXNbZGF0YVNvdXJjZU5hbWVdID0gVHJlZVZpZXdEYXRhc291cmNlOwp9KSh3aW5kb3csIGRvY3VtZW50KTsK</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources" ExportedBrowseName="1:datasources" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView" BrowseName="1:treeView">
		<DisplayName Locale="en">treeView</DisplayName>
		<Description Locale="en">treeView</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources" BrowseName="1:datasources">
		<DisplayName Locale="en">datasources</DisplayName>
		<Description Locale="en">datasources</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources/opcuaAlarms.js" BrowseName="1:opcuaAlarms.js" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">opcuaAlarms.js</DisplayName>
		<Description Locale="en">opcuaAlarms.js</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/treeView/datasources</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Resource.Javascript</Reference>
			<Reference ReferenceType="HasProperty">ns=1;s=VariableTypes.ATVISE.Resource.Javascript.Compress</Reference>
		</References>
		<Value>
			<uax:ByteString>KCgpID0+IHsKCS8vIEhlcmUgdGhlIHNhbWUgbmFtZSBzaG91bGQgYmUgdXNlZCBhcyBmb3IgdGhlIHJlc3BlY3RpdmUgaGlnaGNoYXJ0cyBkYXRhc291cmNlCgljb25zdCBkYXRhU291cmNlTmFtZSA9ICJvcGNVQV9BbGFybXMiOwoKCXZhciB0eXBlcyA9IHsKCQliYXNlVmFyaWFibGU6ICJiYXNlVmFyaWFibGUiLAoJCWZvbGRlcjogImZvbGRlciIsCgkJcHJvamVjdFZhcmlhYmxlczogImJhc2VWYXJpYWJsZSIsCgkJYWdncmVnYXRlVGVtcGxhdGU6ICJhZ2dyZWdhdGVUZW1wbGF0ZSIsCgkJYWdncmVnYXRlRnVuY3Rpb246ICJhZ2dyZWdhdGVGdW5jdGlvbiIsCgkJYWdncmVnYXRlRnVuY3Rpb25UeXBlOiAiYWdncmVnYXRlRnVuY3Rpb25UeXBlIgoJfTsKCgl2YXIgYWdncmVnYXRlT3B0aW9ucyA9IHsKCQlpbnRlcnZhbFVuaXQ6ICJpbnRlcnZhbF91bml0IiwKCQlpbnRlcnZhbFZhbHVlOiAiaW50ZXJ2YWxfdmFsdWUiLAoJCW9mZnNldFVuaXQ6ICJvZmZzZXRfdW5pdCIsCgkJb2Zmc2V0VmFsdWU6ICJvZmZzZXRfdmFsdWUiLAoJCXN0ZXBwZWQ6ICJzdGVwcGVkIiwKCQlhZ2dyZWdhdGVUeXBlOiAiYWdncmVnYXRlIiwKCQlyZWxhdGVkTm9kZUFkZHJlc3M6ICJyZWxhdGVkTm9kZUFkZHJlc3MiCgl9OwoKCXZhciBvcGNVQVR5cGVzID0gewoJCWJhc2VWYXJpYWJsZURhdGFUeXBlOiAiaT02MyIsCgkJYmFzZVZhcmlhYmxlOiAiaT02MiIsCgkJZm9sZGVyOiAiaT02MSIsCgkJcHJvamVjdDogIk9iamVjdFR5cGVzLlBST0pFQ1QiLAoJCXByb2plY3RWYXJpYWJsZXM6ICJWYXJpYWJsZVR5cGVzLlBST0pFQ1QiLAoJCWFnZ3JlZ2F0ZVRlbXBsYXRlOiAiT2JqZWN0VHlwZXMuQVRWSVNFLkFnZ3JlZ2F0ZVRlbXBsYXRlIiwKCQlhZ2dyZWdhdGVGdW5jdGlvbjogIk9iamVjdFR5cGVzLkFUVklTRS5BZ2dyZWdhdGVGdW5jdGlvbiIsCgkJYWdncmVnYXRlRnVuY3Rpb25UeXBlOiAiaT0yMzQwIgoJfTsKCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCBmb3IgcGFyc2luZyB0aGUgZGF0YS1pdGVtIG9mIGEgbm9kZQoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBUaGUgY29ycmVzcG9uZGluZyBET00tbm9kZQoJICogQHJldHVybiB7c3RyaW5nfSBvYmplY3QgVGhlIHBhcnNlZCBkYXRhLWl0ZW0KCSAqLwoJZnVuY3Rpb24gZ2V0RGF0YUZyb21Ob2RlKG5vZGUpIHsKCQlpZiAobm9kZSkgewoJCQlyZXR1cm4gSlNPTi5wYXJzZShub2RlLmdldEF0dHJpYnV0ZSgiZGF0YS1pdGVtIikpOwoJCX0gZWxzZSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoJfQoKCS8qKgoJICogQSBoZWxwZXIgbWV0aG9kIGZvciBhZGRpbmcgYWRkaXRpb25hbCBkYXRhIHRvIHRoZSBkYXRhLWl0ZW0gb2YgYSBub2RlCgkgKiBAcGFyYW0ge29iamVjdH0gaXRlbSBUaGUgaXRlbSAob2JqZWN0KSB0byBiZSBhZGRlZAoJICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYWRkRGF0YSBUaGUgY29ycmVzcG9uZGluZyBET00tbm9kZQoJICovCglmdW5jdGlvbiBhZGREYXRhVG9JdGVtKGl0ZW0sIGFkZERhdGEpIHsKCQl2YXIgZGF0YSA9IEpTT04ucGFyc2UoaXRlbS5nZXRBdHRyaWJ1dGUoImRhdGEtaXRlbSIpKTsKCQlpdGVtLnNldEF0dHJpYnV0ZSgiZGF0YS1pdGVtIiwgSlNPTi5zdHJpbmdpZnkobWVyZ2VEYXRhKGRhdGEsIGFkZERhdGEpKSk7Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBtZXRob2QgdG8gbWVyZ2UgdG8gb2JqZWN0cyByZWN1cnNpdmVseQoJICogQHBhcmFtIHtvYmplY3R9IGRhdGEgVGhlIGJhc2Utb2JqZWN0CgkgKiBAcGFyYW0ge29iamVjdH0gYWRkRGF0YSBUaGUgZGF0YSB0byBhZGQgcmVjdXJzaXZlbHkgdG8gdGhlIGJhc2Ugb2JqZWN0CgkgKi8KCWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLCBhZGREYXRhKSB7CgkJZm9yICh2YXIgcCBpbiBhZGREYXRhKSB7CgkJCXRyeSB7CgkJCQkvLyBQcm9wZXJ0eSBpbiBkZXN0aW5hdGlvbiBvYmplY3Qgc2V0OyB1cGRhdGUgaXRzIHZhbHVlLgoJCQkJaWYgKGFkZERhdGFbcF0uY29uc3RydWN0b3IgPT09IE9iamVjdCkgewoJCQkJCWRhdGFbcF0gPSBtZXJnZURhdGEoZGF0YVtwXSwgYWRkRGF0YVtwXSk7CgkJCQl9IGVsc2UgewoJCQkJCWRhdGFbcF0gPSBhZGREYXRhW3BdOwoJCQkJfQoJCQl9IGNhdGNoIChlKSB7CgkJCQkvLyBQcm9wZXJ0eSBpbiBkZXN0aW5hdGlvbiBvYmplY3Qgbm90IHNldDsgY3JlYXRlIGl0IGFuZCBzZXQgaXRzIHZhbHVlLgoJCQkJZGF0YVtwXSA9IGFkZERhdGFbcF07CgkJCX0KCQl9CgkJcmV0dXJuIGRhdGE7Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBnZXRzIHRoZSByZWxhdGVkIG5vZGUgYWRkcmVzcyBvZiBhIGh0bWwgZWxlbWVudC4KCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZU5vZGUgQSBodG1sIG5vZGUgdGhhdCBoYXMgYSBkYXRhLWl0ZW0gYXR0cmlidXRlLgoJICogQHJldHVybiB7c3RyaW5nfSByZWxhdGVkQWRkcmVzcwoJICovCglmdW5jdGlvbiBnZXRSZWxhdGVkTm9kZUFkZHJlc3MocmVmZXJlbmNlTm9kZSkgewoJCXZhciBjdXJyZW50Tm9kZSA9IHJlZmVyZW5jZU5vZGU7CgkJdmFyIHJlbGF0ZWRBZGRyZXNzID0gZ2V0RGF0YUZyb21Ob2RlKGN1cnJlbnROb2RlKS5hZGRyZXNzOwoKCQl3aGlsZSAocmVsYXRlZEFkZHJlc3MuaW5kZXhPZigiSElTVE9SWSIpICE9PSAtMSkgewoJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7CgkJCXZhciBub2RlRGF0YSA9IHt9OwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGN1cnJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJCW5vZGVEYXRhID0gZ2V0RGF0YUZyb21Ob2RlKGN1cnJlbnROb2RlLmNoaWxkTm9kZXNbaV0pOwoJCQkJaWYgKG5vZGVEYXRhKSB7CgkJCQkJcmVsYXRlZEFkZHJlc3MgPSBub2RlRGF0YS5hZGRyZXNzOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmVsYXRlZEFkZHJlc3M7Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBzZWFyY2hlcyB0aGUgcmVzcG9uc2UgY2FjaGUgZm9yIHRoZSBzZWFyY2h0ZXJtLgoJICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3Mgbm9kZUlkIG9mIHRoZSBub2RlIHRvIHNlYXJjaCBmb3IuCgkgKiBAcGFyYW0ge29iamVjdH0gbm9kZVRyZWUgQSBjYWNoZWQgcmVzcG9uc2Ugb2YgYWxsIG5vZGVzIGluIHRoZSBwcm9qZWN0LgoJICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29uYXRpbmluZyB0aGUgbm9kZXMgcmVxdWlyZWQgaW5mbwoJICovCglmdW5jdGlvbiBmaW5kQ2hpbGRyZW4oYWRkcmVzcywgbm9kZVRyZWUpIHsKCQlsZXQgcmVzdWx0OwoJCWlmIChub2RlVHJlZS5hZGRyZXNzID09PSBhZGRyZXNzKSB7CgkJCXJldHVybiBub2RlVHJlZTsKCQl9CgkJZm9yIChsZXQgbm9kZU5hbWUgaW4gbm9kZVRyZWUpIHsKCQkJaWYgKG5vZGVUcmVlW25vZGVOYW1lXS5hZGRyZXNzID09PSBhZGRyZXNzKSB7CgkJCQlyZXR1cm4gbm9kZVRyZWVbbm9kZU5hbWVdLmNoaWxkczsKCQkJfSBlbHNlIHsKCQkJCWlmIChub2RlVHJlZVtub2RlTmFtZV0uY2hpbGRzKSB7CgkJCQkJcmVzdWx0ID0gZmluZENoaWxkcmVuKGFkZHJlc3MsIG5vZGVUcmVlW25vZGVOYW1lXS5jaGlsZHMpOwoJCQkJfQoJCQl9CgoJCQlpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0OwoJCX0KCX0KCglmdW5jdGlvbiBUcmVlVmlld0RhdGFzb3VyY2Uob3B0aW9ucykgewoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCWNvbnN0IGRlZmF1bHRPcHRpb25zID0gewoJCQlyZW5kZXJUbzogIiIsCgkJCXN0YXJ0QWRkcmVzczogIkFHRU5ULk9CSkVDVFMiLAoJCQlhZ2dyZWdhdGVBZGRyZXNzUHJlZml4OiAiQUdFTlQuSElTVE9SWS5BR0dSRUdBVEVURU1QTEFURVMiLAoJCQlzZWxlY3RhYmxlVHlwZXM6IFt0eXBlcy5iYXNlVmFyaWFibGUsIHR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uXSwKCQkJZm9udFNpemU6IDEyLAoJCQlsZWFmUGFkZGluZzogMiwKCQkJbGVhZkluZGVudGF0aW9uOiAxNSwKCQkJYnVzeUluZGljYXRvclRvbGVyYW5jZTogMTAwLAoJCQlleHBhbmRvT2Zmc2V0OiAzLAoJCQlzZWFyY2hEZXB0aDogMTAwLAoJCQluYXZpZ2F0aW9uRGVwdGg6IDEsCgkJCXR5cGVJbWFnZVBhdGhzOiB7CgkJCQliYXNlVmFyaWFibGU6ICIvdHJlZVZpZXcvaWNvbnMvYmFzZVZhcmlhYmxlLnN2ZyIsCgkJCQlmb2xkZXI6ICIvdHJlZVZpZXcvaWNvbnMvZm9sZGVyLnN2ZyIsCgkJCQlhZ2dyZWdhdGVGdW5jdGlvbjogIi90cmVlVmlldy9pY29ucy9hZ2dyZWdhdGVGdW5jdGlvbi5zdmciCgkJCX0KCQl9OwoKCQl0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzID0gZmFsc2U7CgkJdGhpcy5idWlsZGluZ05vZGVzQ2FjaGUgPSBmYWxzZTsKCQl0aGlzLmJyb3dzZU5vZGVzQmFja2xvZyA9IFtdOwoKCQlzZWxmLm9wdGlvbnMgPSB7fTsKCQlPYmplY3QuYXNzaWduKHNlbGYub3B0aW9ucywgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpOwoKCQl2YXIgbGFuZ3VhZ2VOYW1lID0gIiI7CgkJZm9yICh2YXIgbGFuZ3VhZ2UgaW4gcHJvamVjdC5sYW5ndWFnZXMpIHsKCQkJbGFuZ3VhZ2VOYW1lID0gbGFuZ3VhZ2U7CgkJCWJyZWFrOwoJCX0KCQlzZWxmLm9wdGlvbnMubGFuZ3VhZ2VQcmVmaXggPSBsYW5ndWFnZU5hbWU7CgogICAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9kZUNhY2hlQWN0aXZlKSB7CiAgICAgICAgICAgIHRoaXMuZmV0Y2hBdmFpbGFibGVOb2RlQWRyZXNzZXMoKCkgPT4gewogICAgICAgICAgICAgICAgLy8gQ2FjaGUgaXMgcmVhZHkuCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCX0KCgkvKioKCSAqIEEgbWV0aG9kIHRoYXQgZmV0Y2hlcyBhbGwgbm9kZXMgdGhhdCBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSB0cmVlVmlldyBhbmQgYnVpbGRzIGFuIGFycmF5IGZvciB0cmVlIGZpbHRlcmluZy4KCSAqIEBwYXJhbSB7b2JqZWN0fSBzZWxmIFRoZSBUcmVlVmlldyBpbnN0YW5jZS4KCSAqIEBwYXJhbSB7ZnVuY3Rpb259IGRhdGFDYWxsYmFjayBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aXRoIGFsbCB0aGUgYXZhaWxhYmxlIG5vZGVzLgoJICovCglUcmVlVmlld0RhdGFzb3VyY2UucHJvdG90eXBlLmZldGNoQXZhaWxhYmxlTm9kZUFkcmVzc2VzID0gZnVuY3Rpb24gKGRhdGFDYWxsYmFjaykgewoJCWNvbnN0IHNlbGYgPSB0aGlzOwoJCQoJCWlmICh0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzICYmIHRoaXMub3B0aW9ucy5ub2RlQ2FjaGVBY3RpdmUpIHsKCQkJdGhpcy5idWlsZEFkZHJlc3Nlc0FycmF5KGZ1bmN0aW9uIChhZGRyZXNzZXMpIHsKCQkJCXZhciBvcmRlcmVkQWRyZXNzZXMgPSBbXTsKCQkJCXZhciBsYXN0VmFsaWRBZGRyZXNzID0gbnVsbDsKCgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkrKykgewoJCQkJCXZhciBhZGRyZXNzID0gd2ViTUkuZXNjYXBlSFRNTChhZGRyZXNzZXNbaV0pOwoJCQkJCWlmIChhZGRyZXNzLmluZGV4T2Yoc2VsZi5vcHRpb25zLmFnZ3JlZ2F0ZUFkZHJlc3NQcmVmaXgpID09PSAtMSkgewoJCQkJCQlsYXN0VmFsaWRBZGRyZXNzID0gYWRkcmVzczsKCQkJCQkJb3JkZXJlZEFkcmVzc2VzLnB1c2goeyBhZGRyZXNzOiBhZGRyZXNzIH0pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCW9yZGVyZWRBZHJlc3Nlcy5wdXNoKHsgYWRkcmVzczogbGFzdFZhbGlkQWRkcmVzcywgYWdncmVnYXRlUmVmZXJlbmNlOiBhZGRyZXNzIH0pOwoJCQkJCX0KCQkJCX0KCQkJCWRhdGFDYWxsYmFjayhvcmRlcmVkQWRyZXNzZXMpOwoJCQl9LCB0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKHRoaXMuYnVpbGRpbmdOb2Rlc0NhY2hlKSB7CgkJCXRoaXMuYnJvd3NlTm9kZXNCYWNrbG9nLnB1c2goZGF0YUNhbGxiYWNrKTsKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5idWlsZGluZ05vZGVzQ2FjaGUgPSB0cnVlOwoKCQl3ZWJNSS5kYXRhLmNhbGwoCgkJCSJCcm93c2VOb2Rlc1dpdGhBbGFybSIsCgkJCXsKCQkJCXN0YXJ0QWRkcmVzczogdGhpcy5vcHRpb25zLnN0YXJ0QWRkcmVzcywKCQkJCWVuZExldmVsOiB0aGlzLm9wdGlvbnMuc2VhcmNoRGVwdGgsCgkJCQl2VHlwZXM6IFsKCQkJCQlvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZURhdGFUeXBlLAoJCQkJCW9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlLAoJCQkJCW9wY1VBVHlwZXMuZm9sZGVyLAoJCQkJCW9wY1VBVHlwZXMucHJvamVjdCwKCQkJCQlvcGNVQVR5cGVzLnByb2plY3RWYXJpYWJsZXMsCgkJCQkJb3BjVUFUeXBlcy5hZ2dyZWdhdGVUZW1wbGF0ZSwKCQkJCQlvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uCgkJCQldLAoJCQkJbWFwcGluZzogWwoJCQkJCXthbGlhczogImFkZHJlc3MiLCBrZXlzOiBbIm5vZGVJZCIsICJ4bWwiXSwgcmVtb3ZlTnNUYWc6IHRydWV9LAoJCQkJCXthbGlhczogIm5hbWUiLCBrZXlzOiBbImJyb3dzZU5hbWUiLCAibmFtZSJdfSwKCQkJCQl7YWxpYXM6ICJ0eXBlIiwga2V5czogWyJ0eXBlRGVmaW5pdGlvbiIsICJ4bWwiXSwgcmVtb3ZlTnNUYWc6IHRydWV9CgkJCQldLAoJCQkJaW5jbHVkZVN0YXJ0QWRkcmVzczogZmFsc2UKCQkJfSwKCQkJKHJlc3BvbnNlKSA9PiB7CgkJCQl0aGlzLmNhY2hlZEF2YWlsYWJsZU5vZGVzID0gcmVzcG9uc2U7CgkJCQl0aGlzLmJ1aWxkQWRkcmVzc2VzQXJyYXkoZnVuY3Rpb24gKGFkZHJlc3NlcykgewoJCQkJCXZhciBvcmRlcmVkQWRyZXNzZXMgPSBbXTsKCQkJCQl2YXIgbGFzdFZhbGlkQWRkcmVzcyA9IG51bGw7CgoJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSsrKSB7CgkJCQkJCXZhciBhZGRyZXNzID0gd2ViTUkuZXNjYXBlSFRNTChhZGRyZXNzZXNbaV0pOwoJCQkJCQlpZiAoYWRkcmVzcy5pbmRleE9mKHNlbGYub3B0aW9ucy5hZ2dyZWdhdGVBZGRyZXNzUHJlZml4KSA9PT0gLTEpIHsKCQkJCQkJCWxhc3RWYWxpZEFkZHJlc3MgPSBhZGRyZXNzOwoJCQkJCQkJb3JkZXJlZEFkcmVzc2VzLnB1c2goeyBhZGRyZXNzOiBhZGRyZXNzIH0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJb3JkZXJlZEFkcmVzc2VzLnB1c2goeyBhZGRyZXNzOiBsYXN0VmFsaWRBZGRyZXNzLCBhZ2dyZWdhdGVSZWZlcmVuY2U6IGFkZHJlc3MgfSk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXNlbGYuY2FjaGVkQXZhaWxhYmxlTm9kZXM7CgoJCQkJCWRhdGFDYWxsYmFjayhvcmRlcmVkQWRyZXNzZXMpOwoKCQkJCQlzZWxmLmJyb3dzZU5vZGVzQmFja2xvZy5mb3JFYWNoKChjYWxsYmFjaykgPT4gewoJCQkJCQljYWxsYmFjayhvcmRlcmVkQWRyZXNzZXMpOwoJCQkJCX0pOwoJCQkJfSwgcmVzcG9uc2UpOwoJCQl9CgkJKTsKCX07CgoJLyoqCgkgKiBQcm92aWRlcyB0aGUgdHJlZSB2aWV3IHdpdGggdGhlIGRhdGEgdHlwZXMgdGhhdCBhY3R1YWxseSBhcmUgc2VsZWN0YWJsZSBpbnN0ZWFkIG9mIGp1c3QgYnJvd3NhYmxlLgoJICogQHJldHVybnMge2FycmF5fSBTZWxlY3RhYmxlIHR5cGVzCgkgKi8KCVRyZWVWaWV3RGF0YXNvdXJjZS5wcm90b3R5cGUuZ2V0U2VsZWN0YWJsZVR5cGVzID0gZnVuY3Rpb24gKCkgewoJCXJldHVybiBbdHlwZXMuYmFzZVZhcmlhYmxlLCB0eXBlcy5hZ2dyZWdhdGVGdW5jdGlvbl07Cgl9OwoKCS8qKgoJICogQSBtZXRob2QgdGhhdCBpcyB1c2VkIGJ5IHtAbGluayBUcmVlVmlld0RhdGFzb3VyY2UjZmV0Y2hBdmFpbGFibGVOb2RlQWRyZXNzZXN9IGFzIGEgY2FsbGJhY2suCgkgKiBAcGFyYW0ge2Z1bmN0aW9ufSBkYXRhQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aXRoIHRoZSBwcm9jZXNzZWQgZGF0YS4KCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlU3RydWN0dXJlIFRoZSBub2RlIHN0cnVjdHVyZSBkZWxpdmVyZWQgZnJvbSB0aGUgc2VydmVyLgoJICogQHJldHVybiB7QXJyYXl9IGFkZHJlc3NlcwoJICovCglUcmVlVmlld0RhdGFzb3VyY2UucHJvdG90eXBlLmJ1aWxkQWRkcmVzc2VzQXJyYXkgPSBmdW5jdGlvbiAoZGF0YUNhbGxiYWNrLCBub2RlU3RydWN0dXJlKSB7CgkJdmFyIGFkZHJlc3NlcyA9IFtdOwoKCQlmb3IgKGVsZW1lbnQgaW4gbm9kZVN0cnVjdHVyZSkgewoJCQl2YXIgbm9kZUVudHJ5ID0gbm9kZVN0cnVjdHVyZVtlbGVtZW50XTsKCgkJCWlmIChjaGVja0lnbm9yZWRQcm9wZXJ0aWVzKG5vZGVFbnRyeSkgJiYgb3BjVUFUeXBlcy5hZ2dyZWdhdGVUZW1wbGF0ZS5pbmRleE9mKG5vZGVFbnRyeVsidHlwZSJdKSA9PT0gLTEpIHsKCQkJCWFkZHJlc3Nlcy5wdXNoKG5vZGVFbnRyeVsiYWRkcmVzcyJdKTsKCQkJfQoKCQkJaWYgKG5vZGVFbnRyeVsiY2hpbGRzIl0gIT09IG51bGwpIHsKCQkJCWFkZHJlc3NlcyA9IGFkZHJlc3Nlcy5jb25jYXQodGhpcy5idWlsZEFkZHJlc3Nlc0FycmF5KG51bGwsIG5vZGVFbnRyeVsiY2hpbGRzIl0pKTsKCQkJfQoJCX0KCQlpZiAodHlwZW9mIGRhdGFDYWxsYmFjayA9PT0gImZ1bmN0aW9uIikgewoJCQlkYXRhQ2FsbGJhY2soYWRkcmVzc2VzKTsKCQl9CgoJCXJldHVybiBhZGRyZXNzZXM7Cgl9OwoKCS8qKgoJICogQSBtZXRob2QgdGhhdCByZXF1ZXN0cyB0aGUgbm9kZSBzdHJ1Y3R1cmUgZnJvbSB0aGUgc2VydmVyCgkgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlQWRkcmVzcyBUaGUgbm9kZSBhZGRyZXNzIHRvIGdldCB0aGUgZGF0YSBmb3IKCSAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlZmVyZW5jZU5vZGUgVGhlIG5vZGUgdGhlIGRhdGEgaXMgcmVxdWVzdGVkIGZvcgoJICovCglUcmVlVmlld0RhdGFzb3VyY2UucHJvdG90eXBlLmZldGNoVHJlZVN0cnVjdHVyZSA9IGZ1bmN0aW9uIChyZWZlcmVuY2VBZGRyZXNzLCByZWZlcmVuY2VOb2RlKSB7CgkJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKCQkJaWYgKHdlYk1JLmdldE1ldGhvZFN1cHBvcnQoKS5pbmRleE9mKCJCcm93c2VOb2RlcyIpID09IC0xKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXZhciBzdGFydEFkZHJlc3MgPSB0aGlzLm9wdGlvbnMuc3RhcnRBZGRyZXNzOwoKCQkJaWYgKHJlZmVyZW5jZUFkZHJlc3MpIHsKCQkJCXN0YXJ0QWRkcmVzcyA9IHJlZmVyZW5jZUFkZHJlc3M7CgkJCX0gZWxzZSB7CgkJCQl2YXIgZGF0YSA9IGdldERhdGFGcm9tTm9kZShyZWZlcmVuY2VOb2RlKTsKCQkJCWlmIChkYXRhKSB7CgkJCQkJc3RhcnRBZGRyZXNzID0gZGF0YS5hZGRyZXNzOwoJCQkJfQoJCQl9CgoJCQl0cnkgewoJCQkJdmFyIGFnZ3JlZ2F0ZUZ1bmN0aW9uID0gc3RhcnRBZGRyZXNzLmluZGV4T2YoIkFHRU5ULkhJU1RPUlkuQUdHUkVHQVRFVEVNUExBVEVTLiIpID4gLTE7CgkJCX0gY2F0Y2ggKGVycikgewoJCQkJY29uc29sZS5sb2coZXJyKTsKCQkJfQoKCQkJaWYgKHRoaXMuY2FjaGVkQXZhaWxhYmxlTm9kZXMgJiYgdGhpcy5vcHRpb25zLm5vZGVDYWNoZUFjdGl2ZSkgewoJCQkJbGV0IHJlc3BvbnNlID0gZmluZENoaWxkcmVuKHN0YXJ0QWRkcmVzcywgdGhpcy5jYWNoZWRBdmFpbGFibGVOb2Rlcyk7CgkJCQljb25zdCBkYXRhID0gdGhpcy5wYXJzZU5vZGVTdHJ1Y3R1cmUuYmluZCh0aGlzLCByZWZlcmVuY2VOb2RlKShyZXNwb25zZSk7CgkJCQlyZXNvbHZlKGRhdGEsIHJlZmVyZW5jZU5vZGUpOwoJCQl9IGVsc2UgewoJCQkJd2ViTUkuZGF0YS5jYWxsKAoJCQkJCSJCcm93c2VOb2Rlc1dpdGhBbGFybSIsCgkJCQkJewoJCQkJCQlzdGFydEFkZHJlc3M6IHN0YXJ0QWRkcmVzcywKCQkJCQkJZW5kTGV2ZWw6IGFnZ3JlZ2F0ZUZ1bmN0aW9uID8gMiA6IHRoaXMub3B0aW9ucy5uYXZpZ2F0aW9uRGVwdGgsCgkJCQkJCXZUeXBlczogWwoJCQkJCQkJb3BjVUFUeXBlcy5iYXNlVmFyaWFibGVEYXRhVHlwZSwKCQkJCQkJCW9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlLAoJCQkJCQkJb3BjVUFUeXBlcy5mb2xkZXIsCgkJCQkJCQlvcGNVQVR5cGVzLnByb2plY3QsCgkJCQkJCQlvcGNVQVR5cGVzLnByb2plY3RWYXJpYWJsZXMsCgkJCQkJCQlvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uVHlwZSwKCQkJCQkJCW9wY1VBVHlwZXMuYWdncmVnYXRlVGVtcGxhdGUsCgkJCQkJCQlvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uCgkJCQkJCV0sCgkJCQkJCW1hcHBpbmc6IFsKCQkJCQkJCXsgYWxpYXM6ICJhZGRyZXNzIiwga2V5czogWyJub2RlSWQiLCAieG1sIl0sIHJlbW92ZU5zVGFnOiB0cnVlIH0sCgkJCQkJCQl7IGFsaWFzOiAibmFtZSIsIGtleXM6IFsiYnJvd3NlTmFtZSIsICJuYW1lIl0gfSwKCQkJCQkJCXsgYWxpYXM6ICJ0eXBlIiwga2V5czogWyJ0eXBlRGVmaW5pdGlvbiIsICJ4bWwiXSwgcmVtb3ZlTnNUYWc6IHRydWUgfQoJCQkJCQldLAoJCQkJCQlpbmNsdWRlU3RhcnRBZGRyZXNzOiBmYWxzZQoJCQkJCX0sCgkJCQkJKHJlc3BvbnNlKSA9PiB7CgkJCQkJCWlmIChyZXNwb25zZS5lcnJvciAmJiB0eXBlb2YgcmVzcG9uc2UuZXJyb3IgPT09ICJudW1iZXIiKSB7CgkJCQkJCQlyZWplY3QocmVzcG9uc2UpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJY29uc3QgZGF0YSA9IHRoaXMucGFyc2VOb2RlU3RydWN0dXJlLmJpbmQodGhpcywgcmVmZXJlbmNlTm9kZSkocmVzcG9uc2UpOwoJCQkJCQkJcmVzb2x2ZShkYXRhLCByZWZlcmVuY2VOb2RlKTsKCQkJCQkJfQoJCQkJCX0KCQkJCSk7CgkJCX0KCQl9KTsKCX07CgoJLyoqCgkgKiBBIG1ldGhvZCB0aGF0IHBhcnNlcyB0aGUgZmV0Y2hlZCBub2RlIHN0cnVjdHVyZSBhbmQgcmVxdWVzdHMgYWRkaXRpb25hbCBub2RlIGluZm9ybWF0aW9uCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2VOb2RlIFRoZSBub2RlIHRoZSBkYXRhIGlzIHJlcXVlc3RlZCBmb3IKCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlU3RydWN0dXJlIFRoZSBub2RlIHN0cnVjdHVyZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIKCSAqLwoJVHJlZVZpZXdEYXRhc291cmNlLnByb3RvdHlwZS5wYXJzZU5vZGVTdHJ1Y3R1cmUgPSBmdW5jdGlvbiAocmVmZXJlbmNlTm9kZSwgbm9kZVN0cnVjdHVyZSkgewoJCWlmIChub2RlU3RydWN0dXJlLmVycm9yICYmIHR5cGVvZiBub2RlU3RydWN0dXJlLmVycm9yID09PSAibnVtYmVyIikgcmV0dXJuOwoKCQkvLyBDaGVjayBpZiB0d28gREIgc3BhY2VzIGV4aXN0CgkJdmFyIGRic3BhY2VzID0ge307CgkJZm9yICh2YXIgcHJvcGVydHkgaW4gbm9kZVN0cnVjdHVyZSkgewoJCQlpZiAoIWlzTmFOKHByb3BlcnR5LnN1YnN0cigwLCBwcm9wZXJ0eS5pbmRleE9mKCIuIikpKSkgZGJzcGFjZXNbcHJvcGVydHkuc3Vic3RyKDAsIHByb3BlcnR5LmluZGV4T2YoIi4iKSldID0gdHJ1ZTsKCQl9CgoJCWlmIChPYmplY3Qua2V5cyhkYnNwYWNlcykubGVuZ3RoID4gMSkgewoJCQlmb3IgKHZhciBwcm9wZXJ0eSBpbiBub2RlU3RydWN0dXJlKSB7CgkJCQlub2RlU3RydWN0dXJlW3Byb3BlcnR5XS5uYW1lID0gbm9kZVN0cnVjdHVyZVtwcm9wZXJ0eV0uYWRkcmVzczsKCQkJfQoJCX0KCgkJdmFyIGRhdGEgPSBbXTsKCQlmb3IgKHZhciBlbGVtZW50IGluIG5vZGVTdHJ1Y3R1cmUpIHsKCQkJdmFyIG5vZGVFbnRyeSA9IG5vZGVTdHJ1Y3R1cmVbZWxlbWVudF07CgkJCXZhciBkYXRhSUQgPSBnZW5lcmF0ZURhdGFJRCgpOwoJCQl2YXIgaGFzQ2hpbGRyZW4gPSBub2RlRW50cnkuY2hpbGRzICE9IG51bGw7CgoJCQl2YXIgcHJvamVjdFZhcmlhYmxlTmFtZSA9IGZhbHNlOwoKCQkJLy8gV29ya2Fyb3VuZCBmw4PCvHIgYWx0ZSBQb3J0YWx2ZXJzaW9uZW4sIHdvIEJyb3dzZU5vZGVzIG5vY2gga2VpbiAidHlwZSIgbGllZmVydAoJCQlpZiAodHlwZW9mIG5vZGVFbnRyeS50eXBlID09ICJ1bmRlZmluZWQiKSB7CgkJCQlpZiAoaGFzQ2hpbGRyZW4pIG5vZGVFbnRyeS50eXBlID0gImk9NjEiOwoJCQkJZWxzZSBub2RlRW50cnkudHlwZSA9ICJpPTYyIjsKCQkJfQoKCQkJaWYgKG5vZGVFbnRyeS50eXBlLmluZGV4T2YoIlZhcmlhYmxlVHlwZXMuUFJPSkVDVCIpID09PSAwKSB7CgkJCQlwcm9qZWN0VmFyaWFibGVOYW1lID0gbm9kZUVudHJ5LnR5cGU7CgkJCX0KCgkJCXN3aXRjaCAobm9kZUVudHJ5LnR5cGUpIHsKCQkJCWNhc2Ugb3BjVUFUeXBlcy5iYXNlVmFyaWFibGVEYXRhVHlwZToKCQkJCQlkYXRhLnB1c2goewoJCQkJCQluYW1lOiBub2RlRW50cnkubmFtZSwKCQkJCQkJYWRkcmVzczogbm9kZUVudHJ5LmFkZHJlc3MsCgkJCQkJCXR5cGU6IHR5cGVzLmJhc2VWYXJpYWJsZSwKCQkJCQkJaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLAoJCQkJCQljaGlsZHJlbjogW10sCgkJCQkJCWRhdGFJRDogZGF0YUlECgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlOgoJCQkJCWlmIChjaGVja0lnbm9yZWRQcm9wZXJ0aWVzKG5vZGVFbnRyeSkpIHsKCQkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJCW5hbWU6IG5vZGVFbnRyeS5uYW1lLAoJCQkJCQkJYWRkcmVzczogbm9kZUVudHJ5LmFkZHJlc3MsCgkJCQkJCQl0eXBlOiB0eXBlcy5iYXNlVmFyaWFibGUsCgkJCQkJCQloYXNDaGlsZHJlbjogaGFzQ2hpbGRyZW4sCgkJCQkJCQljaGlsZHJlbjogW10sCgkJCQkJCQlkYXRhSUQ6IGRhdGFJRAoJCQkJCQl9KTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHByb2plY3RWYXJpYWJsZU5hbWU6CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5wcm9qZWN0VmFyaWFibGVzLAoJCQkJCQloYXNDaGlsZHJlbjogaGFzQ2hpbGRyZW4sCgkJCQkJCWNoaWxkcmVuOiBbXSwKCQkJCQkJZGF0YUlEOiBkYXRhSUQKCQkJCQl9KTsKCQkJCQlicmVhazsKCQkJCWNhc2Ugb3BjVUFUeXBlcy5mb2xkZXI6CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5mb2xkZXIsCgkJCQkJCWhhc0NoaWxkcmVuOiBoYXNDaGlsZHJlbiwKCQkJCQkJY2hpbGRyZW46IFtdCgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYWdncmVnYXRlVGVtcGxhdGUuc2xpY2UoNyk6CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5mb2xkZXIsCgkJCQkJCWhhc0NoaWxkcmVuOiBoYXNDaGlsZHJlbiwKCQkJCQkJY2hpbGRyZW46IFtdCgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYWdncmVnYXRlRnVuY3Rpb246CgkJCQkJZmV0Y2hBZ2dyZWdhdGVPcHRpb25zKG5vZGVFbnRyeSwgZGF0YUlELCByZWZlcmVuY2VOb2RlKTsKCQkJCQloYXNDaGlsZHJlbiA9IGNoZWNrQ2hpbGRyZW4obm9kZUVudHJ5LmNoaWxkcyk7CgkJCQkJZGF0YS5wdXNoKHsKCQkJCQkJbmFtZTogbm9kZUVudHJ5Lm5hbWUsCgkJCQkJCWFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJCQl0eXBlOiB0eXBlcy5hZ2dyZWdhdGVGdW5jdGlvbiwKCQkJCQkJaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLAoJCQkJCQljaGlsZHJlbjogaGFzQ2hpbGRyZW4gPyBub2RlRW50cnkuY2hpbGRzIDogW10sCgkJCQkJCWRhdGFJRDogZGF0YUlECgkJCQkJfSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIG9wY1VBVHlwZXMuYWdncmVnYXRlRnVuY3Rpb25UeXBlOgoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlkYXRhLnB1c2goewoJCQkJCQluYW1lOiBub2RlRW50cnkubmFtZSwKCQkJCQkJYWRkcmVzczogbm9kZUVudHJ5LmFkZHJlc3MsCgkJCQkJCXR5cGU6IHR5cGVzLmZvbGRlciwKCQkJCQkJaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLAoJCQkJCQljaGlsZHJlbjogW10KCQkJCQl9KTsKCQkJCQlicmVhazsKCQkJfQoJCX0KCgkJLy8gQXNzaWduIGljb25zCgkJZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7CgkJCXZhciBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CgkJCWljb24uc3JjID0gdGhpcy5vcHRpb25zLmxhbmd1YWdlUHJlZml4ICsgdGhpcy5vcHRpb25zLnR5cGVJbWFnZVBhdGhzW2l0ZW0udHlwZV07CgkJCWl0ZW0uaWNvbiA9IGljb247CgkJfSk7CgoJCXJldHVybiBkYXRhOwoJfTsKCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IGNoZWNrcyBpZiB0aGVyZSBhcmUgY2hpbGRyZW4gdGhhdCBhcmUgd29ydGggdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0cmVlLgoJICogQHBhcmFtIHtvYmplY3R9IGNoaWxkcmVuIFRoZSBlbGVtZW50IG9mIHRoZSBub2RlIHN0cnVjdHVyZSB0byBjaGVjayB0aGUgY2hpbGRyZW4gZm9yCgkgKi8KCWZ1bmN0aW9uIGNoZWNrQ2hpbGRyZW4oY2hpbGRyZW4pIHsKCQl2YXIgaWdub3JlZE5vZGVzID0gWwoJCQl7bmFtZTogYWdncmVnYXRlT3B0aW9ucy5vZmZzZXRVbml0LCB0eXBlOiBvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZX0sCgkJCXtuYW1lOiBhZ2dyZWdhdGVPcHRpb25zLm9mZnNldFZhbHVlLCB0eXBlOiBvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZX0sCgkJCXtuYW1lOiBhZ2dyZWdhdGVPcHRpb25zLmludGVydmFsVW5pdCwgdHlwZTogb3BjVUFUeXBlcy5iYXNlVmFyaWFibGV9LAoJCQl7bmFtZTogYWdncmVnYXRlT3B0aW9ucy5pbnRlcnZhbFZhbHVlLCB0eXBlOiBvcGNVQVR5cGVzLmJhc2VWYXJpYWJsZX0sCgkJCXtuYW1lOiBhZ2dyZWdhdGVPcHRpb25zLnN0ZXBwZWQsIHR5cGU6IG9wY1VBVHlwZXMuYmFzZVZhcmlhYmxlfSwKCQkJe25hbWU6ICIqIiwgdHlwZTogb3BjVUFUeXBlcy5hZ2dyZWdhdGVGdW5jdGlvblR5cGV9CgkJXTsKCQl2YXIgdmFsaWRDaGlsZHJlbiA9IGZhbHNlOwoKCQlpZiAoY2hpbGRyZW4gIT09ICJvbmRlbWFuZCIpIHsKCQkJZm9yIChlbGVtZW50IGluIGNoaWxkcmVuKSB7CgkJCQl2YXIgbm9kZUVudHJ5ID0gY2hpbGRyZW5bZWxlbWVudF07CgkJCQl2YXIgaWdub3JlTm9kZSA9IGZhbHNlOwoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBpZ25vcmVkTm9kZXMubGVuZ3RoOyBpKyspIHsKCQkJCQlpZiAoCgkJCQkJCShub2RlRW50cnkubmFtZSA9PSBpZ25vcmVkTm9kZXNbaV0ubmFtZSB8fCBpZ25vcmVkTm9kZXNbaV0ubmFtZSA9PSAiKiIpICYmCgkJCQkJCW5vZGVFbnRyeS50eXBlID09IGlnbm9yZWROb2Rlc1tpXS50eXBlCgkJCQkJKSB7CgkJCQkJCWlnbm9yZU5vZGUgPSB0cnVlOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoIWlnbm9yZU5vZGUpIHsKCQkJCQl2YWxpZENoaWxkcmVuID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHZhbGlkQ2hpbGRyZW47Cgl9CgoJLyoqCgkgKiBBIGhlbHBlciBtZXRob2QgdGhhdCBjaGVja3MgdGhlIGJhc2UgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIGRpc3BsYXlpbmcKCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRW50cnkgVGhlIGVsZW1lbnQgb2YgdGhlIG5vZGUgc3RydWN0dXJlIHRvIGJlIGV2ZW50dWFsbHkgaWdub3JlZAoJICovCglmdW5jdGlvbiBjaGVja0lnbm9yZWRQcm9wZXJ0aWVzKG5vZGVFbnRyeSkgewoJCXZhciBpc05vZGVPcHRpb24gPSBmYWxzZTsKCQlmb3IgKG9wdGlvbiBpbiBhZ2dyZWdhdGVPcHRpb25zKSB7CgkJCWlmIChhZ2dyZWdhdGVPcHRpb25zW29wdGlvbl0gPT0gbm9kZUVudHJ5Lm5hbWUpIHsKCQkJCWlzTm9kZU9wdGlvbiA9IHRydWU7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlyZXR1cm4gIWlzTm9kZU9wdGlvbjsKCX0KCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IGdldHMgdGhlIG9wdGlvbnMgZm9yIG5vZGVzIHRoYXQgcmVwcmVzZW50IGFnZ3JlZ2F0ZSBmdW5jdGlvbnMKCSAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRW50cnkgVGhlIGVsZW1lbnQgb2YgdGhlIG5vZGUgc3RydWN0dXJlIHRoYXQgaXMgYW4gYWdncmVnYXRlIGZ1bmN0aW9uCgkgKi8KCWZ1bmN0aW9uIGZldGNoQWdncmVnYXRlT3B0aW9ucyhub2RlRW50cnksIGRhdGFJRCwgcmVmZXJlbmNlTm9kZSkgewoJCXZhciByZWxhdGVkTm9kZUFkZHJlc3MgPSBnZXRSZWxhdGVkTm9kZUFkZHJlc3MocmVmZXJlbmNlTm9kZSk7CgkJdmFyIGFnZ3JlZ2F0ZUFkZHJlc3MgPSBub2RlRW50cnkuYWRkcmVzczsKCgkJdmFyIGFnZ3JlZ2F0ZVR5cGU7CgkJd2ViTUkuZGF0YS5jYWxsKAoJCQkiQnJvd3NlTm9kZXNXaXRoQWxhcm0iLAoJCQl7CgkJCQlzdGFydEFkZHJlc3M6IG5vZGVFbnRyeS5hZGRyZXNzLAoJCQkJZW5kTGV2ZWw6IDEsCgkJCQl2VHlwZXM6IFtvcGNVQVR5cGVzLmFnZ3JlZ2F0ZUZ1bmN0aW9uVHlwZV0sCgkJCQltYXBwaW5nOiBbCgkJCQkJe2FsaWFzOiAiYWRkcmVzcyIsIGtleXM6IFsibm9kZUlkIiwgInhtbCJdLCByZW1vdmVOc1RhZzogdHJ1ZX0sCgkJCQkJe2FsaWFzOiAibmFtZSIsIGtleXM6IFsiYnJvd3NlTmFtZSIsICJuYW1lIl19LAoJCQkJCXthbGlhczogInR5cGUiLCBrZXlzOiBbInR5cGVEZWZpbml0aW9uIiwgInhtbCJdLCByZW1vdmVOc1RhZzogdHJ1ZX0KCQkJCV0sCgkJCQlpbmNsdWRlU3RhcnRBZGRyZXNzOiBmYWxzZQoJCQl9LAoJCQlmdW5jdGlvbiAoZSkgewoJCQkJYWdncmVnYXRlVHlwZSA9IGVbT2JqZWN0LmtleXMoZSlbMF1dLm5hbWU7CgkJCQl3ZWJNSS5kYXRhLnJlYWQoCgkJCQkJWwoJCQkJCQlhZ2dyZWdhdGVBZGRyZXNzICsgIi4iICsgYWdncmVnYXRlT3B0aW9ucy5pbnRlcnZhbFZhbHVlLAoJCQkJCQlhZ2dyZWdhdGVBZGRyZXNzICsgIi4iICsgYWdncmVnYXRlT3B0aW9ucy5pbnRlcnZhbFVuaXQsCgkJCQkJCWFnZ3JlZ2F0ZUFkZHJlc3MgKyAiLiIgKyBhZ2dyZWdhdGVPcHRpb25zLm9mZnNldFZhbHVlLAoJCQkJCQlhZ2dyZWdhdGVBZGRyZXNzICsgIi4iICsgYWdncmVnYXRlT3B0aW9ucy5vZmZzZXRVbml0CgkJCQkJXSwKCQkJCQlmdW5jdGlvbiAoZGF0YSkgewoJCQkJCQl2YXIgYWdncmVnYXRlRGF0YSA9IHthZ2dyZWdhdGVJbmZvOiB7fX07CgkJCQkJCWFnZ3JlZ2F0ZURhdGEuYWdncmVnYXRlSW5mb1thZ2dyZWdhdGVPcHRpb25zLmludGVydmFsVmFsdWVdID0gZGF0YVswXS52YWx1ZTsKCQkJCQkJYWdncmVnYXRlRGF0YS5hZ2dyZWdhdGVJbmZvW2FnZ3JlZ2F0ZU9wdGlvbnMuaW50ZXJ2YWxVbml0XSA9IGRhdGFbMV0udmFsdWU7CgkJCQkJCWFnZ3JlZ2F0ZURhdGEuYWdncmVnYXRlSW5mb1thZ2dyZWdhdGVPcHRpb25zLm9mZnNldFZhbHVlXSA9IGRhdGFbMl0udmFsdWU7CgkJCQkJCWFnZ3JlZ2F0ZURhdGEuYWdncmVnYXRlSW5mb1thZ2dyZWdhdGVPcHRpb25zLm9mZnNldFVuaXRdID0gZGF0YVszXS52YWx1ZTsKCQkJCQkJYWdncmVnYXRlRGF0YS5hZ2dyZWdhdGVJbmZvW2FnZ3JlZ2F0ZU9wdGlvbnMuYWdncmVnYXRlVHlwZV0gPSBhZ2dyZWdhdGVUeXBlOwoJCQkJCQlhZ2dyZWdhdGVEYXRhLmFnZ3JlZ2F0ZUluZm9bYWdncmVnYXRlT3B0aW9ucy5yZWxhdGVkTm9kZUFkZHJlc3NdID0gcmVsYXRlZE5vZGVBZGRyZXNzOwoJCQkJCQlhZGREYXRhVG9JdGVtKHJlZmVyZW5jZU5vZGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCJkaXZbZGF0YS1pZD0nIiArIGRhdGFJRCArICInXSIpLCBhZ2dyZWdhdGVEYXRhKTsKCQkJCQl9CgkJCQkpOwoJCQl9CgkJKTsKCX0KCgkvKioKCSAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IGdlbmVyYXRlcyBhIHVuaXF1ZSBkYXRhLWlkCgkgKiBAcmV0dXJuIHtzdHJpbmd9IGlkIEEgdW5pcXVlIGRhdGEgaWQKCSAqLwoJZnVuY3Rpb24gZ2VuZXJhdGVEYXRhSUQoKSB7CgkJdmFyIFM0ID0gZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkgfCAwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpOwoJCX07CgkJcmV0dXJuIFM0KCkgKyBTNCgpICsgIi0iICsgUzQoKSArICItIiArIFM0KCkgKyAiLSIgKyBTNCgpICsgIi0iICsgUzQoKSArIFM0KCkgKyBTNCgpOwoJfQoKCWlmICghd2luZG93LnRyZWVWaWV3RGF0YXNvdXJjZXMpIHsKCQl3aW5kb3cudHJlZVZpZXdEYXRhc291cmNlcyA9IHt9OwoJfQoJd2luZG93LnRyZWVWaWV3RGF0YXNvdXJjZXNbZGF0YVNvdXJjZU5hbWVdID0gVHJlZVZpZXdEYXRhc291cmNlOwp9KSh3aW5kb3csIGRvY3VtZW50KTsK</uax:ByteString>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.AddCondition" ExportedBrowseName="1:AddCondition" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS" BrowseName="1:SERVERSCRIPTS">
		<DisplayName Locale="en">SERVERSCRIPTS</DisplayName>
		<Description Locale="en">SERVERSCRIPTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.AddCondition" BrowseName="1:AddCondition" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">AddCondition</DisplayName>
		<Description Locale="en">AddCondition</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="address" type="string" trigger="false" relative="false" value=""/>
  <parameter name="alarmName" type="string" trigger="false" relative="false" value=""/>
  <parameter name="newConfig" type="boolean" trigger="false" relative="false" value=""/>
  <parameter name="conditionName" type="string" trigger="false" relative="false" value=""/>
  <parameter name="conditionType" type="string" trigger="false" relative="false" value=""/>
  <parameter name="parentDataType" type="string" trigger="false" relative="false" value=""/>
  <parameter name="config" type="string" trigger="false" relative="false" value=""/>
  <parameter name="states" type="string" trigger="false" relative="false" value=""/>
  <code><![CDATA[config = JSON.parse(config);
states = JSON.parse(states);
conditionType = conditionType === "Retrigger" ? "Discrete.Retrigger" : conditionType;

var configuration_address = address + "." + alarmName;
var condition_address = configuration_address + "." + conditionName;

/**
 ** create configuration node
 **/
function createAlarmConfiguration(address, name){
	var stat = Ua.createNode(address + "." + name, {
		nodeClass: Ua.NodeClass.OBJECT,
		parent: address,
		typeDefinition: "ObjectTypes.ATVISE.AlarmConfiguration",
		reference: Ua.Reference.HASCOMPONENT,
	});
}

/**
 ** create condition node with all subnodes
 **/
function AddCondition(configuration_address, conditionName, conditionType){
	var stat = Ua.createNode(configuration_address + "." + conditionName, {
		nodeClass: Ua.NodeClass.OBJECT,
		parent: configuration_address,
		typeDefinition: "ObjectTypes.ATVISE.AlarmConditionControl" + "." + conditionType,
		reference: Ua.Reference.HASEVENTSOURCE,
	});
	var nodeobj = Ua.findNode(configuration_address + "." + conditionName);
	var targetNode = Ua.findNode("AGENT.ALARMING.Categories." + config.category);
	nodeobj.result.addReference(Ua.Reference.HASCOMPONENT, targetNode.result.nodeId);
}

if(newConfig){
	createAlarmConfiguration(address,alarmName)
}
AddCondition(configuration_address, conditionName, conditionType);

/**
 ** Fill data
 **/
return call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.EditCondition",{address: condition_address, config: JSON.stringify(config), isDiscrete: (conditionType === "Discrete" || conditionType === "Discrete.Retrigger"), parentAddress: address, states:JSON.stringify(states)})]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.BrowseNodesWithAlarm" ExportedBrowseName="1:BrowseNodesWithAlarm" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS" BrowseName="1:SERVERSCRIPTS">
		<DisplayName Locale="en">SERVERSCRIPTS</DisplayName>
		<Description Locale="en">SERVERSCRIPTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.BrowseNodesWithAlarm" BrowseName="1:BrowseNodesWithAlarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">BrowseNodesWithAlarm</DisplayName>
		<Description Locale="en">BrowseNodesWithAlarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <parameter name="startAddress" type="string" trigger="false" relative="false" value=""/>
  <parameter name="endLevel" type="number" trigger="false" relative="false" value=""/>
  <parameter name="vTypes" type="array" trigger="false" relative="false" value=""/>
  <parameter name="mapping" type="array" trigger="false" relative="false" value=""/>
  <parameter name="includeStartAddress" type="boolean" trigger="false" relative="false" value=""/>
  <code><![CDATA[var retObject = {};
var array = [];
var node = Ua.findNode(startAddress);
var nodeName = startAddress.split(".").slice(-1).join("");
var validTypes = [
	"FolderType",
	"BaseVariableType",
	"BaseDataVariableType",
	"VariableTypes.ATVISE.Display",
	"ObjectTypes.PROJECT",
	"ns=1;s=ObjectTypes.ATVISE.ArchiveGroup.Data",
	"ns=1;s=ObjectTypes.ATVISE.Alarm",
	"VariableTypes.PROJECT"
];

if (Ua.Status(node) == Ua.Status.BADNODEIDUNKNOWN) {
	// Alternative way to find node if it was not found: iterate through parent node's children, and if
	// browseName is equal to nodeName then the node was found
	let newNodeId = startAddress.split(".").slice(0, -1).join(".");
	node = Ua.findNode(newNodeId);

	if (Ua.Status(node) == Ua.Status.BADNODEIDUNKNOWN) return { error: -1, errorstring: "BadNodeIdUnknown" };

	var parentArray = node.result.browse().result;

	for (var i = 0; i < parentArray.length; i++) {
		if (parentArray[i].node.browseName === nodeName) {
			array = parentArray[i].node.browse().result;
			break;
		}
		return retObject;
	}
} else {
	array = node.result.browse().result;
}

//Begin Script
array = nodesWithAlarm(array);

function hasAlarmConfig(node){
	var res = node.node.browse({typeDefinition: "ObjectTypes.ATVISE.AlarmConfiguration",recursive:true}).result;
	if(res.length > 0){
		return true;	
	}
	return false;
}

function nodesWithAlarm(array){
	var newarray = [];
	for(let i = 0; i < array.length; i++){
		if(hasAlarmConfig(array[i])){
			newarray.push(array[i]);
		}
	}
	return newarray;
}
//Ende Skript

if (vTypes && vTypes.length > 0) {
	validTypes = vTypes;

	// requesting type BaseVariableType always shall implicitely include type BaseDataVariableType
	if (validTypes.indexOf("BaseVariableType") > -1 && validTypes.indexOf("BaseDataVariableType") == -1) {
		validTypes.push("BaseDataVariableType");
	}
}

if (!(mapping && mapping.length > 0)) {
	mapping = [
		{
			alias: "name",
			keys: ["nodeId", "xml"],
			removeNsTag: true
		},
		{
			alias: "text",
			keys: ["browseName", "name"]
		}
	];
}

function checkType(type) {
	var typestring = type.toString();
	type = type.valueOf();

	for (var i = 0; i < validTypes.length; i++) {
		if (type.indexOf(validTypes[i]) > -1 || typestring.indexOf(validTypes[i]) > -1) return true;
	}

	return false;
}

function hasValidSubarray(array) {
	if (typeof array === "undefined" || array.length == 0) return false;

	for (var i = 0; i < array.length; i++) {
		if (checkType(array[i].node.typeDefinition)) return true;
	}

	return false;
}

function createEntry(node, childs) {
	var obj = {};

	mapping = normalizeMappingParameter(mapping);
	
	for (var i = 0; i < mapping.length; i++) {
		var alias = mapping[i].alias;
		var keys = mapping[i].keys;
		var removeNsTag = mapping[i].removeNsTag === true ? true : false;

		// Retrieve value with keys from nested object
		obj[alias] = keys.reduce((o, prop) => {
			// First level is contained in result object, subsequent levels are flat
			if (o.result) o = o.result;

			if (typeof o[prop] === "function") {
				return o[prop]();
			} else {
				if (prop === "hardcodedLocale") {
					/** locale values are obsolete and will always return "en"
					 * for backwards compatibility. (Has always been static.) */
					return "en";
				} else {
					if (typeof o[prop] == "undefined")
						return null;
					return o[prop];
				}
			}
		}, node);

		if (removeNsTag) {
			if (obj[alias].indexOf("ns=") > -1) {
				obj[alias] = obj[alias].split(";")[1].substr(2);
			}
		}
	}

	obj["childs"] = childs;

	return obj;
}

function addLevel(retObject, array, level) {
	if (typeof array == "undefined") return;

	for (var i = 0; i < array.length; i++) {
		if (!checkType(array[i].node.typeDefinition)) continue;

		var identifier = array[i].node.browseName.name;
		var subarray = array[i].node.browse().result;

		if (hasValidSubarray(subarray)) {
			if (endLevel == 0 || level + 1 <= endLevel) {
				retObject[identifier] = createEntry(array[i].node, {});
				addLevel(retObject[identifier]["childs"], subarray, level + 1);
			} else {
				retObject[identifier] = createEntry(array[i].node, "ondemand");
			}
		} else {
			retObject[identifier] = createEntry(array[i].node, null);
		}
	}
}

function normalizeMappingParameterItem(mappingItem) {
	if (typeof mappingItem === "object") {
		// New style mapping (in object form) is passed through unchanged
		return mappingItem;
	}

	// In some instances JSON objects don't arrive in good shape when passed to webMI-methods.

	// Sanitize JSON notation in mappingItem
	mappingItem = mappingItem.split("'").join('"');

	try {
		return JSON.parse(mappingItem);
	} catch (err) {
		// mappingItem is in old style format (e.g. "name:nodeid:splitnamespace").
		// Continue with normalization/conversion.
	}

	var values = mappingItem.split(":");

	var keyMappings = {
		browsename: ["browseName", "name"],
		browsenamens: ["browseName", "idx"],
		datatype: ["dataType", "valueOf"],
		description: ["description"],
		descriptionlocale: ["hardcodedLocale"],
		displayname: ["displayName"],
		displaynamelocale: ["hardcodedLocale"],
		nodeaddr: ["nodeId", "xml"],
		nodeclass: ["nodeClass", "valueOf"],
		nodeid: ["nodeId", "xml"],
		rawstatus: ["rawStatus", "valueOf"],
		servertime: ["serverTime", "valueOf"],
		sourcetime: ["sourceTime", "valueOf"],
		status: ["status", "value"],
		typedefinition: ["typeDefinition", "valueOf"],
		value: ["value"]
	};
	
	
	if (typeof keyMappings[values[1]] == "undefined")
		keyMappings[values[1]] = [values[1]];

	var newMappingItem = {
		alias: values[0],
		keys: keyMappings[values[1]],
		removeNsTag: values[2] === "splitnamespace" ? true : false
	};

	return newMappingItem;
}

function normalizeMappingParameter(mapping) {
	return mapping.map(normalizeMappingParameterItem);
}

if (includeStartAddress) {
	retObject[nodeName] = createEntry(node, {});
	addLevel(retObject[nodeName]["childs"], array, 2);
} else {
	addLevel(retObject, array, 1);
}

return retObject;

/*
 * FolderType											Folders
 * BaseVariableType										Primitive variables (int, string, ...)
 * BaseDataVariableType									TODO(MIGF): find a good description
 * VariableTypes.ATVISE.Display							Display
 * ObjectTypes.PROJECT									Objects
 * ns=1;s=ObjectTypes.ATVISE.ArchiveGroup.Data			Data (archives)
 * ns=1;s=ObjectTypes.ATVISE.AlarmConfiguration			AlarmConfiguration
 * VariableTypes.PROJECT								Variable types
 */]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.CopyCondition" ExportedBrowseName="1:CopyCondition" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS" BrowseName="1:SERVERSCRIPTS">
		<DisplayName Locale="en">SERVERSCRIPTS</DisplayName>
		<Description Locale="en">SERVERSCRIPTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.CopyCondition" BrowseName="1:CopyCondition" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">CopyCondition</DisplayName>
		<Description Locale="en">CopyCondition</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="config" type="string" trigger="false" relative="false" value=""/>
  <parameter name="targetAddress" type="string" trigger="false" relative="false" value=""/>
  <parameter name="states" type="string" trigger="false" relative="false" value=""/>
  <parameter name="alarmName" type="string" trigger="false" relative="false" value=""/>
  <parameter name="newConfig" type="boolean" trigger="false" relative="false" value=""/>
  <code><![CDATA[config = JSON.parse(config);
/**
 ** create config with values
 **/
var isDiscrete = config.type === "Discrete" || config.type === "Retrigger";
var base_config = {
	active_message:{"":config.activeText},
	category:config.category,
	explicit_acknowledgement:config.explicit_acknowledgement,
	inactive_message:{"":config.inactiveText},
	max_time_shelved:config.max_time_shelved / 1000,
	modify_script:config.modification_script === "i=0" ? "" : config.modification_script,
	off_delay:config.delay_off / 1000,
	on_delay:config.delay_on / 1000,
	prevention_script:config.prevention_script === "i=0" ? "" : config.prevention_script,
}
var add_config = {};
if(isDiscrete){
	add_config = {
		value:config.value,
		value_compare:config.value_compare
	}
}else {
	add_config = {
		lower_limit:config.lower_limit,
		lower_limit_compare:config.lower_limit_compare,
		upper_limit:config.upper_limit,
		upper_limit_compare:config.upper_limit_compare,
	}
}


var addconfig = Object.assign({}, base_config, add_config)
var nodeTarget = Ua.findNode(targetAddress).result;
var parentDataType = typeof nodeTarget.value;

var nodeOld = Ua.findNode(config.address).result;
var tmp_ret = nodeOld.browse({
    direction: Ua.Node.BROWSEDIRECTION_INVERSE,
});
var configParent = tmp_ret.result[0].node.browse({
    direction: Ua.Node.BROWSEDIRECTION_INVERSE,
}).result[0];

var configDataType = typeof configParent.node.value;

if(parentDataType !== configDataType){
	console.log("Tried to copy the datatype: " + configDataType + " to the node with datatype: " + parentDataType);
	console.error("Error! Nodes must have the same datatype");
	return false;
}
if(call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.GetConditionType",{address: targetAddress}) !== config.type && call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.GetConditionType",{address: targetAddress}) !== null){
	console.log("Tried to copy the alarmtype: " + config.type  + " to the node with alarmtype: " + call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.GetConditionType",{address: targetAddress}));	
	console.error("Error! Nodes must have the same alarmtype");
	return false;
}
var conditionType = config.type;
var conditionName = config.name;

/**
 ** create alarm config nodes
 **/
return call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.AddCondition",{address: targetAddress, config: JSON.stringify(addconfig), alarmName:alarmName, newConfig: newConfig, conditionName: conditionName, conditionType: conditionType, parentDataType:parentDataType, states:states})]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.EditCondition" ExportedBrowseName="1:EditCondition" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS" BrowseName="1:SERVERSCRIPTS">
		<DisplayName Locale="en">SERVERSCRIPTS</DisplayName>
		<Description Locale="en">SERVERSCRIPTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.EditCondition" BrowseName="1:EditCondition" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">EditCondition</DisplayName>
		<Description Locale="en">EditCondition</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="address" type="string" trigger="false" relative="false" value=""/>
  <parameter name="config" type="string" trigger="false" relative="false" value=""/>
  <parameter name="isDiscrete" type="boolean" trigger="false" relative="false" value=""/>
  <parameter name="parentAddress" type="string" trigger="false" relative="false" value=""/>
  <parameter name="states" type="string" trigger="false" relative="false" value=""/>
  <code><![CDATA[config = JSON.parse(config);
states = JSON.parse(states);
/**
 ** change category reference
 **/
function changeAlarmCategory(currCate, newCate){
	var nodeobj = Ua.findNode(address);
	var targetDelete = Ua.findNode("AGENT.ALARMING.Categories." + currCate);
	var targetAdd = Ua.findNode("AGENT.ALARMING.Categories." + newCate);
	nodeobj.result.deleteReference(Ua.Reference.HASCOMPONENT, targetDelete.result.nodeId);
	nodeobj.result.addReference(Ua.Reference.HASCOMPONENT, targetAdd.result.nodeId);
}

var tempNode;
for (const [key, value] of Object.entries(config)) {
    if (key !== "name_input" && key !== "lower_limit" && key !== "lower_limit_compare" && 
    key !== "upper_limit" && key !== "upper_limit_compare" && key !== "value" && key !== "value_compare") {
		if(key === "category"){
			var currCategory = Ua.findNode(address).result.browse({typeDefinition: "ObjectTypes.ATVISE.AlarmConditionCategory"}).result[0].node.browseName.name
			if(currCategory !== value){
				changeAlarmCategory(currCategory, value);		
			}
		}else{
			tempNode = Ua.findNode(address + "." + key);
			if(key === "active_message" || key === "inactive_message"){
				if(tempNode.result.value[""] !== value[""]){
					tempNode.result.value = value;    
				}
			}else if (key === "max_time_shelved" || key === "off_delay" || key === "on_delay"){
				tempNode.result.value = value * 1000;
			}else if (key === "explicit_acknowledgement"){
				if(value == "1"){
					tempNode.result.value = true;		
				}else{
					tempNode.result.value = false;
				}
			}else{
				if(tempNode.result.value !== value){
					tempNode.result.value = value;     
				}
			}
		}
    }
}

/**
 ** parse relatvie path to xml
**/
function pointNotationToXml(pointNotation) {
	if(pointNotation.toString().trim().startsWith("<") && pointNotation.toString().trim().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(pointNotation.toString().trim()))
	return pointNotation;
    const names = pointNotation.split(".").filter(Boolean); // Entfernt leere Einträge von split
    let xmlString = `<RelativePath>\n  <Elements>\n`;
    for (let name of names) {
        xmlString += `    <RelativePathElement>\n`;
        xmlString += `      <TargetName>\n`;
        xmlString += `        <NamespaceIndex>1</NamespaceIndex>\n`;
        xmlString += `        <Name>${name}</Name>\n`;
        xmlString += `      </TargetName>\n`;
        xmlString += `    </RelativePathElement>\n`;
    }
    xmlString += `  </Elements>\n</RelativePath>`;
    return xmlString;
}

/**
 ** write to variant 
 **/
function writeToVariant(value, type){
	var state;
	if(type === "value") state = states.value;
	if(type === "lower_limit") state = states.lower_limit
	if(type === "upper_limit") state = states.upper_limit
	if(value === "null" || value === null)
		return null;	
	if(state === "Value"){
		var parentNode = Ua.findNode(parentAddress).result;
		if(parentNode.dataType.toString() === "Boolean"){
			if(value.toString() === "1" || value.toString() === "true"){ //to string bc when copy its an actual bool but when just changing its a string
				return {value: {type: Ua.DataType.BOOLEAN, value: true}};
			}else{
				return {value: {type: Ua.DataType.BOOLEAN, value: false}};
			}
		}else if(parentNode.dataType.toString() === "Int16" || parentNode.dataType.toString() === "Byte" || parentNode.dataType.toString() === "SByte" || parentNode.dataType.toString() === "UInt16" ||
		parentNode.dataType.toString() === "Int32" || parentNode.dataType.toString() === "UInt32" || parentNode.dataType.toString() === "Int64" || parentNode.dataType.toString() === "UInt64"){
			return {value: {type: Ua.DataType.INT16, value: parseInt(value)}};
		}else if(parentNode.dataType.toString() === "Float"){
			return {value: {type: Ua.DataType.FLOAT, value: parseFloat(value)}};
		}else if(parentNode.dataType.toString() === "Double"){
			return {value: {type: Ua.DataType.DOUBLE, value: parseInt(value)}};
		}else if(parentNode.dataType.toString() === "String"){
			return {value: {type: Ua.DataType.STRING, value: value}};
		}
	}else if(state === "Node absolute"){
		return {value: {type: Ua.DataType.NODEID, value: "ns=1;s=" + value}};
	}else if(state === "Node relative"){
		return {value: {type: Ua.DataType.XMLELEMENT, value: pointNotationToXml(value)}};
	}
}

if(isDiscrete){
	tempNode = Ua.findNode(address + ".value");
	if(tempNode.result.value !== config["value"]){
		tempNode.result.value = writeToVariant(config["value"],"value");
	}
	tempNode = Ua.findNode(address + ".value_compare");
	if(tempNode.result.value !== config["value_compare"]){
		tempNode.result.value = config["value_compare"];
	}
}else{
	tempNode = Ua.findNode(address + ".lower_limit_compare");
	if(tempNode.result.value !== config["lower_limit_compare"]){
		tempNode.result.value = config["lower_limit_compare"];
	}
	tempNode = Ua.findNode(address + ".lower_limit");
	if(tempNode.result.value !== config["lower_limit"]){
		tempNode.result.value = writeToVariant(config["lower_limit"],"lower_limit");
	}
	tempNode = Ua.findNode(address + ".upper_limit_compare");
	if(tempNode.result.value !== config["upper_limit_compare"]){
		tempNode.result.value = config["upper_limit_compare"];
	}
	tempNode = Ua.findNode(address + ".upper_limit");
	if(tempNode.result.value !== config["upper_limit"]){
		tempNode.result.value = writeToVariant(config["upper_limit"],"upper_limit");
	}
}
return true;]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.GetConditionType" ExportedBrowseName="1:GetConditionType" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS" BrowseName="1:SERVERSCRIPTS">
		<DisplayName Locale="en">SERVERSCRIPTS</DisplayName>
		<Description Locale="en">SERVERSCRIPTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.GetConditionType" BrowseName="1:GetConditionType" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">GetConditionType</DisplayName>
		<Description Locale="en">GetConditionType</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="address" type="string" trigger="false" relative="false" value=""/>
  <code><![CDATA[var nodeobj = Ua.findNode(address);

function browseNodes(node, typeDefinition) {
    return node.result.browse({
        nodeClass: Ua.NodeClass.OBJECT,
        typeDefinition: typeDefinition,
        recursive: true
    }).result;
}

/**
 ** returns the condition type
 **/
var result = browseNodes(nodeobj, "ObjectTypes.ATVISE.AlarmConditionControl.Discrete");
if (result.length === 0) {
    result = browseNodes(nodeobj, "ObjectTypes.ATVISE.AlarmConditionControl.Discrete.Retrigger");
    if (result.length === 0) {
        result = browseNodes(nodeobj, "ObjectTypes.ATVISE.AlarmConditionControl.Limit");
        if(result.length === 0){
			return null;
        }else{
			return "Limit";
        }
    }else{
		return "Retrigger"; 
    }
} else {
    return "Discrete";
}]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.HasAlarmConfiguration" ExportedBrowseName="1:HasAlarmConfiguration" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS" BrowseName="1:SERVERSCRIPTS">
		<DisplayName Locale="en">SERVERSCRIPTS</DisplayName>
		<Description Locale="en">SERVERSCRIPTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.HasAlarmConfiguration" BrowseName="1:HasAlarmConfiguration" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">HasAlarmConfiguration</DisplayName>
		<Description Locale="en">HasAlarmConfiguration</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="address" type="string" trigger="false" relative="false" value=""/>
  <code><![CDATA[/**
 ** check if node has alarm configuration returns the name
 **/
var node = Ua.findNode(address);
var ret = node.result.browse({
	   typeDefinition: "ObjectTypes.ATVISE.AlarmConfiguration",
}).result;

if(ret.length > 0){
	return ret[0].node.browseName.name;
}else{
	return null;
}]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager" ExportedBrowseName="1:alarmmanager" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS" BrowseName="1:SERVERSCRIPTS">
		<DisplayName Locale="en">SERVERSCRIPTS</DisplayName>
		<Description Locale="en">SERVERSCRIPTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.AddCondition" BrowseName="1:AddCondition" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">AddCondition</DisplayName>
		<Description Locale="en">AddCondition</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="address" type="string" trigger="false" relative="false" value=""/>
  <parameter name="alarmName" type="string" trigger="false" relative="false" value=""/>
  <parameter name="newConfig" type="boolean" trigger="false" relative="false" value=""/>
  <parameter name="conditionName" type="string" trigger="false" relative="false" value=""/>
  <parameter name="conditionType" type="string" trigger="false" relative="false" value=""/>
  <parameter name="parentDataType" type="string" trigger="false" relative="false" value=""/>
  <parameter name="config" type="string" trigger="false" relative="false" value=""/>
  <parameter name="states" type="string" trigger="false" relative="false" value=""/>
  <code><![CDATA[config = JSON.parse(config);
states = JSON.parse(states);
conditionType = conditionType === "Retrigger" ? "Discrete.Retrigger" : conditionType;

var configuration_address = address + "." + alarmName;
var condition_address = configuration_address + "." + conditionName;

/**
 ** create configuration node
 **/
function createAlarmConfiguration(address, name){
	var stat = Ua.createNode(address + "." + name, {
		nodeClass: Ua.NodeClass.OBJECT,
		parent: address,
		typeDefinition: "ObjectTypes.ATVISE.AlarmConfiguration",
		reference: Ua.Reference.HASCOMPONENT,
	});
}

/**
 ** create condition node with all subnodes
 **/
function AddCondition(configuration_address, conditionName, conditionType){
	var stat = Ua.createNode(configuration_address + "." + conditionName, {
		nodeClass: Ua.NodeClass.OBJECT,
		parent: configuration_address,
		typeDefinition: "ObjectTypes.ATVISE.AlarmConditionControl" + "." + conditionType,
		reference: Ua.Reference.HASEVENTSOURCE,
	});
	var nodeobj = Ua.findNode(configuration_address + "." + conditionName);
	var targetNode = Ua.findNode("AGENT.ALARMING.Categories." + config.category);
	nodeobj.result.addReference(Ua.Reference.HASCOMPONENT, targetNode.result.nodeId);
}

if(newConfig){
	createAlarmConfiguration(address,alarmName)
}
AddCondition(configuration_address, conditionName, conditionType);

/**
 ** Fill data
 **/
return call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.EditCondition",{address: condition_address, config: JSON.stringify(config), isDiscrete: (conditionType === "Discrete" || conditionType === "Discrete.Retrigger"), parentAddress: address, states:JSON.stringify(states)})]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.BrowseNodesWithAlarm" BrowseName="1:BrowseNodesWithAlarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">BrowseNodesWithAlarm</DisplayName>
		<Description Locale="en">BrowseNodesWithAlarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <parameter name="startAddress" type="string" trigger="false" relative="false" value=""/>
  <parameter name="endLevel" type="number" trigger="false" relative="false" value=""/>
  <parameter name="vTypes" type="array" trigger="false" relative="false" value=""/>
  <parameter name="mapping" type="array" trigger="false" relative="false" value=""/>
  <parameter name="includeStartAddress" type="boolean" trigger="false" relative="false" value=""/>
  <code><![CDATA[var retObject = {};
var array = [];
var node = Ua.findNode(startAddress);
var nodeName = startAddress.split(".").slice(-1).join("");
var validTypes = [
	"FolderType",
	"BaseVariableType",
	"BaseDataVariableType",
	"VariableTypes.ATVISE.Display",
	"ObjectTypes.PROJECT",
	"ns=1;s=ObjectTypes.ATVISE.ArchiveGroup.Data",
	"ns=1;s=ObjectTypes.ATVISE.Alarm",
	"VariableTypes.PROJECT"
];

if (Ua.Status(node) == Ua.Status.BADNODEIDUNKNOWN) {
	// Alternative way to find node if it was not found: iterate through parent node's children, and if
	// browseName is equal to nodeName then the node was found
	let newNodeId = startAddress.split(".").slice(0, -1).join(".");
	node = Ua.findNode(newNodeId);

	if (Ua.Status(node) == Ua.Status.BADNODEIDUNKNOWN) return { error: -1, errorstring: "BadNodeIdUnknown" };

	var parentArray = node.result.browse().result;

	for (var i = 0; i < parentArray.length; i++) {
		if (parentArray[i].node.browseName === nodeName) {
			array = parentArray[i].node.browse().result;
			break;
		}
		return retObject;
	}
} else {
	array = node.result.browse().result;
}

//Begin Script
array = nodesWithAlarm(array);

function hasAlarmConfig(node){
	var res = node.node.browse({typeDefinition: "ObjectTypes.ATVISE.AlarmConfiguration",recursive:true}).result;
	if(res.length > 0){
		return true;	
	}
	return false;
}

function nodesWithAlarm(array){
	var newarray = [];
	for(let i = 0; i < array.length; i++){
		if(hasAlarmConfig(array[i])){
			newarray.push(array[i]);
		}
	}
	return newarray;
}
//Ende Skript

if (vTypes && vTypes.length > 0) {
	validTypes = vTypes;

	// requesting type BaseVariableType always shall implicitely include type BaseDataVariableType
	if (validTypes.indexOf("BaseVariableType") > -1 && validTypes.indexOf("BaseDataVariableType") == -1) {
		validTypes.push("BaseDataVariableType");
	}
}

if (!(mapping && mapping.length > 0)) {
	mapping = [
		{
			alias: "name",
			keys: ["nodeId", "xml"],
			removeNsTag: true
		},
		{
			alias: "text",
			keys: ["browseName", "name"]
		}
	];
}

function checkType(type) {
	var typestring = type.toString();
	type = type.valueOf();

	for (var i = 0; i < validTypes.length; i++) {
		if (type.indexOf(validTypes[i]) > -1 || typestring.indexOf(validTypes[i]) > -1) return true;
	}

	return false;
}

function hasValidSubarray(array) {
	if (typeof array === "undefined" || array.length == 0) return false;

	for (var i = 0; i < array.length; i++) {
		if (checkType(array[i].node.typeDefinition)) return true;
	}

	return false;
}

function createEntry(node, childs) {
	var obj = {};

	mapping = normalizeMappingParameter(mapping);
	
	for (var i = 0; i < mapping.length; i++) {
		var alias = mapping[i].alias;
		var keys = mapping[i].keys;
		var removeNsTag = mapping[i].removeNsTag === true ? true : false;

		// Retrieve value with keys from nested object
		obj[alias] = keys.reduce((o, prop) => {
			// First level is contained in result object, subsequent levels are flat
			if (o.result) o = o.result;

			if (typeof o[prop] === "function") {
				return o[prop]();
			} else {
				if (prop === "hardcodedLocale") {
					/** locale values are obsolete and will always return "en"
					 * for backwards compatibility. (Has always been static.) */
					return "en";
				} else {
					if (typeof o[prop] == "undefined")
						return null;
					return o[prop];
				}
			}
		}, node);

		if (removeNsTag) {
			if (obj[alias].indexOf("ns=") > -1) {
				obj[alias] = obj[alias].split(";")[1].substr(2);
			}
		}
	}

	obj["childs"] = childs;

	return obj;
}

function addLevel(retObject, array, level) {
	if (typeof array == "undefined") return;

	for (var i = 0; i < array.length; i++) {
		if (!checkType(array[i].node.typeDefinition)) continue;

		var identifier = array[i].node.browseName.name;
		var subarray = array[i].node.browse().result;

		if (hasValidSubarray(subarray)) {
			if (endLevel == 0 || level + 1 <= endLevel) {
				retObject[identifier] = createEntry(array[i].node, {});
				addLevel(retObject[identifier]["childs"], subarray, level + 1);
			} else {
				retObject[identifier] = createEntry(array[i].node, "ondemand");
			}
		} else {
			retObject[identifier] = createEntry(array[i].node, null);
		}
	}
}

function normalizeMappingParameterItem(mappingItem) {
	if (typeof mappingItem === "object") {
		// New style mapping (in object form) is passed through unchanged
		return mappingItem;
	}

	// In some instances JSON objects don't arrive in good shape when passed to webMI-methods.

	// Sanitize JSON notation in mappingItem
	mappingItem = mappingItem.split("'").join('"');

	try {
		return JSON.parse(mappingItem);
	} catch (err) {
		// mappingItem is in old style format (e.g. "name:nodeid:splitnamespace").
		// Continue with normalization/conversion.
	}

	var values = mappingItem.split(":");

	var keyMappings = {
		browsename: ["browseName", "name"],
		browsenamens: ["browseName", "idx"],
		datatype: ["dataType", "valueOf"],
		description: ["description"],
		descriptionlocale: ["hardcodedLocale"],
		displayname: ["displayName"],
		displaynamelocale: ["hardcodedLocale"],
		nodeaddr: ["nodeId", "xml"],
		nodeclass: ["nodeClass", "valueOf"],
		nodeid: ["nodeId", "xml"],
		rawstatus: ["rawStatus", "valueOf"],
		servertime: ["serverTime", "valueOf"],
		sourcetime: ["sourceTime", "valueOf"],
		status: ["status", "value"],
		typedefinition: ["typeDefinition", "valueOf"],
		value: ["value"]
	};
	
	
	if (typeof keyMappings[values[1]] == "undefined")
		keyMappings[values[1]] = [values[1]];

	var newMappingItem = {
		alias: values[0],
		keys: keyMappings[values[1]],
		removeNsTag: values[2] === "splitnamespace" ? true : false
	};

	return newMappingItem;
}

function normalizeMappingParameter(mapping) {
	return mapping.map(normalizeMappingParameterItem);
}

if (includeStartAddress) {
	retObject[nodeName] = createEntry(node, {});
	addLevel(retObject[nodeName]["childs"], array, 2);
} else {
	addLevel(retObject, array, 1);
}

return retObject;

/*
 * FolderType											Folders
 * BaseVariableType										Primitive variables (int, string, ...)
 * BaseDataVariableType									TODO(MIGF): find a good description
 * VariableTypes.ATVISE.Display							Display
 * ObjectTypes.PROJECT									Objects
 * ns=1;s=ObjectTypes.ATVISE.ArchiveGroup.Data			Data (archives)
 * ns=1;s=ObjectTypes.ATVISE.AlarmConfiguration			AlarmConfiguration
 * VariableTypes.PROJECT								Variable types
 */]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.CopyCondition" BrowseName="1:CopyCondition" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">CopyCondition</DisplayName>
		<Description Locale="en">CopyCondition</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="config" type="string" trigger="false" relative="false" value=""/>
  <parameter name="targetAddress" type="string" trigger="false" relative="false" value=""/>
  <parameter name="states" type="string" trigger="false" relative="false" value=""/>
  <parameter name="alarmName" type="string" trigger="false" relative="false" value=""/>
  <parameter name="newConfig" type="boolean" trigger="false" relative="false" value=""/>
  <code><![CDATA[config = JSON.parse(config);
/**
 ** create config with values
 **/
var isDiscrete = config.type === "Discrete" || config.type === "Retrigger";
var base_config = {
	active_message:{"":config.activeText},
	category:config.category,
	explicit_acknowledgement:config.explicit_acknowledgement,
	inactive_message:{"":config.inactiveText},
	max_time_shelved:config.max_time_shelved / 1000,
	modify_script:config.modification_script === "i=0" ? "" : config.modification_script,
	off_delay:config.delay_off / 1000,
	on_delay:config.delay_on / 1000,
	prevention_script:config.prevention_script === "i=0" ? "" : config.prevention_script,
}
var add_config = {};
if(isDiscrete){
	add_config = {
		value:config.value,
		value_compare:config.value_compare
	}
}else {
	add_config = {
		lower_limit:config.lower_limit,
		lower_limit_compare:config.lower_limit_compare,
		upper_limit:config.upper_limit,
		upper_limit_compare:config.upper_limit_compare,
	}
}


var addconfig = Object.assign({}, base_config, add_config)
var nodeTarget = Ua.findNode(targetAddress).result;
var parentDataType = typeof nodeTarget.value;

var nodeOld = Ua.findNode(config.address).result;
var tmp_ret = nodeOld.browse({
    direction: Ua.Node.BROWSEDIRECTION_INVERSE,
});
var configParent = tmp_ret.result[0].node.browse({
    direction: Ua.Node.BROWSEDIRECTION_INVERSE,
}).result[0];

var configDataType = typeof configParent.node.value;

if(parentDataType !== configDataType){
	console.log("Tried to copy the datatype: " + configDataType + " to the node with datatype: " + parentDataType);
	console.error("Error! Nodes must have the same datatype");
	return false;
}
if(call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.GetConditionType",{address: targetAddress}) !== config.type && call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.GetConditionType",{address: targetAddress}) !== null){
	console.log("Tried to copy the alarmtype: " + config.type  + " to the node with alarmtype: " + call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.GetConditionType",{address: targetAddress}));	
	console.error("Error! Nodes must have the same alarmtype");
	return false;
}
var conditionType = config.type;
var conditionName = config.name;

/**
 ** create alarm config nodes
 **/
return call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.AddCondition",{address: targetAddress, config: JSON.stringify(addconfig), alarmName:alarmName, newConfig: newConfig, conditionName: conditionName, conditionType: conditionType, parentDataType:parentDataType, states:states})]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.EditCondition" BrowseName="1:EditCondition" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">EditCondition</DisplayName>
		<Description Locale="en">EditCondition</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="address" type="string" trigger="false" relative="false" value=""/>
  <parameter name="config" type="string" trigger="false" relative="false" value=""/>
  <parameter name="isDiscrete" type="boolean" trigger="false" relative="false" value=""/>
  <parameter name="parentAddress" type="string" trigger="false" relative="false" value=""/>
  <parameter name="states" type="string" trigger="false" relative="false" value=""/>
  <code><![CDATA[config = JSON.parse(config);
states = JSON.parse(states);
/**
 ** change category reference
 **/
function changeAlarmCategory(currCate, newCate){
	var nodeobj = Ua.findNode(address);
	var targetDelete = Ua.findNode("AGENT.ALARMING.Categories." + currCate);
	var targetAdd = Ua.findNode("AGENT.ALARMING.Categories." + newCate);
	nodeobj.result.deleteReference(Ua.Reference.HASCOMPONENT, targetDelete.result.nodeId);
	nodeobj.result.addReference(Ua.Reference.HASCOMPONENT, targetAdd.result.nodeId);
}

var tempNode;
for (const [key, value] of Object.entries(config)) {
    if (key !== "name_input" && key !== "lower_limit" && key !== "lower_limit_compare" && 
    key !== "upper_limit" && key !== "upper_limit_compare" && key !== "value" && key !== "value_compare") {
		if(key === "category"){
			var currCategory = Ua.findNode(address).result.browse({typeDefinition: "ObjectTypes.ATVISE.AlarmConditionCategory"}).result[0].node.browseName.name
			if(currCategory !== value){
				changeAlarmCategory(currCategory, value);		
			}
		}else{
			tempNode = Ua.findNode(address + "." + key);
			if(key === "active_message" || key === "inactive_message"){
				if(tempNode.result.value[""] !== value[""]){
					tempNode.result.value = value;    
				}
			}else if (key === "max_time_shelved" || key === "off_delay" || key === "on_delay"){
				tempNode.result.value = value * 1000;
			}else if (key === "explicit_acknowledgement"){
				if(value == "1"){
					tempNode.result.value = true;		
				}else{
					tempNode.result.value = false;
				}
			}else{
				if(tempNode.result.value !== value){
					tempNode.result.value = value;     
				}
			}
		}
    }
}

/**
 ** parse relatvie path to xml
**/
function pointNotationToXml(pointNotation) {
	if(pointNotation.toString().trim().startsWith("<") && pointNotation.toString().trim().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(pointNotation.toString().trim()))
	return pointNotation;
    const names = pointNotation.split(".").filter(Boolean); // Entfernt leere Einträge von split
    let xmlString = `<RelativePath>\n  <Elements>\n`;
    for (let name of names) {
        xmlString += `    <RelativePathElement>\n`;
        xmlString += `      <TargetName>\n`;
        xmlString += `        <NamespaceIndex>1</NamespaceIndex>\n`;
        xmlString += `        <Name>${name}</Name>\n`;
        xmlString += `      </TargetName>\n`;
        xmlString += `    </RelativePathElement>\n`;
    }
    xmlString += `  </Elements>\n</RelativePath>`;
    return xmlString;
}

/**
 ** write to variant 
 **/
function writeToVariant(value, type){
	var state;
	if(type === "value") state = states.value;
	if(type === "lower_limit") state = states.lower_limit
	if(type === "upper_limit") state = states.upper_limit
	if(value === "null" || value === null)
		return null;	
	if(state === "Value"){
		var parentNode = Ua.findNode(parentAddress).result;
		if(parentNode.dataType.toString() === "Boolean"){
			if(value.toString() === "1" || value.toString() === "true"){ //to string bc when copy its an actual bool but when just changing its a string
				return {value: {type: Ua.DataType.BOOLEAN, value: true}};
			}else{
				return {value: {type: Ua.DataType.BOOLEAN, value: false}};
			}
		}else if(parentNode.dataType.toString() === "Int16" || parentNode.dataType.toString() === "Byte" || parentNode.dataType.toString() === "SByte" || parentNode.dataType.toString() === "UInt16" ||
		parentNode.dataType.toString() === "Int32" || parentNode.dataType.toString() === "UInt32" || parentNode.dataType.toString() === "Int64" || parentNode.dataType.toString() === "UInt64"){
			return {value: {type: Ua.DataType.INT16, value: parseInt(value)}};
		}else if(parentNode.dataType.toString() === "Float"){
			return {value: {type: Ua.DataType.FLOAT, value: parseFloat(value)}};
		}else if(parentNode.dataType.toString() === "Double"){
			return {value: {type: Ua.DataType.DOUBLE, value: parseInt(value)}};
		}else if(parentNode.dataType.toString() === "String"){
			return {value: {type: Ua.DataType.STRING, value: value}};
		}
	}else if(state === "Node absolute"){
		return {value: {type: Ua.DataType.NODEID, value: "ns=1;s=" + value}};
	}else if(state === "Node relative"){
		return {value: {type: Ua.DataType.XMLELEMENT, value: pointNotationToXml(value)}};
	}
}

if(isDiscrete){
	tempNode = Ua.findNode(address + ".value");
	if(tempNode.result.value !== config["value"]){
		tempNode.result.value = writeToVariant(config["value"],"value");
	}
	tempNode = Ua.findNode(address + ".value_compare");
	if(tempNode.result.value !== config["value_compare"]){
		tempNode.result.value = config["value_compare"];
	}
}else{
	tempNode = Ua.findNode(address + ".lower_limit_compare");
	if(tempNode.result.value !== config["lower_limit_compare"]){
		tempNode.result.value = config["lower_limit_compare"];
	}
	tempNode = Ua.findNode(address + ".lower_limit");
	if(tempNode.result.value !== config["lower_limit"]){
		tempNode.result.value = writeToVariant(config["lower_limit"],"lower_limit");
	}
	tempNode = Ua.findNode(address + ".upper_limit_compare");
	if(tempNode.result.value !== config["upper_limit_compare"]){
		tempNode.result.value = config["upper_limit_compare"];
	}
	tempNode = Ua.findNode(address + ".upper_limit");
	if(tempNode.result.value !== config["upper_limit"]){
		tempNode.result.value = writeToVariant(config["upper_limit"],"upper_limit");
	}
}
return true;]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.GetConditionType" BrowseName="1:GetConditionType" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">GetConditionType</DisplayName>
		<Description Locale="en">GetConditionType</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="address" type="string" trigger="false" relative="false" value=""/>
  <code><![CDATA[var nodeobj = Ua.findNode(address);

function browseNodes(node, typeDefinition) {
    return node.result.browse({
        nodeClass: Ua.NodeClass.OBJECT,
        typeDefinition: typeDefinition,
        recursive: true
    }).result;
}

/**
 ** returns the condition type
 **/
var result = browseNodes(nodeobj, "ObjectTypes.ATVISE.AlarmConditionControl.Discrete");
if (result.length === 0) {
    result = browseNodes(nodeobj, "ObjectTypes.ATVISE.AlarmConditionControl.Discrete.Retrigger");
    if (result.length === 0) {
        result = browseNodes(nodeobj, "ObjectTypes.ATVISE.AlarmConditionControl.Limit");
        if(result.length === 0){
			return null;
        }else{
			return "Limit";
        }
    }else{
		return "Retrigger"; 
    }
} else {
    return "Discrete";
}]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.HasAlarmConfiguration" BrowseName="1:HasAlarmConfiguration" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">HasAlarmConfiguration</DisplayName>
		<Description Locale="en">HasAlarmConfiguration</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="address" type="string" trigger="false" relative="false" value=""/>
  <code><![CDATA[/**
 ** check if node has alarm configuration returns the name
 **/
var node = Ua.findNode(address);
var ret = node.result.browse({
	   typeDefinition: "ObjectTypes.ATVISE.AlarmConfiguration",
}).result;

if(ret.length > 0){
	return ret[0].node.browseName.name;
}else{
	return null;
}]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.AddCondition" ExportedBrowseName="1:AddCondition" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS" BrowseName="1:WEBMIMETHODS">
		<DisplayName Locale="en">WEBMIMETHODS</DisplayName>
		<Description Locale="en">WEBMIMETHODS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.AddCondition" BrowseName="1:AddCondition" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">AddCondition</DisplayName>
		<Description Locale="en">AddCondition</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <code><![CDATA[var address = request.postvalues.address;
var alarmName = request.postvalues.alarmName;
var newConfig = request.postvalues.newConfig === "true";
var conditionName = request.postvalues.conditionName;
var conditionType = request.postvalues.conditionType;
var parentDataType = request.postvalues.parentDataType;
var config = JSON.parse(request.postvalues.config);
var states = JSON.parse(request.postvalues.states);
/**
 ** redirect to serverscript
 */
call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.AddCondition",{address: address, config: JSON.stringify(config), alarmName:alarmName, newConfig: newConfig, conditionName: conditionName, conditionType: conditionType, parentDataType:parentDataType, states:JSON.stringify(states)})]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.BrowseNodesWithAlarm" ExportedBrowseName="1:BrowseNodesWithAlarm" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS" BrowseName="1:WEBMIMETHODS">
		<DisplayName Locale="en">WEBMIMETHODS</DisplayName>
		<Description Locale="en">WEBMIMETHODS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.BrowseNodesWithAlarm" BrowseName="1:BrowseNodesWithAlarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">BrowseNodesWithAlarm</DisplayName>
		<Description Locale="en">BrowseNodesWithAlarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <code><![CDATA[var startAddress = request.postvalues.startAddress;
var endLevel = 0;
var vTypes = request.postvalues.vTypes;
var mapping = request.postvalues.mapping;
var includeStartAddress = false;

if (request.postvalues.endLevel)
	endLevel = isNaN(Number(request.postvalues.endLevel)) ? 0 : Number(request.postvalues.endLevel);

if (request.postvalues.includeStartAddress)
	includeStartAddress = (request.postvalues.includeStartAddress == "true");


return call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.BrowseNodesWithAlarm", {
	"startAddress": startAddress,
	"endLevel": endLevel,
	"vTypes": vTypes,
	"mapping": mapping,
	"includeStartAddress": includeStartAddress
});]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.CopyCondition" ExportedBrowseName="1:CopyCondition" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS" BrowseName="1:WEBMIMETHODS">
		<DisplayName Locale="en">WEBMIMETHODS</DisplayName>
		<Description Locale="en">WEBMIMETHODS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.CopyCondition" BrowseName="1:CopyCondition" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">CopyCondition</DisplayName>
		<Description Locale="en">CopyCondition</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <code><![CDATA[var config_table = JSON.parse(request.postvalues.config_table);
var targetAddress = request.postvalues.targetAddress;
var states = request.postvalues.states;
var alarmName = request.postvalues.alarmName;
var newConfig = request.postvalues.newConfig === "true";
var result = true;
/**
 ** redirect to serverscript but with only one condition
 */
config_table.forEach(condi => {
	result = call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.CopyCondition",{config: JSON.stringify(condi), targetAddress: targetAddress, states:states, alarmName:alarmName, newConfig:newConfig}) === false? false : result;
});
return result;]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.DeleteCondition" ExportedBrowseName="1:DeleteCondition" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS" BrowseName="1:WEBMIMETHODS">
		<DisplayName Locale="en">WEBMIMETHODS</DisplayName>
		<Description Locale="en">WEBMIMETHODS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.DeleteCondition" BrowseName="1:DeleteCondition" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">DeleteCondition</DisplayName>
		<Description Locale="en">DeleteCondition</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <code><![CDATA[/**
 ** Removes the Node
 */
var address = request.postvalues.address;
Ua.findNode(address).result.remove();]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.EditCondition" ExportedBrowseName="1:EditCondition" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS" BrowseName="1:WEBMIMETHODS">
		<DisplayName Locale="en">WEBMIMETHODS</DisplayName>
		<Description Locale="en">WEBMIMETHODS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.EditCondition" BrowseName="1:EditCondition" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">EditCondition</DisplayName>
		<Description Locale="en">EditCondition</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <code><![CDATA[var address = request.postvalues.address;
var config = request.postvalues.config;
var isDiscrete = request.postvalues.isDiscrete === "true";;
var parentAddress = request.postvalues.parentAddress;
var states = request.postvalues.states;
/**
 ** redirect to serverscript
 */
call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.EditCondition",{address: address, config: config, isDiscrete: isDiscrete, parentAddress: parentAddress, states:states})]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.GetAlarmCategories" ExportedBrowseName="1:GetAlarmCategories" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS" BrowseName="1:WEBMIMETHODS">
		<DisplayName Locale="en">WEBMIMETHODS</DisplayName>
		<Description Locale="en">WEBMIMETHODS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.GetAlarmCategories" BrowseName="1:GetAlarmCategories" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">GetAlarmCategories</DisplayName>
		<Description Locale="en">GetAlarmCategories</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>owner</runcontext>
  </metadata>
  <code><![CDATA[/**
 ** returns the available alarm categories (Error, Warning, Information)
 */
var nodeobj = Ua.findNode("AGENT.ALARMING.Categories");
var ret = nodeobj.result.browse({
	   typeDefinition: "ObjectTypes.ATVISE.AlarmConditionCategory",
}).result;
var liste = [];
ret.forEach(cat => {
	liste.push({text:cat.node.browseName.name, value: cat.node.browseName.name})
});

return liste;]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.GetAlarmScripts" ExportedBrowseName="1:GetAlarmScripts" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS" BrowseName="1:WEBMIMETHODS">
		<DisplayName Locale="en">WEBMIMETHODS</DisplayName>
		<Description Locale="en">WEBMIMETHODS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.GetAlarmScripts" BrowseName="1:GetAlarmScripts" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">GetAlarmScripts</DisplayName>
		<Description Locale="en">GetAlarmScripts</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>owner</runcontext>
  </metadata>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <code><![CDATA[/**
 ** return 1: alarm modify scripts or 2: alarm prevention scripts
 */
var type = request.postvalues.type;

var nodeobj = Ua.findNode("AGENT.ALARMING.Scripts");
var ret = nodeobj.result.browse({
	   typeDefinition: type, 
}).result;

var liste = [];
ret.forEach(script => {
	liste.push({text: script.node.browseName.name, value: script.node.nodeId.address});
});

return liste;]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.GetConditions" ExportedBrowseName="1:GetConditions" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS" BrowseName="1:WEBMIMETHODS">
		<DisplayName Locale="en">WEBMIMETHODS</DisplayName>
		<Description Locale="en">WEBMIMETHODS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.GetConditions" BrowseName="1:GetConditions" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">GetConditions</DisplayName>
		<Description Locale="en">GetConditions</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>owner</runcontext>
  </metadata>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <code><![CDATA[var node = Ua.findNode(request.postvalues.address);

var data = [];
var isDiscrete = false;
var justOneConfig = request.postvalues.justOneConfig === "true";
if(justOneConfig){
	return groupAllSubNodes(request.postvalues.address);
}

/**
 ** Funktion for browse
 **/
function browseNodes(typeDefinition) {
    return node.result.browse({
        nodeClass: Ua.NodeClass.OBJECT,
        typeDefinition: typeDefinition,
        recursive: true
    }).result;
}

/**
 ** Get isDiscrete
 **/
var result = browseNodes("ObjectTypes.ATVISE.AlarmConditionControl.Discrete");
if (result.length === 0) {
    result = browseNodes("ObjectTypes.ATVISE.AlarmConditionControl.Discrete.Retrigger");
    isDiscrete = result.length > 0;
    if (result.length === 0) {
        result = browseNodes("ObjectTypes.ATVISE.AlarmConditionControl.Limit");
    }
} else {
    isDiscrete = true;
}

buildDataForTreeView(result);

/**
 ** group all nodes under the alarm condition by their name
 **/
function groupAllSubNodes(address){
	const all = Ua.findNode(address).result.browse({}).result;
	var grouped = all.reduce((acc, item) => {
		if(item.node.nodeId.address.indexOf("AGENT.ALARMING") >= 0){
			acc["category"] = item.node.browseName.name;
		}else{
			acc[item.node.browseName.name] = item.node.value;
		}
		
		if(acc.category === undefined || !("category" in acc)){ // if no category is assigned return empty string for category
			acc.category = "";
		}		
		return acc;
	}, {});
	return grouped;
}

/**
 ** Funktion to swap <,>,<=,>= - html table cant handle
 **/
function swapGtLt(input){
	if(input === "<") return "&lt;";
	if(input === ">") return "&gt;";
	if(input === "<=") return "&lt;=";
	if(input === ">=") return "&gt;=";
}

/**
 ** parse xml to relative form .folder.datapoint
 **/
function xmlToPointNotation(xmlString) {
    const nameRegex = /<Name>(.*?)<\/Name>/g;
    let match;
    let result = "";
    while ((match = nameRegex.exec(xmlString)) !== null) {
        result += `.${match[1]}`;
    }
    return result;
}

/**
 ** check if xml, if address and turn it into normal string
 **/
function rightFormat(input){
	if(!input) return input;
	if(input.toString().trim().startsWith("<") && input.toString().trim().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(input.toString().trim())){ //test auf XML
		return xmlToPointNotation(input);	
	}else if(input.toString().startsWith("ns=1;s")){
		return input.replace("ns=1;s=", "");	
	}else{
		return input;	
	}
}

/**
 ** create config for treeview
 **/
function buildDataForTreeView(result){
	result.forEach(alarm => {
		var grouped = groupAllSubNodes(alarm.node.nodeaddr);
		const baseData = {
			category: grouped["category"],
			name: alarm.node.browseName.name,
			type: alarm.node.typeDefinition.value.split('.').pop(),
			activeText: grouped["active_message"][""],
			inactiveText: grouped["inactive_message"][""],
			delay_on: grouped["on_delay"],
			delay_off: grouped["off_delay"],
			prevention_script: grouped["prevention_script"],
			modification_script: grouped["modify_script"],
			address: alarm.node.nodeaddr,
			explicit_acknowledgement: grouped["explicit_acknowledgement"],
			max_time_shelved: grouped["max_time_shelved"],
		};
		
		if (isDiscrete) {
			data.push({
				...baseData,
				value_string:grouped["value_compare"] + rightFormat(grouped["value"]),
				value: grouped["value"],
				value_compare: grouped["value_compare"]
			});
		} else {
			data.push({
				...baseData,
				value_string: swapGtLt(grouped["lower_limit_compare"]) + rightFormat(grouped["lower_limit"]) +  swapGtLt(grouped["upper_limit_compare"]) + rightFormat(grouped["upper_limit"]),
				lower_limit_compare: grouped["lower_limit_compare"],
				lower_limit: grouped["lower_limit"],
				upper_limit_compare: grouped["upper_limit_compare"],
				upper_limit: grouped["upper_limit"]
			});
		}
});
}

return data;]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.GetConditionType" ExportedBrowseName="1:GetConditionType" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS" BrowseName="1:WEBMIMETHODS">
		<DisplayName Locale="en">WEBMIMETHODS</DisplayName>
		<Description Locale="en">WEBMIMETHODS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.GetConditionType" BrowseName="1:GetConditionType" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">GetConditionType</DisplayName>
		<Description Locale="en">GetConditionType</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <code><![CDATA[/**
 ** redirect to serverscript
 */
return call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.GetConditionType",{address: request.postvalues.address});]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.HasAlarmConfiguration" ExportedBrowseName="1:HasAlarmConfiguration" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS" BrowseName="1:WEBMIMETHODS">
		<DisplayName Locale="en">WEBMIMETHODS</DisplayName>
		<Description Locale="en">WEBMIMETHODS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS.HasAlarmConfiguration" BrowseName="1:HasAlarmConfiguration" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">HasAlarmConfiguration</DisplayName>
		<Description Locale="en">HasAlarmConfiguration</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.WEBMIMETHODS</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
    <owner>root</owner>
    <runcontext>caller</runcontext>
  </metadata>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <code><![CDATA[/**
 ** redirect to serverscript
 */
return call("SYSTEM.LIBRARY.PROJECT.SERVERSCRIPTS.alarmmanager.HasAlarmConfiguration",{address: request.postvalues.address});]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=AGENT" BrowseName="1:AGENT">
		<DisplayName Locale="en">AGENT</DisplayName>
		<Description Locale="en">AGENT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=ObjectTypes.ATVISE.Server.Local</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=AGENT.DISPLAYS.MAIN.Alarm Manager" ExportedBrowseName="1:Alarm Manager" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.DISPLAYS" BrowseName="1:DISPLAYS">
		<DisplayName Locale="en">DISPLAYS</DisplayName>
		<Description Locale="en">DISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.DISPLAYS.MAIN" BrowseName="1:MAIN">
		<DisplayName Locale="en">MAIN</DisplayName>
		<Description Locale="en">MAIN</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.DISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.DISPLAYS.MAIN.Alarm Manager" BrowseName="1:Alarm Manager" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">Alarm Manager</DisplayName>
		<Description Locale="en">Alarm Manager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.DISPLAYS.MAIN</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="890" version="1.2" width="1675" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <metadata>
  <atv:gridconfig enabled="false" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="false" height="10" width="10"/>
 </metadata>
 <script atv:desc="" atv:name="" type="text/ecmascript"/>
 <svg atv:refpx="837.5" atv:refpy="445" height="890" id="id_0" width="1675" x="0" xlink:href="SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.alarm_manager" y="0"/>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.add_alarm" ExportedBrowseName="1:add_alarm" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS" BrowseName="1:OBJECTDISPLAYS">
		<DisplayName Locale="en">OBJECTDISPLAYS</DisplayName>
		<Description Locale="en">OBJECTDISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup" BrowseName="1:popup">
		<DisplayName Locale="en">popup</DisplayName>
		<Description Locale="en">popup</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.add_alarm" BrowseName="1:add_alarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">add_alarm</DisplayName>
		<Description Locale="en">add_alarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="280" version="1.2" width="500" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <desc>Dialog to add a new alarm configuration and condition.</desc>
 <title>Add Dialog</title>
 <metadata>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="address" name="address" substitute="$ADDRESS$" valuetype="string"/>
  <atv:parameter behavior="mandatory" defaultvalue="false" desc="alarmIsThere" name="alarmIsThere" valuetype="bool"/>
  <atv:parameter behavior="mandatory" defaultvalue="null" desc="conditionType" name="conditionType" valuetype="string"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <svg atv:refpx="340" atv:refpy="245.701" height="30" id="btn_add" transform="matrix(1.5,0,0,1.3333,0,0)" width="80" x="186.667" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="165.004">
  <atv:argument name="label" value="T{Add}"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.6667,0,0,0.75,0,0)" x="50" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.6667,0,0,0.75,0,0)" width="116"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.6667,0,0,0.75,0,0)" width="120"/>
 </svg>
 <svg atv:refpx="160" atv:refpy="244.559" height="30" id="btn_cancel" transform="matrix(1.5,0,0,1.3333,0,0)" width="80" x="66.667" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="165.004">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="4"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.6667,0,0,0.75,0,0)" x="60" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.4,0,0,0.45,0,0)" x="89.833" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.6667,0,0,0.75,0,0)" x="50" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.6667,0,0,0.75,0,0)" width="116"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.6667,0,0,0.75,0,0)" width="118"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.6667,0,0,0.75,0,0)" width="120"/>
 </svg>
 <svg atv:refpx="380" atv:refpy="40.001" height="30" id="name_conf" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="224" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="15">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite id="input_label" transform="matrix(0.8,0,0,0.75,0,0)" x="192.055" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
 </svg>
 <svg atv:refpx="380" atv:refpy="100.002" height="30" id="combobox_conditiontype" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="224" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="60.002">
  <atv:argument name="text1" value="T{Discrete}"/>
  <atv:argument name="text1value" value="Discrete"/>
  <atv:argument name="text2" value="T{Discrete Retrigger}"/>
  <atv:argument name="text2value" value="Retrigger"/>
  <atv:argument name="text3" value="T{Limit}"/>
  <atv:argument name="text3value" value="Limit"/>
  <atv:argument name="tabIndex" value="2"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" x="175" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.8,0,0,0.75,0,0)" x="175" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" x="175" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.8,0,0,0.75,0,0)" x="165.5" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="168"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="168"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
 </svg>
 <svg atv:refpx="380" atv:refpy="160.004" height="30" id="name_condition" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="224" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="105.003">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="tabIndex" value="3"/>
  <atv:overwrite id="input_label" transform="matrix(0.8,0,0,0.75,0,0)" x="192.055" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
 </svg>
 <text atv:refpx="127.5" atv:refpy="40.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_4" x="25" y="46.5">T{Alarm Configuration Name}:</text>
 <text atv:refpx="86" atv:refpy="98.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_5" x="25" y="104.5">T{Condition type}:</text>
 <text atv:refpx="89.809" atv:refpy="160.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_8" x="24.5" y="166.5">T{Condition name}:</text>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var address = webMI.query.address;
var alarmName = webMI.query.alarmName !== "null" ? webMI.query.alarmName : null;
var conditionType = webMI.query.conditionType !== "null" ? webMI.query.conditionType : null;
var conditionName = null;
var newConfig;
var existingConditions = [];

webMI.data.call("GetConditions", {address: address}, function(e){
	for(var i = 0; i < e.length; i++){
		existingConditions.push(e[i].name);
	}
});

/**
 ** if on selected node is already a alarmconfiguration the get inserted in the fields
 **/
if (alarmName) {
	webMI.trigger.fire("setValue", alarmName, "name_conf");
	webMI.trigger.fire("com.atvise.setActive", false, "name_conf");
	if (conditionType) {
		webMI.trigger.fire("setSelectedItem", conditionType, "combobox_conditiontype");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_conditiontype");
	}
	newConfig = false;
} else {
	newConfig = true;
}

/**
 ** Function checks with regex
 **/
function checkName(input) {
	// RegEx to check the allowed characters: A-Z, a-z, 0-9, -, ., _
	const regex = /^[A-Za-z0-9\-._]+$/;
	return regex.test(input);
}

/**
 ** checks the input for configuration name
 **/
webMI.trigger.connect("valuechanged", function (e) {
	e.value = webMI.secureString(e.value);
	if (checkName(e.value)) {
		webMI.trigger.fire("com.atvise.setActive", true, "btn_add");
		alarmName = e.value;
		if (webMI.gfx.getStroke("name_conf") !== null) {
			webMI.gfx.setStroke("name_conf", null);
		}
	} else {
		webMI.gfx.setStroke("name_conf", "#ff0000");
		conditionName = null;
	}
}, "name_conf");

/**
 ** safes the selected condition type
 **/
webMI.trigger.connect("valuechanged", function (e) {
	conditionType = e.value;
}, "combobox_conditiontype");

/**
 ** checks the input for condition name
 **/
webMI.trigger.connect("valuechanged", function (e) {
	e.value = webMI.secureString(e.value);
	if(existingConditions.indexOf(e.value) >= 0){
		webMI.gfx.setStroke("name_condition", "#ff0000");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_add");
	} else {
		if (checkName(e.value)) {
			conditionName = e.value;
			webMI.trigger.fire("com.atvise.setActive", true, "btn_add");
			if (webMI.gfx.getStroke("name_condition") !== null) {
				webMI.gfx.setStroke("name_condition", null);
			}
		} else {
			webMI.trigger.fire("com.atvise.setActive", false, "btn_add");
			webMI.gfx.setStroke("name_condition", "#ff0000");
			conditionName = null;
		}
	}
}, "name_condition");

/**
 ** Click on Add button
 **/
webMI.trigger.connect("clicked", function (e) {
	if (conditionName === null || alarmName === null || conditionType === null) {
		alert("Fehler bei der Configuration - Alle Felder müssen beschrieben sein!");
	} else {
		webMI.query.name = conditionName;
		webMI.query.currLocation = address;
		webMI.query.conditionType = conditionType;
		webMI.query.triggerName = "reloadAtCurrLocation";
		webMI.query.alarmName = alarmName;
		webMI.query.isMod = false;
		webMI.query.isDiscrete = conditionType === "Discrete" || conditionType === "Retrigger";
		webMI.query.newConfig = newConfig;
		webMI.display.openWindow({
			display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.edit_alarm",
			height: 740, width: 1280, remember: true,
			modal: true, resizable: false, movable: true,
			scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
		});
	}
}, "btn_add");

/**
 ** click on cancle button
 **/
webMI.trigger.connect("clicked", function (e) {
	webMI.display.closeWindow()
}, "btn_cancel");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.delete_alarm" ExportedBrowseName="1:delete_alarm" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS" BrowseName="1:OBJECTDISPLAYS">
		<DisplayName Locale="en">OBJECTDISPLAYS</DisplayName>
		<Description Locale="en">OBJECTDISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup" BrowseName="1:popup">
		<DisplayName Locale="en">popup</DisplayName>
		<Description Locale="en">popup</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.delete_alarm" BrowseName="1:delete_alarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">delete_alarm</DisplayName>
		<Description Locale="en">delete_alarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="290" version="1.2" width="600" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <desc>Dialog to delete an alarm condition.</desc>
 <title>Delete Dialog</title>
 <defs/>
 <metadata>
  <atv:parameter behavior="mandatory" defaultvalue="T{Title}" desc="title" name="dialogTitle" substitute="$TITLE$" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" defaultvalue="T{Message}" desc="message line 1" name="dialogMessageLine1" substitute="$MESSAGE1$" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" defaultvalue="T{Message}" desc="message line 2" name="dialogMessageLine2" substitute="$MESSAGE2$" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="trigger name" name="triggerName" substitute="$T$" valuetype="string"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <text atv:refpx="273" atv:refpy="26" fill="#575757" font-family="Arial" font-size="20" id="id_1" text-anchor="middle" x="300" y="33.5">$TITLE$</text>
 <svg atv:refpx="510" atv:refpy="265.696" height="30" id="btn_delete" transform="matrix(1.75,0,0,1.3333,0,0)" width="80" x="251.429" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="180">
  <atv:argument name="label" value="T{Delete}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:overwrite height="38" id="id_6" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="31.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="16.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="24.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="34.625"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="13.292"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5714,0,0,0.75,0,0)" x="60" y="10"/>
  <atv:overwrite height="36" id="button_stroke" transform="matrix(0.5714,0,0,0.75,0,0)" width="136"/>
  <atv:overwrite height="38" id="button_bg" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite height="40" id="outer_frame" transform="matrix(0.5714,0,0,0.75,0,0)" width="140"/>
 </svg>
 <svg atv:refpx="350.001" atv:refpy="264.554" height="30" id="btn_cancel" transform="matrix(1.75,0,0,1.3333,0,0)" width="80" x="160" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="180">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite height="38" id="id_6" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="31.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="16.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5714,0,0,0.75,0,0)" x="70" y="24.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="34.625"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3429,0,0,0.45,0,0)" x="106.5" y="13.292"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5714,0,0,0.75,0,0)" x="60" y="10"/>
  <atv:overwrite height="36" id="button_stroke" transform="matrix(0.5714,0,0,0.75,0,0)" width="136"/>
  <atv:overwrite height="38" id="button_bg" transform="matrix(0.5714,0,0,0.75,0,0)" width="138"/>
  <atv:overwrite height="40" id="outer_frame" transform="matrix(0.5714,0,0,0.75,0,0)" width="140"/>
 </svg>
 <text atv:refpx="283.578" atv:refpy="112.194" fill="#575757" font-family="Arial" font-size="20" id="id_3" text-anchor="middle" x="300" y="119.694">$MESSAGE1$</text>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[/**
 ** button delete click
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire(webMI.query.triggerName);
	webMI.display.closeWindow();
}, "btn_delete");

/**
 ** button cancle click
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.display.closeWindow();
}, "btn_cancel");]]]]><![CDATA[></script>
 <text atv:refpx="299.306" atv:refpy="152.194" fill="#575757" font-family="Arial" font-size="20" id="id_0" text-anchor="middle" x="299.306" y="159.694">$MESSAGE2$</text>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.edit_alarm" ExportedBrowseName="1:edit_alarm" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS" BrowseName="1:OBJECTDISPLAYS">
		<DisplayName Locale="en">OBJECTDISPLAYS</DisplayName>
		<Description Locale="en">OBJECTDISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup" BrowseName="1:popup">
		<DisplayName Locale="en">popup</DisplayName>
		<Description Locale="en">popup</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.edit_alarm" BrowseName="1:edit_alarm" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">edit_alarm</DisplayName>
		<Description Locale="en">edit_alarm</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="720" version="1.2" width="1280" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <desc>Dialog to edit alarm conditions.</desc>
 <title>Edit Dialog</title>
 <metadata>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="Name der Alarmconfig" name="name" substitute="" valuetype="string"/>
  <atv:parameter behavior="mandatory" defaultvalue="" desc="Addresse der Config" name="address" substitute="" valuetype="string"/>
  <atv:parameter behavior="mandatory" defaultvalue="true" name="isMod" valuetype="bool"/>
  <atv:parameter behavior="mandatory" defaultvalue="true" name="isDiskrete" valuetype="bool"/>
  <atv:parameter behavior="optional" defaultvalue="SYSTEM.GLOBALS.atvFillColor" desc="$FILLCOLOR$" name="$FILLCOLOR$" substitute="$FILLCOLOR$" valuetype="global"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="5" width="5"/>
 </metadata>
 <rect atv:refpx="640.5" atv:refpy="40.5" fill="$FILLCOLOR$" height="80" id="id_14" rx="0" ry="0" stroke="#000000" stroke-width="1" width="1280" x="0.5" y="0.5"/>
 <svg atv:refpx="395.208" atv:refpy="240.5" height="30" id="active_message" transform="matrix(2.8094,0,0,1.3333,0,0)" width="160" x="60.691" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="165.375">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="allowDirectInput" value="Yes"/>
  <atv:argument name="tabIndex" value="11"/>
  <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
  <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
  <atv:overwrite id="input_label" transform="matrix(0.3559,0,0,0.75,0,0)" x="441.559" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.3559,0,0,0.75,0,0)" width="441.504"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.3559,0,0,0.75,0,0)" width="445.504"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.3559,0,0,0.75,0,0)" width="441.504"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.3559,0,0,0.75,0,0)" width="447.504"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.3559,0,0,0.75,0,0)" width="449.504"/>
 </svg>
 <svg atv:refpx="1015.456" atv:refpy="240.5" height="30" id="inactive_message" transform="matrix(2.8125,0,0,1.3333,0,0)" width="160" x="281.066" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="165.375">
  <atv:argument name="validation" value="String"/>
  <atv:argument name="allowDirectInput" value="Yes"/>
  <atv:argument name="tabIndex" value="12"/>
  <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
  <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
  <atv:overwrite id="input_label" transform="matrix(0.3556,0,0,0.75,0,0)" x="442.055" y="24.464"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.3556,0,0,0.75,0,0)" width="442"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.3556,0,0,0.75,0,0)" width="446"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.3556,0,0,0.75,0,0)" width="442"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.3556,0,0,0.75,0,0)" width="448"/>
  <atv:overwrite height="39.999" id="input_border" transform="matrix(0.3556,0,0,0.75,0,0)" width="450"/>
 </svg>
 <svg atv:refpx="894.999" atv:refpy="420.008" height="30" id="explicit_acknowledgement" transform="matrix(0.1875,0,0,1,0,0)" width="160" x="4693.333" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.checkbox" y="405">
  <atv:argument name="label" value=""/>
  <atv:argument name="tabIndex" value="18"/>
  <atv:overwrite id="checkbox_item" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_symbol" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="blinking_frame" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="focus_frame" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_bg" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_frame" transform="matrix(5.3333,0,0,1,0,0)"/>
  <atv:overwrite id="checkbox_stroke" transform="matrix(5.3333,0,0,1,0,0)"/>
 </svg>
 <svg atv:refpx="255.147" atv:refpy="120.5" height="30" id="category" transform="matrix(1.0579,0,0,1.3333,0,0)" width="160" x="161.169" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="75.375">
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.9453,0,0,0.75,0,0)" width="165.264"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.9453,0,0,0.75,0,0)" x="144.264" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.9453,0,0,0.75,0,0)" x="144.264" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.9453,0,0,0.75,0,0)" x="144.264" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.9453,0,0,0.75,0,0)" x="134.764" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.9453,0,0,0.75,0,0)" width="137.264"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.9453,0,0,0.75,0,0)" width="137.264"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.9453,0,0,0.75,0,0)" width="167.264"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.9453,0,0,0.75,0,0)" width="169.264"/>
 </svg>
 <svg atv:refpx="985.001" atv:refpy="360.01" height="30" id="modify_script" transform="matrix(2.4375,0,0,1.3333,0,0)" width="160" x="324.103" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="255.006">
  <atv:argument name="tabIndex" value="16"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="386"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.4103,0,0,0.75,0,0)" x="355.5" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.4103,0,0,0.75,0,0)" width="388"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.4103,0,0,0.75,0,0)" width="390"/>
 </svg>
 <svg atv:refpx="985.491" atv:refpy="300.5" height="30" id="prevention_script" transform="matrix(2.4375,0,0,1.3333,0,0)" width="160" x="324.306" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="210.375">
  <atv:argument name="tabIndex" value="14"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="386"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="id_7" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="10.999"/>
  <atv:overwrite id="button_bg" transform="matrix(0.4103,0,0,0.75,0,0)" x="365" y="9.999"/>
  <atv:overwrite id="combobox_label" transform="matrix(0.4103,0,0,0.75,0,0)" x="355.5" y="24.499"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(0.4103,0,0,0.75,0,0)" width="358"/>
  <atv:overwrite height="37.999" id="id_1" transform="matrix(0.4103,0,0,0.75,0,0)" width="388"/>
  <atv:overwrite height="39.999" id="id_0" transform="matrix(0.4103,0,0,0.75,0,0)" width="390"/>
 </svg>
 <svg atv:refpx="220.5" atv:refpy="300.5" height="30" id="max_time_shelved" transform="matrix(0.625,0,0,1.3333,0,0)" width="160" x="272.8" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_value" y="210.375">
  <atv:argument name="min" value="0"/>
  <atv:argument name="tooltip" value="T{Value in seconds}"/>
  <atv:argument name="tabIndex" value="13"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite id="clickarea_dec" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="clickarea_inc" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="input_label" transform="matrix(1.6,0,0,0.75,0,0)" x="65.5" y="25.249"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="37.999" id="id_0" transform="matrix(1.6,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="bg" transform="matrix(1.6,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="220.5" atv:refpy="360.5" height="30" id="on_delay" transform="matrix(0.625,0,0,1.3333,0,0)" width="160" x="272.8" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_value" y="255.375">
  <atv:argument name="min" value="0"/>
  <atv:argument name="tooltip" value="T{Value in seconds}"/>
  <atv:argument name="tabIndex" value="15"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite id="clickarea_dec" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="clickarea_inc" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="input_label" transform="matrix(1.6,0,0,0.75,0,0)" x="65.5" y="25.249"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="37.999" id="id_0" transform="matrix(1.6,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="bg" transform="matrix(1.6,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="220.5" atv:refpy="420.5" height="30" id="off_delay" transform="matrix(0.625,0,0,1.3333,0,0)" width="160" x="272.8" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_value" y="300.375">
  <atv:argument name="min" value="0"/>
  <atv:argument name="tooltip" value="T{Value in seconds}"/>
  <atv:argument name="tabIndex" value="17"/>
  <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite id="clickarea_dec" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="clickarea_inc" transform="matrix(1.6,0,0,0.75,-96,3.7497)"/>
  <atv:overwrite id="input_label" transform="matrix(1.6,0,0,0.75,0,0)" x="65.5" y="25.249"/>
  <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="31.999" id="input_bg" transform="matrix(1.6,0,0,0.75,0,0)" width="68"/>
  <atv:overwrite height="37.999" id="id_0" transform="matrix(1.6,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="bg" transform="matrix(1.6,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="1160.525" atv:refpy="660.799" height="30" id="btn_safe" transform="matrix(2,0,0,1.3531,0,0)" width="80" x="540.25" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="473.357">
  <atv:argument name="label" value="T{Save}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="21"/>
  <atv:overwrite height="38.593" id="id_6" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="31.796"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="16.796"/>
  <atv:overwrite id="button_label" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="24.796"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="35.119"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="13.786"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5,0,0,0.739,0,0)" x="70" y="10.296"/>
  <atv:overwrite height="36.593" id="button_stroke" transform="matrix(0.5,0,0,0.739,0,0)" width="156"/>
  <atv:overwrite height="38.593" id="button_bg" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite height="40.593" id="outer_frame" transform="matrix(0.5,0,0,0.739,0,0)" width="160"/>
 </svg>
 <svg atv:refpx="980" atv:refpy="660.297" height="30" id="btn_cancel" transform="matrix(2,0,0,1.3531,0,0)" width="80" x="450" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="472.988">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="19"/>
  <atv:overwrite height="38.593" id="id_6" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="31.796"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="16.796"/>
  <atv:overwrite id="button_label" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="24.796"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="35.12"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="13.786"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5,0,0,0.739,0,0)" x="70" y="10.296"/>
  <atv:overwrite height="36.593" id="button_stroke" transform="matrix(0.5,0,0,0.739,0,0)" width="156"/>
  <atv:overwrite height="38.593" id="button_bg" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite height="40.593" id="outer_frame" transform="matrix(0.5,0,0,0.739,0,0)" width="160"/>
 </svg>
 <svg atv:refpx="1212.775" atv:refpy="300.47" height="30" id="btn_clear_prev" transform="matrix(0.6937,0,0,1.3333,0,0)" width="80" x="1708.108" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="210.375">
  <atv:argument name="label" value="T{Clear}"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite id="button_label_2" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(1.4414,0,0,0.75,0,0)" x="17.75" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(1.4414,0,0,0.75,0,0)" width="51.5"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(1.4414,0,0,0.75,0,0)" width="55.5"/>
 </svg>
 <svg atv:refpx="1212.751" atv:refpy="360.499" height="30" id="btn_clear_mod" transform="matrix(0.6937,0,0,1.3333,0,0)" width="80" x="1708.108" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="255.375">
  <atv:argument name="label" value="T{Clear}"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite id="button_label_2" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(1.4414,0,0,0.75,0,0)" x="27.75" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.8649,0,0,0.45,0,0)" x="36.083" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(1.4414,0,0,0.75,0,0)" x="17.75" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(1.4414,0,0,0.75,0,0)" width="51.5"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(1.4414,0,0,0.75,0,0)" width="53.5"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(1.4414,0,0,0.75,0,0)" width="55.5"/>
 </svg>
 <svg atv:refpx="1160.025" atv:refpy="660.3" height="30" id="btn_create" transform="matrix(2,0,0,1.3531,0,0)" width="80" x="540" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="472.988">
  <atv:argument name="label" value="T{Create}"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="tabIndex" value="20"/>
  <atv:overwrite height="38.593" id="id_6" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="31.796"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="16.796"/>
  <atv:overwrite id="button_label" transform="matrix(0.5,0,0,0.739,0,0)" x="80" y="24.796"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="35.12"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3,0,0,0.4434,0,0)" x="123.167" y="13.786"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5,0,0,0.739,0,0)" x="70" y="10.296"/>
  <atv:overwrite height="36.593" id="button_stroke" transform="matrix(0.5,0,0,0.739,0,0)" width="156"/>
  <atv:overwrite height="38.593" id="button_bg" transform="matrix(0.5,0,0,0.739,0,0)" width="158"/>
  <atv:overwrite height="40.593" id="outer_frame" transform="matrix(0.5,0,0,0.739,0,0)" width="160"/>
 </svg>
 <svg atv:refpx="50.5" atv:refpy="40.5" height="60" id="id_15" width="60" x="20.5" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Symbols.60x60.alarm" y="10.5"/>
 <text atv:refpx="156.5" atv:refpy="54" fill="$FONTCOLOR$" font-family="Arial" font-size="48" id="label_name" x="105.5" y="60">Name of Alarm</text>
 <text atv:refpx="1059.772" atv:refpy="60" fill="$FONTCOLOR$" font-family="Arial" font-size="22" id="id_13" x="1035" y="64.5">T{Type}:</text>
 <text atv:refpx="1171.5" atv:refpy="57" fill="$FONTCOLOR$" font-family="Arial" font-size="22" id="label_type" x="1104.5" y="64.5">Type of Alarm</text>
 <text atv:refpx="87.5" atv:refpy="119.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_18" x="45" y="125.5">T{Category}:</text>
 <text atv:refpx="101.5" atv:refpy="239.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_19" x="45" y="245.5">T{To active Text}:</text>
 <text atv:refpx="111" atv:refpy="299.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_21" x="45" y="305.5">T{Max. timeshelve}:</text>
 <text atv:refpx="86" atv:refpy="359.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_22" x="45" y="365.5">T{Delay on}:</text>
 <text atv:refpx="86" atv:refpy="419.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_23" x="45" y="425.5">T{Delay off}:</text>
 <text atv:refpx="706" atv:refpy="239.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_24" x="645" y="245.5">T{To inactive text}:</text>
 <text atv:refpx="713.5" atv:refpy="299.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_25" x="645" y="305.5">T{Prevention script}:</text>
 <text atv:refpx="719" atv:refpy="359.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_27" x="645" y="365.5">T{Modification script}:</text>
 <text atv:refpx="746" atv:refpy="418.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_29" x="645" y="424.5">T{Explicit Acknowledgement}:</text>
 <g atv:refpx="330" atv:refpy="180" id="group_discrete">
  <svg atv:refpx="519.979" atv:refpy="180.004" height="30" id="value" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="336" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="120.003">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="allowDirectInput" value="Yes"/>
   <atv:argument name="tabIndex" value="4"/>
   <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
   <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
   <atv:overwrite id="input_label" transform="matrix(0.8,0,0,0.75,0,0)" x="192.055" y="24.464"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="196"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="192"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8,0,0,0.75,0,0)" width="198"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8,0,0,0.75,0,0)" width="200"/>
  </svg>
  <svg atv:refpx="350" atv:refpy="180.004" height="30" id="value_compare" transform="matrix(0.375,0,0,1.3333,0,0)" width="160" x="853.333" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="120.003">
   <atv:argument name="text1" value="T{==}"/>
   <atv:argument name="text1value" value="=="/>
   <atv:argument name="text2" value="T{!=}"/>
   <atv:argument name="text2value" value="!="/>
   <atv:argument name="tabIndex" value="3"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(2,0,0,0.75,0,0)" width="76"/>
   <atv:overwrite id="button_stroke" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(2,0,0,0.75,0,0)" x="55" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(2,0,0,0.75,0,0)" x="45.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(2,0,0,0.75,0,0)" width="78"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(2,0,0,0.75,0,0)" width="80"/>
  </svg>
  <svg atv:refpx="235" atv:refpy="180.004" height="30" id="combobox_value" transform="matrix(0.8125,0,0,1.3333,0,0)" width="160" x="209.231" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="120.003">
   <atv:argument name="text1" value="T{Value}"/>
   <atv:argument name="text1value" value="Value"/>
   <atv:argument name="text2" value="T{Node absolute}"/>
   <atv:argument name="text2value" value="Node absolute"/>
   <atv:argument name="text3" value="T{Node relative}"/>
   <atv:argument name="text3value" value="Node relative"/>
   <atv:argument name="tabIndex" value="2"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.2308,0,0,0.75,0,0)" width="126"/>
   <atv:overwrite id="button_stroke" transform="matrix(1.2308,0,0,0.75,0,0)" x="105" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(1.2308,0,0,0.75,0,0)" x="105" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(1.2308,0,0,0.75,0,0)" x="105" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(1.2308,0,0,0.75,0,0)" x="95.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.2308,0,0,0.75,0,0)" width="98"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(1.2308,0,0,0.75,0,0)" width="98"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(1.2308,0,0,0.75,0,0)" width="128"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(1.2308,0,0,0.75,0,0)" width="130"/>
  </svg>
  <text atv:refpx="65.5" atv:refpy="179.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_30" x="45" y="185.5">T{Value}:</text>
  <svg atv:refpx="410" atv:refpy="180" height="30" id="nodeselect_discrete" transform="matrix(0.25,0,0,1.3333,0,0)" width="80" x="1600" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="120">
   <atv:argument name="label" value="T{...}"/>
   <atv:overwrite height="38" id="id_6" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite id="button_label_2" transform="matrix(4,0,0,0.75,0,0)" x="10" y="31.5"/>
   <atv:overwrite id="button_label_1" transform="matrix(4,0,0,0.75,0,0)" x="10" y="16.5"/>
   <atv:overwrite id="button_label" transform="matrix(4,0,0,0.75,0,0)" x="10" y="24.5"/>
   <atv:overwrite id="button_symbol_bottom" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="34.625"/>
   <atv:overwrite id="button_symbol_top" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="13.292"/>
   <atv:overwrite id="button_symbol" transform="matrix(4,0,0,0.75,0,0)" x="0" y="10"/>
   <atv:overwrite height="36" id="button_stroke" transform="matrix(4,0,0,0.75,0,0)" width="16"/>
   <atv:overwrite height="38" id="button_bg" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite height="40" id="outer_frame" transform="matrix(4,0,0,0.75,0,0)" width="20"/>
  </svg>
 </g>
 <g atv:refpx="640" atv:refpy="180" id="group_limit" transform="matrix(1,0,0,1,0,-340)">
  <svg atv:refpx="1173.781" atv:refpy="569.038" height="30" id="upper_limit" transform="matrix(1.125,0,0,1.3333,0,0)" width="160" x="942.222" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="375.009">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="tabIndex" value="10"/>
   <atv:overwrite id="input_label" transform="matrix(0.8889,0,0,0.75,0,0)" x="172.055" y="24.465"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="176"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8889,0,0,0.75,0,0)" width="178"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8889,0,0,0.75,0,0)" width="180"/>
  </svg>
  <svg atv:refpx="350" atv:refpy="-29.993" height="30" id="lower_limit_compare" transform="matrix(0.375,0,0,1.3333,0,0)" width="160" x="853.333" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument name="text1" value="T{>}"/>
   <atv:argument name="text1value" value=">"/>
   <atv:argument name="text2" value="T{>=}"/>
   <atv:argument name="text2value" value=">="/>
   <atv:argument name="tabIndex" value="6"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(2.6667,0,0,0.75,0,0)" width="56"/>
   <atv:overwrite id="button_stroke" transform="matrix(2.6667,0,0,0.75,0,0)" x="35" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(2.6667,0,0,0.75,0,0)" x="35" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(2.6667,0,0,0.75,0,0)" x="35" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(2.6667,0,0,0.75,0,0)" x="25.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(2.6667,0,0,0.75,0,0)" width="28"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(2.6667,0,0,0.75,0,0)" width="28"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(2.6667,0,0,0.75,0,0)" width="58"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(2.6667,0,0,0.75,0,0)" width="60"/>
  </svg>
  <svg atv:refpx="982" atv:refpy="240" height="30" id="upper_limit_compare" transform="matrix(0.5,0,0,1.3333,0,0)" width="160" x="1880" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument value="T{&lt;}" name="text1"/>
   <atv:argument value="&lt;" name="text1value"/>
   <atv:argument value="T{&lt;=}" name="text2"/>
   <atv:argument value="&lt;=" name="text2value"/>
   <atv:argument name="tabIndex" value="9"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(2,0,0,0.75,0,0)" width="76"/>
   <atv:overwrite id="button_stroke" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(2,0,0,0.75,0,0)" x="55" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(2,0,0,0.75,0,0)" x="55" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(2,0,0,0.75,0,0)" x="45.5" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(2,0,0,0.75,0,0)" width="48"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(2,0,0,0.75,0,0)" width="78"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(2,0,0,0.75,0,0)" width="80"/>
  </svg>
  <svg atv:refpx="545.423" atv:refpy="-15.961" height="30" id="lower_limit" transform="matrix(1.25,0,0,1.3333,0,0)" width="160" x="336" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="375.009">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="tabIndex" value="7"/>
   <atv:overwrite id="input_label" transform="matrix(0.8889,0,0,0.75,0,0)" x="172.055" y="24.465"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.8889,0,0,0.75,0,0)" width="176"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.8889,0,0,0.75,0,0)" width="172"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.8889,0,0,0.75,0,0)" width="178"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.8889,0,0,0.75,0,0)" width="180"/>
  </svg>
  <svg atv:refpx="235.53" atv:refpy="190.005" height="30" id="combobox_lower_limit" transform="matrix(0.8188,0,0,1.3333,0,0)" width="160" x="207.621" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument name="text1" value="T{Value}"/>
   <atv:argument name="text1value" value="Value"/>
   <atv:argument name="text2" value="T{Node absolute}"/>
   <atv:argument name="text2value" value="Node absolute"/>
   <atv:argument name="text3" value="T{Node relative}"/>
   <atv:argument name="text3value" value="Node relative"/>
   <atv:argument name="tabIndex" value="5"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.2213,0,0,0.75,0,0)" width="127.008"/>
   <atv:overwrite id="button_stroke" transform="matrix(1.2213,0,0,0.75,0,0)" x="106.008" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(1.2213,0,0,0.75,0,0)" x="106.008" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(1.2213,0,0,0.75,0,0)" x="106.008" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(1.2213,0,0,0.75,0,0)" x="96.508" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.2213,0,0,0.75,0,0)" width="99.008"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(1.2213,0,0,0.75,0,0)" width="99.008"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(1.2213,0,0,0.75,0,0)" width="129.008"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(1.2213,0,0,0.75,0,0)" width="131.008"/>
  </svg>
  <svg atv:refpx="853.969" atv:refpy="190.005" height="30" id="combobox_upper_limit" transform="matrix(0.8004,0,0,1.3333,0,0)" width="160" x="987.006" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" y="375.009">
   <atv:argument name="text1" value="T{Value}"/>
   <atv:argument name="text1value" value="Value"/>
   <atv:argument name="text2" value="T{Node absolute}"/>
   <atv:argument name="text2value" value="Node absolute"/>
   <atv:argument name="text3" value="T{Node relative}"/>
   <atv:argument name="text3value" value="Node relative"/>
   <atv:argument name="tabIndex" value="8"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(1.2494,0,0,0.75,0,0)" width="124.064"/>
   <atv:overwrite id="button_stroke" transform="matrix(1.2494,0,0,0.75,0,0)" x="103.064" y="9.999"/>
   <atv:overwrite id="id_7" transform="matrix(1.2494,0,0,0.75,0,0)" x="103.064" y="10.999"/>
   <atv:overwrite id="button_bg" transform="matrix(1.2494,0,0,0.75,0,0)" x="103.064" y="9.999"/>
   <atv:overwrite id="combobox_label" transform="matrix(1.2494,0,0,0.75,0,0)" x="93.564" y="24.499"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(1.2494,0,0,0.75,0,0)" width="96.064"/>
   <atv:overwrite height="31.999" id="combobox_bg" transform="matrix(1.2494,0,0,0.75,0,0)" width="96.064"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(1.2494,0,0,0.75,0,0)" width="126.064"/>
   <atv:overwrite height="39.999" id="id_0" transform="matrix(1.2494,0,0,0.75,0,0)" width="128.064"/>
  </svg>
  <text atv:refpx="668.006" atv:refpy="519.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_32" x="645" y="525.5">T{To Value}:</text>
  <text atv:refpx="78.126" atv:refpy="519.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_33" x="45" y="525.5">T{From Value}:</text>
  <svg atv:refpx="410" atv:refpy="520" height="30" id="nodeselect_lower" transform="matrix(0.25,0,0,1.3333,0,0)" width="80" x="1584" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="375.009">
   <atv:argument name="label" value="T{...}"/>
   <atv:overwrite height="37.999" id="id_6" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite id="button_label_2" transform="matrix(4,0,0,0.75,0,0)" x="10" y="31.499"/>
   <atv:overwrite id="button_label_1" transform="matrix(4,0,0,0.75,0,0)" x="10" y="16.499"/>
   <atv:overwrite id="button_label" transform="matrix(4,0,0,0.75,0,0)" x="10" y="24.499"/>
   <atv:overwrite id="button_symbol_bottom" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="34.624"/>
   <atv:overwrite id="button_symbol_top" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="13.291"/>
   <atv:overwrite id="button_symbol" transform="matrix(4,0,0,0.75,0,0)" x="0" y="9.999"/>
   <atv:overwrite height="35.999" id="button_stroke" transform="matrix(4,0,0,0.75,0,0)" width="16"/>
   <atv:overwrite height="37.999" id="button_bg" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite height="39.999" id="outer_frame" transform="matrix(4,0,0,0.75,0,0)" width="20"/>
  </svg>
  <svg atv:refpx="1050" atv:refpy="520" height="30" id="nodeselect_upper" transform="matrix(0.25,0,0,1.3333,0,0)" width="80" x="4160" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="375.009">
   <atv:argument name="label" value="T{...}"/>
   <atv:overwrite height="37.999" id="id_6" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite id="button_label_2" transform="matrix(4,0,0,0.75,0,0)" x="10" y="31.499"/>
   <atv:overwrite id="button_label_1" transform="matrix(4,0,0,0.75,0,0)" x="10" y="16.499"/>
   <atv:overwrite id="button_label" transform="matrix(4,0,0,0.75,0,0)" x="10" y="24.499"/>
   <atv:overwrite id="button_symbol_bottom" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="34.624"/>
   <atv:overwrite id="button_symbol_top" transform="matrix(2.4,0,0,0.45,0,0)" x="6.5" y="13.291"/>
   <atv:overwrite id="button_symbol" transform="matrix(4,0,0,0.75,0,0)" x="0" y="9.999"/>
   <atv:overwrite height="35.999" id="button_stroke" transform="matrix(4,0,0,0.75,0,0)" width="16"/>
   <atv:overwrite height="37.999" id="button_bg" transform="matrix(4,0,0,0.75,0,0)" width="18"/>
   <atv:overwrite height="39.999" id="outer_frame" transform="matrix(4,0,0,0.75,0,0)" width="20"/>
  </svg>
 </g>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var name = webMI.query.name;
var address = webMI.query.address;
var isMod = webMI.query.isMod === "true";
var isDiscrete = webMI.query.isDiscrete === "true";
var parentAddress = webMI.query.currLocation;
var parentDataType;
webMI.data.read(parentAddress, function(e) {
	parentDataType = typeof e.value;
});
var config;
var alarmName = webMI.query.alarmName;
var conditionType = webMI.query.conditionType;
var gAccessControlManager;
var datafilled = false;
//states for the writing to variant in server script
var stateValue;
var stateLower;
var stateUpper;
var statesObj;
if(isDiscrete){
	stateValue = "Value";
}else{
	stateLower = "Value";
	stateUpper = "Value";
}

/**
 ** loads Access Controll if isnt
 **/
if (webMI.getAccessControlSupport()) {
	gAccessControlManager = webMI.callExtension("SYSTEM.LIBRARY.ATVISE.QUICKDYNAMICS.Access Control Manager");
}

/**
 ** Access Controll Handler
 **/
function handleAccessControlResponse(compareRights, successCallback, failCallback) {
	if (!gAccessControlManager) {
		successCallback();
		return;
	}
	
	var requiredRights = {
		nodeIds: [],
		rights: []
	};
	
	compareRights = [].concat(compareRights);
	compareRights.forEach(function(r) {
		requiredRights.nodeIds.push(r.node);
		requiredRights.rights.push(r.right);
	});

	gAccessControlManager.getRightsDict(requiredRights.nodeIds, requiredRights.rights, function(response) {
		// do the checks
		var allRights = true;

		for (var c in compareRights) {
			if (
				typeof response[compareRights[c].node] != "undefined" &&
				typeof response[compareRights[c].node][compareRights[c].right] != "undefined"
			) {
				allRights = allRights && response[compareRights[c].node][compareRights[c].right];
			} else {
				allRights = false;
				break;
			}
		}
		if (allRights) {
			successCallback();
		} else {
			failCallback();
		}
	});
}

/**
 ** if no rights to engineer disable all fileds so read only
 **/
handleAccessControlResponse([{ node: parentAddress, right: "engineer" },{ node: "AGENT.ALARMING", right: "read" }], function() {}, function() {
		webMI.trigger.fire("com.atvise.setActive", false, "value_compare");
		webMI.trigger.fire("com.atvise.setActive", false, "value");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_value");	
		webMI.trigger.fire("com.atvise.setActive", false, "nodeselect_discrete");
		webMI.trigger.fire("com.atvise.setActive", false, "lower_limit");
		webMI.trigger.fire("com.atvise.setActive", false, "lower_limit_compare");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_lower_limit");		
		webMI.trigger.fire("com.atvise.setActive", false, "nodeselect_lower");
		webMI.trigger.fire("com.atvise.setActive", false, "upper_limit");
		webMI.trigger.fire("com.atvise.setActive", false, "upper_limit_compare");
		webMI.trigger.fire("com.atvise.setActive", false, "combobox_upper_limit");		
		webMI.trigger.fire("com.atvise.setActive", false, "nodeselector_upper");
		webMI.trigger.fire("com.atvise.setActive", false, "active_message");
		webMI.trigger.fire("com.atvise.setActive", false, "inactive_message");
		webMI.trigger.fire("com.atvise.setActive", false, "explicit_acknowledgement");
		webMI.trigger.fire("com.atvise.setActive", false, "max_time_shelved");
		webMI.trigger.fire("com.atvise.setActive", false, "on_delay");
		webMI.trigger.fire("com.atvise.setActive", false, "off_delay");
		webMI.trigger.fire("com.atvise.setActive", false, "modify_script");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_clear_mod");
		webMI.trigger.fire("com.atvise.setActive", false, "prevention_script");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_clear_prev");
		webMI.trigger.fire("com.atvise.setActive", false, "category");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_safe");
		webMI.trigger.fire("com.atvise.setActive", false, "btn_create");
	}
);

/**
 ** Create empty config for adding a new alarmcondition 
 **/
if(!isMod){
	var add_to_config;
	config = {
			active_message: {"":""},
			inactive_message: {"":""},
			explicit_acknowledgement: false,
			max_time_shelved: 0,
			on_delay: 0,
			off_delay: 0,
			prevention_script: "",
			modify_script: "",
			category: "Error",
		}
	if(conditionType === "Discrete" || conditionType === "Retrigger"){
		isDiscrete = true;
		add_to_config = {
			value: null,
			value_compare: "==",		
		}
	}else{
		add_to_config = {
			lower_limit: null,
			lower_limit_compare: ">",
			lower_limit_deadband: null,
			upper_limit: null,
			upper_limit_compare: "<",
			upper_limit_deadband: null,
		}
	}
	config = {...config, ...add_to_config};
}

/**
 ** Function loads the config from the condition
 **/
function getCondition(){
	return new Promise((resolve) => {
		webMI.data.call("GetConditions",{"address":address, "justOneConfig":true},function (e){
			config = e;
			resolve();
		});
	})
}

/**
 ** Function to parse xml to relative path - for Node relative comparison
 **/
function xmlToPointNotation(xmlString) {
    const parser = new DOMParser();
    const xmlDoc = parser.parseFromString(xmlString, "text/xml");
    const elements = xmlDoc.getElementsByTagName("RelativePathElement");
    let result = "";
    for (let element of elements) {
        const name = element.querySelector("Name").textContent;
        result += `.${name}`;
    }
    return result;
}

/**
 ** get the state from the value (Node absolute, Node relative, Value) and change data in correct form
 **/
function getState(input){
	var state;
	input = typeof input === "boolean" ? input.toString() : input;
	if(input){
		if(input.toString().startsWith("ns=1;s")){
			state = "Node absolute";
			input = input.replace("ns=1;s=", "");
		}else if(input.toString().trim().startsWith("<") && input.toString().trim().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(input.toString().trim())){
			state = "Node relative";
			input = xmlToPointNotation(input)
		}else{
			state = "Value";
		}
	}else{
		state = input === null ? "Value": undefined;
	}
	return {state: state, changed: input}
}

/**
 ** Function fills all the field from config
 **/
function fillForm(config){
	if(isDiscrete){
		//set value fields visible and vanish limit fields
		webMI.gfx.setVisible("group_limit", false);
		webMI.gfx.setVisible("group_discrete", null);
		//sets value fields from config
		var TMPvalue = getState(config.value);
		webMI.trigger.fire("setSelectedItem", config.value_compare, "value_compare");
		config.value = TMPvalue.changed;
		webMI.trigger.fire("setSelectedItem", "T{" + TMPvalue.state + "}", "combobox_value");
		webMI.trigger.fire("setValue", config.value, "value");
		if(TMPvalue.state !== "Value"){
			webMI.gfx.setVisible("nodeselect_discrete", null);
		}else{
			webMI.gfx.setVisible("nodeselect_discrete", false);
		}
	}else{
		//set limit fields visible and vanish value fields
		webMI.gfx.setVisible("group_limit", null);
		webMI.gfx.setVisible("group_discrete", false);
		//sets lower limit fields
		var TMPlower = getState(config.lower_limit);
		webMI.trigger.fire("setSelectedItem", config.lower_limit_compare, "lower_limit_compare");
		config.lower_limit = TMPlower.changed;
		webMI.trigger.fire("setSelectedItem", "T{" + TMPlower.state + "}", "combobox_lower_limit");
		webMI.trigger.fire("setValue", config.lower_limit, "lower_limit");
		if(TMPlower.state !== "Value"){
			webMI.gfx.setVisible("nodeselect_lower", null);
		}else{
			webMI.gfx.setVisible("nodeselect_lower", false);
		}
		//sets upper limit fields
		var TMPupper = getState(config.upper_limit);
		webMI.trigger.fire("setSelectedItem", config.upper_limit_compare, "upper_limit_compare");
		config.upper_limit = TMPupper.changed;
		webMI.trigger.fire("setSelectedItem", "T{" + TMPupper.state + "}", "combobox_upper_limit");
		webMI.trigger.fire("setValue", config.upper_limit, "upper_limit");
		if(TMPupper.state !== "Value"){
			webMI.gfx.setVisible("nodeselect_upper", null);
		}else{
			webMI.gfx.setVisible("nodeselect_upper", false);
		}
	}
	webMI.trigger.fire("setValue", config.active_message[""], "active_message");
	webMI.trigger.fire("setValue", config.inactive_message[""], "inactive_message");
	webMI.trigger.fire("setChecked", config.explicit_acknowledgement, "explicit_acknowledgement");
	webMI.trigger.fire("setValue", config.max_time_shelved / 1000, "max_time_shelved"); // ms * 1000 = s
	webMI.trigger.fire("setValue", config.on_delay / 1000, "on_delay");
	webMI.trigger.fire("setValue", config.off_delay / 1000, "off_delay");
	if(config.modify_script !== "i=0"){
		webMI.trigger.fire("setSelectedItem", config.modify_script.split('.').pop(), "modify_script");
	}
	if(config.prevention_script !== "i=0"){
		webMI.trigger.fire("setSelectedItem", config.prevention_script.split('.').pop(), "prevention_script");
	}
	webMI.trigger.fire("setSelectedItem", config.category, "category");
	datafilled = true;
}

/**
 ** Presets the fields, that are always equal
 **/
webMI.gfx.setText("label_name", name);
webMI.gfx.setText("label_type", conditionType);
webMI.data.call("GetAlarmScripts", {type: "VariableTypes.ATVISE.ScriptCode.AlarmModification"}, function(entries){
	webMI.trigger.fire("setItems", entries, "modify_script");
});
webMI.data.call("GetAlarmScripts", {type: "VariableTypes.ATVISE.ScriptCode.AlarmPrevention"} ,function(entries){
	webMI.trigger.fire("setItems", entries, "prevention_script");
});
webMI.data.call("GetAlarmCategories", {} ,function(entries){
	webMI.trigger.fire("setItems", entries, "category");
});

/**
 ** show discrete fields / limit fields
 **/
if(isDiscrete){
	webMI.gfx.setVisible("group_limit", false);
	webMI.gfx.setVisible("group_discrete", null);
}else{
	webMI.gfx.setVisible("group_limit", null);
	webMI.gfx.setVisible("group_discrete", false);
}

/**
 ** Fill fields with data or initialize it empty
 **/
if(isMod){
	getCondition().then(() => {
		webMI.gfx.setVisible("btn_safe", null);
		webMI.gfx.setVisible("btn_create", false);
		fillForm(config);
	});
}else{
	webMI.gfx.setVisible("btn_safe", false);
	webMI.gfx.setVisible("btn_create", null);
	
	if(isDiscrete){
		webMI.trigger.fire("setSelectedItem", "==", "value_compare");
		webMI.trigger.fire("setValue", "", "value");
		webMI.trigger.fire("setSelectedItem", "T{Value}", "combobox_value");
		webMI.gfx.setVisible("nodeselect_discrete", false);
	}
	else{
		webMI.trigger.fire("setSelectedItem", ">", "lower_limit_compare");
		webMI.trigger.fire("setSelectedItem", "T{Value}", "combobox_lower_limit");
		webMI.trigger.fire("setValue", "", "lower_limit");
		webMI.gfx.setVisible("nodeselect_lower", false);
		webMI.trigger.fire("setSelectedItem", "<", "upper_limit_compare");
		webMI.trigger.fire("setSelectedItem", "T{Value}", "combobox_upper_limit");		
		webMI.trigger.fire("setValue", "", "upper_limit");
		webMI.gfx.setVisible("nodeselect_upper", false);
	}
	webMI.trigger.fire("setChecked", false, "explicit_acknowledgement");
	webMI.trigger.fire("setSelectedItem", "Error", "category");
}

/**
 ** checkfunction for the value input
 **/
function checkInputType(input,type = ""){
	if(input !== undefined){
		if(input.length > 0){
			if(input !== "null" && input !== null){
				if(type === "Value"){
					if(parentDataType === "boolean"){
						switch(input){
								case "true":
								case "false":
								case "0":
								case "1":
								case "TRUE":
								case "FALSE":
									return true;
									break;
								default:
									return false;
									break;
						}
					}else if(parentDataType === "number"){
						const numberRegex = /^-?\d+(\.\d+)?$/;
						return numberRegex.test(input.trim());
					}else if(parentDataType === "string"){
						if(input.length > 0){
							return true;	
						}else{
							return false;		
						}
					}
				}else{
					return true;				
				}
			}else{
				return true;
			}
		}
	}
	return false;
}

/**
 ** trigger called from selector
 **/
webMI.trigger.connect("getTargetAddress", function(e) {
	var targetAddress = e.value.targetAddress;
	if(e.value.state === "Node absolute"){
		webMI.trigger.fire("setValue", targetAddress, e.value.id);
	}else if(e.value.state === "Node relative"){
		webMI.trigger.fire("setValue", targetAddress.replace(parentAddress, ""), e.value.id)
	}
});

/**
 ** function opens nodeselector for path
 */
function openNodeSelector(value, id, state){
	var title = "T{Select node:}";
	if(!datafilled && isMod) return;
	if(value === "Value"){
		return;
	}else if(value === "Node absolute"){
		webMI.query.startAddress = "";
	}else if(value === "Node relative"){
		webMI.query.startAddress = parentAddress;
	}
	webMI.query.isCopy = false;
	webMI.query.newTriggerName = "getTargetAddress";
	webMI.query.id = id;
	webMI.query.state = state;			
	webMI.display.openWindow({
		display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.selector",
		height: 580, width: 380, remember: true, title: title,
		modal: true, resizable: false, movable: true,
		scrollbars: true, menubar: false, status: false, toolbar: false, query:webMI.query
	});
}

/**
 ** Value changed write to config
 **/
if(isDiscrete){
	//opens nodeselector for path
	webMI.trigger.connect("valuechanged", function(e) {
		stateValue = e.value;
		openNodeSelector(e.value, "value", stateValue);
		if(e.value !== "Value"){
			webMI.gfx.setVisible("nodeselect_discrete", null);
		}else{
			webMI.gfx.setVisible("nodeselect_discrete", false);
		}
	}, "combobox_value");

	//value_compare
	webMI.trigger.connect("valuechanged", function(e) { config.value_compare = e.value; }, "value_compare");
	
	//value check and coler if wrong
	webMI.trigger.connect("valuechanged", function(e) {
		e.value = webMI.secureString(e.value);
		config.value = e.value;
		if(checkInputType(e.value, stateValue)){
			if(webMI.gfx.getStroke("value") !== null){
				webMI.gfx.setStroke("value", null);
			}
			correct = false;
		}else{
			webMI.gfx.setStroke("value", "#ff0000");
			correct = false;
		}
	}, "value");
}else{
	//lower_limit opens nodeselector for path
	webMI.trigger.connect("valuechanged", function(e) {
		stateLower = e.value;
		openNodeSelector(e.value,"lower_limit",stateLower);
		if(e.value !== "Value"){
			webMI.gfx.setVisible("nodeselect_lower", null);
		}else{
			webMI.gfx.setVisible("nodeselect_lower", false);
		}
	}, "combobox_lower_limit");
	
	//lower_limit check and coler if wrong
	webMI.trigger.connect("valuechanged", function(e) {
		e.value = webMI.secureString(e.value);
		config.lower_limit = e.value;
		if(checkInputType(e.value,stateLower)){
			if(webMI.gfx.getStroke("lower_limit") !== null){
				webMI.gfx.setStroke("lower_limit", null);
			}
			correct = false;
		}else{
			webMI.gfx.setStroke("lower_limit", "#ff0000");
			correct = false;
		}
	}, "lower_limit");
	
	//lower_limit_compare
	webMI.trigger.connect("valuechanged", function(e) { config.lower_limit_compare = e.value; }, "lower_limit_compare");
	
	//opens nodeselector for path
	webMI.trigger.connect("valuechanged", function(e) {
		stateUpper = e.value;
		openNodeSelector(e.value, "upper_limit", stateUpper);
		if(e.value !== "Value"){
			webMI.gfx.setVisible("nodeselect_upper", null);
		}else{
			webMI.gfx.setVisible("nodeselect_upper", false);
		}
	}, "combobox_upper_limit");
	
	//upper_limit check and coler if wrong
	webMI.trigger.connect("valuechanged", function(e) {
		e.value = webMI.secureString(e.value);
		config.upper_limit = e.value;
		if(checkInputType(e.value, stateUpper)){
			if(webMI.gfx.getStroke("upper_limit") !== null){
				webMI.gfx.setStroke("upper_limit", null);
			}
			correct = false;
		}else{
			webMI.gfx.setStroke("upper_limit", "#ff0000");
			correct = false;
		}
	}, "upper_limit");
	
	//upper_limit_compare
	webMI.trigger.connect("valuechanged", function(e) { config.upper_limit_compare = e.value; }, "upper_limit_compare");
}

/**
 ** Buttons (...) onclicks open nodeselector
 **/
webMI.trigger.connect("clicked", function(){
	webMI.trigger.fire("getSelectedItem", function(e){
		openNodeSelector(e.value, "value", stateValue);
	},"combobox_value");
}, "nodeselect_discrete");

webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("getSelectedItem", function(e){
		openNodeSelector(e.value, "lower_limit", stateLower);
	},"combobox_lower_limit");
}, "nodeselect_lower");

webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("getSelectedItem", function(e){
		openNodeSelector(e.value, "upper_limit", stateUpper);
	},"combobox_upper_limit");
}, "nodeselect_upper");

//active_message
webMI.trigger.connect("valuechanged", function(e) {
	e.value = webMI.secureString(e.value);
	config.active_message[""] = e.value;
}, "active_message");
//inactive_message
webMI.trigger.connect("valuechanged", function(e) {
	e.value = webMI.secureString(e.value); 
	config.inactive_message[""] = e.value;
}, "inactive_message");
//explicit_acknowledgement
webMI.trigger.connect("valuechanged", function(e) { config.explicit_acknowledgement = e.value; }, "explicit_acknowledgement");
//max_time_shelved
webMI.trigger.connect("valuechanged", function(e) { config.max_time_shelved = e.value; }, "max_time_shelved");
//on_delay
webMI.trigger.connect("valuechanged", function(e) { config.on_delay = e.value; }, "on_delay");
//off_delay
webMI.trigger.connect("valuechanged", function(e) { config.off_delay = e.value; }, "off_delay");
//modify_script
webMI.trigger.connect("valuechanged", function(e) {
	if(e.value === "") {
		config.modify_script = "i=0"
	}else{
		config.modify_script = "ns=1;s=" + e.value;
	}
}, "modify_script");
webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("setSelectedItem", "", "modify_script");
}, "btn_clear_mod");
//prevention_script
webMI.trigger.connect("valuechanged", function(e) {
	if(e.value === "") {
		config.prevention_script = "i=0"
	}else{
		config.prevention_script = "ns=1;s=" + e.value;
	}
}, "prevention_script");
webMI.trigger.connect("clicked", function(e){
	webMI.trigger.fire("setSelectedItem", "", "prevention_script");
}, "btn_clear_prev");
//category
webMI.trigger.connect("valuechanged", function(e) {
	setTimeout(() => {
		webMI.trigger.fire("getSelectedItem", function(e){config.category = e.text},"category");
	}, "500");
}, "category");

/**
 ** button cancel clicked, close window
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.display.closeWindow();
	if(!isMod)
	webMI.trigger.fire("closeAddPage");
}, "btn_cancel");

/**
 ** checks the value again and calls script EditCondition
 **/
webMI.trigger.connect("clicked", function(e){
	if(checkInputType(config.value, stateValue) || checkInputType(config.lower_limit, stateLower) || checkInputType(config.upper_limit,stateUpper)){
		stateObj = {value:stateValue, lower_limit:stateLower, upper_limit:stateUpper};
		webMI.data.call("EditCondition", {address:address, config:JSON.stringify(config), isDiscrete:isDiscrete, parentAddress:parentAddress, parentDataType:parentDataType, states:JSON.stringify(stateObj)} ,function(){});
		setTimeout(() => {
			webMI.display.closeWindow();
			webMI.trigger.fire(webMI.query.triggerName);
		}, "100");
	}
}, "btn_safe");

/**
 ** calls the script AddCondition
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.data.call("AddCondition", {
		newConfig:webMI.query.newConfig, //Bool
		alarmName:webMI.query.alarmName,//newAlarm
		conditionName:name,	//condition Name 1
		conditionType:webMI.query.conditionType, //Discrete
		config:JSON.stringify(config), //Obj mit werten
		parentDataType:parentDataType, //Datentyp des Parents
		address:parentAddress,
		states:JSON.stringify({value:stateValue,lower_limit:stateLower,upper_limit:stateUpper})
	} ,function(){});
	setTimeout(() => {
		webMI.display.closeWindow();
		webMI.trigger.fire(webMI.query.triggerName);
		webMI.trigger.fire("closeAddPage");
	}, "200");
}, "btn_create");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.selector" ExportedBrowseName="1:selector" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS" BrowseName="1:OBJECTDISPLAYS">
		<DisplayName Locale="en">OBJECTDISPLAYS</DisplayName>
		<Description Locale="en">OBJECTDISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup" BrowseName="1:popup">
		<DisplayName Locale="en">popup</DisplayName>
		<Description Locale="en">popup</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.selector" BrowseName="1:selector" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">selector</DisplayName>
		<Description Locale="en">selector</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="520" version="1.2" width="380" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <title>Selector Dialog</title>
 <metadata>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <foreignObject height="330" id="address_treeview_copy" width="320" x="30" y="30">
  <div id="address_treeview_copy" style="width:100%;height:100%" xmlns="http://www.w3.org/1999/xhtml"/>
 </foreignObject>
 <svg atv:refpx="310" atv:refpy="480.009" height="30" id="btn_copy" transform="matrix(1.25,0,0,1.3333,0,0)" width="80" x="208" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="345.009">
  <atv:argument name="label" value="T{Copy}"/>
  <atv:argument name="tabIndex" value="4"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,0.75,0,0)" x="40" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="190" atv:refpy="480.009" height="30" id="btn_cancel" transform="matrix(1.25,0,0,1.3333,0,0)" width="80" x="112" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="345.009">
  <atv:argument name="label" value="T{Cancel}"/>
  <atv:argument name="tabIndex" value="2"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,0.75,0,0)" x="40" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="100"/>
 </svg>
 <svg atv:refpx="310" atv:refpy="480.009" height="30" id="btn_select" transform="matrix(1.25,0,0,1.3333,0,0)" width="80" x="208" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="345.009">
  <atv:argument name="label" value="T{Select}"/>
  <atv:argument name="tabIndex" value="3"/>
  <atv:overwrite height="37.999" id="id_6" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="31.499"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="16.499"/>
  <atv:overwrite id="button_label" transform="matrix(0.8,0,0,0.75,0,0)" x="50" y="24.499"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="34.624"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.48,0,0,0.45,0,0)" x="73.167" y="13.291"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.8,0,0,0.75,0,0)" x="40" y="9.999"/>
  <atv:overwrite height="35.999" id="button_stroke" transform="matrix(0.8,0,0,0.75,0,0)" width="96"/>
  <atv:overwrite height="37.999" id="button_bg" transform="matrix(0.8,0,0,0.75,0,0)" width="98"/>
  <atv:overwrite height="39.999" id="outer_frame" transform="matrix(0.8,0,0,0.75,0,0)" width="100"/>
 </svg>
 <g atv:refpx="190" atv:refpy="410" id="group_name">
  <svg atv:refpx="249.976" atv:refpy="410.006" height="30" id="conf_name" transform="matrix(1.375,0,0,1.3333,0,0)" width="160" x="101.818" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.in_out_value" y="292.507">
   <atv:argument name="validation" value="String"/>
   <atv:argument name="allowDirectInput" value="Yes"/>
   <atv:argument name="tabIndex" value="1"/>
   <atv:overwrite id="id_2" transform="matrix(0.8889,0,0,1,0,0)" width="174.5"/>
   <atv:overwrite id="id_0" transform="matrix(0.5517,0,0,1,0,0)" width="290"/>
   <atv:overwrite id="input_label" transform="matrix(0.7273,0,0,0.75,0,0)" x="212.055" y="24.465"/>
   <atv:overwrite height="31.999" id="blinking_frame" transform="matrix(0.7273,0,0,0.75,0,0)" width="212"/>
   <atv:overwrite height="35.999" id="focus_frame" transform="matrix(0.7273,0,0,0.75,0,0)" width="216"/>
   <atv:overwrite height="31.999" id="input_bg" transform="matrix(0.7273,0,0,0.75,0,0)" width="212"/>
   <atv:overwrite height="37.999" id="id_1" transform="matrix(0.7273,0,0,0.75,0,0)" width="218"/>
   <atv:overwrite height="39.999" id="input_border" transform="matrix(0.7273,0,0,0.75,0,0)" width="220"/>
  </svg>
  <text atv:refpx="79" atv:refpy="409.5" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_19" x="25" y="415.5">T{Alarm Name}:</text>
 </g>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var id_treeview_copy = document.getElementById("address_treeview_copy").id;
var treeViewCopy;
var targetAddress = "";
var gAccessControlManager;
var isCopy = webMI.query.isCopy === "true";
var startaddress = webMI.query.startAddress;
var triggerName = webMI.query.newTriggerName;
var id = webMI.query.id;
var state = webMI.query.state;
var alarmName;
var newConfig;

/**
 ** de/activates button select/copy depending from where the display is called
 **/
if(isCopy){
	webMI.gfx.setVisible("btn_select", false);
	webMI.gfx.setVisible("btn_copy", null);
	webMI.trigger.fire("com.atvise.setActive", false, "conf_name");
	webMI.gfx.setVisible("group_name", null);
	webMI.trigger.fire("com.atvise.setActive", false, "btn_copy");
}else{
	webMI.gfx.setVisible("btn_select", null);
	webMI.gfx.setVisible("btn_copy", false);
	webMI.gfx.setVisible("group_name", false);
	webMI.trigger.fire("com.atvise.setActive", false, "btn_select");
}


/**
 ** load Accesscontrol if not loaded
 **/
if (webMI.getAccessControlSupport()) {
	gAccessControlManager = webMI.callExtension("SYSTEM.LIBRARY.ATVISE.QUICKDYNAMICS.Access Control Manager");
}

/**
 ** Access Control handler
 **/
function handleAccessControlResponse(compareRights, successCallback, failCallback) {
	if (!gAccessControlManager) {
		successCallback();
		return;
	}
	
	
	var requiredRights = {
		nodeIds: [],
		rights: []
	};
	
	compareRights = [].concat(compareRights);
	compareRights.forEach(function(r) {
		requiredRights.nodeIds.push(r.node);
		requiredRights.rights.push(r.right);
	});

	gAccessControlManager.getRightsDict(requiredRights.nodeIds, requiredRights.rights, function(response) {
		// do the checks
		var allRights = true;

		for (var c in compareRights) {
			if (
				typeof response[compareRights[c].node] != "undefined" &&
				typeof response[compareRights[c].node][compareRights[c].right] != "undefined"
			) {
				allRights = allRights && response[compareRights[c].node][compareRights[c].right];
			} else {
				allRights = false;
				break;
			}
		}
		if (allRights) {
			successCallback();
		} else {
			failCallback();
		}
	});
}

/**
 ** Function to build the treeview
 **/
function buildTree(startaddress = "AGENT.OBJECTS", dataSource = "treeView/datasources/opcua.js", dataSourceType = "opcUA") {
	if(startaddress === "") startaddress = "AGENT.OBJECTS";
	treeViewCopy = webMI.callExtension("SYSTEM.LIBRARY.PROJECT.QUICKDYNAMICS.TreeView", {
		busyIndicatorTolerance: "100",
		expandoOffset: "3",
		imagePaths:
		'{"baseVariableImage":"/treeView/icons/baseVariable.svg","folderImage":"/treeView/icons/folder.svg","aggregateFunctionImage":"/treeView/icons/aggregateFunction.svg","collapsedLeafImage":"/treeView/icons/leafCollapsed.svg","expandedLeafImage":"/treeView/icons/leafExpanded.svg"}',
		fontSize: "18",
		startAddress: startaddress,
		id: "address_treeview_copy",//id_treeview_copy,
		leafIndentation: "15",
		leafPadding: "2",
		nodesWithAlarm: true,
		renderTo: "address_treeview_copy",//id_treeview_copy,
		dataSourceFilePath: dataSource,
		dataSourceType: dataSourceType,
	});

	
	//Onclick sobald auf ein Leave gedrückt wird
	treeViewCopy.on("select", function (e) {
		targetAddress =e.data.address;
		webMI.data.call("HasAlarmConfiguration",{address: targetAddress}, function (x){
			if(x.result){
				webMI.trigger.fire("com.atvise.setActive", false, "conf_name");
				webMI.trigger.fire("setValue", x.result, "conf_name");
				newConfig = false;
			}else{
				webMI.trigger.fire("com.atvise.setActive", true, "conf_name");
				webMI.trigger.fire("setValue", "New_Alarm_Name", "conf_name");
				newConfig = true;		
			}
			webMI.trigger.fire("com.atvise.setActive", true, "btn_copy");
			webMI.trigger.fire("com.atvise.setActive", true, "btn_select");
		});
	});
}

buildTree(startaddress);


webMI.trigger.connect("valuechanged", function(e) {
	e.value = webMI.secureString(e.value);
	alarmName = e.value;
}, "conf_name");

/**
 ** button cancle click
 **/
webMI.trigger.connect("clicked", function(e){
	webMI.display.closeWindow();
}, "btn_cancel");

/**
 ** button copy click
 **/
webMI.trigger.connect("clicked", function(e){
	if(targetAddress === "" || alarmName === ""){
		alert("T{Choose a target node! / Choose an Alarm Name}");
	}else{
		handleAccessControlResponse([{ node: targetAddress, right: "engineer" }], function() {
			webMI.trigger.fire(triggerName, {targetAddress: targetAddress, alarmName: alarmName, newConfig:newConfig});
			webMI.display.closeWindow(); 
		},function(){
			alert("T{Insufficient Rights to write to} " + targetAddress);		
		});
	}
}, "btn_copy");

/**
 ** button select click
 **/
webMI.trigger.connect("clicked", function(e){
	if(targetAddress === ""){
		alert("T{Choose a target node!}");
	}else{
		handleAccessControlResponse([{ node: targetAddress, right: "read" }], function() {
			webMI.trigger.fire(triggerName, {targetAddress:targetAddress, id:id, state:state});
			webMI.display.closeWindow();
		},function(){
			alert("T{Insufficient Rights to read from} " + targetAddress);		
		});
	}
}, "btn_select");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.alarm_manager" ExportedBrowseName="1:alarm_manager" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS" BrowseName="1:OBJECTDISPLAYS">
		<DisplayName Locale="en">OBJECTDISPLAYS</DisplayName>
		<Description Locale="en">OBJECTDISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager" BrowseName="1:alarmmanager">
		<DisplayName Locale="en">alarmmanager</DisplayName>
		<Description Locale="en">alarmmanager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.alarm_manager" BrowseName="1:alarm_manager" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">alarm_manager</DisplayName>
		<Description Locale="en">alarm_manager</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg height="890" version="1.2" width="1675" xmlns="http://www.w3.org/2000/svg" xmlns:atv="http://webmi.atvise.com/2007/svgext" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <desc>Overview and management of alarms and conditions.</desc>
 <title>Alarm Manager</title>
 <metadata>
  <atv:parameter behavior="optional" defaultvalue="SYSTEM.GLOBALS.atvFillColor" desc="$FILLCOLOR$" name="$FILLCOLOR$" substitute="$FILLCOLOR$" valuetype="global"/>
  <atv:parameter behavior="optional" defaultvalue="SYSTEM.GLOBALS.atvFontColor" desc="$FONTCOLOR$" name="$FONTCOLOR$" substitute="$FONTCOLOR$" valuetype="global"/>
  <atv:gridconfig enabled="true" gridstyle="lines" height="20" width="20"/>
  <atv:snapconfig enabled="true" height="10" width="10"/>
 </metadata>
 <rect atv:refpx="837.5" atv:refpy="40" fill="$FILLCOLOR$" height="80" id="id_1" rx="0" ry="0" stroke="#000000" stroke-width="1" width="1675" x="0" y="0"/>
 <foreignObject height="620" id="address_treeview" width="390" x="30" y="180">
  <div id="address_treeview" style="width:100%;height:100%" xmlns="http://www.w3.org/1999/xhtml"/>
 </foreignObject>
 <svg atv:refpx="1029.472" atv:refpy="519.974" height="640" id="id_2" transform="matrix(1.9047,0,0,1.0625,0,0)" width="640" x="220.507" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.slickgrid.table" y="169.412">
  <atv:argument name="tableID" value="table_1"/>
 </svg>
 <svg atv:refpx="1209.603" atv:refpy="130.003" height="30" id="btnAdd" transform="matrix(1.74,0,0,2,0,0)" width="80" x="655.172" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="50">
  <atv:argument name="label" value="T{Add}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="3"/>
  <atv:overwrite height="58" id="id_6" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="41.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="26.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="34.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="51.292"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="29.959"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5747,0,0,0.5,0,0)" x="59.6" y="20"/>
  <atv:overwrite height="56" id="button_stroke" transform="matrix(0.5747,0,0,0.5,0,0)" width="135.2"/>
  <atv:overwrite height="58" id="button_bg" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite height="60" id="outer_frame" transform="matrix(0.5747,0,0,0.5,0,0)" width="139.2"/>
 </svg>
 <svg atv:refpx="1389.601" atv:refpy="130.002" height="30" id="btnDelete" transform="matrix(1.74,0,0,2,0,0)" width="80" x="758.62" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="50">
  <atv:argument name="label" value="T{Remove}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:argument name="tabIndex" value="4"/>
  <atv:overwrite height="58" id="id_6" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="41.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="26.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="34.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="51.292"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="29.959"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5747,0,0,0.5,0,0)" x="59.6" y="20"/>
  <atv:overwrite height="56" id="button_stroke" transform="matrix(0.5747,0,0,0.5,0,0)" width="135.2"/>
  <atv:overwrite height="58" id="button_bg" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite height="60" id="outer_frame" transform="matrix(0.5747,0,0,0.5,0,0)" width="139.2"/>
 </svg>
 <svg atv:refpx="1569.601" atv:refpy="130.003" height="30" id="btnCopy" transform="matrix(1.74,0,0,2,0,0)" width="80" x="862.068" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" y="50">
  <atv:argument name="label" value="T{Copy to Node}"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="fontSize2" value="16"/>
  <atv:overwrite height="58" id="id_6" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite id="button_label_2" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="41.5"/>
  <atv:overwrite id="button_label_1" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="26.5"/>
  <atv:overwrite id="button_label" transform="matrix(0.5747,0,0,0.5,0,0)" x="69.6" y="34.5"/>
  <atv:overwrite id="button_symbol_bottom" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="51.292"/>
  <atv:overwrite id="button_symbol_top" transform="matrix(0.3448,0,0,0.3,0,0)" x="105.833" y="29.959"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.5747,0,0,0.5,0,0)" x="59.6" y="20"/>
  <atv:overwrite height="56" id="button_stroke" transform="matrix(0.5747,0,0,0.5,0,0)" width="135.2"/>
  <atv:overwrite height="58" id="button_bg" transform="matrix(0.5747,0,0,0.5,0,0)" width="137.2"/>
  <atv:overwrite height="60" id="outer_frame" transform="matrix(0.5747,0,0,0.5,0,0)" width="139.2"/>
 </svg>
 <svg atv:refpx="250" atv:refpy="129.999" height="30" id="picker_address" transform="matrix(1.375,0,0,2,0,0)" width="160" x="101.818" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.picker_address" y="50">
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="tabIndex" value="1"/>
  <atv:overwrite height="60" id="addresspicker_clickarea" transform="matrix(0.7273,0,0,0.5,0,0)" x="192"/>
  <atv:overwrite height="56" id="focus_frame" transform="matrix(0.7273,0,0,0.5,0,0)" width="216"/>
  <atv:overwrite id="button_stroke" transform="matrix(0.7273,0,0,0.5,0,0)" x="195" y="20"/>
  <atv:overwrite id="button_symbol" transform="matrix(0.7273,0,0,0.5,0,0)" x="194.75" y="20"/>
  <atv:overwrite id="button_bg" transform="matrix(0.7273,0,0,0.5,0,0)" x="195" y="20"/>
  <atv:overwrite id="input_label" transform="matrix(0.7273,0,0,0.5,0,0)" x="186" y="34.25"/>
  <atv:overwrite height="52" id="blinking_frame" transform="matrix(0.7273,0,0,0.5,0,0)" width="188"/>
  <atv:overwrite height="52" id="addresspicker_bg" transform="matrix(0.7273,0,0,0.5,0,0)" width="188"/>
  <atv:overwrite height="58" id="id_0" transform="matrix(0.7273,0,0,0.5,0,0)" width="218"/>
  <atv:overwrite height="60" id="addresspicker_stroke" transform="matrix(0.7273,0,0,0.5,0,0)" width="220"/>
 </svg>
 <svg atv:refpx="402.44" atv:refpy="124.567" height="30" id="checkBox_alarms" transform="matrix(1.4056,0,0,0.9712,0,0)" width="160" x="270.348" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.checkbox" y="119.436">
  <atv:argument name="label" value="T{Filter for Alarms}"/>
  <atv:argument name="valueOn" value="0"/>
  <atv:argument name="fontSize" value="16"/>
  <atv:argument name="tooltip" value="T{Show only nodes with Alarmconfiguration}"/>
  <atv:argument name="tabIndex" value="2"/>
  <atv:overwrite id="checkbox_item" transform="matrix(0.7114,0,0,1.0297,0,0)" y="19.568"/>
  <atv:overwrite id="checkbox_symbol" transform="matrix(0.7114,0,0,1.0297,0,0)" y="4.318"/>
  <atv:overwrite id="blinking_frame" transform="matrix(0.7114,0,0,1.0297,0,0)" y="3.318"/>
  <atv:overwrite height="24.936" id="focus_frame" transform="matrix(0.7114,0,0,1.0297,0,0)"/>
  <atv:overwrite id="checkbox_bg" transform="matrix(0.7114,0,0,1.0297,0,0)" y="3.318"/>
  <atv:overwrite height="27.136" id="checkbox_frame" transform="matrix(0.7114,0,0,1.0297,0,0)"/>
  <atv:overwrite height="29.136" id="checkbox_stroke" transform="matrix(0.7114,0,0,1.0297,0,0)"/>
 </svg>
 <svg atv:refpx="40" atv:refpy="35" height="60" id="id_3" transform="matrix(1,0,0,1.1667,0,0)" width="60" x="10" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Symbols.60x60.alarm" y="0"/>
 <text atv:refpx="191.375" atv:refpy="43" fill="$FONTCOLOR$" font-family="Arial" font-size="28" id="id_8" text-anchor="start" x="84" y="50.5">Alarm Manager</text>
 <text atv:refpx="63.248" atv:refpy="130" fill="$FONTCOLOR$" font-family="Arial" font-size="16" id="id_5" x="25" y="134.5">T{Start address}:</text>
 <script atv:desc="" atv:name="" type="text/ecmascript"><![CDATA[var TableController;
var treeView;
var startAddress = "";
var allNodes = true;
var treeReady = false;
var currLocation = "";
var gAccessControlManager;
var id_treeview = document.getElementById("address_treeview").id;
webMI.trigger.fire("reloadButtons");
webMI.trigger.fire("setChecked", false, "checkBox_alarms");

/**
 ** Onload build the treeview
 **/
webMI.addOnload(function (e) {
	buildTree();
});

/**
 ** Reloads the AccessControl
 **/
if (webMI.getAccessControlSupport()) {
	gAccessControlManager = webMI.callExtension("SYSTEM.LIBRARY.ATVISE.QUICKDYNAMICS.Access Control Manager");
}

/**
 ** AccessControl Handler
 **/
function handleAccessControlResponse(compareRights, successCallback, failCallback) {
	if (!gAccessControlManager) {
		successCallback();
		return;
	}


	var requiredRights = {
		nodeIds: [],
		rights: []
	};

	compareRights = [].concat(compareRights);
	compareRights.forEach(function (r) {
		requiredRights.nodeIds.push(r.node);
		requiredRights.rights.push(r.right);
	});

	gAccessControlManager.getRightsDict(requiredRights.nodeIds, requiredRights.rights, function (response) {
		// do the checks
		var allRights = true;

		for (var c in compareRights) {
			if (
				typeof response[compareRights[c].node] != "undefined" &&
				typeof response[compareRights[c].node][compareRights[c].right] != "undefined"
			) {
				allRights = allRights && response[compareRights[c].node][compareRights[c].right];
			} else {
				allRights = false;
				break;
			}
		}
		if (allRights) {
			successCallback();
		} else {
			failCallback();
		}
	});
}

/**
 ** Function to build the treeview
 **/
function buildTree(startaddress = "AGENT.OBJECTS", dataSource = "treeView/datasources/opcua.js", dataSourceType = "opcUA") {
	if (startaddress === "") startaddress = "AGENT.OBJECTS";
	treeView = webMI.callExtension("SYSTEM.LIBRARY.PROJECT.QUICKDYNAMICS.TreeView", {
		busyIndicatorTolerance: "100",
		expandoOffset: "3",
		imagePaths:
			'{"baseVariableImage":"/treeView/icons/baseVariable.svg","folderImage":"/treeView/icons/folder.svg","aggregateFunctionImage":"/treeView/icons/aggregateFunction.svg","collapsedLeafImage":"/treeView/icons/leafCollapsed.svg","expandedLeafImage":"/treeView/icons/leafExpanded.svg"}',
		fontSize: "18",
		startAddress: startaddress,
		id: id_treeview,
		leafIndentation: "15",
		leafPadding: "2",
		nodesWithAlarm: true,
		renderTo: id_treeview,
		dataSourceFilePath: dataSource,
		dataSourceType: dataSourceType,
	});

	//tree ready loaded
	treeView.on("ready", function (e) {
		treeReady = true;
	});

	//onclick
	treeView.on("select", function (e) {
		currLocation = e.data.address;
		loadNode(currLocation);
	});
}

/**
 ** Create the table
 **/
webMI.table.loadResources(function () {
	var config = [];

	//Table definition
	config.columns = [
		{ id: "type", name: "T{Type}", field: "type", sortable: true, filter: true, visible: true, width: 90, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "edit", name: "T{Edit}", field: "edit", sortable: false, filter: false, visible: true, width: 50, sortByDefault: false, sortByDefaultAsc: true, formatter: function (row, cell, value, columnDef, dataContext) { return "<div style='width:100%; text-align:center;'><i class='fas fa-edit'></i></div>"; } },
		{ id: "name", name: "T{Name}", field: "name", sortable: true, filter: true, visible: true, width: 300, sortByDefault: true, sortByDefaultAsc: true },
		{ id: "category", name: "T{Category}", field: "category", sortable: true, filter: true, visible: true, width: 200, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "value_string", name: "T{Limits}", field: "value_string", sortable: false, filter: false, visible: true, width: 300, sortByDefault: false, sortByDefaultAsc: false, formatter: function (row, cell, value, columnDef, dataContext) { return value; } },
		{ id: "activeText", name: "T{Active Message}", field: "activeText", sortable: true, filter: true, visible: true, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "inactiveText", name: "T{Inactive Message}", field: "inactiveText", sortable: true, filter: true, visible: true, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "delay_on", name: "T{Delay on}", field: "delay_on", sortable: false, filter: true, visible: true, width: 90, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "delay_off", name: "T{Delay off}", field: "delay_off", sortable: false, filter: true, visible: true, width: 90, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "prevention_script", name: "T{Prevention Script}", field: "prevention_script", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "modification_script", name: "T{Modification Script}", field: "modification_script", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "value", name: "T{value}", field: "value", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "value_compare", name: "T{value_compare}", field: "value_compare", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "lower_limit_compare", name: "T{lower_limit_compare}", field: "lower_limit_compare", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "lower_limit", name: "T{lower_limit}", field: "lower_limit", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "upper_limit_compare", name: "T{upper_limit_compare}", field: "upper_limit_compare", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },
		{ id: "upper_limit", name: "T{upper_limit}", field: "upper_limit", sortable: true, filter: true, visible: false, width: 300, sortByDefault: false, sortByDefaultAsc: true },

	];

	config.mode = "once";

	//Insert Data
	config.dataRequestFunction = function customDataRequest() {
		TableController = this;
		loadNode();
	};

	//Onclick
	config.onClickCallback = function (e, clickinfo) {
		if (clickinfo.column.id === "edit" || clickinfo.column.id === "atvise_marker") {
			clickHandler(clickinfo);
		}
	};

	//onclick
	config.onHeaderClickCallback = function (e, clickinfo) {
		if (clickinfo.column.id === "atvise_marker") {
			clickHandler(clickinfo);
		}
	};

	// *** END CONFIGURATION SECTION ***
	webMI.table.register("table_1", "config", config);
	webMI.table.setReady("table_1", "config");
});

/**
 ** Function called by the on click listener from the table, opens the edit page or reloadButtons
 **/
function clickHandler(clickinfo) {
	if (clickinfo.column.id === "edit") {
		webMI.query.name = clickinfo.item.name;
		webMI.query.address = clickinfo.item.address;
		webMI.query.conditionType = clickinfo.item.type;
		webMI.query.triggerName = "reloadAtCurrLocation";
		webMI.query.currLocation = currLocation;
		webMI.query.isMod = true;
		if (clickinfo.item.type === "Discrete" || clickinfo.item.type === "Retrigger") {
			webMI.query.isDiscrete = true;
		} else {
			webMI.query.isDiscrete = false;
		}
		webMI.display.openWindow({
			display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.edit_alarm",
			height: 740, width: 1280, remember: true,
			modal: true, resizable: false, movable: true,
			scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
		});
	}
	webMI.trigger.fire("reloadButtons");
}

/**
 ** Trigger to de/activate the buttons based on rights and selected data
 **/
webMI.trigger.connect("reloadButtons", function (e) {
	setTimeout(() => {
		if (currLocation !== "") {
			handleAccessControlResponse([{ node: currLocation, right: "engineer" }, { node: "AGENT.ALARMING", right: "read" }], function () {
				if (TableController) {
					webMI.trigger.fire("com.atvise.setActive", true, "btnAdd");
					if (TableController.getSelectedItems().length > 0) {
						webMI.trigger.fire("com.atvise.setActive", true, "btnDelete");
						webMI.trigger.fire("com.atvise.setActive", true, "btnCopy");
					} else {
						webMI.trigger.fire("com.atvise.setActive", false, "btnDelete");
						webMI.trigger.fire("com.atvise.setActive", false, "btnCopy");
					}
				}
			}, function () {
				webMI.trigger.fire("com.atvise.setActive", false, "btnAdd");
				webMI.trigger.fire("com.atvise.setActive", false, "btnDelete");
				webMI.trigger.fire("com.atvise.setActive", false, "btnCopy");
			});
		} else {
			webMI.trigger.fire("com.atvise.setActive", false, "btnAdd");
			webMI.trigger.fire("com.atvise.setActive", false, "btnDelete");
			webMI.trigger.fire("com.atvise.setActive", false, "btnCopy");
		}
	}, 100);
});

/**
 ** Function to clear the table
 **/
function clearTable() {
	if (TableController) {
		TableController.clearData();
	}
}

/**
 ** Function to clear the table and insert new data
 **/
function loadNode(address = "") {
	if (address !== "") {
		var data = { result: [] };
		webMI.data.call("GetConditions", { "address": address, "justOneConfig": false }, function (param) {
			if (param.length > 0) {
				param.forEach(item => {
					data.result.push(item);
				});
				clearTable()
				if (TableController) {
					TableController.addData(data);
				}
			} else {
				clearTable()
			}
		});
	} else {
		clearTable()
	}
	webMI.trigger.fire("reloadButtons");
}

/**
 ** Trigger to reload table
 **/
webMI.trigger.connect("reloadAtCurrLocation", function (e) {
	setTimeout(() => {
		loadNode(currLocation);
	}, 100);
});

/**
 ** Trigger checkbox filter for nodes with alarm configuration
 **/
webMI.trigger.connect("valuechanged", function (e) {
	if (treeReady) {
		treeView.destroy();
		if (Boolean(Number(e.value))) {
			buildTree(startAddress, "treeView/datasources/opcuaAlarms.js", "opcUA_Alarms")
		} else {
			buildTree(startAddress)
		}	//Tabelle leeren
		loadNode();
	}
	currLocation = "";
	webMI.trigger.fire("reloadButtons");
}, "checkBox_alarms");

/**
 ** Trigger valuechanged address picker
 **/
webMI.trigger.connect("valuechanged", function (e) {
	startAddress = e.value;
	if (treeReady) {
		treeView.destroy();
		buildTree(startAddress);
		treeReady = false;
		webMI.trigger.fire("setChecked", false, "checkBox_alarms");
		loadNode();
	}
}, "picker_address");

/**
 ** Add alarm Section
 **/
var addPage;
webMI.trigger.connect("clicked", function (e) {
	webMI.data.call("HasAlarmConfiguration", { "address": currLocation }, function (e) {
		webMI.query.address = currLocation;
		webMI.query.alarmName = e.result ? e.result : null;
		webMI.data.call("GetConditionType", { "address": currLocation }, function (x) {
			webMI.query.conditionType = x.result ? x.result : null;
			addPage = webMI.display.openWindow({
				display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.add_alarm",
				height: 280, width: 500, remember: true,
				modal: true, resizable: false, movable: true,
				scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
			});
		});
	});
}, "btnAdd");

/**
 ** Remove alarm Section
 **/
webMI.trigger.connect("remove_alarm", function (e) {
	var del_list = TableController.getSelectedItems();
	del_list.forEach(item => {
		webMI.data.call("DeleteCondition", { "address": item.address }, function () {
			loadNode(treeView.getSelectedNode().address);
		});
	});
});

webMI.trigger.connect("closeAddPage", function (e) {
	addPage.close();
});

webMI.trigger.connect("clicked", function (e) {
	webMI.query.triggerName = "remove_alarm";
	webMI.query.dialogTitle = "T{Remove Alarm Config}:";
	webMI.query.dialogMessageLine1 = "T{Do you want to delete the selected alarm(s)}";
	webMI.query.dialogMessageLine2 = "";
	webMI.display.openWindow({
		display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.delete_alarm",
		height: 310, width: 600, remember: true,
		modal: true, resizable: false, movable: true,
		scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
	});
}, "btnDelete");

/**
 ** Copy alarm Section
 **/

function getStates(config_table) {
	var obj = { value: null, lower_limit: null, upper_limit: null };
	if (config_table.type !== "Limit") { //discrete
		if (config_table.value === null) {
			obj.value = "Value";
		} else {
			if (config_table.value.toString().startsWith("ns=1;s")) {
				obj.value = "Node absolute";
			}
			else if (config_table.value.toString().trim().startsWith("<") && config_table.value.toString().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(config_table.value.toString().trim())) {
				obj.value = "Node relative";
			} else {
				obj.value = "Value";
			}
		}
	} else {
		if (config_table.lower_limit === null) {
			obj.lower_limit = "Value";
		} else {
			if (config_table.lower_limit.toString().startsWith("ns=1;s")) {
				obj.lower_limit = "Node absolute";
			}
			else if (config_table.lower_limit.toString().trim().startsWith("<") && config_table.lower_limit.toString().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(config_table.lower_limit.toString().trim())) {
				obj.lower_limit = "Node relative";
			} else {
				obj.lower_limit = "Value";
			}
		}
		if (config_table.upper_limit == null) {
			obj.upper_limit = "Value";
		} else {
			if (config_table.upper_limit.toString().startsWith("ns=1;s")) {
				obj.upper_limit = "Node absolute";
			} else if (config_table.upper_limit.toString().trim().startsWith("<") && config_table.upper_limit.toString().endsWith(">") && /<[^>]+>.*<\/[a-zA-Z0-9]+>/.test(config_table.upper_limit.toString().trim())) {
				obj.upper_limit = "Node relative";
			} else {
				obj.upper_limit = "Value";
			}
		}
	}
	return obj;
}

webMI.trigger.connect("StartToCopy", function (e) {
	webMI.data.call("CopyCondition", { config_table: JSON.stringify(config_table), targetAddress: e.value.targetAddress, states: JSON.stringify(getStates(config_table[0])), alarmName: e.value.alarmName, newConfig: e.value.newConfig }, function (x) {
		if (!x.result) {
			webMI.query.message = "T{Something unexpected happend\nTo see more take a look in the Log\nNo copies were made}";
		} else {
			webMI.query.message = "T{Copy completed successfully}"
		}
		webMI.query.headline = "T{Copy to Node}";
		webMI.display.openWindow({
			display: "SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.dialogs.message_dialog_small",
			width: 450,
			height: 140,
			query: webMI.query
		});
	});
});

webMI.trigger.connect("clicked", function (e) {
	webMI.query.isCopy = true;
	webMI.query.startAddress = "";
	webMI.query.newTriggerName = "StartToCopy";

	config_table = TableController.getSelectedItems();
	webMI.display.openWindow({
		display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.alarmmanager.popup.selector",
		height: 420, width: 380, remember: true,
		modal: true, resizable: false, movable: true,
		scrollbars: true, menubar: false, status: false, toolbar: false, query: webMI.query
	});
}, "btnCopy");]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
</UANodeSet>
