//
//  File:               HTTP_Test_no_ASPs
//  Description:        To demonstrate how to use the test port
//  Rev:                R8C
//  Prodnr:             CNL 113 469
//  Updated:            2007-11-09
//  Contact:            http://ttcn.ericsson.se
//  Author:             ETH/RZX Eduard Czimbalmos
module HTTP_Test_no_ASPs {

modulepar {
  charstring  HttpServerHostName    := "www.eth.ericsson.se";
  integer     HttpServerPort        := 80;
  boolean     HTTPClientUseSSL      := false;
  integer     HttpServerListenPort  := 1026;
  boolean     HttpServerUseSSL      := false
}

import from HTTPmsg_Types all;
import from HTTPmsg_PortType all;

type component MTC {};

type component HTTP_client {
  port HTTPmsg_PT HTTP_client_port;
};

type component HTTP_server {
  port HTTPmsg_PT HTTP_server_port;
};

//=========================================================================
// Data Types
//=========================================================================

type record of charstring CHARSTRINGS;
type record of octetstring OCTETSTRINGS;

type record of HTTP_client ptcList;


template Half_close h := { client_id := ? };
template HTTPMessage recv_resp := { response := ? };
template HTTPMessage recv_req := { request := ? };
template HTTPMessage recv_err := { erronous_msg := ? };

function TC() runs on HTTP_client
{
/*    var HeaderLines hd := { {header_name := "Host", header_value := HttpServerHostName},
    {header_name := "Connection", header_value := "close" } };
    var HTTPRequest r := { method := "GET", uri := "/x1.xml",
        version_major := 1, version_minor := 1, header := hd, body := omit };*/
  var HeaderLines hd := { {header_name := "Content-Type", header_value := "text/xml"},
    {header_name := "Content-Length", header_value := "508" },
    {header_name := "Expires", header_value := "Sat, 01 Jan 2000 00:00:00 GMT" },
    {header_name := "Pragma", header_value := "no-cache" } };
  var HTTPRequest r := { client_id := omit, method := "POS T", uri := "/",
    version_major := 1, version_minor := 0, header := hd, body := "<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?><!DOCTYPE ANS SYSTEM 'file://mpp50_ans.dtd'><ANS ver=\"5.00\"><PUSH_USER><PUSH_ID>clientPush</PUSH_ID><PUSH_PWD>clientPush</PUSH_PWD></PUSH_USER><LPA><GMT_OFF>+0100</GMT_OFF><POS msid=\"4670112345\"><PD><TIME>20040117132719</TIME><POLYGON><LL_POINT><LAT>N100410</LAT><LONG>E0202020</LONG></LL_POINT><LL_POINT><LAT>N101610</LAT><LONG>E0202620</LONG></LL_POINT><LL_POINT><LAT>N101610</LAT><LONG>E0201420</LONG></LL_POINT></POLYGON></PD></POS></LPA></ANS>" };
  var HTTPMessage send_req := { request := r };
  var Connect conn := { hostname := HttpServerHostName,
    portnumber := HttpServerPort, use_ssl := HTTPClientUseSSL };
  var Close c := { client_id := omit };

  map(self:HTTP_client_port, system:HTTP_client_port);

  var boolean conn_ok := false;
  while(conn_ok == false)
  {
    timer t_connect := 2.0;
    t_connect.start;
    HTTP_client_port.send(conn);
    alt {
      [] HTTP_client_port.receive(recv_err) {
          timer t_wait := 2.0;
          t_wait.start;
          t_wait.timeout; }
      [] t_connect.timeout {
          conn_ok := true;
          log("connection to server ok"); }
    }
  } // endwhile

  timer T_guard := 5.0;
  T_guard.start;
  HTTP_client_port.send(send_req);

  alt {
    [] HTTP_client_port.receive(h) {
        HTTP_client_port.send(c);
        setverdict(fail); }
    [] HTTP_client_port.receive(recv_resp) {
        timer t := 10.0;
        t.start;
        alt {
          [] HTTP_client_port.receive(h) {
              HTTP_client_port.send(c);
              t.stop;
              setverdict(pass); }
          [] t.timeout {
              HTTP_client_port.send(c);
              t.stop;
              setverdict(fail); }
        };
      }
    [] HTTP_client_port.receive {
        HTTP_client_port.send(c);
        setverdict(fail);
      }
    [] T_guard.timeout {
        setverdict(fail); }
  };

  unmap(self:HTTP_client_port, system:HTTP_client_port);
}

function server_TC() runs on HTTP_server
{
  var Listen listen := { local_hostname := omit, portnumber := HttpServerListenPort, use_ssl := HttpServerUseSSL };
  var HTTPResponse resp := { client_id := omit, version_major := 1, version_minor := 1, statuscode := 200, statustext := "OK",
    header := { { header_name := "Server", header_value := "TTCN Test Suite simulated HTTP/1.1 server" },
      { header_name := "Content-Length", header_value := "643" } },
    body := "<?xml version= '1.0' encoding='ISO-8859-1' standalone='yes'?>\n<!DOCTYPE ANS>\n<ANS ver=\"3.00\">\n<LIA>\n<GMT_OFF>+0100</GMT_OFF>\n<POS msid=\"1234512345\">\n<PD>\n<TIME>20000626171825</TIME>\n<ARC>\n<LL_POINT>\n<LAT>N301628</LAT>\n<LONG>W974425</LONG>\n</LL_POINT>\n<IN_RAD>1100</IN_RAD>\n<OUT_RAD>1650</OUT_RAD>\n<START_ANGLE>120</START_ANGLE>\n<STOP_ANGLE>240</STOP_ANGLE>\n</ARC>\n</PD>\n</POS>\n<POS msid=\"1234512346\">\n<PD>\n<TIME>20000626171825</TIME>\n<ARC>\n<LL_POINT>\n<LAT>N301630</LAT>\n<LONG>W974450</LONG>\n</LL_POINT>\n<IN_RAD>0</IN_RAD>\n<OUT_RAD>1650</OUT_RAD>\n<START_ANGLE> 120 </START_ANGLE>\n<STOP_ANGLE>240</STOP_ANGLE>\n</ARC>\n</PD>\n</POS>\n</LIA>\n</ANS>\n\n" };
  var HTTPMessage send_resp := { response := resp };
  var Close c := { client_id := omit };

  map(self:HTTP_server_port, system:HTTP_server_port);

  HTTP_server_port.send(listen);

  timer T_guard := 500.0;
  T_guard.start;
  var boolean ready := false;

  while(ready == false) {
    alt {
      [] HTTP_server_port.receive(recv_req) {
          HTTP_server_port.send(send_resp);
        }
      [] HTTP_server_port.receive(h) {
          HTTP_server_port.send(c);
          ready := true;
          setverdict(pass);
        }
      [] T_guard.timeout {
          setverdict(fail);
        }
    };
  }

  unmap(self:HTTP_server_port, system:HTTP_server_port);
}

//==== Encode decode test ====

function f_singleEncDecCheck( in HTTPMessage p_msg)
{
  var template HTTPMessage tr_expectedMsg := p_msg;
  if(ischosen( p_msg.request ) ){
    tr_expectedMsg.request.client_id := *;
  }
  else if(ischosen( p_msg.response )){
    tr_expectedMsg.response.client_id := *;
  }

  var octetstring vloc_encodedMsg;
  log("Original message:",p_msg);
  log("\n======================\n");
  vloc_encodedMsg := enc_HTTPMessage(p_msg);
  log("Encoded message:",vloc_encodedMsg);

  //==== Request decoding ====
  var HTTPMessage vloc_decodedMsg;
  var integer vl_lengthOfRemainingMsg := dec_HTTPMessage( vloc_encodedMsg, vloc_decodedMsg ); //socket debugging has default value
  log("length of the encoded msg: ", lengthof(vloc_encodedMsg));
  log("length of the remaining msg after encoding:", vl_lengthOfRemainingMsg);
  if(  vl_lengthOfRemainingMsg<lengthof(vloc_encodedMsg))
  {
    log( "The decoded message:", vloc_decodedMsg);

    if(match( vloc_decodedMsg,tr_expectedMsg))
    {
      setverdict(pass);
    }
    else 
    {
      log(match( vloc_decodedMsg,tr_expectedMsg));
      setverdict(fail);
    }
  }
  else
  {
    log( "Decoding not happened");
    setverdict(fail);
  }
}

function f_EncDec() runs on MTC
{

  //=== Request Test ====

  var HeaderLines hd := { {header_name := "Content-Type", header_value := "text/xml"},
    {header_name := "Content-Length", header_value := "510" },
    {header_name := "Expires", header_value := "Sat, 01 Jan 2000 00:00:00 GMT" },
    {header_name := "Pragma", header_value := "no-cache" } };
  var HTTPRequest r := { client_id := omit, method := "POST", uri := "/",
    version_major := 1, version_minor := 0, header := hd, body := "<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?><!DOCTYPE ANS SYSTEM 'file://mpp50_ans.dtd'><ANS ver=\"5.00\"><PUSH_USER><PUSH_ID>clientPush</PUSH_ID><PUSH_PWD>clientPush</PUSH_PWD></PUSH_USER><LPA><GMT_OFF>+0100</GMT_OFF><POS msid=\"4670112345\"><PD><TIME>20040117132719</TIME><POLYGON><LL_POINT><LAT>N100410</LAT><LONG>E0202020</LONG></LL_POINT><LL_POINT><LAT>N101610</LAT><LONG>E0202620</LONG></LL_POINT><LL_POINT><LAT>N101610</LAT><LONG>E0201420</LONG></LL_POINT></POLYGON></PD></POS></LPA></ANS>xy" }; //xy will be fragmented?????

  var HTTPMessage send_req := { request := r };
  f_singleEncDecCheck( send_req );

  //==== Response Test ====
  var HTTPResponse resp := { client_id := omit, version_major := 1, version_minor := 1, statuscode := 200, statustext := "OK",
    header := { { header_name := "Server", header_value := "TTCN Test Suite simulated HTTP/1.1 server" },
      { header_name := "Content-Length", header_value := "643" } },
    body := "<?xml version= '1.0' encoding='ISO-8859-1' standalone='yes'?>\n<!DOCTYPE ANS>\n<ANS ver=\"3.00\">\n<LIA>\n<GMT_OFF>+0100</GMT_OFF>\n<POS msid=\"1234512345\">\n<PD>\n<TIME>20000626171825</TIME>\n<ARC>\n<LL_POINT>\n<LAT>N301628</LAT>\n<LONG>W974425</LONG>\n</LL_POINT>\n<IN_RAD>1100</IN_RAD>\n<OUT_RAD>1650</OUT_RAD>\n<START_ANGLE>120</START_ANGLE>\n<STOP_ANGLE>240</STOP_ANGLE>\n</ARC>\n</PD>\n</POS>\n<POS msid=\"1234512346\">\n<PD>\n<TIME>20000626171825</TIME>\n<ARC>\n<LL_POINT>\n<LAT>N301630</LAT>\n<LONG>W974450</LONG>\n</LL_POINT>\n<IN_RAD>0</IN_RAD>\n<OUT_RAD>1650</OUT_RAD>\n<START_ANGLE> 120 </START_ANGLE>\n<STOP_ANGLE>240</STOP_ANGLE>\n</ARC>\n</PD>\n</POS>\n</LIA>\n</ANS>\n\n" };
  var HTTPMessage send_resp := { response := resp };

  f_singleEncDecCheck( send_resp );


}//f_EncDec


function f_EncDec2() runs on MTC {

  var CHARSTRINGS test_msgs := {
    "HTTP/1.1 302 Moved Temporarily\r\nDate: Wed, 22 Feb 2006 13:37:49 GMT\r\nPragma: no-cache\r\nLocation: http://caylem.etm.ericsson.se:7001/McxOwu/list_useractions.jsp?reload\r\nContent-Type: text/html\r\nExpires: Sat, 6 May 1995 12:00:00 GMT\r\nTransfer-Encoding: chunked\r\nCache-Control: no-store, no-cache, must-revalidate\r\nCache-Control: post-check=0, pre-check=0\r\n\r\n014d\r\n<html><head><title>302 Moved Temporarily</title></head>\r\n<body bgcolor=\"#FFFFFF\">\r\n<p>This document you requested has moved temporarily.</p>\r\n<p>It's now at <a href=\"http://caylem.etm.ericsson.se:7001/McxOwu/list_useractions.jsp?reload\">http://caylem.etm.ericsson.se:7001/McxOwu/list_useractions.jsp?reload</a>.</p>\r\n</body></html>\r\n\r\n0000\r\n\r\n",
    "HTTP/1.1 200 OK\r\nDate: Wed, 22 Feb 2006 13:37:49 GMT\r\nContent-Type: text/html\r\nTransfer-Encoding: chunked\r\n\r\n0fe8\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n\r\n<html>\r\n<head>\r\n<title>Presence</title>\r\n\r\n<script>\r\nvar frameset2 = null;\r\nvar frameset1 = null;\r\n\r\nvar winW = 630, winH = 460;\r\n\r\nfunction getWinSize() {\r\n	if (parseInt(navigator.appVersion)>3) {\r\n	 if (navigator.appName==\"Netscape\") {\r\n	  winW = window.innerWidth;\r\n	  winH = window.innerHeight;\r\n	 }\r\n	 if (navigator.appName.indexOf(\"Microsoft\")!=-1) {\r\n	  winW = document.body.offsetWidth;\r\n	  winH = document.body.offsetHeight;\r\n	 }\r\n	}\r\n	//alert(\"winW=\" + winW + \" winH=\" + winH);\r\n}\r\nvar currRow = null;\r\nfunction tr_mouseover(row) {\r\n	if (!row) {\r\n		row = getrow(window.event.srcElement);\r\n		if (!row)return;\r\n	}\r\n	if (row.style.backgroundColor == \"\") {\r\n		row.style.backgroundColor = \"lightgrey\";\r\n	}\r\n}\r\n\r\nfunction tr_mouseout(row) {\r\n	if (!row) {\r\n		row = getrow(window.event.srcElement);\r\n		if (!row)return;\r\n	}\r\n	if (row.style.backgroundColor == \"lightgrey\") {\r\n		row.style.backgroundColor= \"\";\r\n	}\r\n}\r\n\r\nfunction getrow(obj)\r\n{\r\n	while(obj && obj.tagName != \"TR\") obj = obj.parentNode;\r\n	return obj;\r\n}\r\n// Remove leading and trailing white space\r\nfunction trim(txt) {	\r\n	//alert(\"trim=\" + txt);\r\n	\r\n	try {\r\n		return txt.replace(/(^ +)|( +$)|(\t)/g,\"\");\r\n	} catch (e) {\r\n		var x = new String(txt);\r\n			//alert(\"x=\" + x);\r\n		while (x.charAt(0) == \" \") {\r\n			x = x.substring(1);\r\n			if (x.length == 0) return \"\";\r\n			//alert(\"x=\" + x);\r\n		}\r\n		if (x.length == 0) return \"\";\r\n		while (x.charAt(x.length - 1) == \" \") {\r\n			x = x.substring(0, x.length-1);\r\n			if (x.length == 0) return \"\";\r\n		}\r\n	\r\n		return x;	\r\n		\r\n	\r\n	}\r\n\r\n}\r\n\r\nfunction notyetimplemented()\r\n{\r\n	alert(\"not yet implemented\");\r\n}\r\n\r\nfunction logout()\r\n{\r\n	top.frames[\"_owu_hidden\"].location.assign(\"hidden_logout.jsp\");\r\n//	window.parent.frames[\"_owu_hidden\"].location.assign(\"hidden_logout.jsp\");\r\n}\r\nfunction dorefresh()\r\n{\r\n	try {\r\n		top.frames[\"_owu_sidebar\"].location = \"PrepareSidebar?noselect\";\r\n	} catch (e) {\r\n		alert(\"failed to reload frames\" + e.toString());\r\n	}\r\n}\r\n\r\nfunction NumberChanged(obj) {\r\n\r\n	var val = obj.value;\r\n	var leadingplus = false;\r\n	if (val.search(/^\\+/) == 0) {\r\n		leadingplus = true;\r\n		val  = val.substring(1);\r\n	}\r\n	if (val.search(/[^0-9]/) >= 0) { \r\n		//alert(\"Give a number\");\r\n		val = val.replace(/[^0-9]/g, \"\");\r\n		if (leadingplus) {\r\n			obj.value = \"+\" + val;\r\n		} else {\r\n			obj.value = val;\r\n		}\r\n	}\r\n	\r\n}\r\n\r\nvar modalObj, modalFunc, modalWin;\r\nfunction showModal(obj, func, filename, args, args1) {\r\n	var retval = \"\";\r\n//	if (window.showModalDialog) {\r\n//		retval = window.showModalDialog(filename, args, args1);\r\n//	} else {\r\n		modalObj = obj;\r\n		modalFunc = func;\r\n		document.getElementById(\"modalArg\").value = args;\r\n		args1 = args1.replace(/;/g, \",\");\r\n		args1 = args1.replace(/:/g, \"=\");\r\n		args1 = args1.replace(/dialogWidth/g, \"width\");\r\n		args1 = args1.replace(/dialogHeight/g, \"height\");\r\n		args1 = args1.replace(/dialogTop/g, \"top\");\r\n		args1 = args1.replace(/dialogLeft/g, \"left\");\r\n		args1 = args1.replace(/scroll/g, \"scrollbars\");\r\n		\r\n		//alert(\"modal:\" + args1 );\r\n		//alert(\"window.left=\" + window.screen.left + \" window.top=\" + window.screen.top\r\n		//	+ \"\\window.screeX=\" + window.screenX + \" window.screenY=\" + window.screenY);\r\n\r\n		//alert(\"showmodal:\" + args1);\r\n	   	//modalWin = window.open(filename, \" \", args1 );\r\n	   	//filename = \"indexpopup.jsp?\" + filename;\r\n		modalWin = window.open(filename, \"_owu_popup\", args1);\r\n		modalWin.focus();\r\n		\r\n//	}\r\n	return retval;\r\n}\r\n\r\nfunction modalDone() {\r\n	if (modalObj && modalFunc) {\r\n		modalFunc(modalObj,  document.getElementById(\"modalRetval\").value);\r\n	}\r\n}\r\n\r\nfunction goBack() {\r\n	if (window.name == \"_owu_list\") {\r\n		window.location.assign(\"list_catalog.jsp?catalog=catalogue\");\r\n	} else {\r\n		window.history.go(-1);\r\n	}\r\n}\r\nfunction scroll2View(obj)\r\n{\r\n   try {\r\n    var parent = obj.parentNode;\r\n    while (parent && parent.tagName != (\"DIV\")) parent = parent.parentNode;\r\n" &
    // wrapped into max. 8000 columns lines because ClearCase complains about too long lines
    "   \r\n    //alert(\"scroll2view=\" + parent.id);\r\n    var totsize  = parent.offsetHeight;  // this is the visible area \r\n0fe8\r\nsize\r\n    var currtop = parent.scrollTop;      //here begins the visible area\r\n    var beginPos = obj.offsetTop;\r\n    var step = obj.offsetHeight + 3;\r\n   //	alert(\"step=\" + step + \" padding=\" + obj.style.paddingTop);\r\n    var endPos = beginPos + step;\r\n    \r\n    while (endPos > (currtop + totsize))  {\r\n       currtop += step;\r\n    }\r\n    while (beginPos < currtop) {\r\n       currtop -= step;\r\n    }\r\n    parent.scrollTop = currtop;\r\n    //window.status = \"scrolltop=\" + currtop;\r\n   } catch(e) {\r\n      window.status = \"Failed  scroll2view\";\r\n   }\r\n}\r\n\r\n</script>\r\n\r\n<script>\r\n\r\nfunction init() {\r\n	//document.getElementById(\"p_text\").select();\r\n\r\n\r\n		var doreload = \"reload\";\r\n		if (doreload== \"reload\") {\r\n			dorefresh();\r\n		}\r\n		\r\n		var errormsg = \"\";\r\n		if (errormsg != \"\") {\r\n			errormsg = errormsg.replace(/^error=/i, \"\");\r\n			errormsg = errormsg.replace(/\\%20/g, \" \");\r\n			alert(errormsg);\r\n		}\r\n	\r\n}\r\n\r\nfunction removePresence() {\r\n	document.getElementById(\"presence_code\").value = \"0\";\r\n	document.forms[\"presenceform\"].submit();\r\n}\r\n\r\nfunction pcodeChanged(obj) {\r\n	//alert(\"pcodechanged=\" + obj.options[obj.selectedIndex].value);\r\n	var pcodes = obj.options[obj.selectedIndex].value;\r\n	if (pcodes == \"\") return;\r\n	\r\n	var tmp = pcodes.split(\"_\");\r\n	var pcode = tmp[0];\r\n	var number = tmp[1];\r\n	\r\n	var actionimage = document.getElementById(\"actionimage\");\r\n	if (actionimage) {\r\n		if (number == \"\") {\r\n			actionimage.src=\"img/not_available_no_CFP.gif\";\r\n		} else {\r\n			actionimage.src=\"img/not_available_CFP.gif\";\r\n		}\r\n	}\r\n	if (number == \"x\") {\r\n		document.getElementById(\"diversionnbr\").style.display = \"\";\r\n	} else {\r\n		document.getElementById(\"diversionnbr\").style.display = \"none\";\r\n	}\r\n}\r\nfunction setPresence() {\r\n	var pcodelist = document.getElementById(\"pcodelist\");\r\n	if (pcodelist.selectedIndex <0 || pcodelist.options[pcodelist.selectedIndex].value == \"\") {\r\n		alert(\"do pick a valid option\")\r\n		return;\r\n	}\r\n	var pcodes = pcodelist.options[pcodelist.selectedIndex].value ;\r\n	var tmp = pcodes.split(\"_\");\r\n	var pcode = tmp[0];\r\n	var number = tmp[1];\r\n	\r\n	document.getElementById(\"presence_code\").value = pcode;\r\n	if (number == \"x\") {\r\n		number = trim(document.getElementById(\"diversionnbr\").value);\r\n	} \r\n	document.getElementById(\"presence_divertnbr\").value = number;\r\n	\r\n	var until = document.getElementById(\"untildate\").value \r\n				+ \" \" + document.getElementById(\"untiltime\").value;\r\n	until = trim(until);\r\n	if (until != \"\") {\r\n		document.getElementById(\"presence_until\").value = until;\r\n	}\r\n	\r\n	var msgelem  = document.getElementById(\"p_text\");\r\n	//just make sure that the text is not the initial expl. text.\r\n	if (msgelem.onkeydown == null) { \r\n		var ptext = trim(msgelem.value);\r\n		if (ptext != \"\") {\r\n			document.getElementById(\"presence_text\").value = ptext;\r\n		}\r\n	}\r\n	document.forms[\"presenceform\"].submit();\r\n}\r\nfunction presetPresence(idx) {\r\n	document.getElementById(\"presence_preset\").value = idx;\r\n	document.forms[\"presenceform\"].submit();\r\n	\r\n}\r\n\r\nfunction SetDeflect()\r\n{\r\n	var elems = document.getElementsByName(\"cf\");\r\n	for (var i=0; i <elems.length; i++) {\r\n		if (elems[i].checked) {\r\n			var deflectnr = elems[i].value;\r\n			if (deflectnr == \"X\") {\r\n				deflectnr = document.getElementById(\"cf_number\").value;\r\n			}\r\n			document.getElementById(\"calldeflectnr\").value = deflectnr;\r\n			break;\r\n		}\r\n	}\r\n	document.forms[\"calldeflectform\"].submit();\r\n}\r\n\r\nfunction cfClicked(obj) {\r\n	//alert(\"obj=\" + obj.checked);\r\n	if (obj.checked && obj.value == \"X\") {\r\n		document.getElementById(\"cf_number\").style.visibility = \"\";\r\n		document.getElementById(\"cf_number\").focus();\r\n	} else {\r\n		document.getElementById(\"cf_number\").style.visibility = \"hidden\";\r\n	}\r\n}\r\n\r\nfunction ActivateGroups()\r\n{\r\n	document.forms[\"hgsettng\"].submit();\r\n}\r\n\r\nfunction showmoreoptions() {\r\n	document.getElementById(\"moreoptionstable\").style.display = \"\";\r\n	document.getElementById(\"moreoptionsbutton\").style.display = \"\";\r\n}\r\nfunction divmsgChanged(obj) {\r\n	if (parseInt(obj.value.length) > 255) {\r\n		obj.value = obj.value.substring(0,255);\r\n		alert(\"Max 255\");\r\n	\r\n0fe8\r\n}\r\n	//window.status = obj.value.length;\r\n}	\r\nfunction resetUserSettings() \r\n{\r\n	document.forms[\"resetuserform\"].submit();\r\n}\r\n</script>\r\n<style type=\"text/css\">\r\n\r\nbody {\r\n	font-family: verdana, arial;\r\n	font-size: 100%;\r\n	background-image: url(img/body.gif);\r\n	color : black;\r\n}\r\n\r\ntable {\r\n	font-family: verdana, arial;\r\n	font-size: 90%;\r\n}\r\n\r\n.loginform {\r\n	font-size: 90%;\r\n	color : black;\r\n}\r\n.button {\r\n	font-size:80%;\r\n	font-weight:bold;\r\n	padding:1;\r\n}\r\n.mainform {\r\n	color : black;\r\n	background-color:#E0E0E0;\r\n	font-size:70%;\r\n	width:100%;\r\n	height:100%;\r\n	padding:0;\r\n	margin:0;\r\n\r\n}	\r\n.attendantform {\r\n	color : black;\r\n	background-image: url(img/body.gif);\r\n	margin:0;\r\n	padding:0;\r\n	width:100%;\r\n	height:100%;\r\n}\r\n\r\n.maintitle {\r\n	font-weight: bold;\r\n	color : black;\r\n	letter-spacing:1;\r\n	height:50px;\r\n	width:230px;\r\n	padding:0;" &
    "\r\n	margin:0;\r\n	background-image: url(img/top.gif);\r\n}\r\n\r\n.actionmenu {\r\n	font-size: 90%;\r\n	color : black;\r\n	background-color:#E0E0E0;\r\n	margin : 5;\r\n	padding:5;\r\n	width:99%;\r\n\r\n}\r\n.actiondropdown {\r\n	color : black;\r\n}\r\n\r\n.searchform {\r\n	font-size: 90%;\r\n	color : black;\r\n	background-image: url(img/body.gif);\r\n}\r\n\r\n/* Used by the sidebar */\r\n#mainbody {\r\n	height:99%;\r\n	background-color:#E0E0E0; \r\n	min-width:130px;\r\n	left:5;\r\n	top:3;\r\n	position:absolute;\r\n	\r\n}\r\n\r\n.menutree {\r\n	padding:0;\r\n	align:center;\r\n	color: black;\r\n	min-width:230px;\r\n	width:100%;\r\n}\r\n\r\n.settingsbody {\r\n	padding:0;\r\n	align:center;\r\n	color: black;\r\n	min-width:198px;\r\n	width:100%;\r\n	background-image: url(img/body.gif);\r\n	top:70px;\r\n	position:absolute;\r\n	font-weight:normal;\r\n	height:90%;\r\n	font-size:80%;\r\n}\r\n.settingslist {\r\n	font-size:80%;\r\n}\r\n.inputfield {\r\n	font-size:90%;\r\n}\r\n.settingsheading {\r\n	padding:0 0 0 12;\r\n	width:30%;\r\n}\r\n.treerow {\r\n	font-weight:normal;\r\n	font-size:85%;\r\n	vertical-align:text-top;\r\n	padding:3 0 3 0 ;\r\n	margin:0;\r\n	color : black;\r\n	cursor:hand;\r\n	min-height:16px;\r\n}\r\n.rowheading {\r\n	background-color:#CCCCCC;\r\n	font-weight:bold;\r\n	color:black;\r\n	border:3 outset lightgray;\r\n	margin:2px;\r\n	padding-left:5;\r\n	cursor:hand;\r\n	align:center;\r\n}\r\n\r\n#maincatalogbody {\r\n	height:99%;\r\n	background-image: url(img/body.gif);\r\n	width:100%;\r\n	left:5;\r\n	top:3;\r\n	position:absolute;\r\n}\r\n\r\n.imgbutton {\r\n	background-color:#CCCCCC;\r\n	font-weight:bold;\r\n	color:black;\r\n	border:3 outset lightgray;\r\n	margin:2px;\r\n	padding:2;\r\n	cursor:hand;\r\n	align:center;\r\n	font-size:80%;\r\n}\r\n\r\n.numberbutton {\r\n	background-color:#CCCCCC;\r\n	font-weight:normal;\r\n	color:black;\r\n	margin:1px;\r\n	cursor:hand;\r\n	align:center;\r\n	border:3 outset lightgray;\r\n	height:20px;;\r\n	width:120px;\r\n	vertical-align:bottom;\r\n	padding : 0 0 0 5;\r\n	font-size:80%;\r\n	\r\n}\r\n\r\n.numberbuttonpushed {\r\n	background-color:#E0E0E0;\r\n	font-weight:bold;\r\n	/*color:blue;*/\r\n	margin:1px;\r\n	cursor:hand;\r\n	align:center;\r\n	border:3 inset lightgray;\r\n	height:20px;;\r\n	width:120px;\r\n	vertical-align:bottom;\r\n	padding : 0 0 0 5;\r\n	font-size:80%;\r\n	\r\n}\r\n.actionsmallbutton {\r\n	background-color:#CCCCCC;\r\n	font-weight:bold;\r\n	color:black;\r\n	margin:1px;\r\n	cursor:hand;\r\n	align:center;\r\n	font-size:70%;\r\n	border:2 outset lightgray;\r\n	height:11px;\r\n	width:11px;\r\n	vertical-align:bottom;\r\n}\r\n.actionbutton {\r\n	background-color:#CCCCCC;\r\n	font-weight:bold;\r\n	color:black;\r\n	margin:2px;\r\n	cursor:hand;\r\n	align:center;\r\n	font-size:60%;\r\n	border:5 outset lightgray;\r\n	height:25px;\r\n	width:25px;\r\n	vertical-align:top;\r\n}\r\n\r\n.actionbuttonpushed {\r\n	background-color:#E0E0E0;\r\n	font-weight:bold;\r\n	color:black;\r\n	margin:2px;\r\n	align:center;\r\n	font-size:70%;\r\n	border:5 inset lightgray;\r\n	height:25px;\r\n	width:25px;\r\n	vertical-align:top;\r\n	cursor:hand;\r\n	\r\n}\r\n\r\n\r\n.treecell {\r\n	padding:0 0 2 2;\r\n}\r\n.treespacer {\r\n	padding:0;\r\n	margin:0;\r\n	min-height:2px;\r\n	font-size:1px;\r\n	width:200px;\r\n	\r\n}\r\n.popupform {\r\n	align : center;\r\n	font-size: 90%;\r\n	color : black;\r\n	background-image: url(img/body.gif);\r\n}\r\n\r\n.popuptitle {\r\n	font-size: 120%;\r\n	font-weight : bold;\r\n	letter-spacing : 1;\r\n}\r\n.popuptab {\r\n	font-size: 110%;\r\n	letter-spacing : 1;\r\n	border-top : 1 solid black;\r\n	border-right : 1 solid black;\r\n	bor\r\n0438\r\nder-left : 1 solid black;\r\n	padding : 4;\r\n	margin : 8 3 0 3;\r\n	width : 100%;\r\n	height:80%;\r\n	vertical-align:text-top;\r\n	background-color:black;\r\n	align:center;	\r\n	color:black;\r\n	cursor:hand;\r\n}\r\n.tabselected {\r\n	font-size: 110%;\r\n	letter-spacing : 1;\r\n	border : 1 solid black;\r\n	border-bottom : 0;\r\n	padding : 4 4 0 4;\r\n	margin : 0;\r\n	text-align : left;\r\n	vertical-align:text-top;\r\n	align:center;\r\n	background-color:#E0E0E0;\r\n	color:black;\r\n}\r\n\r\n.popupbutton {\r\n	width: 100px;\r\n}\r\n\r\n.resultlist {\r\n	align:center;\r\n	color: black;\r\n	width:100%;\r\n	height:89%;\r\n	overflow:auto;\r\n	position:absolute;\r\n	background-color:#E0E0E0;\r\n	\r\n}\r\n.resultrow {\r\n	font-weight:normal;\r\n	font-size:75%;\r\n	vertical-align:text-top;\r\n	padding:1;\r\n	margin:0;\r\n	color : black;\r\n	cursor:hand;\r\n	min-height:16px;\r\n}\r\n.resultheading {\r\n	background-color:#CCCCCC;\r\n	font-weight:bold;\r\n	color:black;\r\n	border:3 outset lightgray;\r\n	margin:2px;\r\n	padding-left:5;\r\n	cursor:hand;\r\n	align:center;\r\n	font-size:85%;\r\n}\r\n.actiontextarea {\r\n	font-size:90%;\r\n	text-align:left;\r\n	width:100%;\r\n	height:100px;\r\n}\r\n\r\n</style>\r\n0fe8\r\n\r\n\r\n</head>\r\n<body onload=\"init();\" >\r\n\r\n\r\n<div id=\"mainbody\" >\r\n\r\n<form name=\"resetuserform\" target=\"_self\" action=\"servlet/DrsResetUser\" method=\"post\">\r\n<input type=hidden name=\"resetuser_dirid\" id=\"resetuser_dirid\" value=\"3619010001:046182\">\r\n</form>\r\n\r\n<form name=\"presenceform\" target=\"_self\" action=\"DrsPresence\" method=\"post\">\r\n<input type=hidden name=\"presence_code\" id=\"presence_code\" value=\"\">\r\n<input type=hidden name=\"presence_divertnbr\" id=\"presence_divertnbr\" value=\"\">\r\n<input type=hidden name=\"presence_until\" id=\"presence_until\" value=\"\">\r\n<input type=hidden name=\"presence_dirid\" id=\"presence_dirid\" value=\"\">\r\n<input type=hidden name=\"presence_text\" id=\"presence_text\" value=\"\">\r\n<input type=hidden name=\"presence_preset\" id=\"presence_preset\" value=\"\">\r\n</form>\r\n\r\n<div class=\"maintitle\" style=\"width:100%\">\r\n<table cellspacing=0 cellpadding=3 width=\"100%\" >\r\n<tr>\r\n	<td class=\"maintitle\" style=\"width:100%\" align=baseline>\r\n	<img src=\"img/spacer.gif\" height=50 width=2>\r\n	Sambal Bij  (1100)\r\n<!-- toolbox -->\r\n	<td align=right  valign=baseline nowrap> \r\n		\r\n		<span id=\"resetbutton\"  class=\"actionbutton\" onclick=\"resetUserSettings()\"  >\r\n				<img src=\"img/spacer.gif\" width=\"25\" heigth=\"25\">Reset user settings\r\n		</span>\r\n		\r\n		<span id=\"logoutbutton\"  class=\"actionbutton\" onclick=\"logout()\"  >\r\n				<img src=\"img/spacer.gif\" width=\"25\" heigth=\"25\">Log out\r\n		</span>\r\n<tr><td colspan=2><hr>\r\n\r\n</table>\r\n\r\n</div>\r\n\r\n<div class=\"settingsbody\"  id=\"presencemenu\">\r\n\r\n<table  style=\"width:100%;color:black;background-color:#E0E0E0\" border=0 cellpadding=3 cellspacing=2>\r\n<tr><td style=\"width:35%;border:1 solid gray;\">\r\n\r\n	<table  style=\"width:100%;color:black;background-color:#E0E0E0\" border=0 cellpadding=3 cellspacing=2>\r\n		<tr><td  style=\"font-size:100%\"><b>Presence\r\n	\r\n\r\n		<td nowrap>	<img src='img/not_available_no_CFP.gif'>Left for the day\r\n\r\n\r\n	<tr>\r\n		<td colspan=2><hr>\r\n	\r\n\r\n" &
    "		<tr style=\"display:\"><td colspan=2>Predefined options\r\n	\r\n\r\n		<tr  style=\"display:\">\r\n			<td  colspan=2 >\r\n			<span style=\"width:70%\" class='imgbutton' onclick=\"presetPresence('0');\" >\r\n				<img src='img/available.gif' width=16 height=16>Change to Available\r\n			</span>\r\n			<br>\r\n\r\n		<tr  style=\"display:\">\r\n			<td  colspan=2 >\r\n			<span style=\"width:70%\" class='imgbutton' onclick=\"presetPresence('1');\" >\r\n				<img src='img/not_available_no_CFP.gif' width=16 height=16>Change to Busy\r\n			</span>\r\n			<br>\r\n\r\n		<tr  style=\"display:\">\r\n			<td  colspan=2 >\r\n			<span style=\"width:70%\" class='imgbutton' onclick=\"presetPresence('2');\" >\r\n				<img src='img/not_available_no_CFP.gif' width=16 height=16>Change to Meeting\r\n			</span>\r\n			<br>\r\n\r\n		<tr  style=\"display:\">\r\n			<td  colspan=2 >\r\n			<span style=\"width:70%\" class='imgbutton' onclick=\"presetPresence('3');\" >\r\n				<img src='img/not_available_no_CFP.gif' width=16 height=16>Change to Lunch\r\n			</span>\r\n			<br>\r\n\r\n		<tr  style=\"display:\">\r\n			<td  colspan=2 >\r\n			<span style=\"width:70%\" class='imgbutton' onclick=\"presetPresence('4');\" >\r\n				<img src='img/not_available_no_CFP.gif' width=16 height=16>Change to Left for the day\r\n			</span>\r\n			<br>\r\n\r\n		<tr>\r\n		<td  colspan=2><br><hr>\r\n		\r\n		<tr><td ><a href=# onclick=\"showmoreoptions()\" >More options...</a>\r\n		\r\n			<td style=\"display:none\" id=\"moreoptionsbutton\" nowrap align=right><span class=\"imgbutton\" style=\"font-size:75%\" onclick=\"setPresence();\">\r\n					<img id=\"actionimage\" src=\"img/spacer.gif\">&nbsp;&nbsp;\r\n				Change now</span>\r\n		\r\n\r\n		<tr>\r\n		<td colspan=2>\r\n		<table id=\"moreoptionstable\" style=\"display:none\">\r\n		<tr>\r\n			<td colspan=2 valign=top >\r\n			<select style=\"width:100%\" id=\"pcodelist\"  onchange=\"pcodeChanged(this)\" >\r\n			<option value=''>------------------------------------</option>\r\n<option value='1_'>Busy - No diversion\n<option value='1_-1'>Busy - All calls to main number\n<option value='1_-2'>Busy - All calls to voicemail\n<option value='1_x'>Busy - All calls to number\n<option value=''>------------------------------------</option>\n<option value='2_'>Meeting - No diversion\n<option value='2_-1'>Meeting - All calls to\r\n0f53\r\n main number\n<option value='2_-2'>Meeting - All calls to voicemail\n<option value='2_x'>Meeting - All calls to number\n<option value=''>------------------------------------</option>\n<option value='3_'>Lunch - No diversion\n<option value='3_-1'>Lunch - All calls to main number\n<option value='3_-2'>Lunch - All calls to voicemail\n<option value='3_x'>Lunch - All calls to number\n<option value=''>------------------------------------</option>\n<option value='4_'>Left for the day - No diversion\n<option value='4_-1'>Left for the day - All calls to main number\n<option value='4_-2'>Left for the day - All calls to voicemail\n<option value='4_x'>Left for the day - All calls to number\n<option value=''>------------------------------------</option>\n<option value='5_'>Returns - No diversion\n<option value='5_-1'>Returns - All calls to main number\n<option value='5_-2'>Returns - All calls to voicemail\n<option value='5_x'>Returns - All calls to number\n<option value=''>------------------------------------</option>\n\r\n					\r\n			</select>\r\n			<tr><td colspan=2>\r\n				<input type=text value=\"\" onkeyup=\"NumberChanged(this)\" style=\"display:none\" id=\"diversionnbr\">\r\n\r\n	<tr>\r\n	<td style=\"font-size:90%;\" nowrap colspan=2>Back \r\n		<span style=\"font-size:75%\">(MM/dd/yyyy)</span>\r\n			<input type=text id=\"untildate\" value=\"\" size=\"10\">\r\n		<span style=\"font-size:75%\">(HH:mm)</span>\r\n			<input type=text id=\"untiltime\" value=\"\" size=\"5\">\r\n	<tr>\r\n			<td colspan=2 valign=top width=30%><b>Message\r\n		\r\n		<tr >			\r\n			<td colspan=2 valign=top >\r\n			<textarea style=\"width:99%;\" rows=5 classname=\"actiontextarea\"\r\n				id=\"p_text\" onkeydown=\"this.value='';this.onkeydown=null\" onkeyup=\"divmsgChanged(this)\">Here you can write your message to the attendant and others. Max 255 characters.</textarea>\r\n		\r\n		\r\n			</table><!--more options-->\r\n	</table>\r\n\r\n<!-- Call deflect -->\r\n<td style=\"width:35%;border:1 solid gray;display:none\" valign=top>\r\n	<table  style=\"color:black;background-color:#E0E0E0;width:100%\" border=0 cellpadding=3 cellspacing=2>\r\n		<tr><td style=\"font-size:100%\"><b>Deflect call\r\n			<td align=right><input  class=\"imgbutton\" style=\"font-size:80%;\" \r\n				type=\"button\" value=\"Change\" onclick=\"SetDeflect()\" >\r\n			\r\n		<tr><td colspan=2><hr>	\r\n		<tr onmouseover=\"tr_mouseover(this);\" onmouseout=\"tr_mouseout(this)\" class=treerow>\r\n			<td colspan=2><input onclick=\"cfClicked(this);\" type=radio id=\"cf_operator\" name=\"cf\" value=\"-1\" >&nbsp;&nbsp;Main number\r\n		<tr onmouseover=\"tr_mouseover(this);\" onmouseout=\"tr_mouseout(this)\" class=treerow>\r\n			<td colspan=2><input onclick=\"cfClicked(this);\" type=radio id=\"cf_voicemail\" name=\"cf\" value=\"-2\" >&nbsp;&nbsp;Voicemail\r\n		<tr onmouseover=\"tr_mouseover(this);\" onmouseout=\"tr_mouseout(this)\" class=treerow>\r\n			<td colspan=2><input onclick=\"cfClicked(this);\" type=radio id=\"cf_x\" name=\"cf\" value=\"X\" >&nbsp;&nbsp;Phone\r\n			<input type=text name=\"cf_number\" id=\"cf_number\" onkeyup=\"NumberChanged(this);\" style=\"visibility:hidden\" value=\"\">\r\n		\r\n	</table>\r\n\r\n\r\n<form name=\"calldeflectform\" target=\"_self\" action=\"servlet/DrsDeflect\" method=\"post\">\r\n<input type=hidden name=\"dirid\" id=\"dirid\" value=\"\">\r\n<input type=hidden name=\"calldeflectnr\" id=\"calldeflectnr\" value=\"\">\r\n</form>\r\n\r\n<!-- CDG/huntgroups -->\r\n<td style=\"width:35%;border:1 solid gray;\" valign=top>\r\n	<form name=\"hgsettng\" target=\"_self\" action=\"servlet/DrsHuntGroup\" method=\"post\">\r\n	<input type=hidden name=\"dirid\" id=\"dirid\" value=\"\">\r\n	<table  style=\"color:black;background-color:#E0E0E0;width:100%\" border=0 cellpadding=3 cellspacing=2>\r\n		<tr><td style=\"font-size:100%;\"><b>Activate/deactivate <br>Call distribution groups\r\n			<td align=right valign=top><input  class=\"imgbutton\" style=\"font-size:80%;\" \r\n				type=\"button\" value=\"Change\" onclick=\"ActivateGroups()\" >\r\n		<tr><td colspan=2><hr>	\r\n<tr><td>Not member of any call distribution group\n\r\n	</form>\r\n	</table>\r\n\r\n</table>\r\n</div>\r\n</div>\r\n\r\n</body>\r\n</html>\r\n\r\n0000\r\n\r\n"
  };

  var HTTPResponse resp := { client_id := omit, version_major := 1, version_minor := 1, statuscode := 200, statustext := "OK",
    header := { { header_name := "Server", header_value := "TTCN Test Suite simulated HTTP/1.1 server" },
      { header_name := "Content-Length", header_value := int2str(lengthof(test_msgs[0])+ lengthof(test_msgs[1])) } },
    body :=  test_msgs[0] & test_msgs[1] };
  var HTTPMessage send_resp := { response := resp };

  f_singleEncDecCheck( send_resp );

  var octetstring received_reply := '485454502F312E3120333032204D6F7665642054656D706F726172696C790D0A446174653A205765642C2032322046656220323030362031333A33373A343920474D540D0A507261676D613A206E6F2D63616368650D0A4C6F636174696F6E3A20687474703A2F2F6361796C656D2E65746D2E6572696373736F6E2E73653A373030312F4D63784F77752F6C6973745F75736572616374696F6E732E6A73703F72656C6F61640D0A436F6E74656E742D547970653A20746578742F68746D6C0D0A457870697265733A205361742C2036204D617920313939352031323A30303A303020474D540D0A5472616E736665722D456E636F64696E673A206368756E6B65640D0A43616368652D436F6E74726F6C3A206E6F2D73746F72652C206E6F2D63616368652C206D7573742D726576616C69646174650D0A43616368652D436F6E74726F6C3A20706F73742D636865636B3D302C207072652D636865636B3D300D0A0D0A3C68746D6C3E3C686561643E3C7469746C653E333032204D6F7665642054656D706F726172696C793C2F7469746C653E3C2F686561643E0D0A3C626F6479206267636F6C6F723D2223464646464646223E0D0A3C703E5468697320646F63756D656E7420796F752072657175657374656420686173206D6F7665642074656D706F726172696C792E3C2F703E0D0A3C703E49742773206E6F77206174203C6120687265663D22687474703A2F2F6361796C656D2E65746D2E6572696373736F6E2E73653A373030312F4D63784F77752F6C6973745F75736572616374696F6E732E6A73703F72656C6F6164223E687474703A2F2F6361796C656D2E65746D2E6572696373736F6E2E73653A373030312F4D63784F77752F6C6973745F75736572616374696F6E732E6A73703F72656C6F61643C2F613E2E3C2F703E0D0A3C2F626F64793E3C2F68746D6C3E0D0A485454502F312E3120323030204F4B0D0A446174653A205765642C2032322046656220323030362031333A33373A343920474D540D0A436F6E74656E742D547970653A20746578742F68746D6C0D0A5472616E736665722D456E636F64696E673A206368756E6B65640D0A0D0A0D0A0D0A0D0A0D0A0D0A0D0A0D0A0D0A0D0A3C21444F43545950452048544D4C205055424C494320222D2F2F5733432F2F4454442048544D4C20342E3031205472616E736974696F6E616C2F2F454E223E0D0A0D0A3C68746D6C3E0D0A3C686561643E0D0A3C7469746C653E50726573656E63653C2F7469746C653E0D0A0D0A3C7363726970743E0D0A766172206672616D6573657432203D206E756C6C3B0D0A766172206672616D6573657431203D206E756C6C3B0D0A0D0A7661722077696E57203D203633302C2077696E48203D203436303B0D0A0D0A66756E6374696F6E2067657457696E53697A652829207B0D0A09696620287061727365496E74286E6176696761746F722E61707056657273696F6E293E3329207B0D0A0920696620286E6176696761746F722E6170704E616D653D3D224E657473636170652229207B0D0A09202077696E57203D2077696E646F772E696E6E657257696474683B0D0A09202077696E48203D2077696E646F772E696E6E65724865696768743B0D0A09207D0D0A0920696620286E6176696761746F722E6170704E616D652E696E6465784F6628224D6963726F736F66742229213D2D3129207B0D0A09202077696E57203D20646F63756D656E742E626F64792E6F666673657457696474683B0D0A09202077696E48203D20646F63756D656E742E626F64792E6F66667365744865696768743B0D0A09207D0D0A097D0D0A092F2F616C657274282277696E573D22202B2077696E57202B20222077696E483D22202B2077696E48293B0D0A7D0D0A7661722063757272526F77203D206E756C6C3B0D0A66756E6374696F6E2074725F6D6F7573656F76657228726F7729207B0D0A096966202821726F7729207B0D0A0909726F77203D20676574726F772877696E646F772E6576656E742E737263456C656D656E74293B0D0A09096966202821726F772972657475726E3B0D0A097D0D0A0969662028726F772E7374796C652E6261636B67726F756E64436F6C6F72203D3D20222229207B0D0A0909726F772E7374796C652E6261636B67726F756E64436F6C6F72203D20226C6967687467726579223B0D0A097D0D0A7D0D0A0D0A66756E6374696F6E2074725F6D6F7573656F757428726F7729207B0D0A096966202821726F7729207B0D0A0909726F77203D20676574726F772877696E646F772E6576656E742E737263456C656D656E74293B0D0A09096966202821726F772972657475726E3B0D0A097D0D0A0969662028726F772E7374796C652E6261636B67726F756E64436F6C6F72203D3D20226C69676874677265792229207B0D0A0909726F772E7374796C652E6261636B67726F756E64436F6C6F723D2022223B0D0A097D0D0A7D0D0A0D0A66756E6374696F6E20676574726F77286F626A290D0A7B0D0A097768696C65286F626A202626206F626A2E7461674E616D6520213D202254522229206F626A203D206F626A2E706172656E744E6F64653B0D0A0972657475726E206F626A3B0D0A7D0D0A2F2F2052656D6F7665206C656164696E6720616E6420747261696C696E672077686974652073706163650D0A66756E6374696F6E207472696D2874787429207B090D0A092F2F616C65727428227472696D3D22202B20747874293B0D0A090D0A09747279207B0D0A090972657475726E207478742E7265706C616365282F285E202B297C28202B24297C2809292F672C2222293B0D0A097D20636174636820286529207B0D0A09097661722078203D206E657720537472696E6728747874293B0D0A0909092F2F616C6572742822783D22202B2078293B0D0A09097768696C652028782E636861724174283029203D3D2022202229207B0D0A09090978203D20782E737562737472696E672831293B0D0A09090969662028782E6C656E677468203D3D2030292072657475726E2022223B0D0A0909092F2F616C6572742822783D22202B2078293B0D0A09097D0D0A090969662028782E6C656E677468203D3D2030292072657475726E2022223B0D0A09097768696C652028782E63686172417428782E6C656E677468202D203129203D3D2022202229207B0D0A09090978203D20782E737562737472696E6728302C20782E6C656E6774682D31293B0D0A09090969662028782E6C656E677468203D3D2030292072657475726E2022223B0D0A09097D0D0A090D0A090972657475726E20783B090D0A09090D0A090D0A097D0D0A0D0A7D0D0A0D0A66756E6374696F6E206E6F74796574696D706C656D656E74656428290D0A7B0D0A09616C65727428226E6F742079657420696D706C656D656E74656422293B0D0A7D0D0A0D0A66756E6374696F6E206C6F676F757428290D0A7B0D0A09746F702E6672616D65735B225F6F77755F68696464656E225D2E6C6F636174696F6E2E61737369676E282268696464656E5F6C6F676F75742E6A737022293B0D0A2F2F0977696E646F772E706172656E742E6672616D65735B225F6F77755F68696464656E225D2E6C6F636174696F6E2E61737369676E282268696464656E5F6C6F676F75742E6A737022293B0D0A7D0D0A66756E6374696F6E20646F7265667265736828290D0A7B0D0A09747279207B0D0A0909746F702E6672616D65735B225F6F77755F73696465626172225D2E6C6F636174696F6E203D202250726570617265536964656261723F6E6F73656C656374223B0D0A097D20636174636820286529207B0D0A0909616C65727428226661696C656420746F2072656C6F6164206672616D657322202B20652E746F537472696E672829293B0D0A097D0D0A7D0D0A0D0A66756E6374696F6E204E756D6265724368616E676564286F626A29207B0D0A0D0A097661722076616C203D206F626A2E76616C75653B0D0A09766172206C656164696E67706C7573203D2066616C73653B0D0A096966202876616C2E736561726368282F5E5C2B2F29203D3D203029207B0D0A09096C656164696E67706C7573203D20747275653B0D0A090976616C20203D2076616C2E737562737472696E672831293B0D0A097D0D0A096966202876616C2E736561726368282F5B5E302D395D2F29203E3D203029207B200D0A09092F2F616C6572742822476976652061206E756D62657222293B0D0A090976616C203D2076616C2E7265706C616365282F5B5E302D395D2F672C202222293B0D0A0909696620286C656164696E67706C757329207B0D0A0909096F626A2E76616C7565203D20222B22202B2076616C3B0D0A09097D20656C7365207B0D0A0909096F626A2E76616C7565203D2076616C3B0D0A09097D0D0A097D0D0A090D0A7D0D0A0D0A766172206D6F64616C4F626A2C206D6F64616C46756E632C206D6F64616C57696E3B0D0A66756E6374696F6E2073686F774D6F64616C286F626A2C2066756E632C2066696C656E616D652C20617267732C20617267733129207B0D0A097661722072657476616C203D2022223B0D0A2F2F096966202877696E646F772E73686F774D6F64616C4469616C6F6729207B0D0A2F2F090972657476616C203D2077696E646F772E73686F774D6F64616C4469616C6F672866696C656E616D652C20617267732C206172677331293B0D0A2F2F097D20656C7365207B0D0A09096D6F64616C4F626A203D206F626A3B0D0A09096D6F64616C46756E63203D2066756E633B0D0A0909646F63756D656E742E676574456C656D656E744279496428226D6F64616C41726722292E76616C7565203D20617267733B0D0A09096172677331203D2061726773312E7265706C616365282F3B2F672C20222C22293B0D0A09096172677331203D2061726773312E7265706C616365282F3A2F672C20223D22293B0D0A09096172677331203D2061726773312E7265706C616365282F6469616C6F6757696474682F672C2022776964746822293B0D0A09096172677331203D2061726773312E7265706C616365282F6469616C6F674865696768742F672C202268656967687422293B0D0A09096172677331203D2061726773312E7265706C616365282F6469616C6F67546F702F672C2022746F7022293B0D0A09096172677331203D2061726773312E7265706C616365282F6469616C'O & 
  '6F674C6566742F672C20226C65667422293B0D0A09096172677331203D2061726773312E7265706C616365282F7363726F6C6C2F672C20227363726F6C6C6261727322293B0D0A09090D0A09092F2F616C65727428226D6F64616C3A22202B20617267733120293B0D0A09092F2F616C657274282277696E646F772E6C6566743D22202B2077696E646F772E73637265656E2E6C656674202B20222077696E646F772E746F703D22202B2077696E646F772E73637265656E2E746F700D0A09092F2F092B20225C77696E646F772E7363726565583D22202B2077696E646F772E73637265656E58202B20222077696E646F772E73637265656E593D22202B2077696E646F772E73637265656E59293B0D0A0D0A09092F2F616C657274282273686F776D6F64616C3A22202B206172677331293B0D0A09202020092F2F6D6F64616C57696E203D2077696E646F772E6F70656E2866696C656E616D652C202220222C20617267733120293B0D0A09202020092F2F66696C656E616D65203D2022696E646578706F7075702E6A73703F22202B2066696C656E616D653B0D0A09096D6F64616C57696E203D2077696E646F772E6F70656E2866696C656E616D652C20225F6F77755F706F707570222C206172677331293B0D0A09096D6F64616C57696E2E666F63757328293B0D0A09090D0A2F2F097D0D0A0972657475726E2072657476616C3B0D0A7D0D0A0D0A66756E6374696F6E206D6F64616C446F6E652829207B0D0A09696620286D6F64616C4F626A202626206D6F64616C46756E6329207B0D0A09096D6F64616C46756E63286D6F64616C4F626A2C2020646F63756D656E742E676574456C656D656E744279496428226D6F64616C52657476616C22292E76616C7565293B0D0A097D0D0A7D0D0A0D0A66756E6374696F6E20676F4261636B2829207B0D0A096966202877696E646F772E6E616D65203D3D20225F6F77755F6C6973742229207B0D0A090977696E646F772E6C6F636174696F6E2E61737369676E28226C6973745F636174616C6F672E6A73703F636174616C6F673D636174616C6F67756522293B0D0A097D20656C7365207B0D0A090977696E646F772E686973746F72792E676F282D31293B0D0A097D0D0A7D0D0A66756E6374696F6E207363726F6C6C3256696577286F626A290D0A7B0D0A202020747279207B0D0A2020202076617220706172656E74203D206F626A2E706172656E744E6F64653B0D0A202020207768696C652028706172656E7420262620706172656E742E7461674E616D6520213D20282244495622292920706172656E74203D20706172656E742E706172656E744E6F64653B0D0A2020200D0A202020202F2F616C65727428227363726F6C6C32766965773D22202B20706172656E742E6964293B0D0A2020202076617220746F7473697A6520203D20706172656E742E6F66667365744865696768743B20202F2F2074686973206973207468652076697369626C652061726561200D73697A650D0A202020207661722063757272746F70203D20706172656E742E7363726F6C6C546F703B2020202020202F2F6865726520626567696E73207468652076697369626C6520617265610D0A2020202076617220626567696E506F73203D206F626A2E6F6666736574546F703B0D0A202020207661722073746570203D206F626A2E6F6666736574486569676874202B20333B0D0A2020202F2F09616C6572742822737465703D22202B2073746570202B20222070616464696E673D22202B206F626A2E7374796C652E70616464696E67546F70293B0D0A2020202076617220656E64506F73203D20626567696E506F73202B20737465703B0D0A202020200D0A202020207768696C652028656E64506F73203E202863757272746F70202B20746F7473697A65292920207B0D0A2020202020202063757272746F70202B3D20737465703B0D0A202020207D0D0A202020207768696C652028626567696E506F73203C2063757272746F7029207B0D0A2020202020202063757272746F70202D3D20737465703B0D0A202020207D0D0A20202020706172656E742E7363726F6C6C546F70203D2063757272746F703B0D0A202020202F2F77696E646F772E737461747573203D20227363726F6C6C746F703D22202B2063757272746F703B0D0A2020207D206361746368286529207B0D0A20202020202077696E646F772E737461747573203D20224661696C656420207363726F6C6C3276696577223B0D0A2020207D0D0A7D0D0A0D0A3C2F7363726970743E0D0A0D0A3C7363726970743E0D0A0D0A66756E6374696F6E20696E69742829207B0D0A092F2F646F63756D656E742E676574456C656D656E74427949642822705F7465787422292E73656C65637428293B0D0A0D0A0D0A090976617220646F72656C6F6164203D202272656C6F6164223B0D0A090969662028646F72656C6F61643D3D202272656C6F61642229207B0D0A090909646F7265667265736828293B0D0A09097D0D0A09090D0A0909766172206572726F726D7367203D2022223B0D0A0909696620286572726F726D736720213D20222229207B0D0A0909096572726F726D7367203D206572726F726D73672E7265706C616365282F5E6572726F723D2F692C202222293B0D0A0909096572726F726D7367203D206572726F726D73672E7265706C616365282F5C2532302F672C20222022293B0D0A090909616C657274286572726F726D7367293B0D0A09097D0D0A090D0A7D0D0A0D0A66756E6374696F6E2072656D6F766550726573656E63652829207B0D0A09646F63756D656E742E676574456C656D656E7442794964282270726573656E63655F636F646522292E76616C7565203D202230223B0D0A09646F63756D656E742E666F726D735B2270726573656E6365666F726D225D2E7375626D697428293B0D0A7D0D0A0D0A66756E6374696F6E2070636F64654368616E676564286F626A29207B0D0A092F2F616C657274282270636F64656368616E6765643D22202B206F626A2E6F7074696F6E735B6F626A2E73656C6563746564496E6465785D2E76616C7565293B0D0A097661722070636F646573203D206F626A2E6F7074696F6E735B6F626A2E73656C6563746564496E6465785D2E76616C75653B0D0A096966202870636F646573203D3D202222292072657475726E3B0D0A090D0A0976617220746D70203D2070636F6465732E73706C697428225F22293B0D0A097661722070636F6465203D20746D705B305D3B0D0A09766172206E756D626572203D20746D705B315D3B0D0A090D0A0976617220616374696F6E696D616765203D20646F63756D656E742E676574456C656D656E74427949642822616374696F6E696D61676522293B0D0A0969662028616374696F6E696D61676529207B0D0A0909696620286E756D626572203D3D20222229207B0D0A090909616374696F6E696D6167652E7372633D22696D672F6E6F745F617661696C61626C655F6E6F5F4346502E676966223B0D0A09097D20656C7365207B0D0A090909616374696F6E696D6167652E7372633D22696D672F6E6F745F617661696C61626C655F4346502E676966223B0D0A09097D0D0A097D0D0A09696620286E756D626572203D3D2022782229207B0D0A0909646F63756D656E742E676574456C656D656E74427949642822646976657273696F6E6E627222292E7374796C652E646973706C6179203D2022223B0D0A097D20656C7365207B0D0A0909646F63756D656E742E676574456C656D656E74427949642822646976657273696F6E6E627222292E7374796C652E646973706C6179203D20226E6F6E65223B0D0A097D0D0A7D0D0A66756E6374696F6E2073657450726573656E63652829207B0D0A097661722070636F64656C697374203D20646F63756D656E742E676574456C656D656E7442794964282270636F64656C69737422293B0D0A096966202870636F64656C6973742E73656C6563746564496E646578203C30207C7C2070636F64656C6973742E6F7074696F6E735B70636F64656C6973742E73656C6563746564496E6465785D2E76616C7565203D3D20222229207B0D0A0909616C6572742822646F207069636B20612076616C6964206F7074696F6E22290D0A090972657475726E3B0D0A097D0D0A097661722070636F646573203D2070636F64656C6973742E6F7074696F6E735B70636F64656C6973742E73656C6563746564496E6465785D2E76616C7565203B0D0A0976617220746D70203D2070636F6465732E73706C697428225F22293B0D0A097661722070636F6465203D20746D705B305D3B0D0A09766172206E756D626572203D20746D705B315D3B0D0A090D0A09646F63756D656E742E676574456C656D656E7442794964282270726573656E63655F636F646522292E76616C7565203D2070636F64653B0D0A09696620286E756D626572203D3D2022782229207B0D0A09096E756D626572203D207472696D28646F63756D656E742E676574456C656D656E74427949642822646976657273696F6E6E627222292E76616C7565293B0D0A097D200D0A09646F63756D656E742E676574456C656D656E7442794964282270726573656E63655F6469766572746E627222292E76616C7565203D206E756D6265723B0D0A090D0A0976617220756E74696C203D20646F63756D656E742E676574456C656D656E74427949642822756E74696C6461746522292E76616C7565200D0A090909092B20222022202B20646F63756D656E742E676574456C656D656E74427949642822756E74696C74696D6522292E76616C75653B0D0A09756E74696C203D207472696D28756E74696C293B0D0A0969662028756E74696C20213D20222229207B0D0A0909646F63756D656E742E676574456C656D656E7442794964282270726573656E63655F756E74696C22292E76616C7565203D20756E74696C3B0D0A097D0D0A090D0A09766172206D7367656C656D20203D20646F63756D656E742E676574456C656D656E74427949642822705F7465787422293B0D0A092F2F6A757374206D616B6520737572652074686174207468652074657874206973206E6F742074686520696E697469616C206578706C2E20746578742E0D0A09696620286D7367656C656D2E6F6E6B6579646F776E203D3D206E756C6C29207B200D0A0909766172207074657874203D207472696D286D7367656C656D2E76616C7565293B0D0A090969662028707465787420213D20222229207B0D0A090909646F63756D656E742E676574456C656D656E7442794964282270726573656E63655F7465787422292E76616C7565203D2070746578743B0D0A09097D0D0A097D0D0A09646F63756D656E742E666F726D735B2270726573656E6365666F726D225D2E7375626D697428293B0D0A7D0D0A66756E6374696F6E2070726573657450726573656E6365'O & 
  '2869647829207B0D0A09646F63756D656E742E676574456C656D656E7442794964282270726573656E63655F70726573657422292E76616C7565203D206964783B0D0A09646F63756D656E742E666F726D735B2270726573656E6365666F726D225D2E7375626D697428293B0D0A090D0A7D0D0A0D0A66756E6374696F6E205365744465666C65637428290D0A7B0D0A0976617220656C656D73203D20646F63756D656E742E676574456C656D656E747342794E616D652822636622293B0D0A09666F72202876617220693D303B2069203C656C656D732E6C656E6774683B20692B2B29207B0D0A090969662028656C656D735B695D2E636865636B656429207B0D0A090909766172206465666C6563746E72203D20656C656D735B695D2E76616C75653B0D0A090909696620286465666C6563746E72203D3D2022582229207B0D0A090909096465666C6563746E72203D20646F63756D656E742E676574456C656D656E7442794964282263665F6E756D62657222292E76616C75653B0D0A0909097D0D0A090909646F63756D656E742E676574456C656D656E7442794964282263616C6C6465666C6563746E7222292E76616C7565203D206465666C6563746E723B0D0A090909627265616B3B0D0A09097D0D0A097D0D0A09646F63756D656E742E666F726D735B2263616C6C6465666C656374666F726D225D2E7375626D697428293B0D0A7D0D0A0D0A66756E6374696F6E206366436C69636B6564286F626A29207B0D0A092F2F616C65727428226F626A3D22202B206F626A2E636865636B6564293B0D0A09696620286F626A2E636865636B6564202626206F626A2E76616C7565203D3D2022582229207B0D0A0909646F63756D656E742E676574456C656D656E7442794964282263665F6E756D62657222292E7374796C652E7669736962696C697479203D2022223B0D0A0909646F63756D656E742E676574456C656D656E7442794964282263665F6E756D62657222292E666F63757328293B0D0A097D20656C7365207B0D0A0909646F63756D656E742E676574456C656D656E7442794964282263665F6E756D62657222292E7374796C652E7669736962696C697479203D202268696464656E223B0D0A097D0D0A7D0D0A0D0A66756E6374696F6E20416374697661746547726F75707328290D0A7B0D0A09646F63756D656E742E666F726D735B226867736574746E67225D2E7375626D697428293B0D0A7D0D0A0D0A66756E6374696F6E2073686F776D6F72656F7074696F6E732829207B0D0A09646F63756D656E742E676574456C656D656E744279496428226D6F72656F7074696F6E737461626C6522292E7374796C652E646973706C6179203D2022223B0D0A09646F63756D656E742E676574456C656D656E744279496428226D6F72656F7074696F6E73627574746F6E22292E7374796C652E646973706C6179203D2022223B0D0A7D0D0A66756E6374696F6E206469766D73674368616E676564286F626A29207B0D0A09696620287061727365496E74286F626A2E76616C75652E6C656E67746829203E2032353529207B0D0A09096F626A2E76616C7565203D206F626A2E76616C75652E737562737472696E6728302C323535293B0D0A0909616C65727428224D61782032353522293B0D0A097D0D0A092F2F77696E646F772E737461747573203D206F626A2E76616C75652E6C656E6774683B0D0A7D090D0A66756E6374696F6E2072657365745573657253657474696E67732829200D0A7B0D0A09646F63756D656E742E666F726D735B22726573657475736572666F726D225D2E7375626D697428293B0D0A7D0D0A3C2F7363726970743E0D0A3C7374796C6520747970653D22746578742F637373223E0D0A0D0A626F6479207B0D0A09666F6E742D66616D696C793A2076657264616E612C20617269616C3B0D0A09666F6E742D73697A653A20313030253B0D0A096261636B67726F756E642D696D6167653A2075726C28696D672F626F64792E676966293B0D0A09636F6C6F72203A20626C61636B3B0D0A7D0D0A0D0A7461626C65207B0D0A09666F6E742D66616D696C793A2076657264616E612C20617269616C3B0D0A09666F6E742D73697A653A203930253B0D0A7D0D0A0D0A2E6C6F67696E666F726D207B0D0A09666F6E742D73697A653A203930253B0D0A09636F6C6F72203A20626C61636B3B0D0A7D0D0A2E627574746F6E207B0D0A09666F6E742D73697A653A3830253B0D0A09666F6E742D7765696768743A626F6C643B0D0A0970616464696E673A313B0D0A7D0D0A2E6D61696E666F726D207B0D0A09636F6C6F72203A20626C61636B3B0D0A096261636B67726F756E642D636F6C6F723A234530453045303B0D0A09666F6E742D73697A653A3730253B0D0A0977696474683A313030253B0D0A096865696768743A313030253B0D0A0970616464696E673A303B0D0A096D617267696E3A303B0D0A0D0A7D090D0A2E617474656E64616E74666F726D207B0D0A09636F6C6F72203A20626C61636B3B0D0A096261636B67726F756E642D696D6167653A2075726C28696D672F626F64792E676966293B0D0A096D617267696E3A303B0D0A0970616464696E673A303B0D0A0977696474683A313030253B0D0A096865696768743A313030253B0D0A7D0D0A0D0A2E6D61696E7469746C65207B0D0A09666F6E742D7765696768743A20626F6C643B0D0A09636F6C6F72203A20626C61636B3B0D0A096C65747465722D73706163696E673A313B0D0A096865696768743A353070783B0D0A0977696474683A32333070783B0D0A0970616464696E673A303B0D0A096D617267696E3A303B0D0A096261636B67726F756E642D696D6167653A2075726C28696D672F746F702E676966293B0D0A7D0D0A0D0A2E616374696F6E6D656E75207B0D0A09666F6E742D73697A653A203930253B0D0A09636F6C6F72203A20626C61636B3B0D0A096261636B67726F756E642D636F6C6F723A234530453045303B0D0A096D617267696E203A20353B0D0A0970616464696E673A353B0D0A0977696474683A3939253B0D0A0D0A7D0D0A2E616374696F6E64726F70646F776E207B0D0A09636F6C6F72203A20626C61636B3B0D0A7D0D0A0D0A2E736561726368666F726D207B0D0A09666F6E742D73697A653A203930253B0D0A09636F6C6F72203A20626C61636B3B0D0A096261636B67726F756E642D696D6167653A2075726C28696D672F626F64792E676966293B0D0A7D0D0A0D0A2F2A2055736564206279207468652073696465626172202A2F0D0A236D61696E626F6479207B0D0A096865696768743A3939253B0D0A096261636B67726F756E642D636F6C6F723A234530453045303B200D0A096D696E2D77696474683A31333070783B0D0A096C6566743A353B0D0A09746F703A333B0D0A09706F736974696F6E3A6162736F6C7574653B0D0A090D0A7D0D0A0D0A2E6D656E7574726565207B0D0A0970616464696E673A303B0D0A09616C69676E3A63656E7465723B0D0A09636F6C6F723A20626C61636B3B0D0A096D696E2D77696474683A32333070783B0D0A0977696474683A313030253B0D0A7D0D0A0D0A2E73657474696E6773626F6479207B0D0A0970616464696E673A303B0D0A09616C69676E3A63656E7465723B0D0A09636F6C6F723A20626C61636B3B0D0A096D696E2D77696474683A31393870783B0D0A0977696474683A313030253B0D0A096261636B67726F756E642D696D6167653A2075726C28696D672F626F64792E676966293B0D0A09746F703A373070783B0D0A09706F736974696F6E3A6162736F6C7574653B0D0A09666F6E742D7765696768743A6E6F726D616C3B0D0A096865696768743A3930253B0D0A09666F6E742D73697A653A3830253B0D0A7D0D0A2E73657474696E67736C697374207B0D0A09666F6E742D73697A653A3830253B0D0A7D0D0A2E696E7075746669656C64207B0D0A09666F6E742D73697A653A3930253B0D0A7D0D0A2E73657474696E677368656164696E67207B0D0A0970616464696E673A30203020302031323B0D0A0977696474683A3330253B0D0A7D0D0A2E74726565726F77207B0D0A09666F6E742D7765696768743A6E6F726D616C3B0D0A09666F6E742D73697A653A3835253B0D0A09766572746963616C2D616C69676E3A746578742D746F703B0D0A0970616464696E673A33203020332030203B0D0A096D617267696E3A303B0D0A09636F6C6F72203A20626C61636B3B0D0A09637572736F723A68616E643B0D0A096D696E2D6865696768743A313670783B0D0A7D0D0A2E726F7768656164696E67207B0D0A096261636B67726F756E642D636F6C6F723A234343434343433B0D0A09666F6E742D7765696768743A626F6C643B0D0A09636F6C6F723A626C61636B3B0D0A09626F726465723A33206F7574736574206C69676874677261793B0D0A096D617267696E3A3270783B0D0A0970616464696E672D6C6566743A353B0D0A09637572736F723A68616E643B0D0A09616C69676E3A63656E7465723B0D0A7D0D0A0D0A236D61696E636174616C6F67626F6479207B0D0A096865696768743A3939253B0D0A096261636B67726F756E642D696D6167653A2075726C28696D672F626F64792E676966293B0D0A0977696474683A313030253B0D0A096C6566743A353B0D0A09746F703A333B0D0A09706F736974696F6E3A6162736F6C7574653B0D0A7D0D0A0D0A2E696D67627574746F6E207B0D0A096261636B67726F756E642D636F6C6F723A234343434343433B0D0A09666F6E742D7765696768743A626F6C643B0D0A09636F6C6F723A626C61636B3B0D0A09626F726465723A33206F7574736574206C69676874677261793B0D0A096D617267696E3A3270783B0D0A0970616464696E673A323B0D0A09637572736F723A68616E643B0D0A09616C69676E3A63656E7465723B0D0A09666F6E742D73697A653A3830253B0D0A7D0D0A0D0A2E6E756D626572627574746F6E207B0D0A096261636B67726F756E642D636F6C6F723A234343434343433B0D0A09666F6E742D7765696768743A6E6F726D616C3B0D0A09636F6C6F723A626C61636B3B0D0A096D617267696E3A3170783B0D0A09637572736F723A68616E643B0D0A09616C69676E3A63656E7465723B0D0A09626F726465723A33206F7574736574206C69676874677261793B0D0A096865696768743A323070783B3B0D0A0977696474683A31323070783B0D0A09766572746963616C2D616C69676E3A626F74746F6D3B0D0A0970616464696E67203A20302030203020353B0D0A09666F6E742D73697A653A3830253B0D0A090D0A7D0D0A0D0A2E6E756D626572627574746F6E707573686564207B0D0A096261636B67726F756E642D636F6C6F723A234530453045303B0D0A09666F6E742D7765696768743A626F6C643B0D0A092F2A636F6C6F'O & 
  '723A626C75653B2A2F0D0A096D617267696E3A3170783B0D0A09637572736F723A68616E643B0D0A09616C69676E3A63656E7465723B0D0A09626F726465723A3320696E736574206C69676874677261793B0D0A096865696768743A323070783B3B0D0A0977696474683A31323070783B0D0A09766572746963616C2D616C69676E3A626F74746F6D3B0D0A0970616464696E67203A20302030203020353B0D0A09666F6E742D73697A653A3830253B0D0A090D0A7D0D0A2E616374696F6E736D616C6C627574746F6E207B0D0A096261636B67726F756E642D636F6C6F723A234343434343433B0D0A09666F6E742D7765696768743A626F6C643B0D0A09636F6C6F723A626C61636B3B0D0A096D617267696E3A3170783B0D0A09637572736F723A68616E643B0D0A09616C69676E3A63656E7465723B0D0A09666F6E742D73697A653A3730253B0D0A09626F726465723A32206F7574736574206C69676874677261793B0D0A096865696768743A313170783B0D0A0977696474683A313170783B0D0A09766572746963616C2D616C69676E3A626F74746F6D3B0D0A7D0D0A2E616374696F6E627574746F6E207B0D0A096261636B67726F756E642D636F6C6F723A234343434343433B0D0A09666F6E742D7765696768743A626F6C643B0D0A09636F6C6F723A626C61636B3B0D0A096D617267696E3A3270783B0D0A09637572736F723A68616E643B0D0A09616C69676E3A63656E7465723B0D0A09666F6E742D73697A653A3630253B0D0A09626F726465723A35206F7574736574206C69676874677261793B0D0A096865696768743A323570783B0D0A0977696474683A323570783B0D0A09766572746963616C2D616C69676E3A746F703B0D0A7D0D0A0D0A2E616374696F6E627574746F6E707573686564207B0D0A096261636B67726F756E642D636F6C6F723A234530453045303B0D0A09666F6E742D7765696768743A626F6C643B0D0A09636F6C6F723A626C61636B3B0D0A096D617267696E3A3270783B0D0A09616C69676E3A63656E7465723B0D0A09666F6E742D73697A653A3730253B0D0A09626F726465723A3520696E736574206C69676874677261793B0D0A096865696768743A323570783B0D0A0977696474683A323570783B0D0A09766572746963616C2D616C69676E3A746F703B0D0A09637572736F723A68616E643B0D0A090D0A7D0D0A0D0A0D0A2E7472656563656C6C207B0D0A0970616464696E673A302030203220323B0D0A7D0D0A2E74726565737061636572207B0D0A0970616464696E673A303B0D0A096D617267696E3A303B0D0A096D696E2D6865696768743A3270783B0D0A09666F6E742D73697A653A3170783B0D0A0977696474683A32303070783B0D0A090D0A7D0D0A2E706F707570666F726D207B0D0A09616C69676E203A2063656E7465723B0D0A09666F6E742D73697A653A203930253B0D0A09636F6C6F72203A20626C61636B3B0D0A096261636B67726F756E642D696D6167653A2075726C28696D672F626F64792E676966293B0D0A7D0D0A0D0A2E706F7075707469746C65207B0D0A09666F6E742D73697A653A20313230253B0D0A09666F6E742D776569676874203A20626F6C643B0D0A096C65747465722D73706163696E67203A20313B0D0A7D0D0A2E706F707570746162207B0D0A09666F6E742D73697A653A20313130253B0D0A096C65747465722D73706163696E67203A20313B0D0A09626F726465722D746F70203A203120736F6C696420626C61636B3B0D0A09626F726465722D7269676874203A203120736F6C696420626C61636B3B0D0A09626F726465722D6C656674203A203120736F6C696420626C61636B3B0D0A0970616464696E67203A20343B0D0A096D617267696E203A20382033203020333B0D0A097769647468203A20313030253B0D0A096865696768743A3830253B0D0A09766572746963616C2D616C69676E3A746578742D746F703B0D0A096261636B67726F756E642D636F6C6F723A626C61636B3B0D0A09616C69676E3A63656E7465723B090D0A09636F6C6F723A626C61636B3B0D0A09637572736F723A68616E643B0D0A7D0D0A2E74616273656C6563746564207B0D0A09666F6E742D73697A653A20313130253B0D0A096C65747465722D73706163696E67203A20313B0D0A09626F72646572203A203120736F6C696420626C61636B3B0D0A09626F726465722D626F74746F6D203A20303B0D0A0970616464696E67203A20342034203020343B0D0A096D617267696E203A20303B0D0A09746578742D616C69676E203A206C6566743B0D0A09766572746963616C2D616C69676E3A746578742D746F703B0D0A09616C69676E3A63656E7465723B0D0A096261636B67726F756E642D636F6C6F723A234530453045303B0D0A09636F6C6F723A626C61636B3B0D0A7D0D0A0D0A2E706F707570627574746F6E207B0D0A0977696474683A2031303070783B0D0A7D0D0A0D0A2E726573756C746C697374207B0D0A09616C69676E3A63656E7465723B0D0A09636F6C6F723A20626C61636B3B0D0A0977696474683A313030253B0D0A096865696768743A3839253B0D0A096F766572666C6F773A6175746F3B0D0A09706F736974696F6E3A6162736F6C7574653B0D0A096261636B67726F756E642D636F6C6F723A234530453045303B0D0A090D0A7D0D0A2E726573756C74726F77207B0D0A09666F6E742D7765696768743A6E6F726D616C3B0D0A09666F6E742D73697A653A3735253B0D0A09766572746963616C2D616C69676E3A746578742D746F703B0D0A0970616464696E673A313B0D0A096D617267696E3A303B0D0A09636F6C6F72203A20626C61636B3B0D0A09637572736F723A68616E643B0D0A096D696E2D6865696768743A313670783B0D0A7D0D0A2E726573756C7468656164696E67207B0D0A096261636B67726F756E642D636F6C6F723A234343434343433B0D0A09666F6E742D7765696768743A626F6C643B0D0A09636F6C6F723A626C61636B3B0D0A09626F726465723A33206F7574736574206C69676874677261793B0D0A096D617267696E3A3270783B0D0A0970616464696E672D6C6566743A353B0D0A09637572736F723A68616E643B0D0A09616C69676E3A63656E7465723B0D0A09666F6E742D73697A653A3835253B0D0A7D0D0A2E616374696F6E7465787461726561207B0D0A09666F6E742D73697A653A3930253B0D0A09746578742D616C69676E3A6C6566743B0D0A0977696474683A313030253B0D0A096865696768743A31303070783B0D0A7D0D0A0D0A3C2F7374796C653E0D0A0D0A3C2F686561643E0D0A3C626F6479206F6E6C6F61643D22696E697428293B22203E0D0A0D0A0D0A3C6469762069643D226D61696E626F647922203E0D0A0D0A3C666F726D206E616D653D22726573657475736572666F726D22207461726765743D225F73656C662220616374696F6E3D22736572766C65742F44727352657365745573657222206D6574686F643D22706F7374223E0D0A3C696E70757420747970653D68696464656E206E616D653D227265736574757365725F6469726964222069643D227265736574757365725F6469726964222076616C75653D22333631393031303030313A303436313832223E0D0A3C2F666F726D3E0D0A0D0A3C666F726D206E616D653D2270726573656E6365666F726D22207461726765743D225F73656C662220616374696F6E3D2244727350726573656E636522206D6574686F643D22706F7374223E0D0A3C696E70757420747970653D68696464656E206E616D653D2270726573656E63655F636F6465222069643D2270726573656E63655F636F6465222076616C75653D22223E0D0A3C696E70757420747970653D68696464656E206E616D653D2270726573656E63655F6469766572746E6272222069643D2270726573656E63655F6469766572746E6272222076616C75653D22223E0D0A3C696E70757420747970653D68696464656E206E616D653D2270726573656E63655F756E74696C222069643D2270726573656E63655F756E74696C222076616C75653D22223E0D0A3C696E70757420747970653D68696464656E206E616D653D2270726573656E63655F6469726964222069643D2270726573656E63655F6469726964222076616C75653D22223E0D0A3C696E70757420747970653D68696464656E206E616D653D2270726573656E63655F74657874222069643D2270726573656E63655F74657874222076616C75653D22223E0D0A3C696E70757420747970653D68696464656E206E616D653D2270726573656E63655F707265736574222069643D2270726573656E63655F707265736574222076616C75653D22223E0D0A3C2F666F726D3E0D0A0D0A3C64697620636C6173733D226D61696E7469746C6522207374796C653D2277696474683A31303025223E0D0A3C7461626C652063656C6C73706163696E673D302063656C6C70616464696E673D332077696474683D223130302522203E0D0A3C74723E0D0A093C746420636C6173733D226D61696E7469746C6522207374796C653D2277696474683A313030252220616C69676E3D626173656C696E653E0D0A093C696D67207372633D22696D672F7370616365722E67696622206865696768743D35302077696474683D323E0D0A0953616D62616C2042696A20202831313030290D0A3C212D2D20746F6F6C626F78202D2D3E0D0A093C746420616C69676E3D7269676874202076616C69676E3D626173656C696E65206E6F777261703E200D0A09090D0A09093C7370616E2069643D227265736574627574746F6E222020636C6173733D22616374696F6E627574746F6E22206F6E636C69636B3D2272657365745573657253657474696E677328292220203E0D0A090909093C696D67207372633D22696D672F7370616365722E676966222077696474683D22323522206865696774683D223235223E526573657420757365722073657474696E67730D0A09093C2F7370616E3E0D0A09090D0A09093C7370616E2069643D226C6F676F7574627574746F6E222020636C6173733D22616374696F6E627574746F6E22206F6E636C69636B3D226C6F676F757428292220203E0D0A090909093C696D67207372633D22696D672F7370616365722E676966222077696474683D22323522206865696774683D223235223E4C6F67206F75740D0A09093C2F7370616E3E0D0A3C74723E3C746420636F6C7370616E3D323E3C68723E0D0A0D0A3C2F7461626C653E0D0A0D0A3C2F6469763E0D0A0D0A3C64697620636C6173733D2273657474696E6773626F647922202069643D2270726573656E63656D656E75223E0D0A0D0A3C7461626C6520207374796C653D2277696474683A313030253B636F6C6F723A626C61636B3B6261636B67726F756E642D636F6C6F723A23453045304530'O & 
  '2220626F726465723D302063656C6C70616464696E673D332063656C6C73706163696E673D323E0D0A3C74723E3C7464207374796C653D2277696474683A3335253B626F726465723A3120736F6C696420677261793B223E0D0A0D0A093C7461626C6520207374796C653D2277696474683A313030253B636F6C6F723A626C61636B3B6261636B67726F756E642D636F6C6F723A234530453045302220626F726465723D302063656C6C70616464696E673D332063656C6C73706163696E673D323E0D0A09093C74723E3C746420207374796C653D22666F6E742D73697A653A31303025223E3C623E50726573656E63650D0A090D0A0D0A09093C7464206E6F777261703E093C696D67207372633D27696D672F6E6F745F617661696C61626C655F6E6F5F4346502E676966273E4C65667420666F7220746865206461790D0A0D0A0D0A093C74723E0D0A09093C746420636F6C7370616E3D323E3C68723E0D0A090D0A0D0A09093C7472207374796C653D22646973706C61793A223E3C746420636F6C7370616E3D323E507265646566696E6564206F7074696F6E730D0A090D0A0D0A09093C747220207374796C653D22646973706C61793A223E0D0A0909093C74642020636F6C7370616E3D32203E0D0A0909093C7370616E207374796C653D2277696474683A3730252220636C6173733D27696D67627574746F6E27206F6E636C69636B3D2270726573657450726573656E636528273027293B22203E0D0A090909093C696D67207372633D27696D672F617661696C61626C652E676966272077696474683D3136206865696768743D31363E4368616E676520746F20417661696C61626C650D0A0909093C2F7370616E3E0D0A0909093C62723E0D0A0D0A09093C747220207374796C653D22646973706C61793A223E0D0A0909093C74642020636F6C7370616E3D32203E0D0A0909093C7370616E207374796C653D2277696474683A3730252220636C6173733D27696D67627574746F6E27206F6E636C69636B3D2270726573657450726573656E636528273127293B22203E0D0A090909093C696D67207372633D27696D672F6E6F745F617661696C61626C655F6E6F5F4346502E676966272077696474683D3136206865696768743D31363E4368616E676520746F20427573790D0A0909093C2F7370616E3E0D0A0909093C62723E0D0A0D0A09093C747220207374796C653D22646973706C61793A223E0D0A0909093C74642020636F6C7370616E3D32203E0D0A0909093C7370616E207374796C653D2277696474683A3730252220636C6173733D27696D67627574746F6E27206F6E636C69636B3D2270726573657450726573656E636528273227293B22203E0D0A090909093C696D67207372633D27696D672F6E6F745F617661696C61626C655F6E6F5F4346502E676966272077696474683D3136206865696768743D31363E4368616E676520746F204D656574696E670D0A0909093C2F7370616E3E0D0A0909093C62723E0D0A0D0A09093C747220207374796C653D22646973706C61793A223E0D0A0909093C74642020636F6C7370616E3D32203E0D0A0909093C7370616E207374796C653D2277696474683A3730252220636C6173733D27696D67627574746F6E27206F6E636C69636B3D2270726573657450726573656E636528273327293B22203E0D0A090909093C696D67207372633D27696D672F6E6F745F617661696C61626C655F6E6F5F4346502E676966272077696474683D3136206865696768743D31363E4368616E676520746F204C756E63680D0A0909093C2F7370616E3E0D0A0909093C62723E0D0A0D0A09093C747220207374796C653D22646973706C61793A223E0D0A0909093C74642020636F6C7370616E3D32203E0D0A0909093C7370616E207374796C653D2277696474683A3730252220636C6173733D27696D67627574746F6E27206F6E636C69636B3D2270726573657450726573656E636528273427293B22203E0D0A090909093C696D67207372633D27696D672F6E6F745F617661696C61626C655F6E6F5F4346502E676966272077696474683D3136206865696768743D31363E4368616E676520746F204C65667420666F7220746865206461790D0A0909093C2F7370616E3E0D0A0909093C62723E0D0A0D0A09093C74723E0D0A09093C74642020636F6C7370616E3D323E3C62723E3C68723E0D0A09090D0A09093C74723E3C7464203E3C6120687265663D23206F6E636C69636B3D2273686F776D6F72656F7074696F6E73282922203E4D6F7265206F7074696F6E732E2E2E3C2F613E0D0A09090D0A0909093C7464207374796C653D22646973706C61793A6E6F6E65222069643D226D6F72656F7074696F6E73627574746F6E22206E6F7772617020616C69676E3D72696768743E3C7370616E20636C6173733D22696D67627574746F6E22207374796C653D22666F6E742D73697A653A37352522206F6E636C69636B3D2273657450726573656E636528293B223E0D0A09090909093C696D672069643D22616374696F6E696D61676522207372633D22696D672F7370616365722E676966223E266E6273703B266E6273703B0D0A090909094368616E6765206E6F773C2F7370616E3E0D0A09090D0A0D0A09093C74723E0D0A09093C746420636F6C7370616E3D323E0D0A09093C7461626C652069643D226D6F72656F7074696F6E737461626C6522207374796C653D22646973706C61793A6E6F6E65223E0D0A09093C74723E0D0A0909093C746420636F6C7370616E3D322076616C69676E3D746F70203E0D0A0909093C73656C656374207374796C653D2277696474683A31303025222069643D2270636F64656C6973742220206F6E6368616E67653D2270636F64654368616E67656428746869732922203E0D0A0909093C6F7074696F6E2076616C75653D27273E2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D3C2F6F7074696F6E3E0D0A3C6F7074696F6E2076616C75653D27315F273E42757379202D204E6F20646976657273696F6E0A3C6F7074696F6E2076616C75653D27315F2D31273E42757379202D20416C6C2063616C6C7320746F206D61696E206E756D6265720A3C6F7074696F6E2076616C75653D27315F2D32273E42757379202D20416C6C2063616C6C7320746F20766F6963656D61696C0A3C6F7074696F6E2076616C75653D27315F78273E42757379202D20416C6C2063616C6C7320746F206E756D6265720A3C6F7074696F6E2076616C75653D27273E2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D3C2F6F7074696F6E3E0A3C6F7074696F6E2076616C75653D27325F273E4D656574696E67202D204E6F20646976657273696F6E0A3C6F7074696F6E2076616C75653D27325F2D31273E4D656574696E67202D20416C6C2063616C6C7320746F206D61696E206E756D6265720A3C6F7074696F6E2076616C75653D27325F2D32273E4D656574696E67202D20416C6C2063616C6C7320746F20766F6963656D61696C0A3C6F7074696F6E2076616C75653D27325F78273E4D656574696E67202D20416C6C2063616C6C7320746F206E756D6265720A3C6F7074696F6E2076616C75653D27273E2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D3C2F6F7074696F6E3E0A3C6F7074696F6E2076616C75653D27335F273E4C756E6368202D204E6F20646976657273696F6E0A3C6F7074696F6E2076616C75653D27335F2D31273E4C756E6368202D20416C6C2063616C6C7320746F206D61696E206E756D6265720A3C6F7074696F6E2076616C75653D27335F2D32273E4C756E6368202D20416C6C2063616C6C7320746F20766F6963656D61696C0A3C6F7074696F6E2076616C75653D27335F78273E4C756E6368202D20416C6C2063616C6C7320746F206E756D6265720A3C6F7074696F6E2076616C75653D27273E2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D3C2F6F7074696F6E3E0A3C6F7074696F6E2076616C75653D27345F273E4C65667420666F722074686520646179202D204E6F20646976657273696F6E0A3C6F7074696F6E2076616C75653D27345F2D31273E4C65667420666F722074686520646179202D20416C6C2063616C6C7320746F206D61696E206E756D6265720A3C6F7074696F6E2076616C75653D27345F2D32273E4C65667420666F722074686520646179202D20416C6C2063616C6C7320746F20766F6963656D61696C0A3C6F7074696F6E2076616C75653D27345F78273E4C65667420666F722074686520646179202D20416C6C2063616C6C7320746F206E756D6265720A3C6F7074696F6E2076616C75653D27273E2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D3C2F6F7074696F6E3E0A3C6F7074696F6E2076616C75653D27355F273E52657475726E73202D204E6F20646976657273696F6E0A3C6F7074696F6E2076616C75653D27355F2D31273E52657475726E73202D20416C6C2063616C6C7320746F206D61696E206E756D6265720A3C6F7074696F6E2076616C75653D27355F2D32273E52657475726E73202D20416C6C2063616C6C7320746F20766F6963656D61696C0A3C6F7074696F6E2076616C75653D27355F78273E52657475726E73202D20416C6C2063616C6C7320746F206E756D6265720A3C6F7074696F6E2076616C75653D27273E2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D3C2F6F7074696F6E3E0A0D0A09090909090D0A0909093C2F73656C6563743E0D0A0909093C74723E3C746420636F6C7370616E3D323E0D0A090909093C696E70757420747970653D746578742076616C75653D2222206F6E6B657975703D224E756D6265724368616E67656428746869732922207374796C653D22646973706C61793A6E6F6E65222069643D22646976657273696F6E6E6272223E0D0A0D0A093C74723E0D0A093C7464207374796C653D22666F6E742D73697A653A3930253B22206E6F7772617020636F6C7370616E3D323E4261636B200D0A09093C7370616E207374796C653D22666F6E742D73697A653A373525223E284D4D2F64642F79797979293C2F7370616E3E0D0A0909093C696E70757420747970653D746578742069643D22756E74696C64617465222076616C75653D22222073697A653D223130223E0D0A09093C7370616E207374796C653D22666F6E742D73697A653A373525223E2848483A6D6D293C2F7370616E3E0D0A0909093C696E70757420747970653D746578742069643D22756E74696C74696D65222076616C75653D22222073697A653D2235223E0D0A093C74723E0D0A0909093C746420636F6C'O & 
  '7370616E3D322076616C69676E3D746F702077696474683D3330253E3C623E4D6573736167650D0A09090D0A09093C7472203E0909090D0A0909093C746420636F6C7370616E3D322076616C69676E3D746F70203E0D0A0909093C7465787461726561207374796C653D2277696474683A3939253B2220726F77733D3520636C6173736E616D653D22616374696F6E7465787461726561220D0A0909090969643D22705F7465787422206F6E6B6579646F776E3D22746869732E76616C75653D27273B746869732E6F6E6B6579646F776E3D6E756C6C22206F6E6B657975703D226469766D73674368616E676564287468697329223E4865726520796F752063616E20777269746520796F7572206D65737361676520746F2074686520617474656E64616E7420616E64206F74686572732E204D61782032353520636861726163746572732E3C2F74657874617265613E0D0A09090D0A09090D0A0909093C2F7461626C653E3C212D2D6D6F7265206F7074696F6E732D2D3E0D0A093C2F7461626C653E0D0A0D0A3C212D2D2043616C6C206465666C656374202D2D3E0D0A3C7464207374796C653D2277696474683A3335253B626F726465723A3120736F6C696420677261793B646973706C61793A6E6F6E65222076616C69676E3D746F703E0D0A093C7461626C6520207374796C653D22636F6C6F723A626C61636B3B6261636B67726F756E642D636F6C6F723A234530453045303B77696474683A313030252220626F726465723D302063656C6C70616464696E673D332063656C6C73706163696E673D323E0D0A09093C74723E3C7464207374796C653D22666F6E742D73697A653A31303025223E3C623E4465666C6563742063616C6C0D0A0909093C746420616C69676E3D72696768743E3C696E7075742020636C6173733D22696D67627574746F6E22207374796C653D22666F6E742D73697A653A3830253B22200D0A09090909747970653D22627574746F6E222076616C75653D224368616E676522206F6E636C69636B3D225365744465666C656374282922203E0D0A0909090D0A09093C74723E3C746420636F6C7370616E3D323E3C68723E090D0A09093C7472206F6E6D6F7573656F7665723D2274725F6D6F7573656F7665722874686973293B22206F6E6D6F7573656F75743D2274725F6D6F7573656F75742874686973292220636C6173733D74726565726F773E0D0A0909093C746420636F6C7370616E3D323E3C696E707574206F6E636C69636B3D226366436C69636B65642874686973293B2220747970653D726164696F2069643D2263665F6F70657261746F7222206E616D653D226366222076616C75653D222D3122203E266E6273703B266E6273703B4D61696E206E756D6265720D0A09093C7472206F6E6D6F7573656F7665723D2274725F6D6F7573656F7665722874686973293B22206F6E6D6F7573656F75743D2274725F6D6F7573656F75742874686973292220636C6173733D74726565726F773E0D0A0909093C746420636F6C7370616E3D323E3C696E707574206F6E636C69636B3D226366436C69636B65642874686973293B2220747970653D726164696F2069643D2263665F766F6963656D61696C22206E616D653D226366222076616C75653D222D3222203E266E6273703B266E6273703B566F6963656D61696C0D0A09093C7472206F6E6D6F7573656F7665723D2274725F6D6F7573656F7665722874686973293B22206F6E6D6F7573656F75743D2274725F6D6F7573656F75742874686973292220636C6173733D74726565726F773E0D0A0909093C746420636F6C7370616E3D323E3C696E707574206F6E636C69636B3D226366436C69636B65642874686973293B2220747970653D726164696F2069643D2263665F7822206E616D653D226366222076616C75653D225822203E266E6273703B266E6273703B50686F6E650D0A0909093C696E70757420747970653D74657874206E616D653D2263665F6E756D626572222069643D2263665F6E756D62657222206F6E6B657975703D224E756D6265724368616E6765642874686973293B22207374796C653D227669736962696C6974793A68696464656E222076616C75653D22223E0D0A09090D0A093C2F7461626C653E0D0A0D0A0D0A3C666F726D206E616D653D2263616C6C6465666C656374666F726D22207461726765743D225F73656C662220616374696F6E3D22736572766C65742F4472734465666C65637422206D6574686F643D22706F7374223E0D0A3C696E70757420747970653D68696464656E206E616D653D226469726964222069643D226469726964222076616C75653D22223E0D0A3C696E70757420747970653D68696464656E206E616D653D2263616C6C6465666C6563746E72222069643D2263616C6C6465666C6563746E72222076616C75653D22223E0D0A3C2F666F726D3E0D0A0D0A3C212D2D204344472F68756E7467726F757073202D2D3E0D0A3C7464207374796C653D2277696474683A3335253B626F726465723A3120736F6C696420677261793B222076616C69676E3D746F703E0D0A093C666F726D206E616D653D226867736574746E6722207461726765743D225F73656C662220616374696F6E3D22736572766C65742F44727348756E7447726F757022206D6574686F643D22706F7374223E0D0A093C696E70757420747970653D68696464656E206E616D653D226469726964222069643D226469726964222076616C75653D22223E0D0A093C7461626C6520207374796C653D22636F6C6F723A626C61636B3B6261636B67726F756E642D636F6C6F723A234530453045303B77696474683A313030252220626F726465723D302063656C6C70616464696E673D332063656C6C73706163696E673D323E0D0A09093C74723E3C7464207374796C653D22666F6E742D73697A653A313030253B223E3C623E41637469766174652F64656163746976617465203C62723E43616C6C20646973747269627574696F6E2067726F7570730D0A0909093C746420616C69676E3D72696768742076616C69676E3D746F703E3C696E7075742020636C6173733D22696D67627574746F6E22207374796C653D22666F6E742D73697A653A3830253B22200D0A09090909747970653D22627574746F6E222076616C75653D224368616E676522206F6E636C69636B3D22416374697661746547726F757073282922203E0D0A09093C74723E3C746420636F6C7370616E3D323E3C68723E090D0A3C74723E3C74643E4E6F74206D656D626572206F6620616E792063616C6C20646973747269627574696F6E2067726F75700A0D0A093C2F666F726D3E0D0A093C2F7461626C653E0D0A0D0A3C2F7461626C653E0D0A3C2F6469763E0D0A3C2F6469763E0D0A0D0A3C2F626F64793E0D0A3C2F68746D6C3E0D0A'O;

  //

  var integer vl_remainingStringLength := lengthof(received_reply);
  var CHARSTRINGS vl_decodedMessagePieces := {};
  var HTTPMessage vloc_decodedMsg;
  while( vl_remainingStringLength  >0 )
  {
    log("Original msg string length = ", lengthof(received_reply) );
    vl_remainingStringLength:= dec_HTTPMessage( received_reply, vloc_decodedMsg, true)
    log(" The decoded message Piece = ", vloc_decodedMsg );
    log("remaining msg string length:", vl_remainingStringLength);
  }


}//eof  TC


  function singleTC() runs on HTTP_client
  {
    // These may be declared as templates at global scope.
    // Variables are used for performance reasons:
    //     sending is faster in this way.
    var HeaderLines hd := { {header_name := "Host", header_value := HttpServerHostName},
      {header_name := "Content-Length", header_value := "0" } };
    //        {header_name := "Connection", header_value := "close" } 

    var HTTPRequest r := { client_id := omit, method := "GET", uri := "/", 
      version_major := 1, version_minor := 1, header := hd, body := "" };

    var HTTPMessage send_req := { request := r };
    var Connect conn := { hostname := HttpServerHostName,
      portnumber := HttpServerPort, use_ssl := HTTPClientUseSSL };
    var Close c := { client_id := omit };
    timer T_guard := 5.0;
    var integer i;
    var integer how_many_times := 1; //100

    map(self:HTTP_client_port, system:HTTP_client_port);

    HTTP_client_port.send(conn);

    for(i := 0; i < how_many_times; i := i + 1 ) {
      HTTP_client_port.send(send_req);
      if(T_guard.running) { T_guard.stop }
      
      T_guard.start;

      alt {
        [] HTTP_client_port.receive(recv_resp) {
            if(i == how_many_times - 1) {
              HTTP_client_port.send(c);
              setverdict(pass);
            }
          }
        [] HTTP_client_port.receive(h) { 
            HTTP_client_port.send(c);
            setverdict(fail);
            i := how_many_times;
          }
        [] HTTP_client_port.receive {
            HTTP_client_port.send(c); 
            setverdict(fail); 
          }	
        [] T_guard.timeout {
            setverdict(fail); }	
      };
    }

    unmap(self:HTTP_client_port, system:HTTP_client_port);
  }
  //==================================
  //=        Testcases               =
  //==================================


  testcase parallel_TC_client() runs on HTTP_client
  {
    var HTTP_client client_PTC;
    client_PTC := HTTP_client.create;
    client_PTC.start(TC());
    client_PTC.done;
  }

  testcase tc_parallel_server() runs on HTTP_server
  {
    var HTTP_server server_PTC;
    server_PTC := HTTP_server.create;
    server_PTC.start(server_TC());
    server_PTC.done;
  }

  testcase tc_stress(in integer n) runs on HTTP_client
  {
    var ptcList ptc;
    var integer r;

    for( r := 0; r < n; r := r + 1 ) {
      ptc[r] := HTTP_client.create;
    };

    for( r := 0; r < n; r := r + 1 ) {
      ptc[r].start(singleTC());
    };

    for( r := 0; r < n; r := r + 1 ) {
      ptc[r].done;
    };
  }

  testcase tc_stress_Persistent_both() runs on HTTP_client
  {
    var HTTP_client client_PTC;
    client_PTC := HTTP_client.create;
    var HTTP_server server_PTC;
    server_PTC := HTTP_server.create;

    server_PTC.start(server_TC());
    timer t_wait := 0.1;
    t_wait.start;
    t_wait.timeout;
    client_PTC.start(singleTC());

    client_PTC.done;
    server_PTC.done;
  }

  testcase tc_server() runs on HTTP_server
  {
    server_TC();
  }

  testcase tc_client() runs on HTTP_client
  {
    singleTC();
  }


  testcase tc_http_encDec() runs on MTC
  {
    f_EncDec();
  }

  testcase tc_http_encDec2() runs on MTC
  {
    f_EncDec2();
  }
  control
  {
    log("control started");
    //execute(tc_parallel_server());
    //execute(tc_stress(1));
    //execute(tc_stress_Persistent_both());
    //execute(tc_server);
    //execute(tc_client);
    execute(tc_http_encDec());
    execute(tc_http_encDec2());
  }

}