diff --git a/gts/admin/Sessions.aspx b/gts/admin/Sessions.aspx
new file mode 100644
index 00000000..acb8eb5c
--- /dev/null
+++ b/gts/admin/Sessions.aspx
@@ -0,0 +1,8 @@
+<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeBehind="Sessions.aspx.cs" Inherits="PkmnFoundations.GTS.admin.Sessions" %>
+
+
+
+
+
+
+
diff --git a/gts/admin/Sessions.aspx.cs b/gts/admin/Sessions.aspx.cs
new file mode 100644
index 00000000..8c250e14
--- /dev/null
+++ b/gts/admin/Sessions.aspx.cs
@@ -0,0 +1,83 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace PkmnFoundations.GTS.admin
+{
+ public partial class Sessions : System.Web.UI.Page
+ {
+ protected void Page_Load(object sender, EventArgs e)
+ {
+ GtsSessionManager manager = GtsSessionManager.FromContext(Context);
+
+ StringBuilder builder = new StringBuilder();
+ builder.Append("Active sessions (");
+ builder.Append(manager.Sessions4.Count);
+ builder.Append("):
");
+ foreach (KeyValuePair session in manager.Sessions4)
+ {
+ builder.Append("PID: ");
+ builder.Append(session.Value.PID);
+ builder.Append("
Token: ");
+ builder.Append(session.Value.Token);
+ builder.Append("
Hash: ");
+ builder.Append(session.Value.Hash);
+ builder.Append("
URL: ");
+ builder.Append(session.Value.URL);
+ builder.Append("
Expires: ");
+ builder.Append(session.Value.ExpiryDate);
+ builder.Append("
");
+ }
+
+ builder.Append("Active GenV sessions (");
+ builder.Append(manager.Sessions5.Count);
+ builder.Append("):
");
+ foreach (KeyValuePair session in manager.Sessions5)
+ {
+ builder.Append("PID: ");
+ builder.Append(session.Value.PID);
+ builder.Append("
Token: ");
+ builder.Append(session.Value.Token);
+ builder.Append("
Hash: ");
+ builder.Append(session.Value.Hash);
+ builder.Append("
URL: ");
+ builder.Append(session.Value.URL);
+ builder.Append("
Expires: ");
+ builder.Append(session.Value.ExpiryDate);
+ builder.Append("
");
+ }
+
+ if (Request.QueryString["data"] != null)
+ {
+ byte[] data = GtsSession4.DecryptData(Request.QueryString["data"]);
+ builder.Append("Data:
");
+ builder.Append(RenderHex(data.ToHexStringLower()));
+ builder.Append("
");
+ }
+ if (Request.QueryString["data5"] != null)
+ {
+ byte[] data = GtsSession5.DecryptData(Request.QueryString["data5"]);
+ builder.Append("Data:
");
+ builder.Append(RenderHex(data.ToHexStringLower()));
+ builder.Append("
");
+ }
+
+ litDebug.Text = builder.ToString();
+ }
+
+ private String RenderHex(String hex)
+ {
+ StringBuilder builder = new StringBuilder();
+ for (int x = 0; x < hex.Length; x += 16)
+ {
+ builder.Append(hex.Substring(x, Math.Min(16, hex.Length - x)));
+ builder.Append("
");
+ }
+ return builder.ToString();
+ }
+ }
+}
\ No newline at end of file
diff --git a/gts/admin/Sessions.aspx.designer.cs b/gts/admin/Sessions.aspx.designer.cs
new file mode 100644
index 00000000..f4a024a0
--- /dev/null
+++ b/gts/admin/Sessions.aspx.designer.cs
@@ -0,0 +1,24 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace PkmnFoundations.GTS.admin {
+
+
+ public partial class Sessions {
+
+ ///
+ /// litDebug control.
+ ///
+ ///
+ /// Auto-generated field.
+ /// To modify move field declaration from designer file to code-behind file.
+ ///
+ protected global::System.Web.UI.WebControls.Literal litDebug;
+ }
+}
diff --git a/gts/gts.csproj b/gts/gts.csproj
index a3ec909f..f6d6f959 100644
--- a/gts/gts.csproj
+++ b/gts/gts.csproj
@@ -67,6 +67,7 @@
+
@@ -109,6 +110,13 @@
AddMusical.aspx
+
+ Sessions.aspx
+ ASPXCodeBehind
+
+
+ Sessions.aspx
+
AllPokemon.aspx
ASPXCodeBehind