From: <hwa...@us...> - 2009-05-05 16:38:36
|
Revision: 2838 http://mp-plugins.svn.sourceforge.net/mp-plugins/?rev=2838&view=rev Author: hwahrmann Date: 2009-05-05 16:37:52 +0000 (Tue, 05 May 2009) Log Message: ----------- Initial Import Added Paths: ----------- trunk/plugins/MPTray4IrTrans/ trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/ trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/CachesImage.bin trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/ReflectionCache.xml trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/TodoCache/ trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/TodoCache/.version trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/TodoCache/7/ trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/TodoCache/7/6241a2e1.dat trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/ trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/.version trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/0/ trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/0/283aac88.dat trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/7/ trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/7/6241a2e1.dat trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/b4fd36e6-2b9b-4b29-af32-92e538c1124f.Metadata trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/b4fd36e6-2b9b-4b29-af32-92e538c1124f.XmlDocIndex trunk/plugins/MPTray4IrTrans/mptray4irtrans/ trunk/plugins/MPTray4IrTrans/mptray4irtrans/Force.cs trunk/plugins/MPTray4IrTrans/mptray4irtrans/Log.cs trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.Designer.cs trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.cs trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.resx trunk/plugins/MPTray4IrTrans/mptray4irtrans/NativeMethods.cs trunk/plugins/MPTray4IrTrans/mptray4irtrans/Program.cs trunk/plugins/MPTray4IrTrans/mptray4irtrans/Properties/ trunk/plugins/MPTray4IrTrans/mptray4irtrans/Properties/AssemblyInfo.cs trunk/plugins/MPTray4IrTrans/mptray4irtrans/Properties/Resources.Designer.cs trunk/plugins/MPTray4IrTrans/mptray4irtrans/Properties/Resources.resx trunk/plugins/MPTray4IrTrans/mptray4irtrans/Properties/Settings.Designer.cs trunk/plugins/MPTray4IrTrans/mptray4irtrans/Properties/Settings.settings trunk/plugins/MPTray4IrTrans/mptray4irtrans/Xml.cs trunk/plugins/MPTray4IrTrans/mptray4irtrans/bin/ trunk/plugins/MPTray4IrTrans/mptray4irtrans/bin/Debug/ trunk/plugins/MPTray4IrTrans/mptray4irtrans/bin/Release/ trunk/plugins/MPTray4IrTrans/mptray4irtrans/bin/Release/mptray4irtrans.exe trunk/plugins/MPTray4IrTrans/mptray4irtrans/bin/Release/mptray4irtrans.pdb trunk/plugins/MPTray4IrTrans/mptray4irtrans/bin/Release/mptray4irtrans.vshost.exe trunk/plugins/MPTray4IrTrans/mptray4irtrans/bin/Release/mptray4irtrans.vshost.exe.manifest trunk/plugins/MPTray4IrTrans/mptray4irtrans/mptray4irtrans.csproj trunk/plugins/MPTray4IrTrans/mptray4irtrans/mptray4irtrans.ico trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/ trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Debug/ trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Debug/MediaPortal.Mptray4Irtrans.resources trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Debug/TempPE/ trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Debug/mptray4irtrans.Properties.Resources.resources trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Debug/mptray4irtrans.csproj.FileListAbsolute.txt trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Debug/mptray4irtrans.csproj.GenerateResource.Cache trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Debug/mptray4irtrans.exe trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Debug/mptray4irtrans.pdb trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Release/ trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Release/TempPE/ trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Release/TempPE/Properties.Resources.Designer.cs.dll trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Release/mptray4irtrans.Mptray4Irtrans.resources trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Release/mptray4irtrans.Properties.Resources.resources trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Release/mptray4irtrans.csproj.FileListAbsolute.txt trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Release/mptray4irtrans.csproj.GenerateResource.Cache trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Release/mptray4irtrans.exe trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/Release/mptray4irtrans.pdb trunk/plugins/MPTray4IrTrans/mptray4irtrans/obj/mptray4irtrans.csproj.FileListAbsolute.txt trunk/plugins/MPTray4IrTrans/mptray4irtrans.4.1.resharper.user trunk/plugins/MPTray4IrTrans/mptray4irtrans.sln trunk/plugins/MPTray4IrTrans/mptray4irtrans.suo Added: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/CachesImage.bin =================================================================== (Binary files differ) Property changes on: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/CachesImage.bin ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/ReflectionCache.xml =================================================================== --- trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/ReflectionCache.xml (rev 0) +++ trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/ReflectionCache.xml 2009-05-05 16:37:52 UTC (rev 2838) @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<Assemblies Version="1073741836"> + <Assembly Name="JetBrains.Annotations, Version=4.1.933.3, Culture=neutral, PublicKeyToken=1010a0d8d6380325" Image="b4fd36e6-2b9b-4b29-af32-92e538c1124f" Timestamp="633559670920000000" XmlDocIndexTimestamp="633559670920000000" /> +</Assemblies> \ No newline at end of file Added: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/TodoCache/.version =================================================================== (Binary files differ) Property changes on: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/TodoCache/.version ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/TodoCache/7/6241a2e1.dat =================================================================== (Binary files differ) Property changes on: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/TodoCache/7/6241a2e1.dat ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/.version =================================================================== (Binary files differ) Property changes on: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/.version ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/0/283aac88.dat =================================================================== (Binary files differ) Property changes on: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/0/283aac88.dat ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/7/6241a2e1.dat =================================================================== (Binary files differ) Property changes on: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/WordIndex.New/7/6241a2e1.dat ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/b4fd36e6-2b9b-4b29-af32-92e538c1124f.Metadata =================================================================== (Binary files differ) Property changes on: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/b4fd36e6-2b9b-4b29-af32-92e538c1124f.Metadata ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/b4fd36e6-2b9b-4b29-af32-92e538c1124f.XmlDocIndex =================================================================== (Binary files differ) Property changes on: trunk/plugins/MPTray4IrTrans/_ReSharper.mptray4irtrans/b4fd36e6-2b9b-4b29-af32-92e538c1124f.XmlDocIndex ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/plugins/MPTray4IrTrans/mptray4irtrans/Force.cs =================================================================== --- trunk/plugins/MPTray4IrTrans/mptray4irtrans/Force.cs (rev 0) +++ trunk/plugins/MPTray4IrTrans/mptray4irtrans/Force.cs 2009-05-05 16:37:52 UTC (rev 2838) @@ -0,0 +1,89 @@ +#region Copyright (C) 2009 Helmut Wahrmann (hwahrmann) + +/* + * Copyright (C) 2009 Helmut Wahrmann (hwahrmann) + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Make; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace mptray4irtrans +{ + public class Force + { + #region Native methods + + [DllImport("user32")] + private static extern bool SetFocus(IntPtr hWnd); + + [DllImport("user32")] + private static extern bool SetForegroundWindow(IntPtr hWnd); + + [DllImport("user32")] + private static extern IntPtr GetForegroundWindow(); + + [DllImport("user32")] + private static extern bool BringWindowToTop(IntPtr hWnd); + + [DllImport("user32")] + private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); + + [DllImport("user32")] + private static extern bool AttachThreadInput(int nThreadId, int nThreadIdTo, bool bAttach); + + [DllImport("user32")] + private static extern int GetWindowThreadProcessId(IntPtr hWnd, int unused); + + [DllImport("user32")] + static extern bool IsWindowVisible(IntPtr hWnd); + + [DllImport("user32")] + static extern bool IsIconic(IntPtr hWnd); + + #endregion Native methods + + public static bool SetForegroundWindow(IntPtr window, bool force) + { + IntPtr windowForeground = GetForegroundWindow(); + + if(window == windowForeground || SetForegroundWindow(window)) + return true; + + if(force == false) + return false; + + if(windowForeground == IntPtr.Zero) + return false; + + // if we don't attach successfully to the windows thread then we're out of options + if(!AttachThreadInput(AppDomain.GetCurrentThreadId(), GetWindowThreadProcessId(windowForeground, 0), true)) + return false; + + SetForegroundWindow(window); + BringWindowToTop(window); + SetFocus(window); + + AttachThreadInput(AppDomain.GetCurrentThreadId(), GetWindowThreadProcessId(windowForeground, 0), false); + + // we've done all that we can so base our return value on whether we have succeeded or not + return (GetForegroundWindow() == window); + } + } +} \ No newline at end of file Added: trunk/plugins/MPTray4IrTrans/mptray4irtrans/Log.cs =================================================================== --- trunk/plugins/MPTray4IrTrans/mptray4irtrans/Log.cs (rev 0) +++ trunk/plugins/MPTray4IrTrans/mptray4irtrans/Log.cs 2009-05-05 16:37:52 UTC (rev 2838) @@ -0,0 +1,104 @@ +#region Copyright (C) 2009 Helmut Wahrmann (hwahrmann) + +/* + * Copyright (C) 2009 Helmut Wahrmann (hwahrmann) + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Make; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ +#endregion + +using System; +using System.IO; + +namespace mptray4irtrans +{ + public class Log + { + #region Constructors + + private Log() + { + } + + static Log() + { + _logFilename = "log\\mptray4irtrans.log"; + if (File.Exists(_logFilename)) + File.Copy(_logFilename, _logFilename + ".bak", true); + } + + #endregion Constructors + + #region Methods + + public static void Delete() + { + lock(typeof(Log)) + { + if (File.Exists(_logFilename)) + File.Delete(_logFilename); + } + } + + public static void Write(string strFormat, params object[] arg) + { + if(_logEnabled == false) + return; + + lock(typeof(Log)) + { + try + { + using(StreamWriter writer = new StreamWriter(_logFilename, true)) + { + writer.BaseStream.Seek(0, SeekOrigin.End); // set the file pointer to the end of + writer.Write(DateTime.Now.ToShortDateString()+ " "+DateTime.Now.ToLongTimeString()+ " "); + writer.WriteLine(strFormat,arg); + writer.Close(); + } + } + catch(Exception) + { + } + } + } + + #endregion Methods + + #region Properties + + static public string Filename + { + get { return _logFilename; } + } + + static public bool IsEnabled + { + get { return _logEnabled; } + set { _logEnabled = value; } + } + + #endregion Properties + + #region Fields + + static string _logFilename; + static bool _logEnabled = false; + + #endregion Fields + } +} \ No newline at end of file Added: trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.Designer.cs =================================================================== --- trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.Designer.cs (rev 0) +++ trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.Designer.cs 2009-05-05 16:37:52 UTC (rev 2838) @@ -0,0 +1,93 @@ +namespace mptray4irtrans +{ + partial class Mptray4Irtrans + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Mptray4Irtrans)); + this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuReconnect = new System.Windows.Forms.ToolStripMenuItem(); + this.menuExit = new System.Windows.Forms.ToolStripMenuItem(); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // notifyIcon1 + // + this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1; + this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon"))); + this.notifyIcon1.Text = "MediaPortal IRTrans Shell"; + this.notifyIcon1.Visible = true; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuReconnect, + this.menuExit}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(226, 70); + // + // menuReconnect + // + this.menuReconnect.Enabled = false; + this.menuReconnect.Name = "menuReconnect"; + this.menuReconnect.Size = new System.Drawing.Size(225, 22); + this.menuReconnect.Text = "Reconnect to IRTrans Server"; + this.menuReconnect.Click += new System.EventHandler(this.menuReconnect_Click); + // + // menuExit + // + this.menuExit.Name = "menuExit"; + this.menuExit.Size = new System.Drawing.Size(225, 22); + this.menuExit.Text = "Exit"; + this.menuExit.ToolTipText = "Exit Application"; + this.menuExit.Click += new System.EventHandler(this.menuExit_Click); + // + // Mptray4Irtrans + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(137, 79); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "Mptray4Irtrans"; + this.Text = "MediaPortal IRTrans Shell"; + this.WindowState = System.Windows.Forms.FormWindowState.Minimized; + this.Resize += new System.EventHandler(this.Form_Resize); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.NotifyIcon notifyIcon1; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem menuExit; + private System.Windows.Forms.ToolStripMenuItem menuReconnect; + } +} \ No newline at end of file Added: trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.cs =================================================================== --- trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.cs (rev 0) +++ trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.cs 2009-05-05 16:37:52 UTC (rev 2838) @@ -0,0 +1,339 @@ +#region Copyright (C) 2009 Helmut Wahrmann (hwahrmann) + +/* + * Copyright (C) 2009 Helmut Wahrmann (hwahrmann) + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Make; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * http://www.gnu.org/copyleft/gpl.html + * + */ +#endregion + +using System; +using System.IO; +using System.Reflection; +using System.Threading; +using System.Windows.Forms; +using System.Diagnostics; +using System.Net.Sockets; +using System.Runtime.InteropServices; + + +namespace mptray4irtrans +{ + /// <summary> + /// This Application sits in the system tray and waits for the "Green Button" on the MCE Remote pressed. + /// It starts Mediaportal, if not active. + /// </summary> + public partial class Mptray4Irtrans : Form + { + public Mptray4Irtrans() + { + InitializeComponent(); + this.ShowInTaskbar = false; + // Get Information on how to connect to IRTrans Server + Xml xmldoc = new Xml("Mediaportal.xml"); + remoteModel = xmldoc.GetValueAsString("remote", "IRTransRemoteModel", "mediacenter"); + irTransServerPort = xmldoc.GetValueAsInt("remote", "IRTransServerPort", 21000); + logging = xmldoc.GetValueAsBool("remote", "IRTransVerboseLog", false); + + host = "localhost"; + Log.IsEnabled = logging; + + // Now Connect to the IRTransServer + if (Connect_IrTrans(irTransServerPort)) + { + Log.Write("Connection established."); + // Now Wait for data to be sent + WaitForData(); + } + else + { + // Enable the context menu + this.menuReconnect.Enabled = true; + // Now start a timer that tries to connect to the server + m_connectTimer = new System.Threading.Timer(new TimerCallback(ConnectServer), null, 10000, 10000); + } + } + + #region Methods + /// <summary> + /// Establishes a connection to the IRTransServer on "localhost" at the given Port. + /// Default Port is 21000, but could have been changed in Configuration. + /// </summary> + /// <param name="connectionPort"></param> + /// <returns></returns> + bool Connect_IrTrans(int connectionPort) + { + try + { + m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + m_Socket.Connect(host, connectionPort); + // Send Client id to Server + int clientID = 0; + byte[] sendData = BitConverter.GetBytes(clientID); + m_Socket.Send(sendData, sendData.Length, SocketFlags.None); + this.menuReconnect.Enabled = false; + return true; + } + catch (SocketException) + { + Log.Write("Could not connect to server - server not started?"); + return false; + } + } + + /// <summary> + /// Close Connection to the server + /// </summary> + void Close_Connection() + { + try + { + m_Socket.Close(); + } + catch (SocketException se) + { + Log.Write("Exception on closing socket. {0}", se.Message); + } + } + + /// <summary> + /// Thread that checks periodically for a IRTRans Server to be started + /// </summary> + void ConnectServer(Object obj) + { + if (Connect_IrTrans(irTransServerPort)) + { + // Stops the Timer + m_connectTimer.Dispose(); + Log.Write("Connection established."); + // Now Wait for data to be sent + WaitForData(); + } + } + + /// <summary> + /// Establishes an Async Callback Procedure that receives data being sent via the IRTrans Server. + /// </summary> + void WaitForData() + { + try + { + if (pfnCallBack == null) + { + pfnCallBack = new AsyncCallback(OnDataReceived); + } + CSocketPacket socketPkt = new CSocketPacket(); + socketPkt.thisSocket = m_Socket; + // Now start to listen for any data. + m_asynResult = m_Socket.BeginReceive(socketPkt.receiveBuffer, 0, socketPkt.receiveBuffer.Length, SocketFlags.None, pfnCallBack, socketPkt); + } + catch (SocketException se) + { + this.menuReconnect.Enabled = true; + Log.Write("Error on receive from socket: {0}", se.Message); + } + } + + /// <summary> + /// Class that receives the Socketid and databuffer on receive + /// </summary> + public class CSocketPacket + { + public Socket thisSocket; + public byte[] receiveBuffer = new byte[350]; + } + + /// <summary> + /// Method is called, whenever a IR Comand is received via the IRTrans Server connection. + /// </summary> + /// <param name="asyn"></param> + void OnDataReceived(IAsyncResult asyn) + { + try + { + CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState; + //Do an end receive first + int bytesReceived = 0; + bytesReceived = theSockId.thisSocket.EndReceive(asyn); + // Map the received data to the structure + IntPtr ptrReceive = Marshal.AllocHGlobal(bytesReceived); + Marshal.Copy(theSockId.receiveBuffer, 0, ptrReceive, bytesReceived); + NETWORKRECV netrecv = (NETWORKRECV)Marshal.PtrToStructure(ptrReceive, typeof(NETWORKRECV)); + + // Do an action only on Receive and if the command came from the selected Remote + if ((IrTransStatus)netrecv.statustype == IrTransStatus.STATUS_RECEIVE) + { + if (netrecv.remote.Trim() == remoteModel) + { + Log.Write("Received Command: " + netrecv.command.Trim()); + if (netrecv.command.Trim() == "ehome") + { + Process[] processes = Process.GetProcessesByName("mediaportal"); + + if (processes.Length != 0) + { + Log.Write("MediaPortal is already running"); + } + else + { + try + { + Log.Write("Starting MediaPortal"); + Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase); + + Process process = new Process(); + + process.StartInfo.FileName = "mediaportal.exe"; + process.StartInfo.WorkingDirectory = Path.GetDirectoryName(uri.LocalPath); + process.StartInfo.UseShellExecute = true; + process.Start(); + + // We have some troubles to receive further requests, so let's close the connection and re-establish it + Close_Connection(); + m_connectTimer = new System.Threading.Timer(new TimerCallback(ConnectServer), null, 10000, 10000); + + AutoResetEvent evnt = new AutoResetEvent(false); + evnt.Close(); + + GC.ReRegisterForFinalize(evnt); + + evnt.Handle = NativeMethods.CreateEvent(IntPtr.Zero, false, false, "MediaPortalHandleCreated"); + + if (evnt.WaitOne(20000, false) == false) + return; + + processes = Process.GetProcessesByName("mediaportal"); + + if (processes.Length > 0) + Force.SetForegroundWindow(processes[0].MainWindowHandle, true); + } + catch (Exception ex) + { + Log.Write("Error Starting Mediaportal: {0}", ex.Message); + } + } + } + } + } + + Marshal.FreeHGlobal(ptrReceive); + WaitForData(); + } + catch (ObjectDisposedException oe) + { + Log.Write("Object Disposed Exception: {0}", oe.Message); + } + catch (SocketException se) + { + this.menuReconnect.Enabled = true; + Log.Write("Error on receive from socket: {0}", se.Message); + } + } + #endregion Methods + + #region Eventhandlers + // Always hide the Form + private void Form_Resize(object sender, EventArgs e) + { + Hide(); + } + + // Exit the Application + private void menuExit_Click(object sender, EventArgs e) + { + Log.Write("Exit requested by user."); + Close_Connection(); + this.Close(); + } + + // React on Windows System Shutdown + private const int WM_QUERYENDSESSION = 0x11; + protected override void WndProc(ref Message msg) + { + if (msg.Msg == WM_QUERYENDSESSION) + { + Log.Write("MediaPortal IRTRans Shell terminated because of System/Session shutdown."); + Close_Connection(); + //If system is shutting down, allow exit. + Application.Exit(); + } + base.WndProc(ref msg); + } + + // Reconnect to the Server + private void menuReconnect_Click(object sender, EventArgs e) + { + // Disable the context menu + this.menuReconnect.Enabled = false; + // Now start a timer that tries to connect to the server + m_connectTimer = new System.Threading.Timer(new TimerCallback(ConnectServer), null, 10000, 10000); + } + #endregion Eventhandlers + + #region Enums and Structure + public enum IrTransStatus + { + STATUS_MESSAGE = 1, + STATUS_TIMING = 2, + STATUS_DEVICEMODE = 3, + STATUS_RECEIVE = 4, + STATUS_LEARN = 5, + STATUS_REMOTELIST = 6, + STATUS_COMMANDLIST = 7, + STATUS_TRANSLATE = 8, + STATUS_FUNCTION = 9, + STATUS_DEVICEMODEEX = 10, + STATUS_DEVICEDATA = 11, + STATUS_LCDDATA = 12, + STATUS_FUNCTIONEX = 13, + STATUS_DEVICEMODEEXN = 14, + STATUS_IRDB = 15, + STATUS_TRANSLATIONFILE = 16, + STATUS_IRDBFILE = 17, + STATUS_BUSLIST = 18, + STATUS_LEARNDIRECT = 19 + } + + [StructLayout(LayoutKind.Sequential)] + public struct NETWORKRECV + { + public UInt32 clientid; + public Int16 statuslen; + public Int16 statustype; + public Int16 adress; + public UInt16 command_num; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] + public string remote; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] + public string command; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)] + public string data; + } + #endregion + + #region Variables and Constants + Socket m_Socket; + IAsyncResult m_asynResult; + AsyncCallback pfnCallBack; + string remoteModel = ""; + string host = ""; + int irTransServerPort = 21000; + bool logging = false; + System.Threading.Timer m_connectTimer = null; + #endregion + } +} \ No newline at end of file Added: trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.resx =================================================================== --- trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.resx (rev 0) +++ trunk/plugins/MPTray4IrTrans/mptray4irtrans/Mptray4Irtrans.resx 2009-05-05 16:37:52 UTC (rev 2838) @@ -0,0 +1,2893 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> + <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>124, 17</value> + </metadata> + <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> + <data name="notifyIcon1.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + AAABAAQAgIAAAAEAIAAoCAEARgAAADAwAAABACAAqCUAAG4IAQAgIAAAAQAgAKgQAAAWLgEAEBAAAAEA + IABoBAAAvj4BACgAAACAAAAAAAEAAAEAIAAAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAChUxn/oVMZ/6BT + GP+gUhj/oFIY/6BSGP+fUhj/n1IY/59RF/+fURf/nlEX/55RF/+eUBf/nVAW/51QFv+dUBb/nVAW/5xP + Fv+cTxb/nE8V/5xPFf+bTxX/m04V/5tOFf+bThX/m04V/5pOFP+aThT/mk0U/5pNFP+ZTRT/mU0U/5lN + FP+ZTRP/mUwT/5lME/+YTBP/mEwT/5hME/+YTBP/mEwT/5hMEv+YSxL/mEsS/5dLEv+XSxL/l0sS/5dL + Ev+XSxL/l0sS/5dLEv+XSxL/l0sS/5dKEv+XShH/l0oR/5dKEf+WShH/lkoR/5ZKEf+WShH/lkoR/5ZK + Ef+WShH/lkoR/5ZKEf+WShH/lkoR/5ZKEf+WShH/lkoR/5ZKEf+WSRH/lkkR/5ZJEf+WSRH/lkkR/5ZJ + Ef+WSRH/lkkR/5ZJEf+WSRH/lkkR/5dJEf+XSRH/l0kR/5dJEf+XSRH/l0kR/5dJEf+XSRH/l0kR/5dJ + Ef+XSRH/l0kR/5dJEf+XSRH/l0kR/5dJEf+YSRH/mEkR/5hJEf+YSRH/mEkR/5hJEf+YSRH/mEkR/5hJ + Ef+YSRH/mEkR/5hJEf+YSRH/mUkR/5lJEf+ZSRH/mUkR/5lJEf+ZSRH/mUkR/5lJEf+ZShH/mUoR/5lK + Ef+ZShH/mUoR/5lKEf+aShH/mkoR/6JTGf+hUxj+oVMY/qFTGP+gUhj+oFIX/qBSGP+fURf+n1EX/p9R + F/+eURb+nlAW/p5RF/+dUBb+nVAW/p1PFv6dUBb/nE8V/pxPFf6cTxb/nE4V/ptOFP6cTxX/m04U/ptO + FP6bThX/mk0U/ppNFP6aThT/mk0T/plNE/6ZTBP+mU0U/5lME/6YTBP+mU0T/5hMEv6YTBL+mUwT/5hL + Ev6YSxL+mEwT/5dLEv6XSxL+mEsS/5dLEf6XShH+l0oR/pdLEv+WShH+lkoR/pdLEv+WShH+lkoR/pdL + Ev+WShH+lkoR/pdKEf+WSRD+lkkQ/pZKEf+WSRD+lkkQ/pVJEP6WShH/lUkQ/pVJEP6WShH/lUkQ/pVJ + EP6WShH/lUkQ/pVJEP6WShH/lUkQ/pVJEP6WSRH/lUgQ/pVIEP6VSBD+lkkR/5VIEP6WSBD+l0kR/5ZI + EP6WSBD+l0kR/5ZIEP6WSBD+l0kR/5ZIEP6WSBD+l0kR/5ZIEP6WSBD+lkgQ/pdJEf+WSBD+lkgQ/pdJ + Ef+XSBD+l0gQ/phJEf+XSBD+l0gQ/phJEf+XSBD+l0gQ/phJEf+XSBD+l0gQ/pdIEP6YSRH/mEgQ/phI + EP6ZSRH/mEgQ/phIEP6ZSRH/mEkQ/phJEP6ZShH/mEkQ/phJEP6ZShH/mUkQ/plJEP6ZSRD+olQZ/6JT + GP6hUxj+oVMZ/6FTGP6gUhj+oFIY/6BSF/6gUhf+n1IX/59RF/6fURb+nlEX/55QFv6eUBb+nVAW/p1Q + Fv+dTxX+nU8V/p1PFv+cTxX+nE8V/pxPFf+bThT+m04U/ptOFf+bThT+mk0U/ptOFP+aTRT+mk0T/ppN + E/6aTRT/mUwT/plME/6ZTRP/mUwT/phMEv6ZTBP/mEwS/phLEv6YTBP/mEsS/pdLEv6YTBL/l0sS/pdL + Ef6XSxH+l0sS/5dKEf6WShH+l0sS/5ZKEf6WShH+l0sS/5ZKEf6WShH+l0oR/5ZKEf6WShD+l0oR/5ZJ + EP6WSRD+lkkQ/pZKEf+WSRD+lkkQ/pZKEf+VSRD+lUkQ/pZKEf+VSRD+lUkQ/pZKEf+VSRD+lUkQ/pZJ + Ef+VSRD+lUkQ/pVJEP6WSRH/lUgQ/pZIEP6XSRH/lkgQ/pZIEP6XSRH/lkgQ/pZIEP6XSRH/lkgQ/pZI + EP6XSRH/lkgQ/pZIEP6WSBD+l0kR/5ZIEP6WSBD+l0kR/5dIEP6XSBD+mEkR/5dIEP6XSBD+mEkR/5dI + EP6XSBD+mEkR/5dIEP6XSBD+l0gQ/phJEf+YSBD+mEgQ/plJEf+YSBD+mEgQ/plJEf+YSRD+mEkQ/plK + Ef+YSRD+mEkQ/plKEf+YSRD+mEkQ/plJEP6jVBn/olQZ/6JUGf+iVBn/olMZ/6FTGP+hUxj/oVMY/6BS + GP+gUhj/oFIY/59SF/+fURf/n1EX/59RF/+eURf/nlEW/55QFv+dUBb/nVAW/51QFv+dTxb/nU8V/5xP + Ff+cTxX/nE8V/5tPFf+bThX/m04V/5tOFP+bThT/mk4U/5pOFP+aTRT/mk0U/5pNFP+ZTRP/mU0T/5lN + E/+ZTBP/mUwT/5lME/+YTBP/mEwT/5hME/+YTBL/mEwS/5hMEv+YSxL/mEsS/5dLEv+XSxL/l0sS/5dL + Ev+XSxL/l0sS/5dLEv+XSxL/l0sR/5dKEf+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+WShH/lkoR/5ZK + Ef+WShH/lkoR/5ZKEf+WShH/lkoR/5ZKEf+WShH/lkoR/5ZKEf+WShH/lkkR/5ZJEf+WSRH/lkkR/5dJ + Ef+XSRH/l0kR/5dJEf+XSRH/l0kR/5dJEf+XSRH/l0kR/5dJEf+XSRH/l0kR/5dJEf+XSRH/l0kR/5dJ + Ef+XSRH/l0kR/5dJEf+YSRH/mEkR/5hJEf+YSRH/mEkR/5hJEf+YSRH/mEkR/5hJEf+YSRH/mEkR/5hJ + Ef+YSRH/mEkR/5lJEf+ZSRH/mUkR/5lJEf+ZShH/mUoR/5lKEf+ZShH/mUoR/5lKEf+ZShH/mUoR/6NV + Gv+jVBn+olQZ/qJUGf+iUxj+oVMY/qFTGP+hUhj+oFIY/qFSGP+gUhf+oFEX/qBSF/+fURf+n1EW/p5R + Fv6fURf/nlAW/p5QFv6eUBb/nU8V/p1PFf6dUBb/nE8V/pxPFf6cTxX/m04U/ptOFP6cTxX/m04U/ppN + FP6aTRT+m04U/5pNE/6aTRP+mk0U/5lME/6ZTBP+mU0T/5lMEv6YTBL+mUwT/5hMEv6YTBL+mEwT/5hL + Ev6XSxL+l0sS/phMEv+XSxH+l0sR/phLEv+XShH+l0oR/pdLEv+WShH+lkoR/pdLEv+WShH+lkoR/pdL + Ef+WShH+lkoQ/pZKEP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJEP6WShH/lkkQ/pZJ + EP6WShH/lkkQ/pZJEP6WSRD+lkoR/5ZJEP6WSRD+l0kR/5ZJEP6WSBD+l0kR/5ZIEP6WSBD+l0kR/5ZI + EP6WSBD+l0kR/5ZIEP6WSBD+lkgQ/pdJEf+WSBD+lkgQ/pdJEf+WSBD+lkgQ/pdJEf+XSBD+l0gQ/phJ + Ef+XSBD+l0gQ/phJEf+XSBD+l0gQ/pdIEP6YSRH/l0gQ/pdIEP6YSRH/mEgQ/phIEP6ZSRH/mEkQ/phJ + EP6ZShH/mEkQ/phJEP6ZShH/mEkQ/phJEP6YSRD+pFUa/6NUGf6jVBn+o1QZ/6JUGP6iUxj+olQZ/6FT + GP6hUxj+oVMY/6BSF/6gUhf+oFIY/6BRF/6fURb+n1EW/p9RF/+eUBb+nlAW/p5QFv+dUBX+nU8V/p1Q + Fv+dTxX+nE8V/p1PFf+cTxT+nE4U/pxPFf+bThT+m04U/ptOFP6bThT/mk0T/ppNE/6aThT/mk0T/plN + E/6aTRT/mUwT/plMEv6ZTRP/mEwS/phMEv6ZTBP/mEsS/phLEv6YSxL+mEwS/5dLEf6XSxH+mEwS/5dL + Ef6XSxH+mEsS/5dKEf6XShH+l0sS/5ZKEf6WShH+l0sS/5ZKEf6WShH+lkoQ/pdKEf+WShD+lkkQ/pdK + Ef+WSRD+lkkQ/pdKEf+WSRD+lkkQ/pdKEf+WSRD+lkkQ/pdKEf+WSRD+lkkQ/pZJEP6XShH/lkkQ/pZJ + EP6XShH/lkkQ/pZJEP6XSRH/lkkQ/pZIEP6XSRH/lkgQ/pZIEP6XSRH/lkgQ/pZIEP6WSBD+l0kR/5ZI + EP6WSBD+l0kR/5ZIEP6WSBD+l0kR/5dIEP6XSBD+mEkR/5dIEP6XSBD+mEkR/5dIEP6XSBD+l0gQ/phJ + Ef+XSBD+l0gQ/phJEf+YSBD+mEgQ/plJEf+YSRD+mEkQ/plKEf+YSRD+mEkQ/plKEf+YSRD+mEkQ/phJ + EP6lVhr/pFUa/6RVGv+kVRn/o1QZ/6NUGf+jVBn/olQZ/6JTGP+iUxj/oVMY/6FTGP+hUxj/oFIX/6BS + F/+gUhf/oFIX/59RF/+fURf/n1EW/55RFv+eUBb/nlAW/55QFv+dUBb/nVAV/51PFf+dTxX/nE8V/5xP + Ff+cTxX/nE4V/5xOFP+bThT/m04U/5tOFP+bThT/mk0U/5pNFP+aTRP/mk0T/5pNE/+ZTRP/mU0T/5lN + E/+ZTBP/mUwT/5lME/+ZTBP/mEwS/5hMEv+YTBL/mEwS/5hMEv+YSxL/mEsS/5hLEv+XSxL/l0sS/5dL + Ev+XSxL/l0sS/5dLEf+XSxH/l0sR/5dLEf+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+XShH/l0oR/5dK + Ef+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+XShH/l0kR/5dJ + Ef+XSRH/l0kR/5dJEf+XSRH/l0kR/5dJEf+XSRH/l0kR/5dJEf+XSRH/l0kR/5dJEf+XSRH/l0kR/5hJ + Ef+YSRH/mEkR/5hJEf+YSRH/mEkR/5hJEf+YSRH/mEkR/5hJEf+YSRH/mEkR/5hJEf+YSRH/mUkR/5lK + Ef+ZShH/mUoR/5lKEf+ZShH/mUoR/5lKEf+ZShD/mUoQ/6VWGv+lVRn+pFUZ/qRVGv+kVBn+o1QZ/qNU + Gf+jVBj+olMY/qJTGP+iUxj+oVMX/qFTGP+hUhf+oFIX/qBSF/6gUhf/n1EW/p9RFv6fURf/nlAW/p5Q + Fv6eUBb/nlAV/p1QFf6dUBb/nU8V/p1PFf6dTxX/nE8U/pxOFP6cThT+nE8V/5tOFP6bThT+m04U/5pN + E/6aTRP+mk4U/5pNE/6aTRP+mk0T/5lMEv6ZTBL+mU0T/5lMEv6YTBL+mEwS/plME/+YSxL+mEsS/phM + Ev+YSxH+l0sR/phMEv+XSxH+l0sR/phLEv+XSxH+l0oR/pdLEv+XShH+l0oR/pZKEf6XSxH/lkoQ/pZK + EP6XSxH/lkoQ/pZKEP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJEP6WSRD+l0oR/5ZJ + EP6WSRD+l0oR/5ZJEP6WSRD+l0oR/5ZJEP6WSRD+l0oR/5ZJEP6WSRD+l0kR/5ZJEP6WSRD+lkkQ/pdJ + Ef+WSBD+lkgQ/pdJEf+WSBD+lkgQ/pdJEf+XSBD+l0gQ/phJEf+XSBD+l0gQ/phJEf+XSBD+l0gQ/pdI + EP6YSRH/l0gQ/pdIEP6YSRH/l0kQ/phJEP6ZShH/mEkQ/phJEP6ZShH/mEkQ/phJEP6ZShD/mEkQ/phJ + EP6YSQ/+plYa/6VWGv6lVRn+pVUa/6RVGf6kVRn+pFUZ/6NUGP6jVBj+o1QZ/6JTGP6iUxj+olMY/6FT + F/6hUhf+oVIX/qBSF/+gURf+oFEW/qBRF/+fURb+n1EW/p9RFv+eUBX+nlAV/p5QFv+dUBX+nU8V/p1Q + Ff+cTxX+nE8U/pxPFP6cTxX/nE4U/ptOFP6bThT/m04T/ptNE/6bThT/mk0T/ppNE/6aTRP/mk0T/plN + E/6aTRP/mUwS/plMEv6ZTBL+mUwT/5hMEv6YTBL+mUwS/5hLEv6YSxH+mEwS/5dLEf6XSxH+mEwS/5dL + Ef6XSxH+mEsS/5dKEf6XShH+l0oR/pdLEf+XShH+lkoQ/pdLEf+WShD+lkoQ/pdKEf+WShD+lkoQ/pdK + Ef+WSRD+lkkQ/pdKEf+WSRD+lkkQ/pZJEP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJ + EP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJEP6WSRD+l0kR/5ZJEP6WSRD+l0kR/5ZJEP6WSRD+l0kR/5dJ + EP6XSRD+mEkR/5dJEP6XSRD+mEkR/5dJEP6XSRD+l0kQ/phJEf+XSRD+l0kQ/phJEf+XSRD+mEkQ/phK + Ef+YSRD+mEkQ/plKEf+YSRD+mEkQ/plKEP+YSQ/+mEkP/phJD/6nVxv/plYa/6ZWGv+lVhr/pVYa/6VV + Gv+lVRn/pFUZ/6RVGf+jVBn/o1QZ/6NUGf+iVBj/olMY/6JTGP+hUxj/oVMY/6FSF/+gUhf/oFIX/6BS + F/+gURf/n1EW/59RFv+fURb/n1EW/55QFv+eUBb/nlAW/51QFf+dUBX/nU8V/51PFf+cTxX/nE8V/5xP + FP+cThT/nE4U/5tOFP+bThT/m04U/5tOFP+bThT/mk0T/5pNE/+aTRP/mk0T/5pNE/+ZTRP/mU0T/5lN + E/+ZTBP/mUwS/5lMEv+ZTBL/mEwS/5hMEv+YTBL/mEwS/5hMEv+YSxL/mEsS/5hLEv+YSxL/mEsS/5hL + Ef+XSxH/l0sR/5dLEf+XSxH/l0sR/5dLEf+XSxH/l0oR/5dKEf+XShH/l0oR/5dKEf+XShH/l0oR/5dK + Ef+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+XShH/l0oR/5dK + Ef+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+YShH/mEoR/5hKEf+YShH/mEoR/5hKEf+YShH/mEoR/5hK + Ef+YShH/mEoR/5hKEf+YShH/mEoR/5hKEf+YShH/mUoR/5lKEf+ZShH/mUoR/5lKEP+ZShD/mUoQ/5lK + EP+ZShD/mUoQ/6dXG/+mVhr+plYa/qZWGv+lVhn+pVUZ/qVVGv+kVRn+pFUZ/qRVGf+jVBj+o1QY/qNU + GP+iUxj+olMX/qJTF/6iUxj/oVIX/qFSF/6hUhf/oFEW/qBRFv6gURf/n1EW/p9QFv6fURb/nlAV/p5Q + Ff6eUBb/nU8V/p1PFf6dTxT+nU8V/5xPFP6cThT+nE8V/5xOFP6bThT+nE4U/5tOE/6bTRP+m04U/5pN + E/6aTRP+mk0T/5pNE/6ZTRL+mUwS/ppNE/+ZTBL+mUwS/plNE/+YTBL+mEwS/plMEv+YSxH+mEsR/phM + Ev+YSxH+mEsR/phMEv+XSxH+l0sR/pdLEf6YSxL/l0oR/pdKEf6YSxH/l0oQ/pdKEP6XSxH/l0oQ/pZK + EP6XSxH/lkoQ/pZKEP6XShH/lkoQ/pZKEP6WSRD+l0oR/5ZJEP6WSRD+l0oR/5ZJEP6WSRD+l0oR/5ZJ + EP6WSRD+l0oR/5ZJEP6WSRD+l0oR/5ZJEP6WSRD+lkkQ/pdKEf+WSRD+lkkQ/pdKEf+XSRD+l0kQ/phK + Ef+XSRD+l0kQ/phKEf+XSRD+l0kQ/phKEf+XSRD+l0kQ/pdJEP6YShH/l0kQ/pdJEP6YShH/l0kQ/phJ + EP6ZShH/mEkQ/phJEP6ZShD/mEkP/phJD/6ZShD/mEkP/phJD/6YSQ/+qFgb/6dXGv6nVxr+p1cb/6ZW + Gv6lVhn+plYa/6VVGf6lVRn+pVUZ/6RUGP6jVBj+pFQZ/6NUGP6iUxj+olMX/qJTGP+hUhf+oVIX/qFT + F/+gUhb+oFEW/qBSF/+gURb+n1EW/p9RFv+fUBX+nlAV/p9RFv+eUBX+nk8V/p1PFf6eUBX/nU8U/pxP + FP6dTxX/nE4U/pxOFP6cTxT/m04T/ptOE/6bThT/m00T/ppNE/6bThT/mk0T/ppNEv6aTRL+mk0T/5lM + Ev6ZTBL+mk0T/5lMEv6ZTBL+mUwS/5hMEv6YSxH+mUwS/5hLEf6YSxH+mEwS/5hLEf6XSxH+l0sR/phL + Ev+XSxH+l0oR/phLEv+XShH+l0oQ/phLEf+XShD+l0oQ/pdLEf+XShD+l0oQ/pdLEf+WShD+lkoQ/pZK + EP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJEP6XShH/lkkQ/pZJ + EP6WSRD+l0oR/5ZJEP6XSRD+mEoR/5dJEP6XSRD+mEoR/5dJEP6XSRD+mEoR/5dJEP6XSRD+mEoR/5dJ + EP6XSRD+l0kQ/phKEf+XSRD+l0kQ/phKEf+YSRD+mEkQ/plKEf+YSRD+mEkQ/plKEP+YSQ/+mEkP/plK + EP+YSQ/+mEkP/phJD/6pWBv/qFgb/6dXG/+nVxv/p1ca/6ZWGv+mVhr/plYa/6VWGv+lVhn/pVUZ/6RV + Gf+kVRn/pFQZ/6NUGP+jVBj/o1QY/6JTGP+iUxj/olMY/6FTF/+hUhf/oVIX/6BSF/+gUhb/oFEW/6BR + Fv+fURb/n1EW/59RFv+eUBb/nlAV/55QFf+eUBX/nU8V/51PFf+dTxX/nU8U/51PFP+cTxT/nE4U/5xO + FP+bThT/m04U/5tOFP+bThP/m04T/5pNE/+bTRP/mk0T/5pNE/+aTRP/mk0T/5pNE/+aTRP/mUwS/5lM + Ev+ZTBL/mUwS/5lMEv+ZTBL/mUwS/5hMEv+YTBL/mEwS/5hMEv+YSxL/mEsS/5hLEf+YSxH/mEsR/5hL + Ef+YSxH/mEsR/5hLEf+XSxH/mEsR/5dLEf+XSxH/l0sR/5dLEf+XShH/l0oR/5dKEf+XShH/l0oR/5dK + Ef+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+XShH/l0oR/5dKEf+YShH/l0oR/5hKEf+YShH/mEoR/5hK + Ef+YShH/mEoR/5hKEf+YShH/mEoR/5hKEf+YShH/mEoR/5hKEf+YShH/mEoR/5hKEf+YShH/mEoR/5lK + Ef+ZShH/mUoR/5lKEP+ZShD/mUoQ/5lKEP+ZShD/mUoQ/5lKEP+ZShD/mUoQ/6lYHP+pWBv+qFgb/qhY + G/+nVxr+p1ca/qdXGv+mVhn+plYZ/qZWGv+lVRn+pVUZ/qVVGf+kVBj+pFQY/qNUGP6jVBj/o1MX/qJT + F/6iUxj/olIX/qFSF/6hUhf/oVIW/qBSFv6gUhf/oFEW/qBRFv6fURb/n1AV/p9QFf6eUBX+nlAV/55Q + Ff6dTxT+nlAV/51PFP6dTxT+nU8V/5xOFP6cThT+nE8U/5xOE/6bThP+m04U/5tNE/6bTRP+m00T/ptO + E/+aTRL+mk0S/ppNE/+aTRL+mUwS/ppNE/+ZTBL+mUwS/plNEv+ZTBH+mEwR/plMEv+YSxH+mEsR/phL + Ef6ZTBL/mEsR/phLEf6YTBL/mEsR/pdLEf6YSxH/l0oQ/pdKEP6YSxH/l0oQ/pdKEP6YSxH/l0oQ/pdK + EP6XShD+mEsR/5dKEP6XShD+mEoR/5dKEP6XShD+mEoR/5dKEP6XSRD+mEoR/5dJEP6XSRD+mEoR/5dJ + EP6XSRD+l0kQ/phKEf+XSRD+l0kQ/phKEf+XSRD+l0kQ/phKEf+XSRD+l0kQ/phKEf+XSRD+l0kQ/phK + Ef+XSRD+l0kQ/pdJEP6YShH/mEkQ/phJEP6YShH/mEkQ/phJEP6ZShH/mEkQ/phJD/6ZShD/mEkP/phJ + D/6ZShD/mEkP/phJD/6YSQ/+qlkc/6lYG/6pWBv+qVgb/6hXGv6oVxr+p1ca/6dWGv6nVhn+plYa/6ZW + Gf6lVRn+pVUZ/6VVGP6kVBj+pFQY/qRUGP+jVBj+o1MX/qNTGP+iUxf+olIX/qJTF/+hUhb+oVIW/qFS + F/+gURb+oFEW/qBRFv+fURX+n1AV/p9QFf6fURb/nlAV/p5QFf6eUBX/nU8U/p1PFP6dTxX/nU8U/pxO + FP6dTxT/nE4T/pxOE/6cThT/m04T/ptOE/6bTRP+m04T/5pNEv6aTRL+m04T/5pNEv6aTRL+mk0T/5lM + Ev6ZTBL+mk0S/5lMEv6ZTBH+mUwS/5lMEf6YSxH+mEsR/plMEv+YSxH+mEsR/plMEv+YSxH+mEsR/phL + Ef+YSxH+l0sQ/phLEf+XShD+l0oQ/phLEf+XShD+l0oQ/pdKEP6YSxH/l0oQ/pdKEP6YSxH/l0oQ/pdK + EP6YSxH/l0oQ/pdKEP6YShH/l0oQ/pdKEP6YShH/l0kQ/pdJEP6XSRD+mEoR/5dJEP6XSRD+mEoR/5dJ + EP6XSRD+mEoR/5dJEP6XSRD+mEoR/5dJEP6XSRD+mEoR/5dJEP6XSRD+l0kQ/phKEf+YSRD+mEkQ/plK + Ef+YSRD+mEkQ/plKEP+YSRD+mEkP/plKEP+YSQ/+mEkP/plKEP+YSQ/+mEkP/phJD/6qWRz/qlkb/qlY + G/6pWBv/qVgb/qhYGv6oVxv/qFca/qdXGv6nVxr/plYZ/qZWGf6mVhn/pVUZ/qVVGP6kVRj+pFUZ/6RU + GP6kVBj+o1QY/6NTF/6iUxf+olMX/6JSF/6hUhb+oVIX/6FSFv6hURb+oFIW/6BRFv6gURX+n1EV/p9R + Fv+fUBX+nlAV/p5QFf+eUBT+nk8U/p5QFf+dTxT+nU8U/p1PFP+cThT+nE4T/pxPFP+cThP+m04T/ptO + E/6bThP/m00T/ptNEv6bThP/mk0S/ppNEv6aTRP/mk0S/ppMEv6aTRP/mUwS/plMEv6aTRL/mUwR/plM + Ef6ZTBH+mUwS/5hLEf6YSxH+mUwS/5hLEf6YSxH+mUwS/5hLEf6YSxH+mEsR/5hLEP6YSxD+mEsR/5dK + EP6XShD+l0oQ/phLEf+XShD+l0oQ/phLEf+XShD+l0oQ/phLEf+XShD+l0oQ/phLEf+XShD+l0oQ/phK + Ef+XShD+l0oQ/pdKEP6YShH/l0kQ/pdJEP6YShH/l0kQ/pdJEP6YShH/l0kQ/pdJEP6YShH/l0kQ/pdJ + EP6YShH/l0kQ/phJEP6YSRD+mEoR/5hJEP6YSRD+mUoR/5hJEP6YSRD+mUoQ/5hJD/6YSQ/+mUoQ/5hJ + D/6YSQ/+mUoQ/5hJD/6ZSQ/+mUoP/qtaHP+rWRz/qlkc/6pZHP+qWRv/qVgb/6lYG/+oWBv/qFca/6hX + Gv+nVxr/p1ca/6ZWGv+mVhn/plYZ/6VVGf+lVRn/pVUZ/6RVGP+kVBj/o1QY/6NUGP+jUxj/o1MX/6JT + F/+iUxf/olIX/6FSF/+hUhf/oVIW/6BSFv+gURb/oFEW/6BRFv+fURb/n1EV/59QFf+fUBX/nlAV/55Q + Ff+eUBX/nk8V/51PFP+dTxT/nU8U/51PFP+cTxT/nE8U/5xOFP+cThT/nE4T/5tOE/+bThP/m04T/5tO + E/+bTRP/mk0T/5pNE/+aTRP/mk0S/5pNEv+aTRL/mk0S/5pNEv+aTBL/mUwS/5lMEv+ZTBL/mUwS/5lM + Ev+ZTBL/mUwS/5lMEf+ZTBH/mUwR/5lLEf+ZSxH/mEsR/5hLEf+YSxH/mEsR/5hLEf+YSxH/mEsR/5hL + Ef+YSxH/mEsR/5hLEf+YSxH/mEsR/5hLEf+YSxH/mEsR/5hLEf+YSxH/mEsR/5hKEf+YShH/mEoR/5hK + Ef+YShH/mEoR/5hKEf+YShH/mEoR/5hKEf+YShH/mEoR/5hKEf+YShH/mUoR/5lKEf+ZShH/mUoR/5lK + Ef+ZShH/mUoR/5lKEf+ZShD/mUoQ/5lKEP+ZShD/mUoQ/5lKEP+ZShD/mUoQ/5pKEP+bSxD/rFoc/6ta + HP6rWRv+q1kc/6pZG/6qWBv+qVgb/6lYGv6oVxr+qFga/6hXGv6nVhn+p1ca/6ZWGf6mVhn+plUY/qZW + Gf+lVRj+pVQY/qVVGP+kVBf+o1MX/qRUGP+jUxf+olMX/qNTF/+iUhb+oVIW/qJSF/+hUhb+oVEW/qBR + Ff6hURb/oFEV/p9QFf6gURX/n1AV/p5QFP6fUBX/nk8U/p5PFP6eUBX/nU8U/p1PFP6dTxT/nE4T/pxO + E/6cThP+nE8U/5xOE/6bThP+nE4T/5tNEv6bTRL+m04T/5pNEv6aTRL+m00T/5pNEv6aTBL+mk0S/5lM + Ev6ZTBH+mUwR/ppNEv+ZTBH+mUwR/ppMEv+ZTBH+mUsR/plMEv+YSxH+mEsR/plMEf+YSxH+mEsQ/plM + Ef+YSxD+mEsQ/phLEP6ZSxH/mEoQ/phKEP6ZSxH/mEoQ/phKEP6YSxH/mEoQ/pdKEP6YSxH/l0oQ/pdK + EP6YSxH/l0oQ/pdKEP6XShD+mEsR/5dKEP6XShD+mEoR/5dKEP6XShD+mEoR/5hKEP6YShD+mEoR/5hK + EP6YShD+mUoR/5hKEP6YShD+mEoQ/plKEf+YSRD+mEkQ/plKEf+YSRD+mEkQ/plKEP+YSQ/+mEkP/plK + EP+YSQ/+mUoP/plKEP+aSg/+m0sP/ptLD/6sWx3/rFoc/qtaHP6rWhz/q1kb/qpZG/6qWRv/qVga/qlY + Gv6pWBv/qFca/qhXGv6oVxr/p1YZ/qdWGf6mVhn+plYZ/6VVGP6lVRj+pVUY/6RUGP6kVBf+pFQY/6NT + F/6jUxf+o1MX/6JTF/6iUhb+olMX/6JSFv6hUhb+oVEW/qFSFv+gURX+oFEV/qBRFv+fUBX+n1AV/p9Q + Ff+eUBT+nlAU/p5QFf+eTxT+nU8U/p1PFP+dTxP+nU8T/p1OE/6dTxT/nE4T/pxOE/6cThP/m04T/ptN + Ev6bThP/m00S/ptNEv6bThP/mk0S/ppNEv6aTRP/mkwS/ppMEv6aTBH+mk0S/5lMEf6ZTBH+mk0S/5lM + Ef6ZTBH+mUwS/5lLEf6ZSxH+mUwS/5hLEf6YSxD+mUwR/5hLEP6YSxD+mEsQ/plLEf+YSxD+mEsQ/plL + Ef+YShD+mEoQ/plLEf+YShD+mEoQ/phLEf+YShD+mEoQ/phLEf+YShD+mEoQ/phKEP6YSxH/mEoQ/phK + EP6YSxH/mEoQ/phKEP6YSxH/mEoQ/phKEP6ZSxH/mEoQ/phKEP6ZSxH/mEoQ/phKEP6YShD+mUoR/5hK + EP6YShD+mUoR/5hKEP6YShD+mUoQ/5lKD/6ZSg/+mUoQ/5lKD/6ZSg/+mksQ/5pLD/6bSw/+m0sP/q1b + Hf+tWx3/rFoc/6xaHP+sWhz/q1oc/6tZG/+qWRv/qlkb/6pYG/+pWBv/qVga/6hXGv+oVxr/p1ca/6dW + Gf+nVhn/plYZ/6ZWGf+mVRn/pVUY/6VVGP+lVBj/pFQY/6RUGP+kVBj/o1MX/6NTF/+jUxf/olMX/6JS + F/+iUhb/oVIW/6FSFv+hUhb/oFEW/6BRFv+gURX/oFEV/59RFf+fUBX/n1AV/59QFf+eUBX/nlAU/55Q + FP+eTxT/nU8U/51PFP+dTxT/nU8U/51PFP+cThP/nE4T/5xOE/+cThP/nE4T/5tOE/+bThP/m04T/5tO + E/+bTRP/m00S/5pNEv+aTRL/mk0S/5pNEv+aTRL/mk0S/5pNEv+aTBL/mkwS/5pMEv+aTBL/mUwR/5lM + Ef+ZTBH/mUwR/5lMEf+ZTBH/mUwR/5lMEf+ZTBH/mUsR/5lLEf+ZSxH/mUsR/5lLEf+ZSxH/mUsR/5lL + Ef+ZSxH/mUsR/5lLEf+ZSxH/mUsR/5lLEf+ZSxH/mUsR/5lLEf+ZSxH/mUsR/5lLEf+ZSxH/mUsR/5lL + Ef+ZSxH/mUsR/5lLEf+ZSxH/mUsR/5lLEf+ZSxH/mUsR/5lLEf+ZSxH/mUsR/5lLEP+ZSxD/mUsQ/5pL + EP+aSxD/mksQ/5pLEP+aSxD/m0sQ/5xMEP+cTBD/rlsd/61bHP6tWxz+rVsc/6xaHP6sWhv+q1oc/6tZ + G/6qWRv+qlkb/6pYGv6pWBr+qVga/6hXGv6oVxn+p1YZ/qdXGf+nVhn+plUY/qZWGf+lVRj+pVUY/qVV + GP+kVBf+pFQX/qRUGP+jUxf+o1MX/qNTF/+iUhb+olIW/qJSFv6iUhb/oVIV/qFRFf6hUhb/oFEV/qBR + Ff6gURX/n1AV/p9QFP6fUBX/n1AU/p5QFP6eUBX/nk8U/p1PFP6dTxP+nU8U/51PE/6dThP+nU8U/5xO + E/6cThP+nE4T/5xOEv6bTRL+nE4T/5tNEv6bTRL+m04T/5tNEv6aTRL+mk0S/ptNEv+aTBH+mkwR/ppN + Ev+aTBH+mUwR/ppNEv+ZTBH+mUwR/ppMEv+ZTBH+mUsR/ppMEf+ZSxD+mUsQ/plLEP6ZTBH/mUsQ/plL + EP6ZTBH/mEsQ/phLEP6ZSxH/mEsQ/phLEP6ZSxH/mEsQ/phLEP6ZSxH/mEoQ/phKEP6YShD+mUsR/5hK + EP6YShD+mUsR/5hKEP6YShD+mUsR/5hKEP6YShD+mUsR/5hKEP6YShD+mUsR/5hKEP6YShD+mEoQ/plL + Ef+ZShD+mUoQ/plLEf+ZShD+mUoQ/ppLEP+ZSg/+mUoP/ppLEP+ZSg/+mUoP/ppLEP+bSw/+m0sP/ptL + D/6vXB3/rlsc/q1bHP6tWx3/rVoc/qxaHP6sWhz/q1kb/qtZG/6rWRv/qlga/qlYGv6qWBv/qVca/qhX + Gv6oVxn+qFca/6dWGf6nVhn+p1YZ/6ZVGP6lVRj+plUY/6VUGP6kVBf+pVQY/6RTF/6jUxf+pFQX/6NT + Fv6iUhb+olIW/qJTFv+hUhb+oVIV/qFSFv+gURX+oFEV/qBRFv+gUBX+n1AV/qBRFf+fUBT+n1AU/p9Q + Ff+eTxT+nk8U/p5PFP6eUBT/nU8T/p1PE/6dTxT/nE4T/pxOE/6dTxP/nE4T/pxOEv6cThP/m04S/ptN + Ev6cThP/m00S/ptNEv6aTRL+m00S/5pNEv6aTRH+m00S/5pMEf6aTBH+mk0S/5lMEf6ZTBH+mk0S/5lM + Ef6ZTBH+mkwR/5lMEf6ZTBD+mUsQ/ppMEf+ZSxD+mUsQ/plMEf+ZSxD+mEsQ/plMEf+YSxD+mEsQ/plM + Ef+YSxD+mEsQ/plLEf+YSxD+mEsQ/phLEP6ZSxH/mEoQ/phKEP6ZSxH/mEoQ/phKEP6ZSxH/mEoQ/phK + EP6ZSxH/mEoQ/phKEP6ZSxH/mEoQ/plKEP6ZShD+mUsR/5lKEP6ZShD+mksR/5lKEP6ZShD+mksQ/5lK + D/6ZSg/+mksQ/5lKD/6ZSg/+mksQ/5pLD/6bSw/+m0sP/q9dHv+vXB3/rlwd/65cHf+uWx3/rVsc/61b + HP+sWhz/rFoc/6xaG/+rWRv/q1kb/6pZG/+qWBv/qVga/6lYGv+pVxr/qFca/6hXGf+oVhn/p1YZ/6dW + Gf+mVhn/plUY/6VVGP+lVRj/pVQY/6RUGP+kVBf/pFQX/6NTF/+jUxf/o1MX/6NTF/+iUxb/olIW/6FS + Fv+hUhb/oVIW/6FRFv+gURX/oFEV/6BRFf+gURX/n1EV/59QFf+fUBX/n1AU/55QFP+eUBT/nlAU/55P + FP+dTxT/nU8U/51PFP+dTxP/nU8T/51PE/+cThP/nE4T/5xOE/+cThP/nE4T/5xOE/+bThP/m04S/5tO + Ev+bTRL/m00S/5tNEv+bTRL/m00S/5tNEv+aTRL/mk0S/5pNEv+aTRL/mk0S/5pMEf+aTBH/mkwR/5pM + Ef+aTBH/mkwR/5pMEf+aTBH/mkwR/5pMEf+aTBH/mkwR/5pMEf+aTBH/mkwR/5lMEf+ZTBH/mUwR/5lL + Ef+ZSxH/mUsR/5lLEf+ZSxH/mUsR/5lLEf+ZSxH/mUsR/5pLEf+aSxH/mksR/5pLEf+aSxH/mksR/5pL + Ef+aSxH/mksR/5pLEf+aSxH/mksR/5pLEP+aSxD/mksQ/5pLEP+aSxD/mksQ/5pLEP+aSxD/m0sQ/5xM + EP+cTBD/sF0e/69cHf6vXB3+r1wd/65bHP6uWxz+rVsc/61aG/6tWhv+rFoc/6xZG/6rWRr+q1kb/6pY + Gv6qWBr+qVga/qlYGv+oVxn+qFcZ/qhXGf+nVhj+p1YY/qdWGf+mVRj+plUY/qZVGP+lVBf+pVQX/qVU + GP+kUxf+pFMW/qNTFv6jUxf/olIW/qJSFv6iUhb/olIV/qFRFf6hUhb/oVEV/qBRFf6gURX/oFAU/qBQ + FP6gURX/n1AU/p9QFP6fUBT+n1AU/55PE/6eTxP+nlAU/51PE/6dTxP+nU8U/51OE/6cThP+nU8T/5xO + Ev6cThL+nE4T/5xOEv6bTRL+m00S/pxOE/+bTRL+m00S/ptOEv+bTRH+m00R/ptNEv+aTBH+mkwR/ptN + Ev+aTBH+mkwR/ppNEv+aTBH+mkwR/ppMEf6aTBH/mUwQ/plMEP6aTBH/mUsQ/plLEP6aTBH/mUsQ/plL + EP6aTBH/mUsQ/plLEP6aTBH/mUsQ/plLEP6ZSxD+mkwR/5lLEP6ZSxD+mksR/5lLEP6ZSxD+mksR/5lL + EP6ZSxD+mksR/5lLEP6ZShD+mksR/5lKEP6ZShD+mUoQ/ppLEf+ZShD+mUoQ/ppLEf+ZShD+mUoQ/ppL + EP+ZSg/+mUoP/ppLEP+aSg/+mkoP/ppLEP+bSw/+m0sP/ptLD/6xXR7/sF0d/rBcHf6vXB3/r1wc/q5b + HP6uWxz/rVsc/q1aG/6tWhz/rFob/qxZG/6rWRv/q1ka/qpYGv6qWBr+qlga/6lXGf6pVxn+qFcZ/6hW + Gf6nVhj+p1YZ/6ZVGP6mVRj+plUY/6VUF/6lVBf+pVQY/6RUF/6kUxf+pFMW/qRTF/+jUxb+o1IW/qNT + Fv+iUhX+olIV/qJSFv+hURX+oVEV/qFRFf+gURT+oFAU/qBRFf+fUBT+n1AU/p9QFP6fUBT/nk8U/p5P + E/6eUBT/nk8T/p1PE/6eTxT/nU4T/p1OE/6dTxP/nE4S/pxOEv6dTxP/nE4S/pxOEv6cTRL+nE4T/5tN + Ev6bTRL+nE4S/5tNEf6bTRH+m00S/5tNEf6aTBH+m00S/5pMEf6aTBH+m00S/5pMEf6aTBH+mkwR/ptN + Ef+aTBD+mkwQ/ppMEf+aTBD+mkwQ/ppMEf+ZSxD+mUsQ/ppMEf+ZSxD+mUsQ/ppMEf+ZSxD+mUsQ/plL + EP6aTBH/mUsQ/plLEP6aTBH/mUsQ/plLEP6aTBH/mUsQ/plLEP6aTBH/mUsQ/plLEP6aSxH/mUsQ/plL + EP6ZSxD+mksR/5lKEP6ZShD+mksR/5lKEP6aShD+mksQ/5pKD/6aSg/+mksQ/5pKD/6aSg/+m0sQ/5tL + D/6bSw/+m0sP/rFeHv+xXR7/sV0d/7BdHf+wXB3/r1wd/69cHf+uWxz/rlsc/61bHP+tWhz/rFob/6xa + G/+sWRv/q1kb/6tZGv+qWBr/qlga/6lYGv+pVxr/qVcZ/6hXGf+oVhn/p1YZ/6dWGf+nVhj/plUY/6ZV + GP+mVRj/pVQY/6VUF/+kVBf/pFQX/6RTF/+jUxf/o1MW/6NTFv+jUxb/olIW/6JSFv+hUhb/oVIV/6FR + Ff+hURX/oVEV/6BRFf+gURX/oFEV/59QFf+fUBT/n1AU/59QFP+eUBT/nlAU/55QFP+eTxT/nk8U/55P + E/+dTxP/nU8T/51PE/+dTxP/nU4T/5xOE/+cThP/nE4T/5xOE/+cThL/nE4S/5xOEv+cThL/nE4S/5tN + Ev+bTRL/m00S/5tNEv+bTRL/m00S/5tNEv+bTRL/m00R/5tNEf+bTRH/m00R/5tNEf+aTRH/mkwR/5pM + Ef+aTBH/mkwR/5pMEf+aTBH/mkwR/5pMEf+aTBH/mkwR/5pMEf+aTBH/mkwR/5pMEf+aTBH/mkwR/5pM + Ef+aTBH/mkwR/5pMEf+aTBH/mkwR/5pMEf+aTBH/mkwR/5pLEf+aSxH/mksR/5pLEf+aSxH/mksR/5pL + EP+bSxD/m0sQ/5tLEP+bSxD/m0sQ/5tLEP+bSxD/m0sQ/5xMEP+cTBD/sl4e/7JeHv6xXR3+sV0e/7Bd + Hf6wXB3+r1wd/69bHP6uWxz+rlsc/61bG/6tWhv+rVob/6xZG/6sWRr+q1ka/qtZG/+qWBr+qlgZ/qlY + Gv+pVxn+qVcZ/qhXGf+oVhj+p1YY/qdWGf+mVRj+plUX/qZVGP+lVBf+pVQX/qVUF/6lVBf/pFMW/qRT + Fv6kUxf/o1MW/qNSFv6jUxb/olIV/qJSFf6iUhb/oVEV/qFRFf6hURX/oFEU/qBQFP6gUBT+oFEV/59Q + FP6fUBT+n1AU/59QE/6eTxP+n1AU/55PE/6eTxP+nk8U/51PE/6dThP+nU8T/51OEv6dThL+nE4S/p1P + E/+cThL+nE4S/pxOE/+cTRL+nE0S/pxOEv+bTRH+m00R/pxOEv+bTRH+m00R/ptNEv+bTRH+m00R/ptM + Ef6bTRL/m0wR/ptMEf6bTRH/mkwQ/ppMEP6bTRH/mkwQ/ppMEP6bTRH/mkwQ/ppMEP6bTBH/mkwQ/ppM + EP6aTBD+m0wR/5pLEP6aSxD+m0wR/5pLEP6aSxD+m0wR/5pLEP6aSxD+m0wR/5pLEP6aSxD+m0wR/5pL + EP6aSxD+mksQ/ptMEf+aSxD+mksQ/ptMEf+aSxD+mksQ/ptMEP+aSw/+mksP/ptLEP+aSw/+mksP/ptL + EP+bSw/+m0sP/ptLD/6zXx//sl4e/rJeHf6yXh7/sV0d/rBdHf6wXR3/r1wc/q9cHP6vXBz/rlsb/q1a + G/6tWxz/rVob/qxZGv6sWRr+rFkb/6tYGv6qWBr+qlga/6lXGf6pVxn+qVcZ/6hWGP6oVhj+qFYZ/6dV + GP6nVRj+p1UY/6ZVF/6mVBf+pVQX/qVUF/+kUxb+pFMW/qRUF/+jUxb+o1IW/qNTFv+iUhX+olIV/qJS + Fv+hURX+oVEV/qFSFf+hURT+oFEU/qBQFP6gURX/n1AU/p9QFP6gURT/n1AT/p9PE/6fUBT/nk8T/p5P + E/6eUBT/nk8T/p1PE/6eTxP/nU4S/p1OEv6dThL+nU8T/5xOEv6cThL+nU4T/5xOEv6cTRL+nE4S/5xN + Ef6bTRH+nE4S/5tNEf6bTRH+nE4S/5tNEf6bTRH+m00R/pxNEv+bTBH+m0wR/ptNEf+bTBD+mkwQ/ptN + Ef+aTBD+mkwQ/ptNEf+aTBD+mkwQ/ptNEf+aTBD+mkwQ/ppMEP6bTBH/mkwQ/ppMEP6bTBH/mksQ/ppL + EP6bTBH/mksQ/ppLEP6bTBH/mksQ/ppLEP6bTBH/mksQ/ppLEP6aSxD+m0wR/5pLEP6aSxD+m0wR/5pL + EP6aSxD+m0wQ/5pLD/6aSw/+m0wQ/5pLD/6aSw/+m0wQ/5tLD/6bSw/+m0sP/rRfH/+zXx7/s14e/7Je + Hv+yXh7/sV0e/7FdHf+wXR3/sFwd/69cHP+vXBz/r1sc/65bHP+tWhz/rVob/61aG/+sWhv/rFkb/6tZ + Gv+rWBr/qlga/6pYGv+pVxn/qVcZ/6lXGf+oVhn/qFYZ/6dWGP+nVhj/p1UY/6ZVGP+mVRj/plUX/6VU + F/+lVBf/pVQX/6RUF/+kUxb/pFMW/6NTFv+jUxb/o1IW/6JSFv+iUhb/olIV/6FSFf+hUhX/oVEV/6FR + Ff+gURX/oFEV/6BRFP+gURT/n1AU/59QFP+fUBT/n1AU/59QFP+eUBT/nk8T/55PE/+eTxP/nk8T/55P + E/+eTxP/nU8T/51PE/+dTxP/nU8T/51OEv+dThL/nU4S/51OEv+cThL/nE4S/5xOEv+cThL/nE4S/5xO + Ev+cThL/nE0S/5xNEv+cTRL/nE0R/5xNEf+cTRH/nE0R/5tNEf+bTRH/m00R/5tNEf+bTRH/m00R/5tN + Ef+bTRH/m00R/5tNEf+bTRH/m00R/5tNEf+bTRH/m0wR/5tMEf+bTBH/m0wR/5tMEf+bTBH/m0wR/5tM + Ef+bTBH/m0wR/5tMEf+bTBH/m0wR/5tMEf+bTBH/m0wR/5tMEP+bTBD/m0wQ/5tMEP+bTBD/m0wQ/5tM + EP+bTBD/m0wQ/5xMEP+cTBD/tGAf/7RfHv6zXx7+s18e/7JeHf6yXR3+sl0d/7FdHf6xXBz+sFwd/69c + HP6vWxv+r1sc/65aG/6tWhv+rVob/q1aG/+sWRr+rFka/qtZGv+rWBn+qlcZ/qpYGv+pVxn+qVcY/qlX + Gf+oVhj+qFYY/qhWGP+nVRf+p1UX/qZVF/6mVRf/pVQX/qVUFv6lVBf/pFMW/qRTFv6kUxb/o1IW/qNS + Ff6jUxb/olIV/qJSFf6iUhb/oVEV/qFRFP6hURT+oVEV/6BRFP6gUBT+oFEV/6BQFP6fUBP+oFAU/59Q + E/6fTxP+n1AU/55PE/6eTxP+n1AT/55PE/6eTxL+nU8S/p5PE/+dThL+nU4S/p5PE/+dThL+nU4S/p1O + Ev+cThH+nE4R/p1OEv+cTRH+nE0R/p1OEv+cTRH+nE0... [truncated message content] |