<?xml version="1.0" encoding="UTF-8" ?>
<!-- created at 2025-12-17 14:10:16 -->
<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.Advanced" ExportedBrowseName="1:Advanced" 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.Advanced" BrowseName="1:Advanced">
		<DisplayName Locale="en">Advanced</DisplayName>
		<Description Locale="en">Advanced</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.Advanced.slickgrid" BrowseName="1:slickgrid">
		<DisplayName Locale="en">slickgrid</DisplayName>
		<Description Locale="en">slickgrid</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table" BrowseName="1:table" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">table</DisplayName>
		<Description Locale="en">table</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid</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 xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="640" height="640">
 <defs/>
 <desc>HTML based table with footer</desc>
 <title>Table</title>
 <metadata>
  <!-- ... mandatorys ... -->
  <!-- ... font ... -->
  <!-- ... options ... -->
  <!-- menu -->
  <!-- footer -->
  <!-- ... ende options ... -->
  <atv:parameter behavior="mandatory" name="tableID" desc="table ID" valuetype="string" defaultvalue="atvise_table_1"/>
  <atv:parameter behavior="optional" group="" name="header_height" desc="table header height" valuetype="number" defaultvalue="30"/>
  <atv:parameter behavior="optional" group="" name="header_text_size" desc="table header font size" valuetype="number" defaultvalue="14"/>
  <atv:parameter behavior="optional" group="" name="header_text_horizontal" desc="table header cell align horizontal" valuetype="enum" config="center; inherit" defaultvalue="inherit"/>
  <atv:parameter behavior="optional" group="" name="header_text_vertical" desc="table header cell align vertical" valuetype="enum" config="center; inherit" defaultvalue="center"/>
  <atv:parameter behavior="optional" group="" name="row_height" desc="table row height" valuetype="number" defaultvalue="20"/>
  <atv:parameter behavior="optional" group="" name="row_text_size" desc="table row font size" valuetype="number" defaultvalue="12"/>
  <atv:parameter behavior="optional" group="" name="detail_text_size" desc="table detail font size" valuetype="number" defaultvalue="12"/>
  <atv:parameter behavior="mandatory" group="" name="footer_text_size" desc="table footer font size" valuetype="number" defaultvalue="12"/>
  <atv:parameter behavior="optional" group="Appearance" name="font_family" desc="font family" valuetype="enum" config="Arial;Courier;Tahoma;Verdana" defaultvalue="Arial"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalBorderColor" desc="global border colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvBorderColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalFillColor" desc="global fill colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvFillColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalFontColor" desc="global font colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvFontColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalSymbolColor" desc="global symbol colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvSymbolColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalInactiveColor" desc="global inactive colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvInactiveColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalColorConfig" desc="global table colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvObjectDisplays.Tables.ColorConfig"/>
  <atv:parameter behavior="optional" group="Appearance" name="theme_class" desc="custom theme" valuetype="string" defaultvalue="atviseTheme"/>
  <atv:parameter behavior="optional" group="Options" name="columnReorder" desc="columns reorderable" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="paging" desc="paging" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="filterBar" desc="filter bar enabled" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="filterRegExp" desc="filter regular expressions" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="filterStar" desc="filter use placeholder" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="filterCaseSensitive" desc="filter case sensitive" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="filterLength" desc="filter minimum length" valuetype="number" defaultvalue="1"/>
  <atv:parameter behavior="optional" group="Options" name="filterDelay" desc="filter delay [ms]" valuetype="number" defaultvalue="1000"/>
  <atv:parameter behavior="optional" group="Options" name="showMode" desc="show runtime mode" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="multiselect" desc="multiselect" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="multicellselect" desc="multiselect on cell click" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="linebreak" desc="cell linebreak" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="allowDirectInput" desc="allow direct input" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenu" desc="show menu" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuWidth" desc="menu width" valuetype="number" defaultvalue="250"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuHeight" desc="menu height" valuetype="number" defaultvalue="300"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuPicker" desc="show picker menu" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuFilter" desc="show filter menu" valuetype="bool" defaultvalue="true" substitute=""/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuExport" desc="show export menu" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_first_page" desc="symbol first page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-fast-backward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_previous_page" desc="symbol previous page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-step-backward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_pause_page" desc="symbol pause" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-pause&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_stop_page" desc="symbol stop page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-stop&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_next_page" desc="symbol next page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-step-forward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_last_page" desc="symbol last page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-fast-forward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_load_page" desc="symbol load page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-download&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_search_page" desc="symbol search" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-search&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_truncate_icon" desc="symbol truncate" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-ban&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_triggered_icon" desc="symbol triggered" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-angle-double-down&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_continue_icon" desc="symbol continue" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-cog fa-spin&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_live_icon" desc="symbol live" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-sync fa-spin&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_done_icon" desc="symbol done" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-check&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_manually_icon" desc="symbol manually" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-download&quot;>&lt;/i>"/>
  <atv:gridconfig gridstyle="lines" width="20" height="20" enabled="false"/>
  <atv:snapconfig width="10" height="10" enabled="false"/>
 </metadata>
 <svg xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.slickgrid.table_panel" transform="matrix(1,0,0,1.0586,0,0)" y="1.584" atv:refpx="320.831" id="id_1" width="640" height="580" x="0.839" atv:refpy="308.705">
  <atv:argument name="tableID" prefix="tableID"/>
  <atv:argument name="header_height" prefix="header_height"/>
  <atv:argument name="header_text_size" prefix="header_text_size"/>
  <atv:argument name="row_height" prefix="row_height"/>
  <atv:argument name="row_text_size" prefix="row_text_size"/>
  <atv:argument name="header_text_horizontal" prefix="header_text_horizontal"/>
  <atv:argument name="header_text_vertical" prefix="header_text_vertical"/>
  <atv:argument name="detail_text_size" prefix="detail_text_size"/>
  <atv:argument name="footer_text_size" prefix="footer_text_size"/>
  <atv:argument name="font_family" prefix="font_family"/>
  <atv:argument name="globalBorderColor" prefix="globalBorderColor"/>
  <atv:argument name="theme_class" prefix="theme_class"/>
  <atv:argument name="globalFillColor" prefix="globalFillColor"/>
  <atv:argument name="globalFontColor" prefix="globalFontColor"/>
  <atv:argument name="globalSymbolColor" prefix="globalSymbolColor"/>
  <atv:argument name="globalSymbolColor" prefix="globalInactiveColor"/>
  <atv:argument name="globalColorConfig" prefix="globalColorConfig"/>
  <atv:argument name="columnReorder" prefix="columnReorder"/>
  <atv:argument name="paging" prefix="paging"/>
  <atv:argument name="filterBar" prefix="filterBar"/>
  <atv:argument name="filterRegExp" prefix="filterRegExp"/>
  <atv:argument name="filterStar" prefix="filterStar"/>
  <atv:argument name="filterCaseSensitive" prefix="filterCaseSensitive"/>
  <atv:argument name="filterLength" prefix="filterLength"/>
  <atv:argument name="filterDelay" prefix="filterDelay"/>
  <atv:argument name="linebreak" prefix="linebreak"/>
  <atv:argument name="multiselect" prefix="multiselect"/>
  <atv:argument name="multicellselect" prefix="multicellselect"/>
  <atv:argument name="showMenu" prefix="showMenu"/>
  <atv:argument name="showMenuWidth" prefix="showMenuWidth"/>
  <atv:argument name="showMenuHeight" prefix="showMenuHeight"/>
  <atv:argument name="showMenuPicker" prefix="showMenuPicker"/>
  <atv:argument name="showMenuFilter" prefix="showMenuFilter"/>
  <atv:argument name="showMenuExport" prefix="showMenuExport"/>
  <atv:argument name="allowDirectInput" prefix="allowDirectInput"/>
  <atv:overwrite transform="matrix(1,0,0,0.9446,0,0)" id="id_1" height="613.988"/>
 </svg>
 <svg xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.slickgrid.table_footer" y="615" atv:refpx="320" id="id_2" width="640" height="25" x="0" atv:refpy="627.5">
  <atv:argument name="tableID" prefix="tableID"/>
  <atv:argument name="fas_first_page" prefix="fas_first_page"/>
  <atv:argument name="fas_previous_page" prefix="fas_previous_page"/>
  <atv:argument name="fas_pause_page" prefix="fas_pause_page"/>
  <atv:argument name="fas_stop_page" prefix="fas_stop_page"/>
  <atv:argument name="fas_next_page" prefix="fas_next_page"/>
  <atv:argument name="fas_last_page" prefix="fas_last_page"/>
  <atv:argument name="fas_load_page" prefix="fas_load_page"/>
  <atv:argument name="fas_search_page" prefix="fas_search_page"/>
  <atv:argument name="fas_truncate_icon" prefix="fas_truncate_icon"/>
  <atv:argument name="fas_triggered_icon" prefix="fas_triggered_icon"/>
  <atv:argument name="fas_continue_icon" prefix="fas_continue_icon"/>
  <atv:argument name="fas_live_icon" prefix="fas_live_icon"/>
  <atv:argument name="fas_done_icon" prefix="fas_done_icon"/>
  <atv:argument name="fas_manually_icon" prefix="fas_manually_icon"/>
 </svg>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table.de" BrowseName="1:de" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">de</DisplayName>
		<Description Locale="en">de</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.HtmlHelp</Reference>
		</References>
		<Value>
			<uax:ByteString>PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSI+CiAgICA8dGl0bGU+T0RfaGVscDwvdGl0bGU+CiAgICA8c3R5bGU+ICNwYXJhbWV0ZXIgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgfSA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8aDE+QmVzY2hyZWlidW5nPC9oMT4KPHA+RGllc2VzIERpc3BsYXkgZWlnbmV0IHNpY2ggZiZ1dW1sO3IgZGllIERhcnN0ZWxsdW5nIHZvbiBEYXRlbiBpbiB0YWJlbGxhcmlzY2hlciBGb3JtLiBEYXp1IGlzdCBuZWJlbiBkZXIgRWluc3RlbGx1bmcgZGVyCiAgICBUYWJlbGxlbnBhcmFtZXRlciBlYmVuc28gZGllIEtvbmZpZ3VyYXRpb24gaW0gJnV1bWw7YmVyZ2VvcmRuZXRlbiBEaXNwbGF5IGVyZm9yZGVybGljaC4gRGFzICZ1dW1sO2Jlcmdlb3JkbmV0ZSBEaXNwbGF5c2Ugd2lyZAogICAgaW0gZm9sZ2VuZGVuIGF1Y2ggYWxzIFBhcmVudGRpc3BsYXkgYmV6ZWljaG5ldC48L3A+Cgo8aDI+QW5mb3JkZXJ1bmdlbjwvaDI+CjxwPkRpZSBUYWJlbGxlbmJpYmxpb3RoZWsgZXJmb3JkZXJ0IGpRdWVyeSA+IDEuNyB1bmQgd2lyZCBha3R1ZWxsIG1pdCBqUXVlcnkgPiAzLjMueCBhdXNnZWxpZWZlcnQuPC9wPgo8cD5VbSBLb21wYXRpYmlsaXQmYXVtbDt0c3Byb2JsZW1lIHp1IHZlcm1laWRlbiwgd2lyZCBkaWUgbWl0Z2VsaWVmZXJ0ZSBqUXVlcnkgVmVyc2lvbiBudXIgdmVyd2VuZGV0LCB3ZW5uIGtlaW5lIGJlcmVpdHMKICAgIHZvcmhhbmRlbmUgVmVyc2lvbiBlcmthbm50IHdpcmQuIFNvbGx0ZSBkYWhlciBpbiBlaW5lbSBiZXN0ZWhlbmRlbiBQcm9qZWt0IGpRdWVyeSBiZXJlaXRzIHZlcndlbmRldCB3ZXJkZW4sIGdyZWlmdAogICAgZGllIFRhYmVsbGVuYmlibGlvdGhlayBhdWYgZGllc2UgenVyJnV1bWw7Y2suIEdlaGVuIHNpZSBkYWhlciBzaWNoZXIsIGRhc3MgaW4gZGllc2VtIEZhbGxlIGVpbmUgalF1ZXJ5IFZlcnNpb24gPiAxLjcueAogICAgdmVyd2VuZGV0IHdpcmQhPC9wPgoKPGgxPlBhcmFtZXRlcjwvaDE+CjxwPkRpZSBUYWJlbGxlIGhhdCBkaWUgZm9sZ2VuZGVuIGFsbGdlbWVpbmVuIFBhcmFtZXRlcjo8L3A+Cjx1bD4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5iYXNlPC9zcGFuPjogQWt0dWVsbGUgbmljaHQgaW4gdmVyd2VuZHVuZyA8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVuLUlEPC9zcGFuPjogRWluZGV1dGlnZXIgVGFiZWxsZW5uYW1lPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5UYWJlbGxlbmtvcGYgSCZvdW1sO2hlPC9zcGFuPjogSCZvdW1sO2hlIGRlcyBUYWJlbGxlbmtvcGZlcyBpbiBQaXhlbCAoU3RhbmRhcmQgMzAsICopIDwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+VGFiZWxsZW5rb3BmIFNjaHJpZnRnciZvdW1sOyZzemxpZztlPC9zcGFuPjogU2NocmlmdGdyJm91bWw7JnN6bGlnO2UgaW0gVGFiZWxsZW5rb3BmIChTdGFuZGFyZDogMTQpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5UYWJlbGxlbmtvcGZ6ZWxsZSBob3Jpem9udGFsIGF1c3JpY2h0ZW48L3NwYW4+OiBIb3Jpem9udGFsZSBBdXNyaWNodHVuZyBkZXMgWmVsbGVuaW5oYWx0ZXMgaW0gVGFiZWxsZW5rb3BmIChTdGFuZGFyZDogaW5oZXJpdCk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVua29wZnplbGxlIHZlcnRpY2FsIGF1c3JpY2h0ZW48L3NwYW4+OiBWZXJ0aWthbGUgQXVzcmljaHR1bmcgZGVzIFplbGxlbmluaGFsdGVzIGltIFRhYmVsbGVua29wZiAoU3RhbmRhcmQ6IGNlbnRlcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVuemVpbGUgSCZvdW1sO2hlPC9zcGFuPjogSCZvdW1sO2hlIGRlciBUYWJlbGxlbnplaWxlbiBpbiBQaXhlbCAoU3RhbmRhcmQgMjAsICoqKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+VGFiZWxsZW56ZWlsZSBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZTwvc3Bhbj46IFNjaHJpZnRnciZvdW1sOyZzemxpZztlIGluIGVpbmVyIFRhYmVsbGVuemVpbGUgKFN0YW5kYXJkOiAxMik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkRldGFpbGJlcmVpY2ggU2NocmlmdGdyJm91bWw7JnN6bGlnO2U8L3NwYW4+OiBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZSBmJnV1bWw7ciBUYWJlbGxlbmRldGFpbHMgKFN0YW5kYXJkOiAxMik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVuZnUmc3psaWc7IFNjaHJpZnRnciZvdW1sOyZzemxpZztlPC9zcGFuPjogU2NocmlmdGdyJm91bWw7JnN6bGlnO2UgaW0gVGFiZWxsZW5mdSZzemxpZzsgKFN0YW5kYXJkOiAxMik8L2xpPgo8L3VsPgo8cD48aT4oKikgRXMgd2lyZCBlaW5lIEgmb3VtbDtoZSBkaWUgaW4gZXR3YSBkZW0gZG9wcGVsdGVuIGRlciBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZSBlbnRzcHJpY2h0IGVtcGZvaGxlbi48L2k+PGJyPgogICAgPGk+KCoqKSBCZWkgYWt0aXZpZXJ0ZW0gWmVpbGVudW1icnVjaCB3aXJkIGRpZSAxLDUgRmFjaGUgU2NocmlmdGdyJm91bWw7JnN6bGlnO2UgbWFsIGRhcnp1c3RlbGxlbmRlIFplaWxlIGFscyBIJm91bWw7aGUgZW1wZm9obGVuLjwvaT48L3A+Cgo8cD5EYXJzdGVsbHVuZzo8L3A+Cjx1bD4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TY2hyaWZ0ZmFtaWxpZTwvc3Bhbj46IFNjaHJpZnRmYW1pbGllIChTdGFuZGFyZDogQXJpYWwpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5HbG9iYWxlIFJhaG1lbmZhcmJlPC9zcGFuPjogUXVlbGxlIGYmdXVtbDtyIFJhaG1lbmZhcmJlIChTdGFuZGFyZDogU1lTVEVNLkdMT0JBTFMuYXR2Qm9yZGVyQ29sb3IpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5HbG9iYWxlIEYmdXVtbDtsbGZhcmJlPC9zcGFuPjogUXVlbGxlIGYmdXVtbDtyIEYmdXVtbDtsbGZhcmJlIChTdGFuZGFyZDogU1lTVEVNLkdMT0JBTFMuYXR2RmlsbENvbG9yKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+R2xvYmFsZSBTY2hyaWZ0ZmFyYmU8L3NwYW4+OiAgUXVlbGxlIGYmdXVtbDtyIFNjaHJpZnRmYXJiZSAoU3RhbmRhcmQ6IFNZU1RFTS5HTE9CQUxTLmF0dkZvbnRDb2xvcik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkdsb2JhbGUgU3ltYm9sZmFyYmU8L3NwYW4+OiAgUXVlbGxlIGYmdXVtbDtyIFN5bWJvbGZhcmJlIChTdGFuZGFyZDogU1lTVEVNLkdMT0JBTFMuYXR2U3ltYm9sQ29sb3IpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5HbG9iYWxlIGluYWt0aXZlIEZhcmJlbjwvc3Bhbj46IFF1ZWxsZSBmJnV1bWw7ciBpbmFrdGl2ZSBGYXJiZSAoRGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2SW5hY3RpdmVDb2xvcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkdsb2JhbGUgVGFiZWxsZW5mYXJiZW48L3NwYW4+OiAgIFF1ZWxsZSBmJnV1bWw7ciBUYWJlbGxlbmZhcmJlbiAoU3RhbmRhcmQ6IFNZU1RFTS5HTE9CQUxTLmF0dk9iamVjdERpc3BsYXlzLkJhc2VUYWJsZS5Db2xvckNvbmZpZyk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkJlbnV0emVyZGVmaW5pZXJ0ZXMgVGhlbWU8L3NwYW4+OiBPcHRpb25hbGVzIENTUyBQZmFkIGYmdXVtbDtyIGJlbnV0emVyZGVmaW5pZXJ0ZXMgVGhlbWUgKFN0YW5kYXJkOiBhdHZpc2VUaGVtZSk8L2xpPgo8L3VsPgoKPHA+T3B0aW9uZW46PC9wPgo8dWw+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3BhbHRlbiBuZXUgb3JkbmVuIGVybSZvdW1sO2dsaWNoZW48L3NwYW4+OiBWZXJzY2hpZWJlbiB2b24gU3BhbHRlbiB6dWxhc3NlbiAoU3RhbmRhcmQ6IHRydWUpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5QYWdpbmc8L3NwYW4+OiBBbnplaWdlIGRlciBTZWl0ZW5uYXZpZ2F0aW9uIChTdGFuZGFyZDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkZpbHRlcmxlaXN0ZTwvc3Bhbj46IFRhYmVsbGVuZmlsdGVyIGFuemVpZ2VuIChTdGFuZGFyZDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkZpbHRlciByZWd1bCZhdW1sO3JlIEF1c2RyJnV1bWw7Y2tlPC9zcGFuPjogRmlsdGVyZnVua3Rpb24gYmVudXR6dCBSZWd1bGFyIEV4cHJlc3Npb25zIChTdGFuZGFyZDogZmFsc2UsICoqKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+RmlsdGVyIG1pdCBQbGF0emhhbHRlcjwvc3Bhbj46IEFrdGl2aWVydW5nIGRlcyBQbGF0emhhbHRlcnMgJnF1b3Q7KiZxdW90OyBpbiBkZXIgU3VjaGZ1bmt0aW9uPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5GaWx0ZXIgR3JvJnN6bGlnOy0vS2xlaW5zY2hyZWlidW5nPC9zcGFuPjogR3JvJnN6bGlnOy0gdW5kIEtsZWluc2NocmVpYnVuZyBiZXImdXVtbDtja3NpY2h0aWdlbiAoU3RhbmRhcmQ6IGZhbHNlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+RmlsdGVyIE1pbmRlc2VpbmdhYmU8L3NwYW4+OiBNaW5kZXN0YW56YWhsIGRlciBaZWljaGVuIGJldm9yIGRlciBGaWx0ZXIgYWt0aXYgd2lyZCAoU3RhbmRhcmQ6IDEpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5GaWx0ZXIgVmVyeiZvdW1sO2dlcnVuZzwvc3Bhbj46IFZlcnomb3VtbDtnZXJ1bmcgZGVyIGF1dG9tYXRpc2NoZW4gRmlsdGVydW5nIGluIE1pbGxpc2VrdW5kZW4gKFN0YW5kYXJkOiAxMDAwLCBBYnNjaGFsdGVuIGRlciBBdXRvbWF0aWsgbWl0IDApPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5MYXVmemVpdG1vZHVzIGFuemVpZ2VuPC9zcGFuPjogQW56ZWlnZSBkZXMgTGF1ZnplaXRtb2R1cyBpbiBkZXIgU3RhdHVzemVpbGUgKFN0YW5kYXJkOiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+TWVocmZhY2hhdXN3YWhsPC9zcGFuPjogQWt0aXZpZXJ1bmcgZGVyIE1laHJmYWNoYXVzd2FobCAoU3RhbmRhcmQ6IHRydWUpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5NZWhyZmFjaGF1c3dhaGwsIEtsaWNrIGF1ZiBaZWxsZTwvc3Bhbj46IE1laHJmYWNoYXVzd2FobCwgTWFya2llcmVuIGJlaW0gS2xpY2tlbiBhdWYgWmVsbGUgKFN0YW5kYXJkOiBmYWxzZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlplaWxlbnVtYnJ1Y2ggaW4gWmVsbGVuPC9zcGFuPjogWmVpbGVudW1icnVjaCBpbiBaZWxsZW4genVsYXNzZW4gKFN0YW5kYXJkOiBmYWxzZSwgKioqKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+ZGlyZWt0ZSBFaW5nYWJlIGVybGF1YmVuPC9zcGFuPjogIEF1c3dhaGwgendpc2NoZW4gZGlyZWt0ZXIgRWluZ2FiZSB1bmQgRWluZ2FiZSAmdXVtbDtiZXIgU1ZHIFRhc3RhdHVyLjwvbGk+CjwvdWw+CjxwPjxpPigqKikgV2FybnVuZzogRGllIEZpbHRlcnVuZyBtaXR0bGVzIEhpbGZlIHZvbiBSZWd1bGFyIEV4cHJlc3Npb25zIGthbm4gYmVpIGdybyZzemxpZztlbiBEYXRlbm1lbmdlbiB6dSBlaW5lbSBzdGFya2VuIFBlcmZvcm1hbmNlYWJmYWxsIGYmdXVtbDtocmVuITwvaT4KICAgIDxpPigqKiopIEJlaSBha3RpdmllcnRlbSBaZWlsZW51bWJydWNoIHdpcmQgZGllIDEsNSBGYWNoZSBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZSBtYWwgZGFyenVzdGVsbGVuZGUgWmVpbGUgYWxzIEgmb3VtbDtoZSBlbXBmb2hsZW4uPC9pPjxicj4KPC9wPgoKPHA+TWVuJnV1bWw7IE9wdGlvbmVuOjwvcD4KPHVsPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPk1lbiZ1dW1sOyBhbnplaWdlbjwvc3Bhbj46IEFuemVpZ2UgZGVzIE1lbiZ1dW1sO2J1dHRvbnMgKFN0YW5kYXJkOiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+TWVuJnV1bWw7YnJlaXRlPC9zcGFuPjogIEJyZWl0ZSBkZXMgTWVuJnV1bWw7cyBiZWkgQXVma2xhcHBlbiBpbiBQaXhlbCAoU3RhbmRhcmQ6IDE1MCk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPk1lbiZ1dW1sO2gmb3VtbDtoZTwvc3Bhbj46IEgmb3VtbDtoZSBkZXMgTWVuJnV1bWw7cyBiZWkgQXVma2xhcHBlbiBpbiBQaXhlbCAoU3RhbmRhcmQ6IDMwMCk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlNwYWx0ZW5hdXN3YWhsIGltIE1lbiZ1dW1sOzwvc3Bhbj46IEFuemVpZ2UgZGVyIFNwYWx0ZW5hdXN3YWhsIGltIE1lbiZ1dW1sOyAoU3RhbmRhcmQ6IHRydWUpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5GaWx0ZXJhdXN3YWhsIGltIE1lbiZ1dW1sOzwvc3Bhbj46IEFuemVpZ2UgZGVyIEZpbHRlcmF1c3dhaGwgaW0gTWVuJnV1bWw7IChTdGFuZGFyZDogdHJ1ZSk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkV4cG9ydGF1c3dhaGwgaW0gTWVuJnV1bWw7PC9zcGFuPjogQW56ZWlnZSBkZXIgRXhwb3J0YXVzd2FobCBpbSBNZW4mdXVtbDsgKFN0YW5kYXJkOiB0cnVlKTwvbGk+CjwvdWw+Cgo8aDI+SGlud2VpczwvaDI+CjxwPjxiPkFiIFZlcnNpb24gMy40IHdlcmRlbiBTVkctU3ltYm9sZSBpbiBkZXIgRnUmc3psaWc7emVpbGUgbmljaHQgbWVociB1bnRlcnN0JnV1bWw7dHp0LiBCaXR0ZSB2ZXJ3ZW5kZW4gU2llIG51ciBtZWhyIFN5bWJvbGUgYXVzIGRlciBCaWJsaW90aGVrIHZvbiBGb250IEF3ZXNvbWUgRnJlZS48L2I+PC9wPgoKPHA+RnVzc3plaWxlIE9wdGlvbmVuOjwvcD4KPHVsPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBlcnN0ZSBTZWl0ZTwvc3Bhbj46IFN5bWJvbCB6dW0gYmwmYXVtbDt0dGVybiBhdWYgZGllIGVyc3RlIFNlaXRlIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1mYXN0LWJhY2t3YXJkIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3ltYm9sIHZvcmlnZSBTZWl0ZTwvc3Bhbj46IFN5bWJvbCB6dW0gYmwmYXVtbDt0dGVybiBhdWYgZGllIHZvcmdlaGVuZGUgU2VpdGUgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtYmFja3dhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgUGF1c2U8L3NwYW4+OiBTeW1ib2wgZiZ1dW1sO3IgUGF1c2UgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXBhdXNlIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3ltYm9sIFN0b3A8L3NwYW4+OiBTeW1ib2wgZiZ1dW1sO3IgU3RvcCAoU3RhbmRhcmQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtc3RvcCImZ3Q7Jmx0Oy9pJmd0Oyk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBuJmF1bWw7Y2hzdGUgU2VpdGU8L3NwYW4+OiBTeW1ib2wgenVtIGJsJmF1bWw7dHRlcm4gYXVmIGRpZSBuJmF1bWw7Y2hzdGUgU2VpdGUgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtZm9yd2FyZCImZ3Q7Jmx0Oy9pJmd0OykgPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgbGV0enRlIFNlaXRlPC9zcGFuPjogU3ltYm9sIHp1bSBibCZhdW1sO3R0ZXJuIGF1ZiBkaWUgbGV0enRlIFNlaXRlIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1mYXN0LWZvcndhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgU2VpdGVuIGxhZGVuPC9zcGFuPjogU3ltYm9sIHp1bSBsYWRlbiBkZXIgbiZhdW1sO2Noc3RlbiBTZWl0ZW4gaW0gbWFudWVsbGVuIE1vZHVzIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1kb3dubG9hZCImZ3Q7Jmx0Oy9pJmd0Oyk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBTdWNoZW48L3NwYW4+OiBTeW1ib2wgZiZ1dW1sO3IgU3VjaGUgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXNlYXJjaCImZ3Q7Jmx0Oy9pJmd0Oyk8L2xpPgoKCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgJlV1bWw7YmVybGF1Zjwvc3Bhbj46IFN5bWJvbCBiZWltIEVycmVpY2hlbiBkZXMgJlV1bWw7YmVybGF1ZnMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWJhbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgVHJpZ2dlciBNb2R1czwvc3Bhbj46IFN5bWJvbCBmJnV1bWw7ciBUcmlnZ2VyIE1vZHVzIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1hbmdsZS1kb3VibGUtZG93biImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgQ29udGludWF0aW9uIE1vZHVzPC9zcGFuPjogU3ltYm9sIGYmdXVtbDtyIGZvcnRsYXVmZW5kZW4gTW9kdXMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWNvZyBmYS1zcGluIiZndDsmbHQ7L2kmZ3Q7ICk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBMaXZlIE1vZHVzPC9zcGFuPjogU3ltYm9sIGYmdXVtbDtyIGxpdmUgTW9kdXMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN5bmMgZmEtc3BpbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgTWFudWVsbGVyIE1vZHVzPC9zcGFuPjogU3ltYm9sIGYmdXVtbDtyIG1hbnVlbGxlbiBNb2R1cyAoU3RhbmRhcmQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtY2hlY2siJmd0OyZsdDsvaSZndDsgKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3ltYm9sIEFiZnJhZ2UgQWJnZXNjaGxvc3Nlbjwvc3Bhbj46IFN5bWJvbCBiZWltIEVycmVpY2hlbiBkZXMgJlV1bWw7YmVybGF1ZnMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWRvd25sb2FkIiZndDsmbHQ7L2kmZ3Q7ICk8L2xpPgo8L3VsPgpBbm1lcmt1bmc6IFNMQU8gPSBTWVNURU0uTElCUkFSWS5BVFZJU0UuT0JKRUNURElTUExBWVMKCjxoMT5TY2huZWxscmVmZXJlbno8L2gxPgoKPGgyPlRhYmVsbGVua29uZmlndXJhdGlvbiBmJnV1bWw7ciBlaW5mYWNoZSBEYXRlbmFiZnJhZ2VuICh6LkIuIHdlYk1JLmRhdGEucmVhZCk8L2gyPgo8cD5aaWVoZW4gc2llIGRhcyBUYWJlbGxlbmRpc3BsYXkgaW4gZGFzIFBhcmVudGRpc3BsYXkgdW5kICZvdW1sO2ZmbmVuIHNpZSBkZW4gU2tyaXB0ZWRpdG9yIGYmdXVtbDtyIGRhcyBQYXJlbnRkaXNwbGF5LjwvcD4KPHByZT4KICAgIC8qIExhZGVuIGRlciBUYWJlbGxlbnJlc291cmNlbiAqLwogICAgd2ViTUkudGFibGUubG9hZFJlc291cmNlcyhmdW5jdGlvbiAoKSB7CgogICAgICAgIC8qIEVyc3RlbGxlbiBkZXIgS29uZmlndXJhdGlvbiAqLwogICAgICAgIHZhciBjb25maWcgPSBbXTsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgZGFyenVzdGVsbGVuZGVuIFNwYWx0ZW4gKi8KICAgICAgICBjb25maWdbImNvbHVtbnMiXSA9CiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsgICBpZDogImlkIiwgbmFtZTogIklEIiwgZmllbGQ6ICJpZCIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogImFkZHJlc3MiLCBuYW1lOiAiQWRkcmVzcyIsIGZpZWxkOiAiYWRkcmVzcyIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogInZhbHVlIiwgbmFtZTogIldlcnQiLCBmaWVsZDogInZhbHVlIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9CiAgICAgICAgICAgIF07CgogICAgICAgIC8qIEtvbmZpZ3VyYXRpb24gZGVzIExhdWZ6ZWl0dmVyaGFsdGVuICovCiAgICAgICAgY29uZmlnWyJtb2RlIl0gPSAib25jZSI7CgogICAgICAgIC8qIEJlaXNwaWVsZGF0ZW4gKi8KICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgIGRhdGEucmVzdWx0ID0gWwogICAgICAgICAgICB7IGlkOjAsIGFkZHJlc3M6ICJub2RlIDEiLCB2YWx1ZTogMTIzIH0sCiAgICAgICAgICAgIHsgaWQ6MSwgYWRkcmVzczogIm5vZGUgMiIsIHZhbHVlOiA0NTYgfSwKICAgICAgICAgICAgeyBpZDoyLCBhZGRyZXNzOiAibm9kZSAzIiwgdmFsdWU6IDc4OSB9LAogICAgICAgICAgICAuLi4KICAgICAgICBdOwoKICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlciBEYXRlbmFiZnJhZ2UgKi8KICAgICAgICBjb25maWdbImRhdGFSZXF1ZXN0RnVuY3Rpb24iXSA9CiAgICAgICAgICAgIGZ1bmN0aW9uIGN1c3RvbURhdGFSZXF1ZXN0KGNvbnRpbnVhdGlvbikgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgLyogUmVnaXN0aWVydW5nIGRlciBLb25maWd1cmF0aW9uICovCiAgICAgICAgd2ViTUkudGFibGUucmVnaXN0ZXIoIm15VGFibGVOYW1lIiwgImNvbmZpZyIsICBjb25maWcpOwogICAgICAgIHdlYk1JLnRhYmxlLnNldFJlYWR5KCJteVRhYmxlTmFtZSIsICJjb25maWciKTsKICAgIH0pOwo8L3ByZT4KPHA+U3BlaWNoZXJuIHNpZSBkZW4gQ29kZSBkZXMgUGFyZW50ZGlzcGxheSB1bmQgcGFyYW1ldHJpZXJlbiBzaWUgZGllIFRhYmVsbGUgd2llIGdld29obnQuIFRyYWdlbiBzaWUgYmVpIFRhYmVsbGVubmFtZSAibXlUYWJsZU5hbWUiIGVpbi48L3A+Cgo8aDI+VGFiZWxsZW5rb25maWd1cmF0aW9uIGYmdXVtbDtyIGVpbmZhY2hlIERhdGVuYWJmcmFnZW4gKHouQi4gd2ViTUkuZGF0YS5yZWFkKTwvaDI+CjxwPlppZWhlbiBzaWUgZGFzIFRhYmVsbGVuZGlzcGxheSBpbiBkYXMgUGFyZW50ZGlzcGxheSB1bmQgJm91bWw7ZmZuZW4gc2llIGRlbiBTa3JpcHRlZGl0b3IgZiZ1dW1sO3IgZGFzIFBhcmVudGRpc3BsYXkuPC9wPgo8cHJlPgogICAgLyogTGFkZW4gZGVyIFRhYmVsbGVucmVzb3VyY2VuICovCiAgICB3ZWJNSS50YWJsZS5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLyogRXJzdGVsbGVuIGRlciBLb25maWd1cmF0aW9uICovCiAgICAgICAgdmFyIGNvbmZpZyA9IFtdOwoKICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlciBkYXJ6dXN0ZWxsZW5kZW4gU3BhbHRlbiAqLwogICAgICAgIGNvbmZpZ1siY29sdW1ucyJdID0KICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgeyAgIGlkOiAiaWQiLCBuYW1lOiAiSUQiLCBmaWVsZDogImlkIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9LAogICAgICAgICAgICAgICAgeyAgIGlkOiAiYWRkcmVzcyIsIG5hbWU6ICJBZGRyZXNzIiwgZmllbGQ6ICJhZGRyZXNzIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9LAogICAgICAgICAgICAgICAgeyAgIGlkOiAidmFsdWUiLCBuYW1lOiAiV2VydCIsIGZpZWxkOiAidmFsdWUiLCBzb3J0YWJsZTogdHJ1ZSwgZmlsdGVyOiB0cnVlIH0KICAgICAgICAgICAgXTsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXMgTGF1ZnplaXR2ZXJoYWx0ZW4gKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJvbmNlIjsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgRGF0ZW5hYmZyYWdlICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHdlYk1JLmRhdGEucmVhZCgKICAgICAgICAgICAgICAgICAgICAiWU9VUl9OT0RFX0FERFJFU1MiLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXF1ZXN0UmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0ID0gcmVxdWVzdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgLyogUmVnaXN0aWVydW5nIGRlciBLb25maWd1cmF0aW9uICovCiAgICAgICAgd2ViTUkudGFibGUucmVnaXN0ZXIoIm15VGFibGVOYW1lIiwgImNvbmZpZyIsICBjb25maWcpOwogICAgICAgIHdlYk1JLnRhYmxlLnNldFJlYWR5KCJteVRhYmxlTmFtZSIsICJjb25maWciKTsKICAgIH0pOwo8L3ByZT4KPHA+U3BlaWNoZXJuIHNpZSBkZW4gQ29kZSBkZXMgUGFyZW50ZGlzcGxheSB1bmQgcGFyYW1ldHJpZXJlbiBzaWUgZGllIFRhYmVsbGUgd2llIGdld29obnQuIFRyYWdlbiBzaWUgYmVpIFRhYmVsbGVubmFtZSAibXlUYWJsZU5hbWUiIGVpbi48L3A+Cgo8aDI+VGFiZWxsZW5rb25maWdydWF0aW9uIGYmdXVtbDtyIExpdmUgRGF0ZW48L2gyPgo8cD5aaWVoZW4gc2llIGRhcyBUYWJlbGxlbmRpc3BsYXkgaW4gZGFzIFBhcmVudGRpc3BsYXkgdW5kICZvdW1sO2ZmbmVuIHNpZSBkZW4gU2tyaXB0ZWRpdG9yIGYmdXVtbDtyIGRhcyBQYXJlbnRkaXNwbGF5LiBGJnV1bWw7Z2VuCiAgICBzaWUgZGllIEtvbmZpZ3VyYXRpb24gZiZ1dW1sO3IgZWluZmFjaGUgRGF0ZW5hYmZyYWdlbiBlaW4uIERhbmFjaCAmYXVtbDtuZGVybiBzaWUgZGVuIE1vZHVzIHVuZCBtb2RpZml6aWVyZW4gc2llCiAgICBpaHJlIERhdGVuYWJmcmFnZSB3aWUgZm9sZ3QuCjwvcD4KPHByZT4KICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlcyAgTGF1ZnplaXR2ZXJoYWx0ZW4gKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJsaXZlIjsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgRGF0ZW5hYmZyYWdlICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHNlbGYuc3Vic2NyaWJlSUQgPSB3ZWJNSS5kYXRhLnN1YnNjcmliZSgKICAgICAgICAgICAgICAgICAgICAiWU9VUl9OT0RFX0FERFJFU1MiLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXF1ZXN0UmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0ID0gcmVxdWVzdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgd2ViTUkuYWRkT251bmxvYWQoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB3ZWJNSS5kYXRhLnVuc3Vic2NyaWJlKHNlbGYuc3Vic2NyaWJlSUQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CjwvcHJlPgoKPGgyPlRhYmVsbGVua29uZmlncnVhdGlvbiBmJnV1bWw7ciAiQ29udGludWF0aW9uIFBvaW50cyIgKGNvbnRpbnVlIC8gdHJpZ2dlcik8L2gyPgo8cD5aaWVoZW4gc2llIGRhcyBUYWJlbGxlbmRpc3BsYXkgaW4gZGFzIFBhcmVudGRpc3BsYXkgdW5kICZvdW1sO2ZmbmVuIHNpZSBkZW4gU2tyaXB0ZWRpdG9yIGYmdXVtbDtyIGRhcyBQYXJlbnRkaXNwbGF5LiBGJnV1bWw7Z2VuCiAgICBzaWUgZGllIEtvbmZpZ3VyYXRpb24gZiZ1dW1sO3IgZWluZmFjaGUgRGF0ZW5hYmZyYWdlbiBlaW4uIERhbmFjaCAmYXVtbDtuZGVybiBzaWUgZGVuIE1vZHVzIHVuZCBtb2RpZml6aWVyZW4gc2llCiAgICBpaHJlIERhdGVuYWJmcmFnZSB3aWUgZm9sZ3QuCjwvcD4KPHByZT4KICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlcyAgTGF1ZnplaXR2ZXJoYWx0ZW4gKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJjb250aW51ZSI7IC8vIDw8PCBmJnV1bWw7ciBkZW4gVHJpZ2dlcm1vZHVzIGVyc2V0emVuIHNpZSAiY29udGludWUiIGR1cmNoICJ0cmlnZ2VyZWQiCgogICAgICAgIC8qIEtvbmZpZ3VyYXRpb24gZGVyIERhdGVuYWJmcmFnZSAqLwoJCWNvbmZpZ1siZGF0YVJlcXVlc3RGdW5jdGlvbiJdID0KCQkJZnVuY3Rpb24gY3VzdG9tRGF0YVJlcXVlc3QoY29udGludWF0aW9uKSB7CgkJCQl2YXIgc2VsZiA9IHRoaXM7CgkJCQlpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCQkJCWZpbHRlciA9IGNvbnRpbnVhdGlvbi5DUC52YWx1ZTsKCQkJCQl3ZWJNSS5kYXRhLnF1ZXJ5TmV4dCgKCQkJCQkJZmlsdGVyLAoJCQkJCQlhZGREYXRhVG9Db250cm9sbGVyCgkJCQkJKTsKCQkJCX0gZWxzZSB7CgkJCQkJZmlsdGVyID0gewoJCQkJCQlhZGRyZXNzOiBbImc6KllPVVJfTk9ERV9BRERSRVNTKiJdLAoJCQkJCQlzZWxlY3Q6IFsidjpwcmlvcml0eSIsICJ2OnZhbHVlIiwgInY6dXNlcm5hbWUiLCAidjphZGRyZXNzIiwgInY6dGltZXN0YW1wIiwgInY6dHlwZSIsICJ2OnN0YXR1cyIsICJ2OlJlcGxhY2VtZW50TmFtZXMiLCAidjpSZXBsYWNlbWVudFZhbHVlcyJdLAoJCQkJCQl0eXBlOiBbInY6MSJdLAoJCQkJCQludW1yb3dzOlsidjoxMDAwIl0KCQkJCQl9OwoJCQkJCXdlYk1JLmRhdGEucXVlcnlGaWx0ZXIoCgkJCQkJCWZpbHRlciwKCQkJCQkJYWRkRGF0YVRvQ29udHJvbGxlcgoJCQkJCSk7CgkJCQl9CgkJCQlmdW5jdGlvbiBhZGREYXRhVG9Db250cm9sbGVyKHJlcXVlc3RSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlcXVlc3RSZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgIC8qIEhpbnp1ZiZ1dW1sO2dlbiBkZXIgIkNvbnRpbnVhdGlvbiIgSW5mb3JtYXRpb25lbiAqLwoJCQkJCWlmICh0eXBlb2YgZGF0YS5Nb3JlICE9ICJ1bmRlZmluZWQiICYmIGRhdGEuTW9yZSAhPSBmYWxzZSAmJiBkYXRhLmNvbnRpbnVhdGlvbnBvaW50ID4gMCkgewoJCQkJCQlkYXRhLkNQID0ge307CgkJCQkJCWRhdGEuQ1AudmFsdWUgPSByZXF1ZXN0UmVzdWx0LmNvbnRpbnVhdGlvbnBvaW50OwoJCQkJCX0gZWxzZSB7CgkJCQkJCWRhdGEuTW9yZSA9IGZhbHNlOwoJCQkJCX0KCgkJCQkJdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKCQkJCX0KCQkJfTsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgRnJlaWdhYmUgKi8KICAgICAgICBjb25maWdbImRhdGFSZWxlYXNlRnVuY3Rpb24iXSA9CiAgICAgICAgICAgIGZ1bmN0aW9uIGRhdGFSZWxlYXNlRnVuY3Rpb24oY29udGludWF0aW9uKSB7CgkgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCSAgICAgICAgICAgIHdlYk1JLmRhdGEucXVlcnlSZWxlYXNlKGNvbnRpbnVhdGlvbi5DUC52YWx1ZSk7CgkgICAgICAgIH0KICAgICAgICB9Cgo8L3ByZT4KCjxoMj5adWdyaWZmIGF1ZiBUYWJlbGxlbmluaGFsdGU8L2gyPgo8cD5EZXIgZWluZmFjaHN0ZSBXZWcgYXVmIFRhYmVsbGVuaW5oYWx0ZSB6dXp1Z3JlaWZlbiwgaXN0IGRpZSBWZXJ3ZW5kdW5nIGRlciBvbkNsaWNrQ2FsbGJhY2sgS29uZmlndXJhdGlvbi4KCSZVdW1sO2JlciBkaWVzZXMgQ2FsbGJhY2sgayZvdW1sO25uZW4gZGFzIEV2ZW50IHVuZCBkaWUgSW5mb3MgJnV1bWw7YmVyIGRhcyBzZWxla3RpZXJ0ZSBJdGVtIGluIGVpbmVyIGJlbnV0emVyZGVmaW5pZXJ0ZW4KCUZ1bmt0aW9uIHZlcmFyYmVpdGV0IHdlcmRlbiAoei5CLiBBdWZydWYgZWlnZW5lciBEaWFsb2dlKSA8L3A+CjxwcmU+CiAgICAvKiBMYWRlbiBkZXIgVGFiZWxsZW5yZXNvdXJjZW4gKi8KICAgIHdlYk1JLnRhYmxlLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24gKCkgewoKICAgICAgICAvKiBFcnN0ZWxsZW4gZGVyIEtvbmZpZ3VyYXRpb24gKi8KICAgICAgICB2YXIgY29uZmlnID0gW107CgogICAgICAgIC4uLgoKICAgICAgICBjb25maWdbIm9uQ2xpY2tDYWxsYmFjayJdID0gZnVuY3Rpb24oZSwgaW5mbyl7CiAgICAgICAgICB2YXIgaXRlbSA9IGluZm8uaXRlbTsKICAgICAgICAgIHZhciByb3cgPSBpbmZvLnJvd0luZGV4OwogICAgICAgICAgdmFyIGNvbHVtbiA9IGluZm8uY29sdW1uOwoKICAgICAgICAgIHZhciBpZCA9IGl0ZW0uaWQ7CiAgICAgICAgICBpdGVtLnZhbHVlID0gImNoYW5nZWQgdmFsdWUiOwoKICAgICAgICAgIC8qIHVwZGF0ZS9kZWxldGUvd2luZG93ICovCiAgICAgICAgICBpZihjb2x1bW4uaWQgPT0gInRpbWVzdGFtcCIpewogICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIudXBkYXRlRGF0YShpZCwgaXRlbSk7CiAgICAgICAgICB9IGVsc2UgaWYoY29sdW1uLmlkID09ICJ2YWx1ZSIpewogICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIucmVtb3ZlRGF0YShpZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvcGVuTXlXaW5kb3dGdW5rdGlvblRvRWRpdChpdGVtKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC4uLgoKICAgIH0pOwo8L3ByZT4KCjxoMj5TdWNoZSBuYWNoIFdlcnRlbiBpbiBkZXIgVGFiZWxsZTwvaDI+CjxwPk1pdCBIaWxmZSBkZXIgc2VhcmNoKGF0dHJpYnV0ZSwgdmFsdWUsIGV4YWN0U2VhcmNoKSBGdW5rdGlvbiBrYW5uIGluIGRlciBUYWJlbGxlIG5hY2ggV2VydGVuIGdlc3VjaHQgd2VyZGVuLgoJSW0gVHJlZmZlcmZhbGxlIHdlcmRlbiBkaWUgZ2VmdW5kZW4gSXRlbXMgaW4gZWluZW0gQXJyYXkgenVy/GNrZ2VnZWJlbi48L3A+CjxwcmU+CiAgd2ViTUkudGFibGUud2FpdFJlYWR5KCJteVRhYmxlTmFtZSIsICJjb250cm9sbGVyIiwgZnVuY3Rpb24gKCkgewoKICAgIHRhYmxlQ29udHJvbGxlciA9IHdlYk1JLnRhYmxlLnJlcXVlc3QoIm15VGFibGVOYW1lIiwgImNvbnRyb2xsZXIiKTsKICAgIHZhciBpdGVtQXJyYXkgPSB0YWJsZUNvbnRyb2xsZXIuc2VhcmNoKCJ0aW1lc3RhbXAiLCAxNTUzNzg1MTEwNTAwLCB0cnVlKTsKCiAgICB2YXIgaWQgPSBpdGVtQXJyYXlbMF0uaWQ7CiAgICBpdGVtQXJyYXlbMF0udmFsdWUgPSAiY2hhbmdlZCB2YWx1ZSI7CgogICAgLyogdXBkYXRlICovCiAgICB0YWJsZUNvbnRyb2xsZXIudXBkYXRlRGF0YShpZCwgaXRlbUFycmF5WzBdKTsKCiAgICAvKiBkZWxldGUgKi8KICAgIHRhYmxlQ29udHJvbGxlci5yZW1vdmVEYXRhKGlkKTsKCiAgfSk7CjwvcHJlPgoKPGgyPlRpbWVzdGFtcCBLb252ZXJ0aWVydW5nPC9oMj4KPHA+TWl0IGF0dmlzZSAzLjMuMiB3aXJkIGRlciBUaW1lc3RhbXAgdm9uICJkYXRldGltZSIgU3BhbHRlbiBuaWNodCBsJmF1bWw7bmdlciBhbHMgU3RyaW5nIGdlbGllZmVydC4gRGFoZXIgaXN0IGVzIG5vdHdlbmRpZyBkZW4gZ2VsaWVmZXJ0ZW4gVGltZXN0YW1wIG1pdCBIaWxmZSBlaW5lcyBGb3JtYXR0ZXJzIGlubmVyaGFsYiBkZXIgVGFiZWxsZSBpbiBlaW5lbiBTdHJpbmcgdW16dXdhbmRlbG4uPC9wPgo8cD5CZWlzcGllbDo8L3A+CjxwcmU+CglmdW5jdGlvbiBfbWFrZUNvbnZlcnNpb25zKGZvcm1hdCwgdmFsdWUpIHsKCWlmIChmb3JtYXRbMF0gPT0gImRhdGV0aW1lIikgewoJCWlmICh2YWx1ZSkgewoJCQlpZiAodHlwZW9mIHZhbHVlID09ICJzdHJpbmciICYmIHZhbHVlLmluZGV4T2YoIi0iKSA+IC0xKQkJLy9pZ25vcmUgYWxyZWFkeSBmb3JtYXR0ZWQgdmFsdWVzCgkJCQlyZXR1cm4gdmFsdWU7CgoJCQl2YXIgZGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KHZhbHVlLCAxMCkpOwoJCQl2YWx1ZSA9IHdlYk1JLnNwcmludGYoIiVkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZC4lMDNkIiwgZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCksIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpOwoJCX0gZWxzZSB7CgkJCXZhbHVlID0gIiI7CgkJfQoJfQoJcmV0dXJuICc8ZGl2IGNsYXNzPSJzbGljay1jZWxsLWl0ZW0iPicrdmFsdWUrJzwvZGl2Pic7Cgl9CjwvcHJlPgo8aDE+VGFiZWxsZW5rb25maWd1cmF0aW9uZW48L2gxPgo8cD5XZWl0ZXIgS29uZmlndXJhdGlvbnNoaWxmZSBlcmhhbHRlbiBzaWUgaW4gZGVyIGF0dmlzZSBEb2t1bWVudGF0aW9uIHVuZCBiZWkgYXR2aXNlIExpdmUhPC9wPgo8YnI+CjwvYm9keT4KPC9odG1sPg==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table.en" BrowseName="1:en" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">en</DisplayName>
		<Description Locale="en">en</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.HtmlHelp</Reference>
		</References>
		<Value>
			<uax:ByteString>PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSI+CiAgICA8dGl0bGU+T0RfaGVscDwvdGl0bGU+CiAgICA8c3R5bGU+ICNwYXJhbWV0ZXIgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgfSA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8aDE+RGVzY3JpcHRpb248L2gxPgo8cD5UaGlzIGRpc3BsYXkgaXMgc3VpdGFibGUgZm9yIGRpc3BsYXlpbmcgZGF0YSBpbiB0YWJ1bGFyIGZvcm0uIEluIGFkZGl0aW9uIHRvIHRoZSBzZXR0aW5nIG9mIHRoZQogICAgVGFibGUgcGFyYW1ldGVycyBhbHNvIHJlcXVpcmUgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGhpZ2hlci1sZXZlbCBkaXNwbGF5LiBUaGUgaGlnaGVyLWxldmVsIGRpc3BsYXkgd2lsbCBiZQogICAgaW4gdGhlIGZvbGxvd2luZyBhbHNvIHJlZmVycmVkIHRvIGFzIFBhcmVudGRpc3BsYXkuPC9wPgoKPGgyPkNvbmRpdGlvbnM8L2gyPgo8cD5UaGUgdGFibGUgbGlicmFyeSByZXF1aXJlcyBqUXVlcnk+IDEuNyBhbmQgaXMgY3VycmVudGx5IHNoaXBwZWQgd2l0aCBqUXVlcnk+IDMuMy54LjwvcD4KPHA+VG8gYXZvaWQgY29tcGF0aWJpbGl0eSBpc3N1ZXMsIHRoZSBpbmNsdWRlZCBqUXVlcnkgdmVyc2lvbiBpcyBvbmx5IHVzZWQgaWYgbm9uZSBhbHJlYWR5CiAgICBleGlzdGluZyB2ZXJzaW9uIGlzIGRldGVjdGVkLiBUaGVyZWZvcmUgalF1ZXJ5IHNob3VsZCBhbHJlYWR5IGJlIHVzZWQgaW4gYW4gZXhpc3RpbmcgcHJvamVjdAogICAgdGhlIHNwcmVhZHNoZWV0IGxpYnJhcnkgdG8gdGhlbS4gVGhlcmVmb3JlLCBtYWtlIHN1cmUgdGhhdCBpbiB0aGlzIGNhc2UgYSBqUXVlcnkgdmVyc2lvbj4gMS43LngKICAgIGlzIHVzZWQhPC9wPgoKPGgxPlBhcmFtZXRlcjwvaDE+CjxwPlRoZSB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBnZW5lcmFsIHBhcmFtZXRlcnM6OjwvcD4KPHVsPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmJhc2U8L3NwYW4+OiBDdXJyZW50IG5vdCBpbiB1c2U8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIElEPC9zcGFuPjogVW5pcXVlIHRhYmxlIG5hbWU8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIGhlYWRlciBoZWlnaHQ8L3NwYW4+OiBIZWlnaHQgb2YgdGFibGUgaGVhZGVyIGluIHBpeGVscyAoZGVmYXVsdCAzMCwgKik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIGhlYWRlciBmb250IHNpemU8L3NwYW4+OiBGb250IHNpemUgaW4gdGhlIHRhYmxlIGhlYWRlciAoZGVmYXVsdDogMTQpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj50YWJsZSBoZWFkZXIgY2VsbCBhbGlnbiBob3Jpem9udGFsPC9zcGFuPjogSG9yaXpvbnRhbCBhbGlnbiBvZiBjb250ZW50IGluIGhlYWRlciAoZGVmYXVsdDogaW5oZXJpdCk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIGhlYWRlciBjZWxsIGFsaWduIHZlcnRpY2FsPC9zcGFuPjogVmVydGljYWwgYWxpZ24gb2YgY29udGVudCBpbiBoZWFkZXIgKGRlZmF1bHQ6IGNlbnRlcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIHJvdyBoZWlnaHQ8L3NwYW4+OiBIZWlnaHQgb2YgdGFibGUgcm93cyBpbiBwaXhlbHMgKGRlZmF1bHQgMjAsICoqKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+dGFibGUgcm93IGZvbnQgc2l6ZTwvc3Bhbj46IEZvbnQgc2l6ZXMgaW4gYSB0YWJsZSByb3cgKGRlZmF1bHQ6IDEyKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+dGFibGUgZGV0YWlsIGZvbnQgc2l6ZTwvc3Bhbj46IEZvbnQgc2l6ZSBmb3IgdGFibGUgZGV0YWlscyAoZGVmYXVsdDogMTIpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj50YWJsZSBmb290ZXIgZm9udCBzaXplPC9zcGFuPjogRm9udCBzaXplIGluIHRhYmxlIGZvb3RlciAoZGVmYXVsdDogMTIpPC9saT4KPC91bD4KPHA+PGk+KCopSSB0IGlzIHJlY29tbWVuZGVkIHRvIGhhdmUgYSBoZWlnaHQgdGhhdCBpcyBhcHByb3hpbWF0ZWx5IHR3aWNlIHRoZSBkcmF3aW5nIGhlaWdodC48L2k+PGJyPgogICAgPGk+KCoqKSBJZiB0aGUgbGluZSBicmVhayBpcyBhY3RpdmUsIHRoZSBsaW5lIG9mIGNoYXJhY3RlcnMgMS41IHRpbWVzIHRoZSBzaXplIG9mIHRoZSBmb250IGlzIHJlY29tbWVuZGVkIGFzIHRoZQogICAgICAgIGhpZ2hlc3QgdmFsdWUuPC9pPjwvcD4KCjxwPkFwcGVhcmFuY2U6PC9wPgo8dWw+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Zm9udCBmYW1pbHk8L3NwYW4+OiBGb250IGZhbWlseSAoZGVmYXVsdDogQXJpYWwpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5nbG9iYWwgYm9yZGVyIGNvbG9yczwvc3Bhbj46IFNvdXJjZSBmb3IgZnJhbWUgY29sb3IgKGRlZmF1bHQ6IFNZU1RFTS5HTE9CQUxTLmF0dkJvcmRlckNvbG9yKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Z2xvYmFsIGZpbGwgY29sb3JzPC9zcGFuPjogU291cmNlIGZvciBjb2xvciAoZGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2RmlsbENvbG9yKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Z2xvYmFsIGZvbnQgY29sb3JzPC9zcGFuPjogU291cmNlIGZvciBmb250IGNvbG9yIChkZWZhdWx0OiBTWVNURU0uR0xPQkFMUy5hdHZGb250Q29sb3IpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5nbG9iYWwgc3ltYm9sIGNvbG9yczwvc3Bhbj46IFNvdXJjZSBmb3IgSWNvbiBDb2xvciAoRGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2U3ltYm9sQ29sb3IpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5nbG9iYWwgaW5hY3RpdmUgY29sb3JzPC9zcGFuPjogU291cmNlIGZvciBpbmFjdGl2ZSBDb2xvciAoRGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2SW5hY3RpdmVDb2xvcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmdsb2JhbCB0YWJsZSBjb2xvcnM8L3NwYW4+OiBTb3VyY2UgZm9yIHRhYmxlIGNvbG9ycyAoZGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2T2JqZWN0RGlzcGxheXMuQmFzZVRhYmxlLkNvbG9yQ29uZmlnKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Y3VzdG9tIHRoZW1lPC9zcGFuPjogT3B0aW9uYWwgQ1NTIHBhdGggZm9yIGN1c3RvbSB0aGVtZSAoZGVmYXVsdDogYXR2aXNlVGhlbWUpPC9saT4KPC91bD4KCjxwPk9wdGlvbnM6PC9wPgo8dWw+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Y29sdW1ucyByZW9yZGVyYWJsZTwvc3Bhbj46IEFsbG93IG1vdmluZyBjb2x1bW5zIChkZWZhdWx0OiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+cGFnaW5nPC9zcGFuPjogRGlzcGxheSBvZiBwYWdlIG5hdmlnYXRpb24gKGRlZmF1bHQ6IHRydWUpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5maWx0ZXIgYmFyIGVuYWJsZWQ8L3NwYW4+OiBTaG93IHRhYmxlIGZpbHRlciAoZGVmYXVsdDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciByZWd1bGFyIGV4cHJlc3Npb25zPC9zcGFuPjogRmlsdGVyIGZ1bmN0aW9uIHVzZXMgUmVndWxhciBFeHByZXNzaW9ucyAoZGVmYXVsdDogZmFsc2UsICoqKik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciB1c2UgcGxhY2Vob2xkZXI8L3NwYW4+OiBBY3RpdmF0aW9uIG9mIHRoZSAmcXVvdDsqJnF1b3Q7IHBsYWNlaG9sZGVyIGluIHRoZSBzZWFyY2ggZnVuY3Rpb248L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciBjYXNlIHNlbnNpdGl2ZTwvc3Bhbj46IENhc2Utc2Vuc2l0aXZlIChkZWZhdWx0OiBmYWxzZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciBtaW5pbXVtIGxlbmdodDwvc3Bhbj46IE1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYmVmb3JlIHRoZSBmaWx0ZXIgYmVjb21lcyBhY3RpdmUgKGRlZmF1bHQ6IDEpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5maWx0ZXIgc3RhcnQgZGVsYXk8L3NwYW4+OiBEZWxheSBvZiB0aGUgYXV0b21hdGljIGZpbHRlcmluZyBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDEwMDAsIHN3aXRjaGluZyBvZmYgdGhlIGF1dG9tYXRpYyB3aXRoIDApPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zaG93IHJ1bnRpbWUgbW9kZTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIHJ1bnRpbWUgbW9kZSBpbiB0aGUgc3RhdHVzIGJhciAoZGVmYXVsdDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPm11bHRpc2VsZWN0PC9zcGFuPjogQWN0aXZhdGlvbiBvZiB0aGUgbXVsdGlwbGUgc2VsZWN0aW9uIChkZWZhdWx0OiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+bXVsdGlzZWxlY3Qgb24gY2VsbCBjbGljazwvc3Bhbj46IE11bHRpcGxlIHNlbGVjdGlvbiwgbWFya2luZyBieSBjbGlja2luZyBvbiBjZWxsIChkZWZhdWx0OiBmYWxzZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmNlbGwgbGluZWJyZWFrPC9zcGFuPjogQWxsb3cgbGluZSBicmVhayBpbiBjb2x1bW5zIChkZWZhdWx0OiBmYWxzZSwgKiopPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5hbGxvdyBkaXJlY3QgaW5wdXQ8L3NwYW4+OiBzZWxlY3QgIlllcyIgaWYgeW91IHdhbnQgdG8gZGlyZWN0bHkgZW50ZXIgY2hhcmFjdGVycyBpbiB0aGUgY29udHJvbCB3aXRob3V0IG9wZW5pbmcgdGhlIFNWRyBLZXlib2FyZC48L2xpPgo8L3VsPgo8cD48aT4oKiopIElmIHRoZSBsaW5lIGJyZWFrIGlzIGFjdGl2ZSwgdGhlIGxpbmUgb2YgY2hhcmFjdGVycyAxLjUgdGltZXMgdGhlIHNpemUgb2YgdGhlIGZvbnQgaXMgcmVjb21tZW5kZWQgYXMgdGhlCiAgICBoaWdoZXN0IHZhbHVlLjwvaT48YnI+CiAgICA8aT4oKioqKSBXYXJuaW5nOiBGaWx0ZXJpbmcgd2l0aCB0aGUgaGVscCBvZiBSZWd1bGFyIEV4cHJlc3Npb25zIGNhbiBsZWFkIHRvIGEgbGFyZ2UgZHJvcCBpbiBwZXJmb3JtYW5jZSBmb3IgbGFyZ2UKICAgICAgICBhbW91bnRzIG9mIGRhdGEhPC9pPjxicj4KPC9wPgoKPHA+TWVudSBvcHRpb25zOjwvcD4KPHVsPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnNob3cgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIG1lbnUgYnV0dG9uIChkZWZhdWx0OiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+bWVudSBoZWlnaHQ8L3NwYW4+OiBIZWlnaHQgb2YgdGhlIG1lbnUgd2hlbiBvcGVuZWQgaW4gcGl4ZWxzIChkZWZhdWx0OiAzMDApPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5tZW51IHdpZHRoPC9zcGFuPjogIFdpZHRoIG9mIHRoZSBtZW51IHdoZW4gb3BlbmVkIGluIHBpeGVscyAoZGVmYXVsdDogMTUwKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c2hvdyBwaWNrZXIgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIGNvbHVtbiBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuIChEZWZhdWx0OiB0cnVlKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c2hvdyBmaWx0ZXIgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIGZpbHRlciBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuIChEZWZhdWx0OiB0cnVlKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c2hvdyBleHBvcnQgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIGV4cG9ydCBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuIChEZWZhdWx0OiB0cnVlKTwvbGk+CjwvdWw+Cgo8aDI+Tm90ZTwvaDI+CjxwPjxiPkZyb20gdmVyc2lvbiAzLjQgc3ZnIGljb25zIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIGluIGZvb3Rlci4gUGxlYXNlIG9ubHkgdXNlIG1vcmUgc3ltYm9scyBmcm9tIHRoZSBsaWJyYXJ5IG9mIEZvbnQgQXdlc29tZSBGcmVlLjwvYj48L3A+Cgo8cD5Gb290ZXIgb3B0aW9uczo8L3A+Cjx1bD4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgZmlyc3QgcGFnZTwvc3Bhbj46IFN5bWJvbCB0byBvcGVuIHRoZSBmaXJzdCBwYWdlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWZhc3QtYmFja3dhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgcHJldmlvdXMgcGFnZTwvc3Bhbj46IFN5bWJvbCB0byBvcGVuIHRoZSBwcmV2aW91cyBwYWdlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtYmFja3dhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgcGF1c2U8L3NwYW4+OiBTeW1ib2wgZm9yIHBhdXNlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXBhdXNlIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c3ltYm9sIHN0b3A8L3NwYW4+OiBTeW1ib2wgZm9yIHBhdXNlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0b3AiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbmV4dCBwYWdlPC9zcGFuPjogU3ltYm9sIHRvIHNjcm9sbCB0byB0aGUgbmV4dCBwYWdlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtZm9yd2FyZCImZ3Q7Jmx0Oy9pJmd0OykgPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbGFzdCBwYWdlPC9zcGFuPjogU3ltYm9sIHRvIG9wZW4gdGhlIGxhc3QgcGFnZSAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1mYXN0LWZvcndhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbGFvZCBwYWdlczwvc3Bhbj46IFN5bWJvbCBmb3IgbG9hZGluZyB0aGUgbmV4dCBwYWdlcyBpbiBtYW51YWwgbW9kZSAoU3RhbmRhcmQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtZG93bmxvYWQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgc2VhcmNoPC9zcGFuPjogU3ltYm9sIGZvciBzZWFyY2ggKGRlZmF1bHQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtc2VhcmNoIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+CgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnN5bWJvbCB0cnVuY2F0ZTwvc3Bhbj46IFN5bWJvbCB3aGVuIHJlYWNoaW5nIHRoZSBvdmVyZmxvdyAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1iYW4iJmd0OyZsdDsvaSZndDsgKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c3ltYm9sIHRyaWdnZXJlZDwvc3Bhbj46IFN5bWJvbCBmb3IgdHJpZ2dlciBtb2RlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWFuZ2xlLWRvdWJsZS1kb3duIiZndDsmbHQ7L2kmZ3Q7ICk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnN5bWJvbCBjb250aW51ZTwvc3Bhbj46IFN5bWJvbCBmb3IgY29udGludWUgbW9kZSAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1jb2cgZmEtc3BpbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbGl2ZTwvc3Bhbj46IFN5bWJvbCBmb3IgbGl2ZSBtb2RlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN5bmMgZmEtc3BpbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbWFudWFsbHk8L3NwYW4+OiBTeW1ib2wgZm9yIG1hbnVhbGx5IG1vZGUgKGRlZmF1bHQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtY2hlY2siJmd0OyZsdDsvaSZndDsgKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c3ltYm9sIGRvbmU8L3NwYW4+OiBTeW1ib2wgZm9yIGFsbCBkYXRhIGxvYWRlZCAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1kb3dubG9hZCImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KPC91bD4KTm90ZTogKiA9IFNZU1RFTS5MSUJSQVJZLkFUVklTRS5PQkpFQ1RESVNQTEFZUwoKPGgxPlF1aWNrIHJlZmVyZW5jZTwvaDE+CjxoMj5UYWJsZSBjb25maWd1cmF0aW9uIGZvciBhIHNpbXBsZSBkYXRhIHN0cnVjdHVyZTwvaDI+CjxwPkRyYWcgdGhlIHNwcmVhZHNoZWV0IGRpc3BsYXkgaW50byB0aGUgcGFyZW50IGRpc3BsYXkgYW5kIG9wZW4gdGhlIFNjcmlwdCBFZGl0b3IgZm9yIHRoZSBwYXJlbnQgZGlzcGxheS48L3A+CjxwcmU+CiAgICAvKiBMb2FkaW5nIHRoZSB0YWJsZSByZXNvdXJjZXMgKi8KICAgIHdlYk1JLnRhYmxlLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24gKCkgewoKICAgICAgICAvKiBDcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgICB2YXIgY29uZmlnID0gW107CgogICAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkICovCiAgICAgICAgY29uZmlnWyJjb2x1bW5zIl0gPQogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7ICAgaWQ6ICJpZCIsIG5hbWU6ICJJRCIsIGZpZWxkOiAiaWQiLCBzb3J0YWJsZTogdHJ1ZSwgZmlsdGVyOiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7ICAgaWQ6ICJhZGRyZXNzIiwgbmFtZTogIkFkZHJlc3MiLCBmaWVsZDogImFkZHJlc3MiLCBzb3J0YWJsZTogdHJ1ZSwgZmlsdGVyOiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7ICAgaWQ6ICJ2YWx1ZSIsIG5hbWU6ICJXZXJ0IiwgZmllbGQ6ICJ2YWx1ZSIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfQogICAgICAgICAgICBdOwoKICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBydW50aW1lIGJlaGF2aW9yICovCiAgICAgICAgY29uZmlnWyJtb2RlIl0gPSAib25jZSI7CgogICAgICAgIC8qIEV4YW1wbGUgc2V0IG9mIGRhdGEgKi8KICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgIGRhdGEucmVzdWx0ID0gWwogICAgICAgICAgICB7IGlkOjAsIGFkZHJlc3M6ICJub2RlIDEiLCB2YWx1ZTogMTIzIH0sCiAgICAgICAgICAgIHsgaWQ6MSwgYWRkcmVzczogIm5vZGUgMiIsIHZhbHVlOiA0NTYgfSwKICAgICAgICAgICAgeyBpZDoyLCBhZGRyZXNzOiAibm9kZSAzIiwgdmFsdWU6IDc4OSB9LAogICAgICAgICAgICAuLi4KICAgICAgICBdOwoKICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBkYXRhIHF1ZXJ5ICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBpZHMgPSBzZWxmLmFkZERhdGEoZGF0YSk7CiAgICAgICAgICAgIH07CgogICAgICAgIC8qIFJlZ2lzdHJhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgICAgIHdlYk1JLnRhYmxlLnJlZ2lzdGVyKCJteVRhYmxlTmFtZSIsICJjb25maWciLCAgY29uZmlnKTsKICAgICAgICB3ZWJNSS50YWJsZS5zZXRSZWFkeSgibXlUYWJsZU5hbWUiLCAiY29uZmlnIik7CiAgICB9KTsKPC9wcmU+CjxwPlNhdmUgdGhlIGNvZGUgb2YgdGhlIHBhcmVudCBkaXNwbGF5IGFuZCBwYXJhbWV0ZXJpemUgdGhlIHRhYmxlIGFzIHVzdWFsLiBFbnRlciAibXlUYWJsZU5hbWUiIGF0IHRoZSB0YWJsZSBuYW1lLjwvcD4KPGgyPlRhYmxlIGNvbmZpZ3VyYXRpb24gZm9yIGRhdGEgcXVlcmllcyAoZS5nLiB3ZWJNSS5kYXRhLnJlYWQpPC9oMj4KPHA+RHJhZyB0aGUgc3ByZWFkc2hlZXQgZGlzcGxheSBpbnRvIHRoZSBwYXJlbnQgZGlzcGxheSBhbmQgb3BlbiB0aGUgU2NyaXB0IEVkaXRvciBmb3IgdGhlIHBhcmVudCBkaXNwbGF5LjwvcD4KPHByZT4KICAgIC8qIExvYWRpbmcgdGhlIHRhYmxlIHJlc291cmNlcyAqLwogICAgd2ViTUkudGFibGUubG9hZFJlc291cmNlcyhmdW5jdGlvbiAoKSB7CgogICAgICAgIC8qIENyZWF0ZSB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgICAgIHZhciBjb25maWcgPSBbXTsKCiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgY29sdW1ucyB0byBiZSBkaXNwbGF5ZWQgKi8KICAgICAgICBjb25maWdbImNvbHVtbnMiXSA9CiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsgICBpZDogImlkIiwgbmFtZTogIklEIiwgZmllbGQ6ICJpZCIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogImFkZHJlc3MiLCBuYW1lOiAiQWRkcmVzcyIsIGZpZWxkOiAiYWRkcmVzcyIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogInZhbHVlIiwgbmFtZTogIldlcnQiLCBmaWVsZDogInZhbHVlIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9CiAgICAgICAgICAgIF07CgogICAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgdGhlIHJ1bnRpbWUgYmVoYXZpb3IgKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJvbmNlIjsKCiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgZGF0YSBxdWVyeSAqLwogICAgICAgIGNvbmZpZ1siZGF0YVJlcXVlc3RGdW5jdGlvbiJdID0KICAgICAgICAgICAgZnVuY3Rpb24gY3VzdG9tRGF0YVJlcXVlc3QoY29udGludWF0aW9uKSB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgICAgICB3ZWJNSS5kYXRhLnJlYWQoCiAgICAgICAgICAgICAgICAgICAgIllPVVJfTk9ERV9BRERSRVNTIiwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVxdWVzdFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc3VsdCA9IHJlcXVlc3RSZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZHMgPSBzZWxmLmFkZERhdGEoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgIC8qIFJlZ2lzdHJhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgICAgIHdlYk1JLnRhYmxlLnJlZ2lzdGVyKCJteVRhYmxlTmFtZSIsICJjb25maWciLCAgY29uZmlnKTsKICAgICAgICB3ZWJNSS50YWJsZS5zZXRSZWFkeSgibXlUYWJsZU5hbWUiLCAiY29uZmlnIik7CiAgICB9KTsKPC9wcmU+CjxwPlNhdmUgdGhlIGNvZGUgb2YgdGhlIHBhcmVudCBkaXNwbGF5IGFuZCBwYXJhbWV0ZXJpemUgdGhlIHRhYmxlIGFzIHVzdWFsLiBFbnRlciAibXlUYWJsZU5hbWUiIGF0IHRoZSB0YWJsZSBuYW1lLjwvcD4KPGgyPlRhYmxlIGNvbmZpZ3VyYXRpb24gZm9yIGxpdmUgZGF0YTwvaDI+CjxwPkRyYWcgdGhlIHNwcmVhZHNoZWV0IGRpc3BsYXkgaW50byB0aGUgcGFyZW50IGRpc3BsYXkgYW5kIG9wZW4gdGhlIFNjcmlwdCBFZGl0b3IgZm9yIHRoZSBQYXJlbnQgZGlzcGxheS4KICAgIEVudGVyIHRoZSBjb25maWd1cmF0aW9uIGZvciBzaW1wbGUgZGF0YSBxdWVyaWVzLiBUaGVuIGNoYW5nZSB0aGUgbW9kZSBhbmQgbW9kaWZ5IHRoZQogICAgZGF0YSBxdWVyeSBhcyBmb2xsb3dzLgo8L3A+CjxwcmU+CiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgcnVudGltZSBiZWhhdmlvciAqLwogICAgICAgIGNvbmZpZ1sibW9kZSJdID0gImxpdmUiOwoKICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBkYXRhIHF1ZXJ5ICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHNlbGYuc3Vic2NyaWJlSUQgPSB3ZWJNSS5kYXRhLnN1YnNjcmliZSgKICAgICAgICAgICAgICAgICAgICAiWU9VUl9OT0RFX0FERFJFU1MiLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXF1ZXN0UmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0ID0gcmVxdWVzdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgd2ViTUkuYWRkT251bmxvYWQoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB3ZWJNSS5kYXRhLnVuc3Vic2NyaWJlKHNlbGYuc3Vic2NyaWJlSUQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CjwvcHJlPgo8aDI+VGFibGUgY29uZmlndXJhdGlvbiBmb3IgIkNvbnRpbnVhdGlvbiBQb2ludHMiIChjb250aW51ZSAvIHRyaWdnZXIpPC9oMj4KPHA+RHJhZyB0aGUgc3ByZWFkc2hlZXQgZGlzcGxheSBpbnRvIHRoZSBwYXJlbnQgZGlzcGxheSBhbmQgb3BlbiB0aGUgU2NyaXB0IEVkaXRvciBmb3IgdGhlIFBhcmVudCBkaXNwbGF5LgogICAgRW50ZXIgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHNpbXBsZSBkYXRhIHF1ZXJpZXMuIFRoZW4gY2hhbmdlIHRoZSBtb2RlIGFuZCBtb2RpZnkgdGhlCiAgICBkYXRhIHF1ZXJ5IGFzIGZvbGxvd3MuCjwvcD4KPHByZT4KICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBydW50aW1lIGJlaGF2aW9yICovCiAgICAgICAgY29uZmlnWyJtb2RlIl0gPSAiY29udGludWUiOyAvLyA8PDwgZm9yIHRoZSB0cmlnZ2VyIG1vZGUgcmVwbGFjZSAiY29udGludWUiIHdpdGggInRyaWdnZXJlZCIKCiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgZGF0YSBxdWVyeSAqLwoJCWNvbmZpZ1siZGF0YVJlcXVlc3RGdW5jdGlvbiJdID0KCQkJZnVuY3Rpb24gY3VzdG9tRGF0YVJlcXVlc3QoY29udGludWF0aW9uKSB7CgkJCQl2YXIgc2VsZiA9IHRoaXM7CgkJCQlpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCQkJCWZpbHRlciA9IGNvbnRpbnVhdGlvbi5DUC52YWx1ZTsKCQkJCQl3ZWJNSS5kYXRhLnF1ZXJ5TmV4dCgKCQkJCQkJZmlsdGVyLAoJCQkJCQlhZGREYXRhVG9Db250cm9sbGVyCgkJCQkJKTsKCQkJCX0gZWxzZSB7CgkJCQkJZmlsdGVyID0gewoJCQkJCQlhZGRyZXNzOiBbImc6KllPVVJfTk9ERV9BRERSRVNTKiJdLAoJCQkJCQlzZWxlY3Q6IFsidjpwcmlvcml0eSIsICJ2OnZhbHVlIiwgInY6dXNlcm5hbWUiLCAidjphZGRyZXNzIiwgInY6dGltZXN0YW1wIiwgInY6dHlwZSIsICJ2OnN0YXR1cyIsICJ2OlJlcGxhY2VtZW50TmFtZXMiLCAidjpSZXBsYWNlbWVudFZhbHVlcyJdLAoJCQkJCQl0eXBlOiBbInY6MSJdLAoJCQkJCQludW1yb3dzOlsidjoxMDAwIl0KCQkJCQl9OwoJCQkJCXdlYk1JLmRhdGEucXVlcnlGaWx0ZXIoCgkJCQkJCWZpbHRlciwKCQkJCQkJYWRkRGF0YVRvQ29udHJvbGxlcgoJCQkJCSk7CgkJCQl9CgkJCQlmdW5jdGlvbiBhZGREYXRhVG9Db250cm9sbGVyKHJlcXVlc3RSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlcXVlc3RSZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgIC8qIEFkZGluZyAiQ29udGludWF0aW9uIiBpbmZvcm1hdGlvbnMgKi8KCQkJCQlpZiAodHlwZW9mIGRhdGEuTW9yZSAhPSAidW5kZWZpbmVkIiAmJiBkYXRhLk1vcmUgIT0gZmFsc2UgJiYgZGF0YS5jb250aW51YXRpb25wb2ludCA+IDApIHsKCQkJCQkJZGF0YS5DUCA9IHt9OwoJCQkJCQlkYXRhLkNQLnZhbHVlID0gcmVxdWVzdFJlc3VsdC5jb250aW51YXRpb25wb2ludDsKCQkJCQl9IGVsc2UgewoJCQkJCQlkYXRhLk1vcmUgPSBmYWxzZTsKCQkJCQl9CgoJCQkJCXZhciBpZHMgPSBzZWxmLmFkZERhdGEoZGF0YSk7CgkJCQl9CgkJCX07CgogICAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgdGhlIHJlbGVhc2UgKi8KICAgICAgICBjb25maWdbImRhdGFSZWxlYXNlRnVuY3Rpb24iXSA9CiAgICAgICAgICAgIGZ1bmN0aW9uIGRhdGFSZWxlYXNlRnVuY3Rpb24oY29udGludWF0aW9uKSB7CgkgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCSAgICAgICAgICAgIHdlYk1JLmRhdGEucXVlcnlSZWxlYXNlKGNvbnRpbnVhdGlvbi5DUC52YWx1ZSk7CgkgICAgICAgIH0KICAgICAgICB9Cgo8L3ByZT4KCjxoMj5BY2Nlc3MgdG8gdGFibGUgY29udGVudHM8L2gyPgo8cD5UaGUgZWFzaWVzdCB3YXkgdG8gYWNjZXNzIHRhYmxlIGNvbnRlbnRzIGlzIHRvIHVzZSB0aGUgb25DbGlja0NhbGxiYWNrIGNvbmZpZ3VyYXRpb24uCglWaWEgdGhpcyBjYWxsYmFjaywgdGhlIGV2ZW50IGFuZCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGVkIGl0ZW0gY2FuIGJlIGVudGVyZWQgaW4gYSB1c2VyLWRlZmluZWQgb25lCglGdW5jdGlvbiBhcmUgcHJvY2Vzc2VkIChlLmcuLCBjYWxsaW5nIHlvdXIgb3duIGRpYWxvZ3MpPC9wPgo8cHJlPgogICAgLyogTG9hZGluZyB0aGUgdGFibGUgcmVzb3VyY2VzICovCiAgICB3ZWJNSS50YWJsZS5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLyogQ3JlYXRlIHRoZSBjb25maWd1cmF0aW9uICovCiAgICAgICAgLi4uCgogICAgICAgIGNvbmZpZ1sib25DbGlja0NhbGxiYWNrIl0gPSBmdW5jdGlvbihlLCBpbmZvKXsKICAgICAgICAgIHZhciBpdGVtID0gaW5mby5pdGVtOwogICAgICAgICAgdmFyIHJvdyA9IGluZm8ucm93SW5kZXg7CiAgICAgICAgICB2YXIgY29sdW1uID0gaW5mby5jb2x1bW47CgogICAgICAgICAgdmFyIGlkID0gaXRlbS5pZDsKICAgICAgICAgIGl0ZW0udmFsdWUgPSAiY2hhbmdlZCB2YWx1ZSI7CgogICAgICAgICAgLyogdXBkYXRlL2RlbGV0ZS93aW5kb3cgKi8KICAgICAgICAgIGlmKGNvbHVtbi5pZCA9PSAidGltZXN0YW1wIil7CiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci51cGRhdGVEYXRhKGlkLCBpdGVtKTsKICAgICAgICAgIH0gZWxzZSBpZihjb2x1bW4uaWQgPT0gInZhbHVlIil7CiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci5yZW1vdmVEYXRhKGlkKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9wZW5NeVdpbmRvd0Z1bmt0aW9uVG9FZGl0KGl0ZW0pOwogICAgICAgICAgfQogICAgICAgIH0KCgkJLyogUmVnaXN0cmF0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uICovCiAgICAgICAgLi4uCgogICAgfSk7CjwvcHJlPgoKPGgyPlNlYXJjaCBmb3IgdmFsdWVzID8/aW4gdGhlIHRhYmxlPC9oMj4KPHA+VGhlIHNlYXJjaCAoYXR0cmlidXRlLCB2YWx1ZSwgZXhhY3RTZWFyY2gpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHNlYXJjaCBmb3IgdmFsdWVzID8/aW4gdGhlIHRhYmxlLgoJSW4gdGhlIGNhc2Ugb2YgYSBoaXQsIHRoZSBmb3VuZCBpdGVtcyBhcmUgcmV0dXJuZWQgaW4gYW4gYXJyYXkuPC9wPgo8cHJlPgogIHdlYk1JLnRhYmxlLndhaXRSZWFkeSgibXlUYWJsZU5hbWUiLCAiY29udHJvbGxlciIsIGZ1bmN0aW9uICgpIHsKCiAgICB0YWJsZUNvbnRyb2xsZXIgPSB3ZWJNSS50YWJsZS5yZXF1ZXN0KCJteVRhYmxlTmFtZSIsICJjb250cm9sbGVyIik7CiAgICB2YXIgaXRlbUFycmF5ID0gdGFibGVDb250cm9sbGVyLnNlYXJjaCgidGltZXN0YW1wIiwgMTU1Mzc4NTExMDUwMCwgdHJ1ZSk7CgogICAgdmFyIGlkID0gaXRlbUFycmF5WzBdLmlkOwogICAgaXRlbUFycmF5WzBdLnZhbHVlID0gImNoYW5nZWQgdmFsdWUiOwoKICAgIC8qIHVwZGF0ZSAqLwogICAgdGFibGVDb250cm9sbGVyLnVwZGF0ZURhdGEoaWQsIGl0ZW1BcnJheVswXSk7CgogICAgLyogZGVsZXRlICovCiAgICB0YWJsZUNvbnRyb2xsZXIucmVtb3ZlRGF0YShpZCk7CgogIH0pOwo8L3ByZT4KCgoKPGgyPlRpbWVzdGFtcCBjb252ZXJzYXRpb248L2gyPgo8cD5XaXRoIGF0dmlzZSAzLjMuMiB0aGUgdGltZXN0YW1wIG9mICJkYXRldGltZSIgY29sdW1ucyBpcyBubyBsb25nZXIgZGVsaXZlcmVkIGFzIHN0cmluZy4gSXQgaXMgbm93IG5lY2Vzc2FyeSB0byBmb3JtYXQgdGhlIHRpbWVzdGFtcCB0byBhIHN0cmluZyBpbnNpZGUgdGhlIHRhYmxlIHdpdGggdGhlIGdpdmVuIGZvcm1hdHRlci48L3A+CjxwPkV4YW1wbGU6PC9wPgo8cHJlPgoJZnVuY3Rpb24gX21ha2VDb252ZXJzaW9ucyhmb3JtYXQsIHZhbHVlKSB7CglpZiAoZm9ybWF0WzBdID09ICJkYXRldGltZSIpIHsKCQlpZiAodmFsdWUpIHsKCQkJaWYgKHR5cGVvZiB2YWx1ZSA9PSAic3RyaW5nIiAmJiB2YWx1ZS5pbmRleE9mKCItIikgPiAtMSkJCS8vaWdub3JlIGFscmVhZHkgZm9ybWF0dGVkIHZhbHVlcwoJCQkJcmV0dXJuIHZhbHVlOwoKCQkJdmFyIGRhdGUgPSBuZXcgRGF0ZShwYXJzZUludCh2YWx1ZSwgMTApKTsKCQkJdmFsdWUgPSB3ZWJNSS5zcHJpbnRmKCIlZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQuJTAzZCIsIGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXREYXRlKCksIGRhdGUuZ2V0SG91cnMoKSwgZGF0ZS5nZXRNaW51dGVzKCksIGRhdGUuZ2V0U2Vjb25kcygpLCBkYXRlLmdldE1pbGxpc2Vjb25kcygpKTsKCQl9IGVsc2UgewoJCQl2YWx1ZSA9ICIiOwoJCX0KCX0KCXJldHVybiAnPGRpdiBjbGFzcz0ic2xpY2stY2VsbC1pdGVtIj4nK3ZhbHVlKyc8L2Rpdj4nOwoJfQo8L3ByZT4KPGgxPlRhYmxlIGNvbmZpZ3VyYXRpb25zPC9oMT4KPHA+RnVydGhlciBjb25maWd1cmF0aW9uIGhlbHAgY2FuIGJlIGZvdW5kIGluIHRoZSBhdHZpc2UgZG9jdW1lbnRhdGlvbiBhbmQgYXQgYXR2aXNlIExpdmUhPC9wPgo8YnI+CjwvYm9keT4KPC9odG1sPg==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table_dataarrays" BrowseName="1:table_dataarrays" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">table_dataarrays</DisplayName>
		<Description Locale="en">table_dataarrays</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid</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 xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="788.23" height="640">
 <defs/>
 <metadata>
  <atv:parameter behavior="mandatory" name="dataMode" desc="put data by row or column" valuetype="address" defaultvalue="AGENT.OBJECTS.ArrayModeInt"/>
  <atv:parameter behavior="mandatory" name="series0Title" desc="colmun1 title" valuetype="trstring" defaultvalue="T{data 1}"/>
  <atv:parameter behavior="optional" name="series1Title" desc="colmun2 title" valuetype="trstring" defaultvalue="T{data 2}"/>
  <atv:parameter behavior="optional" name="series2Title" desc="colmun3 title" valuetype="trstring" defaultvalue="T{data 3}"/>
  <atv:parameter behavior="optional" name="series3Title" desc="colmun4 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series4Title" desc="colmun5 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series5Title" desc="colmun6 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series6Title" desc="colmun7 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series7Title" desc="colmun8 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series8Title" desc="colmun9 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series9Title" desc="colmun10 title" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" name="dataArrayType" valuetype="address" defaultvalue="AGENT.OBJECTS.dataArrayType"/>
  <atv:parameter behavior="optional" name="tableArray_md_1" valuetype="address" defaultvalue="AGENT.OBJECTS.TableArr_md_1"/>
  <atv:parameter behavior="optional" name="tableArray_md_2" valuetype="address" defaultvalue="AGENT.OBJECTS.TableArr_md_2"/>
  <atv:parameter behavior="optional" name="tableArray_md_3" valuetype="address" defaultvalue="AGENT.OBJECTS.TableArr_md_3"/>
  <atv:gridconfig gridstyle="lines" width="20" height="20" enabled="false"/>
  <atv:snapconfig width="10" height="10" enabled="false"/>
 </metadata>
 <svg xlink:href="SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table" y="2.613" atv:refpx="397.26" transform="matrix(1.2218,0,0,1,0,0)" id="id_0" width="640" height="640" atv:refpy="322.613" x="5.149">
  <atv:argument name="tableID" value="myAtviseDataTable"/>
  <atv:argument name="globalColorConfig" value="SYSTEM.GLOBALS.atvObjectDisplays.Tables.ColorConfig1"/>
 </svg>
 <script type="text/ecmascript"><![CDATA[var dataMode;

// inital loading of available Nodes
var vars = [
	webMI.query.series0Title,
	webMI.query.series1Title,
	webMI.query.series2Title,
	webMI.query.series3Title,
	webMI.query.series4Title,
	webMI.query.series5Title,
	webMI.query.series6Title,
	webMI.query.series7Title,
	webMI.query.series8Title,
	webMI.query.series9Title
];
vars = vars.filter(item => item !== undefined);
var arrType = webMI.query.dataArrayType;
var arrSrc_md = [
	webMI.query.tableArray_md_1,
	webMI.query.tableArray_md_2,
	webMI.query.tableArray_md_3
];
// #####

webMI.table.loadResources(function() {
var config = [];

// ### BEGIN CONFIGURATION SECTION ###
// configuration of table rows and their options
var columns = [];
columns['id'] = {id: "id", name: "T{Index}", field: "id", sortable: true, filter: true, visible: true, resizable: false};
columns['data1'] = {id: "data1", name: "T{"+webMI.query.series0Title+"}", field: "data1", width:280, sortable: true, filter: true, visible: true, resizable: false};
columns['data2'] = {id: "data2", name: "T{"+webMI.query.series1Title+"}", field: "data2", sortable: true, filter: true, visible: true, resizable: true, sortByDefault:true, sortByDefaultAsc: true};
columns['data3'] = {id: "data3", name: "T{"+webMI.query.series2Title+"}", field: "data3", sortable: true, filter: true, visible: true, resizable: true};
columns['data4'] = {id: "data4", name: "T{"+webMI.query.series3Title+"}", field: "data4", sortable: true, filter: true, visible: true, resizable: true};
columns['data5'] = {id: "data5", name: "T{"+webMI.query.series4Title+"}", field: "data5", sortable: true, filter: true, visible: true, resizable: true};
columns['data6'] = {id: "data6", name: "T{"+webMI.query.series5Title+"}", field: "data6", sortable: true, filter: true, visible: true, resizable: true};
columns['data7'] = {id: "data7", name: "T{"+webMI.query.series6Title+"}", field: "data7", sortable: true, filter: true, visible: true, resizable: true};
columns['data8'] = {id: "data8", name: "T{"+webMI.query.series7Title+"}", field: "data8", sortable: true, filter: true, visible: true, resizable: true};
columns['data9'] = {id: "data9", name: "T{"+webMI.query.series8Title+"}", field: "data9", sortable: true, filter: true, visible: true, resizable: true};
columns['data10'] = {id: "data10", name: "T{"+webMI.query.series9Title+"}", field: "data10", sortable: true, filter: true, visible: true, resizable: true};

// config["columns"] is used for building the defined columns in the table
config["columns"] = [
	columns['id'],
	columns['data1']
];
// #####

var maxseries = vars.length; // Number of available Series Titles / Columns
// creating columns depending on available Titles configs
// pushes the data to config variable of the table (config["columns"])
for(var i=1;i<=maxseries;i++) {
	if(vars[i]!=undefined) { config["columns"].push(columns['data'+(i+1)]); }
}
// #####

config["mode"] = "live"; // live mode for making array data updates possible
config["bufferInterval"] = 50;

// Configuration of the data query for the table
config["dataRequestFunction"] = function customDataRequest(continuation) {
	var that = this;
	var data = {
		result: []
	};	
	var elem = {};
	var arr = [];
	var dataArrType = 1;
	
	// getting subcription for checking if DataMode has changed
	// DataMode switches the state to get the data handled for Rows OR Columns
	that.subscribeDataMode = webMI.data.subscribe(
		webMI.query.dataMode,
		function(e) {
			that.clearData();
			handleDataUpdate();
		}
	);
	
	// getting subscription Status of available predefined Nodes
	// ArrType = switch for used data source Array type (f.e. 1 dimensional or various 2 dimensional arrays, Json Objects)
	// f.e. parameter tableArray_md_1
	that.subscribeArrType = webMI.data.subscribe(arrType,function(requestResult) {
		if(requestResult.value) {
			dataArrType = requestResult.value;
			handleDataUpdate();
		}
	});
	// #####
	
	// getting subscription Status of available predefined Nodes for diff. array types
	// data source Arrays for different Multidimensional Array types
	// f.e. parameter tableArray_md_1,tableArray_md_2,tableArray_md_3,...
	that.subscribeNodes_arrayStructs = webMI.data.subscribe(arrSrc_md,function(requestResult) {					
		if(requestResult.value) {
			handleDataUpdate();
		}
	});
	// #####
	
	// unloads the subsrcibed nodes to update them immediately 
	// by value changes from the source
	webMI.addOnunload(
		function() {
			webMI.data.unsubscribe(that.subscribeDataMode);
			webMI.data.unsubscribe(that.subscribeNodes_arrayStructs);
			webMI.data.unsubscribe(that.subscribeArrType);
		}
	);
	// #####
	
	
	// update handler function for updating the table and set the data of the table to latest state, 
	// depending which Array / Data Mode is used (Column or Row)
	function handleDataUpdate() {
		webMI.data.read(
			webMI.query.dataMode,
				function(e) {
					if(dataArrType==1) { setData_ArrStruct1(elem,data,that,e.value); }
					else if(dataArrType==2) { setData_ArrStruct2(elem,data,that,e.value); }
					else if(dataArrType==3) { setData_ArrStruct3(elem,data,that,e.value); }
					else { setData_ArrStruct1(elem,data,that,e.value); }
				}
			);
	}	
	// #####
	
};


function setData_ArrStruct1(elem,data,that,mode) {
	// Data example: {['aaa'; 'bbb'; 'ccc'; 'ddd'], ['aaaa1'; 'bbb1'; 'ccc1'; 'dddd1'], ['aaaa2'; 'bbb2'; 'ccc2'; 'dddd2']}

	webMI.data.read(
		arrSrc_md[0],
		function(e) {
			that.clearData();
			
			var arrTmp = e.value;
			var arr = [];
			
			arrTmp = arrTmp.toString();
			arrTmp = arrTmp.replace(/\[/g, "").replace(/\]/g, "").replace(/\'/g, "");
			arrTmp = arrTmp.split(",");
					
			for(var n = 0; n < arrTmp.length; n++) {
				arr[n] = arrTmp[n].split(';'); // split on separation symbols
			}
			
			if(mode==1) {
				// adding Data from 2 DIMENSION Array with Column Values, Array = Column
				for(var i = 0; i < arr[0].length; i++) {
					var x=0;
					while(x < arr.length) {
						x++;
						if(arr[x-1][i]!=undefined) { elem["data"+x] = arr[x-1][i]; }
					}
					
					if(arr[0][i]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			} else {
				// adding Data from 2 DIMENSION Array with Row Values, Array = Row
				for(var i = 0; i < arr.length; i++) {
					var x=0;
					while(x < vars.length) {
						x++;
						if(arr[i][x-1]!=undefined) { elem["data"+x] = arr[i][x-1]; }
					}
					
					if(arr[i][0]!=undefined) {
						data.result = elem;
						that.addData(data);
					}						
				}			
			}
		}
	);
	
};

function setData_ArrStruct2(elem,data,that,mode) {
	// Data example: {"data1":["aaa", "bbb", "ccc"], "data2":["aaa2", "bbb2", "ccc2"], "data3":["aaa3", "bbb3", "ccc3"]}
	
	webMI.data.read(
		arrSrc_md[1],
		function(e) {
			that.clearData();
			
			var arrTmp = e.value;
			arrTmp = "{"+arrTmp.toString()+"}";
			arrTmp = JSON.parse(arrTmp);
			var ObjCnt = Object.keys(arrTmp).length;
			var arr = [];
			
			for(var n = 0;n <= ObjCnt-1; n++) {
				arr[n] = arrTmp['data'+(n+1)];
			}
			
			if(mode==1) {
				// adding Data from 2 DIMENSION JSON Object Array Column Values, Array = Column
				for(var i = 0; i < arr.length; i++) {
					var x=0;
					while(x < arr.length) {
						x++;
						if(arr[x-1][i]!=undefined) { elem["data"+x] = arr[x-1][i]; }
					}
					
					if(arr[0][i]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			}
			else {
				// adding Data from 2 DIMENSION Array with Row Values, Array = Row
				for(var i = 0; i < arr.length; i++) {
					var x=0;
					while(x < vars.length) {
						x++;
						if(arr[i][x-1]!=undefined) { elem["data"+x] = arr[i][x-1]; }
					}
					
					if(arr[i][0]!=undefined) {
						data.result = elem;
						that.addData(data);
					}						
				}
			}
		}
	);
	
};


// adding Data from 2 DIMENSION JSON Object Array with Row Values, Array = Row
function setData_ArrStruct3(elem,data,that,mode) {
	// Data example: {"datas": [["aaa", "bbb", "ccc"], ["aaa2", "bbb2", "ccc2"], ["aaaa3", "bbb3", "ccc3"]]}

	webMI.data.read(
		arrSrc_md[2],
		function(e) {
			that.clearData();
			
			var arrTmp = e.value;
			arrTmp = "{"+arrTmp.toString()+"}";					
			arrTmp = JSON.parse(arrTmp);
			arrTmp = arrTmp.datas;				

			if(mode==1) {
				// adding Data from 2 DIMENSION JSON Object Array Column Values, Array = Column
				for(var i = 0; i < arrTmp[0].length; i++) {
					var x=0;
					while(x < arrTmp.length) {
						x++;
						if(arrTmp[x-1][i]!=undefined) { elem["data"+x] = arrTmp[x-1][i]; }
					}
					
					if(arrTmp[0][i]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			} else {
				// adding Data from 2 DIMENSION Array with Row Values, Array = Row
				for(var i = 0; i < arrTmp.length; i++) {
					var x=0;
					while(x < vars.length) {
						x++;
						if(arrTmp[i][x-1]!=undefined) { elem["data"+x] = arrTmp[i][x-1]; }
					}
					
					if(arrTmp[i][0]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			}
		}
	);
	
};

// ### END CONFIGURATION SECTION ###
webMI.table.register("myAtviseDataTable", "config", config);
webMI.table.setReady("myAtviseDataTable", "config");
});]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table_dataseries" BrowseName="1:table_dataseries" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">table_dataseries</DisplayName>
		<Description Locale="en">table_dataseries</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid</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 xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="788.23" height="640">
 <defs/>
 <metadata>
  <atv:parameter behavior="mandatory" name="dataMode" desc="put data by row or column" valuetype="address" defaultvalue="AGENT.OBJECTS.ArrayModeInt"/>
  <atv:parameter behavior="mandatory" group="Series 1" name="series0Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 1" name="series0Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" group="Series 2" name="series1Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 2" name="series1Title" desc="title" valuetype="color" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 3" name="series2Node" desc="node" valuetype="display" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 3" name="series2Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 4" name="series3Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 4" name="series3Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 5" name="series4Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 5" name="series4Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 6" name="series5Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 6" name="series5Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 7" name="series6Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 7" name="series6Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 8" name="series7Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 8" name="series7Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 9" name="series8Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 9" name="series8Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 10" name="series9Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 10" name="series9Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series - Multidimension DataArray" name="dataArrayType" valuetype="address" defaultvalue="AGENT.OBJECTS.dataArrayType"/>
  <atv:gridconfig gridstyle="lines" width="20" height="20" enabled="false"/>
  <atv:snapconfig width="10" height="10" enabled="false"/>
 </metadata>
 <svg xlink:href="SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table" y="2.613" atv:refpx="397.26" transform="matrix(1.2218,0,0,1,0,0)" id="id_0" width="640" height="640" atv:refpy="322.613" x="5.149">
  <atv:argument name="tableID" value="myAtviseDataTable"/>
  <atv:argument name="globalColorConfig" value="SYSTEM.GLOBALS.atvObjectDisplays.Tables.ColorConfig1"/>
 </svg>
 <script type="text/ecmascript"><![CDATA[var dataMode;

// inital loading of available Nodes
var vars = [
	webMI.query.series0Node,
	webMI.query.series1Node,
	webMI.query.series2Node,
	webMI.query.series3Node,
	webMI.query.series4Node,
	webMI.query.series5Node,
	webMI.query.series6Node,
	webMI.query.series7Node,
	webMI.query.series8Node,
	webMI.query.series9Node
];
vars = vars.filter(item => item !== "");
var arrType = webMI.query.dataArrayType;
// #####

webMI.table.loadResources(function() {
var config = [];

// ### BEGIN CONFIGURATION SECTION ###
// configuration of table rows and their options
var columns = [];
columns['id'] = {id: "id", name: "T{Index}", field: "id", sortable: true, filter: true, visible: true, resizable: false};
columns['data1'] = {id: "data1", name: "T{"+webMI.query.series0Title+"}", field: "data1", sortable: true, filter: true, width:300, visible: true, resizable: false};
columns['data2'] = {id: "data2", name: "T{"+webMI.query.series1Title+"}", field: "data2", sortable: true, filter: true, visible: true, resizable: true, sortByDefault:true, sortByDefaultAsc: true};
columns['data3'] = {id: "data3", name: "T{"+webMI.query.series2Title+"}", field: "data3", sortable: true, filter: true, visible: true, resizable: true};
columns['data4'] = {id: "data4", name: "T{"+webMI.query.series3Title+"}", field: "data4", sortable: true, filter: true, visible: true, resizable: true};
columns['data5'] = {id: "data5", name: "T{"+webMI.query.series4Title+"}", field: "data5", sortable: true, filter: true, visible: true, resizable: true};
columns['data6'] = {id: "data6", name: "T{"+webMI.query.series5Title+"}", field: "data6", sortable: true, filter: true, visible: true, resizable: true};
columns['data7'] = {id: "data7", name: "T{"+webMI.query.series6Title+"}", field: "data7", sortable: true, filter: true, visible: true, resizable: true};
columns['data8'] = {id: "data8", name: "T{"+webMI.query.series7Title+"}", field: "data8", sortable: true, filter: true, visible: true, resizable: true};
columns['data9'] = {id: "data9", name: "T{"+webMI.query.series8Title+"}", field: "data9", sortable: true, filter: true, visible: true, resizable: true};
columns['data10'] = {id: "data10", name: "T{"+webMI.query.series9Title+"}", field: "data10", sortable: true, filter: true, visible: true, resizable: true};

// config["columns"] is used for building the defined columns in the table
config["columns"] = [
	columns['id'],
	columns['data1']
];
// #####

var maxseries = vars.length; // Number of available Series Nodes
// creating columns depending on available Series configs, which include valid Node adresses
// pushes the data to config variable of the table (config["columns"])
for(var i=1;i<maxseries;i++) {
	if(vars[i]!="") { config["columns"].push(columns['data'+(i+1)]); }
}
// #####

config["mode"] = "live"; // live mode for making array data updates possible
config["bufferInterval"] = 50;

// Configuration of the data query for the table
config["dataRequestFunction"] = function customDataRequest(continuation) {
	var that = this;
	var data = {
		result: []
	};
	var row = {};
	var colmn = {};
	var arr = [];
	var dataArrType = 1;
	
	// getting subcription for checking if DataMode has changed
	// DataMode switches the state to get the data handled for Rows OR Columns
	that.subscribeDataMode = webMI.data.subscribe(
		webMI.query.dataMode,
		function(e) {
			that.clearData();
			handleDataUpdate();
		}
	);
	
	// getting subscription Status of available predefined Nodes
	// data source Array of every available Parameter 'Series 0-10', Node Adress
	// 1 Data Soruce Array per Row or Column
	that.subscribeNodes = webMI.data.subscribe(vars,function(requestResult) {					
		if(requestResult.value) {
			handleDataUpdate();
		}
	});
	// #####
	
	// unloads the subsrcibed nodes to update them immediately 
	// by value changes from the source
	webMI.addOnunload(
		function() {
			webMI.data.unsubscribe(that.subscribeDataMode);
			webMI.data.unsubscribe(that.subscribeNodes);
		}
	);
	// #####
	
	
	// update handler function for updating the table and set the data of the table to latest state, 
	// depending which Array / Data Mode is used (Column or Row)
	function handleDataUpdate() {
		webMI.data.read(
			webMI.query.dataMode,
				function(e) {
					
					if(e.value==0) {
						setRow(row,data,that);
					}
					else if(e.value==1) {
						setColmn(colmn,data,that);
					}
					else {
						setRow(row,data,that);
					}	
					
				}
			);
	}	
	// #####
	
};

// adding Data from Array with Row Values, Array = Row
function setRow(row,data,that) {
	// Data example: {'value1-1', 'value1-2', 'value1-3', 'value1-4'}

	webMI.data.read(
		vars,
		function(e) {
			that.clearData();
		
			for (var i = 0; i < e.length; i++) {			
				var n=0;
				while(n < vars.length) {
					n++;
					if(vars[n-1]!="") { row["data"+n] = e[i].value[n-1]; }
				}
				
				data.result = row;
				that.addData(data);
			}

		}
	);
};


// adding Data from Array with Column Values, Array = Column
function setColmn(colmn,data,that) {
	// Data example: {'value1-1', 'value1-2', 'value1-3', 'value1-4'}

	webMI.data.read(
		vars,
		function(e) {
			that.clearData();		

			for (var i = 0; i <= e.length; i++) {
				var n=0;
				while(n < vars.length) {
					n++;
					if(vars[n-1]!="") { colmn["data"+n] = e[n-1].value[i]; }
				}
				
				if(e[0].value[i]!=undefined) {
					data.result = colmn;
					that.addData(data);
				}
			}

		}
	);
};
// ########################


// ### END CONFIGURATION SECTION ###
webMI.table.register("myAtviseDataTable", "config", config);
webMI.table.setReady("myAtviseDataTable", "config");
});]]]]><![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.Advanced.slickgrid" ExportedBrowseName="1:slickgrid" 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.Advanced" BrowseName="1:Advanced">
		<DisplayName Locale="en">Advanced</DisplayName>
		<Description Locale="en">Advanced</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.Advanced.slickgrid" BrowseName="1:slickgrid">
		<DisplayName Locale="en">slickgrid</DisplayName>
		<Description Locale="en">slickgrid</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table" BrowseName="1:table" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">table</DisplayName>
		<Description Locale="en">table</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid</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 xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="640" height="640">
 <defs/>
 <desc>HTML based table with footer</desc>
 <title>Table</title>
 <metadata>
  <!-- ... mandatorys ... -->
  <!-- ... font ... -->
  <!-- ... options ... -->
  <!-- menu -->
  <!-- footer -->
  <!-- ... ende options ... -->
  <atv:parameter behavior="mandatory" name="tableID" desc="table ID" valuetype="string" defaultvalue="atvise_table_1"/>
  <atv:parameter behavior="optional" group="" name="header_height" desc="table header height" valuetype="number" defaultvalue="30"/>
  <atv:parameter behavior="optional" group="" name="header_text_size" desc="table header font size" valuetype="number" defaultvalue="14"/>
  <atv:parameter behavior="optional" group="" name="header_text_horizontal" desc="table header cell align horizontal" valuetype="enum" config="center; inherit" defaultvalue="inherit"/>
  <atv:parameter behavior="optional" group="" name="header_text_vertical" desc="table header cell align vertical" valuetype="enum" config="center; inherit" defaultvalue="center"/>
  <atv:parameter behavior="optional" group="" name="row_height" desc="table row height" valuetype="number" defaultvalue="20"/>
  <atv:parameter behavior="optional" group="" name="row_text_size" desc="table row font size" valuetype="number" defaultvalue="12"/>
  <atv:parameter behavior="optional" group="" name="detail_text_size" desc="table detail font size" valuetype="number" defaultvalue="12"/>
  <atv:parameter behavior="mandatory" group="" name="footer_text_size" desc="table footer font size" valuetype="number" defaultvalue="12"/>
  <atv:parameter behavior="optional" group="Appearance" name="font_family" desc="font family" valuetype="enum" config="Arial;Courier;Tahoma;Verdana" defaultvalue="Arial"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalBorderColor" desc="global border colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvBorderColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalFillColor" desc="global fill colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvFillColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalFontColor" desc="global font colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvFontColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalSymbolColor" desc="global symbol colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvSymbolColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalInactiveColor" desc="global inactive colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvInactiveColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalColorConfig" desc="global table colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvObjectDisplays.Tables.ColorConfig"/>
  <atv:parameter behavior="optional" group="Appearance" name="theme_class" desc="custom theme" valuetype="string" defaultvalue="atviseTheme"/>
  <atv:parameter behavior="optional" group="Options" name="columnReorder" desc="columns reorderable" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="paging" desc="paging" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="filterBar" desc="filter bar enabled" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="filterRegExp" desc="filter regular expressions" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="filterStar" desc="filter use placeholder" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="filterCaseSensitive" desc="filter case sensitive" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="filterLength" desc="filter minimum length" valuetype="number" defaultvalue="1"/>
  <atv:parameter behavior="optional" group="Options" name="filterDelay" desc="filter delay [ms]" valuetype="number" defaultvalue="1000"/>
  <atv:parameter behavior="optional" group="Options" name="showMode" desc="show runtime mode" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="multiselect" desc="multiselect" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="multicellselect" desc="multiselect on cell click" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="linebreak" desc="cell linebreak" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="allowDirectInput" desc="allow direct input" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenu" desc="show menu" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuWidth" desc="menu width" valuetype="number" defaultvalue="250"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuHeight" desc="menu height" valuetype="number" defaultvalue="300"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuPicker" desc="show picker menu" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuFilter" desc="show filter menu" valuetype="bool" defaultvalue="true" substitute=""/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuExport" desc="show export menu" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_first_page" desc="symbol first page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-fast-backward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_previous_page" desc="symbol previous page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-step-backward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_pause_page" desc="symbol pause" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-pause&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_stop_page" desc="symbol stop page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-stop&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_next_page" desc="symbol next page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-step-forward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_last_page" desc="symbol last page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-fast-forward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_load_page" desc="symbol load page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-download&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_search_page" desc="symbol search" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-search&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_truncate_icon" desc="symbol truncate" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-ban&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_triggered_icon" desc="symbol triggered" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-angle-double-down&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_continue_icon" desc="symbol continue" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-cog fa-spin&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_live_icon" desc="symbol live" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-sync fa-spin&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_done_icon" desc="symbol done" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-check&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_manually_icon" desc="symbol manually" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-download&quot;>&lt;/i>"/>
  <atv:gridconfig gridstyle="lines" width="20" height="20" enabled="false"/>
  <atv:snapconfig width="10" height="10" enabled="false"/>
 </metadata>
 <svg xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.slickgrid.table_panel" transform="matrix(1,0,0,1.0586,0,0)" y="1.584" atv:refpx="320.831" id="id_1" width="640" height="580" x="0.839" atv:refpy="308.705">
  <atv:argument name="tableID" prefix="tableID"/>
  <atv:argument name="header_height" prefix="header_height"/>
  <atv:argument name="header_text_size" prefix="header_text_size"/>
  <atv:argument name="row_height" prefix="row_height"/>
  <atv:argument name="row_text_size" prefix="row_text_size"/>
  <atv:argument name="header_text_horizontal" prefix="header_text_horizontal"/>
  <atv:argument name="header_text_vertical" prefix="header_text_vertical"/>
  <atv:argument name="detail_text_size" prefix="detail_text_size"/>
  <atv:argument name="footer_text_size" prefix="footer_text_size"/>
  <atv:argument name="font_family" prefix="font_family"/>
  <atv:argument name="globalBorderColor" prefix="globalBorderColor"/>
  <atv:argument name="theme_class" prefix="theme_class"/>
  <atv:argument name="globalFillColor" prefix="globalFillColor"/>
  <atv:argument name="globalFontColor" prefix="globalFontColor"/>
  <atv:argument name="globalSymbolColor" prefix="globalSymbolColor"/>
  <atv:argument name="globalSymbolColor" prefix="globalInactiveColor"/>
  <atv:argument name="globalColorConfig" prefix="globalColorConfig"/>
  <atv:argument name="columnReorder" prefix="columnReorder"/>
  <atv:argument name="paging" prefix="paging"/>
  <atv:argument name="filterBar" prefix="filterBar"/>
  <atv:argument name="filterRegExp" prefix="filterRegExp"/>
  <atv:argument name="filterStar" prefix="filterStar"/>
  <atv:argument name="filterCaseSensitive" prefix="filterCaseSensitive"/>
  <atv:argument name="filterLength" prefix="filterLength"/>
  <atv:argument name="filterDelay" prefix="filterDelay"/>
  <atv:argument name="linebreak" prefix="linebreak"/>
  <atv:argument name="multiselect" prefix="multiselect"/>
  <atv:argument name="multicellselect" prefix="multicellselect"/>
  <atv:argument name="showMenu" prefix="showMenu"/>
  <atv:argument name="showMenuWidth" prefix="showMenuWidth"/>
  <atv:argument name="showMenuHeight" prefix="showMenuHeight"/>
  <atv:argument name="showMenuPicker" prefix="showMenuPicker"/>
  <atv:argument name="showMenuFilter" prefix="showMenuFilter"/>
  <atv:argument name="showMenuExport" prefix="showMenuExport"/>
  <atv:argument name="allowDirectInput" prefix="allowDirectInput"/>
  <atv:overwrite transform="matrix(1,0,0,0.9446,0,0)" id="id_1" height="613.988"/>
 </svg>
 <svg xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.slickgrid.table_footer" y="615" atv:refpx="320" id="id_2" width="640" height="25" x="0" atv:refpy="627.5">
  <atv:argument name="tableID" prefix="tableID"/>
  <atv:argument name="fas_first_page" prefix="fas_first_page"/>
  <atv:argument name="fas_previous_page" prefix="fas_previous_page"/>
  <atv:argument name="fas_pause_page" prefix="fas_pause_page"/>
  <atv:argument name="fas_stop_page" prefix="fas_stop_page"/>
  <atv:argument name="fas_next_page" prefix="fas_next_page"/>
  <atv:argument name="fas_last_page" prefix="fas_last_page"/>
  <atv:argument name="fas_load_page" prefix="fas_load_page"/>
  <atv:argument name="fas_search_page" prefix="fas_search_page"/>
  <atv:argument name="fas_truncate_icon" prefix="fas_truncate_icon"/>
  <atv:argument name="fas_triggered_icon" prefix="fas_triggered_icon"/>
  <atv:argument name="fas_continue_icon" prefix="fas_continue_icon"/>
  <atv:argument name="fas_live_icon" prefix="fas_live_icon"/>
  <atv:argument name="fas_done_icon" prefix="fas_done_icon"/>
  <atv:argument name="fas_manually_icon" prefix="fas_manually_icon"/>
 </svg>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table.de" BrowseName="1:de" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">de</DisplayName>
		<Description Locale="en">de</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.HtmlHelp</Reference>
		</References>
		<Value>
			<uax:ByteString>PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSI+CiAgICA8dGl0bGU+T0RfaGVscDwvdGl0bGU+CiAgICA8c3R5bGU+ICNwYXJhbWV0ZXIgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgfSA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8aDE+QmVzY2hyZWlidW5nPC9oMT4KPHA+RGllc2VzIERpc3BsYXkgZWlnbmV0IHNpY2ggZiZ1dW1sO3IgZGllIERhcnN0ZWxsdW5nIHZvbiBEYXRlbiBpbiB0YWJlbGxhcmlzY2hlciBGb3JtLiBEYXp1IGlzdCBuZWJlbiBkZXIgRWluc3RlbGx1bmcgZGVyCiAgICBUYWJlbGxlbnBhcmFtZXRlciBlYmVuc28gZGllIEtvbmZpZ3VyYXRpb24gaW0gJnV1bWw7YmVyZ2VvcmRuZXRlbiBEaXNwbGF5IGVyZm9yZGVybGljaC4gRGFzICZ1dW1sO2Jlcmdlb3JkbmV0ZSBEaXNwbGF5c2Ugd2lyZAogICAgaW0gZm9sZ2VuZGVuIGF1Y2ggYWxzIFBhcmVudGRpc3BsYXkgYmV6ZWljaG5ldC48L3A+Cgo8aDI+QW5mb3JkZXJ1bmdlbjwvaDI+CjxwPkRpZSBUYWJlbGxlbmJpYmxpb3RoZWsgZXJmb3JkZXJ0IGpRdWVyeSA+IDEuNyB1bmQgd2lyZCBha3R1ZWxsIG1pdCBqUXVlcnkgPiAzLjMueCBhdXNnZWxpZWZlcnQuPC9wPgo8cD5VbSBLb21wYXRpYmlsaXQmYXVtbDt0c3Byb2JsZW1lIHp1IHZlcm1laWRlbiwgd2lyZCBkaWUgbWl0Z2VsaWVmZXJ0ZSBqUXVlcnkgVmVyc2lvbiBudXIgdmVyd2VuZGV0LCB3ZW5uIGtlaW5lIGJlcmVpdHMKICAgIHZvcmhhbmRlbmUgVmVyc2lvbiBlcmthbm50IHdpcmQuIFNvbGx0ZSBkYWhlciBpbiBlaW5lbSBiZXN0ZWhlbmRlbiBQcm9qZWt0IGpRdWVyeSBiZXJlaXRzIHZlcndlbmRldCB3ZXJkZW4sIGdyZWlmdAogICAgZGllIFRhYmVsbGVuYmlibGlvdGhlayBhdWYgZGllc2UgenVyJnV1bWw7Y2suIEdlaGVuIHNpZSBkYWhlciBzaWNoZXIsIGRhc3MgaW4gZGllc2VtIEZhbGxlIGVpbmUgalF1ZXJ5IFZlcnNpb24gPiAxLjcueAogICAgdmVyd2VuZGV0IHdpcmQhPC9wPgoKPGgxPlBhcmFtZXRlcjwvaDE+CjxwPkRpZSBUYWJlbGxlIGhhdCBkaWUgZm9sZ2VuZGVuIGFsbGdlbWVpbmVuIFBhcmFtZXRlcjo8L3A+Cjx1bD4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5iYXNlPC9zcGFuPjogQWt0dWVsbGUgbmljaHQgaW4gdmVyd2VuZHVuZyA8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVuLUlEPC9zcGFuPjogRWluZGV1dGlnZXIgVGFiZWxsZW5uYW1lPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5UYWJlbGxlbmtvcGYgSCZvdW1sO2hlPC9zcGFuPjogSCZvdW1sO2hlIGRlcyBUYWJlbGxlbmtvcGZlcyBpbiBQaXhlbCAoU3RhbmRhcmQgMzAsICopIDwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+VGFiZWxsZW5rb3BmIFNjaHJpZnRnciZvdW1sOyZzemxpZztlPC9zcGFuPjogU2NocmlmdGdyJm91bWw7JnN6bGlnO2UgaW0gVGFiZWxsZW5rb3BmIChTdGFuZGFyZDogMTQpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5UYWJlbGxlbmtvcGZ6ZWxsZSBob3Jpem9udGFsIGF1c3JpY2h0ZW48L3NwYW4+OiBIb3Jpem9udGFsZSBBdXNyaWNodHVuZyBkZXMgWmVsbGVuaW5oYWx0ZXMgaW0gVGFiZWxsZW5rb3BmIChTdGFuZGFyZDogaW5oZXJpdCk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVua29wZnplbGxlIHZlcnRpY2FsIGF1c3JpY2h0ZW48L3NwYW4+OiBWZXJ0aWthbGUgQXVzcmljaHR1bmcgZGVzIFplbGxlbmluaGFsdGVzIGltIFRhYmVsbGVua29wZiAoU3RhbmRhcmQ6IGNlbnRlcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVuemVpbGUgSCZvdW1sO2hlPC9zcGFuPjogSCZvdW1sO2hlIGRlciBUYWJlbGxlbnplaWxlbiBpbiBQaXhlbCAoU3RhbmRhcmQgMjAsICoqKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+VGFiZWxsZW56ZWlsZSBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZTwvc3Bhbj46IFNjaHJpZnRnciZvdW1sOyZzemxpZztlIGluIGVpbmVyIFRhYmVsbGVuemVpbGUgKFN0YW5kYXJkOiAxMik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkRldGFpbGJlcmVpY2ggU2NocmlmdGdyJm91bWw7JnN6bGlnO2U8L3NwYW4+OiBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZSBmJnV1bWw7ciBUYWJlbGxlbmRldGFpbHMgKFN0YW5kYXJkOiAxMik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVuZnUmc3psaWc7IFNjaHJpZnRnciZvdW1sOyZzemxpZztlPC9zcGFuPjogU2NocmlmdGdyJm91bWw7JnN6bGlnO2UgaW0gVGFiZWxsZW5mdSZzemxpZzsgKFN0YW5kYXJkOiAxMik8L2xpPgo8L3VsPgo8cD48aT4oKikgRXMgd2lyZCBlaW5lIEgmb3VtbDtoZSBkaWUgaW4gZXR3YSBkZW0gZG9wcGVsdGVuIGRlciBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZSBlbnRzcHJpY2h0IGVtcGZvaGxlbi48L2k+PGJyPgogICAgPGk+KCoqKSBCZWkgYWt0aXZpZXJ0ZW0gWmVpbGVudW1icnVjaCB3aXJkIGRpZSAxLDUgRmFjaGUgU2NocmlmdGdyJm91bWw7JnN6bGlnO2UgbWFsIGRhcnp1c3RlbGxlbmRlIFplaWxlIGFscyBIJm91bWw7aGUgZW1wZm9obGVuLjwvaT48L3A+Cgo8cD5EYXJzdGVsbHVuZzo8L3A+Cjx1bD4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TY2hyaWZ0ZmFtaWxpZTwvc3Bhbj46IFNjaHJpZnRmYW1pbGllIChTdGFuZGFyZDogQXJpYWwpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5HbG9iYWxlIFJhaG1lbmZhcmJlPC9zcGFuPjogUXVlbGxlIGYmdXVtbDtyIFJhaG1lbmZhcmJlIChTdGFuZGFyZDogU1lTVEVNLkdMT0JBTFMuYXR2Qm9yZGVyQ29sb3IpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5HbG9iYWxlIEYmdXVtbDtsbGZhcmJlPC9zcGFuPjogUXVlbGxlIGYmdXVtbDtyIEYmdXVtbDtsbGZhcmJlIChTdGFuZGFyZDogU1lTVEVNLkdMT0JBTFMuYXR2RmlsbENvbG9yKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+R2xvYmFsZSBTY2hyaWZ0ZmFyYmU8L3NwYW4+OiAgUXVlbGxlIGYmdXVtbDtyIFNjaHJpZnRmYXJiZSAoU3RhbmRhcmQ6IFNZU1RFTS5HTE9CQUxTLmF0dkZvbnRDb2xvcik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkdsb2JhbGUgU3ltYm9sZmFyYmU8L3NwYW4+OiAgUXVlbGxlIGYmdXVtbDtyIFN5bWJvbGZhcmJlIChTdGFuZGFyZDogU1lTVEVNLkdMT0JBTFMuYXR2U3ltYm9sQ29sb3IpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5HbG9iYWxlIGluYWt0aXZlIEZhcmJlbjwvc3Bhbj46IFF1ZWxsZSBmJnV1bWw7ciBpbmFrdGl2ZSBGYXJiZSAoRGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2SW5hY3RpdmVDb2xvcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkdsb2JhbGUgVGFiZWxsZW5mYXJiZW48L3NwYW4+OiAgIFF1ZWxsZSBmJnV1bWw7ciBUYWJlbGxlbmZhcmJlbiAoU3RhbmRhcmQ6IFNZU1RFTS5HTE9CQUxTLmF0dk9iamVjdERpc3BsYXlzLkJhc2VUYWJsZS5Db2xvckNvbmZpZyk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkJlbnV0emVyZGVmaW5pZXJ0ZXMgVGhlbWU8L3NwYW4+OiBPcHRpb25hbGVzIENTUyBQZmFkIGYmdXVtbDtyIGJlbnV0emVyZGVmaW5pZXJ0ZXMgVGhlbWUgKFN0YW5kYXJkOiBhdHZpc2VUaGVtZSk8L2xpPgo8L3VsPgoKPHA+T3B0aW9uZW46PC9wPgo8dWw+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3BhbHRlbiBuZXUgb3JkbmVuIGVybSZvdW1sO2dsaWNoZW48L3NwYW4+OiBWZXJzY2hpZWJlbiB2b24gU3BhbHRlbiB6dWxhc3NlbiAoU3RhbmRhcmQ6IHRydWUpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5QYWdpbmc8L3NwYW4+OiBBbnplaWdlIGRlciBTZWl0ZW5uYXZpZ2F0aW9uIChTdGFuZGFyZDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkZpbHRlcmxlaXN0ZTwvc3Bhbj46IFRhYmVsbGVuZmlsdGVyIGFuemVpZ2VuIChTdGFuZGFyZDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkZpbHRlciByZWd1bCZhdW1sO3JlIEF1c2RyJnV1bWw7Y2tlPC9zcGFuPjogRmlsdGVyZnVua3Rpb24gYmVudXR6dCBSZWd1bGFyIEV4cHJlc3Npb25zIChTdGFuZGFyZDogZmFsc2UsICoqKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+RmlsdGVyIG1pdCBQbGF0emhhbHRlcjwvc3Bhbj46IEFrdGl2aWVydW5nIGRlcyBQbGF0emhhbHRlcnMgJnF1b3Q7KiZxdW90OyBpbiBkZXIgU3VjaGZ1bmt0aW9uPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5GaWx0ZXIgR3JvJnN6bGlnOy0vS2xlaW5zY2hyZWlidW5nPC9zcGFuPjogR3JvJnN6bGlnOy0gdW5kIEtsZWluc2NocmVpYnVuZyBiZXImdXVtbDtja3NpY2h0aWdlbiAoU3RhbmRhcmQ6IGZhbHNlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+RmlsdGVyIE1pbmRlc2VpbmdhYmU8L3NwYW4+OiBNaW5kZXN0YW56YWhsIGRlciBaZWljaGVuIGJldm9yIGRlciBGaWx0ZXIgYWt0aXYgd2lyZCAoU3RhbmRhcmQ6IDEpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5GaWx0ZXIgVmVyeiZvdW1sO2dlcnVuZzwvc3Bhbj46IFZlcnomb3VtbDtnZXJ1bmcgZGVyIGF1dG9tYXRpc2NoZW4gRmlsdGVydW5nIGluIE1pbGxpc2VrdW5kZW4gKFN0YW5kYXJkOiAxMDAwLCBBYnNjaGFsdGVuIGRlciBBdXRvbWF0aWsgbWl0IDApPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5MYXVmemVpdG1vZHVzIGFuemVpZ2VuPC9zcGFuPjogQW56ZWlnZSBkZXMgTGF1ZnplaXRtb2R1cyBpbiBkZXIgU3RhdHVzemVpbGUgKFN0YW5kYXJkOiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+TWVocmZhY2hhdXN3YWhsPC9zcGFuPjogQWt0aXZpZXJ1bmcgZGVyIE1laHJmYWNoYXVzd2FobCAoU3RhbmRhcmQ6IHRydWUpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5NZWhyZmFjaGF1c3dhaGwsIEtsaWNrIGF1ZiBaZWxsZTwvc3Bhbj46IE1laHJmYWNoYXVzd2FobCwgTWFya2llcmVuIGJlaW0gS2xpY2tlbiBhdWYgWmVsbGUgKFN0YW5kYXJkOiBmYWxzZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlplaWxlbnVtYnJ1Y2ggaW4gWmVsbGVuPC9zcGFuPjogWmVpbGVudW1icnVjaCBpbiBaZWxsZW4genVsYXNzZW4gKFN0YW5kYXJkOiBmYWxzZSwgKioqKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+ZGlyZWt0ZSBFaW5nYWJlIGVybGF1YmVuPC9zcGFuPjogIEF1c3dhaGwgendpc2NoZW4gZGlyZWt0ZXIgRWluZ2FiZSB1bmQgRWluZ2FiZSAmdXVtbDtiZXIgU1ZHIFRhc3RhdHVyLjwvbGk+CjwvdWw+CjxwPjxpPigqKikgV2FybnVuZzogRGllIEZpbHRlcnVuZyBtaXR0bGVzIEhpbGZlIHZvbiBSZWd1bGFyIEV4cHJlc3Npb25zIGthbm4gYmVpIGdybyZzemxpZztlbiBEYXRlbm1lbmdlbiB6dSBlaW5lbSBzdGFya2VuIFBlcmZvcm1hbmNlYWJmYWxsIGYmdXVtbDtocmVuITwvaT4KICAgIDxpPigqKiopIEJlaSBha3RpdmllcnRlbSBaZWlsZW51bWJydWNoIHdpcmQgZGllIDEsNSBGYWNoZSBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZSBtYWwgZGFyenVzdGVsbGVuZGUgWmVpbGUgYWxzIEgmb3VtbDtoZSBlbXBmb2hsZW4uPC9pPjxicj4KPC9wPgoKPHA+TWVuJnV1bWw7IE9wdGlvbmVuOjwvcD4KPHVsPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPk1lbiZ1dW1sOyBhbnplaWdlbjwvc3Bhbj46IEFuemVpZ2UgZGVzIE1lbiZ1dW1sO2J1dHRvbnMgKFN0YW5kYXJkOiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+TWVuJnV1bWw7YnJlaXRlPC9zcGFuPjogIEJyZWl0ZSBkZXMgTWVuJnV1bWw7cyBiZWkgQXVma2xhcHBlbiBpbiBQaXhlbCAoU3RhbmRhcmQ6IDE1MCk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPk1lbiZ1dW1sO2gmb3VtbDtoZTwvc3Bhbj46IEgmb3VtbDtoZSBkZXMgTWVuJnV1bWw7cyBiZWkgQXVma2xhcHBlbiBpbiBQaXhlbCAoU3RhbmRhcmQ6IDMwMCk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlNwYWx0ZW5hdXN3YWhsIGltIE1lbiZ1dW1sOzwvc3Bhbj46IEFuemVpZ2UgZGVyIFNwYWx0ZW5hdXN3YWhsIGltIE1lbiZ1dW1sOyAoU3RhbmRhcmQ6IHRydWUpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5GaWx0ZXJhdXN3YWhsIGltIE1lbiZ1dW1sOzwvc3Bhbj46IEFuemVpZ2UgZGVyIEZpbHRlcmF1c3dhaGwgaW0gTWVuJnV1bWw7IChTdGFuZGFyZDogdHJ1ZSk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkV4cG9ydGF1c3dhaGwgaW0gTWVuJnV1bWw7PC9zcGFuPjogQW56ZWlnZSBkZXIgRXhwb3J0YXVzd2FobCBpbSBNZW4mdXVtbDsgKFN0YW5kYXJkOiB0cnVlKTwvbGk+CjwvdWw+Cgo8aDI+SGlud2VpczwvaDI+CjxwPjxiPkFiIFZlcnNpb24gMy40IHdlcmRlbiBTVkctU3ltYm9sZSBpbiBkZXIgRnUmc3psaWc7emVpbGUgbmljaHQgbWVociB1bnRlcnN0JnV1bWw7dHp0LiBCaXR0ZSB2ZXJ3ZW5kZW4gU2llIG51ciBtZWhyIFN5bWJvbGUgYXVzIGRlciBCaWJsaW90aGVrIHZvbiBGb250IEF3ZXNvbWUgRnJlZS48L2I+PC9wPgoKPHA+RnVzc3plaWxlIE9wdGlvbmVuOjwvcD4KPHVsPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBlcnN0ZSBTZWl0ZTwvc3Bhbj46IFN5bWJvbCB6dW0gYmwmYXVtbDt0dGVybiBhdWYgZGllIGVyc3RlIFNlaXRlIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1mYXN0LWJhY2t3YXJkIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3ltYm9sIHZvcmlnZSBTZWl0ZTwvc3Bhbj46IFN5bWJvbCB6dW0gYmwmYXVtbDt0dGVybiBhdWYgZGllIHZvcmdlaGVuZGUgU2VpdGUgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtYmFja3dhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgUGF1c2U8L3NwYW4+OiBTeW1ib2wgZiZ1dW1sO3IgUGF1c2UgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXBhdXNlIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3ltYm9sIFN0b3A8L3NwYW4+OiBTeW1ib2wgZiZ1dW1sO3IgU3RvcCAoU3RhbmRhcmQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtc3RvcCImZ3Q7Jmx0Oy9pJmd0Oyk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBuJmF1bWw7Y2hzdGUgU2VpdGU8L3NwYW4+OiBTeW1ib2wgenVtIGJsJmF1bWw7dHRlcm4gYXVmIGRpZSBuJmF1bWw7Y2hzdGUgU2VpdGUgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtZm9yd2FyZCImZ3Q7Jmx0Oy9pJmd0OykgPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgbGV0enRlIFNlaXRlPC9zcGFuPjogU3ltYm9sIHp1bSBibCZhdW1sO3R0ZXJuIGF1ZiBkaWUgbGV0enRlIFNlaXRlIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1mYXN0LWZvcndhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgU2VpdGVuIGxhZGVuPC9zcGFuPjogU3ltYm9sIHp1bSBsYWRlbiBkZXIgbiZhdW1sO2Noc3RlbiBTZWl0ZW4gaW0gbWFudWVsbGVuIE1vZHVzIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1kb3dubG9hZCImZ3Q7Jmx0Oy9pJmd0Oyk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBTdWNoZW48L3NwYW4+OiBTeW1ib2wgZiZ1dW1sO3IgU3VjaGUgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXNlYXJjaCImZ3Q7Jmx0Oy9pJmd0Oyk8L2xpPgoKCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgJlV1bWw7YmVybGF1Zjwvc3Bhbj46IFN5bWJvbCBiZWltIEVycmVpY2hlbiBkZXMgJlV1bWw7YmVybGF1ZnMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWJhbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgVHJpZ2dlciBNb2R1czwvc3Bhbj46IFN5bWJvbCBmJnV1bWw7ciBUcmlnZ2VyIE1vZHVzIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1hbmdsZS1kb3VibGUtZG93biImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgQ29udGludWF0aW9uIE1vZHVzPC9zcGFuPjogU3ltYm9sIGYmdXVtbDtyIGZvcnRsYXVmZW5kZW4gTW9kdXMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWNvZyBmYS1zcGluIiZndDsmbHQ7L2kmZ3Q7ICk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBMaXZlIE1vZHVzPC9zcGFuPjogU3ltYm9sIGYmdXVtbDtyIGxpdmUgTW9kdXMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN5bmMgZmEtc3BpbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgTWFudWVsbGVyIE1vZHVzPC9zcGFuPjogU3ltYm9sIGYmdXVtbDtyIG1hbnVlbGxlbiBNb2R1cyAoU3RhbmRhcmQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtY2hlY2siJmd0OyZsdDsvaSZndDsgKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3ltYm9sIEFiZnJhZ2UgQWJnZXNjaGxvc3Nlbjwvc3Bhbj46IFN5bWJvbCBiZWltIEVycmVpY2hlbiBkZXMgJlV1bWw7YmVybGF1ZnMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWRvd25sb2FkIiZndDsmbHQ7L2kmZ3Q7ICk8L2xpPgo8L3VsPgpBbm1lcmt1bmc6IFNMQU8gPSBTWVNURU0uTElCUkFSWS5BVFZJU0UuT0JKRUNURElTUExBWVMKCjxoMT5TY2huZWxscmVmZXJlbno8L2gxPgoKPGgyPlRhYmVsbGVua29uZmlndXJhdGlvbiBmJnV1bWw7ciBlaW5mYWNoZSBEYXRlbmFiZnJhZ2VuICh6LkIuIHdlYk1JLmRhdGEucmVhZCk8L2gyPgo8cD5aaWVoZW4gc2llIGRhcyBUYWJlbGxlbmRpc3BsYXkgaW4gZGFzIFBhcmVudGRpc3BsYXkgdW5kICZvdW1sO2ZmbmVuIHNpZSBkZW4gU2tyaXB0ZWRpdG9yIGYmdXVtbDtyIGRhcyBQYXJlbnRkaXNwbGF5LjwvcD4KPHByZT4KICAgIC8qIExhZGVuIGRlciBUYWJlbGxlbnJlc291cmNlbiAqLwogICAgd2ViTUkudGFibGUubG9hZFJlc291cmNlcyhmdW5jdGlvbiAoKSB7CgogICAgICAgIC8qIEVyc3RlbGxlbiBkZXIgS29uZmlndXJhdGlvbiAqLwogICAgICAgIHZhciBjb25maWcgPSBbXTsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgZGFyenVzdGVsbGVuZGVuIFNwYWx0ZW4gKi8KICAgICAgICBjb25maWdbImNvbHVtbnMiXSA9CiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsgICBpZDogImlkIiwgbmFtZTogIklEIiwgZmllbGQ6ICJpZCIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogImFkZHJlc3MiLCBuYW1lOiAiQWRkcmVzcyIsIGZpZWxkOiAiYWRkcmVzcyIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogInZhbHVlIiwgbmFtZTogIldlcnQiLCBmaWVsZDogInZhbHVlIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9CiAgICAgICAgICAgIF07CgogICAgICAgIC8qIEtvbmZpZ3VyYXRpb24gZGVzIExhdWZ6ZWl0dmVyaGFsdGVuICovCiAgICAgICAgY29uZmlnWyJtb2RlIl0gPSAib25jZSI7CgogICAgICAgIC8qIEJlaXNwaWVsZGF0ZW4gKi8KICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgIGRhdGEucmVzdWx0ID0gWwogICAgICAgICAgICB7IGlkOjAsIGFkZHJlc3M6ICJub2RlIDEiLCB2YWx1ZTogMTIzIH0sCiAgICAgICAgICAgIHsgaWQ6MSwgYWRkcmVzczogIm5vZGUgMiIsIHZhbHVlOiA0NTYgfSwKICAgICAgICAgICAgeyBpZDoyLCBhZGRyZXNzOiAibm9kZSAzIiwgdmFsdWU6IDc4OSB9LAogICAgICAgICAgICAuLi4KICAgICAgICBdOwoKICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlciBEYXRlbmFiZnJhZ2UgKi8KICAgICAgICBjb25maWdbImRhdGFSZXF1ZXN0RnVuY3Rpb24iXSA9CiAgICAgICAgICAgIGZ1bmN0aW9uIGN1c3RvbURhdGFSZXF1ZXN0KGNvbnRpbnVhdGlvbikgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgLyogUmVnaXN0aWVydW5nIGRlciBLb25maWd1cmF0aW9uICovCiAgICAgICAgd2ViTUkudGFibGUucmVnaXN0ZXIoIm15VGFibGVOYW1lIiwgImNvbmZpZyIsICBjb25maWcpOwogICAgICAgIHdlYk1JLnRhYmxlLnNldFJlYWR5KCJteVRhYmxlTmFtZSIsICJjb25maWciKTsKICAgIH0pOwo8L3ByZT4KPHA+U3BlaWNoZXJuIHNpZSBkZW4gQ29kZSBkZXMgUGFyZW50ZGlzcGxheSB1bmQgcGFyYW1ldHJpZXJlbiBzaWUgZGllIFRhYmVsbGUgd2llIGdld29obnQuIFRyYWdlbiBzaWUgYmVpIFRhYmVsbGVubmFtZSAibXlUYWJsZU5hbWUiIGVpbi48L3A+Cgo8aDI+VGFiZWxsZW5rb25maWd1cmF0aW9uIGYmdXVtbDtyIGVpbmZhY2hlIERhdGVuYWJmcmFnZW4gKHouQi4gd2ViTUkuZGF0YS5yZWFkKTwvaDI+CjxwPlppZWhlbiBzaWUgZGFzIFRhYmVsbGVuZGlzcGxheSBpbiBkYXMgUGFyZW50ZGlzcGxheSB1bmQgJm91bWw7ZmZuZW4gc2llIGRlbiBTa3JpcHRlZGl0b3IgZiZ1dW1sO3IgZGFzIFBhcmVudGRpc3BsYXkuPC9wPgo8cHJlPgogICAgLyogTGFkZW4gZGVyIFRhYmVsbGVucmVzb3VyY2VuICovCiAgICB3ZWJNSS50YWJsZS5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLyogRXJzdGVsbGVuIGRlciBLb25maWd1cmF0aW9uICovCiAgICAgICAgdmFyIGNvbmZpZyA9IFtdOwoKICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlciBkYXJ6dXN0ZWxsZW5kZW4gU3BhbHRlbiAqLwogICAgICAgIGNvbmZpZ1siY29sdW1ucyJdID0KICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgeyAgIGlkOiAiaWQiLCBuYW1lOiAiSUQiLCBmaWVsZDogImlkIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9LAogICAgICAgICAgICAgICAgeyAgIGlkOiAiYWRkcmVzcyIsIG5hbWU6ICJBZGRyZXNzIiwgZmllbGQ6ICJhZGRyZXNzIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9LAogICAgICAgICAgICAgICAgeyAgIGlkOiAidmFsdWUiLCBuYW1lOiAiV2VydCIsIGZpZWxkOiAidmFsdWUiLCBzb3J0YWJsZTogdHJ1ZSwgZmlsdGVyOiB0cnVlIH0KICAgICAgICAgICAgXTsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXMgTGF1ZnplaXR2ZXJoYWx0ZW4gKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJvbmNlIjsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgRGF0ZW5hYmZyYWdlICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHdlYk1JLmRhdGEucmVhZCgKICAgICAgICAgICAgICAgICAgICAiWU9VUl9OT0RFX0FERFJFU1MiLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXF1ZXN0UmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0ID0gcmVxdWVzdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgLyogUmVnaXN0aWVydW5nIGRlciBLb25maWd1cmF0aW9uICovCiAgICAgICAgd2ViTUkudGFibGUucmVnaXN0ZXIoIm15VGFibGVOYW1lIiwgImNvbmZpZyIsICBjb25maWcpOwogICAgICAgIHdlYk1JLnRhYmxlLnNldFJlYWR5KCJteVRhYmxlTmFtZSIsICJjb25maWciKTsKICAgIH0pOwo8L3ByZT4KPHA+U3BlaWNoZXJuIHNpZSBkZW4gQ29kZSBkZXMgUGFyZW50ZGlzcGxheSB1bmQgcGFyYW1ldHJpZXJlbiBzaWUgZGllIFRhYmVsbGUgd2llIGdld29obnQuIFRyYWdlbiBzaWUgYmVpIFRhYmVsbGVubmFtZSAibXlUYWJsZU5hbWUiIGVpbi48L3A+Cgo8aDI+VGFiZWxsZW5rb25maWdydWF0aW9uIGYmdXVtbDtyIExpdmUgRGF0ZW48L2gyPgo8cD5aaWVoZW4gc2llIGRhcyBUYWJlbGxlbmRpc3BsYXkgaW4gZGFzIFBhcmVudGRpc3BsYXkgdW5kICZvdW1sO2ZmbmVuIHNpZSBkZW4gU2tyaXB0ZWRpdG9yIGYmdXVtbDtyIGRhcyBQYXJlbnRkaXNwbGF5LiBGJnV1bWw7Z2VuCiAgICBzaWUgZGllIEtvbmZpZ3VyYXRpb24gZiZ1dW1sO3IgZWluZmFjaGUgRGF0ZW5hYmZyYWdlbiBlaW4uIERhbmFjaCAmYXVtbDtuZGVybiBzaWUgZGVuIE1vZHVzIHVuZCBtb2RpZml6aWVyZW4gc2llCiAgICBpaHJlIERhdGVuYWJmcmFnZSB3aWUgZm9sZ3QuCjwvcD4KPHByZT4KICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlcyAgTGF1ZnplaXR2ZXJoYWx0ZW4gKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJsaXZlIjsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgRGF0ZW5hYmZyYWdlICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHNlbGYuc3Vic2NyaWJlSUQgPSB3ZWJNSS5kYXRhLnN1YnNjcmliZSgKICAgICAgICAgICAgICAgICAgICAiWU9VUl9OT0RFX0FERFJFU1MiLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXF1ZXN0UmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0ID0gcmVxdWVzdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgd2ViTUkuYWRkT251bmxvYWQoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB3ZWJNSS5kYXRhLnVuc3Vic2NyaWJlKHNlbGYuc3Vic2NyaWJlSUQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CjwvcHJlPgoKPGgyPlRhYmVsbGVua29uZmlncnVhdGlvbiBmJnV1bWw7ciAiQ29udGludWF0aW9uIFBvaW50cyIgKGNvbnRpbnVlIC8gdHJpZ2dlcik8L2gyPgo8cD5aaWVoZW4gc2llIGRhcyBUYWJlbGxlbmRpc3BsYXkgaW4gZGFzIFBhcmVudGRpc3BsYXkgdW5kICZvdW1sO2ZmbmVuIHNpZSBkZW4gU2tyaXB0ZWRpdG9yIGYmdXVtbDtyIGRhcyBQYXJlbnRkaXNwbGF5LiBGJnV1bWw7Z2VuCiAgICBzaWUgZGllIEtvbmZpZ3VyYXRpb24gZiZ1dW1sO3IgZWluZmFjaGUgRGF0ZW5hYmZyYWdlbiBlaW4uIERhbmFjaCAmYXVtbDtuZGVybiBzaWUgZGVuIE1vZHVzIHVuZCBtb2RpZml6aWVyZW4gc2llCiAgICBpaHJlIERhdGVuYWJmcmFnZSB3aWUgZm9sZ3QuCjwvcD4KPHByZT4KICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlcyAgTGF1ZnplaXR2ZXJoYWx0ZW4gKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJjb250aW51ZSI7IC8vIDw8PCBmJnV1bWw7ciBkZW4gVHJpZ2dlcm1vZHVzIGVyc2V0emVuIHNpZSAiY29udGludWUiIGR1cmNoICJ0cmlnZ2VyZWQiCgogICAgICAgIC8qIEtvbmZpZ3VyYXRpb24gZGVyIERhdGVuYWJmcmFnZSAqLwoJCWNvbmZpZ1siZGF0YVJlcXVlc3RGdW5jdGlvbiJdID0KCQkJZnVuY3Rpb24gY3VzdG9tRGF0YVJlcXVlc3QoY29udGludWF0aW9uKSB7CgkJCQl2YXIgc2VsZiA9IHRoaXM7CgkJCQlpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCQkJCWZpbHRlciA9IGNvbnRpbnVhdGlvbi5DUC52YWx1ZTsKCQkJCQl3ZWJNSS5kYXRhLnF1ZXJ5TmV4dCgKCQkJCQkJZmlsdGVyLAoJCQkJCQlhZGREYXRhVG9Db250cm9sbGVyCgkJCQkJKTsKCQkJCX0gZWxzZSB7CgkJCQkJZmlsdGVyID0gewoJCQkJCQlhZGRyZXNzOiBbImc6KllPVVJfTk9ERV9BRERSRVNTKiJdLAoJCQkJCQlzZWxlY3Q6IFsidjpwcmlvcml0eSIsICJ2OnZhbHVlIiwgInY6dXNlcm5hbWUiLCAidjphZGRyZXNzIiwgInY6dGltZXN0YW1wIiwgInY6dHlwZSIsICJ2OnN0YXR1cyIsICJ2OlJlcGxhY2VtZW50TmFtZXMiLCAidjpSZXBsYWNlbWVudFZhbHVlcyJdLAoJCQkJCQl0eXBlOiBbInY6MSJdLAoJCQkJCQludW1yb3dzOlsidjoxMDAwIl0KCQkJCQl9OwoJCQkJCXdlYk1JLmRhdGEucXVlcnlGaWx0ZXIoCgkJCQkJCWZpbHRlciwKCQkJCQkJYWRkRGF0YVRvQ29udHJvbGxlcgoJCQkJCSk7CgkJCQl9CgkJCQlmdW5jdGlvbiBhZGREYXRhVG9Db250cm9sbGVyKHJlcXVlc3RSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlcXVlc3RSZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgIC8qIEhpbnp1ZiZ1dW1sO2dlbiBkZXIgIkNvbnRpbnVhdGlvbiIgSW5mb3JtYXRpb25lbiAqLwoJCQkJCWlmICh0eXBlb2YgZGF0YS5Nb3JlICE9ICJ1bmRlZmluZWQiICYmIGRhdGEuTW9yZSAhPSBmYWxzZSAmJiBkYXRhLmNvbnRpbnVhdGlvbnBvaW50ID4gMCkgewoJCQkJCQlkYXRhLkNQID0ge307CgkJCQkJCWRhdGEuQ1AudmFsdWUgPSByZXF1ZXN0UmVzdWx0LmNvbnRpbnVhdGlvbnBvaW50OwoJCQkJCX0gZWxzZSB7CgkJCQkJCWRhdGEuTW9yZSA9IGZhbHNlOwoJCQkJCX0KCgkJCQkJdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKCQkJCX0KCQkJfTsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgRnJlaWdhYmUgKi8KICAgICAgICBjb25maWdbImRhdGFSZWxlYXNlRnVuY3Rpb24iXSA9CiAgICAgICAgICAgIGZ1bmN0aW9uIGRhdGFSZWxlYXNlRnVuY3Rpb24oY29udGludWF0aW9uKSB7CgkgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCSAgICAgICAgICAgIHdlYk1JLmRhdGEucXVlcnlSZWxlYXNlKGNvbnRpbnVhdGlvbi5DUC52YWx1ZSk7CgkgICAgICAgIH0KICAgICAgICB9Cgo8L3ByZT4KCjxoMj5adWdyaWZmIGF1ZiBUYWJlbGxlbmluaGFsdGU8L2gyPgo8cD5EZXIgZWluZmFjaHN0ZSBXZWcgYXVmIFRhYmVsbGVuaW5oYWx0ZSB6dXp1Z3JlaWZlbiwgaXN0IGRpZSBWZXJ3ZW5kdW5nIGRlciBvbkNsaWNrQ2FsbGJhY2sgS29uZmlndXJhdGlvbi4KCSZVdW1sO2JlciBkaWVzZXMgQ2FsbGJhY2sgayZvdW1sO25uZW4gZGFzIEV2ZW50IHVuZCBkaWUgSW5mb3MgJnV1bWw7YmVyIGRhcyBzZWxla3RpZXJ0ZSBJdGVtIGluIGVpbmVyIGJlbnV0emVyZGVmaW5pZXJ0ZW4KCUZ1bmt0aW9uIHZlcmFyYmVpdGV0IHdlcmRlbiAoei5CLiBBdWZydWYgZWlnZW5lciBEaWFsb2dlKSA8L3A+CjxwcmU+CiAgICAvKiBMYWRlbiBkZXIgVGFiZWxsZW5yZXNvdXJjZW4gKi8KICAgIHdlYk1JLnRhYmxlLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24gKCkgewoKICAgICAgICAvKiBFcnN0ZWxsZW4gZGVyIEtvbmZpZ3VyYXRpb24gKi8KICAgICAgICB2YXIgY29uZmlnID0gW107CgogICAgICAgIC4uLgoKICAgICAgICBjb25maWdbIm9uQ2xpY2tDYWxsYmFjayJdID0gZnVuY3Rpb24oZSwgaW5mbyl7CiAgICAgICAgICB2YXIgaXRlbSA9IGluZm8uaXRlbTsKICAgICAgICAgIHZhciByb3cgPSBpbmZvLnJvd0luZGV4OwogICAgICAgICAgdmFyIGNvbHVtbiA9IGluZm8uY29sdW1uOwoKICAgICAgICAgIHZhciBpZCA9IGl0ZW0uaWQ7CiAgICAgICAgICBpdGVtLnZhbHVlID0gImNoYW5nZWQgdmFsdWUiOwoKICAgICAgICAgIC8qIHVwZGF0ZS9kZWxldGUvd2luZG93ICovCiAgICAgICAgICBpZihjb2x1bW4uaWQgPT0gInRpbWVzdGFtcCIpewogICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIudXBkYXRlRGF0YShpZCwgaXRlbSk7CiAgICAgICAgICB9IGVsc2UgaWYoY29sdW1uLmlkID09ICJ2YWx1ZSIpewogICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIucmVtb3ZlRGF0YShpZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvcGVuTXlXaW5kb3dGdW5rdGlvblRvRWRpdChpdGVtKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC4uLgoKICAgIH0pOwo8L3ByZT4KCjxoMj5TdWNoZSBuYWNoIFdlcnRlbiBpbiBkZXIgVGFiZWxsZTwvaDI+CjxwPk1pdCBIaWxmZSBkZXIgc2VhcmNoKGF0dHJpYnV0ZSwgdmFsdWUsIGV4YWN0U2VhcmNoKSBGdW5rdGlvbiBrYW5uIGluIGRlciBUYWJlbGxlIG5hY2ggV2VydGVuIGdlc3VjaHQgd2VyZGVuLgoJSW0gVHJlZmZlcmZhbGxlIHdlcmRlbiBkaWUgZ2VmdW5kZW4gSXRlbXMgaW4gZWluZW0gQXJyYXkgenVy/GNrZ2VnZWJlbi48L3A+CjxwcmU+CiAgd2ViTUkudGFibGUud2FpdFJlYWR5KCJteVRhYmxlTmFtZSIsICJjb250cm9sbGVyIiwgZnVuY3Rpb24gKCkgewoKICAgIHRhYmxlQ29udHJvbGxlciA9IHdlYk1JLnRhYmxlLnJlcXVlc3QoIm15VGFibGVOYW1lIiwgImNvbnRyb2xsZXIiKTsKICAgIHZhciBpdGVtQXJyYXkgPSB0YWJsZUNvbnRyb2xsZXIuc2VhcmNoKCJ0aW1lc3RhbXAiLCAxNTUzNzg1MTEwNTAwLCB0cnVlKTsKCiAgICB2YXIgaWQgPSBpdGVtQXJyYXlbMF0uaWQ7CiAgICBpdGVtQXJyYXlbMF0udmFsdWUgPSAiY2hhbmdlZCB2YWx1ZSI7CgogICAgLyogdXBkYXRlICovCiAgICB0YWJsZUNvbnRyb2xsZXIudXBkYXRlRGF0YShpZCwgaXRlbUFycmF5WzBdKTsKCiAgICAvKiBkZWxldGUgKi8KICAgIHRhYmxlQ29udHJvbGxlci5yZW1vdmVEYXRhKGlkKTsKCiAgfSk7CjwvcHJlPgoKPGgyPlRpbWVzdGFtcCBLb252ZXJ0aWVydW5nPC9oMj4KPHA+TWl0IGF0dmlzZSAzLjMuMiB3aXJkIGRlciBUaW1lc3RhbXAgdm9uICJkYXRldGltZSIgU3BhbHRlbiBuaWNodCBsJmF1bWw7bmdlciBhbHMgU3RyaW5nIGdlbGllZmVydC4gRGFoZXIgaXN0IGVzIG5vdHdlbmRpZyBkZW4gZ2VsaWVmZXJ0ZW4gVGltZXN0YW1wIG1pdCBIaWxmZSBlaW5lcyBGb3JtYXR0ZXJzIGlubmVyaGFsYiBkZXIgVGFiZWxsZSBpbiBlaW5lbiBTdHJpbmcgdW16dXdhbmRlbG4uPC9wPgo8cD5CZWlzcGllbDo8L3A+CjxwcmU+CglmdW5jdGlvbiBfbWFrZUNvbnZlcnNpb25zKGZvcm1hdCwgdmFsdWUpIHsKCWlmIChmb3JtYXRbMF0gPT0gImRhdGV0aW1lIikgewoJCWlmICh2YWx1ZSkgewoJCQlpZiAodHlwZW9mIHZhbHVlID09ICJzdHJpbmciICYmIHZhbHVlLmluZGV4T2YoIi0iKSA+IC0xKQkJLy9pZ25vcmUgYWxyZWFkeSBmb3JtYXR0ZWQgdmFsdWVzCgkJCQlyZXR1cm4gdmFsdWU7CgoJCQl2YXIgZGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KHZhbHVlLCAxMCkpOwoJCQl2YWx1ZSA9IHdlYk1JLnNwcmludGYoIiVkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZC4lMDNkIiwgZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCksIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpOwoJCX0gZWxzZSB7CgkJCXZhbHVlID0gIiI7CgkJfQoJfQoJcmV0dXJuICc8ZGl2IGNsYXNzPSJzbGljay1jZWxsLWl0ZW0iPicrdmFsdWUrJzwvZGl2Pic7Cgl9CjwvcHJlPgo8aDE+VGFiZWxsZW5rb25maWd1cmF0aW9uZW48L2gxPgo8cD5XZWl0ZXIgS29uZmlndXJhdGlvbnNoaWxmZSBlcmhhbHRlbiBzaWUgaW4gZGVyIGF0dmlzZSBEb2t1bWVudGF0aW9uIHVuZCBiZWkgYXR2aXNlIExpdmUhPC9wPgo8YnI+CjwvYm9keT4KPC9odG1sPg==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table.en" BrowseName="1:en" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">en</DisplayName>
		<Description Locale="en">en</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.HtmlHelp</Reference>
		</References>
		<Value>
			<uax:ByteString>PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSI+CiAgICA8dGl0bGU+T0RfaGVscDwvdGl0bGU+CiAgICA8c3R5bGU+ICNwYXJhbWV0ZXIgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgfSA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8aDE+RGVzY3JpcHRpb248L2gxPgo8cD5UaGlzIGRpc3BsYXkgaXMgc3VpdGFibGUgZm9yIGRpc3BsYXlpbmcgZGF0YSBpbiB0YWJ1bGFyIGZvcm0uIEluIGFkZGl0aW9uIHRvIHRoZSBzZXR0aW5nIG9mIHRoZQogICAgVGFibGUgcGFyYW1ldGVycyBhbHNvIHJlcXVpcmUgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGhpZ2hlci1sZXZlbCBkaXNwbGF5LiBUaGUgaGlnaGVyLWxldmVsIGRpc3BsYXkgd2lsbCBiZQogICAgaW4gdGhlIGZvbGxvd2luZyBhbHNvIHJlZmVycmVkIHRvIGFzIFBhcmVudGRpc3BsYXkuPC9wPgoKPGgyPkNvbmRpdGlvbnM8L2gyPgo8cD5UaGUgdGFibGUgbGlicmFyeSByZXF1aXJlcyBqUXVlcnk+IDEuNyBhbmQgaXMgY3VycmVudGx5IHNoaXBwZWQgd2l0aCBqUXVlcnk+IDMuMy54LjwvcD4KPHA+VG8gYXZvaWQgY29tcGF0aWJpbGl0eSBpc3N1ZXMsIHRoZSBpbmNsdWRlZCBqUXVlcnkgdmVyc2lvbiBpcyBvbmx5IHVzZWQgaWYgbm9uZSBhbHJlYWR5CiAgICBleGlzdGluZyB2ZXJzaW9uIGlzIGRldGVjdGVkLiBUaGVyZWZvcmUgalF1ZXJ5IHNob3VsZCBhbHJlYWR5IGJlIHVzZWQgaW4gYW4gZXhpc3RpbmcgcHJvamVjdAogICAgdGhlIHNwcmVhZHNoZWV0IGxpYnJhcnkgdG8gdGhlbS4gVGhlcmVmb3JlLCBtYWtlIHN1cmUgdGhhdCBpbiB0aGlzIGNhc2UgYSBqUXVlcnkgdmVyc2lvbj4gMS43LngKICAgIGlzIHVzZWQhPC9wPgoKPGgxPlBhcmFtZXRlcjwvaDE+CjxwPlRoZSB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBnZW5lcmFsIHBhcmFtZXRlcnM6OjwvcD4KPHVsPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmJhc2U8L3NwYW4+OiBDdXJyZW50IG5vdCBpbiB1c2U8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIElEPC9zcGFuPjogVW5pcXVlIHRhYmxlIG5hbWU8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIGhlYWRlciBoZWlnaHQ8L3NwYW4+OiBIZWlnaHQgb2YgdGFibGUgaGVhZGVyIGluIHBpeGVscyAoZGVmYXVsdCAzMCwgKik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIGhlYWRlciBmb250IHNpemU8L3NwYW4+OiBGb250IHNpemUgaW4gdGhlIHRhYmxlIGhlYWRlciAoZGVmYXVsdDogMTQpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj50YWJsZSBoZWFkZXIgY2VsbCBhbGlnbiBob3Jpem9udGFsPC9zcGFuPjogSG9yaXpvbnRhbCBhbGlnbiBvZiBjb250ZW50IGluIGhlYWRlciAoZGVmYXVsdDogaW5oZXJpdCk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIGhlYWRlciBjZWxsIGFsaWduIHZlcnRpY2FsPC9zcGFuPjogVmVydGljYWwgYWxpZ24gb2YgY29udGVudCBpbiBoZWFkZXIgKGRlZmF1bHQ6IGNlbnRlcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIHJvdyBoZWlnaHQ8L3NwYW4+OiBIZWlnaHQgb2YgdGFibGUgcm93cyBpbiBwaXhlbHMgKGRlZmF1bHQgMjAsICoqKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+dGFibGUgcm93IGZvbnQgc2l6ZTwvc3Bhbj46IEZvbnQgc2l6ZXMgaW4gYSB0YWJsZSByb3cgKGRlZmF1bHQ6IDEyKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+dGFibGUgZGV0YWlsIGZvbnQgc2l6ZTwvc3Bhbj46IEZvbnQgc2l6ZSBmb3IgdGFibGUgZGV0YWlscyAoZGVmYXVsdDogMTIpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj50YWJsZSBmb290ZXIgZm9udCBzaXplPC9zcGFuPjogRm9udCBzaXplIGluIHRhYmxlIGZvb3RlciAoZGVmYXVsdDogMTIpPC9saT4KPC91bD4KPHA+PGk+KCopSSB0IGlzIHJlY29tbWVuZGVkIHRvIGhhdmUgYSBoZWlnaHQgdGhhdCBpcyBhcHByb3hpbWF0ZWx5IHR3aWNlIHRoZSBkcmF3aW5nIGhlaWdodC48L2k+PGJyPgogICAgPGk+KCoqKSBJZiB0aGUgbGluZSBicmVhayBpcyBhY3RpdmUsIHRoZSBsaW5lIG9mIGNoYXJhY3RlcnMgMS41IHRpbWVzIHRoZSBzaXplIG9mIHRoZSBmb250IGlzIHJlY29tbWVuZGVkIGFzIHRoZQogICAgICAgIGhpZ2hlc3QgdmFsdWUuPC9pPjwvcD4KCjxwPkFwcGVhcmFuY2U6PC9wPgo8dWw+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Zm9udCBmYW1pbHk8L3NwYW4+OiBGb250IGZhbWlseSAoZGVmYXVsdDogQXJpYWwpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5nbG9iYWwgYm9yZGVyIGNvbG9yczwvc3Bhbj46IFNvdXJjZSBmb3IgZnJhbWUgY29sb3IgKGRlZmF1bHQ6IFNZU1RFTS5HTE9CQUxTLmF0dkJvcmRlckNvbG9yKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Z2xvYmFsIGZpbGwgY29sb3JzPC9zcGFuPjogU291cmNlIGZvciBjb2xvciAoZGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2RmlsbENvbG9yKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Z2xvYmFsIGZvbnQgY29sb3JzPC9zcGFuPjogU291cmNlIGZvciBmb250IGNvbG9yIChkZWZhdWx0OiBTWVNURU0uR0xPQkFMUy5hdHZGb250Q29sb3IpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5nbG9iYWwgc3ltYm9sIGNvbG9yczwvc3Bhbj46IFNvdXJjZSBmb3IgSWNvbiBDb2xvciAoRGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2U3ltYm9sQ29sb3IpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5nbG9iYWwgaW5hY3RpdmUgY29sb3JzPC9zcGFuPjogU291cmNlIGZvciBpbmFjdGl2ZSBDb2xvciAoRGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2SW5hY3RpdmVDb2xvcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmdsb2JhbCB0YWJsZSBjb2xvcnM8L3NwYW4+OiBTb3VyY2UgZm9yIHRhYmxlIGNvbG9ycyAoZGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2T2JqZWN0RGlzcGxheXMuQmFzZVRhYmxlLkNvbG9yQ29uZmlnKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Y3VzdG9tIHRoZW1lPC9zcGFuPjogT3B0aW9uYWwgQ1NTIHBhdGggZm9yIGN1c3RvbSB0aGVtZSAoZGVmYXVsdDogYXR2aXNlVGhlbWUpPC9saT4KPC91bD4KCjxwPk9wdGlvbnM6PC9wPgo8dWw+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Y29sdW1ucyByZW9yZGVyYWJsZTwvc3Bhbj46IEFsbG93IG1vdmluZyBjb2x1bW5zIChkZWZhdWx0OiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+cGFnaW5nPC9zcGFuPjogRGlzcGxheSBvZiBwYWdlIG5hdmlnYXRpb24gKGRlZmF1bHQ6IHRydWUpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5maWx0ZXIgYmFyIGVuYWJsZWQ8L3NwYW4+OiBTaG93IHRhYmxlIGZpbHRlciAoZGVmYXVsdDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciByZWd1bGFyIGV4cHJlc3Npb25zPC9zcGFuPjogRmlsdGVyIGZ1bmN0aW9uIHVzZXMgUmVndWxhciBFeHByZXNzaW9ucyAoZGVmYXVsdDogZmFsc2UsICoqKik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciB1c2UgcGxhY2Vob2xkZXI8L3NwYW4+OiBBY3RpdmF0aW9uIG9mIHRoZSAmcXVvdDsqJnF1b3Q7IHBsYWNlaG9sZGVyIGluIHRoZSBzZWFyY2ggZnVuY3Rpb248L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciBjYXNlIHNlbnNpdGl2ZTwvc3Bhbj46IENhc2Utc2Vuc2l0aXZlIChkZWZhdWx0OiBmYWxzZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciBtaW5pbXVtIGxlbmdodDwvc3Bhbj46IE1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYmVmb3JlIHRoZSBmaWx0ZXIgYmVjb21lcyBhY3RpdmUgKGRlZmF1bHQ6IDEpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5maWx0ZXIgc3RhcnQgZGVsYXk8L3NwYW4+OiBEZWxheSBvZiB0aGUgYXV0b21hdGljIGZpbHRlcmluZyBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDEwMDAsIHN3aXRjaGluZyBvZmYgdGhlIGF1dG9tYXRpYyB3aXRoIDApPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zaG93IHJ1bnRpbWUgbW9kZTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIHJ1bnRpbWUgbW9kZSBpbiB0aGUgc3RhdHVzIGJhciAoZGVmYXVsdDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPm11bHRpc2VsZWN0PC9zcGFuPjogQWN0aXZhdGlvbiBvZiB0aGUgbXVsdGlwbGUgc2VsZWN0aW9uIChkZWZhdWx0OiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+bXVsdGlzZWxlY3Qgb24gY2VsbCBjbGljazwvc3Bhbj46IE11bHRpcGxlIHNlbGVjdGlvbiwgbWFya2luZyBieSBjbGlja2luZyBvbiBjZWxsIChkZWZhdWx0OiBmYWxzZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmNlbGwgbGluZWJyZWFrPC9zcGFuPjogQWxsb3cgbGluZSBicmVhayBpbiBjb2x1bW5zIChkZWZhdWx0OiBmYWxzZSwgKiopPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5hbGxvdyBkaXJlY3QgaW5wdXQ8L3NwYW4+OiBzZWxlY3QgIlllcyIgaWYgeW91IHdhbnQgdG8gZGlyZWN0bHkgZW50ZXIgY2hhcmFjdGVycyBpbiB0aGUgY29udHJvbCB3aXRob3V0IG9wZW5pbmcgdGhlIFNWRyBLZXlib2FyZC48L2xpPgo8L3VsPgo8cD48aT4oKiopIElmIHRoZSBsaW5lIGJyZWFrIGlzIGFjdGl2ZSwgdGhlIGxpbmUgb2YgY2hhcmFjdGVycyAxLjUgdGltZXMgdGhlIHNpemUgb2YgdGhlIGZvbnQgaXMgcmVjb21tZW5kZWQgYXMgdGhlCiAgICBoaWdoZXN0IHZhbHVlLjwvaT48YnI+CiAgICA8aT4oKioqKSBXYXJuaW5nOiBGaWx0ZXJpbmcgd2l0aCB0aGUgaGVscCBvZiBSZWd1bGFyIEV4cHJlc3Npb25zIGNhbiBsZWFkIHRvIGEgbGFyZ2UgZHJvcCBpbiBwZXJmb3JtYW5jZSBmb3IgbGFyZ2UKICAgICAgICBhbW91bnRzIG9mIGRhdGEhPC9pPjxicj4KPC9wPgoKPHA+TWVudSBvcHRpb25zOjwvcD4KPHVsPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnNob3cgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIG1lbnUgYnV0dG9uIChkZWZhdWx0OiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+bWVudSBoZWlnaHQ8L3NwYW4+OiBIZWlnaHQgb2YgdGhlIG1lbnUgd2hlbiBvcGVuZWQgaW4gcGl4ZWxzIChkZWZhdWx0OiAzMDApPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5tZW51IHdpZHRoPC9zcGFuPjogIFdpZHRoIG9mIHRoZSBtZW51IHdoZW4gb3BlbmVkIGluIHBpeGVscyAoZGVmYXVsdDogMTUwKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c2hvdyBwaWNrZXIgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIGNvbHVtbiBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuIChEZWZhdWx0OiB0cnVlKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c2hvdyBmaWx0ZXIgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIGZpbHRlciBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuIChEZWZhdWx0OiB0cnVlKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c2hvdyBleHBvcnQgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIGV4cG9ydCBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuIChEZWZhdWx0OiB0cnVlKTwvbGk+CjwvdWw+Cgo8aDI+Tm90ZTwvaDI+CjxwPjxiPkZyb20gdmVyc2lvbiAzLjQgc3ZnIGljb25zIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIGluIGZvb3Rlci4gUGxlYXNlIG9ubHkgdXNlIG1vcmUgc3ltYm9scyBmcm9tIHRoZSBsaWJyYXJ5IG9mIEZvbnQgQXdlc29tZSBGcmVlLjwvYj48L3A+Cgo8cD5Gb290ZXIgb3B0aW9uczo8L3A+Cjx1bD4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgZmlyc3QgcGFnZTwvc3Bhbj46IFN5bWJvbCB0byBvcGVuIHRoZSBmaXJzdCBwYWdlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWZhc3QtYmFja3dhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgcHJldmlvdXMgcGFnZTwvc3Bhbj46IFN5bWJvbCB0byBvcGVuIHRoZSBwcmV2aW91cyBwYWdlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtYmFja3dhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgcGF1c2U8L3NwYW4+OiBTeW1ib2wgZm9yIHBhdXNlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXBhdXNlIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c3ltYm9sIHN0b3A8L3NwYW4+OiBTeW1ib2wgZm9yIHBhdXNlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0b3AiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbmV4dCBwYWdlPC9zcGFuPjogU3ltYm9sIHRvIHNjcm9sbCB0byB0aGUgbmV4dCBwYWdlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtZm9yd2FyZCImZ3Q7Jmx0Oy9pJmd0OykgPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbGFzdCBwYWdlPC9zcGFuPjogU3ltYm9sIHRvIG9wZW4gdGhlIGxhc3QgcGFnZSAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1mYXN0LWZvcndhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbGFvZCBwYWdlczwvc3Bhbj46IFN5bWJvbCBmb3IgbG9hZGluZyB0aGUgbmV4dCBwYWdlcyBpbiBtYW51YWwgbW9kZSAoU3RhbmRhcmQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtZG93bmxvYWQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgc2VhcmNoPC9zcGFuPjogU3ltYm9sIGZvciBzZWFyY2ggKGRlZmF1bHQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtc2VhcmNoIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+CgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnN5bWJvbCB0cnVuY2F0ZTwvc3Bhbj46IFN5bWJvbCB3aGVuIHJlYWNoaW5nIHRoZSBvdmVyZmxvdyAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1iYW4iJmd0OyZsdDsvaSZndDsgKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c3ltYm9sIHRyaWdnZXJlZDwvc3Bhbj46IFN5bWJvbCBmb3IgdHJpZ2dlciBtb2RlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWFuZ2xlLWRvdWJsZS1kb3duIiZndDsmbHQ7L2kmZ3Q7ICk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnN5bWJvbCBjb250aW51ZTwvc3Bhbj46IFN5bWJvbCBmb3IgY29udGludWUgbW9kZSAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1jb2cgZmEtc3BpbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbGl2ZTwvc3Bhbj46IFN5bWJvbCBmb3IgbGl2ZSBtb2RlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN5bmMgZmEtc3BpbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbWFudWFsbHk8L3NwYW4+OiBTeW1ib2wgZm9yIG1hbnVhbGx5IG1vZGUgKGRlZmF1bHQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtY2hlY2siJmd0OyZsdDsvaSZndDsgKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c3ltYm9sIGRvbmU8L3NwYW4+OiBTeW1ib2wgZm9yIGFsbCBkYXRhIGxvYWRlZCAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1kb3dubG9hZCImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KPC91bD4KTm90ZTogKiA9IFNZU1RFTS5MSUJSQVJZLkFUVklTRS5PQkpFQ1RESVNQTEFZUwoKPGgxPlF1aWNrIHJlZmVyZW5jZTwvaDE+CjxoMj5UYWJsZSBjb25maWd1cmF0aW9uIGZvciBhIHNpbXBsZSBkYXRhIHN0cnVjdHVyZTwvaDI+CjxwPkRyYWcgdGhlIHNwcmVhZHNoZWV0IGRpc3BsYXkgaW50byB0aGUgcGFyZW50IGRpc3BsYXkgYW5kIG9wZW4gdGhlIFNjcmlwdCBFZGl0b3IgZm9yIHRoZSBwYXJlbnQgZGlzcGxheS48L3A+CjxwcmU+CiAgICAvKiBMb2FkaW5nIHRoZSB0YWJsZSByZXNvdXJjZXMgKi8KICAgIHdlYk1JLnRhYmxlLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24gKCkgewoKICAgICAgICAvKiBDcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgICB2YXIgY29uZmlnID0gW107CgogICAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkICovCiAgICAgICAgY29uZmlnWyJjb2x1bW5zIl0gPQogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7ICAgaWQ6ICJpZCIsIG5hbWU6ICJJRCIsIGZpZWxkOiAiaWQiLCBzb3J0YWJsZTogdHJ1ZSwgZmlsdGVyOiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7ICAgaWQ6ICJhZGRyZXNzIiwgbmFtZTogIkFkZHJlc3MiLCBmaWVsZDogImFkZHJlc3MiLCBzb3J0YWJsZTogdHJ1ZSwgZmlsdGVyOiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7ICAgaWQ6ICJ2YWx1ZSIsIG5hbWU6ICJXZXJ0IiwgZmllbGQ6ICJ2YWx1ZSIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfQogICAgICAgICAgICBdOwoKICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBydW50aW1lIGJlaGF2aW9yICovCiAgICAgICAgY29uZmlnWyJtb2RlIl0gPSAib25jZSI7CgogICAgICAgIC8qIEV4YW1wbGUgc2V0IG9mIGRhdGEgKi8KICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgIGRhdGEucmVzdWx0ID0gWwogICAgICAgICAgICB7IGlkOjAsIGFkZHJlc3M6ICJub2RlIDEiLCB2YWx1ZTogMTIzIH0sCiAgICAgICAgICAgIHsgaWQ6MSwgYWRkcmVzczogIm5vZGUgMiIsIHZhbHVlOiA0NTYgfSwKICAgICAgICAgICAgeyBpZDoyLCBhZGRyZXNzOiAibm9kZSAzIiwgdmFsdWU6IDc4OSB9LAogICAgICAgICAgICAuLi4KICAgICAgICBdOwoKICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBkYXRhIHF1ZXJ5ICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBpZHMgPSBzZWxmLmFkZERhdGEoZGF0YSk7CiAgICAgICAgICAgIH07CgogICAgICAgIC8qIFJlZ2lzdHJhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgICAgIHdlYk1JLnRhYmxlLnJlZ2lzdGVyKCJteVRhYmxlTmFtZSIsICJjb25maWciLCAgY29uZmlnKTsKICAgICAgICB3ZWJNSS50YWJsZS5zZXRSZWFkeSgibXlUYWJsZU5hbWUiLCAiY29uZmlnIik7CiAgICB9KTsKPC9wcmU+CjxwPlNhdmUgdGhlIGNvZGUgb2YgdGhlIHBhcmVudCBkaXNwbGF5IGFuZCBwYXJhbWV0ZXJpemUgdGhlIHRhYmxlIGFzIHVzdWFsLiBFbnRlciAibXlUYWJsZU5hbWUiIGF0IHRoZSB0YWJsZSBuYW1lLjwvcD4KPGgyPlRhYmxlIGNvbmZpZ3VyYXRpb24gZm9yIGRhdGEgcXVlcmllcyAoZS5nLiB3ZWJNSS5kYXRhLnJlYWQpPC9oMj4KPHA+RHJhZyB0aGUgc3ByZWFkc2hlZXQgZGlzcGxheSBpbnRvIHRoZSBwYXJlbnQgZGlzcGxheSBhbmQgb3BlbiB0aGUgU2NyaXB0IEVkaXRvciBmb3IgdGhlIHBhcmVudCBkaXNwbGF5LjwvcD4KPHByZT4KICAgIC8qIExvYWRpbmcgdGhlIHRhYmxlIHJlc291cmNlcyAqLwogICAgd2ViTUkudGFibGUubG9hZFJlc291cmNlcyhmdW5jdGlvbiAoKSB7CgogICAgICAgIC8qIENyZWF0ZSB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgICAgIHZhciBjb25maWcgPSBbXTsKCiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgY29sdW1ucyB0byBiZSBkaXNwbGF5ZWQgKi8KICAgICAgICBjb25maWdbImNvbHVtbnMiXSA9CiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsgICBpZDogImlkIiwgbmFtZTogIklEIiwgZmllbGQ6ICJpZCIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogImFkZHJlc3MiLCBuYW1lOiAiQWRkcmVzcyIsIGZpZWxkOiAiYWRkcmVzcyIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogInZhbHVlIiwgbmFtZTogIldlcnQiLCBmaWVsZDogInZhbHVlIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9CiAgICAgICAgICAgIF07CgogICAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgdGhlIHJ1bnRpbWUgYmVoYXZpb3IgKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJvbmNlIjsKCiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgZGF0YSBxdWVyeSAqLwogICAgICAgIGNvbmZpZ1siZGF0YVJlcXVlc3RGdW5jdGlvbiJdID0KICAgICAgICAgICAgZnVuY3Rpb24gY3VzdG9tRGF0YVJlcXVlc3QoY29udGludWF0aW9uKSB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgICAgICB3ZWJNSS5kYXRhLnJlYWQoCiAgICAgICAgICAgICAgICAgICAgIllPVVJfTk9ERV9BRERSRVNTIiwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVxdWVzdFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc3VsdCA9IHJlcXVlc3RSZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZHMgPSBzZWxmLmFkZERhdGEoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgIC8qIFJlZ2lzdHJhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgICAgIHdlYk1JLnRhYmxlLnJlZ2lzdGVyKCJteVRhYmxlTmFtZSIsICJjb25maWciLCAgY29uZmlnKTsKICAgICAgICB3ZWJNSS50YWJsZS5zZXRSZWFkeSgibXlUYWJsZU5hbWUiLCAiY29uZmlnIik7CiAgICB9KTsKPC9wcmU+CjxwPlNhdmUgdGhlIGNvZGUgb2YgdGhlIHBhcmVudCBkaXNwbGF5IGFuZCBwYXJhbWV0ZXJpemUgdGhlIHRhYmxlIGFzIHVzdWFsLiBFbnRlciAibXlUYWJsZU5hbWUiIGF0IHRoZSB0YWJsZSBuYW1lLjwvcD4KPGgyPlRhYmxlIGNvbmZpZ3VyYXRpb24gZm9yIGxpdmUgZGF0YTwvaDI+CjxwPkRyYWcgdGhlIHNwcmVhZHNoZWV0IGRpc3BsYXkgaW50byB0aGUgcGFyZW50IGRpc3BsYXkgYW5kIG9wZW4gdGhlIFNjcmlwdCBFZGl0b3IgZm9yIHRoZSBQYXJlbnQgZGlzcGxheS4KICAgIEVudGVyIHRoZSBjb25maWd1cmF0aW9uIGZvciBzaW1wbGUgZGF0YSBxdWVyaWVzLiBUaGVuIGNoYW5nZSB0aGUgbW9kZSBhbmQgbW9kaWZ5IHRoZQogICAgZGF0YSBxdWVyeSBhcyBmb2xsb3dzLgo8L3A+CjxwcmU+CiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgcnVudGltZSBiZWhhdmlvciAqLwogICAgICAgIGNvbmZpZ1sibW9kZSJdID0gImxpdmUiOwoKICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBkYXRhIHF1ZXJ5ICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHNlbGYuc3Vic2NyaWJlSUQgPSB3ZWJNSS5kYXRhLnN1YnNjcmliZSgKICAgICAgICAgICAgICAgICAgICAiWU9VUl9OT0RFX0FERFJFU1MiLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXF1ZXN0UmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0ID0gcmVxdWVzdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgd2ViTUkuYWRkT251bmxvYWQoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB3ZWJNSS5kYXRhLnVuc3Vic2NyaWJlKHNlbGYuc3Vic2NyaWJlSUQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CjwvcHJlPgo8aDI+VGFibGUgY29uZmlndXJhdGlvbiBmb3IgIkNvbnRpbnVhdGlvbiBQb2ludHMiIChjb250aW51ZSAvIHRyaWdnZXIpPC9oMj4KPHA+RHJhZyB0aGUgc3ByZWFkc2hlZXQgZGlzcGxheSBpbnRvIHRoZSBwYXJlbnQgZGlzcGxheSBhbmQgb3BlbiB0aGUgU2NyaXB0IEVkaXRvciBmb3IgdGhlIFBhcmVudCBkaXNwbGF5LgogICAgRW50ZXIgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHNpbXBsZSBkYXRhIHF1ZXJpZXMuIFRoZW4gY2hhbmdlIHRoZSBtb2RlIGFuZCBtb2RpZnkgdGhlCiAgICBkYXRhIHF1ZXJ5IGFzIGZvbGxvd3MuCjwvcD4KPHByZT4KICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBydW50aW1lIGJlaGF2aW9yICovCiAgICAgICAgY29uZmlnWyJtb2RlIl0gPSAiY29udGludWUiOyAvLyA8PDwgZm9yIHRoZSB0cmlnZ2VyIG1vZGUgcmVwbGFjZSAiY29udGludWUiIHdpdGggInRyaWdnZXJlZCIKCiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgZGF0YSBxdWVyeSAqLwoJCWNvbmZpZ1siZGF0YVJlcXVlc3RGdW5jdGlvbiJdID0KCQkJZnVuY3Rpb24gY3VzdG9tRGF0YVJlcXVlc3QoY29udGludWF0aW9uKSB7CgkJCQl2YXIgc2VsZiA9IHRoaXM7CgkJCQlpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCQkJCWZpbHRlciA9IGNvbnRpbnVhdGlvbi5DUC52YWx1ZTsKCQkJCQl3ZWJNSS5kYXRhLnF1ZXJ5TmV4dCgKCQkJCQkJZmlsdGVyLAoJCQkJCQlhZGREYXRhVG9Db250cm9sbGVyCgkJCQkJKTsKCQkJCX0gZWxzZSB7CgkJCQkJZmlsdGVyID0gewoJCQkJCQlhZGRyZXNzOiBbImc6KllPVVJfTk9ERV9BRERSRVNTKiJdLAoJCQkJCQlzZWxlY3Q6IFsidjpwcmlvcml0eSIsICJ2OnZhbHVlIiwgInY6dXNlcm5hbWUiLCAidjphZGRyZXNzIiwgInY6dGltZXN0YW1wIiwgInY6dHlwZSIsICJ2OnN0YXR1cyIsICJ2OlJlcGxhY2VtZW50TmFtZXMiLCAidjpSZXBsYWNlbWVudFZhbHVlcyJdLAoJCQkJCQl0eXBlOiBbInY6MSJdLAoJCQkJCQludW1yb3dzOlsidjoxMDAwIl0KCQkJCQl9OwoJCQkJCXdlYk1JLmRhdGEucXVlcnlGaWx0ZXIoCgkJCQkJCWZpbHRlciwKCQkJCQkJYWRkRGF0YVRvQ29udHJvbGxlcgoJCQkJCSk7CgkJCQl9CgkJCQlmdW5jdGlvbiBhZGREYXRhVG9Db250cm9sbGVyKHJlcXVlc3RSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlcXVlc3RSZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgIC8qIEFkZGluZyAiQ29udGludWF0aW9uIiBpbmZvcm1hdGlvbnMgKi8KCQkJCQlpZiAodHlwZW9mIGRhdGEuTW9yZSAhPSAidW5kZWZpbmVkIiAmJiBkYXRhLk1vcmUgIT0gZmFsc2UgJiYgZGF0YS5jb250aW51YXRpb25wb2ludCA+IDApIHsKCQkJCQkJZGF0YS5DUCA9IHt9OwoJCQkJCQlkYXRhLkNQLnZhbHVlID0gcmVxdWVzdFJlc3VsdC5jb250aW51YXRpb25wb2ludDsKCQkJCQl9IGVsc2UgewoJCQkJCQlkYXRhLk1vcmUgPSBmYWxzZTsKCQkJCQl9CgoJCQkJCXZhciBpZHMgPSBzZWxmLmFkZERhdGEoZGF0YSk7CgkJCQl9CgkJCX07CgogICAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgdGhlIHJlbGVhc2UgKi8KICAgICAgICBjb25maWdbImRhdGFSZWxlYXNlRnVuY3Rpb24iXSA9CiAgICAgICAgICAgIGZ1bmN0aW9uIGRhdGFSZWxlYXNlRnVuY3Rpb24oY29udGludWF0aW9uKSB7CgkgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCSAgICAgICAgICAgIHdlYk1JLmRhdGEucXVlcnlSZWxlYXNlKGNvbnRpbnVhdGlvbi5DUC52YWx1ZSk7CgkgICAgICAgIH0KICAgICAgICB9Cgo8L3ByZT4KCjxoMj5BY2Nlc3MgdG8gdGFibGUgY29udGVudHM8L2gyPgo8cD5UaGUgZWFzaWVzdCB3YXkgdG8gYWNjZXNzIHRhYmxlIGNvbnRlbnRzIGlzIHRvIHVzZSB0aGUgb25DbGlja0NhbGxiYWNrIGNvbmZpZ3VyYXRpb24uCglWaWEgdGhpcyBjYWxsYmFjaywgdGhlIGV2ZW50IGFuZCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGVkIGl0ZW0gY2FuIGJlIGVudGVyZWQgaW4gYSB1c2VyLWRlZmluZWQgb25lCglGdW5jdGlvbiBhcmUgcHJvY2Vzc2VkIChlLmcuLCBjYWxsaW5nIHlvdXIgb3duIGRpYWxvZ3MpPC9wPgo8cHJlPgogICAgLyogTG9hZGluZyB0aGUgdGFibGUgcmVzb3VyY2VzICovCiAgICB3ZWJNSS50YWJsZS5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLyogQ3JlYXRlIHRoZSBjb25maWd1cmF0aW9uICovCiAgICAgICAgLi4uCgogICAgICAgIGNvbmZpZ1sib25DbGlja0NhbGxiYWNrIl0gPSBmdW5jdGlvbihlLCBpbmZvKXsKICAgICAgICAgIHZhciBpdGVtID0gaW5mby5pdGVtOwogICAgICAgICAgdmFyIHJvdyA9IGluZm8ucm93SW5kZXg7CiAgICAgICAgICB2YXIgY29sdW1uID0gaW5mby5jb2x1bW47CgogICAgICAgICAgdmFyIGlkID0gaXRlbS5pZDsKICAgICAgICAgIGl0ZW0udmFsdWUgPSAiY2hhbmdlZCB2YWx1ZSI7CgogICAgICAgICAgLyogdXBkYXRlL2RlbGV0ZS93aW5kb3cgKi8KICAgICAgICAgIGlmKGNvbHVtbi5pZCA9PSAidGltZXN0YW1wIil7CiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci51cGRhdGVEYXRhKGlkLCBpdGVtKTsKICAgICAgICAgIH0gZWxzZSBpZihjb2x1bW4uaWQgPT0gInZhbHVlIil7CiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci5yZW1vdmVEYXRhKGlkKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9wZW5NeVdpbmRvd0Z1bmt0aW9uVG9FZGl0KGl0ZW0pOwogICAgICAgICAgfQogICAgICAgIH0KCgkJLyogUmVnaXN0cmF0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uICovCiAgICAgICAgLi4uCgogICAgfSk7CjwvcHJlPgoKPGgyPlNlYXJjaCBmb3IgdmFsdWVzID8/aW4gdGhlIHRhYmxlPC9oMj4KPHA+VGhlIHNlYXJjaCAoYXR0cmlidXRlLCB2YWx1ZSwgZXhhY3RTZWFyY2gpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHNlYXJjaCBmb3IgdmFsdWVzID8/aW4gdGhlIHRhYmxlLgoJSW4gdGhlIGNhc2Ugb2YgYSBoaXQsIHRoZSBmb3VuZCBpdGVtcyBhcmUgcmV0dXJuZWQgaW4gYW4gYXJyYXkuPC9wPgo8cHJlPgogIHdlYk1JLnRhYmxlLndhaXRSZWFkeSgibXlUYWJsZU5hbWUiLCAiY29udHJvbGxlciIsIGZ1bmN0aW9uICgpIHsKCiAgICB0YWJsZUNvbnRyb2xsZXIgPSB3ZWJNSS50YWJsZS5yZXF1ZXN0KCJteVRhYmxlTmFtZSIsICJjb250cm9sbGVyIik7CiAgICB2YXIgaXRlbUFycmF5ID0gdGFibGVDb250cm9sbGVyLnNlYXJjaCgidGltZXN0YW1wIiwgMTU1Mzc4NTExMDUwMCwgdHJ1ZSk7CgogICAgdmFyIGlkID0gaXRlbUFycmF5WzBdLmlkOwogICAgaXRlbUFycmF5WzBdLnZhbHVlID0gImNoYW5nZWQgdmFsdWUiOwoKICAgIC8qIHVwZGF0ZSAqLwogICAgdGFibGVDb250cm9sbGVyLnVwZGF0ZURhdGEoaWQsIGl0ZW1BcnJheVswXSk7CgogICAgLyogZGVsZXRlICovCiAgICB0YWJsZUNvbnRyb2xsZXIucmVtb3ZlRGF0YShpZCk7CgogIH0pOwo8L3ByZT4KCgoKPGgyPlRpbWVzdGFtcCBjb252ZXJzYXRpb248L2gyPgo8cD5XaXRoIGF0dmlzZSAzLjMuMiB0aGUgdGltZXN0YW1wIG9mICJkYXRldGltZSIgY29sdW1ucyBpcyBubyBsb25nZXIgZGVsaXZlcmVkIGFzIHN0cmluZy4gSXQgaXMgbm93IG5lY2Vzc2FyeSB0byBmb3JtYXQgdGhlIHRpbWVzdGFtcCB0byBhIHN0cmluZyBpbnNpZGUgdGhlIHRhYmxlIHdpdGggdGhlIGdpdmVuIGZvcm1hdHRlci48L3A+CjxwPkV4YW1wbGU6PC9wPgo8cHJlPgoJZnVuY3Rpb24gX21ha2VDb252ZXJzaW9ucyhmb3JtYXQsIHZhbHVlKSB7CglpZiAoZm9ybWF0WzBdID09ICJkYXRldGltZSIpIHsKCQlpZiAodmFsdWUpIHsKCQkJaWYgKHR5cGVvZiB2YWx1ZSA9PSAic3RyaW5nIiAmJiB2YWx1ZS5pbmRleE9mKCItIikgPiAtMSkJCS8vaWdub3JlIGFscmVhZHkgZm9ybWF0dGVkIHZhbHVlcwoJCQkJcmV0dXJuIHZhbHVlOwoKCQkJdmFyIGRhdGUgPSBuZXcgRGF0ZShwYXJzZUludCh2YWx1ZSwgMTApKTsKCQkJdmFsdWUgPSB3ZWJNSS5zcHJpbnRmKCIlZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQuJTAzZCIsIGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXREYXRlKCksIGRhdGUuZ2V0SG91cnMoKSwgZGF0ZS5nZXRNaW51dGVzKCksIGRhdGUuZ2V0U2Vjb25kcygpLCBkYXRlLmdldE1pbGxpc2Vjb25kcygpKTsKCQl9IGVsc2UgewoJCQl2YWx1ZSA9ICIiOwoJCX0KCX0KCXJldHVybiAnPGRpdiBjbGFzcz0ic2xpY2stY2VsbC1pdGVtIj4nK3ZhbHVlKyc8L2Rpdj4nOwoJfQo8L3ByZT4KPGgxPlRhYmxlIGNvbmZpZ3VyYXRpb25zPC9oMT4KPHA+RnVydGhlciBjb25maWd1cmF0aW9uIGhlbHAgY2FuIGJlIGZvdW5kIGluIHRoZSBhdHZpc2UgZG9jdW1lbnRhdGlvbiBhbmQgYXQgYXR2aXNlIExpdmUhPC9wPgo8YnI+CjwvYm9keT4KPC9odG1sPg==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table_dataarrays" BrowseName="1:table_dataarrays" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">table_dataarrays</DisplayName>
		<Description Locale="en">table_dataarrays</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid</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 xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="788.23" height="640">
 <defs/>
 <metadata>
  <atv:parameter behavior="mandatory" name="dataMode" desc="put data by row or column" valuetype="address" defaultvalue="AGENT.OBJECTS.ArrayModeInt"/>
  <atv:parameter behavior="mandatory" name="series0Title" desc="colmun1 title" valuetype="trstring" defaultvalue="T{data 1}"/>
  <atv:parameter behavior="optional" name="series1Title" desc="colmun2 title" valuetype="trstring" defaultvalue="T{data 2}"/>
  <atv:parameter behavior="optional" name="series2Title" desc="colmun3 title" valuetype="trstring" defaultvalue="T{data 3}"/>
  <atv:parameter behavior="optional" name="series3Title" desc="colmun4 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series4Title" desc="colmun5 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series5Title" desc="colmun6 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series6Title" desc="colmun7 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series7Title" desc="colmun8 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series8Title" desc="colmun9 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series9Title" desc="colmun10 title" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" name="dataArrayType" valuetype="address" defaultvalue="AGENT.OBJECTS.dataArrayType"/>
  <atv:parameter behavior="optional" name="tableArray_md_1" valuetype="address" defaultvalue="AGENT.OBJECTS.TableArr_md_1"/>
  <atv:parameter behavior="optional" name="tableArray_md_2" valuetype="address" defaultvalue="AGENT.OBJECTS.TableArr_md_2"/>
  <atv:parameter behavior="optional" name="tableArray_md_3" valuetype="address" defaultvalue="AGENT.OBJECTS.TableArr_md_3"/>
  <atv:gridconfig gridstyle="lines" width="20" height="20" enabled="false"/>
  <atv:snapconfig width="10" height="10" enabled="false"/>
 </metadata>
 <svg xlink:href="SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table" y="2.613" atv:refpx="397.26" transform="matrix(1.2218,0,0,1,0,0)" id="id_0" width="640" height="640" atv:refpy="322.613" x="5.149">
  <atv:argument name="tableID" value="myAtviseDataTable"/>
  <atv:argument name="globalColorConfig" value="SYSTEM.GLOBALS.atvObjectDisplays.Tables.ColorConfig1"/>
 </svg>
 <script type="text/ecmascript"><![CDATA[var dataMode;

// inital loading of available Nodes
var vars = [
	webMI.query.series0Title,
	webMI.query.series1Title,
	webMI.query.series2Title,
	webMI.query.series3Title,
	webMI.query.series4Title,
	webMI.query.series5Title,
	webMI.query.series6Title,
	webMI.query.series7Title,
	webMI.query.series8Title,
	webMI.query.series9Title
];
vars = vars.filter(item => item !== undefined);
var arrType = webMI.query.dataArrayType;
var arrSrc_md = [
	webMI.query.tableArray_md_1,
	webMI.query.tableArray_md_2,
	webMI.query.tableArray_md_3
];
// #####

webMI.table.loadResources(function() {
var config = [];

// ### BEGIN CONFIGURATION SECTION ###
// configuration of table rows and their options
var columns = [];
columns['id'] = {id: "id", name: "T{Index}", field: "id", sortable: true, filter: true, visible: true, resizable: false};
columns['data1'] = {id: "data1", name: "T{"+webMI.query.series0Title+"}", field: "data1", width:280, sortable: true, filter: true, visible: true, resizable: false};
columns['data2'] = {id: "data2", name: "T{"+webMI.query.series1Title+"}", field: "data2", sortable: true, filter: true, visible: true, resizable: true, sortByDefault:true, sortByDefaultAsc: true};
columns['data3'] = {id: "data3", name: "T{"+webMI.query.series2Title+"}", field: "data3", sortable: true, filter: true, visible: true, resizable: true};
columns['data4'] = {id: "data4", name: "T{"+webMI.query.series3Title+"}", field: "data4", sortable: true, filter: true, visible: true, resizable: true};
columns['data5'] = {id: "data5", name: "T{"+webMI.query.series4Title+"}", field: "data5", sortable: true, filter: true, visible: true, resizable: true};
columns['data6'] = {id: "data6", name: "T{"+webMI.query.series5Title+"}", field: "data6", sortable: true, filter: true, visible: true, resizable: true};
columns['data7'] = {id: "data7", name: "T{"+webMI.query.series6Title+"}", field: "data7", sortable: true, filter: true, visible: true, resizable: true};
columns['data8'] = {id: "data8", name: "T{"+webMI.query.series7Title+"}", field: "data8", sortable: true, filter: true, visible: true, resizable: true};
columns['data9'] = {id: "data9", name: "T{"+webMI.query.series8Title+"}", field: "data9", sortable: true, filter: true, visible: true, resizable: true};
columns['data10'] = {id: "data10", name: "T{"+webMI.query.series9Title+"}", field: "data10", sortable: true, filter: true, visible: true, resizable: true};

// config["columns"] is used for building the defined columns in the table
config["columns"] = [
	columns['id'],
	columns['data1']
];
// #####

var maxseries = vars.length; // Number of available Series Titles / Columns
// creating columns depending on available Titles configs
// pushes the data to config variable of the table (config["columns"])
for(var i=1;i<=maxseries;i++) {
	if(vars[i]!=undefined) { config["columns"].push(columns['data'+(i+1)]); }
}
// #####

config["mode"] = "live"; // live mode for making array data updates possible
config["bufferInterval"] = 50;

// Configuration of the data query for the table
config["dataRequestFunction"] = function customDataRequest(continuation) {
	var that = this;
	var data = {
		result: []
	};	
	var elem = {};
	var arr = [];
	var dataArrType = 1;
	
	// getting subcription for checking if DataMode has changed
	// DataMode switches the state to get the data handled for Rows OR Columns
	that.subscribeDataMode = webMI.data.subscribe(
		webMI.query.dataMode,
		function(e) {
			that.clearData();
			handleDataUpdate();
		}
	);
	
	// getting subscription Status of available predefined Nodes
	// ArrType = switch for used data source Array type (f.e. 1 dimensional or various 2 dimensional arrays, Json Objects)
	// f.e. parameter tableArray_md_1
	that.subscribeArrType = webMI.data.subscribe(arrType,function(requestResult) {
		if(requestResult.value) {
			dataArrType = requestResult.value;
			handleDataUpdate();
		}
	});
	// #####
	
	// getting subscription Status of available predefined Nodes for diff. array types
	// data source Arrays for different Multidimensional Array types
	// f.e. parameter tableArray_md_1,tableArray_md_2,tableArray_md_3,...
	that.subscribeNodes_arrayStructs = webMI.data.subscribe(arrSrc_md,function(requestResult) {					
		if(requestResult.value) {
			handleDataUpdate();
		}
	});
	// #####
	
	// unloads the subsrcibed nodes to update them immediately 
	// by value changes from the source
	webMI.addOnunload(
		function() {
			webMI.data.unsubscribe(that.subscribeDataMode);
			webMI.data.unsubscribe(that.subscribeNodes_arrayStructs);
			webMI.data.unsubscribe(that.subscribeArrType);
		}
	);
	// #####
	
	
	// update handler function for updating the table and set the data of the table to latest state, 
	// depending which Array / Data Mode is used (Column or Row)
	function handleDataUpdate() {
		webMI.data.read(
			webMI.query.dataMode,
				function(e) {
					if(dataArrType==1) { setData_ArrStruct1(elem,data,that,e.value); }
					else if(dataArrType==2) { setData_ArrStruct2(elem,data,that,e.value); }
					else if(dataArrType==3) { setData_ArrStruct3(elem,data,that,e.value); }
					else { setData_ArrStruct1(elem,data,that,e.value); }
				}
			);
	}	
	// #####
	
};


function setData_ArrStruct1(elem,data,that,mode) {
	// Data example: {['aaa'; 'bbb'; 'ccc'; 'ddd'], ['aaaa1'; 'bbb1'; 'ccc1'; 'dddd1'], ['aaaa2'; 'bbb2'; 'ccc2'; 'dddd2']}

	webMI.data.read(
		arrSrc_md[0],
		function(e) {
			that.clearData();
			
			var arrTmp = e.value;
			var arr = [];
			
			arrTmp = arrTmp.toString();
			arrTmp = arrTmp.replace(/\[/g, "").replace(/\]/g, "").replace(/\'/g, "");
			arrTmp = arrTmp.split(",");
					
			for(var n = 0; n < arrTmp.length; n++) {
				arr[n] = arrTmp[n].split(';'); // split on separation symbols
			}
			
			if(mode==1) {
				// adding Data from 2 DIMENSION Array with Column Values, Array = Column
				for(var i = 0; i < arr[0].length; i++) {
					var x=0;
					while(x < arr.length) {
						x++;
						if(arr[x-1][i]!=undefined) { elem["data"+x] = arr[x-1][i]; }
					}
					
					if(arr[0][i]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			} else {
				// adding Data from 2 DIMENSION Array with Row Values, Array = Row
				for(var i = 0; i < arr.length; i++) {
					var x=0;
					while(x < vars.length) {
						x++;
						if(arr[i][x-1]!=undefined) { elem["data"+x] = arr[i][x-1]; }
					}
					
					if(arr[i][0]!=undefined) {
						data.result = elem;
						that.addData(data);
					}						
				}			
			}
		}
	);
	
};

function setData_ArrStruct2(elem,data,that,mode) {
	// Data example: {"data1":["aaa", "bbb", "ccc"], "data2":["aaa2", "bbb2", "ccc2"], "data3":["aaa3", "bbb3", "ccc3"]}
	
	webMI.data.read(
		arrSrc_md[1],
		function(e) {
			that.clearData();
			
			var arrTmp = e.value;
			arrTmp = "{"+arrTmp.toString()+"}";
			arrTmp = JSON.parse(arrTmp);
			var ObjCnt = Object.keys(arrTmp).length;
			var arr = [];
			
			for(var n = 0;n <= ObjCnt-1; n++) {
				arr[n] = arrTmp['data'+(n+1)];
			}
			
			if(mode==1) {
				// adding Data from 2 DIMENSION JSON Object Array Column Values, Array = Column
				for(var i = 0; i < arr.length; i++) {
					var x=0;
					while(x < arr.length) {
						x++;
						if(arr[x-1][i]!=undefined) { elem["data"+x] = arr[x-1][i]; }
					}
					
					if(arr[0][i]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			}
			else {
				// adding Data from 2 DIMENSION Array with Row Values, Array = Row
				for(var i = 0; i < arr.length; i++) {
					var x=0;
					while(x < vars.length) {
						x++;
						if(arr[i][x-1]!=undefined) { elem["data"+x] = arr[i][x-1]; }
					}
					
					if(arr[i][0]!=undefined) {
						data.result = elem;
						that.addData(data);
					}						
				}
			}
		}
	);
	
};


// adding Data from 2 DIMENSION JSON Object Array with Row Values, Array = Row
function setData_ArrStruct3(elem,data,that,mode) {
	// Data example: {"datas": [["aaa", "bbb", "ccc"], ["aaa2", "bbb2", "ccc2"], ["aaaa3", "bbb3", "ccc3"]]}

	webMI.data.read(
		arrSrc_md[2],
		function(e) {
			that.clearData();
			
			var arrTmp = e.value;
			arrTmp = "{"+arrTmp.toString()+"}";					
			arrTmp = JSON.parse(arrTmp);
			arrTmp = arrTmp.datas;				

			if(mode==1) {
				// adding Data from 2 DIMENSION JSON Object Array Column Values, Array = Column
				for(var i = 0; i < arrTmp[0].length; i++) {
					var x=0;
					while(x < arrTmp.length) {
						x++;
						if(arrTmp[x-1][i]!=undefined) { elem["data"+x] = arrTmp[x-1][i]; }
					}
					
					if(arrTmp[0][i]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			} else {
				// adding Data from 2 DIMENSION Array with Row Values, Array = Row
				for(var i = 0; i < arrTmp.length; i++) {
					var x=0;
					while(x < vars.length) {
						x++;
						if(arrTmp[i][x-1]!=undefined) { elem["data"+x] = arrTmp[i][x-1]; }
					}
					
					if(arrTmp[i][0]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			}
		}
	);
	
};

// ### END CONFIGURATION SECTION ###
webMI.table.register("myAtviseDataTable", "config", config);
webMI.table.setReady("myAtviseDataTable", "config");
});]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table_dataseries" BrowseName="1:table_dataseries" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">table_dataseries</DisplayName>
		<Description Locale="en">table_dataseries</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid</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 xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="788.23" height="640">
 <defs/>
 <metadata>
  <atv:parameter behavior="mandatory" name="dataMode" desc="put data by row or column" valuetype="address" defaultvalue="AGENT.OBJECTS.ArrayModeInt"/>
  <atv:parameter behavior="mandatory" group="Series 1" name="series0Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 1" name="series0Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" group="Series 2" name="series1Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 2" name="series1Title" desc="title" valuetype="color" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 3" name="series2Node" desc="node" valuetype="display" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 3" name="series2Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 4" name="series3Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 4" name="series3Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 5" name="series4Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 5" name="series4Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 6" name="series5Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 6" name="series5Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 7" name="series6Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 7" name="series6Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 8" name="series7Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 8" name="series7Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 9" name="series8Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 9" name="series8Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 10" name="series9Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 10" name="series9Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series - Multidimension DataArray" name="dataArrayType" valuetype="address" defaultvalue="AGENT.OBJECTS.dataArrayType"/>
  <atv:gridconfig gridstyle="lines" width="20" height="20" enabled="false"/>
  <atv:snapconfig width="10" height="10" enabled="false"/>
 </metadata>
 <svg xlink:href="SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table" y="2.613" atv:refpx="397.26" transform="matrix(1.2218,0,0,1,0,0)" id="id_0" width="640" height="640" atv:refpy="322.613" x="5.149">
  <atv:argument name="tableID" value="myAtviseDataTable"/>
  <atv:argument name="globalColorConfig" value="SYSTEM.GLOBALS.atvObjectDisplays.Tables.ColorConfig1"/>
 </svg>
 <script type="text/ecmascript"><![CDATA[var dataMode;

// inital loading of available Nodes
var vars = [
	webMI.query.series0Node,
	webMI.query.series1Node,
	webMI.query.series2Node,
	webMI.query.series3Node,
	webMI.query.series4Node,
	webMI.query.series5Node,
	webMI.query.series6Node,
	webMI.query.series7Node,
	webMI.query.series8Node,
	webMI.query.series9Node
];
vars = vars.filter(item => item !== "");
var arrType = webMI.query.dataArrayType;
// #####

webMI.table.loadResources(function() {
var config = [];

// ### BEGIN CONFIGURATION SECTION ###
// configuration of table rows and their options
var columns = [];
columns['id'] = {id: "id", name: "T{Index}", field: "id", sortable: true, filter: true, visible: true, resizable: false};
columns['data1'] = {id: "data1", name: "T{"+webMI.query.series0Title+"}", field: "data1", sortable: true, filter: true, width:300, visible: true, resizable: false};
columns['data2'] = {id: "data2", name: "T{"+webMI.query.series1Title+"}", field: "data2", sortable: true, filter: true, visible: true, resizable: true, sortByDefault:true, sortByDefaultAsc: true};
columns['data3'] = {id: "data3", name: "T{"+webMI.query.series2Title+"}", field: "data3", sortable: true, filter: true, visible: true, resizable: true};
columns['data4'] = {id: "data4", name: "T{"+webMI.query.series3Title+"}", field: "data4", sortable: true, filter: true, visible: true, resizable: true};
columns['data5'] = {id: "data5", name: "T{"+webMI.query.series4Title+"}", field: "data5", sortable: true, filter: true, visible: true, resizable: true};
columns['data6'] = {id: "data6", name: "T{"+webMI.query.series5Title+"}", field: "data6", sortable: true, filter: true, visible: true, resizable: true};
columns['data7'] = {id: "data7", name: "T{"+webMI.query.series6Title+"}", field: "data7", sortable: true, filter: true, visible: true, resizable: true};
columns['data8'] = {id: "data8", name: "T{"+webMI.query.series7Title+"}", field: "data8", sortable: true, filter: true, visible: true, resizable: true};
columns['data9'] = {id: "data9", name: "T{"+webMI.query.series8Title+"}", field: "data9", sortable: true, filter: true, visible: true, resizable: true};
columns['data10'] = {id: "data10", name: "T{"+webMI.query.series9Title+"}", field: "data10", sortable: true, filter: true, visible: true, resizable: true};

// config["columns"] is used for building the defined columns in the table
config["columns"] = [
	columns['id'],
	columns['data1']
];
// #####

var maxseries = vars.length; // Number of available Series Nodes
// creating columns depending on available Series configs, which include valid Node adresses
// pushes the data to config variable of the table (config["columns"])
for(var i=1;i<maxseries;i++) {
	if(vars[i]!="") { config["columns"].push(columns['data'+(i+1)]); }
}
// #####

config["mode"] = "live"; // live mode for making array data updates possible
config["bufferInterval"] = 50;

// Configuration of the data query for the table
config["dataRequestFunction"] = function customDataRequest(continuation) {
	var that = this;
	var data = {
		result: []
	};
	var row = {};
	var colmn = {};
	var arr = [];
	var dataArrType = 1;
	
	// getting subcription for checking if DataMode has changed
	// DataMode switches the state to get the data handled for Rows OR Columns
	that.subscribeDataMode = webMI.data.subscribe(
		webMI.query.dataMode,
		function(e) {
			that.clearData();
			handleDataUpdate();
		}
	);
	
	// getting subscription Status of available predefined Nodes
	// data source Array of every available Parameter 'Series 0-10', Node Adress
	// 1 Data Soruce Array per Row or Column
	that.subscribeNodes = webMI.data.subscribe(vars,function(requestResult) {					
		if(requestResult.value) {
			handleDataUpdate();
		}
	});
	// #####
	
	// unloads the subsrcibed nodes to update them immediately 
	// by value changes from the source
	webMI.addOnunload(
		function() {
			webMI.data.unsubscribe(that.subscribeDataMode);
			webMI.data.unsubscribe(that.subscribeNodes);
		}
	);
	// #####
	
	
	// update handler function for updating the table and set the data of the table to latest state, 
	// depending which Array / Data Mode is used (Column or Row)
	function handleDataUpdate() {
		webMI.data.read(
			webMI.query.dataMode,
				function(e) {
					
					if(e.value==0) {
						setRow(row,data,that);
					}
					else if(e.value==1) {
						setColmn(colmn,data,that);
					}
					else {
						setRow(row,data,that);
					}	
					
				}
			);
	}	
	// #####
	
};

// adding Data from Array with Row Values, Array = Row
function setRow(row,data,that) {
	// Data example: {'value1-1', 'value1-2', 'value1-3', 'value1-4'}

	webMI.data.read(
		vars,
		function(e) {
			that.clearData();
		
			for (var i = 0; i < e.length; i++) {			
				var n=0;
				while(n < vars.length) {
					n++;
					if(vars[n-1]!="") { row["data"+n] = e[i].value[n-1]; }
				}
				
				data.result = row;
				that.addData(data);
			}

		}
	);
};


// adding Data from Array with Column Values, Array = Column
function setColmn(colmn,data,that) {
	// Data example: {'value1-1', 'value1-2', 'value1-3', 'value1-4'}

	webMI.data.read(
		vars,
		function(e) {
			that.clearData();		

			for (var i = 0; i <= e.length; i++) {
				var n=0;
				while(n < vars.length) {
					n++;
					if(vars[n-1]!="") { colmn["data"+n] = e[n-1].value[i]; }
				}
				
				if(e[0].value[i]!=undefined) {
					data.result = colmn;
					that.addData(data);
				}
			}

		}
	);
};
// ########################


// ### END CONFIGURATION SECTION ###
webMI.table.register("myAtviseDataTable", "config", config);
webMI.table.setReady("myAtviseDataTable", "config");
});]]]]><![CDATA[></script>
</svg>
]]></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.OBJECTS.ArrayModeInt" ExportedBrowseName="1:ArrayModeInt" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.OBJECTS" BrowseName="1:OBJECTS">
		<DisplayName Locale="en">OBJECTS</DisplayName>
		<Description Locale="en">OBJECTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.ArrayModeInt" BrowseName="1:ArrayModeInt" DataType="Int16" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">ArrayModeInt</DisplayName>
		<Description Locale="en">ArrayModeInt</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
		</References>
		<Value>
			<uax:Int16>0</uax:Int16>
		</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.OBJECTS.dataArrayType" ExportedBrowseName="1:dataArrayType" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.OBJECTS" BrowseName="1:OBJECTS">
		<DisplayName Locale="en">OBJECTS</DisplayName>
		<Description Locale="en">OBJECTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.dataArrayType" BrowseName="1:dataArrayType" DataType="Int32" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">dataArrayType</DisplayName>
		<Description Locale="en">dataArrayType</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
		</References>
		<Value>
			<uax:Int32>1</uax:Int32>
		</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.OBJECTS.TableArr_md_1" ExportedBrowseName="1:TableArr_md_1" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.OBJECTS" BrowseName="1:OBJECTS">
		<DisplayName Locale="en">OBJECTS</DisplayName>
		<Description Locale="en">OBJECTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.TableArr_md_1" BrowseName="1:TableArr_md_1" DataType="String" ValueRank="1" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">TableArr_md_1</DisplayName>
		<Description Locale="en">TableArr_md_1</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
		</References>
		<Value>
			<uax:ListOfString>
				<uax:String>[&apos;aaa&apos;; &apos;bbb&apos;; &apos;ccc&apos;; &apos;ddd&apos;]</uax:String>
				<uax:String>[&apos;aaa1&apos;; &apos;bbb1&apos;; &apos;ccc1&apos;; &apos;ddd1&apos;]</uax:String>
				<uax:String>[&apos;aaa2&apos;; &apos;bbb2&apos;; &apos;ccc2&apos;; &apos;ddd2&apos;]</uax:String>
			</uax:ListOfString>
		</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.OBJECTS.TableArr_md_2" ExportedBrowseName="1:TableArr_md_2" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.OBJECTS" BrowseName="1:OBJECTS">
		<DisplayName Locale="en">OBJECTS</DisplayName>
		<Description Locale="en">OBJECTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.TableArr_md_2" BrowseName="1:TableArr_md_2" DataType="String" ValueRank="1" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">TableArr_md_2</DisplayName>
		<Description Locale="en">TableArr_md_2</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
		</References>
		<Value>
			<uax:ListOfString>
				<uax:String>&quot;data1&quot;:[&quot;aaa&quot;</uax:String>
				<uax:String>&quot;bbb&quot;</uax:String>
				<uax:String>&quot;ccc&quot;]</uax:String>
				<uax:String>&quot;data2&quot;:[&quot;aaa2&quot;</uax:String>
				<uax:String>&quot;bbb2&quot;</uax:String>
				<uax:String>&quot;ccc2&quot;]</uax:String>
				<uax:String>&quot;data3&quot;:[&quot;aaa3&quot;</uax:String>
				<uax:String>&quot;bbb3&quot;</uax:String>
				<uax:String>&quot;ccc3&quot;]</uax:String>
				<uax:String>&quot;data4&quot;:[&quot;aaa4&quot;</uax:String>
				<uax:String>&quot;bbb4&quot;</uax:String>
				<uax:String>&quot;ccc4&quot;]</uax:String>
			</uax:ListOfString>
		</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.OBJECTS.TableArr_md_3" ExportedBrowseName="1:TableArr_md_3" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.OBJECTS" BrowseName="1:OBJECTS">
		<DisplayName Locale="en">OBJECTS</DisplayName>
		<Description Locale="en">OBJECTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.TableArr_md_3" BrowseName="1:TableArr_md_3" DataType="String" ValueRank="1" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">TableArr_md_3</DisplayName>
		<Description Locale="en">TableArr_md_3</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
		</References>
		<Value>
			<uax:ListOfString>
				<uax:String>&quot;datas&quot;: [[&quot;aaa&quot;</uax:String>
				<uax:String>&quot;bbb&quot;</uax:String>
				<uax:String>&quot;ccc&quot;]</uax:String>
				<uax:String>[&quot;aaa2&quot;</uax:String>
				<uax:String>&quot;bbb2&quot;</uax:String>
				<uax:String>&quot;ccc2&quot;]</uax:String>
				<uax:String>[&quot;aaa3&quot;</uax:String>
				<uax:String>&quot;bbb3&quot;</uax:String>
				<uax:String>&quot;ccc3&quot;]]</uax:String>
			</uax:ListOfString>
		</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.OBJECTS.TableArrColmn1" ExportedBrowseName="1:TableArrColmn1" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.OBJECTS" BrowseName="1:OBJECTS">
		<DisplayName Locale="en">OBJECTS</DisplayName>
		<Description Locale="en">OBJECTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.TableArrColmn1" BrowseName="1:TableArrColmn1" DataType="String" ValueRank="1" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">TableArrColmn1</DisplayName>
		<Description Locale="en">TableArrColmn1</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
		</References>
		<Value>
			<uax:ListOfString>
				<uax:String>&apos;value1-1&apos;</uax:String>
				<uax:String>&apos;value1-2&apos;</uax:String>
				<uax:String>&apos;value1-3&apos;</uax:String>
				<uax:String>&apos;value1-4&apos;</uax:String>
				<uax:String>&apos;value1-5&apos;</uax:String>
				<uax:String>&apos;value1-6&apos;</uax:String>
			</uax:ListOfString>
		</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.OBJECTS.TableArrColmn2" ExportedBrowseName="1:TableArrColmn2" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.OBJECTS" BrowseName="1:OBJECTS">
		<DisplayName Locale="en">OBJECTS</DisplayName>
		<Description Locale="en">OBJECTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.TableArrColmn2" BrowseName="1:TableArrColmn2" DataType="String" ValueRank="1" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">TableArrColmn2</DisplayName>
		<Description Locale="en">TableArrColmn2</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
		</References>
		<Value>
			<uax:ListOfString>
				<uax:String>&apos;value2-1&apos;</uax:String>
				<uax:String>&apos;value2-2&apos;</uax:String>
				<uax:String>&apos;value2-3&apos;</uax:String>
				<uax:String>&apos;value2-4&apos;</uax:String>
				<uax:String>&apos;value2-5&apos;</uax:String>
				<uax:String>&apos;value2-6&apos;</uax:String>
			</uax:ListOfString>
		</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.OBJECTS.TableArrColmn3" ExportedBrowseName="1:TableArrColmn3" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.OBJECTS" BrowseName="1:OBJECTS">
		<DisplayName Locale="en">OBJECTS</DisplayName>
		<Description Locale="en">OBJECTS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.OBJECTS.TableArrColmn3" BrowseName="1:TableArrColmn3" DataType="String" ValueRank="1" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">TableArrColmn3</DisplayName>
		<Description Locale="en">TableArrColmn3</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.OBJECTS</Reference>
			<Reference ReferenceType="HasTypeDefinition">BaseVariableType</Reference>
		</References>
		<Value>
			<uax:ListOfString>
				<uax:String>&apos;value3-1&apos;</uax:String>
				<uax:String>&apos;value3-2&apos;</uax:String>
				<uax:String>&apos;value3-3&apos;</uax:String>
				<uax:String>&apos;value3-4&apos;</uax:String>
				<uax:String>&apos;value3-5&apos;</uax:String>
				<uax:String>&apos;value3-6&apos;</uax:String>
			</uax:ListOfString>
		</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.Advanced.slickgrid.table" ExportedBrowseName="1:table" 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.Advanced" BrowseName="1:Advanced">
		<DisplayName Locale="en">Advanced</DisplayName>
		<Description Locale="en">Advanced</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.Advanced.slickgrid" BrowseName="1:slickgrid">
		<DisplayName Locale="en">slickgrid</DisplayName>
		<Description Locale="en">slickgrid</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table" BrowseName="1:table" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">table</DisplayName>
		<Description Locale="en">table</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid</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 xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="640" height="640">
 <defs/>
 <desc>HTML based table with footer</desc>
 <title>Table</title>
 <metadata>
  <!-- ... mandatorys ... -->
  <!-- ... font ... -->
  <!-- ... options ... -->
  <!-- menu -->
  <!-- footer -->
  <!-- ... ende options ... -->
  <atv:parameter behavior="mandatory" name="tableID" desc="table ID" valuetype="string" defaultvalue="atvise_table_1"/>
  <atv:parameter behavior="optional" group="" name="header_height" desc="table header height" valuetype="number" defaultvalue="30"/>
  <atv:parameter behavior="optional" group="" name="header_text_size" desc="table header font size" valuetype="number" defaultvalue="14"/>
  <atv:parameter behavior="optional" group="" name="header_text_horizontal" desc="table header cell align horizontal" valuetype="enum" config="center; inherit" defaultvalue="inherit"/>
  <atv:parameter behavior="optional" group="" name="header_text_vertical" desc="table header cell align vertical" valuetype="enum" config="center; inherit" defaultvalue="center"/>
  <atv:parameter behavior="optional" group="" name="row_height" desc="table row height" valuetype="number" defaultvalue="20"/>
  <atv:parameter behavior="optional" group="" name="row_text_size" desc="table row font size" valuetype="number" defaultvalue="12"/>
  <atv:parameter behavior="optional" group="" name="detail_text_size" desc="table detail font size" valuetype="number" defaultvalue="12"/>
  <atv:parameter behavior="mandatory" group="" name="footer_text_size" desc="table footer font size" valuetype="number" defaultvalue="12"/>
  <atv:parameter behavior="optional" group="Appearance" name="font_family" desc="font family" valuetype="enum" config="Arial;Courier;Tahoma;Verdana" defaultvalue="Arial"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalBorderColor" desc="global border colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvBorderColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalFillColor" desc="global fill colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvFillColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalFontColor" desc="global font colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvFontColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalSymbolColor" desc="global symbol colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvSymbolColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalInactiveColor" desc="global inactive colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvInactiveColor"/>
  <atv:parameter behavior="optional" group="Appearance" name="globalColorConfig" desc="global table colors" valuetype="global" defaultvalue="SYSTEM.GLOBALS.atvObjectDisplays.Tables.ColorConfig"/>
  <atv:parameter behavior="optional" group="Appearance" name="theme_class" desc="custom theme" valuetype="string" defaultvalue="atviseTheme"/>
  <atv:parameter behavior="optional" group="Options" name="columnReorder" desc="columns reorderable" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="paging" desc="paging" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="filterBar" desc="filter bar enabled" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="filterRegExp" desc="filter regular expressions" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="filterStar" desc="filter use placeholder" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="filterCaseSensitive" desc="filter case sensitive" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="filterLength" desc="filter minimum length" valuetype="number" defaultvalue="1"/>
  <atv:parameter behavior="optional" group="Options" name="filterDelay" desc="filter delay [ms]" valuetype="number" defaultvalue="1000"/>
  <atv:parameter behavior="optional" group="Options" name="showMode" desc="show runtime mode" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="multiselect" desc="multiselect" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Options" name="multicellselect" desc="multiselect on cell click" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="linebreak" desc="cell linebreak" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Options" name="allowDirectInput" desc="allow direct input" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenu" desc="show menu" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuWidth" desc="menu width" valuetype="number" defaultvalue="250"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuHeight" desc="menu height" valuetype="number" defaultvalue="300"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuPicker" desc="show picker menu" valuetype="bool" defaultvalue="true"/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuFilter" desc="show filter menu" valuetype="bool" defaultvalue="true" substitute=""/>
  <atv:parameter behavior="optional" group="Menu options" name="showMenuExport" desc="show export menu" valuetype="bool" defaultvalue="false"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_first_page" desc="symbol first page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-fast-backward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_previous_page" desc="symbol previous page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-step-backward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_pause_page" desc="symbol pause" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-pause&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_stop_page" desc="symbol stop page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-stop&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_next_page" desc="symbol next page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-step-forward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_last_page" desc="symbol last page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-fast-forward&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_load_page" desc="symbol load page" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-download&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_search_page" desc="symbol search" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-search&quot;/>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_truncate_icon" desc="symbol truncate" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-ban&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_triggered_icon" desc="symbol triggered" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-angle-double-down&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_continue_icon" desc="symbol continue" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-cog fa-spin&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_live_icon" desc="symbol live" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-sync fa-spin&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_done_icon" desc="symbol done" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-check&quot;>&lt;/i>"/>
  <atv:parameter behavior="optional" group="Footer options" name="fas_manually_icon" desc="symbol manually" valuetype="string" defaultvalue="&lt;i class=&quot;fas fa-download&quot;>&lt;/i>"/>
  <atv:gridconfig gridstyle="lines" width="20" height="20" enabled="false"/>
  <atv:snapconfig width="10" height="10" enabled="false"/>
 </metadata>
 <svg xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.slickgrid.table_panel" transform="matrix(1,0,0,1.0586,0,0)" y="1.584" atv:refpx="320.831" id="id_1" width="640" height="580" x="0.839" atv:refpy="308.705">
  <atv:argument name="tableID" prefix="tableID"/>
  <atv:argument name="header_height" prefix="header_height"/>
  <atv:argument name="header_text_size" prefix="header_text_size"/>
  <atv:argument name="row_height" prefix="row_height"/>
  <atv:argument name="row_text_size" prefix="row_text_size"/>
  <atv:argument name="header_text_horizontal" prefix="header_text_horizontal"/>
  <atv:argument name="header_text_vertical" prefix="header_text_vertical"/>
  <atv:argument name="detail_text_size" prefix="detail_text_size"/>
  <atv:argument name="footer_text_size" prefix="footer_text_size"/>
  <atv:argument name="font_family" prefix="font_family"/>
  <atv:argument name="globalBorderColor" prefix="globalBorderColor"/>
  <atv:argument name="theme_class" prefix="theme_class"/>
  <atv:argument name="globalFillColor" prefix="globalFillColor"/>
  <atv:argument name="globalFontColor" prefix="globalFontColor"/>
  <atv:argument name="globalSymbolColor" prefix="globalSymbolColor"/>
  <atv:argument name="globalSymbolColor" prefix="globalInactiveColor"/>
  <atv:argument name="globalColorConfig" prefix="globalColorConfig"/>
  <atv:argument name="columnReorder" prefix="columnReorder"/>
  <atv:argument name="paging" prefix="paging"/>
  <atv:argument name="filterBar" prefix="filterBar"/>
  <atv:argument name="filterRegExp" prefix="filterRegExp"/>
  <atv:argument name="filterStar" prefix="filterStar"/>
  <atv:argument name="filterCaseSensitive" prefix="filterCaseSensitive"/>
  <atv:argument name="filterLength" prefix="filterLength"/>
  <atv:argument name="filterDelay" prefix="filterDelay"/>
  <atv:argument name="linebreak" prefix="linebreak"/>
  <atv:argument name="multiselect" prefix="multiselect"/>
  <atv:argument name="multicellselect" prefix="multicellselect"/>
  <atv:argument name="showMenu" prefix="showMenu"/>
  <atv:argument name="showMenuWidth" prefix="showMenuWidth"/>
  <atv:argument name="showMenuHeight" prefix="showMenuHeight"/>
  <atv:argument name="showMenuPicker" prefix="showMenuPicker"/>
  <atv:argument name="showMenuFilter" prefix="showMenuFilter"/>
  <atv:argument name="showMenuExport" prefix="showMenuExport"/>
  <atv:argument name="allowDirectInput" prefix="allowDirectInput"/>
  <atv:overwrite transform="matrix(1,0,0,0.9446,0,0)" id="id_1" height="613.988"/>
 </svg>
 <svg xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.slickgrid.table_footer" y="615" atv:refpx="320" id="id_2" width="640" height="25" x="0" atv:refpy="627.5">
  <atv:argument name="tableID" prefix="tableID"/>
  <atv:argument name="fas_first_page" prefix="fas_first_page"/>
  <atv:argument name="fas_previous_page" prefix="fas_previous_page"/>
  <atv:argument name="fas_pause_page" prefix="fas_pause_page"/>
  <atv:argument name="fas_stop_page" prefix="fas_stop_page"/>
  <atv:argument name="fas_next_page" prefix="fas_next_page"/>
  <atv:argument name="fas_last_page" prefix="fas_last_page"/>
  <atv:argument name="fas_load_page" prefix="fas_load_page"/>
  <atv:argument name="fas_search_page" prefix="fas_search_page"/>
  <atv:argument name="fas_truncate_icon" prefix="fas_truncate_icon"/>
  <atv:argument name="fas_triggered_icon" prefix="fas_triggered_icon"/>
  <atv:argument name="fas_continue_icon" prefix="fas_continue_icon"/>
  <atv:argument name="fas_live_icon" prefix="fas_live_icon"/>
  <atv:argument name="fas_done_icon" prefix="fas_done_icon"/>
  <atv:argument name="fas_manually_icon" prefix="fas_manually_icon"/>
 </svg>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table.de" BrowseName="1:de" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">de</DisplayName>
		<Description Locale="en">de</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.HtmlHelp</Reference>
		</References>
		<Value>
			<uax:ByteString>PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSI+CiAgICA8dGl0bGU+T0RfaGVscDwvdGl0bGU+CiAgICA8c3R5bGU+ICNwYXJhbWV0ZXIgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgfSA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8aDE+QmVzY2hyZWlidW5nPC9oMT4KPHA+RGllc2VzIERpc3BsYXkgZWlnbmV0IHNpY2ggZiZ1dW1sO3IgZGllIERhcnN0ZWxsdW5nIHZvbiBEYXRlbiBpbiB0YWJlbGxhcmlzY2hlciBGb3JtLiBEYXp1IGlzdCBuZWJlbiBkZXIgRWluc3RlbGx1bmcgZGVyCiAgICBUYWJlbGxlbnBhcmFtZXRlciBlYmVuc28gZGllIEtvbmZpZ3VyYXRpb24gaW0gJnV1bWw7YmVyZ2VvcmRuZXRlbiBEaXNwbGF5IGVyZm9yZGVybGljaC4gRGFzICZ1dW1sO2Jlcmdlb3JkbmV0ZSBEaXNwbGF5c2Ugd2lyZAogICAgaW0gZm9sZ2VuZGVuIGF1Y2ggYWxzIFBhcmVudGRpc3BsYXkgYmV6ZWljaG5ldC48L3A+Cgo8aDI+QW5mb3JkZXJ1bmdlbjwvaDI+CjxwPkRpZSBUYWJlbGxlbmJpYmxpb3RoZWsgZXJmb3JkZXJ0IGpRdWVyeSA+IDEuNyB1bmQgd2lyZCBha3R1ZWxsIG1pdCBqUXVlcnkgPiAzLjMueCBhdXNnZWxpZWZlcnQuPC9wPgo8cD5VbSBLb21wYXRpYmlsaXQmYXVtbDt0c3Byb2JsZW1lIHp1IHZlcm1laWRlbiwgd2lyZCBkaWUgbWl0Z2VsaWVmZXJ0ZSBqUXVlcnkgVmVyc2lvbiBudXIgdmVyd2VuZGV0LCB3ZW5uIGtlaW5lIGJlcmVpdHMKICAgIHZvcmhhbmRlbmUgVmVyc2lvbiBlcmthbm50IHdpcmQuIFNvbGx0ZSBkYWhlciBpbiBlaW5lbSBiZXN0ZWhlbmRlbiBQcm9qZWt0IGpRdWVyeSBiZXJlaXRzIHZlcndlbmRldCB3ZXJkZW4sIGdyZWlmdAogICAgZGllIFRhYmVsbGVuYmlibGlvdGhlayBhdWYgZGllc2UgenVyJnV1bWw7Y2suIEdlaGVuIHNpZSBkYWhlciBzaWNoZXIsIGRhc3MgaW4gZGllc2VtIEZhbGxlIGVpbmUgalF1ZXJ5IFZlcnNpb24gPiAxLjcueAogICAgdmVyd2VuZGV0IHdpcmQhPC9wPgoKPGgxPlBhcmFtZXRlcjwvaDE+CjxwPkRpZSBUYWJlbGxlIGhhdCBkaWUgZm9sZ2VuZGVuIGFsbGdlbWVpbmVuIFBhcmFtZXRlcjo8L3A+Cjx1bD4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5iYXNlPC9zcGFuPjogQWt0dWVsbGUgbmljaHQgaW4gdmVyd2VuZHVuZyA8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVuLUlEPC9zcGFuPjogRWluZGV1dGlnZXIgVGFiZWxsZW5uYW1lPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5UYWJlbGxlbmtvcGYgSCZvdW1sO2hlPC9zcGFuPjogSCZvdW1sO2hlIGRlcyBUYWJlbGxlbmtvcGZlcyBpbiBQaXhlbCAoU3RhbmRhcmQgMzAsICopIDwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+VGFiZWxsZW5rb3BmIFNjaHJpZnRnciZvdW1sOyZzemxpZztlPC9zcGFuPjogU2NocmlmdGdyJm91bWw7JnN6bGlnO2UgaW0gVGFiZWxsZW5rb3BmIChTdGFuZGFyZDogMTQpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5UYWJlbGxlbmtvcGZ6ZWxsZSBob3Jpem9udGFsIGF1c3JpY2h0ZW48L3NwYW4+OiBIb3Jpem9udGFsZSBBdXNyaWNodHVuZyBkZXMgWmVsbGVuaW5oYWx0ZXMgaW0gVGFiZWxsZW5rb3BmIChTdGFuZGFyZDogaW5oZXJpdCk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVua29wZnplbGxlIHZlcnRpY2FsIGF1c3JpY2h0ZW48L3NwYW4+OiBWZXJ0aWthbGUgQXVzcmljaHR1bmcgZGVzIFplbGxlbmluaGFsdGVzIGltIFRhYmVsbGVua29wZiAoU3RhbmRhcmQ6IGNlbnRlcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVuemVpbGUgSCZvdW1sO2hlPC9zcGFuPjogSCZvdW1sO2hlIGRlciBUYWJlbGxlbnplaWxlbiBpbiBQaXhlbCAoU3RhbmRhcmQgMjAsICoqKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+VGFiZWxsZW56ZWlsZSBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZTwvc3Bhbj46IFNjaHJpZnRnciZvdW1sOyZzemxpZztlIGluIGVpbmVyIFRhYmVsbGVuemVpbGUgKFN0YW5kYXJkOiAxMik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkRldGFpbGJlcmVpY2ggU2NocmlmdGdyJm91bWw7JnN6bGlnO2U8L3NwYW4+OiBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZSBmJnV1bWw7ciBUYWJlbGxlbmRldGFpbHMgKFN0YW5kYXJkOiAxMik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlRhYmVsbGVuZnUmc3psaWc7IFNjaHJpZnRnciZvdW1sOyZzemxpZztlPC9zcGFuPjogU2NocmlmdGdyJm91bWw7JnN6bGlnO2UgaW0gVGFiZWxsZW5mdSZzemxpZzsgKFN0YW5kYXJkOiAxMik8L2xpPgo8L3VsPgo8cD48aT4oKikgRXMgd2lyZCBlaW5lIEgmb3VtbDtoZSBkaWUgaW4gZXR3YSBkZW0gZG9wcGVsdGVuIGRlciBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZSBlbnRzcHJpY2h0IGVtcGZvaGxlbi48L2k+PGJyPgogICAgPGk+KCoqKSBCZWkgYWt0aXZpZXJ0ZW0gWmVpbGVudW1icnVjaCB3aXJkIGRpZSAxLDUgRmFjaGUgU2NocmlmdGdyJm91bWw7JnN6bGlnO2UgbWFsIGRhcnp1c3RlbGxlbmRlIFplaWxlIGFscyBIJm91bWw7aGUgZW1wZm9obGVuLjwvaT48L3A+Cgo8cD5EYXJzdGVsbHVuZzo8L3A+Cjx1bD4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TY2hyaWZ0ZmFtaWxpZTwvc3Bhbj46IFNjaHJpZnRmYW1pbGllIChTdGFuZGFyZDogQXJpYWwpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5HbG9iYWxlIFJhaG1lbmZhcmJlPC9zcGFuPjogUXVlbGxlIGYmdXVtbDtyIFJhaG1lbmZhcmJlIChTdGFuZGFyZDogU1lTVEVNLkdMT0JBTFMuYXR2Qm9yZGVyQ29sb3IpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5HbG9iYWxlIEYmdXVtbDtsbGZhcmJlPC9zcGFuPjogUXVlbGxlIGYmdXVtbDtyIEYmdXVtbDtsbGZhcmJlIChTdGFuZGFyZDogU1lTVEVNLkdMT0JBTFMuYXR2RmlsbENvbG9yKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+R2xvYmFsZSBTY2hyaWZ0ZmFyYmU8L3NwYW4+OiAgUXVlbGxlIGYmdXVtbDtyIFNjaHJpZnRmYXJiZSAoU3RhbmRhcmQ6IFNZU1RFTS5HTE9CQUxTLmF0dkZvbnRDb2xvcik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkdsb2JhbGUgU3ltYm9sZmFyYmU8L3NwYW4+OiAgUXVlbGxlIGYmdXVtbDtyIFN5bWJvbGZhcmJlIChTdGFuZGFyZDogU1lTVEVNLkdMT0JBTFMuYXR2U3ltYm9sQ29sb3IpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5HbG9iYWxlIGluYWt0aXZlIEZhcmJlbjwvc3Bhbj46IFF1ZWxsZSBmJnV1bWw7ciBpbmFrdGl2ZSBGYXJiZSAoRGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2SW5hY3RpdmVDb2xvcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkdsb2JhbGUgVGFiZWxsZW5mYXJiZW48L3NwYW4+OiAgIFF1ZWxsZSBmJnV1bWw7ciBUYWJlbGxlbmZhcmJlbiAoU3RhbmRhcmQ6IFNZU1RFTS5HTE9CQUxTLmF0dk9iamVjdERpc3BsYXlzLkJhc2VUYWJsZS5Db2xvckNvbmZpZyk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkJlbnV0emVyZGVmaW5pZXJ0ZXMgVGhlbWU8L3NwYW4+OiBPcHRpb25hbGVzIENTUyBQZmFkIGYmdXVtbDtyIGJlbnV0emVyZGVmaW5pZXJ0ZXMgVGhlbWUgKFN0YW5kYXJkOiBhdHZpc2VUaGVtZSk8L2xpPgo8L3VsPgoKPHA+T3B0aW9uZW46PC9wPgo8dWw+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3BhbHRlbiBuZXUgb3JkbmVuIGVybSZvdW1sO2dsaWNoZW48L3NwYW4+OiBWZXJzY2hpZWJlbiB2b24gU3BhbHRlbiB6dWxhc3NlbiAoU3RhbmRhcmQ6IHRydWUpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5QYWdpbmc8L3NwYW4+OiBBbnplaWdlIGRlciBTZWl0ZW5uYXZpZ2F0aW9uIChTdGFuZGFyZDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkZpbHRlcmxlaXN0ZTwvc3Bhbj46IFRhYmVsbGVuZmlsdGVyIGFuemVpZ2VuIChTdGFuZGFyZDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkZpbHRlciByZWd1bCZhdW1sO3JlIEF1c2RyJnV1bWw7Y2tlPC9zcGFuPjogRmlsdGVyZnVua3Rpb24gYmVudXR6dCBSZWd1bGFyIEV4cHJlc3Npb25zIChTdGFuZGFyZDogZmFsc2UsICoqKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+RmlsdGVyIG1pdCBQbGF0emhhbHRlcjwvc3Bhbj46IEFrdGl2aWVydW5nIGRlcyBQbGF0emhhbHRlcnMgJnF1b3Q7KiZxdW90OyBpbiBkZXIgU3VjaGZ1bmt0aW9uPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5GaWx0ZXIgR3JvJnN6bGlnOy0vS2xlaW5zY2hyZWlidW5nPC9zcGFuPjogR3JvJnN6bGlnOy0gdW5kIEtsZWluc2NocmVpYnVuZyBiZXImdXVtbDtja3NpY2h0aWdlbiAoU3RhbmRhcmQ6IGZhbHNlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+RmlsdGVyIE1pbmRlc2VpbmdhYmU8L3NwYW4+OiBNaW5kZXN0YW56YWhsIGRlciBaZWljaGVuIGJldm9yIGRlciBGaWx0ZXIgYWt0aXYgd2lyZCAoU3RhbmRhcmQ6IDEpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5GaWx0ZXIgVmVyeiZvdW1sO2dlcnVuZzwvc3Bhbj46IFZlcnomb3VtbDtnZXJ1bmcgZGVyIGF1dG9tYXRpc2NoZW4gRmlsdGVydW5nIGluIE1pbGxpc2VrdW5kZW4gKFN0YW5kYXJkOiAxMDAwLCBBYnNjaGFsdGVuIGRlciBBdXRvbWF0aWsgbWl0IDApPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5MYXVmemVpdG1vZHVzIGFuemVpZ2VuPC9zcGFuPjogQW56ZWlnZSBkZXMgTGF1ZnplaXRtb2R1cyBpbiBkZXIgU3RhdHVzemVpbGUgKFN0YW5kYXJkOiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+TWVocmZhY2hhdXN3YWhsPC9zcGFuPjogQWt0aXZpZXJ1bmcgZGVyIE1laHJmYWNoYXVzd2FobCAoU3RhbmRhcmQ6IHRydWUpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5NZWhyZmFjaGF1c3dhaGwsIEtsaWNrIGF1ZiBaZWxsZTwvc3Bhbj46IE1laHJmYWNoYXVzd2FobCwgTWFya2llcmVuIGJlaW0gS2xpY2tlbiBhdWYgWmVsbGUgKFN0YW5kYXJkOiBmYWxzZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlplaWxlbnVtYnJ1Y2ggaW4gWmVsbGVuPC9zcGFuPjogWmVpbGVudW1icnVjaCBpbiBaZWxsZW4genVsYXNzZW4gKFN0YW5kYXJkOiBmYWxzZSwgKioqKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+ZGlyZWt0ZSBFaW5nYWJlIGVybGF1YmVuPC9zcGFuPjogIEF1c3dhaGwgendpc2NoZW4gZGlyZWt0ZXIgRWluZ2FiZSB1bmQgRWluZ2FiZSAmdXVtbDtiZXIgU1ZHIFRhc3RhdHVyLjwvbGk+CjwvdWw+CjxwPjxpPigqKikgV2FybnVuZzogRGllIEZpbHRlcnVuZyBtaXR0bGVzIEhpbGZlIHZvbiBSZWd1bGFyIEV4cHJlc3Npb25zIGthbm4gYmVpIGdybyZzemxpZztlbiBEYXRlbm1lbmdlbiB6dSBlaW5lbSBzdGFya2VuIFBlcmZvcm1hbmNlYWJmYWxsIGYmdXVtbDtocmVuITwvaT4KICAgIDxpPigqKiopIEJlaSBha3RpdmllcnRlbSBaZWlsZW51bWJydWNoIHdpcmQgZGllIDEsNSBGYWNoZSBTY2hyaWZ0Z3Imb3VtbDsmc3psaWc7ZSBtYWwgZGFyenVzdGVsbGVuZGUgWmVpbGUgYWxzIEgmb3VtbDtoZSBlbXBmb2hsZW4uPC9pPjxicj4KPC9wPgoKPHA+TWVuJnV1bWw7IE9wdGlvbmVuOjwvcD4KPHVsPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPk1lbiZ1dW1sOyBhbnplaWdlbjwvc3Bhbj46IEFuemVpZ2UgZGVzIE1lbiZ1dW1sO2J1dHRvbnMgKFN0YW5kYXJkOiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+TWVuJnV1bWw7YnJlaXRlPC9zcGFuPjogIEJyZWl0ZSBkZXMgTWVuJnV1bWw7cyBiZWkgQXVma2xhcHBlbiBpbiBQaXhlbCAoU3RhbmRhcmQ6IDE1MCk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPk1lbiZ1dW1sO2gmb3VtbDtoZTwvc3Bhbj46IEgmb3VtbDtoZSBkZXMgTWVuJnV1bWw7cyBiZWkgQXVma2xhcHBlbiBpbiBQaXhlbCAoU3RhbmRhcmQ6IDMwMCk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlNwYWx0ZW5hdXN3YWhsIGltIE1lbiZ1dW1sOzwvc3Bhbj46IEFuemVpZ2UgZGVyIFNwYWx0ZW5hdXN3YWhsIGltIE1lbiZ1dW1sOyAoU3RhbmRhcmQ6IHRydWUpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5GaWx0ZXJhdXN3YWhsIGltIE1lbiZ1dW1sOzwvc3Bhbj46IEFuemVpZ2UgZGVyIEZpbHRlcmF1c3dhaGwgaW0gTWVuJnV1bWw7IChTdGFuZGFyZDogdHJ1ZSk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPkV4cG9ydGF1c3dhaGwgaW0gTWVuJnV1bWw7PC9zcGFuPjogQW56ZWlnZSBkZXIgRXhwb3J0YXVzd2FobCBpbSBNZW4mdXVtbDsgKFN0YW5kYXJkOiB0cnVlKTwvbGk+CjwvdWw+Cgo8aDI+SGlud2VpczwvaDI+CjxwPjxiPkFiIFZlcnNpb24gMy40IHdlcmRlbiBTVkctU3ltYm9sZSBpbiBkZXIgRnUmc3psaWc7emVpbGUgbmljaHQgbWVociB1bnRlcnN0JnV1bWw7dHp0LiBCaXR0ZSB2ZXJ3ZW5kZW4gU2llIG51ciBtZWhyIFN5bWJvbGUgYXVzIGRlciBCaWJsaW90aGVrIHZvbiBGb250IEF3ZXNvbWUgRnJlZS48L2I+PC9wPgoKPHA+RnVzc3plaWxlIE9wdGlvbmVuOjwvcD4KPHVsPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBlcnN0ZSBTZWl0ZTwvc3Bhbj46IFN5bWJvbCB6dW0gYmwmYXVtbDt0dGVybiBhdWYgZGllIGVyc3RlIFNlaXRlIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1mYXN0LWJhY2t3YXJkIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3ltYm9sIHZvcmlnZSBTZWl0ZTwvc3Bhbj46IFN5bWJvbCB6dW0gYmwmYXVtbDt0dGVybiBhdWYgZGllIHZvcmdlaGVuZGUgU2VpdGUgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtYmFja3dhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgUGF1c2U8L3NwYW4+OiBTeW1ib2wgZiZ1dW1sO3IgUGF1c2UgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXBhdXNlIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3ltYm9sIFN0b3A8L3NwYW4+OiBTeW1ib2wgZiZ1dW1sO3IgU3RvcCAoU3RhbmRhcmQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtc3RvcCImZ3Q7Jmx0Oy9pJmd0Oyk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBuJmF1bWw7Y2hzdGUgU2VpdGU8L3NwYW4+OiBTeW1ib2wgenVtIGJsJmF1bWw7dHRlcm4gYXVmIGRpZSBuJmF1bWw7Y2hzdGUgU2VpdGUgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtZm9yd2FyZCImZ3Q7Jmx0Oy9pJmd0OykgPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgbGV0enRlIFNlaXRlPC9zcGFuPjogU3ltYm9sIHp1bSBibCZhdW1sO3R0ZXJuIGF1ZiBkaWUgbGV0enRlIFNlaXRlIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1mYXN0LWZvcndhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgU2VpdGVuIGxhZGVuPC9zcGFuPjogU3ltYm9sIHp1bSBsYWRlbiBkZXIgbiZhdW1sO2Noc3RlbiBTZWl0ZW4gaW0gbWFudWVsbGVuIE1vZHVzIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1kb3dubG9hZCImZ3Q7Jmx0Oy9pJmd0Oyk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBTdWNoZW48L3NwYW4+OiBTeW1ib2wgZiZ1dW1sO3IgU3VjaGUgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXNlYXJjaCImZ3Q7Jmx0Oy9pJmd0Oyk8L2xpPgoKCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgJlV1bWw7YmVybGF1Zjwvc3Bhbj46IFN5bWJvbCBiZWltIEVycmVpY2hlbiBkZXMgJlV1bWw7YmVybGF1ZnMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWJhbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgVHJpZ2dlciBNb2R1czwvc3Bhbj46IFN5bWJvbCBmJnV1bWw7ciBUcmlnZ2VyIE1vZHVzIChTdGFuZGFyZDogJmx0O2kgY2xhc3M9ImZhcyBmYS1hbmdsZS1kb3VibGUtZG93biImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgQ29udGludWF0aW9uIE1vZHVzPC9zcGFuPjogU3ltYm9sIGYmdXVtbDtyIGZvcnRsYXVmZW5kZW4gTW9kdXMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWNvZyBmYS1zcGluIiZndDsmbHQ7L2kmZ3Q7ICk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPlN5bWJvbCBMaXZlIE1vZHVzPC9zcGFuPjogU3ltYm9sIGYmdXVtbDtyIGxpdmUgTW9kdXMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN5bmMgZmEtc3BpbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5TeW1ib2wgTWFudWVsbGVyIE1vZHVzPC9zcGFuPjogU3ltYm9sIGYmdXVtbDtyIG1hbnVlbGxlbiBNb2R1cyAoU3RhbmRhcmQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtY2hlY2siJmd0OyZsdDsvaSZndDsgKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+U3ltYm9sIEFiZnJhZ2UgQWJnZXNjaGxvc3Nlbjwvc3Bhbj46IFN5bWJvbCBiZWltIEVycmVpY2hlbiBkZXMgJlV1bWw7YmVybGF1ZnMgKFN0YW5kYXJkOiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWRvd25sb2FkIiZndDsmbHQ7L2kmZ3Q7ICk8L2xpPgo8L3VsPgpBbm1lcmt1bmc6IFNMQU8gPSBTWVNURU0uTElCUkFSWS5BVFZJU0UuT0JKRUNURElTUExBWVMKCjxoMT5TY2huZWxscmVmZXJlbno8L2gxPgoKPGgyPlRhYmVsbGVua29uZmlndXJhdGlvbiBmJnV1bWw7ciBlaW5mYWNoZSBEYXRlbmFiZnJhZ2VuICh6LkIuIHdlYk1JLmRhdGEucmVhZCk8L2gyPgo8cD5aaWVoZW4gc2llIGRhcyBUYWJlbGxlbmRpc3BsYXkgaW4gZGFzIFBhcmVudGRpc3BsYXkgdW5kICZvdW1sO2ZmbmVuIHNpZSBkZW4gU2tyaXB0ZWRpdG9yIGYmdXVtbDtyIGRhcyBQYXJlbnRkaXNwbGF5LjwvcD4KPHByZT4KICAgIC8qIExhZGVuIGRlciBUYWJlbGxlbnJlc291cmNlbiAqLwogICAgd2ViTUkudGFibGUubG9hZFJlc291cmNlcyhmdW5jdGlvbiAoKSB7CgogICAgICAgIC8qIEVyc3RlbGxlbiBkZXIgS29uZmlndXJhdGlvbiAqLwogICAgICAgIHZhciBjb25maWcgPSBbXTsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgZGFyenVzdGVsbGVuZGVuIFNwYWx0ZW4gKi8KICAgICAgICBjb25maWdbImNvbHVtbnMiXSA9CiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsgICBpZDogImlkIiwgbmFtZTogIklEIiwgZmllbGQ6ICJpZCIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogImFkZHJlc3MiLCBuYW1lOiAiQWRkcmVzcyIsIGZpZWxkOiAiYWRkcmVzcyIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogInZhbHVlIiwgbmFtZTogIldlcnQiLCBmaWVsZDogInZhbHVlIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9CiAgICAgICAgICAgIF07CgogICAgICAgIC8qIEtvbmZpZ3VyYXRpb24gZGVzIExhdWZ6ZWl0dmVyaGFsdGVuICovCiAgICAgICAgY29uZmlnWyJtb2RlIl0gPSAib25jZSI7CgogICAgICAgIC8qIEJlaXNwaWVsZGF0ZW4gKi8KICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgIGRhdGEucmVzdWx0ID0gWwogICAgICAgICAgICB7IGlkOjAsIGFkZHJlc3M6ICJub2RlIDEiLCB2YWx1ZTogMTIzIH0sCiAgICAgICAgICAgIHsgaWQ6MSwgYWRkcmVzczogIm5vZGUgMiIsIHZhbHVlOiA0NTYgfSwKICAgICAgICAgICAgeyBpZDoyLCBhZGRyZXNzOiAibm9kZSAzIiwgdmFsdWU6IDc4OSB9LAogICAgICAgICAgICAuLi4KICAgICAgICBdOwoKICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlciBEYXRlbmFiZnJhZ2UgKi8KICAgICAgICBjb25maWdbImRhdGFSZXF1ZXN0RnVuY3Rpb24iXSA9CiAgICAgICAgICAgIGZ1bmN0aW9uIGN1c3RvbURhdGFSZXF1ZXN0KGNvbnRpbnVhdGlvbikgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgLyogUmVnaXN0aWVydW5nIGRlciBLb25maWd1cmF0aW9uICovCiAgICAgICAgd2ViTUkudGFibGUucmVnaXN0ZXIoIm15VGFibGVOYW1lIiwgImNvbmZpZyIsICBjb25maWcpOwogICAgICAgIHdlYk1JLnRhYmxlLnNldFJlYWR5KCJteVRhYmxlTmFtZSIsICJjb25maWciKTsKICAgIH0pOwo8L3ByZT4KPHA+U3BlaWNoZXJuIHNpZSBkZW4gQ29kZSBkZXMgUGFyZW50ZGlzcGxheSB1bmQgcGFyYW1ldHJpZXJlbiBzaWUgZGllIFRhYmVsbGUgd2llIGdld29obnQuIFRyYWdlbiBzaWUgYmVpIFRhYmVsbGVubmFtZSAibXlUYWJsZU5hbWUiIGVpbi48L3A+Cgo8aDI+VGFiZWxsZW5rb25maWd1cmF0aW9uIGYmdXVtbDtyIGVpbmZhY2hlIERhdGVuYWJmcmFnZW4gKHouQi4gd2ViTUkuZGF0YS5yZWFkKTwvaDI+CjxwPlppZWhlbiBzaWUgZGFzIFRhYmVsbGVuZGlzcGxheSBpbiBkYXMgUGFyZW50ZGlzcGxheSB1bmQgJm91bWw7ZmZuZW4gc2llIGRlbiBTa3JpcHRlZGl0b3IgZiZ1dW1sO3IgZGFzIFBhcmVudGRpc3BsYXkuPC9wPgo8cHJlPgogICAgLyogTGFkZW4gZGVyIFRhYmVsbGVucmVzb3VyY2VuICovCiAgICB3ZWJNSS50YWJsZS5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLyogRXJzdGVsbGVuIGRlciBLb25maWd1cmF0aW9uICovCiAgICAgICAgdmFyIGNvbmZpZyA9IFtdOwoKICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlciBkYXJ6dXN0ZWxsZW5kZW4gU3BhbHRlbiAqLwogICAgICAgIGNvbmZpZ1siY29sdW1ucyJdID0KICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgeyAgIGlkOiAiaWQiLCBuYW1lOiAiSUQiLCBmaWVsZDogImlkIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9LAogICAgICAgICAgICAgICAgeyAgIGlkOiAiYWRkcmVzcyIsIG5hbWU6ICJBZGRyZXNzIiwgZmllbGQ6ICJhZGRyZXNzIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9LAogICAgICAgICAgICAgICAgeyAgIGlkOiAidmFsdWUiLCBuYW1lOiAiV2VydCIsIGZpZWxkOiAidmFsdWUiLCBzb3J0YWJsZTogdHJ1ZSwgZmlsdGVyOiB0cnVlIH0KICAgICAgICAgICAgXTsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXMgTGF1ZnplaXR2ZXJoYWx0ZW4gKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJvbmNlIjsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgRGF0ZW5hYmZyYWdlICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHdlYk1JLmRhdGEucmVhZCgKICAgICAgICAgICAgICAgICAgICAiWU9VUl9OT0RFX0FERFJFU1MiLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXF1ZXN0UmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0ID0gcmVxdWVzdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgLyogUmVnaXN0aWVydW5nIGRlciBLb25maWd1cmF0aW9uICovCiAgICAgICAgd2ViTUkudGFibGUucmVnaXN0ZXIoIm15VGFibGVOYW1lIiwgImNvbmZpZyIsICBjb25maWcpOwogICAgICAgIHdlYk1JLnRhYmxlLnNldFJlYWR5KCJteVRhYmxlTmFtZSIsICJjb25maWciKTsKICAgIH0pOwo8L3ByZT4KPHA+U3BlaWNoZXJuIHNpZSBkZW4gQ29kZSBkZXMgUGFyZW50ZGlzcGxheSB1bmQgcGFyYW1ldHJpZXJlbiBzaWUgZGllIFRhYmVsbGUgd2llIGdld29obnQuIFRyYWdlbiBzaWUgYmVpIFRhYmVsbGVubmFtZSAibXlUYWJsZU5hbWUiIGVpbi48L3A+Cgo8aDI+VGFiZWxsZW5rb25maWdydWF0aW9uIGYmdXVtbDtyIExpdmUgRGF0ZW48L2gyPgo8cD5aaWVoZW4gc2llIGRhcyBUYWJlbGxlbmRpc3BsYXkgaW4gZGFzIFBhcmVudGRpc3BsYXkgdW5kICZvdW1sO2ZmbmVuIHNpZSBkZW4gU2tyaXB0ZWRpdG9yIGYmdXVtbDtyIGRhcyBQYXJlbnRkaXNwbGF5LiBGJnV1bWw7Z2VuCiAgICBzaWUgZGllIEtvbmZpZ3VyYXRpb24gZiZ1dW1sO3IgZWluZmFjaGUgRGF0ZW5hYmZyYWdlbiBlaW4uIERhbmFjaCAmYXVtbDtuZGVybiBzaWUgZGVuIE1vZHVzIHVuZCBtb2RpZml6aWVyZW4gc2llCiAgICBpaHJlIERhdGVuYWJmcmFnZSB3aWUgZm9sZ3QuCjwvcD4KPHByZT4KICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlcyAgTGF1ZnplaXR2ZXJoYWx0ZW4gKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJsaXZlIjsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgRGF0ZW5hYmZyYWdlICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHNlbGYuc3Vic2NyaWJlSUQgPSB3ZWJNSS5kYXRhLnN1YnNjcmliZSgKICAgICAgICAgICAgICAgICAgICAiWU9VUl9OT0RFX0FERFJFU1MiLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXF1ZXN0UmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0ID0gcmVxdWVzdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgd2ViTUkuYWRkT251bmxvYWQoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB3ZWJNSS5kYXRhLnVuc3Vic2NyaWJlKHNlbGYuc3Vic2NyaWJlSUQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CjwvcHJlPgoKPGgyPlRhYmVsbGVua29uZmlncnVhdGlvbiBmJnV1bWw7ciAiQ29udGludWF0aW9uIFBvaW50cyIgKGNvbnRpbnVlIC8gdHJpZ2dlcik8L2gyPgo8cD5aaWVoZW4gc2llIGRhcyBUYWJlbGxlbmRpc3BsYXkgaW4gZGFzIFBhcmVudGRpc3BsYXkgdW5kICZvdW1sO2ZmbmVuIHNpZSBkZW4gU2tyaXB0ZWRpdG9yIGYmdXVtbDtyIGRhcyBQYXJlbnRkaXNwbGF5LiBGJnV1bWw7Z2VuCiAgICBzaWUgZGllIEtvbmZpZ3VyYXRpb24gZiZ1dW1sO3IgZWluZmFjaGUgRGF0ZW5hYmZyYWdlbiBlaW4uIERhbmFjaCAmYXVtbDtuZGVybiBzaWUgZGVuIE1vZHVzIHVuZCBtb2RpZml6aWVyZW4gc2llCiAgICBpaHJlIERhdGVuYWJmcmFnZSB3aWUgZm9sZ3QuCjwvcD4KPHByZT4KICAgICAgICAvKiBLb25maWd1cmF0aW9uIGRlcyAgTGF1ZnplaXR2ZXJoYWx0ZW4gKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJjb250aW51ZSI7IC8vIDw8PCBmJnV1bWw7ciBkZW4gVHJpZ2dlcm1vZHVzIGVyc2V0emVuIHNpZSAiY29udGludWUiIGR1cmNoICJ0cmlnZ2VyZWQiCgogICAgICAgIC8qIEtvbmZpZ3VyYXRpb24gZGVyIERhdGVuYWJmcmFnZSAqLwoJCWNvbmZpZ1siZGF0YVJlcXVlc3RGdW5jdGlvbiJdID0KCQkJZnVuY3Rpb24gY3VzdG9tRGF0YVJlcXVlc3QoY29udGludWF0aW9uKSB7CgkJCQl2YXIgc2VsZiA9IHRoaXM7CgkJCQlpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCQkJCWZpbHRlciA9IGNvbnRpbnVhdGlvbi5DUC52YWx1ZTsKCQkJCQl3ZWJNSS5kYXRhLnF1ZXJ5TmV4dCgKCQkJCQkJZmlsdGVyLAoJCQkJCQlhZGREYXRhVG9Db250cm9sbGVyCgkJCQkJKTsKCQkJCX0gZWxzZSB7CgkJCQkJZmlsdGVyID0gewoJCQkJCQlhZGRyZXNzOiBbImc6KllPVVJfTk9ERV9BRERSRVNTKiJdLAoJCQkJCQlzZWxlY3Q6IFsidjpwcmlvcml0eSIsICJ2OnZhbHVlIiwgInY6dXNlcm5hbWUiLCAidjphZGRyZXNzIiwgInY6dGltZXN0YW1wIiwgInY6dHlwZSIsICJ2OnN0YXR1cyIsICJ2OlJlcGxhY2VtZW50TmFtZXMiLCAidjpSZXBsYWNlbWVudFZhbHVlcyJdLAoJCQkJCQl0eXBlOiBbInY6MSJdLAoJCQkJCQludW1yb3dzOlsidjoxMDAwIl0KCQkJCQl9OwoJCQkJCXdlYk1JLmRhdGEucXVlcnlGaWx0ZXIoCgkJCQkJCWZpbHRlciwKCQkJCQkJYWRkRGF0YVRvQ29udHJvbGxlcgoJCQkJCSk7CgkJCQl9CgkJCQlmdW5jdGlvbiBhZGREYXRhVG9Db250cm9sbGVyKHJlcXVlc3RSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlcXVlc3RSZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgIC8qIEhpbnp1ZiZ1dW1sO2dlbiBkZXIgIkNvbnRpbnVhdGlvbiIgSW5mb3JtYXRpb25lbiAqLwoJCQkJCWlmICh0eXBlb2YgZGF0YS5Nb3JlICE9ICJ1bmRlZmluZWQiICYmIGRhdGEuTW9yZSAhPSBmYWxzZSAmJiBkYXRhLmNvbnRpbnVhdGlvbnBvaW50ID4gMCkgewoJCQkJCQlkYXRhLkNQID0ge307CgkJCQkJCWRhdGEuQ1AudmFsdWUgPSByZXF1ZXN0UmVzdWx0LmNvbnRpbnVhdGlvbnBvaW50OwoJCQkJCX0gZWxzZSB7CgkJCQkJCWRhdGEuTW9yZSA9IGZhbHNlOwoJCQkJCX0KCgkJCQkJdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKCQkJCX0KCQkJfTsKCiAgICAgICAgLyogS29uZmlndXJhdGlvbiBkZXIgRnJlaWdhYmUgKi8KICAgICAgICBjb25maWdbImRhdGFSZWxlYXNlRnVuY3Rpb24iXSA9CiAgICAgICAgICAgIGZ1bmN0aW9uIGRhdGFSZWxlYXNlRnVuY3Rpb24oY29udGludWF0aW9uKSB7CgkgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCSAgICAgICAgICAgIHdlYk1JLmRhdGEucXVlcnlSZWxlYXNlKGNvbnRpbnVhdGlvbi5DUC52YWx1ZSk7CgkgICAgICAgIH0KICAgICAgICB9Cgo8L3ByZT4KCjxoMj5adWdyaWZmIGF1ZiBUYWJlbGxlbmluaGFsdGU8L2gyPgo8cD5EZXIgZWluZmFjaHN0ZSBXZWcgYXVmIFRhYmVsbGVuaW5oYWx0ZSB6dXp1Z3JlaWZlbiwgaXN0IGRpZSBWZXJ3ZW5kdW5nIGRlciBvbkNsaWNrQ2FsbGJhY2sgS29uZmlndXJhdGlvbi4KCSZVdW1sO2JlciBkaWVzZXMgQ2FsbGJhY2sgayZvdW1sO25uZW4gZGFzIEV2ZW50IHVuZCBkaWUgSW5mb3MgJnV1bWw7YmVyIGRhcyBzZWxla3RpZXJ0ZSBJdGVtIGluIGVpbmVyIGJlbnV0emVyZGVmaW5pZXJ0ZW4KCUZ1bmt0aW9uIHZlcmFyYmVpdGV0IHdlcmRlbiAoei5CLiBBdWZydWYgZWlnZW5lciBEaWFsb2dlKSA8L3A+CjxwcmU+CiAgICAvKiBMYWRlbiBkZXIgVGFiZWxsZW5yZXNvdXJjZW4gKi8KICAgIHdlYk1JLnRhYmxlLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24gKCkgewoKICAgICAgICAvKiBFcnN0ZWxsZW4gZGVyIEtvbmZpZ3VyYXRpb24gKi8KICAgICAgICB2YXIgY29uZmlnID0gW107CgogICAgICAgIC4uLgoKICAgICAgICBjb25maWdbIm9uQ2xpY2tDYWxsYmFjayJdID0gZnVuY3Rpb24oZSwgaW5mbyl7CiAgICAgICAgICB2YXIgaXRlbSA9IGluZm8uaXRlbTsKICAgICAgICAgIHZhciByb3cgPSBpbmZvLnJvd0luZGV4OwogICAgICAgICAgdmFyIGNvbHVtbiA9IGluZm8uY29sdW1uOwoKICAgICAgICAgIHZhciBpZCA9IGl0ZW0uaWQ7CiAgICAgICAgICBpdGVtLnZhbHVlID0gImNoYW5nZWQgdmFsdWUiOwoKICAgICAgICAgIC8qIHVwZGF0ZS9kZWxldGUvd2luZG93ICovCiAgICAgICAgICBpZihjb2x1bW4uaWQgPT0gInRpbWVzdGFtcCIpewogICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIudXBkYXRlRGF0YShpZCwgaXRlbSk7CiAgICAgICAgICB9IGVsc2UgaWYoY29sdW1uLmlkID09ICJ2YWx1ZSIpewogICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIucmVtb3ZlRGF0YShpZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvcGVuTXlXaW5kb3dGdW5rdGlvblRvRWRpdChpdGVtKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC4uLgoKICAgIH0pOwo8L3ByZT4KCjxoMj5TdWNoZSBuYWNoIFdlcnRlbiBpbiBkZXIgVGFiZWxsZTwvaDI+CjxwPk1pdCBIaWxmZSBkZXIgc2VhcmNoKGF0dHJpYnV0ZSwgdmFsdWUsIGV4YWN0U2VhcmNoKSBGdW5rdGlvbiBrYW5uIGluIGRlciBUYWJlbGxlIG5hY2ggV2VydGVuIGdlc3VjaHQgd2VyZGVuLgoJSW0gVHJlZmZlcmZhbGxlIHdlcmRlbiBkaWUgZ2VmdW5kZW4gSXRlbXMgaW4gZWluZW0gQXJyYXkgenVy/GNrZ2VnZWJlbi48L3A+CjxwcmU+CiAgd2ViTUkudGFibGUud2FpdFJlYWR5KCJteVRhYmxlTmFtZSIsICJjb250cm9sbGVyIiwgZnVuY3Rpb24gKCkgewoKICAgIHRhYmxlQ29udHJvbGxlciA9IHdlYk1JLnRhYmxlLnJlcXVlc3QoIm15VGFibGVOYW1lIiwgImNvbnRyb2xsZXIiKTsKICAgIHZhciBpdGVtQXJyYXkgPSB0YWJsZUNvbnRyb2xsZXIuc2VhcmNoKCJ0aW1lc3RhbXAiLCAxNTUzNzg1MTEwNTAwLCB0cnVlKTsKCiAgICB2YXIgaWQgPSBpdGVtQXJyYXlbMF0uaWQ7CiAgICBpdGVtQXJyYXlbMF0udmFsdWUgPSAiY2hhbmdlZCB2YWx1ZSI7CgogICAgLyogdXBkYXRlICovCiAgICB0YWJsZUNvbnRyb2xsZXIudXBkYXRlRGF0YShpZCwgaXRlbUFycmF5WzBdKTsKCiAgICAvKiBkZWxldGUgKi8KICAgIHRhYmxlQ29udHJvbGxlci5yZW1vdmVEYXRhKGlkKTsKCiAgfSk7CjwvcHJlPgoKPGgyPlRpbWVzdGFtcCBLb252ZXJ0aWVydW5nPC9oMj4KPHA+TWl0IGF0dmlzZSAzLjMuMiB3aXJkIGRlciBUaW1lc3RhbXAgdm9uICJkYXRldGltZSIgU3BhbHRlbiBuaWNodCBsJmF1bWw7bmdlciBhbHMgU3RyaW5nIGdlbGllZmVydC4gRGFoZXIgaXN0IGVzIG5vdHdlbmRpZyBkZW4gZ2VsaWVmZXJ0ZW4gVGltZXN0YW1wIG1pdCBIaWxmZSBlaW5lcyBGb3JtYXR0ZXJzIGlubmVyaGFsYiBkZXIgVGFiZWxsZSBpbiBlaW5lbiBTdHJpbmcgdW16dXdhbmRlbG4uPC9wPgo8cD5CZWlzcGllbDo8L3A+CjxwcmU+CglmdW5jdGlvbiBfbWFrZUNvbnZlcnNpb25zKGZvcm1hdCwgdmFsdWUpIHsKCWlmIChmb3JtYXRbMF0gPT0gImRhdGV0aW1lIikgewoJCWlmICh2YWx1ZSkgewoJCQlpZiAodHlwZW9mIHZhbHVlID09ICJzdHJpbmciICYmIHZhbHVlLmluZGV4T2YoIi0iKSA+IC0xKQkJLy9pZ25vcmUgYWxyZWFkeSBmb3JtYXR0ZWQgdmFsdWVzCgkJCQlyZXR1cm4gdmFsdWU7CgoJCQl2YXIgZGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KHZhbHVlLCAxMCkpOwoJCQl2YWx1ZSA9IHdlYk1JLnNwcmludGYoIiVkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZC4lMDNkIiwgZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCksIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpOwoJCX0gZWxzZSB7CgkJCXZhbHVlID0gIiI7CgkJfQoJfQoJcmV0dXJuICc8ZGl2IGNsYXNzPSJzbGljay1jZWxsLWl0ZW0iPicrdmFsdWUrJzwvZGl2Pic7Cgl9CjwvcHJlPgo8aDE+VGFiZWxsZW5rb25maWd1cmF0aW9uZW48L2gxPgo8cD5XZWl0ZXIgS29uZmlndXJhdGlvbnNoaWxmZSBlcmhhbHRlbiBzaWUgaW4gZGVyIGF0dmlzZSBEb2t1bWVudGF0aW9uIHVuZCBiZWkgYXR2aXNlIExpdmUhPC9wPgo8YnI+CjwvYm9keT4KPC9odG1sPg==</uax:ByteString>
		</Value>
	</UAVariable>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table.en" BrowseName="1:en" DataType="ByteString" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">en</DisplayName>
		<Description Locale="en">en</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.HtmlHelp</Reference>
		</References>
		<Value>
			<uax:ByteString>PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSI+CiAgICA8dGl0bGU+T0RfaGVscDwvdGl0bGU+CiAgICA8c3R5bGU+ICNwYXJhbWV0ZXIgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgfSA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5Pgo8aDE+RGVzY3JpcHRpb248L2gxPgo8cD5UaGlzIGRpc3BsYXkgaXMgc3VpdGFibGUgZm9yIGRpc3BsYXlpbmcgZGF0YSBpbiB0YWJ1bGFyIGZvcm0uIEluIGFkZGl0aW9uIHRvIHRoZSBzZXR0aW5nIG9mIHRoZQogICAgVGFibGUgcGFyYW1ldGVycyBhbHNvIHJlcXVpcmUgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGhpZ2hlci1sZXZlbCBkaXNwbGF5LiBUaGUgaGlnaGVyLWxldmVsIGRpc3BsYXkgd2lsbCBiZQogICAgaW4gdGhlIGZvbGxvd2luZyBhbHNvIHJlZmVycmVkIHRvIGFzIFBhcmVudGRpc3BsYXkuPC9wPgoKPGgyPkNvbmRpdGlvbnM8L2gyPgo8cD5UaGUgdGFibGUgbGlicmFyeSByZXF1aXJlcyBqUXVlcnk+IDEuNyBhbmQgaXMgY3VycmVudGx5IHNoaXBwZWQgd2l0aCBqUXVlcnk+IDMuMy54LjwvcD4KPHA+VG8gYXZvaWQgY29tcGF0aWJpbGl0eSBpc3N1ZXMsIHRoZSBpbmNsdWRlZCBqUXVlcnkgdmVyc2lvbiBpcyBvbmx5IHVzZWQgaWYgbm9uZSBhbHJlYWR5CiAgICBleGlzdGluZyB2ZXJzaW9uIGlzIGRldGVjdGVkLiBUaGVyZWZvcmUgalF1ZXJ5IHNob3VsZCBhbHJlYWR5IGJlIHVzZWQgaW4gYW4gZXhpc3RpbmcgcHJvamVjdAogICAgdGhlIHNwcmVhZHNoZWV0IGxpYnJhcnkgdG8gdGhlbS4gVGhlcmVmb3JlLCBtYWtlIHN1cmUgdGhhdCBpbiB0aGlzIGNhc2UgYSBqUXVlcnkgdmVyc2lvbj4gMS43LngKICAgIGlzIHVzZWQhPC9wPgoKPGgxPlBhcmFtZXRlcjwvaDE+CjxwPlRoZSB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBnZW5lcmFsIHBhcmFtZXRlcnM6OjwvcD4KPHVsPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmJhc2U8L3NwYW4+OiBDdXJyZW50IG5vdCBpbiB1c2U8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIElEPC9zcGFuPjogVW5pcXVlIHRhYmxlIG5hbWU8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIGhlYWRlciBoZWlnaHQ8L3NwYW4+OiBIZWlnaHQgb2YgdGFibGUgaGVhZGVyIGluIHBpeGVscyAoZGVmYXVsdCAzMCwgKik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIGhlYWRlciBmb250IHNpemU8L3NwYW4+OiBGb250IHNpemUgaW4gdGhlIHRhYmxlIGhlYWRlciAoZGVmYXVsdDogMTQpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj50YWJsZSBoZWFkZXIgY2VsbCBhbGlnbiBob3Jpem9udGFsPC9zcGFuPjogSG9yaXpvbnRhbCBhbGlnbiBvZiBjb250ZW50IGluIGhlYWRlciAoZGVmYXVsdDogaW5oZXJpdCk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIGhlYWRlciBjZWxsIGFsaWduIHZlcnRpY2FsPC9zcGFuPjogVmVydGljYWwgYWxpZ24gb2YgY29udGVudCBpbiBoZWFkZXIgKGRlZmF1bHQ6IGNlbnRlcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnRhYmxlIHJvdyBoZWlnaHQ8L3NwYW4+OiBIZWlnaHQgb2YgdGFibGUgcm93cyBpbiBwaXhlbHMgKGRlZmF1bHQgMjAsICoqKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+dGFibGUgcm93IGZvbnQgc2l6ZTwvc3Bhbj46IEZvbnQgc2l6ZXMgaW4gYSB0YWJsZSByb3cgKGRlZmF1bHQ6IDEyKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+dGFibGUgZGV0YWlsIGZvbnQgc2l6ZTwvc3Bhbj46IEZvbnQgc2l6ZSBmb3IgdGFibGUgZGV0YWlscyAoZGVmYXVsdDogMTIpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj50YWJsZSBmb290ZXIgZm9udCBzaXplPC9zcGFuPjogRm9udCBzaXplIGluIHRhYmxlIGZvb3RlciAoZGVmYXVsdDogMTIpPC9saT4KPC91bD4KPHA+PGk+KCopSSB0IGlzIHJlY29tbWVuZGVkIHRvIGhhdmUgYSBoZWlnaHQgdGhhdCBpcyBhcHByb3hpbWF0ZWx5IHR3aWNlIHRoZSBkcmF3aW5nIGhlaWdodC48L2k+PGJyPgogICAgPGk+KCoqKSBJZiB0aGUgbGluZSBicmVhayBpcyBhY3RpdmUsIHRoZSBsaW5lIG9mIGNoYXJhY3RlcnMgMS41IHRpbWVzIHRoZSBzaXplIG9mIHRoZSBmb250IGlzIHJlY29tbWVuZGVkIGFzIHRoZQogICAgICAgIGhpZ2hlc3QgdmFsdWUuPC9pPjwvcD4KCjxwPkFwcGVhcmFuY2U6PC9wPgo8dWw+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Zm9udCBmYW1pbHk8L3NwYW4+OiBGb250IGZhbWlseSAoZGVmYXVsdDogQXJpYWwpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5nbG9iYWwgYm9yZGVyIGNvbG9yczwvc3Bhbj46IFNvdXJjZSBmb3IgZnJhbWUgY29sb3IgKGRlZmF1bHQ6IFNZU1RFTS5HTE9CQUxTLmF0dkJvcmRlckNvbG9yKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Z2xvYmFsIGZpbGwgY29sb3JzPC9zcGFuPjogU291cmNlIGZvciBjb2xvciAoZGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2RmlsbENvbG9yKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Z2xvYmFsIGZvbnQgY29sb3JzPC9zcGFuPjogU291cmNlIGZvciBmb250IGNvbG9yIChkZWZhdWx0OiBTWVNURU0uR0xPQkFMUy5hdHZGb250Q29sb3IpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5nbG9iYWwgc3ltYm9sIGNvbG9yczwvc3Bhbj46IFNvdXJjZSBmb3IgSWNvbiBDb2xvciAoRGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2U3ltYm9sQ29sb3IpPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5nbG9iYWwgaW5hY3RpdmUgY29sb3JzPC9zcGFuPjogU291cmNlIGZvciBpbmFjdGl2ZSBDb2xvciAoRGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2SW5hY3RpdmVDb2xvcik8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmdsb2JhbCB0YWJsZSBjb2xvcnM8L3NwYW4+OiBTb3VyY2UgZm9yIHRhYmxlIGNvbG9ycyAoZGVmYXVsdDogU1lTVEVNLkdMT0JBTFMuYXR2T2JqZWN0RGlzcGxheXMuQmFzZVRhYmxlLkNvbG9yQ29uZmlnKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Y3VzdG9tIHRoZW1lPC9zcGFuPjogT3B0aW9uYWwgQ1NTIHBhdGggZm9yIGN1c3RvbSB0aGVtZSAoZGVmYXVsdDogYXR2aXNlVGhlbWUpPC9saT4KPC91bD4KCjxwPk9wdGlvbnM6PC9wPgo8dWw+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+Y29sdW1ucyByZW9yZGVyYWJsZTwvc3Bhbj46IEFsbG93IG1vdmluZyBjb2x1bW5zIChkZWZhdWx0OiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+cGFnaW5nPC9zcGFuPjogRGlzcGxheSBvZiBwYWdlIG5hdmlnYXRpb24gKGRlZmF1bHQ6IHRydWUpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5maWx0ZXIgYmFyIGVuYWJsZWQ8L3NwYW4+OiBTaG93IHRhYmxlIGZpbHRlciAoZGVmYXVsdDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciByZWd1bGFyIGV4cHJlc3Npb25zPC9zcGFuPjogRmlsdGVyIGZ1bmN0aW9uIHVzZXMgUmVndWxhciBFeHByZXNzaW9ucyAoZGVmYXVsdDogZmFsc2UsICoqKik8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciB1c2UgcGxhY2Vob2xkZXI8L3NwYW4+OiBBY3RpdmF0aW9uIG9mIHRoZSAmcXVvdDsqJnF1b3Q7IHBsYWNlaG9sZGVyIGluIHRoZSBzZWFyY2ggZnVuY3Rpb248L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciBjYXNlIHNlbnNpdGl2ZTwvc3Bhbj46IENhc2Utc2Vuc2l0aXZlIChkZWZhdWx0OiBmYWxzZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmZpbHRlciBtaW5pbXVtIGxlbmdodDwvc3Bhbj46IE1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYmVmb3JlIHRoZSBmaWx0ZXIgYmVjb21lcyBhY3RpdmUgKGRlZmF1bHQ6IDEpPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5maWx0ZXIgc3RhcnQgZGVsYXk8L3NwYW4+OiBEZWxheSBvZiB0aGUgYXV0b21hdGljIGZpbHRlcmluZyBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDEwMDAsIHN3aXRjaGluZyBvZmYgdGhlIGF1dG9tYXRpYyB3aXRoIDApPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zaG93IHJ1bnRpbWUgbW9kZTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIHJ1bnRpbWUgbW9kZSBpbiB0aGUgc3RhdHVzIGJhciAoZGVmYXVsdDogdHJ1ZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPm11bHRpc2VsZWN0PC9zcGFuPjogQWN0aXZhdGlvbiBvZiB0aGUgbXVsdGlwbGUgc2VsZWN0aW9uIChkZWZhdWx0OiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+bXVsdGlzZWxlY3Qgb24gY2VsbCBjbGljazwvc3Bhbj46IE11bHRpcGxlIHNlbGVjdGlvbiwgbWFya2luZyBieSBjbGlja2luZyBvbiBjZWxsIChkZWZhdWx0OiBmYWxzZSk8L2xpPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPmNlbGwgbGluZWJyZWFrPC9zcGFuPjogQWxsb3cgbGluZSBicmVhayBpbiBjb2x1bW5zIChkZWZhdWx0OiBmYWxzZSwgKiopPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5hbGxvdyBkaXJlY3QgaW5wdXQ8L3NwYW4+OiBzZWxlY3QgIlllcyIgaWYgeW91IHdhbnQgdG8gZGlyZWN0bHkgZW50ZXIgY2hhcmFjdGVycyBpbiB0aGUgY29udHJvbCB3aXRob3V0IG9wZW5pbmcgdGhlIFNWRyBLZXlib2FyZC48L2xpPgo8L3VsPgo8cD48aT4oKiopIElmIHRoZSBsaW5lIGJyZWFrIGlzIGFjdGl2ZSwgdGhlIGxpbmUgb2YgY2hhcmFjdGVycyAxLjUgdGltZXMgdGhlIHNpemUgb2YgdGhlIGZvbnQgaXMgcmVjb21tZW5kZWQgYXMgdGhlCiAgICBoaWdoZXN0IHZhbHVlLjwvaT48YnI+CiAgICA8aT4oKioqKSBXYXJuaW5nOiBGaWx0ZXJpbmcgd2l0aCB0aGUgaGVscCBvZiBSZWd1bGFyIEV4cHJlc3Npb25zIGNhbiBsZWFkIHRvIGEgbGFyZ2UgZHJvcCBpbiBwZXJmb3JtYW5jZSBmb3IgbGFyZ2UKICAgICAgICBhbW91bnRzIG9mIGRhdGEhPC9pPjxicj4KPC9wPgoKPHA+TWVudSBvcHRpb25zOjwvcD4KPHVsPgogICAgPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnNob3cgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIG1lbnUgYnV0dG9uIChkZWZhdWx0OiB0cnVlKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+bWVudSBoZWlnaHQ8L3NwYW4+OiBIZWlnaHQgb2YgdGhlIG1lbnUgd2hlbiBvcGVuZWQgaW4gcGl4ZWxzIChkZWZhdWx0OiAzMDApPC9saT4KICAgIDxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5tZW51IHdpZHRoPC9zcGFuPjogIFdpZHRoIG9mIHRoZSBtZW51IHdoZW4gb3BlbmVkIGluIHBpeGVscyAoZGVmYXVsdDogMTUwKTwvbGk+CiAgICA8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c2hvdyBwaWNrZXIgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIGNvbHVtbiBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuIChEZWZhdWx0OiB0cnVlKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c2hvdyBmaWx0ZXIgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIGZpbHRlciBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuIChEZWZhdWx0OiB0cnVlKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c2hvdyBleHBvcnQgbWVudTwvc3Bhbj46IERpc3BsYXkgb2YgdGhlIGV4cG9ydCBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuIChEZWZhdWx0OiB0cnVlKTwvbGk+CjwvdWw+Cgo8aDI+Tm90ZTwvaDI+CjxwPjxiPkZyb20gdmVyc2lvbiAzLjQgc3ZnIGljb25zIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIGluIGZvb3Rlci4gUGxlYXNlIG9ubHkgdXNlIG1vcmUgc3ltYm9scyBmcm9tIHRoZSBsaWJyYXJ5IG9mIEZvbnQgQXdlc29tZSBGcmVlLjwvYj48L3A+Cgo8cD5Gb290ZXIgb3B0aW9uczo8L3A+Cjx1bD4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgZmlyc3QgcGFnZTwvc3Bhbj46IFN5bWJvbCB0byBvcGVuIHRoZSBmaXJzdCBwYWdlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWZhc3QtYmFja3dhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgcHJldmlvdXMgcGFnZTwvc3Bhbj46IFN5bWJvbCB0byBvcGVuIHRoZSBwcmV2aW91cyBwYWdlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtYmFja3dhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgcGF1c2U8L3NwYW4+OiBTeW1ib2wgZm9yIHBhdXNlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXBhdXNlIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c3ltYm9sIHN0b3A8L3NwYW4+OiBTeW1ib2wgZm9yIHBhdXNlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0b3AiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbmV4dCBwYWdlPC9zcGFuPjogU3ltYm9sIHRvIHNjcm9sbCB0byB0aGUgbmV4dCBwYWdlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN0ZXAtZm9yd2FyZCImZ3Q7Jmx0Oy9pJmd0OykgPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbGFzdCBwYWdlPC9zcGFuPjogU3ltYm9sIHRvIG9wZW4gdGhlIGxhc3QgcGFnZSAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1mYXN0LWZvcndhcmQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbGFvZCBwYWdlczwvc3Bhbj46IFN5bWJvbCBmb3IgbG9hZGluZyB0aGUgbmV4dCBwYWdlcyBpbiBtYW51YWwgbW9kZSAoU3RhbmRhcmQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtZG93bmxvYWQiJmd0OyZsdDsvaSZndDspPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgc2VhcmNoPC9zcGFuPjogU3ltYm9sIGZvciBzZWFyY2ggKGRlZmF1bHQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtc2VhcmNoIiZndDsmbHQ7L2kmZ3Q7KTwvbGk+CgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnN5bWJvbCB0cnVuY2F0ZTwvc3Bhbj46IFN5bWJvbCB3aGVuIHJlYWNoaW5nIHRoZSBvdmVyZmxvdyAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1iYW4iJmd0OyZsdDsvaSZndDsgKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c3ltYm9sIHRyaWdnZXJlZDwvc3Bhbj46IFN5bWJvbCBmb3IgdHJpZ2dlciBtb2RlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLWFuZ2xlLWRvdWJsZS1kb3duIiZndDsmbHQ7L2kmZ3Q7ICk8L2xpPgoJPGxpPjxzcGFuIGNsYXNzPSJwYXJhbWV0ZXIiPnN5bWJvbCBjb250aW51ZTwvc3Bhbj46IFN5bWJvbCBmb3IgY29udGludWUgbW9kZSAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1jb2cgZmEtc3BpbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbGl2ZTwvc3Bhbj46IFN5bWJvbCBmb3IgbGl2ZSBtb2RlIChkZWZhdWx0OiAmbHQ7aSBjbGFzcz0iZmFzIGZhLXN5bmMgZmEtc3BpbiImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KCTxsaT48c3BhbiBjbGFzcz0icGFyYW1ldGVyIj5zeW1ib2wgbWFudWFsbHk8L3NwYW4+OiBTeW1ib2wgZm9yIG1hbnVhbGx5IG1vZGUgKGRlZmF1bHQ6ICZsdDtpIGNsYXNzPSJmYXMgZmEtY2hlY2siJmd0OyZsdDsvaSZndDsgKTwvbGk+Cgk8bGk+PHNwYW4gY2xhc3M9InBhcmFtZXRlciI+c3ltYm9sIGRvbmU8L3NwYW4+OiBTeW1ib2wgZm9yIGFsbCBkYXRhIGxvYWRlZCAoZGVmYXVsdDogJmx0O2kgY2xhc3M9ImZhcyBmYS1kb3dubG9hZCImZ3Q7Jmx0Oy9pJmd0OyApPC9saT4KPC91bD4KTm90ZTogKiA9IFNZU1RFTS5MSUJSQVJZLkFUVklTRS5PQkpFQ1RESVNQTEFZUwoKPGgxPlF1aWNrIHJlZmVyZW5jZTwvaDE+CjxoMj5UYWJsZSBjb25maWd1cmF0aW9uIGZvciBhIHNpbXBsZSBkYXRhIHN0cnVjdHVyZTwvaDI+CjxwPkRyYWcgdGhlIHNwcmVhZHNoZWV0IGRpc3BsYXkgaW50byB0aGUgcGFyZW50IGRpc3BsYXkgYW5kIG9wZW4gdGhlIFNjcmlwdCBFZGl0b3IgZm9yIHRoZSBwYXJlbnQgZGlzcGxheS48L3A+CjxwcmU+CiAgICAvKiBMb2FkaW5nIHRoZSB0YWJsZSByZXNvdXJjZXMgKi8KICAgIHdlYk1JLnRhYmxlLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24gKCkgewoKICAgICAgICAvKiBDcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgICB2YXIgY29uZmlnID0gW107CgogICAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkICovCiAgICAgICAgY29uZmlnWyJjb2x1bW5zIl0gPQogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7ICAgaWQ6ICJpZCIsIG5hbWU6ICJJRCIsIGZpZWxkOiAiaWQiLCBzb3J0YWJsZTogdHJ1ZSwgZmlsdGVyOiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7ICAgaWQ6ICJhZGRyZXNzIiwgbmFtZTogIkFkZHJlc3MiLCBmaWVsZDogImFkZHJlc3MiLCBzb3J0YWJsZTogdHJ1ZSwgZmlsdGVyOiB0cnVlIH0sCiAgICAgICAgICAgICAgICB7ICAgaWQ6ICJ2YWx1ZSIsIG5hbWU6ICJXZXJ0IiwgZmllbGQ6ICJ2YWx1ZSIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfQogICAgICAgICAgICBdOwoKICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBydW50aW1lIGJlaGF2aW9yICovCiAgICAgICAgY29uZmlnWyJtb2RlIl0gPSAib25jZSI7CgogICAgICAgIC8qIEV4YW1wbGUgc2V0IG9mIGRhdGEgKi8KICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgIGRhdGEucmVzdWx0ID0gWwogICAgICAgICAgICB7IGlkOjAsIGFkZHJlc3M6ICJub2RlIDEiLCB2YWx1ZTogMTIzIH0sCiAgICAgICAgICAgIHsgaWQ6MSwgYWRkcmVzczogIm5vZGUgMiIsIHZhbHVlOiA0NTYgfSwKICAgICAgICAgICAgeyBpZDoyLCBhZGRyZXNzOiAibm9kZSAzIiwgdmFsdWU6IDc4OSB9LAogICAgICAgICAgICAuLi4KICAgICAgICBdOwoKICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBkYXRhIHF1ZXJ5ICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBpZHMgPSBzZWxmLmFkZERhdGEoZGF0YSk7CiAgICAgICAgICAgIH07CgogICAgICAgIC8qIFJlZ2lzdHJhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgICAgIHdlYk1JLnRhYmxlLnJlZ2lzdGVyKCJteVRhYmxlTmFtZSIsICJjb25maWciLCAgY29uZmlnKTsKICAgICAgICB3ZWJNSS50YWJsZS5zZXRSZWFkeSgibXlUYWJsZU5hbWUiLCAiY29uZmlnIik7CiAgICB9KTsKPC9wcmU+CjxwPlNhdmUgdGhlIGNvZGUgb2YgdGhlIHBhcmVudCBkaXNwbGF5IGFuZCBwYXJhbWV0ZXJpemUgdGhlIHRhYmxlIGFzIHVzdWFsLiBFbnRlciAibXlUYWJsZU5hbWUiIGF0IHRoZSB0YWJsZSBuYW1lLjwvcD4KPGgyPlRhYmxlIGNvbmZpZ3VyYXRpb24gZm9yIGRhdGEgcXVlcmllcyAoZS5nLiB3ZWJNSS5kYXRhLnJlYWQpPC9oMj4KPHA+RHJhZyB0aGUgc3ByZWFkc2hlZXQgZGlzcGxheSBpbnRvIHRoZSBwYXJlbnQgZGlzcGxheSBhbmQgb3BlbiB0aGUgU2NyaXB0IEVkaXRvciBmb3IgdGhlIHBhcmVudCBkaXNwbGF5LjwvcD4KPHByZT4KICAgIC8qIExvYWRpbmcgdGhlIHRhYmxlIHJlc291cmNlcyAqLwogICAgd2ViTUkudGFibGUubG9hZFJlc291cmNlcyhmdW5jdGlvbiAoKSB7CgogICAgICAgIC8qIENyZWF0ZSB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgICAgIHZhciBjb25maWcgPSBbXTsKCiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgY29sdW1ucyB0byBiZSBkaXNwbGF5ZWQgKi8KICAgICAgICBjb25maWdbImNvbHVtbnMiXSA9CiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsgICBpZDogImlkIiwgbmFtZTogIklEIiwgZmllbGQ6ICJpZCIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogImFkZHJlc3MiLCBuYW1lOiAiQWRkcmVzcyIsIGZpZWxkOiAiYWRkcmVzcyIsIHNvcnRhYmxlOiB0cnVlLCBmaWx0ZXI6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgICBpZDogInZhbHVlIiwgbmFtZTogIldlcnQiLCBmaWVsZDogInZhbHVlIiwgc29ydGFibGU6IHRydWUsIGZpbHRlcjogdHJ1ZSB9CiAgICAgICAgICAgIF07CgogICAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgdGhlIHJ1bnRpbWUgYmVoYXZpb3IgKi8KICAgICAgICBjb25maWdbIm1vZGUiXSA9ICJvbmNlIjsKCiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgZGF0YSBxdWVyeSAqLwogICAgICAgIGNvbmZpZ1siZGF0YVJlcXVlc3RGdW5jdGlvbiJdID0KICAgICAgICAgICAgZnVuY3Rpb24gY3VzdG9tRGF0YVJlcXVlc3QoY29udGludWF0aW9uKSB7CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgICAgICB3ZWJNSS5kYXRhLnJlYWQoCiAgICAgICAgICAgICAgICAgICAgIllPVVJfTk9ERV9BRERSRVNTIiwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVxdWVzdFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc3VsdCA9IHJlcXVlc3RSZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZHMgPSBzZWxmLmFkZERhdGEoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgIC8qIFJlZ2lzdHJhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgICAgIHdlYk1JLnRhYmxlLnJlZ2lzdGVyKCJteVRhYmxlTmFtZSIsICJjb25maWciLCAgY29uZmlnKTsKICAgICAgICB3ZWJNSS50YWJsZS5zZXRSZWFkeSgibXlUYWJsZU5hbWUiLCAiY29uZmlnIik7CiAgICB9KTsKPC9wcmU+CjxwPlNhdmUgdGhlIGNvZGUgb2YgdGhlIHBhcmVudCBkaXNwbGF5IGFuZCBwYXJhbWV0ZXJpemUgdGhlIHRhYmxlIGFzIHVzdWFsLiBFbnRlciAibXlUYWJsZU5hbWUiIGF0IHRoZSB0YWJsZSBuYW1lLjwvcD4KPGgyPlRhYmxlIGNvbmZpZ3VyYXRpb24gZm9yIGxpdmUgZGF0YTwvaDI+CjxwPkRyYWcgdGhlIHNwcmVhZHNoZWV0IGRpc3BsYXkgaW50byB0aGUgcGFyZW50IGRpc3BsYXkgYW5kIG9wZW4gdGhlIFNjcmlwdCBFZGl0b3IgZm9yIHRoZSBQYXJlbnQgZGlzcGxheS4KICAgIEVudGVyIHRoZSBjb25maWd1cmF0aW9uIGZvciBzaW1wbGUgZGF0YSBxdWVyaWVzLiBUaGVuIGNoYW5nZSB0aGUgbW9kZSBhbmQgbW9kaWZ5IHRoZQogICAgZGF0YSBxdWVyeSBhcyBmb2xsb3dzLgo8L3A+CjxwcmU+CiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgcnVudGltZSBiZWhhdmlvciAqLwogICAgICAgIGNvbmZpZ1sibW9kZSJdID0gImxpdmUiOwoKICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBkYXRhIHF1ZXJ5ICovCiAgICAgICAgY29uZmlnWyJkYXRhUmVxdWVzdEZ1bmN0aW9uIl0gPQogICAgICAgICAgICBmdW5jdGlvbiBjdXN0b21EYXRhUmVxdWVzdChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIHNlbGYuc3Vic2NyaWJlSUQgPSB3ZWJNSS5kYXRhLnN1YnNjcmliZSgKICAgICAgICAgICAgICAgICAgICAiWU9VUl9OT0RFX0FERFJFU1MiLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXF1ZXN0UmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0ID0gcmVxdWVzdFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHNlbGYuYWRkRGF0YShkYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgd2ViTUkuYWRkT251bmxvYWQoCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB3ZWJNSS5kYXRhLnVuc3Vic2NyaWJlKHNlbGYuc3Vic2NyaWJlSUQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CjwvcHJlPgo8aDI+VGFibGUgY29uZmlndXJhdGlvbiBmb3IgIkNvbnRpbnVhdGlvbiBQb2ludHMiIChjb250aW51ZSAvIHRyaWdnZXIpPC9oMj4KPHA+RHJhZyB0aGUgc3ByZWFkc2hlZXQgZGlzcGxheSBpbnRvIHRoZSBwYXJlbnQgZGlzcGxheSBhbmQgb3BlbiB0aGUgU2NyaXB0IEVkaXRvciBmb3IgdGhlIFBhcmVudCBkaXNwbGF5LgogICAgRW50ZXIgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHNpbXBsZSBkYXRhIHF1ZXJpZXMuIFRoZW4gY2hhbmdlIHRoZSBtb2RlIGFuZCBtb2RpZnkgdGhlCiAgICBkYXRhIHF1ZXJ5IGFzIGZvbGxvd3MuCjwvcD4KPHByZT4KICAgICAgICAvKiBDb25maWd1cmF0aW9uIG9mIHRoZSBydW50aW1lIGJlaGF2aW9yICovCiAgICAgICAgY29uZmlnWyJtb2RlIl0gPSAiY29udGludWUiOyAvLyA8PDwgZm9yIHRoZSB0cmlnZ2VyIG1vZGUgcmVwbGFjZSAiY29udGludWUiIHdpdGggInRyaWdnZXJlZCIKCiAgICAgICAgLyogQ29uZmlndXJhdGlvbiBvZiB0aGUgZGF0YSBxdWVyeSAqLwoJCWNvbmZpZ1siZGF0YVJlcXVlc3RGdW5jdGlvbiJdID0KCQkJZnVuY3Rpb24gY3VzdG9tRGF0YVJlcXVlc3QoY29udGludWF0aW9uKSB7CgkJCQl2YXIgc2VsZiA9IHRoaXM7CgkJCQlpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCQkJCWZpbHRlciA9IGNvbnRpbnVhdGlvbi5DUC52YWx1ZTsKCQkJCQl3ZWJNSS5kYXRhLnF1ZXJ5TmV4dCgKCQkJCQkJZmlsdGVyLAoJCQkJCQlhZGREYXRhVG9Db250cm9sbGVyCgkJCQkJKTsKCQkJCX0gZWxzZSB7CgkJCQkJZmlsdGVyID0gewoJCQkJCQlhZGRyZXNzOiBbImc6KllPVVJfTk9ERV9BRERSRVNTKiJdLAoJCQkJCQlzZWxlY3Q6IFsidjpwcmlvcml0eSIsICJ2OnZhbHVlIiwgInY6dXNlcm5hbWUiLCAidjphZGRyZXNzIiwgInY6dGltZXN0YW1wIiwgInY6dHlwZSIsICJ2OnN0YXR1cyIsICJ2OlJlcGxhY2VtZW50TmFtZXMiLCAidjpSZXBsYWNlbWVudFZhbHVlcyJdLAoJCQkJCQl0eXBlOiBbInY6MSJdLAoJCQkJCQludW1yb3dzOlsidjoxMDAwIl0KCQkJCQl9OwoJCQkJCXdlYk1JLmRhdGEucXVlcnlGaWx0ZXIoCgkJCQkJCWZpbHRlciwKCQkJCQkJYWRkRGF0YVRvQ29udHJvbGxlcgoJCQkJCSk7CgkJCQl9CgkJCQlmdW5jdGlvbiBhZGREYXRhVG9Db250cm9sbGVyKHJlcXVlc3RSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlcXVlc3RSZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgIC8qIEFkZGluZyAiQ29udGludWF0aW9uIiBpbmZvcm1hdGlvbnMgKi8KCQkJCQlpZiAodHlwZW9mIGRhdGEuTW9yZSAhPSAidW5kZWZpbmVkIiAmJiBkYXRhLk1vcmUgIT0gZmFsc2UgJiYgZGF0YS5jb250aW51YXRpb25wb2ludCA+IDApIHsKCQkJCQkJZGF0YS5DUCA9IHt9OwoJCQkJCQlkYXRhLkNQLnZhbHVlID0gcmVxdWVzdFJlc3VsdC5jb250aW51YXRpb25wb2ludDsKCQkJCQl9IGVsc2UgewoJCQkJCQlkYXRhLk1vcmUgPSBmYWxzZTsKCQkJCQl9CgoJCQkJCXZhciBpZHMgPSBzZWxmLmFkZERhdGEoZGF0YSk7CgkJCQl9CgkJCX07CgogICAgICAgIC8qIENvbmZpZ3VyYXRpb24gb2YgdGhlIHJlbGVhc2UgKi8KICAgICAgICBjb25maWdbImRhdGFSZWxlYXNlRnVuY3Rpb24iXSA9CiAgICAgICAgICAgIGZ1bmN0aW9uIGRhdGFSZWxlYXNlRnVuY3Rpb24oY29udGludWF0aW9uKSB7CgkgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbiAhPSAidW5kZWZpbmVkIiAmJiBjb250aW51YXRpb24uQ1AgIT0gbnVsbCkgewoJCSAgICAgICAgICAgIHdlYk1JLmRhdGEucXVlcnlSZWxlYXNlKGNvbnRpbnVhdGlvbi5DUC52YWx1ZSk7CgkgICAgICAgIH0KICAgICAgICB9Cgo8L3ByZT4KCjxoMj5BY2Nlc3MgdG8gdGFibGUgY29udGVudHM8L2gyPgo8cD5UaGUgZWFzaWVzdCB3YXkgdG8gYWNjZXNzIHRhYmxlIGNvbnRlbnRzIGlzIHRvIHVzZSB0aGUgb25DbGlja0NhbGxiYWNrIGNvbmZpZ3VyYXRpb24uCglWaWEgdGhpcyBjYWxsYmFjaywgdGhlIGV2ZW50IGFuZCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGVkIGl0ZW0gY2FuIGJlIGVudGVyZWQgaW4gYSB1c2VyLWRlZmluZWQgb25lCglGdW5jdGlvbiBhcmUgcHJvY2Vzc2VkIChlLmcuLCBjYWxsaW5nIHlvdXIgb3duIGRpYWxvZ3MpPC9wPgo8cHJlPgogICAgLyogTG9hZGluZyB0aGUgdGFibGUgcmVzb3VyY2VzICovCiAgICB3ZWJNSS50YWJsZS5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLyogQ3JlYXRlIHRoZSBjb25maWd1cmF0aW9uICovCiAgICAgICAgLi4uCgogICAgICAgIGNvbmZpZ1sib25DbGlja0NhbGxiYWNrIl0gPSBmdW5jdGlvbihlLCBpbmZvKXsKICAgICAgICAgIHZhciBpdGVtID0gaW5mby5pdGVtOwogICAgICAgICAgdmFyIHJvdyA9IGluZm8ucm93SW5kZXg7CiAgICAgICAgICB2YXIgY29sdW1uID0gaW5mby5jb2x1bW47CgogICAgICAgICAgdmFyIGlkID0gaXRlbS5pZDsKICAgICAgICAgIGl0ZW0udmFsdWUgPSAiY2hhbmdlZCB2YWx1ZSI7CgogICAgICAgICAgLyogdXBkYXRlL2RlbGV0ZS93aW5kb3cgKi8KICAgICAgICAgIGlmKGNvbHVtbi5pZCA9PSAidGltZXN0YW1wIil7CiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci51cGRhdGVEYXRhKGlkLCBpdGVtKTsKICAgICAgICAgIH0gZWxzZSBpZihjb2x1bW4uaWQgPT0gInZhbHVlIil7CiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci5yZW1vdmVEYXRhKGlkKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9wZW5NeVdpbmRvd0Z1bmt0aW9uVG9FZGl0KGl0ZW0pOwogICAgICAgICAgfQogICAgICAgIH0KCgkJLyogUmVnaXN0cmF0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uICovCiAgICAgICAgLi4uCgogICAgfSk7CjwvcHJlPgoKPGgyPlNlYXJjaCBmb3IgdmFsdWVzID8/aW4gdGhlIHRhYmxlPC9oMj4KPHA+VGhlIHNlYXJjaCAoYXR0cmlidXRlLCB2YWx1ZSwgZXhhY3RTZWFyY2gpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHNlYXJjaCBmb3IgdmFsdWVzID8/aW4gdGhlIHRhYmxlLgoJSW4gdGhlIGNhc2Ugb2YgYSBoaXQsIHRoZSBmb3VuZCBpdGVtcyBhcmUgcmV0dXJuZWQgaW4gYW4gYXJyYXkuPC9wPgo8cHJlPgogIHdlYk1JLnRhYmxlLndhaXRSZWFkeSgibXlUYWJsZU5hbWUiLCAiY29udHJvbGxlciIsIGZ1bmN0aW9uICgpIHsKCiAgICB0YWJsZUNvbnRyb2xsZXIgPSB3ZWJNSS50YWJsZS5yZXF1ZXN0KCJteVRhYmxlTmFtZSIsICJjb250cm9sbGVyIik7CiAgICB2YXIgaXRlbUFycmF5ID0gdGFibGVDb250cm9sbGVyLnNlYXJjaCgidGltZXN0YW1wIiwgMTU1Mzc4NTExMDUwMCwgdHJ1ZSk7CgogICAgdmFyIGlkID0gaXRlbUFycmF5WzBdLmlkOwogICAgaXRlbUFycmF5WzBdLnZhbHVlID0gImNoYW5nZWQgdmFsdWUiOwoKICAgIC8qIHVwZGF0ZSAqLwogICAgdGFibGVDb250cm9sbGVyLnVwZGF0ZURhdGEoaWQsIGl0ZW1BcnJheVswXSk7CgogICAgLyogZGVsZXRlICovCiAgICB0YWJsZUNvbnRyb2xsZXIucmVtb3ZlRGF0YShpZCk7CgogIH0pOwo8L3ByZT4KCgoKPGgyPlRpbWVzdGFtcCBjb252ZXJzYXRpb248L2gyPgo8cD5XaXRoIGF0dmlzZSAzLjMuMiB0aGUgdGltZXN0YW1wIG9mICJkYXRldGltZSIgY29sdW1ucyBpcyBubyBsb25nZXIgZGVsaXZlcmVkIGFzIHN0cmluZy4gSXQgaXMgbm93IG5lY2Vzc2FyeSB0byBmb3JtYXQgdGhlIHRpbWVzdGFtcCB0byBhIHN0cmluZyBpbnNpZGUgdGhlIHRhYmxlIHdpdGggdGhlIGdpdmVuIGZvcm1hdHRlci48L3A+CjxwPkV4YW1wbGU6PC9wPgo8cHJlPgoJZnVuY3Rpb24gX21ha2VDb252ZXJzaW9ucyhmb3JtYXQsIHZhbHVlKSB7CglpZiAoZm9ybWF0WzBdID09ICJkYXRldGltZSIpIHsKCQlpZiAodmFsdWUpIHsKCQkJaWYgKHR5cGVvZiB2YWx1ZSA9PSAic3RyaW5nIiAmJiB2YWx1ZS5pbmRleE9mKCItIikgPiAtMSkJCS8vaWdub3JlIGFscmVhZHkgZm9ybWF0dGVkIHZhbHVlcwoJCQkJcmV0dXJuIHZhbHVlOwoKCQkJdmFyIGRhdGUgPSBuZXcgRGF0ZShwYXJzZUludCh2YWx1ZSwgMTApKTsKCQkJdmFsdWUgPSB3ZWJNSS5zcHJpbnRmKCIlZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQuJTAzZCIsIGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXREYXRlKCksIGRhdGUuZ2V0SG91cnMoKSwgZGF0ZS5nZXRNaW51dGVzKCksIGRhdGUuZ2V0U2Vjb25kcygpLCBkYXRlLmdldE1pbGxpc2Vjb25kcygpKTsKCQl9IGVsc2UgewoJCQl2YWx1ZSA9ICIiOwoJCX0KCX0KCXJldHVybiAnPGRpdiBjbGFzcz0ic2xpY2stY2VsbC1pdGVtIj4nK3ZhbHVlKyc8L2Rpdj4nOwoJfQo8L3ByZT4KPGgxPlRhYmxlIGNvbmZpZ3VyYXRpb25zPC9oMT4KPHA+RnVydGhlciBjb25maWd1cmF0aW9uIGhlbHAgY2FuIGJlIGZvdW5kIGluIHRoZSBhdHZpc2UgZG9jdW1lbnRhdGlvbiBhbmQgYXQgYXR2aXNlIExpdmUhPC9wPgo8YnI+CjwvYm9keT4KPC9odG1sPg==</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.OBJECTDISPLAYS.Advanced.slickgrid.table_dataarrays" ExportedBrowseName="1:table_dataarrays" 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.Advanced" BrowseName="1:Advanced">
		<DisplayName Locale="en">Advanced</DisplayName>
		<Description Locale="en">Advanced</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.Advanced.slickgrid" BrowseName="1:slickgrid">
		<DisplayName Locale="en">slickgrid</DisplayName>
		<Description Locale="en">slickgrid</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table_dataarrays" BrowseName="1:table_dataarrays" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">table_dataarrays</DisplayName>
		<Description Locale="en">table_dataarrays</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid</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 xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="788.23" height="640">
 <defs/>
 <metadata>
  <atv:parameter behavior="mandatory" name="dataMode" desc="put data by row or column" valuetype="address" defaultvalue="AGENT.OBJECTS.ArrayModeInt"/>
  <atv:parameter behavior="mandatory" name="series0Title" desc="colmun1 title" valuetype="trstring" defaultvalue="T{data 1}"/>
  <atv:parameter behavior="optional" name="series1Title" desc="colmun2 title" valuetype="trstring" defaultvalue="T{data 2}"/>
  <atv:parameter behavior="optional" name="series2Title" desc="colmun3 title" valuetype="trstring" defaultvalue="T{data 3}"/>
  <atv:parameter behavior="optional" name="series3Title" desc="colmun4 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series4Title" desc="colmun5 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series5Title" desc="colmun6 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series6Title" desc="colmun7 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series7Title" desc="colmun8 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series8Title" desc="colmun9 title" valuetype="trstring"/>
  <atv:parameter behavior="optional" name="series9Title" desc="colmun10 title" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" name="dataArrayType" valuetype="address" defaultvalue="AGENT.OBJECTS.dataArrayType"/>
  <atv:parameter behavior="optional" name="tableArray_md_1" valuetype="address" defaultvalue="AGENT.OBJECTS.TableArr_md_1"/>
  <atv:parameter behavior="optional" name="tableArray_md_2" valuetype="address" defaultvalue="AGENT.OBJECTS.TableArr_md_2"/>
  <atv:parameter behavior="optional" name="tableArray_md_3" valuetype="address" defaultvalue="AGENT.OBJECTS.TableArr_md_3"/>
  <atv:gridconfig gridstyle="lines" width="20" height="20" enabled="false"/>
  <atv:snapconfig width="10" height="10" enabled="false"/>
 </metadata>
 <svg xlink:href="SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table" y="2.613" atv:refpx="397.26" transform="matrix(1.2218,0,0,1,0,0)" id="id_0" width="640" height="640" atv:refpy="322.613" x="5.149">
  <atv:argument name="tableID" value="myAtviseDataTable"/>
  <atv:argument name="globalColorConfig" value="SYSTEM.GLOBALS.atvObjectDisplays.Tables.ColorConfig1"/>
 </svg>
 <script type="text/ecmascript"><![CDATA[var dataMode;

// inital loading of available Nodes
var vars = [
	webMI.query.series0Title,
	webMI.query.series1Title,
	webMI.query.series2Title,
	webMI.query.series3Title,
	webMI.query.series4Title,
	webMI.query.series5Title,
	webMI.query.series6Title,
	webMI.query.series7Title,
	webMI.query.series8Title,
	webMI.query.series9Title
];
vars = vars.filter(item => item !== undefined);
var arrType = webMI.query.dataArrayType;
var arrSrc_md = [
	webMI.query.tableArray_md_1,
	webMI.query.tableArray_md_2,
	webMI.query.tableArray_md_3
];
// #####

webMI.table.loadResources(function() {
var config = [];

// ### BEGIN CONFIGURATION SECTION ###
// configuration of table rows and their options
var columns = [];
columns['id'] = {id: "id", name: "T{Index}", field: "id", sortable: true, filter: true, visible: true, resizable: false};
columns['data1'] = {id: "data1", name: "T{"+webMI.query.series0Title+"}", field: "data1", width:280, sortable: true, filter: true, visible: true, resizable: false};
columns['data2'] = {id: "data2", name: "T{"+webMI.query.series1Title+"}", field: "data2", sortable: true, filter: true, visible: true, resizable: true, sortByDefault:true, sortByDefaultAsc: true};
columns['data3'] = {id: "data3", name: "T{"+webMI.query.series2Title+"}", field: "data3", sortable: true, filter: true, visible: true, resizable: true};
columns['data4'] = {id: "data4", name: "T{"+webMI.query.series3Title+"}", field: "data4", sortable: true, filter: true, visible: true, resizable: true};
columns['data5'] = {id: "data5", name: "T{"+webMI.query.series4Title+"}", field: "data5", sortable: true, filter: true, visible: true, resizable: true};
columns['data6'] = {id: "data6", name: "T{"+webMI.query.series5Title+"}", field: "data6", sortable: true, filter: true, visible: true, resizable: true};
columns['data7'] = {id: "data7", name: "T{"+webMI.query.series6Title+"}", field: "data7", sortable: true, filter: true, visible: true, resizable: true};
columns['data8'] = {id: "data8", name: "T{"+webMI.query.series7Title+"}", field: "data8", sortable: true, filter: true, visible: true, resizable: true};
columns['data9'] = {id: "data9", name: "T{"+webMI.query.series8Title+"}", field: "data9", sortable: true, filter: true, visible: true, resizable: true};
columns['data10'] = {id: "data10", name: "T{"+webMI.query.series9Title+"}", field: "data10", sortable: true, filter: true, visible: true, resizable: true};

// config["columns"] is used for building the defined columns in the table
config["columns"] = [
	columns['id'],
	columns['data1']
];
// #####

var maxseries = vars.length; // Number of available Series Titles / Columns
// creating columns depending on available Titles configs
// pushes the data to config variable of the table (config["columns"])
for(var i=1;i<=maxseries;i++) {
	if(vars[i]!=undefined) { config["columns"].push(columns['data'+(i+1)]); }
}
// #####

config["mode"] = "live"; // live mode for making array data updates possible
config["bufferInterval"] = 50;

// Configuration of the data query for the table
config["dataRequestFunction"] = function customDataRequest(continuation) {
	var that = this;
	var data = {
		result: []
	};	
	var elem = {};
	var arr = [];
	var dataArrType = 1;
	
	// getting subcription for checking if DataMode has changed
	// DataMode switches the state to get the data handled for Rows OR Columns
	that.subscribeDataMode = webMI.data.subscribe(
		webMI.query.dataMode,
		function(e) {
			that.clearData();
			handleDataUpdate();
		}
	);
	
	// getting subscription Status of available predefined Nodes
	// ArrType = switch for used data source Array type (f.e. 1 dimensional or various 2 dimensional arrays, Json Objects)
	// f.e. parameter tableArray_md_1
	that.subscribeArrType = webMI.data.subscribe(arrType,function(requestResult) {
		if(requestResult.value) {
			dataArrType = requestResult.value;
			handleDataUpdate();
		}
	});
	// #####
	
	// getting subscription Status of available predefined Nodes for diff. array types
	// data source Arrays for different Multidimensional Array types
	// f.e. parameter tableArray_md_1,tableArray_md_2,tableArray_md_3,...
	that.subscribeNodes_arrayStructs = webMI.data.subscribe(arrSrc_md,function(requestResult) {					
		if(requestResult.value) {
			handleDataUpdate();
		}
	});
	// #####
	
	// unloads the subsrcibed nodes to update them immediately 
	// by value changes from the source
	webMI.addOnunload(
		function() {
			webMI.data.unsubscribe(that.subscribeDataMode);
			webMI.data.unsubscribe(that.subscribeNodes_arrayStructs);
			webMI.data.unsubscribe(that.subscribeArrType);
		}
	);
	// #####
	
	
	// update handler function for updating the table and set the data of the table to latest state, 
	// depending which Array / Data Mode is used (Column or Row)
	function handleDataUpdate() {
		webMI.data.read(
			webMI.query.dataMode,
				function(e) {
					if(dataArrType==1) { setData_ArrStruct1(elem,data,that,e.value); }
					else if(dataArrType==2) { setData_ArrStruct2(elem,data,that,e.value); }
					else if(dataArrType==3) { setData_ArrStruct3(elem,data,that,e.value); }
					else { setData_ArrStruct1(elem,data,that,e.value); }
				}
			);
	}	
	// #####
	
};


function setData_ArrStruct1(elem,data,that,mode) {
	// Data example: {['aaa'; 'bbb'; 'ccc'; 'ddd'], ['aaaa1'; 'bbb1'; 'ccc1'; 'dddd1'], ['aaaa2'; 'bbb2'; 'ccc2'; 'dddd2']}

	webMI.data.read(
		arrSrc_md[0],
		function(e) {
			that.clearData();
			
			var arrTmp = e.value;
			var arr = [];
			
			arrTmp = arrTmp.toString();
			arrTmp = arrTmp.replace(/\[/g, "").replace(/\]/g, "").replace(/\'/g, "");
			arrTmp = arrTmp.split(",");
					
			for(var n = 0; n < arrTmp.length; n++) {
				arr[n] = arrTmp[n].split(';'); // split on separation symbols
			}
			
			if(mode==1) {
				// adding Data from 2 DIMENSION Array with Column Values, Array = Column
				for(var i = 0; i < arr[0].length; i++) {
					var x=0;
					while(x < arr.length) {
						x++;
						if(arr[x-1][i]!=undefined) { elem["data"+x] = arr[x-1][i]; }
					}
					
					if(arr[0][i]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			} else {
				// adding Data from 2 DIMENSION Array with Row Values, Array = Row
				for(var i = 0; i < arr.length; i++) {
					var x=0;
					while(x < vars.length) {
						x++;
						if(arr[i][x-1]!=undefined) { elem["data"+x] = arr[i][x-1]; }
					}
					
					if(arr[i][0]!=undefined) {
						data.result = elem;
						that.addData(data);
					}						
				}			
			}
		}
	);
	
};

function setData_ArrStruct2(elem,data,that,mode) {
	// Data example: {"data1":["aaa", "bbb", "ccc"], "data2":["aaa2", "bbb2", "ccc2"], "data3":["aaa3", "bbb3", "ccc3"]}
	
	webMI.data.read(
		arrSrc_md[1],
		function(e) {
			that.clearData();
			
			var arrTmp = e.value;
			arrTmp = "{"+arrTmp.toString()+"}";
			arrTmp = JSON.parse(arrTmp);
			var ObjCnt = Object.keys(arrTmp).length;
			var arr = [];
			
			for(var n = 0;n <= ObjCnt-1; n++) {
				arr[n] = arrTmp['data'+(n+1)];
			}
			
			if(mode==1) {
				// adding Data from 2 DIMENSION JSON Object Array Column Values, Array = Column
				for(var i = 0; i < arr.length; i++) {
					var x=0;
					while(x < arr.length) {
						x++;
						if(arr[x-1][i]!=undefined) { elem["data"+x] = arr[x-1][i]; }
					}
					
					if(arr[0][i]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			}
			else {
				// adding Data from 2 DIMENSION Array with Row Values, Array = Row
				for(var i = 0; i < arr.length; i++) {
					var x=0;
					while(x < vars.length) {
						x++;
						if(arr[i][x-1]!=undefined) { elem["data"+x] = arr[i][x-1]; }
					}
					
					if(arr[i][0]!=undefined) {
						data.result = elem;
						that.addData(data);
					}						
				}
			}
		}
	);
	
};


// adding Data from 2 DIMENSION JSON Object Array with Row Values, Array = Row
function setData_ArrStruct3(elem,data,that,mode) {
	// Data example: {"datas": [["aaa", "bbb", "ccc"], ["aaa2", "bbb2", "ccc2"], ["aaaa3", "bbb3", "ccc3"]]}

	webMI.data.read(
		arrSrc_md[2],
		function(e) {
			that.clearData();
			
			var arrTmp = e.value;
			arrTmp = "{"+arrTmp.toString()+"}";					
			arrTmp = JSON.parse(arrTmp);
			arrTmp = arrTmp.datas;				

			if(mode==1) {
				// adding Data from 2 DIMENSION JSON Object Array Column Values, Array = Column
				for(var i = 0; i < arrTmp[0].length; i++) {
					var x=0;
					while(x < arrTmp.length) {
						x++;
						if(arrTmp[x-1][i]!=undefined) { elem["data"+x] = arrTmp[x-1][i]; }
					}
					
					if(arrTmp[0][i]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			} else {
				// adding Data from 2 DIMENSION Array with Row Values, Array = Row
				for(var i = 0; i < arrTmp.length; i++) {
					var x=0;
					while(x < vars.length) {
						x++;
						if(arrTmp[i][x-1]!=undefined) { elem["data"+x] = arrTmp[i][x-1]; }
					}
					
					if(arrTmp[i][0]!=undefined) {
						data.result = elem;
						that.addData(data);
					}
				}
			}
		}
	);
	
};

// ### END CONFIGURATION SECTION ###
webMI.table.register("myAtviseDataTable", "config", config);
webMI.table.setReady("myAtviseDataTable", "config");
});]]]]><![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.Advanced.slickgrid.table_dataseries" ExportedBrowseName="1:table_dataseries" 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.Advanced" BrowseName="1:Advanced">
		<DisplayName Locale="en">Advanced</DisplayName>
		<Description Locale="en">Advanced</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.Advanced.slickgrid" BrowseName="1:slickgrid">
		<DisplayName Locale="en">slickgrid</DisplayName>
		<Description Locale="en">slickgrid</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table_dataseries" BrowseName="1:table_dataseries" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">table_dataseries</DisplayName>
		<Description Locale="en">table_dataseries</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid</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 xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="788.23" height="640">
 <defs/>
 <metadata>
  <atv:parameter behavior="mandatory" name="dataMode" desc="put data by row or column" valuetype="address" defaultvalue="AGENT.OBJECTS.ArrayModeInt"/>
  <atv:parameter behavior="mandatory" group="Series 1" name="series0Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 1" name="series0Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="mandatory" group="Series 2" name="series1Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 2" name="series1Title" desc="title" valuetype="color" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 3" name="series2Node" desc="node" valuetype="display" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 3" name="series2Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 4" name="series3Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 4" name="series3Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 5" name="series4Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 5" name="series4Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 6" name="series5Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 6" name="series5Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 7" name="series6Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 7" name="series6Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 8" name="series7Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 8" name="series7Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 9" name="series8Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 9" name="series8Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series 10" name="series9Node" desc="node" valuetype="address" defaultvalue=""/>
  <atv:parameter behavior="optional" group="Series 10" name="series9Title" desc="title" valuetype="trstring"/>
  <atv:parameter behavior="optional" group="Series - Multidimension DataArray" name="dataArrayType" valuetype="address" defaultvalue="AGENT.OBJECTS.dataArrayType"/>
  <atv:gridconfig gridstyle="lines" width="20" height="20" enabled="false"/>
  <atv:snapconfig width="10" height="10" enabled="false"/>
 </metadata>
 <svg xlink:href="SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table" y="2.613" atv:refpx="397.26" transform="matrix(1.2218,0,0,1,0,0)" id="id_0" width="640" height="640" atv:refpy="322.613" x="5.149">
  <atv:argument name="tableID" value="myAtviseDataTable"/>
  <atv:argument name="globalColorConfig" value="SYSTEM.GLOBALS.atvObjectDisplays.Tables.ColorConfig1"/>
 </svg>
 <script type="text/ecmascript"><![CDATA[var dataMode;

// inital loading of available Nodes
var vars = [
	webMI.query.series0Node,
	webMI.query.series1Node,
	webMI.query.series2Node,
	webMI.query.series3Node,
	webMI.query.series4Node,
	webMI.query.series5Node,
	webMI.query.series6Node,
	webMI.query.series7Node,
	webMI.query.series8Node,
	webMI.query.series9Node
];
vars = vars.filter(item => item !== "");
var arrType = webMI.query.dataArrayType;
// #####

webMI.table.loadResources(function() {
var config = [];

// ### BEGIN CONFIGURATION SECTION ###
// configuration of table rows and their options
var columns = [];
columns['id'] = {id: "id", name: "T{Index}", field: "id", sortable: true, filter: true, visible: true, resizable: false};
columns['data1'] = {id: "data1", name: "T{"+webMI.query.series0Title+"}", field: "data1", sortable: true, filter: true, width:300, visible: true, resizable: false};
columns['data2'] = {id: "data2", name: "T{"+webMI.query.series1Title+"}", field: "data2", sortable: true, filter: true, visible: true, resizable: true, sortByDefault:true, sortByDefaultAsc: true};
columns['data3'] = {id: "data3", name: "T{"+webMI.query.series2Title+"}", field: "data3", sortable: true, filter: true, visible: true, resizable: true};
columns['data4'] = {id: "data4", name: "T{"+webMI.query.series3Title+"}", field: "data4", sortable: true, filter: true, visible: true, resizable: true};
columns['data5'] = {id: "data5", name: "T{"+webMI.query.series4Title+"}", field: "data5", sortable: true, filter: true, visible: true, resizable: true};
columns['data6'] = {id: "data6", name: "T{"+webMI.query.series5Title+"}", field: "data6", sortable: true, filter: true, visible: true, resizable: true};
columns['data7'] = {id: "data7", name: "T{"+webMI.query.series6Title+"}", field: "data7", sortable: true, filter: true, visible: true, resizable: true};
columns['data8'] = {id: "data8", name: "T{"+webMI.query.series7Title+"}", field: "data8", sortable: true, filter: true, visible: true, resizable: true};
columns['data9'] = {id: "data9", name: "T{"+webMI.query.series8Title+"}", field: "data9", sortable: true, filter: true, visible: true, resizable: true};
columns['data10'] = {id: "data10", name: "T{"+webMI.query.series9Title+"}", field: "data10", sortable: true, filter: true, visible: true, resizable: true};

// config["columns"] is used for building the defined columns in the table
config["columns"] = [
	columns['id'],
	columns['data1']
];
// #####

var maxseries = vars.length; // Number of available Series Nodes
// creating columns depending on available Series configs, which include valid Node adresses
// pushes the data to config variable of the table (config["columns"])
for(var i=1;i<maxseries;i++) {
	if(vars[i]!="") { config["columns"].push(columns['data'+(i+1)]); }
}
// #####

config["mode"] = "live"; // live mode for making array data updates possible
config["bufferInterval"] = 50;

// Configuration of the data query for the table
config["dataRequestFunction"] = function customDataRequest(continuation) {
	var that = this;
	var data = {
		result: []
	};
	var row = {};
	var colmn = {};
	var arr = [];
	var dataArrType = 1;
	
	// getting subcription for checking if DataMode has changed
	// DataMode switches the state to get the data handled for Rows OR Columns
	that.subscribeDataMode = webMI.data.subscribe(
		webMI.query.dataMode,
		function(e) {
			that.clearData();
			handleDataUpdate();
		}
	);
	
	// getting subscription Status of available predefined Nodes
	// data source Array of every available Parameter 'Series 0-10', Node Adress
	// 1 Data Soruce Array per Row or Column
	that.subscribeNodes = webMI.data.subscribe(vars,function(requestResult) {					
		if(requestResult.value) {
			handleDataUpdate();
		}
	});
	// #####
	
	// unloads the subsrcibed nodes to update them immediately 
	// by value changes from the source
	webMI.addOnunload(
		function() {
			webMI.data.unsubscribe(that.subscribeDataMode);
			webMI.data.unsubscribe(that.subscribeNodes);
		}
	);
	// #####
	
	
	// update handler function for updating the table and set the data of the table to latest state, 
	// depending which Array / Data Mode is used (Column or Row)
	function handleDataUpdate() {
		webMI.data.read(
			webMI.query.dataMode,
				function(e) {
					
					if(e.value==0) {
						setRow(row,data,that);
					}
					else if(e.value==1) {
						setColmn(colmn,data,that);
					}
					else {
						setRow(row,data,that);
					}	
					
				}
			);
	}	
	// #####
	
};

// adding Data from Array with Row Values, Array = Row
function setRow(row,data,that) {
	// Data example: {'value1-1', 'value1-2', 'value1-3', 'value1-4'}

	webMI.data.read(
		vars,
		function(e) {
			that.clearData();
		
			for (var i = 0; i < e.length; i++) {			
				var n=0;
				while(n < vars.length) {
					n++;
					if(vars[n-1]!="") { row["data"+n] = e[i].value[n-1]; }
				}
				
				data.result = row;
				that.addData(data);
			}

		}
	);
};


// adding Data from Array with Column Values, Array = Column
function setColmn(colmn,data,that) {
	// Data example: {'value1-1', 'value1-2', 'value1-3', 'value1-4'}

	webMI.data.read(
		vars,
		function(e) {
			that.clearData();		

			for (var i = 0; i <= e.length; i++) {
				var n=0;
				while(n < vars.length) {
					n++;
					if(vars[n-1]!="") { colmn["data"+n] = e[n-1].value[i]; }
				}
				
				if(e[0].value[i]!=undefined) {
					data.result = colmn;
					that.addData(data);
				}
			}

		}
	);
};
// ########################


// ### END CONFIGURATION SECTION ###
webMI.table.register("myAtviseDataTable", "config", config);
webMI.table.setReady("myAtviseDataTable", "config");
});]]]]><![CDATA[></script>
</svg>
]]></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.Table_DataArrays" ExportedBrowseName="1:Table_DataArrays" 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.Table_DataArrays" BrowseName="1:Table_DataArrays" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">Table_DataArrays</DisplayName>
		<Description Locale="en">Table_DataArrays</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 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="890" xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" width="1675">
 <defs/>
 <metadata>
  <atv:gridconfig gridstyle="lines" height="20" enabled="false" width="20"/>
  <atv:snapconfig height="10" enabled="false" width="10"/>
 </metadata>
 <svg transform="matrix(1.166,0,0,1.0713,0,0)" x="615.067" id="id_3" atv:refpy="436.096" atv:refpx="1176.694" height="640" xlink:href="SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table_dataarrays" width="788.23" y="87.066">
  <atv:argument name="dataMode" value="AGENT.OBJECTS.ArrayModeInt"/>
  <atv:argument name="series0Title" value="T{data 1}"/>
  <atv:argument name="series1Title" value="T{data 2}"/>
  <atv:argument name="series2Title" value="T{data 3}"/>
 </svg>
 <text transform="matrix(1.519,0,0,1.4652,-12.8506,-75.6085)" x="28.76" font-style="italic" id="id_5" atv:refpy="176.444" atv:refpx="230.298" font-family="Arial" fill="#2ab5b3" font-size="10" y="176.529">Implementing Data of source by Column or Row</text>
 <text transform="matrix(1.519,0,0,1.4652,-12.456,-125.0286)" x="28.5" font-style="italic" id="id_4" atv:refpy="282.678" atv:refpx="97.142" font-family="Arial" fill="#2bb5b3" font-size="10" y="282.763">used Array-Type</text>
 <svg transform="matrix(1.5349,0,0,1,0,0)" x="18.893" id="id_9" atv:refpy="292.091" atv:refpx="151.795" height="30" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" width="160" y="304.091">
  <atv:argument name="base" value="AGENT.OBJECTS.dataArrayType"/>
  <atv:argument name="text1" value="T{json Array Structure 1}"/>
  <atv:argument name="text1value" value="1"/>
  <atv:argument name="text2value" value="2"/>
  <atv:argument name="text3value" value="3"/>
  <atv:argument name="text2" value="T{json Array Structure 2}"/>
  <atv:argument name="text3" value="T{json Array Structure 3}"/>
  <atv:overwrite transform="matrix(0.6515,0,0,1,0,0)" id="focus_frame" width="241.584"/>
  <atv:overwrite transform="matrix(0.6515,0,0,1,0,0)" x="220.584" id="button_stroke"/>
  <atv:overwrite transform="matrix(0.6515,0,0,1,0,0)" x="220.584" id="id_7"/>
  <atv:overwrite transform="matrix(0.6515,0,0,1,0,0)" x="220.584" id="button_bg"/>
  <atv:overwrite transform="matrix(0.6515,0,0,1,0,0)" x="211.084" id="combobox_label"/>
  <atv:overwrite transform="matrix(0.6515,0,0,1,0,0)" id="blinking_frame" width="213.584"/>
  <atv:overwrite transform="matrix(0.6515,0,0,1,0,0)" id="combobox_bg" width="213.584"/>
  <atv:overwrite transform="matrix(0.6515,0,0,1,0,0)" id="id_1" width="243.584"/>
  <atv:overwrite transform="matrix(0.6515,0,0,1,0,0)" id="id_0" width="245.584"/>
 </svg>
 <svg x="178.122" id="id_11" atv:refpy="41.011" atv:refpx="258.122" height="30" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" width="160" y="134.011">
  <atv:argument name="base" value="AGENT.OBJECTS.ArrayModeInt"/>
  <atv:argument name="text1" value="Row"/>
  <atv:argument name="text2" value="Column"/>
  <atv:argument name="text1value" value="0"/>
  <atv:argument name="text2value" value="1"/>
 </svg>
 <foreignObject x="28" id="id_13" height="212.637" width="650" y="351">
  <div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;font-family:Arial;">
   <b style="color:#16a3d9;">Array Type - 2 Dimension without Key:</b>
   <br/>
   <br/>
   <br/>
   <span style="font-size:16px;">
    <i>Example:</i>
   </span>
   <br/>
   <p style="color:#333; font-size:20px;">
    <span style="font-size:24px;">{ </span>
    <span style="font-size:24px;">[</span>'aaa', 'bbb', 'ccc'<span style="font-size:24px;">]</span>, <span style="font-size:24px;">[</span>'aaaa1', 'bbb1', 'ccc1'<span style="font-size:24px;">]</span>, <span style="font-size:24px;">[</span>'aaaa2', 'bbb2', 'ccc2'<span style="font-size:24px;">]</span>, <span style="font-size:24px;">[</span>'aaaa3', 'bbb3', 'ccc3'<span style="font-size:24px;">]</span>
    <span style="font-size:24px;">}</span>
   </p>
  </div>
 </foreignObject>
 <foreignObject x="28" id="id_14" height="293.295" width="640" y="351">
  <div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;font-family:Arial;">
   <b style="color:#16a3d9;">Array Type - 2 Dimension with Key per Subdata:</b>
   <br/>
   <br/>
   <br/>
   <span style="font-size:16px;">
    <i>Example:</i>
   </span>
   <br/>
   <p style="color:#333; font-size:20px;">
    <span style="font-size:24px;">{</span> "data1":<span style="font-size:24px;">[</span>"aaa", "bbb", "ccc"<span style="font-size:24px;">]</span>, "data2":<span style="font-size:24px;">[</span>"aaa2", "bbb2", "ccc2"<span style="font-size:24px;">]</span>, "data3":<span style="font-size:24px;">[</span>"aaa3", "bbb3", "ccc3"<span style="font-size:24px;">] </span>
    <span style="font-size:24px;">}</span>
   </p>
  </div>
 </foreignObject>
 <foreignObject x="28" id="id_15" height="212.637" width="540" y="351">
  <div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;font-family:Arial;">
   <b style="color:#16a3d9;">Array Type - 2 Dimension with Main Key:</b>
   <br/>
   <br/>
   <br/>
   <span style="font-size:16px;">
    <i>Example:</i>
   </span>
   <br/>
   <p style="color:#333; font-size:20px;">
    <span style="font-size:24px;">{ </span>"datas": <span style="font-size:26px;">[ </span>
    <span style="font-size:24px;">[</span>"aaa", "bbb", "ccc"<span style="font-size:24px;">]</span>, <span style="font-size:24px;">[</span>"aaa2", "bbb2", "ccc2"<span style="font-size:24px;">]</span>, <span style="font-size:24px;">[</span>"aaa3", "bbb3", "ccc3"<span style="font-size:24px;">]</span>
    <span style="font-size:26px;"> ]</span>
    <span style="font-size:24px;"> }</span>
   </p>
  </div>
 </foreignObject>
 <text transform="matrix(1.519,0,0,1.4652,-12.456,-61.4819)" x="28.5" id="id_16" atv:refpy="149.006" atv:refpx="99.946" font-family="Arial" fill="#2ab5b3" font-size="12" y="148.162">Datahandling by:</text>
 <text transform="matrix(1.519,0,0,1.4652,-12.456,-111.6931)" x="28.5" id="id_17" atv:refpy="256.943" atv:refpx="83.237" font-family="Arial" fill="#2bb5b3" font-size="12" y="256.097">Data source:</text>
 <text x="378.5" id="id_6" atv:refpy="27" atv:refpx="782.716" font-weight="bold" font-family="Arial" fill="#000088" font-size="18" y="33.5">Slickgrid Table with datasource of multidimenstional object arrays and datahandling by Row or Column</text>
 <script type="text/ecmascript"><![CDATA[webMI.gfx.setVisible("id_13", false);
webMI.gfx.setVisible("id_14", false);
webMI.gfx.setVisible("id_15", false);

webMI.data.subscribe("AGENT.OBJECTS.dataArrayType", function(e) {
	var value = e.value;
	if (value == 1) {
		webMI.gfx.setVisible("id_13", true);
	} else {
		webMI.gfx.setVisible("id_13", false);
	}
	
	if (value == 2) {
		webMI.gfx.setVisible("id_14", true);
	} else {
		webMI.gfx.setVisible("id_14", false);
	}
	
	if (value == 3) {
		webMI.gfx.setVisible("id_15", true);
	} else {
		webMI.gfx.setVisible("id_15", false);
	}
});
]]]]><![CDATA[></script>
 <svg x="1006.667" transform="matrix(1.5,0,0,1,0,0)" id="id_2" atv:refpy="25" atv:refpx="1570" height="30" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Standard.button_open_display" width="80" y="10">
  <atv:argument name="label" value="T{Example Display 1}"/>
  <atv:argument name="display" value="AGENT.DISPLAYS.MAIN.Table_DataSeries"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" id="button_stroke" width="112"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" x="60" id="button_label"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" x="50" id="button_symbol"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" id="button_bg" width="112"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" id="id_2" width="114.5"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" id="id_0" width="119.5"/>
 </svg>
</svg>
]]></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.Table_DataSeries" ExportedBrowseName="1:Table_DataSeries" 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.Table_DataSeries" BrowseName="1:Table_DataSeries" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">Table_DataSeries</DisplayName>
		<Description Locale="en">Table_DataSeries</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 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="890" xmlns:atv="http://webmi.atvise.com/2007/svgext" version="1.2" width="1675">
 <defs/>
 <metadata>
  <atv:gridconfig gridstyle="lines" height="20" enabled="false" width="20"/>
  <atv:snapconfig height="10" enabled="false" width="10"/>
 </metadata>
 <svg transform="matrix(1.166,0,0,1.0713,0,0)" x="613.05" id="id_3" atv:refpy="436.096" atv:refpx="1174.343" height="640" xlink:href="SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.Advanced.slickgrid.table_dataseries" width="788.23" y="87.066">
  <atv:argument name="dataMode" value="AGENT.OBJECTS.ArrayModeInt"/>
  <atv:argument name="series0Node" value="AGENT.OBJECTS.TableArrColmn1"/>
  <atv:argument name="series1Node" value="AGENT.OBJECTS.TableArrColmn2"/>
  <atv:argument name="series2Node" value="AGENT.OBJECTS.TableArrColmn3"/>
  <atv:argument name="series0Title" value="T{data 1}"/>
  <atv:argument name="series1Title" value="T{data 2}"/>
  <atv:argument name="series2Title" value="T{data 3}"/>
  <atv:argument name="series3Title" value="T{data 4}"/>
  <atv:argument name="series4Title" value="T{data 5}"/>
  <atv:argument name="series5Title" value="T{data 6}"/>
  <atv:argument name="series6Title" value="T{data 7}"/>
  <atv:argument name="series7Title" value="T{data 8}"/>
  <atv:argument name="series8Title" value="T{data 9}"/>
  <atv:argument name="series9Title" value="T{data 10}"/>
 </svg>
 <text transform="matrix(1.519,0,0,1.4652,-12.8506,-109.1029)" x="28.76" font-style="italic" id="id_5" atv:refpy="248.444" atv:refpx="230.298" font-family="Arial" fill="#2ab5b3" font-size="10" y="248.529">Implementing Data of source by Column or Row</text>
 <svg x="178.122" id="id_11" atv:refpy="41.011" atv:refpx="258.122" height="30" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.combobox" width="160" y="206.011">
  <atv:argument name="base" value="AGENT.OBJECTS.ArrayModeInt"/>
  <atv:argument name="text1" value="Row"/>
  <atv:argument name="text2" value="Column"/>
  <atv:argument name="text1value" value="0"/>
  <atv:argument name="text2value" value="1"/>
 </svg>
 <foreignObject x="28" id="id_12" height="222.781" width="640" y="326">
  <div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;font-family:Arial;">
   <b style="color:#16a3d9;">Array Type - 1 Dimension:</b>
   <br/>
   <br/>
   <br/>
   <span style="font-size:16px;">
    <i>Example per Series / Node:</i>
   </span>
   <br/>
   <p style="color:#333; font-size:20px;">
    <span style="font-size:24px;">{</span> 'value1-1'<span style="font-size:22px;">,</span> 'value1-2'<span style="font-size:22px;">,</span> 'value1-3'<span style="font-size:22px;">,</span> 'value1-4'<span style="font-size:22px;">,</span> 'value1-5'<span style="font-size:22px;">,</span> 'value1-6' <span style="font-size:24px;">}</span>
   </p>
  </div>
 </foreignObject>
 <text transform="matrix(1.519,0,0,1.4652,-12.456,-94.9763)" x="28.5" id="id_16" atv:refpy="221.006" atv:refpx="99.946" font-family="Arial" fill="#2ab5b3" font-size="12" y="220.162">Datahandling by:</text>
 <text x="362.5" id="id_6" atv:refpy="27" atv:refpx="760.838" font-weight="bold" font-family="Arial" fill="#000088" font-size="18" y="33.5">Slickgrid Table with array datasource of different series nodes, and datahandling by ROW or COLUMN</text>
 <svg x="1006.667" transform="matrix(1.5,0,0,1,0,0)" id="id_2" atv:refpy="25" atv:refpx="1570" height="30" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Standard.button_open_display" width="80" y="10">
  <atv:argument name="label" value="T{Example Display 2}"/>
  <atv:argument name="display" value="AGENT.DISPLAYS.MAIN.Table_DataArrays"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" id="button_stroke" width="112"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" x="60" id="button_label"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" x="50" id="button_symbol"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" id="button_bg" width="112"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" id="id_2" width="114.5"/>
  <atv:overwrite transform="matrix(0.6667,0,0,1,0,0)" id="id_0" width="119.5"/>
 </svg>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
</UANodeSet>
