Index: linden/indra/llui/llscrolllistctrl.cpp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linden/indra/llui/llscrolllistctrl.cpp	(revision 1073)
+++ linden/indra/llui/llscrolllistctrl.cpp	(working copy)
@@ -578,6 +578,7 @@
 	mOnDoubleClickCallback( NULL ),
 	mOnMaximumSelectCallback( NULL ),
 	mOnSortChangedCallback( NULL ),
+	mOnSelectCallback( NULL ),
 	mHighlightedItem(-1),
 	mBorder(NULL),
 	mSearchColumn(0),
@@ -1995,6 +1996,7 @@
 	return LLUICtrl::handleMouseUp(x, y, mask);
 }
=20
+
 BOOL LLScrollListCtrl::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
 	//BOOL handled =3D FALSE;
@@ -2443,6 +2445,16 @@
 	return TRUE;
 }
=20
+void LLScrollListCtrl::setSelectCallback(void (*cb)(void*), void* =
userdata)
+{
+	mOnSelectCallback =3D cb;
+	if (userdata)
+	{
+		mSelectCallbackData =3D userdata;
+	}
+}
+
+
 void LLScrollListCtrl::selectItem(LLScrollListItem* itemp, BOOL =
select_single_item)
 {
 	if (!itemp) return;
@@ -2465,6 +2477,12 @@
 		mLastSelected =3D itemp;
 		mSelectionChanged =3D TRUE;
 	}
+
+	if (mOnSelectCallback)
+	{
+		(*mOnSelectCallback)( mSelectCallbackData );
+	}
+
 }
=20
 void LLScrollListCtrl::deselectItem(LLScrollListItem* itemp)
Index: linden/indra/llui/llscrolllistctrl.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linden/indra/llui/llscrolllistctrl.h	(revision 1073)
+++ linden/indra/llui/llscrolllistctrl.h	(working copy)
@@ -479,6 +479,8 @@
 	void			setMaximumSelectCallback( void (*cb)(void*) ) { =
mOnMaximumSelectCallback =3D cb; }
 	void			setSortChangedCallback( void (*cb)(void*) ) { =
mOnSortChangedCallback =3D cb; }
=20
+	void			setSelectCallback( void (*cb)(void *data), void* data =3D NULL =
);
+
 	void			swapWithNext(S32 index);
 	void			swapWithPrevious(S32 index);
=20
@@ -701,7 +703,11 @@
 	void			(*mOnDoubleClickCallback)(void* userdata);
 	void			(*mOnMaximumSelectCallback)(void* userdata );
 	void			(*mOnSortChangedCallback)(void* userdata);
+	void			(*mOnSelectCallback)(void* userdata);
=20
+	void*			mSelectCallbackData;
+
+
 	S32				mHighlightedItem;
 	class LLViewBorder*	mBorder;
=20
Index: linden/indra/newview/llpanelnetwork.cpp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linden/indra/newview/llpanelnetwork.cpp	(revision 1073)
+++ linden/indra/newview/llpanelnetwork.cpp	(working copy)
@@ -63,17 +63,66 @@
=20
 BOOL LLPanelNetwork::postBuild()
 {
+	mRouteScrollBox =3D(LLScrollListCtrl*)this->getChildView("IP_Routes", =
TRUE);
+	mRouteScrollBox->setMaxSelectable(1);
+	mRouteScrollBox->setCommitOnSelectionChange(true);
+
+	U32 SIPAddress;
+	U32 DIPAddress;
+	U16 SPort;
+	U16 DPort;
+	U16 PortCount;
+	int size;
+
+	Routes=3D0;
+=09
+	LLString filename =3D =
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "ServerNAT.bin");
+	FILE* fp =3D fopen(filename.c_str(),"rb");
+	if (fp)
+	{
+		size=3D1;
+		while(size=3D=3D1)
+		{
+			size =3D fread(&SIPAddress,4,1,fp);
+			size =3D fread(&SPort,2,1,fp);
+			size =3D fread(&DIPAddress,4,1,fp);
+			size =3D fread(&DPort,2,1,fp);
+			size =3D fread(&PortCount,2,1,fp);
+			if (size =3D=3D 1)
+			{				 =20
+				SIP[Routes]=3DSIPAddress;
+				DIP[Routes]=3DDIPAddress;
+				Spt[Routes]=3DSPort;
+				Dsp[Routes]=3DDPort;
+				Cnt[Routes]=3DPortCount;
+				Routes++;
+
+			}
+		}
+		fclose(fp);
+	}
+	UpdateIPRouteList(this);
+
+
 	LLString cache_location =3D =
gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
 	childSetText("cache_location", cache_location);
 	=09
 	childSetAction("clear_cache", onClickClearCache, this);
 	childSetAction("set_cache", onClickSetCache, this);
 	childSetAction("reset_cache", onClickResetCache, this);
+
+	childSetAction("AddIPRoute", onClickAddIPRoute, this);
+	childSetAction("UpdateIPRoute", onClickUpdateIPRoute, this);
+	childSetAction("DeleteIPRoute", onClickDeleteIPRoute, this);
+
+	mRouteScrollBox->setSelectCallback(onClickScrollBox, this);
 =09
+
 	childSetEnabled("connection_port",=20
 			gSavedSettings.getBOOL("ConnectionPortEnabled"));
 	childSetCommitCallback("connection_port_enabled", onCommitPort, this);
=20
+=09
=20
 	refresh();
=20
@@ -167,3 +216,183 @@
   self->childSetEnabled("connection_port", check->get());
   gViewerWindow->alertXml("ChangeConnectionPort");
 }
+
+
+
+void LLPanelNetwork::UpdateIPRouteList(LLPanelNetwork* self)=20
+{
+	int r;
+	U32 IPA;
+	U16 Prt;
+	U16 Cnt;
+
+	LLSD element;
+	element["columns"][0]["column"] =3D "Sorce_IP_Address";
+	element["columns"][1]["column"] =3D "Sorce_IP_Port";
+	element["columns"][2]["column"] =3D "Sorce_IP_Port2";
+	element["columns"][3]["column"] =3D "Desternation_IP_Address";
+	element["columns"][4]["column"] =3D "Desternation_IP_Port";
+	element["columns"][5]["column"] =3D "Desternation_IP_Port2";
+
+	self->mRouteScrollBox->clearRows();
+
+	for(r=3D0;r < self->Routes;r++)
+	{
+		IPA=3Dself->SIP[r];
+		element["columns"][0]["value"] =3D llformat("%d.%d.%d.%d",IPA & 255, =
(IPA >> 8) & 255 , (IPA >> 16) & 255 , (IPA >> 24) & 255 );
+		Prt=3Dself->Spt[r];
+		element["columns"][1]["value"] =3D llformat("%d",Prt);
+		Cnt=3Dself->Cnt[r];
+		element["columns"][2]["value"] =3D llformat("%d",Prt+Cnt-1);
+		IPA=3Dself->DIP[r];
+		element["columns"][3]["value"] =3D llformat("%d.%d.%d.%d",IPA & 255, =
(IPA >> 8) & 255 , (IPA >> 16) & 255 , (IPA >> 24) & 255 );
+		Prt=3Dself->Dsp[r];
+		element["columns"][4]["value"] =3D llformat("%d",Prt);
+		element["columns"][5]["value"] =3D llformat("%d",Prt+Cnt-1);
+
+		self->mRouteScrollBox->addElement(element, ADD_BOTTOM);
+
+	}
+}
+
+void LLPanelNetwork::UpdateIPRouteFile(LLPanelNetwork* self)=20
+{
+	LLString filename =3D =
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "ServerNAT.bin");
+	FILE* fp =3D fopen(filename.c_str(),"wb");
+	int n;
+	if (fp)
+	{
+		for(n=3D0;n < self->Routes;n++)
+		{
+			fwrite(&self->SIP[n],4,1,fp);
+			fwrite(&self->Spt[n],2,1,fp);
+			fwrite(&self->DIP[n],4,1,fp);
+			fwrite(&self->Dsp[n],2,1,fp);
+			fwrite(&self->Cnt[n],2,1,fp);
+		}
+	}
+	fclose(fp);
+}
+
+void LLPanelNetwork::onClickAddIPRoute(void* user_data)
+{
+	LLPanelNetwork* self =3D (LLPanelNetwork*)user_data;
+	LLLineEditor * ed1 =3D (LLLineEditor*)self->getChildView("SIPAD", =
TRUE);
+	LLLineEditor * ed2 =3D (LLLineEditor*)self->getChildView("DIPAD", =
TRUE);
+	LLLineEditor * ed3 =3D (LLLineEditor*)self->getChildView("SIPPort", =
TRUE);
+	LLLineEditor * ed4 =3D (LLLineEditor*)self->getChildView("DIPPort", =
TRUE);
+	LLSpinCtrl * spn =3D (LLSpinCtrl*)self->getChildView("RoutePortCount", =
TRUE);
+
+	U32 SIPAddress;
+	U32 DIPAddress;
+	U16 SPort;
+	U16 DPort;
+	U16 PortCount;
+
+	PortCount=3D(U16)spn->get();
+	SIPAddress=3Dinet_addr(ed1->getText().c_str());
+	DIPAddress=3Dinet_addr(ed2->getText().c_str());
+	LLString temp=3Ded3->getText();
+	LLString::convertToU16(temp, SPort);
+	temp=3Ded4->getText();
+	LLString::convertToU16(temp, DPort);
+
+	self->SIP[self->Routes]=3DSIPAddress;
+	self->DIP[self->Routes]=3DDIPAddress;
+	self->Spt[self->Routes]=3DSPort;
+	self->Dsp[self->Routes]=3DDPort;
+	self->Cnt[self->Routes]=3DPortCount;
+	self->Routes++;
+
+	UpdateIPRouteList(self);
+	UpdateIPRouteFile(self);
+}
+
+void LLPanelNetwork::onClickUpdateIPRoute(void* user_data)
+{
+	LLPanelNetwork* self =3D (LLPanelNetwork*)user_data;
+	S32 index=3Dself->mRouteScrollBox->getFirstSelectedIndex();
+	if (index<0) return;
+
+	LLLineEditor * ed1 =3D (LLLineEditor*)self->getChildView("SIPAD", =
TRUE);
+	LLLineEditor * ed2 =3D (LLLineEditor*)self->getChildView("DIPAD", =
TRUE);
+	LLLineEditor * ed3 =3D (LLLineEditor*)self->getChildView("SIPPort", =
TRUE);
+	LLLineEditor * ed4 =3D (LLLineEditor*)self->getChildView("DIPPort", =
TRUE);
+	LLSpinCtrl * spn =3D (LLSpinCtrl*)self->getChildView("RoutePortCount", =
TRUE);
+
+	U32 SIPAddress;
+	U32 DIPAddress;
+	U16 SPort;
+	U16 DPort;
+	U16 PortCount;
+	PortCount=3D(U16)spn->get();
+
+	SIPAddress=3Dinet_addr(ed1->getText().c_str());
+	DIPAddress=3Dinet_addr(ed2->getText().c_str());
+	LLString temp=3Ded3->getText();
+	LLString::convertToU16(temp, SPort);
+	temp=3Ded4->getText();
+	LLString::convertToU16(temp, DPort);
+
+	self->SIP[index]=3DSIPAddress;
+	self->DIP[index]=3DDIPAddress;
+	self->Spt[index]=3DSPort;
+	self->Dsp[index]=3DDPort;
+	self->Cnt[index]=3DPortCount;
+	UpdateIPRouteList(self);
+	self->mRouteScrollBox->selectNthItem(index);
+	UpdateIPRouteFile(self);
+}
+
+void LLPanelNetwork::onClickDeleteIPRoute(void* user_data)
+{
+	LLPanelNetwork* self =3D (LLPanelNetwork*)user_data;
+	S32 index=3Dself->mRouteScrollBox->getFirstSelectedIndex();
+	if (index<0) return;
+	self->mRouteScrollBox->deleteSingleItem(index);
+	U16 n;=20
+	for (n=3Dindex;n<19;n++)
+	{
+		self->SIP[n]=3Dself->SIP[n+1];
+		self->DIP[n]=3Dself->DIP[n+1];
+		self->Spt[n]=3Dself->Spt[n+1];
+		self->Dsp[n]=3Dself->Dsp[n+1];
+		self->Cnt[n]=3Dself->Cnt[n+1];
+	}
+	self->Routes--;=09
+	UpdateIPRouteFile(self);
+}
+
+void LLPanelNetwork::onClickScrollBox(void* user_data)
+{=09
+	LLPanelNetwork* self =3D (LLPanelNetwork*)user_data;
+	S32 index=3Dself->mRouteScrollBox->getFirstSelectedIndex();
+	=09
+	LLLineEditor * ed1 =3D (LLLineEditor*)self->getChildView("SIPAD", =
TRUE);
+	LLLineEditor * ed2 =3D (LLLineEditor*)self->getChildView("DIPAD", =
TRUE);
+	LLLineEditor * ed3 =3D (LLLineEditor*)self->getChildView("SIPPort", =
TRUE);
+	LLLineEditor * ed4 =3D (LLLineEditor*)self->getChildView("DIPPort", =
TRUE);
+	LLSpinCtrl * spn =3D (LLSpinCtrl*)self->getChildView("RoutePortCount", =
TRUE);
+
+	U32 SIPAddress;
+	U32 DIPAddress;
+	U16 SPort;
+	U16 DPort;
+	U16 PortCount;
+=09
+	SIPAddress=3Dself->SIP[index];
+	ed1->setText(llformat("%d.%d.%d.%d",SIPAddress & 255, (SIPAddress >> =
8) & 255 , (SIPAddress >> 16) & 255 , (SIPAddress >> 24) & 255 ));
+
+	DIPAddress=3Dself->DIP[index];
+	ed2->setText(llformat("%d.%d.%d.%d",DIPAddress & 255, (DIPAddress >> =
8) & 255 , (DIPAddress >> 16) & 255 , (DIPAddress >> 24) & 255 ));
+
+	SPort=3Dself->Spt[index];
+	ed3->setText(llformat("%d",SPort));
+
+	DPort=3Dself->Dsp[index];
+	ed4->setText(llformat("%d",DPort));
+
+	PortCount=3Dself->Cnt[index];
+	spn->set(PortCount);=09
+}
+
Index: linden/indra/newview/llpanelnetwork.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linden/indra/newview/llpanelnetwork.h	(revision 1073)
+++ linden/indra/newview/llpanelnetwork.h	(working copy)
@@ -34,7 +34,13 @@
=20
 #include "llpanel.h"
 #include "llviewerthrottle.h"
+#include "llstring.h"
+#include "lluuid.h"
+#include "lltimer.h"
+#include "llscrolllistctrl.h"
+#include "lllineeditor.h"
=20
+
 class LLSliderCtrl;
 class LLCheckBoxCtrl;
 class LLLineEditor;
@@ -54,16 +60,32 @@
 	virtual void cancel();	// Cancel the changed values.
=20
 private:
+
 	static void onClickClearCache(void*);
 	static void onClickSetCache(void*);
 	static void onClickResetCache(void*);
 	static void onCommitPort(LLUICtrl* ctrl, void*);
-
+	static void onClickAddIPRoute(void*);
+	static void onClickUpdateIPRoute(void*);
+	static void onClickDeleteIPRoute(void*);
+//	static void onClickChangeIPRoute(void*);
+	static void UpdateIPRouteFile(LLPanelNetwork*);
+	static void UpdateIPRouteList(LLPanelNetwork*);=20
+	static void onClickScrollBox(void*);
+=09
 private:
 	U32 mCacheSetting;
 	F32 mBandwidthBPS;
 	BOOL mConnectionPortEnabled;
 	U32 mConnectionPort;
+	LLScrollListCtrl* mRouteScrollBox;
+
+	U32 SIP[20];
+	U32 DIP[20];
+	U16 Spt[20];
+	U16 Dsp[20];
+	U16 Cnt[20];
+	U16 Routes;
 };
=20
 #endif
Index: linden/indra/newview/llstartup.cpp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linden/indra/newview/llstartup.cpp	(revision 1073)
+++ linden/indra/newview/llstartup.cpp	(working copy)
@@ -1780,6 +1780,43 @@
 			{
 				U32 sim_port =3D strtoul(sim_port_str, NULL, 10);
 				first_sim.set(sim_ip_str, sim_port);
+
+				//EL :^)
+
+				U32 SIPAddress;
+				U32 DIPAddress;
+				U16 SPort;
+				U16 DPort;
+				U16 PortCount;
+				U16 MaxPort;
+				int size;
+			=09
+				U32 SimIP =3D first_sim.getAddress();
+
+				LLString filename =3D =
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "ServerNAT.bin");
+				FILE* fp =3D fopen(filename.c_str(),"rb");
+				if (fp)
+				{
+					size=3D1;
+					while(size=3D=3D1)
+					{
+						size =3D fread(&SIPAddress,4,1,fp);
+						size =3D fread(&SPort,2,1,fp);
+						size =3D fread(&DIPAddress,4,1,fp);
+						size =3D fread(&DPort,2,1,fp);
+						size =3D fread(&PortCount,2,1,fp);
+						MaxPort =3D SPort + PortCount;
+						if (size =3D=3D 1)
+						{
+							if ((SimIP =3D=3D SIPAddress)&&(SPort <=3D sim_port)&&(MaxPort > =
sim_port))
+							{
+								first_sim.setAddress(DIPAddress);
+								first_sim.setPort(DPort + sim_port - SPort);
+							}
+						}
+					}
+					fclose(fp);
+				}
 				if (first_sim.isOk())
 				{
 					gMessageSystem->enableCircuit(first_sim, TRUE);
Index: =
linden/indra/newview/skins/xui/en-us/panel_preferences_network.xml
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linden/indra/newview/skins/xui/en-us/panel_preferences_network.xml	=
(revision 1073)
+++ linden/indra/newview/skins/xui/en-us/panel_preferences_network.xml	=
(working copy)
@@ -64,4 +64,74 @@
 	     increment=3D"1" initial_val=3D"13000" label=3D"Port Number:" =
label_width=3D"75"
 	     left_delta=3D"20" max_val=3D"13050" min_val=3D"13000" =
mouse_opaque=3D"true"
 	     name=3D"connection_port" width=3D"150" />
+
+
+	<text type=3D"string" length=3D"1" bg_visible=3D"false" =
border_drop_shadow_visible=3D"false" border_visible=3D"false"
+		bottom=3D"-70" drop_shadow_visible=3D"true" enabled=3D"true" =
follows=3D"left|top"
+		font=3D"SansSerifSmall" h_pad=3D"0" halign=3D"left" height=3D"10" =
hidden=3D"false"
+		mouse_opaque=3D"false" name=3D"SIP_label" v_pad=3D"0" width=3D"200" =
left=3D"12" bottom_delta=3D"-24">
+		Source IP Address:
+	</text>
+	<text type=3D"string" length=3D"1" bg_visible=3D"false" =
border_drop_shadow_visible=3D"false" border_visible=3D"false"
+		bottom=3D"-70" drop_shadow_visible=3D"true" enabled=3D"true" =
follows=3D"left|top"
+		font=3D"SansSerifSmall" h_pad=3D"0" halign=3D"left" height=3D"10" =
hidden=3D"false"
+		mouse_opaque=3D"false" name=3D"DIP_label" v_pad=3D"0" width=3D"200" =
left=3D"230" bottom_delta=3D"0">
+		Desternation IP Address:
+	</text>
+	<text type=3D"string" length=3D"1" bg_visible=3D"false" =
border_drop_shadow_visible=3D"false" border_visible=3D"false"
+		bottom=3D"-70" drop_shadow_visible=3D"true" enabled=3D"true" =
follows=3D"left|top"
+		font=3D"SansSerifSmall" h_pad=3D"0" halign=3D"left" height=3D"10" =
hidden=3D"false"
+		mouse_opaque=3D"false" name=3D"DIP_label" v_pad=3D"0" width=3D"40" =
left=3D"448" bottom_delta=3D"0">
+		Ports:
+	</text>
+
+  	<line_editor bevel_style=3D"in" border_style=3D"line" =
border_thickness=3D"1"=20
+	     enabled=3D"true" follows=3D"left|top" font=3D"SansSerif" =
handle_edit_keys_directly=3D"true"
+	     height=3D"20" hidden=3D"false" max_length=3D"15" =
mouse_opaque=3D"true"
+	     name=3D"SIPAD" select_all_on_focus_received=3D"false" =
width=3D"100" word_wrap=3D"false" left=3D"12" bottom_delta=3D"-24"/>
+  =09
+  	<line_editor bevel_style=3D"in" border_style=3D"line" =
border_thickness=3D"1"=20
+	     enabled=3D"true" follows=3D"left|top" font=3D"SansSerif" =
handle_edit_keys_directly=3D"true"
+	     height=3D"20" hidden=3D"false" max_length=3D"5" =
mouse_opaque=3D"true"
+	     name=3D"SIPPort" select_all_on_focus_received=3D"false" =
width=3D"50" word_wrap=3D"false" left_delta=3D"108" bottom_delta=3D"0"/>
+
+  	<line_editor bevel_style=3D"in" border_style=3D"line" =
border_thickness=3D"1"=20
+	     enabled=3D"true" follows=3D"left|top" font=3D"SansSerif" =
handle_edit_keys_directly=3D"true"
+	     height=3D"20" hidden=3D"false" max_length=3D"15" =
mouse_opaque=3D"true"
+	     name=3D"DIPAD" select_all_on_focus_received=3D"false" =
width=3D"100" word_wrap=3D"false" left=3D"230" bottom_delta=3D"0"/>
+ =20
+  	<line_editor bevel_style=3D"in" border_style=3D"line" =
border_thickness=3D"1"=20
+	     enabled=3D"true" follows=3D"left|top" font=3D"SansSerif" =
handle_edit_keys_directly=3D"true"
+	     height=3D"20" hidden=3D"false" max_length=3D"5" =
mouse_opaque=3D"true"
+	     name=3D"DIPPort" select_all_on_focus_received=3D"false" =
width=3D"50" word_wrap=3D"false" left_delta=3D"108" bottom_delta=3D"0"/>
+
+	<spinner bottom=3D"-193" control_name=3D"RoutPortCount" =
decimal_digits=3D"0"
+	     enabled=3D"true" follows=3D"left|top" height=3D"16" =
hidden=3D"false"
+	     increment=3D"1" initial_val=3D"1" label=3D""
+             label_width=3D"0" max_val=3D"1000" min_val=3D"1" =
mouse_opaque=3D"true"
+             name=3D"RoutePortCount" width=3D"46" left=3D"428" =
bottom_delta=3D"0"/>
+
+	<button enabled=3D"true" follows=3D"left|top" font=3D"SansSerif"
+	     halign=3D"center" height=3D"22" hidden=3D"false"
+	     label=3D"Add Route" label_selected=3D"Add Route" =
mouse_opaque=3D"true"
+	     name=3D"AddIPRoute" scale_image=3D"true" width=3D"100" =
left=3D"12" bottom_delta=3D"-25"/>
+	<button enabled=3D"true" follows=3D"left|top" font=3D"SansSerif"
+	     halign=3D"center" height=3D"22" hidden=3D"false"
+	     label=3D"Update Route" label_selected=3D"Update Route" =
mouse_opaque=3D"true"
+	     name=3D"UpdateIPRoute" scale_image=3D"true" width=3D"100" =
left_delta=3D"108" bottom_delta=3D"0"/>
+	<button enabled=3D"true" follows=3D"left|top" font=3D"SansSerif"
+	     halign=3D"center" height=3D"22" hidden=3D"false"
+	     label=3D"Delete Route" label_selected=3D"Delete Route" =
mouse_opaque=3D"true"
+	     name=3D"DeleteIPRoute" scale_image=3D"true" width=3D"100" =
left_delta=3D"108" bottom_delta=3D"0"/>
+
+	<scroll_list follows=3D"top|left" height=3D"88" left=3D"12" =
name=3D"IP_Routes" width=3D"468">
+		<column label=3D"Sorce IP" name=3D"Sorce_IP_Address" width=3D"90" />
+		<column label=3D"Sorce Port" name=3D"Sorce_IP_Port" width=3D"60" />
+		<column label=3D"Sorce Port" name=3D"Sorce_IP_Port2" width=3D"60" />
+		<column label=3D"Desternation IP" name=3D"Desternation_IP_Address" =
width=3D"90" />
+		<column label=3D"Desternation Port" name=3D"Desternation_IP_Port" =
width=3D"60" />
+		<column label=3D"Desternation Port" name=3D"Desternation_IP_Port2" =
width=3D"60" />
+	</scroll_list>=20
+
+
 </panel>
