From 89d3c60bde635dca5dd9adb238d8b6110af7d61e Mon Sep 17 00:00:00 2001 From: Moonbase Date: Fri, 14 Nov 2025 18:37:43 -0800 Subject: [PATCH 1/2] Rework Lobby Use ListViews For Messages --- .../Services/GatewayService/GatewayService.cs | 40 +-- .../GatewayService/IGatewayService.cs | 14 +- qtc-net-client-2/Forms/ChatRoom.Designer.cs | 38 ++- qtc-net-client-2/Forms/ChatRoom.cs | 44 ++- qtc-net-client-2/Forms/ChatRoom.resx | 297 +++++++++++++----- .../Forms/DirectMessage.Designer.cs | 43 ++- qtc-net-client-2/Forms/DirectMessage.cs | 17 +- qtc-net-client-2/Forms/Main.cs | 2 +- 8 files changed, 318 insertions(+), 177 deletions(-) diff --git a/QtCNETAPI/Services/GatewayService/GatewayService.cs b/QtCNETAPI/Services/GatewayService/GatewayService.cs index 415a63c..3a10100 100644 --- a/QtCNETAPI/Services/GatewayService/GatewayService.cs +++ b/QtCNETAPI/Services/GatewayService/GatewayService.cs @@ -12,7 +12,6 @@ namespace QtCNETAPI.Services.GatewayService internal string gwBaseUri = GWUrl; public Room? CurrentRoom { get; private set; } - public bool InLobby { get; private set; } public HubConnection? HubConnection { get; private set; } @@ -120,29 +119,18 @@ namespace QtCNETAPI.Services.GatewayService } } - public async Task JoinLobbyAsync() + public async Task JoinRoomAsync(Room? room = null) { if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made."); - await HubConnection.SendAsync("JoinLobby", _apiService.CurrentUser); - InLobby = true; - CurrentRoom = null; - } - - public async Task JoinRoomAsync(Room room) - { - if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made."); - - if (InLobby == true) + // assume user is trying to join lobby if room is null (does not have db entry) + room ??= new Room { - await HubConnection.SendAsync("LeaveLobby", _apiService.CurrentUser); - InLobby = false; - } - else if (CurrentRoom != null) - { - await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom); - } + Id = "LOBBY", + Name = "Lobby" + }; + if (CurrentRoom != null) await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom); await HubConnection.SendAsync("JoinRoom", _apiService.CurrentUser, room); CurrentRoom = room; } @@ -151,23 +139,15 @@ namespace QtCNETAPI.Services.GatewayService { if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made."); - if (InLobby) - { - await HubConnection.SendAsync("LeaveLobby", _apiService.CurrentUser); - InLobby = false; - } - else - { - await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom); - CurrentRoom = null; - } + if (CurrentRoom != null) await HubConnection.SendAsync("LeaveRoom", _apiService.CurrentUser, CurrentRoom); + CurrentRoom = null; } public async Task PostMessageAsync(Message message) { if (HubConnection == null || HubConnection.State != HubConnectionState.Connected) throw new InvalidOperationException("Function was called before connection was made."); - await HubConnection.SendAsync("SendMessage", _apiService.CurrentUser, message, InLobby, CurrentRoom); + await HubConnection.SendAsync("SendMessage", _apiService.CurrentUser, message, CurrentRoom); } public async Task SendDirectMessageAsync(UserInformationDto user, Message message) diff --git a/QtCNETAPI/Services/GatewayService/IGatewayService.cs b/QtCNETAPI/Services/GatewayService/IGatewayService.cs index 71e137d..f3ea43f 100644 --- a/QtCNETAPI/Services/GatewayService/IGatewayService.cs +++ b/QtCNETAPI/Services/GatewayService/IGatewayService.cs @@ -18,10 +18,7 @@ namespace QtCNETAPI.Services.GatewayService /// The Current Room The Current User Is In /// public Room? CurrentRoom { get; } - /// - /// Is The User Currently In The Lobby? - /// - public bool InLobby { get; } + /// /// The Current Connection To The Gateway /// @@ -47,20 +44,13 @@ namespace QtCNETAPI.Services.GatewayService /// public Task DisposeAsync(); - /// - /// Joins The Lobby Of The Server - /// - /// - /// Thrown if the function is called before the connection is established. - public Task JoinLobbyAsync(); - /// /// Joins The Current User To A Room On The Server /// /// Room To Join /// /// Thrown if the function is called before the connection is established. - public Task JoinRoomAsync(Room room); + public Task JoinRoomAsync(Room? room = null); /// /// Leaves The Current Room The Current User Is In diff --git a/qtc-net-client-2/Forms/ChatRoom.Designer.cs b/qtc-net-client-2/Forms/ChatRoom.Designer.cs index 5333e16..6881803 100644 --- a/qtc-net-client-2/Forms/ChatRoom.Designer.cs +++ b/qtc-net-client-2/Forms/ChatRoom.Designer.cs @@ -32,10 +32,11 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ChatRoom)); rtxtChatbox = new RichTextBox(); btnSend = new Button(); - rtxtChat = new RichTextBox(); lblRoomName = new Label(); lvUserList = new ListView(); ilStatusIcons = new ImageList(components); + lvMessages = new ListView(); + ilProfileImages = new ImageList(components); SuspendLayout(); // // rtxtChatbox @@ -59,17 +60,6 @@ btnSend.UseVisualStyleBackColor = true; btnSend.Click += btnSend_Click; // - // rtxtChat - // - rtxtChat.Font = new Font("Segoe UI", 10F); - rtxtChat.HideSelection = false; - rtxtChat.Location = new Point(142, 43); - rtxtChat.Name = "rtxtChat"; - rtxtChat.ReadOnly = true; - rtxtChat.Size = new Size(463, 219); - rtxtChat.TabIndex = 3; - rtxtChat.Text = ""; - // // lblRoomName // lblRoomName.AutoSize = true; @@ -105,15 +95,34 @@ ilStatusIcons.Images.SetKeyName(2, "Away"); ilStatusIcons.Images.SetKeyName(3, "DND"); // + // lvMessages + // + lvMessages.Font = new Font("Segoe UI", 9F, FontStyle.Bold); + lvMessages.LargeImageList = ilProfileImages; + lvMessages.Location = new Point(142, 43); + lvMessages.Name = "lvMessages"; + lvMessages.Size = new Size(463, 219); + lvMessages.SmallImageList = ilProfileImages; + lvMessages.TabIndex = 10; + lvMessages.UseCompatibleStateImageBehavior = false; + lvMessages.View = View.List; + // + // ilProfileImages + // + ilProfileImages.ColorDepth = ColorDepth.Depth32Bit; + ilProfileImages.ImageStream = (ImageListStreamer)resources.GetObject("ilProfileImages.ImageStream"); + ilProfileImages.TransparentColor = Color.Transparent; + ilProfileImages.Images.SetKeyName(0, "DefaultPFP"); + // // ChatRoom // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; BackColor = Color.DodgerBlue; ClientSize = new Size(617, 334); + Controls.Add(lvMessages); Controls.Add(lvUserList); Controls.Add(lblRoomName); - Controls.Add(rtxtChat); Controls.Add(btnSend); Controls.Add(rtxtChatbox); FormBorderStyle = FormBorderStyle.FixedSingle; @@ -131,9 +140,10 @@ #endregion private RichTextBox rtxtChatbox; private Button btnSend; - private RichTextBox rtxtChat; private Label lblRoomName; private ListView lvUserList; private ImageList ilStatusIcons; + private ListView lvMessages; + private ImageList ilProfileImages; } } \ No newline at end of file diff --git a/qtc-net-client-2/Forms/ChatRoom.cs b/qtc-net-client-2/Forms/ChatRoom.cs index 55151ef..2c07078 100644 --- a/qtc-net-client-2/Forms/ChatRoom.cs +++ b/qtc-net-client-2/Forms/ChatRoom.cs @@ -1,7 +1,10 @@ using qtc_net_client_2.Services; +using QtCNETAPI.Dtos.User; using QtCNETAPI.Events; +using QtCNETAPI.Models; using QtCNETAPI.Services.ApiService; using QtCNETAPI.Services.GatewayService; +using System.Threading.Tasks; namespace qtc_net_client_2.Forms { @@ -11,24 +14,26 @@ namespace qtc_net_client_2.Forms IApiService _apiService; AudioService AudioService = new(); + private List RoomUserList = new(); public ChatRoom(IGatewayService gatewayService, IApiService apiService) { _gatewayService = gatewayService; _apiService = apiService; - InitializeComponent(); - } - private void frmChat_Load(object sender, EventArgs e) - { // subscribe to server message event _gatewayService.OnRoomMessageReceived += _gatewayService_OnServerMessageReceived; _gatewayService.OnRoomUserListReceived += _gatewayService_OnRoomUserListReceived; _gatewayService.OnRoomDeleted += _gatewayService_OnRoomDeleted; _gatewayService.OnGuestUserJoin += _gatewayService_OnGuestUserJoin; - if (_gatewayService.CurrentRoom != null) { Text = $"QtC.NET Client - Chat Room - {_gatewayService.CurrentRoom.Name}"; lblRoomName.Text = _gatewayService.CurrentRoom.Name; } - else if (_gatewayService.InLobby) { Text = $"QtC.NET Client - Chat Room - Lobby"; lblRoomName.Text = "Lobby"; } + InitializeComponent(); + } + private void frmChat_Load(object sender, EventArgs e) + { + if (_gatewayService.CurrentRoom != null) { Text = $"QtC.NET Client - Chat Room - {_gatewayService.CurrentRoom.Name}"; lblRoomName.Text = _gatewayService.CurrentRoom.Name; } + + RoomUserList.Clear(); lvUserList.Clear(); // always add current user to list i guess @@ -41,7 +46,7 @@ namespace qtc_net_client_2.Forms _gatewayService.OnRoomMessageReceived -= _gatewayService_OnServerMessageReceived; _gatewayService.OnRoomUserListReceived -= _gatewayService_OnRoomUserListReceived; - if (_gatewayService.CurrentRoom != null || _gatewayService.InLobby) + if (_gatewayService.CurrentRoom != null) { // leave any room user is in await _gatewayService.LeaveRoomAsync(); @@ -57,7 +62,7 @@ namespace qtc_net_client_2.Forms // send it and clear text box await _gatewayService.PostMessageAsync(message); - rtxtChatbox.Clear(); + rtxtChatbox.Text = string.Empty; AudioService.PlaySoundEffect("sndSendClick"); } } @@ -101,11 +106,12 @@ namespace qtc_net_client_2.Forms } } - private void _gatewayService_OnServerMessageReceived(object? sender, EventArgs e) + private async void _gatewayService_OnServerMessageReceived(object? sender, EventArgs e) { var msgEventArgs = (ServerMessageEventArgs)e; + var user = RoomUserList.FirstOrDefault(e => e.Username == msgEventArgs.Message.Split(':')[0]); - AddMessage(msgEventArgs.Message); + AddMessage(msgEventArgs.Message, user?.Id); if (!msgEventArgs.Message.Contains(_apiService.CurrentUser.Username)) AudioService.PlaySoundEffect("sndMessage"); } @@ -115,12 +121,23 @@ namespace qtc_net_client_2.Forms if (IsHandleCreated && !IsDisposed) { - Invoke(delegate () + Invoke(async delegate () { + RoomUserList.Clear(); lvUserList.Clear(); foreach (var user in args.UserList) { lvUserList.Items.Add(user.Username, user.Status); + RoomUserList.Add(user); + + // TODO - probably do this only when a message is received (requires response model change) + var pfpRes = await _apiService.GetUserProfilePic(user.Id); + if(pfpRes != null && pfpRes.Success && pfpRes.Data != null) + { + using var ms = new MemoryStream(pfpRes.Data); + using var bmp = new Bitmap(ms); + ilProfileImages.Images.Add(user.Id, bmp); + } } }); } @@ -139,6 +156,7 @@ namespace qtc_net_client_2.Forms { AddMessage($"[SERVER] This Room Was Deleted By An Admin."); lvUserList.Clear(); + RoomUserList.Clear(); lvUserList.Enabled = false; rtxtChatbox.Enabled = false; @@ -148,13 +166,13 @@ namespace qtc_net_client_2.Forms } - private void AddMessage(string message) + private void AddMessage(string message, string? userId = null) { if(IsHandleCreated && !IsDisposed) { Invoke(delegate () { - rtxtChat.AppendText(message + Environment.NewLine); + lvMessages.Items.Add(message, userId ?? "DefaultPfp"); }); } } diff --git a/qtc-net-client-2/Forms/ChatRoom.resx b/qtc-net-client-2/Forms/ChatRoom.resx index 9a3de90..5fac71a 100644 --- a/qtc-net-client-2/Forms/ChatRoom.resx +++ b/qtc-net-client-2/Forms/ChatRoom.resx @@ -124,93 +124,222 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu - SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA+hMAAAJNU0Z0AUkBTAIBAQQB - AAHAAQABwAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/ + SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA4hMAAAJNU0Z0AUkBTAIBAQQB + AAHoAQAB6AEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/ AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AC4AAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B 0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYB BwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekD - YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA1UB9QMkAfsDPAH+AzwB/gMkAfsDUwH0A2IB - 4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQBSwFaAUsB9QEhAVgBIQH7ARgBWAEYAf4BGAFYARgB/gEhAVgB - IQH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAUsCWgH1ASECWAH7ARgCWAH+ARgCWAH+ASEC - WAH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAksBWgH1AiEBWAH7AhgBWAH+AhgBWAH+AiEB - WAH7A1MB9ANiAeEDUQGhAx4BKgwAAxsBJQNYAb0DWgHyA0AB/gMwAf8DOQH/AzwB/wM2Af8DKgH/AyQB - /wNAAf0DXgHwA1YBsgMaASMIAAMbASUDWAG9A1oB8gEYAWABGAH+AQABVwEAAf8BAAFnAQAB/wEAAWwB - AAH/AQABYQEAAf8BAAFMAQAB/wEAAUABAAH/ATABQAEwAf0BWgFeAVoB8ANWAbIBGQEaARkBIwgAAxsB - JQNYAb0DWgHyARgCYAH+AQACVwH/AQACZwH/AQACbAH/AQACYQH/AQACTAH/AQACQAH/ATACQAH9AVoC - XgHwA1YBsgEZAhoBIwgAAxsBJQNYAb0DWgHyAhgBYAH+AgABVwH/AgABZwH/AgABbAH/AgABYQH/AgAB - TAH/AgABQAH/AjABQAH9AloBXgHwA1YBsgIZARoBIwQAAwMBBANSAaUDYAHzA0kB/wNVAf8DZQH/A3EB - /wN1Af8DcQH/A2QB/wNMAf8DMQH/AzwB/gNiAe4DUAGaAwMBBAMDAQQBUgFTAVIBpQFWAW8BVgHzAQAB - ggEAAf8BAAGZAQAB/wEAAbYBAAH/AQABzAEAAf8BAAHTAQAB/wEAAcsBAAH/AQABswEAAf8BAAGIAQAB - /wEAAVcBAAH/ARgBWAEYAf4BXwFiAV8B7gNQAZoDAwEEAwMBBAFSAlMBpQFWAm8B8wEAAoIB/wEAApkB - /wEAArYB/wEAAswB/wEAAtMB/wEAAssB/wEAArMB/wEAAogB/wEAAlcB/wEYAlgB/gFfAmIB7gNQAZoD - AwEEAwMBBAJSAVMBpQJWAW8B8wIAAYIB/wIAAZkB/wIAAbYB/wIAAcwB/wIAAdMB/wIAAcsB/wIAAbMB - /wIAAYgB/wIAAVcB/wIYAVgB/gJfAWIB7gNQAZoDAwEEAy0BRANgAegDewH+A24B/wN7Af8DhQH/A4oB - /wOMAf8DigH/A4UB/wN2Af8DVwH/AzIB/wNAAf0DXgHdAyoBPwMtAUQBYAFpAWAB6AEYAYQBGAH+AQAB - xgEAAf8BAAHcAQAB/wEAAe4BAAH/AQAB+AEAAf8BAAH7AQAB/wEAAfkBAAH/AQAB7wEAAf8BAAHUAQAB - /wEAAZwBAAH/AQABWgEAAf8BMAFAATAB/QNeAd0DKgE/Ay0BRAFgAmkB6AEYAoQB/gEAAsYB/wEAAtwB - /wEAAu4B/wEAAvgB/wEAAvsB/wEAAvkB/wEAAu8B/wEAAtQB/wEAApwB/wEAAloB/wEwAkAB/QNeAd0D - KgE/Ay0BRAJgAWkB6AIYAYQB/gIAAcYB/wIAAdwB/wIAAe4B/wIAAfgB/wIAAfsB/wIAAfkB/wIAAe8B - /wIAAdQB/wIAAZwB/wIAAVoB/wIwAUAB/QNeAd0DKgE/A04BlQN3AfgDfwH/A4UB/wOKAf8DjQH/A44B - /wOOAf8DjgH/A40B/wOJAf8DdwH/A00B/wMlAf8DWgHyA0oBiwNOAZUBQgGBAUIB+AEAAeUBAAH/AQAB - 7wEAAf8BAAH4AQAB/wEAAf0BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/gEAAf8BAAH2AQAB - /wEAAdUBAAH/AQABiwEAAf8BAAFBAQAB/wNaAfIDSgGLA04BlQFCAoEB+AEAAuUB/wEAAu8B/wEAAvgB - /wEAAv0B/wEAA/8BAAP/AQAD/wEAAv4B/wEAAvYB/wEAAtUB/wEAAosB/wEAAkEB/wNaAfIDSgGLA04B - lQJCAYEB+AIAAeUB/wIAAe8B/wIAAfgB/wIAAf0B/wIAAv8CAAL/AgAC/wIAAf4B/wIAAfYB/wIAAdUB - /wIAAYsB/wIAAUEB/wNaAfIDSgGLA18B0wN+AfwDkwH/A44B/wONAf8DjgH/A44B/wOOAf8DjgH/A44B - /wONAf8DhQH/A2cB/wM0Af8DQQH5A1oBxAFbAV8BWwHTASsBsAErAfwBDgH7AQ4B/wEDAf0BAwH/AQAB - /gEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/QEAAf8BAAHvAQAB - /wEAAbkBAAH/AQABXQEAAf8DQQH5A1oBxAFbAl8B0wErArAB/AEOAvsB/wEDAv0B/wEAAv4B/wEAA/8B - AAP/AQAD/wEAA/8BAAP/AQAC/QH/AQAC7wH/AQACuQH/AQACXQH/A0EB+QNaAcQCWwFfAdMCKwGwAfwC - DgH7Af8CAwH9Af8CAAH+Af8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAf0B/wIAAe8B/wIAAbkB/wIAAV0B - /wNBAfkDWgHEA24B9QOAAf4DnwH/A5MB/wOPAf8DjgH/A44B/wOOAf8DjgH/A44B/wOOAf8DiwH/A3cB - /wNIAf8DQAH9A2IB4QFTAXYBUwH1ATwBzwE8Af4BJwH/AScB/wELAf8BCwH/AQEB/wEBAf8BAAH/AQAB - /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH5AQAB/wEAAdYBAAH/AQAB - gQEAAf8BMAFAATAB/QNiAeEBUwJ2AfUBPALPAf4BJwP/AQsD/wEBA/8BAAP/AQAD/wEAA/8BAAP/AQAD - /wEAA/8BAAL5Af8BAALWAf8BAAKBAf8BMAJAAf0DYgHhAlMBdgH1AjwBzwH+AicC/wILAv8CAQL/AgAC - /wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB+QH/AgAB1gH/AgABgQH/AjABQAH9A2IB4QNtAfYDgAH+A6sB - /wOZAf8DkAH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wN/Af8DVQH/A0AB/QNeAeIBSAF6AUgB - 9gFfAc8BXwH+AUIB/wFCAf8BGQH/ARkB/wEEAf8BBAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB - /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/QEAAf8BAAHkAQAB/wEAAZgBAAH/ATABQAEwAf0DXgHiAUgC - egH2AV8CzwH+AUID/wEZA/8BBAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAC/QH/AQAC5AH/AQAC - mAH/ATACQAH9A14B4gJIAXoB9gJfAc8B/gJCAv8CGQL/AgQC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC - /wIAAf0B/wIAAeQB/wIAAZgB/wIwAUAB/QNeAeIDYQHWA34B/AO4Af8DowH/A5MB/wOOAf8DjgH/A44B - /wOOAf8DjgH/A44B/wONAf8DggH/A1wB/wNNAfoDWgHHAVwBYQFcAdYBZAG0AWQB/AFfAf8BXwH/AS8B - /wEvAf8BDAH/AQwB/wEBAf8BAQH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB - /wEAAf4BAAH/AQAB6gEAAf8BAAGlAQAB/wEsAU0BLAH6A1oBxwFcAmEB1gFkArQB/AFfA/8BLwP/AQwD - /wEBA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv4B/wEAAuoB/wEAAqUB/wEsAk0B+gNaAccCXAFhAdYC - ZAG0AfwCXwL/Ai8C/wIMAv8CAQL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAH+Af8CAAHqAf8CAAGlAf8C - LAFNAfoDWgHHA1ABmgOIAfkDxQH/A7IB/wOcAf8DkQH/A44B/wOOAf8DjgH/A44B/wOPAf8DjgH/A4MB - /wNgAf8DWgHyA0wBkANQAZoBagGRAWoB+QF8Af8BfAH/AVEB/wFRAf8BHwH/AR8B/wEHAf8BBwH/AQEB - /wEBAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAgH/AQIB/wECAf4BAgH/AQAB6wEAAf8BAAGtAQAB - /wFaAWsBWgHyA0wBkANQAZoBagKRAfkBfAP/AVED/wEfA/8BBwP/AQED/wEAA/8BAAP/AQAD/wECA/8B - AgL+Af8BAALrAf8BAAKtAf8BWgJrAfIDTAGQA1ABmgJqAZEB+QJ8Av8CUQL/Ah8C/wIHAv8CAQL/AgAC - /wIAAv8CAAL/AgIC/wICAf4B/wIAAesB/wIAAa0B/wJaAWsB8gNMAZADLwFJA2wB6wOgAf4DxgH/A64B - /wOcAf8DkwH/A5AB/wOPAf8DkAH/A5MB/wOTAf8DhQH/A04B/QNgAeADLQFFAy8BSQNsAesBgAHPAYAB - /gF/Af8BfwH/AUkB/wFJAf8BHwH/AR8B/wEMAf8BDAH/AQUB/wEFAf8BAwH/AQMB/wEFAf8BBQH/AQoB - /wEKAf8BCgH+AQoB/wEBAe0BAQH/ATABtgEwAf0BYAFmAWAB4AMtAUUDLwFJA2wB6wGAAs8B/gF/A/8B - SQP/AR8D/wEMA/8BBQP/AQMD/wEFA/8BCgP/AQoC/gH/AQEC7QH/ATACtgH9AWACZgHgAy0BRQMvAUkD - bAHrAoABzwH+An8C/wJJAv8CHwL/AgwC/wIFAv8CAwL/AgUC/wIKAv8CCgH+Af8CAQHtAf8CMAG2Af0C - YAFmAeADLQFFAwMBBANWAa4DcAH1A9kB/wPLAf8DtwH/A6cB/wOdAf8DmgH/A5wB/wOfAf8DmwH/A4kB - /wNoAfADUgGjAwMBBAMDAQQDVgGuAW4BdgFuAfUBqAH/AagB/wGJAf8BiQH/AVwB/wFcAf8BNwH/ATcB - /wEiAf8BIgH/ARsB/wEbAf8BHwH/AR8B/wEmAf8BJgH/AR0B/wEdAf8BBQHzAQUB/wFaAWgBWgHwA1IB - owMDAQQDAwEEA1YBrgFuAnYB9QGoA/8BiQP/AVwD/wE3A/8BIgP/ARsD/wEfA/8BJgP/AR0D/wEFAvMB - /wFaAmgB8ANSAaMDAwEEAwMBBANWAa4CbgF2AfUCqAL/AokC/wJcAv8CNwL/AiIC/wIbAv8CHwL/AiYC - /wIdAv8CBQHzAf8CWgFoAfADUgGjAwMBBAQAAxwBJwNdAccDdwH2A68B/gPXAf8DzAH/A8IB/wO7Af8D - twH/A7EB/wOAAf4DaAH0A1kBvAMbASYIAAMcAScDXQHHAXIBegFyAfYBhwHPAYcB/gGlAf8BpQH/AYsB - /wGLAf8BdAH/AXQB/wFmAf8BZgH/AVwB/wFcAf8BTgH/AU4B/wFIAc8BSAH+AVMBdwFTAfQBVwFZAVcB - vAMbASYIAAMcAScDXQHHAXICegH2AYcCzwH+AaUD/wGLA/8BdAP/AWYD/wFcA/8BTgP/AUgCzwH+AVMC - dwH0AVcCWQG8AxsBJggAAxwBJwNdAccCcgF6AfYChwHPAf4CpQL/AosC/wJ0Av8CZgL/AlwC/wJOAv8C - SAHPAf4CUwF3AfQCVwFZAbwDGwEmDAADIQEwA1kBtgNnAe4DkwH6A74B/QPUAf8DzAH/A74B/QOEAfkD - bAHrA1UBrAMfASwQAAMhATADWQG2AWUBaQFlAe4BfQGfAX0B+gGuAb4BrgH9AZ8B/wGfAf8BjAH/AYwB - /wFeAb4BXgH9AWgBkQFoAfkBYQFsAWEB6wNVAawDHwEsEAADIQEwA1kBtgFlAmkB7gF9Ap8B+gGuAr4B - /QGfA/8BjAP/AV4CvgH9AWgCkQH5AWECbAHrA1UBrAMfASwQAAMhATADWQG2AmUBaQHuAn0BnwH6Aq4B - vgH9Ap8C/wKMAv8CXgG+Af0CaAGRAfkCYQFsAesDVQGsAx8BLBQAAwYBBwM2AVgDVQGsA2YB5QOgAfwD - kwH7A2UB4gNTAacDMwFRAwYBBxgAAwYBBwM2AVgDVQGsA2YB5QF+AbQBfgH8AW0BngFtAfsDZQHiA1MB - pwMzAVEDBgEHGAADBgEHAzYBWANVAawDZgHlAX4CtAH8AW0CngH7A2UB4gNTAacDMwFRAwYBBxgAAwYB - BwM2AVgDVQGsA2YB5QJ+AbQB/AJtAZ4B+wNlAeIDUwGnAzMBUQMGAQcMAAFCAU0BPgcAAT4DAAEoAwAB - QAMAASADAAEBAQABAQYAAQEWAAP/gQAB4AEHAeABBwHgAQcB4AEHAcABAwHAAQMBwAEDAcABAwGAAQEB - gAEBAYABAQGAAQFQAAGAAQEBgAEBAYABAQGAAQEBwAEDAcABAwHAAQMBwAEDAeABBwHgAQcB4AEHAeAB - Bws= + YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA1oB9QMkAfsDQQH+A0EB/gMkAfsDUwH0A2IB + 4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQBUwFaAVMB9QEhAV0BIQH7AR0BXQEdAf4BHQFdAR0B/gEhAV0B + IQH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAVMCWgH1ASECXQH7AR0CXQH+AR0CXQH+ASEC + XQH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAlMBWgH1AiEBXQH7Ah0BXQH+Ah0BXQH+AiEB + XQH7A1MB9ANiAeEDUQGhAx4BKgwAAxsBJQNYAb0DWgHyA0UB/gMwAf8DOQH/AzwB/wM2Af8DKgH/AyQB + /wNAAf0DXgHwA1YBsgMaASMIAAMbASUDWAG9A1oB8gEdAWUBHQH+AQABVwEAAf8BAAFnAQAB/wEAAWwB + AAH/AQABYQEAAf8BAAFMAQAB/wEAAUABAAH/AToBQAE6Af0DXgHwA1YBsgEZARoBGQEjCAADGwElA1gB + vQNaAfIBHQJlAf4BAAJXAf8BAAJnAf8BAAJsAf8BAAJhAf8BAAJMAf8BAAJAAf8BOgJAAf0DXgHwA1YB + sgEZAhoBIwgAAxsBJQNYAb0DWgHyAh0BZQH+AgABVwH/AgABZwH/AgABbAH/AgABYQH/AgABTAH/AgAB + QAH/AjoBQAH9A14B8ANWAbICGQEaASMEAAMDAQQDUgGlA2AB8wNJAf8DVQH/A2UB/wNxAf8DdQH/A3EB + /wNkAf8DTAH/AzEB/wNBAf4DYgHuA1ABmgMDAQQDAwEEAVIBUwFSAaUBXQFvAV0B8wEAAYIBAAH/AQAB + mQEAAf8BAAG2AQAB/wEAAcwBAAH/AQAB0wEAAf8BAAHLAQAB/wEAAbMBAAH/AQABiAEAAf8BAAFXAQAB + /wEdAV0BHQH+A2IB7gNQAZoDAwEEAwMBBAFSAlMBpQFdAm8B8wEAAoIB/wEAApkB/wEAArYB/wEAAswB + /wEAAtMB/wEAAssB/wEAArMB/wEAAogB/wEAAlcB/wEdAl0B/gNiAe4DUAGaAwMBBAMDAQQCUgFTAaUC + XQFvAfMCAAGCAf8CAAGZAf8CAAG2Af8CAAHMAf8CAAHTAf8CAAHLAf8CAAGzAf8CAAGIAf8CAAFXAf8C + HQFdAf4DYgHuA1ABmgMDAQQDLQFEA2AB6AOAAf4DbgH/A3sB/wOFAf8DigH/A4wB/wOKAf8DhQH/A3YB + /wNXAf8DMgH/A0AB/QNeAd0DKgE/Ay0BRAFgAWkBYAHoAR0BgAEdAf4BAAHGAQAB/wEAAdwBAAH/AQAB + 7gEAAf8BAAH4AQAB/wEAAfsBAAH/AQAB+QEAAf8BAAHvAQAB/wEAAdQBAAH/AQABnAEAAf8BAAFaAQAB + /wE6AUABOgH9A14B3QMqAT8DLQFEAWACaQHoAR0CgAH+AQACxgH/AQAC3AH/AQAC7gH/AQAC+AH/AQAC + +wH/AQAC+QH/AQAC7wH/AQAC1AH/AQACnAH/AQACWgH/AToCQAH9A14B3QMqAT8DLQFEAmABaQHoAh0B + gAH+AgABxgH/AgAB3AH/AgAB7gH/AgAB+AH/AgAB+wH/AgAB+QH/AgAB7wH/AgAB1AH/AgABnAH/AgAB + WgH/AjoBQAH9A14B3QMqAT8DTgGVA3cB+AN/Af8DhQH/A4oB/wONAf8DjgH/A44B/wOOAf8DjQH/A4kB + /wN3Af8DTQH/AyUB/wNaAfIDSgGLA04BlQFHAXwBRwH4AQAB5QEAAf8BAAHvAQAB/wEAAfgBAAH/AQAB + /QEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH+AQAB/wEAAfYBAAH/AQAB1QEAAf8BAAGLAQAB + /wEAAUEBAAH/A1oB8gNKAYsDTgGVAUcCfAH4AQAC5QH/AQAC7wH/AQAC+AH/AQAC/QH/AQAD/wEAA/8B + AAP/AQAC/gH/AQAC9gH/AQAC1QH/AQACiwH/AQACQQH/A1oB8gNKAYsDTgGVAkcBfAH4AgAB5QH/AgAB + 7wH/AgAB+AH/AgAB/QH/AgAC/wIAAv8CAAL/AgAB/gH/AgAB9gH/AgAB1QH/AgABiwH/AgABQQH/A1oB + 8gNKAYsDXwHTA34B/AOTAf8DjgH/A40B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wOFAf8DZwH/AzQB + /wNBAfkDWgHEAVsBXwFbAdMBKwGkASsB/AEOAfsBDgH/AQMB/QEDAf8BAAH+AQAB/wEAAf8BAAH/AQAB + /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH9AQAB/wEAAe8BAAH/AQABuQEAAf8BAAFdAQAB + /wNBAfkDWgHEAVsCXwHTASsCpAH8AQ4C+wH/AQMC/QH/AQAC/gH/AQAD/wEAA/8BAAP/AQAD/wEAA/8B + AAL9Af8BAALvAf8BAAK5Af8BAAJdAf8DQQH5A1oBxAJbAV8B0wIrAaQB/AIOAfsB/wIDAf0B/wIAAf4B + /wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB/QH/AgAB7wH/AgABuQH/AgABXQH/A0EB+QNaAcQDbgH1A4AB + /gOfAf8DkwH/A48B/wOOAf8DjgH/A44B/wOOAf8DjgH/A44B/wOLAf8DdwH/A0gB/wNAAf0DYgHhAVkB + bgFZAfUBQQHFAUEB/gEnAf8BJwH/AQsB/wELAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB + /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAfkBAAH/AQAB1gEAAf8BAAGBAQAB/wE6AUABOgH9A2IB + 4QFZAm4B9QFBAsUB/gEnA/8BCwP/AQED/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAvkB/wEAAtYB + /wEAAoEB/wE6AkAB/QNiAeECWQFuAfUCQQHFAf4CJwL/AgsC/wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC + /wIAAv8CAAH5Af8CAAHWAf8CAAGBAf8COgFAAf0DYgHhA2MB9gOAAf4DqwH/A5kB/wOQAf8DjgH/A44B + /wOOAf8DjgH/A44B/wOOAf8DjQH/A38B/wNVAf8DQAH9A14B4gFIAXUBSAH2AWQBxQFkAf4BQgH/AUIB + /wEZAf8BGQH/AQQB/wEEAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB + /wEAAf8BAAH9AQAB/wEAAeQBAAH/AQABmAEAAf8BOgFAAToB/QNeAeIBSAJ1AfYBZALFAf4BQgP/ARkD + /wEEA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAL9Af8BAALkAf8BAAKYAf8BOgJAAf0DXgHiAkgB + dQH2AmQBxQH+AkIC/wIZAv8CBAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB/QH/AgAB5AH/AgAB + mAH/AjoBQAH9A14B4gNhAdYDfgH8A7gB/wOjAf8DkwH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B + /wOCAf8DXAH/A00B+gNaAccBXAFhAVwB1gFkAaoBZAH8AV8B/wFfAf8BLwH/AS8B/wEMAf8BDAH/AQEB + /wEBAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/gEAAf8BAAHqAQAB + /wEAAaUBAAH/ATEBTQExAfoDWgHHAVwCYQHWAWQCqgH8AV8D/wEvA/8BDAP/AQED/wEAA/8BAAP/AQAD + /wEAA/8BAAP/AQAC/gH/AQAC6gH/AQACpQH/ATECTQH6A1oBxwJcAWEB1gJkAaoB/AJfAv8CLwL/AgwC + /wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAf4B/wIAAeoB/wIAAaUB/wIxAU0B+gNaAccDUAGaA4MB + +QPFAf8DsgH/A5wB/wORAf8DjgH/A44B/wOOAf8DjgH/A48B/wOOAf8DgwH/A2AB/wNaAfIDTAGQA1AB + mgFqAYwBagH5AXwB/wF8Af8BUQH/AVEB/wEfAf8BHwH/AQcB/wEHAf8BAQH/AQEB/wEAAf8BAAH/AQAB + /wEAAf8BAAH/AQAB/wECAf8BAgH/AQIB/gECAf8BAAHrAQAB/wEAAa0BAAH/AVoBawFaAfIDTAGQA1AB + mgFqAowB+QF8A/8BUQP/AR8D/wEHA/8BAQP/AQAD/wEAA/8BAAP/AQID/wECAv4B/wEAAusB/wEAAq0B + /wFaAmsB8gNMAZADUAGaAmoBjAH5AnwC/wJRAv8CHwL/AgcC/wIBAv8CAAL/AgAC/wIAAv8CAgL/AgIB + /gH/AgAB6wH/AgABrQH/AloBawHyA0wBkAMvAUkDbAHrA5YB/gPGAf8DrgH/A5wB/wOTAf8DkAH/A48B + /wOQAf8DkwH/A5MB/wOFAf8DSQH9A2AB4AMtAUUDLwFJA2wB6wGAAcUBgAH+AX8B/wF/Af8BSQH/AUkB + /wEfAf8BHwH/AQwB/wEMAf8BBQH/AQUB/wEDAf8BAwH/AQUB/wEFAf8BCgH/AQoB/wEKAf4BCgH/AQEB + 7QEBAf8BOgG2AToB/QFgAWYBYAHgAy0BRQMvAUkDbAHrAYACxQH+AX8D/wFJA/8BHwP/AQwD/wEFA/8B + AwP/AQUD/wEKA/8BCgL+Af8BAQLtAf8BOgK2Af0BYAJmAeADLQFFAy8BSQNsAesCgAHFAf4CfwL/AkkC + /wIfAv8CDAL/AgUC/wIDAv8CBQL/AgoC/wIKAf4B/wIBAe0B/wI6AbYB/QJgAWYB4AMtAUUDAwEEA1YB + rgNuAfUD2QH/A8sB/wO3Af8DpwH/A50B/wOaAf8DnAH/A58B/wObAf8DiQH/A2gB8ANSAaMDAwEEAwMB + BANWAa4DbgH1AagB/wGoAf8BiQH/AYkB/wFcAf8BXAH/ATcB/wE3Af8BIgH/ASIB/wEbAf8BGwH/AR8B + /wEfAf8BJgH/ASYB/wEdAf8BHQH/AQUB8wEFAf8BXgFoAV4B8ANSAaMDAwEEAwMBBANWAa4DbgH1AagD + /wGJA/8BXAP/ATcD/wEiA/8BGwP/AR8D/wEmA/8BHQP/AQUC8wH/AV4CaAHwA1IBowMDAQQDAwEEA1YB + rgNuAfUCqAL/AokC/wJcAv8CNwL/AiIC/wIbAv8CHwL/AiYC/wIdAv8CBQHzAf8CXgFoAfADUgGjAwMB + BAQAAxwBJwNdAccDcgH2A6UB/gPXAf8DzAH/A8IB/wO7Af8DtwH/A7EB/wOAAf4DaAH0A1kBvAMbASYI + AAMcAScDXQHHAWkBdQFpAfYBgAHFAYAB/gGlAf8BpQH/AYsB/wGLAf8BdAH/AXQB/wFmAf8BZgH/AVwB + /wFcAf8BTgH/AU4B/wFNAcUBTQH+AVMBcQFTAfQBVwFZAVcBvAMbASYIAAMcAScDXQHHAWkCdQH2AYAC + xQH+AaUD/wGLA/8BdAP/AWYD/wFcA/8BTgP/AU0CxQH+AVMCcQH0AVcCWQG8AxsBJggAAxwBJwNdAccC + aQF1AfYCgAHFAf4CpQL/AosC/wJ0Av8CZgL/AlwC/wJOAv8CTQHFAf4CUwFxAfQCVwFZAbwDGwEmDAAD + IQEwA1kBtgNiAe4DhAH6A74B/QPUAf8DzAH/A74B/QN/AfkDbAHrA1UBrAMfASwQAAMhATADWQG2AWIB + ZAFiAe4BfQGTAX0B+gGuAb4BrgH9AZ8B/wGfAf8BjAH/AYwB/wFZAb4BWQH9AWgBjAFoAfkBYQFsAWEB + 6wNVAawDHwEsEAADIQEwA1kBtgFiAmQB7gF9ApMB+gGuAr4B/QGfA/8BjAP/AVkCvgH9AWgCjAH5AWEC + bAHrA1UBrAMfASwQAAMhATADWQG2AmIBZAHuAn0BkwH6Aq4BvgH9Ap8C/wKMAv8CWQG+Af0CaAGMAfkC + YQFsAesDVQGsAx8BLBQAAwYBBwM2AVgDVQGsA2YB5QORAfwDjgH7A2UB4gNTAacDMwFRAwYBBxgAAwYB + BwM2AVgDVQGsA2YB5QF+AaoBfgH8AWMBmQFjAfsDZQHiA1MBpwMzAVEDBgEHGAADBgEHAzYBWANVAawD + ZgHlAX4CqgH8AWMCmQH7A2UB4gNTAacDMwFRAwYBBxgAAwYBBwM2AVgDVQGsA2YB5QJ+AaoB/AJjAZkB + +wNlAeIDUwGnAzMBUQMGAQcMAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYAAQEWAAP/gQAB + 4AEHAeABBwHgAQcB4AEHAcABAwHAAQMBwAEDAcABAwGAAQEBgAEBAYABAQGAAQFQAAGAAQEBgAEBAYAB + AQGAAQEBwAEDAcABAwHAAQMBwAEDAeABBwHgAQcB4AEHAeABBws= + + + + 132, 12 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs + LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu + SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAGBwAAAJNU0Z0AUkBTAMBAQAB + EAEAARABAAEgAQABIAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAYADAAEgAwABAQEAASAGAAFAEgAB + UgFHAUIBgAFSAUcBQgGAAVIBRwFCAYABUgFGAUIBgAFSAUYBQgGAAVIBRwFCAYABUgFHAUIBgAFRAUYB + QgGAAVABRgFCAYABSwFFAUIBgAFGAUUBQgGAAUkBRwFCAYABTAFKAUIBgAFPAUsBQwGAAVEBTQFDAYAB + UgFNAUMBgAFSAU0BQgGAAVEBTQFCAYABUQFNAUMBgAFPAUsBQwGAAUwBSQFCAYABSQFHAUIBgAFGAUUB + QgGAAUgBRQFCAYABSgFEAUIBgAFOAUUBQgGAAVIBRgFCAYABUgFGAUIBgAFSAUcBQgGAAVIBRwFCAYAB + UgFHAUIBgAErAioBQP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFGAQEC/wFHAQEC/wFIAQAB + /wHtAUYBAQH/AdsBQwECAf8BkQE2AQEB/wFGASkBAAH/AXUBUAEBAf8BowF3AQIB/wHMAZABCQH/AfQB + qAEQAf8B+QGtAQgB/wH+AbEBAAH/AfcBrgEGAf8B7wGrAQwB/wHKAY4BBwH/AaUBcAECAf8BcAFOAQEB + /wE7ASwBAAH/AVkBJwEAAf8BdwEiAQAB/wG7ATQBAgH/Af4BRgEEAv8BRwEDAv8BRwEBAv8BRwEBAv8B + RwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFGAQIC/wFGAQMB/wH7AUcBAQH/AfcB + SAEAAf8B2gFQAQEB/wG9AVgBAQH/Aa4BYwEBAf8BoAFvAQAB/wG4AYIBAQH/AdEBlgEBAf8B5AGjAQUB + /wH4Aa8BCQH/AfsBsQEFAv8BswEBAf8B+wGxAQQB/wH3AbABCAH/AeQBogEEAf8B0QGUAQEB/wG3AYMB + AgH/AZ0BcgECAf8BgwFRAQEB/wFoATEBAAH/AZQBMwEBAf8BwQE2AQMB/wHgAT8BAgL/AUgBAQL/AUcB + AQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRgEDAv8BRQEEAf8B9wFGAQIB + /wHvAUcBAAH/AccBWgEAAf8BnwFtAQAB/wHMAZEBAAH/AfkBtAEAAf8B/AG1AQAC/wG1AQAB/wH9AbYB + AQH/AfsBtgEBAf8B/QG1AQEC/wG0AQEC/wG0AQIC/wG0AQMB/wH+AbYBAgH/Af0BtwEAAf8B/gG3AQIC + /wG3AQQB/wGsAXwBAgH/AVkBQAEAAf8BbgEzAQEB/wGDASUBAQH/AcEBNwEBAf8B/gFIAQAC/wFIAQEC + /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAgL/AUcBAgH/AfIBTAEBAf8B + 5gFSAQAB/wHaAXEBAAH/Ac8BkAEAAf8B5gGiAQAB/wH8AbUBAQH/Af4BtQEBAv8BtQEBAf8B/gG1AQEB + /wH9AbYBAQH/Af4BtQEBAv8BtQEBAv8BtQECAv8BtQECAv8BtQEBAf8B/gG2AQEB/wH9AbQBAQH/AfsB + sgECAf8B1AGYAQMB/wGsAX8BAwH/AYcBVQECAf8BYwErAQEB/wGvATkBAQH/AfwBSAEBAf8B/gFHAQEC + /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQL/AUkBAAH/Ae4BUwEAAf8B + 3AFcAQAB/wHuAYgBAAL/AbMBAAL/AbQBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUB + AQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQH/AfsBsQEBAf8B9wGsAQAB/wH7AbUBAwL/Ab4B + BgH/AaEBdwEEAf8BQgEwAQEB/wGeATwBAgH/AfoBRwECAf8B/QFHAQIC/wFHAQEB/wFSAUcBQgGA/wCB + AAH/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQL/AUkBAAH/AfYBZAEQAf8B7gF/ASEB/wH2AZoBEAL/AbUB + AAL/AbUBAQL/AbUBAQL/AbUBAgL/AbUBAgL/AbUBAgL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUB + AQL/AbUBAQL/AbUBAQH/Af0BswEBAf8B+wGxAQEB/wH9AbUBAwL/AboBBQH/AaQBdwEDAf8BSQE0AQEB + /wGjAT0BAgH/Af0BRgEDAf8B/gFHAQIC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcB + AQL/AUgBAQH/Af4BSAEAAv8BdQEhAv8BogFBAv8BrAEhAv8BtgEAAv8BtgEBAv8BtQEBAv8BtQECAv8B + tAEDAv8BtQECAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8B + tQEBAv8BtgEDAv8BtgEEAf8BqAF3AQIB/wFQATcBAAH/AagBPgECAv8BRQEEAv8BRgEDAv8BRwEBAf8B + UgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFIAQEC/wFfARMC/wF3ASYC/wGcASgC + /wHCASoC/wG8ARUC/wG2AQEC/wG1AQEC/wG1AQIC/wG1AQIC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC + /wG1AQEC/wG1AQIC/wG1AQIC/wG1AQEC/wG2AQEB/wH+AbYBAQH/Af0BtgECAf8BvQF5AQEB/wF+AT0B + AAH/Ab4BQgEBAv8BRwECAv8BRwECAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFJAQYC/wFLAQoC/wGMAS8C/wHNAVMC/wHCASoC/wG2AQAC/wG2AQEC/wG1AQEC + /wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQIC/wG0AQMC/wG1AQIC/wG2AQAB + /wH9AbYBAAH/AfoBtQEAAf8B0wF8AQAB/wGsAUMBAAH/AdUBRgEAAf8B/gFIAQAC/wFIAQEC/wFHAQEB + /wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAgH/Af4BSAEDAf8B/QFJAQUB + /wHvAWsBHAH/AeEBjQE0Af8B8AGtATsC/wHOAUMC/wHBASMC/wG0AQQC/wG1AQIC/wG2AQEC/wG1AQEC + /wG1AQEC/wG1AQEC/wG2AQEB/wH+AbQBAQH/Af4BswECAf8B/gG3AQkC/wG7ARAB/wH+AbQBDQH/Af0B + rQEKAf8B6QF4AQUB/wHWAUMBAAH/AeoBRgEAAv8BSAEAAv8BSAEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB + /wFHAQEC/wFHAQEC/wFHAQEC/wFGAQIC/wFFAQIB/wH9AUYBAQH/AfoBRwEAAf8B3wFKAQoB/wHDAUwB + FAH/AeEBmQFNAv8B5QGGAv8BzAFGAv8BswEGAv8BtQEDAv8BtgEAAv8BtgEBAv8BtQEBAv8BtgEBAv8B + tgEAAf8B/gG0AQAB/wH8AbIBAAH/Af4BuQEQAv8BvwEgAv8BsgEaAv8BpAEUAv8BdAEKAv8BQwEAAv8B + RgEAAv8BSAEAAv8BSAEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFGAQIB/wH+AUcBAQH/Af0BRwEBAf8B7wFHAQYB/wHhAUgBCwH/AfABcAEnAv8BmAFDAf8B/gGgATwB + /wH9AagBNAH/Af4BugFCAv8BzAFQAv8BzAFOAv8BywFNAv8ByAFHAv8BxgFCAf8B/gHBAT8B/wH+Ab0B + PAH/Af4BoQEnAv8BhgESAv8BfQEOAv8BdQELAv8BXQEGAv8BRQEBAv8BRgEBAv8BSAEBAv8BRwEBAv8B + RwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFFAQIC/wFDAQIC/wFHAQEC/wFLAQAB/wH9AXQBMQH/AfsBnQFiAf8B/QHAAYEC/wHiAaAC/wHiAZwC + /wHhAZgC/wHbAY4C/wHVAYQC/wHOAX4C/wHHAXcC/wGKAT0C/wFMAQMC/wFJAQMC/wFGAQIC/wFHAQIC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/Af4BRgECAf8B/gFFAQMB/wH+AUgBAgL/AUsBAAH/AfkB + XQEZAf8B8gFvATMB/wHNAXsBQQH/AacBhwFQAf8BpAGIAU4B/wGgAYoBTAH/AaMBhgFKAf8BpwGDAUkB + /wG3AX4BQgH/AcgBeQE8Af8B4wFhAR8C/wFKAQIC/wFIAQIC/wFHAQIC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQH/Af4BRwEDAf8B/AFGAQQB/wH+AUgBAgL/AUoBAAH/AfQBRQECAf8B6QFAAQMB + /wGcATYBAgH/AU8BLAEAAf8BSAEvAQAB/wFBATIBAAH/AUgBMQEHAf8BTgEwAQ0B/wFvAS0BBwH/AZAB + KgEAAf8ByAE5AQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQH/Af4BRwECAf8B/gFHAQIB/wH+AUYBAQL/AUUBAQH/AeEBTQEBAf8BwwFUAQIB/wG1AWEBAQH/AacB + bwEAAf8BowFwAQAB/wGfAXEBAAH/AaMBcgEDAf8BpwFyAQcB/wGHAU8BAwH/AWgBLAEAAf8BoAE1AQAB + /wHYAT8BAQH/AesBQwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8B + UgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQAC/wFEAQEC/wFAAQEB/wHOAVQBAQH/AZ0BaAEAAf8BzgGNAQAC/wGxAQAB/wH+AbEBAAH/AfwB + sAEAAf8B/gGyAQAC/wG0AQAB/wGgAXEBAAH/AUABLQEAAf8BeAEyAQAB/wGwATcBAAH/AdgBPwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQIC/wFGAQIB/wH2AUUBAQH/Ae0B + RQEBAf8B3gFqAQEB/wHOAZABAgH/AecBogEBAv8BtAEAAf8B/gGzAQEB/wH+AbIBAgH/Af4BtAEDAv8B + tQEDAf8BzgGRAQMB/wGdAWwBAgH/AZMBSwEBAf8BiQErAQAB/wHEATkBAQL/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRgEDAv8BRQEEAf8B7QFHAQIB/wHbAUkBAAH/Ae0BgAECAv8B + twEEAv8BtwECAv8BtwEAAv8BtgECAv8BtAEEAv8BtQEFAv8BtgEGAf8B/QGxAQUB/wH6AasBBAH/Aa4B + ZQECAf8BYgEeAQAB/wGxATMBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + RwECAv8BRwECAf8B6gFJAQEB/wHWAUsBAAH/AesBgAEDAv8BtQEGAv8BtgEDAv8BtgEBAv8BtQECAv8B + tQEDAv8BtQEDAv8BtgEEAf8B/gG0AQMB/wH9AbIBAgH/Aa4BawEBAf8BXwEkAQAB/wGvATUBAQL/AUcB + AgL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/gFIAQAB/wHoAUsBAAH/AdEB + TQEAAf8B6AGAAQQC/wGzAQcC/wG0AQQC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG3AQEC + /wG4AQAB/wGtAXEBAAH/AVsBKQEAAf8BrQE4AQEC/wFGAQIC/wFHAQIC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUgBAQH/AfMBSgEAAf8B5wFNAQAB/wHzAYYBDgL/Ab8BHAL/AboBDgH/Af4B + tgEBAv8BtgEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAf8BwQFxAQAB/wGDAS4BAAH/AcEB + OgEBAv8BRwECAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wH+AUoB + AQH/Af0BTQEAAf8B/gGMARkC/wHKATEB/wH+AcEBGQH/Af0BtwEAAf8B/gG2AQEC/wG1AQEC/wG1AQEC + /wG1AQEC/wG0AQEC/wGyAQEB/wHVAXIBAQH/AasBMgEAAf8B1QE9AQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQH/Af4BSgEAAv8BjQE2Av8B0QFsAf8B + +wHHAUcB/wH3Ab4BIgH/AfsBuQESAv8BtQECAf8B/QG1AQgB/wH8AbYBDQH/AfsBrwENAf8B+wGoAQ0B + /wHoAXIBCAH/AdUBPAEDAf8B6gFCAQIC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAAL/AY8BUwL/AdgBpgH/AfgBzgF1Af8B8QHEAUQB/wH4AbwB + JAL/AbQBAwH/AfwBtgEOAf8B+AG3ARkB/wH4AasBGQH/AfcBngEYAf8B+wFyAQ8C/wFFAQYC/wFHAQMC + /wFIAQAC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQH/Af0BSAEAAf8B + +wFIAQAB/wH9AW4BLAL/AZQBWQH/AfwBjgE/Af8B+AGIASUB/wHvAYQBFAH/AeYBgQEDAf8B7QGBAQgB + /wH1AYEBDgH/AfgBeQEPAf8B+wFyARAB/wH9AV0BCQL/AUcBAwL/AUcBAgL/AUgBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/gFIAQAB/wH6AUkBAAH/AfYBSQEAAf8B+wFNAQYC + /wFQAQsC/wFOAQkC/wFMAQYB/wHmAU0BBAH/AcwBTQECAf8B3wFMAQMB/wHyAUoBAwH/AfkBSAEFAv8B + RgEHAv8BSAEEAf8B/gFJAQAC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUgBAQH/Af0BSAEBAf8B+wFIAQEB/wH9AUoBAwL/AUwBBgL/AUsBBQL/AUoBBAH/AfIB + SgEDAf8B5gFKAQIB/wHvAUkBAgH/AfkBSQECAf8B/AFIAQMC/wFHAQQC/wFHAQIC/wFIAQEC/wFIAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAFCAU0B + PgcAAT4DAAEoAwABgAMAASADAAEBAQABAQYAAQIWAAP//wD/AAMACw== diff --git a/qtc-net-client-2/Forms/DirectMessage.Designer.cs b/qtc-net-client-2/Forms/DirectMessage.Designer.cs index 4bfdd60..16a58c7 100644 --- a/qtc-net-client-2/Forms/DirectMessage.Designer.cs +++ b/qtc-net-client-2/Forms/DirectMessage.Designer.cs @@ -29,23 +29,14 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DirectMessage)); - rtxtChat = new RichTextBox(); btnSend = new Button(); rtxtChatbox = new RichTextBox(); lblUsername = new Label(); + pbPfp = new PictureBox(); + lvChat = new ListView(); + ((System.ComponentModel.ISupportInitialize)pbPfp).BeginInit(); SuspendLayout(); // - // rtxtChat - // - rtxtChat.HideSelection = false; - rtxtChat.Location = new Point(12, 48); - rtxtChat.Margin = new Padding(4, 3, 4, 3); - rtxtChat.Name = "rtxtChat"; - rtxtChat.ReadOnly = true; - rtxtChat.Size = new Size(593, 325); - rtxtChat.TabIndex = 6; - rtxtChat.Text = ""; - // // btnSend // btnSend.FlatAppearance.BorderSize = 0; @@ -74,21 +65,40 @@ // lblUsername.AutoSize = true; lblUsername.Font = new Font("Segoe UI", 25F, FontStyle.Bold | FontStyle.Italic); - lblUsername.Location = new Point(6, 0); + lblUsername.Location = new Point(52, 0); lblUsername.Margin = new Padding(4, 0, 4, 0); lblUsername.Name = "lblUsername"; lblUsername.Size = new Size(181, 46); lblUsername.TabIndex = 7; lblUsername.Text = "Username"; // + // pbPfp + // + pbPfp.Image = Properties.Resources.DefaultPfp; + pbPfp.Location = new Point(14, 6); + pbPfp.Name = "pbPfp"; + pbPfp.Size = new Size(40, 37); + pbPfp.SizeMode = PictureBoxSizeMode.StretchImage; + pbPfp.TabIndex = 9; + pbPfp.TabStop = false; + // + // lvChat + // + lvChat.Location = new Point(12, 48); + lvChat.Name = "lvChat"; + lvChat.Size = new Size(593, 325); + lvChat.TabIndex = 10; + lvChat.UseCompatibleStateImageBehavior = false; + // // DirectMessage // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; BackColor = Color.DodgerBlue; ClientSize = new Size(618, 443); + Controls.Add(lvChat); + Controls.Add(pbPfp); Controls.Add(lblUsername); - Controls.Add(rtxtChat); Controls.Add(btnSend); Controls.Add(rtxtChatbox); Font = new Font("Segoe UI", 9F); @@ -101,15 +111,16 @@ StartPosition = FormStartPosition.CenterScreen; Text = "QtC.NET Client - Direct Message With ${USER}"; Load += frmDirectMessage_Load; + ((System.ComponentModel.ISupportInitialize)pbPfp).EndInit(); ResumeLayout(false); PerformLayout(); } #endregion - - private RichTextBox rtxtChat; private Button btnSend; private RichTextBox rtxtChatbox; private Label lblUsername; + private PictureBox pbPfp; + private ListView lvChat; } } \ No newline at end of file diff --git a/qtc-net-client-2/Forms/DirectMessage.cs b/qtc-net-client-2/Forms/DirectMessage.cs index 3642263..aa02ef8 100644 --- a/qtc-net-client-2/Forms/DirectMessage.cs +++ b/qtc-net-client-2/Forms/DirectMessage.cs @@ -36,20 +36,23 @@ namespace qtc_net_client_2.Forms InitializeComponent(); } - private void frmDirectMessage_Load(object sender, EventArgs e) + private async void frmDirectMessage_Load(object sender, EventArgs e) { lblUsername.Text = User.Username; Text = $"QtC.NET Client - Direct Message With {User.Username}"; Messages.CollectionChanged += Messages_CollectionChanged; - if (User.Role == "Admin") + var pfpRes = await _apiService.GetUserProfilePic(User.Id); + if(pfpRes != null && pfpRes.Success && pfpRes.Data != null) { - Messages.Add($"[SERVER] This User Is A Server Admin. You should comply with anything this user asks. however admins should not ask for personal information.\n"); + using var ms = new MemoryStream(pfpRes.Data); + using var bmp = new Bitmap(ms); + pbPfp.Image = bmp; } if (InitMessage != null) { - Messages.Add($"[{User.Username}] {InitMessage.Content}\n"); + Messages.Add($"{User.Username}: {InitMessage.Content}"); AudioService.PlaySoundEffect("sndDirectMsg"); } } @@ -63,7 +66,7 @@ namespace qtc_net_client_2.Forms if (!string.IsNullOrEmpty(rtxtChatbox.Text)) { await _gatewayService.SendDirectMessageAsync(User, new QtCNETAPI.Models.Message { Content = rtxtChatbox.Text, AuthorId = _apiService.CurrentUser.Id }); - Messages.Add($"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}\n"); + Messages.Add($"{_apiService.CurrentUser.Username}: {rtxtChatbox.Text}"); rtxtChatbox.Clear(); AudioService.PlaySoundEffect("sndSendClick"); } @@ -97,14 +100,14 @@ namespace qtc_net_client_2.Forms Invoke(delegate () { var msg = e.NewItems.Cast().FirstOrDefault(); - rtxtChat.AppendText(msg); + lvChat.Items.Add(msg); if (!msg!.Contains(_apiService.CurrentUser.Username)) AudioService.PlaySoundEffect("sndMessage"); }); } else { var msg = e.NewItems.Cast().FirstOrDefault(); - rtxtChat.AppendText(msg); + lvChat.Items.Add(msg); if (!msg!.Contains(_apiService.CurrentUser.Username)) AudioService.PlaySoundEffect("sndMessage"); } } diff --git a/qtc-net-client-2/Forms/Main.cs b/qtc-net-client-2/Forms/Main.cs index e91b5c6..f2611ce 100644 --- a/qtc-net-client-2/Forms/Main.cs +++ b/qtc-net-client-2/Forms/Main.cs @@ -80,7 +80,7 @@ namespace qtc_net_client_2 if (selectedRoom == "Lobby") { // join lobby - if (!_gatewayService.InLobby) await _gatewayService.JoinLobbyAsync(); + await _gatewayService.JoinRoomAsync(); ChatRoom frmChat = new ChatRoom(_gatewayService, _apiService); frmChat.Show(); -- 2.47.2 From ca895d1b973ca18a5d3e2569d8b5cfb8464f2e87 Mon Sep 17 00:00:00 2001 From: Moonbase Date: Sat, 15 Nov 2025 12:29:32 -0800 Subject: [PATCH 2/2] ChatRoom Form Now Joins Room Instead Of Main Form Chat Message List Design Changes --- qtc-net-client-2/Forms/ChatRoom.Designer.cs | 11 +- qtc-net-client-2/Forms/ChatRoom.cs | 39 +- qtc-net-client-2/Forms/ChatRoom.resx | 395 +++++++++--------- .../Forms/DirectMessage.Designer.cs | 4 + qtc-net-client-2/Forms/DirectMessage.cs | 6 +- qtc-net-client-2/Forms/Main.cs | 9 +- 6 files changed, 242 insertions(+), 222 deletions(-) diff --git a/qtc-net-client-2/Forms/ChatRoom.Designer.cs b/qtc-net-client-2/Forms/ChatRoom.Designer.cs index 6881803..b41b45e 100644 --- a/qtc-net-client-2/Forms/ChatRoom.Designer.cs +++ b/qtc-net-client-2/Forms/ChatRoom.Designer.cs @@ -29,7 +29,9 @@ private void InitializeComponent() { components = new System.ComponentModel.Container(); + ListViewItem listViewItem1 = new ListViewItem("TestUser", 1); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ChatRoom)); + ListViewItem listViewItem2 = new ListViewItem("TestUser: the quick brown fox jumped over the lazy dog aaaa", 0); rtxtChatbox = new RichTextBox(); btnSend = new Button(); lblRoomName = new Label(); @@ -75,6 +77,7 @@ // lvUserList // lvUserList.Alignment = ListViewAlignment.Left; + lvUserList.Items.AddRange(new ListViewItem[] { listViewItem1 }); lvUserList.Location = new Point(12, 43); lvUserList.MultiSelect = false; lvUserList.Name = "lvUserList"; @@ -97,15 +100,17 @@ // // lvMessages // - lvMessages.Font = new Font("Segoe UI", 9F, FontStyle.Bold); - lvMessages.LargeImageList = ilProfileImages; + lvMessages.Alignment = ListViewAlignment.Left; + lvMessages.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point, 0); + lvMessages.Items.AddRange(new ListViewItem[] { listViewItem2 }); lvMessages.Location = new Point(142, 43); + lvMessages.MultiSelect = false; lvMessages.Name = "lvMessages"; lvMessages.Size = new Size(463, 219); lvMessages.SmallImageList = ilProfileImages; lvMessages.TabIndex = 10; lvMessages.UseCompatibleStateImageBehavior = false; - lvMessages.View = View.List; + lvMessages.View = View.SmallIcon; // // ilProfileImages // diff --git a/qtc-net-client-2/Forms/ChatRoom.cs b/qtc-net-client-2/Forms/ChatRoom.cs index 2c07078..7ef2395 100644 --- a/qtc-net-client-2/Forms/ChatRoom.cs +++ b/qtc-net-client-2/Forms/ChatRoom.cs @@ -10,15 +10,17 @@ namespace qtc_net_client_2.Forms { public partial class ChatRoom : Form { - IGatewayService _gatewayService; - IApiService _apiService; - AudioService AudioService = new(); + private readonly IGatewayService _gatewayService; + private readonly IApiService _apiService; + private readonly AudioService AudioService = new(); - private List RoomUserList = new(); - public ChatRoom(IGatewayService gatewayService, IApiService apiService) + private readonly List RoomUserList = new(); + private Room? Room; + public ChatRoom(IGatewayService gatewayService, IApiService apiService, Room? room = null) { _gatewayService = gatewayService; _apiService = apiService; + Room = room; // subscribe to server message event _gatewayService.OnRoomMessageReceived += _gatewayService_OnServerMessageReceived; @@ -29,15 +31,32 @@ namespace qtc_net_client_2.Forms InitializeComponent(); } - private void frmChat_Load(object sender, EventArgs e) + private async void frmChat_Load(object sender, EventArgs e) { - if (_gatewayService.CurrentRoom != null) { Text = $"QtC.NET Client - Chat Room - {_gatewayService.CurrentRoom.Name}"; lblRoomName.Text = _gatewayService.CurrentRoom.Name; } + if (Room == null) + { + // join lobby + await _gatewayService.JoinRoomAsync(); + Room = new Room + { + Id = "LOBBY", + Name = "Lobby" + }; + } + else + { + // join selected room + await _gatewayService.JoinRoomAsync(Room); + } + + // init ui + + Text = $"QtC.NET Client - Chat Room - {Room.Name}"; + lblRoomName.Text = Room.Name; RoomUserList.Clear(); lvUserList.Clear(); - - // always add current user to list i guess - lvUserList.Items.Add(_apiService.CurrentUser.Username, _apiService.CurrentUser.Status); + lvMessages.Clear(); } private async void frmChat_FormClosing(object sender, FormClosingEventArgs e) diff --git a/qtc-net-client-2/Forms/ChatRoom.resx b/qtc-net-client-2/Forms/ChatRoom.resx index 5fac71a..b156975 100644 --- a/qtc-net-client-2/Forms/ChatRoom.resx +++ b/qtc-net-client-2/Forms/ChatRoom.resx @@ -124,92 +124,91 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu - SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA4hMAAAJNU0Z0AUkBTAIBAQQB - AAHoAQAB6AEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/ + SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAuhMAAAJNU0Z0AUkBTAIBAQQB + AAEQAQEBEAEBARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAASADAAEBAQABIAYAASD/ AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AC4AAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B 0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYB BwM0AVQDUQGiA14B0gNaAekDYAHoA10B0QNQAZ8DMQFNAwUBBhgAAwYBBwM0AVQDUQGiA14B0gNaAekD - YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA1oB9QMkAfsDQQH+A0EB/gMkAfsDUwH0A2IB - 4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQBUwFaAVMB9QEhAV0BIQH7AR0BXQEdAf4BHQFdAR0B/gEhAV0B - IQH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAVMCWgH1ASECXQH7AR0CXQH+AR0CXQH+ASEC - XQH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAlMBWgH1AiEBXQH7Ah0BXQH+Ah0BXQH+AiEB - XQH7A1MB9ANiAeEDUQGhAx4BKgwAAxsBJQNYAb0DWgHyA0UB/gMwAf8DOQH/AzwB/wM2Af8DKgH/AyQB - /wNAAf0DXgHwA1YBsgMaASMIAAMbASUDWAG9A1oB8gEdAWUBHQH+AQABVwEAAf8BAAFnAQAB/wEAAWwB - AAH/AQABYQEAAf8BAAFMAQAB/wEAAUABAAH/AToBQAE6Af0DXgHwA1YBsgEZARoBGQEjCAADGwElA1gB - vQNaAfIBHQJlAf4BAAJXAf8BAAJnAf8BAAJsAf8BAAJhAf8BAAJMAf8BAAJAAf8BOgJAAf0DXgHwA1YB - sgEZAhoBIwgAAxsBJQNYAb0DWgHyAh0BZQH+AgABVwH/AgABZwH/AgABbAH/AgABYQH/AgABTAH/AgAB - QAH/AjoBQAH9A14B8ANWAbICGQEaASMEAAMDAQQDUgGlA2AB8wNJAf8DVQH/A2UB/wNxAf8DdQH/A3EB - /wNkAf8DTAH/AzEB/wNBAf4DYgHuA1ABmgMDAQQDAwEEAVIBUwFSAaUBXQFvAV0B8wEAAYIBAAH/AQAB - mQEAAf8BAAG2AQAB/wEAAcwBAAH/AQAB0wEAAf8BAAHLAQAB/wEAAbMBAAH/AQABiAEAAf8BAAFXAQAB - /wEdAV0BHQH+A2IB7gNQAZoDAwEEAwMBBAFSAlMBpQFdAm8B8wEAAoIB/wEAApkB/wEAArYB/wEAAswB - /wEAAtMB/wEAAssB/wEAArMB/wEAAogB/wEAAlcB/wEdAl0B/gNiAe4DUAGaAwMBBAMDAQQCUgFTAaUC - XQFvAfMCAAGCAf8CAAGZAf8CAAG2Af8CAAHMAf8CAAHTAf8CAAHLAf8CAAGzAf8CAAGIAf8CAAFXAf8C - HQFdAf4DYgHuA1ABmgMDAQQDLQFEA2AB6AOAAf4DbgH/A3sB/wOFAf8DigH/A4wB/wOKAf8DhQH/A3YB - /wNXAf8DMgH/A0AB/QNeAd0DKgE/Ay0BRAFgAWkBYAHoAR0BgAEdAf4BAAHGAQAB/wEAAdwBAAH/AQAB - 7gEAAf8BAAH4AQAB/wEAAfsBAAH/AQAB+QEAAf8BAAHvAQAB/wEAAdQBAAH/AQABnAEAAf8BAAFaAQAB - /wE6AUABOgH9A14B3QMqAT8DLQFEAWACaQHoAR0CgAH+AQACxgH/AQAC3AH/AQAC7gH/AQAC+AH/AQAC - +wH/AQAC+QH/AQAC7wH/AQAC1AH/AQACnAH/AQACWgH/AToCQAH9A14B3QMqAT8DLQFEAmABaQHoAh0B - gAH+AgABxgH/AgAB3AH/AgAB7gH/AgAB+AH/AgAB+wH/AgAB+QH/AgAB7wH/AgAB1AH/AgABnAH/AgAB - WgH/AjoBQAH9A14B3QMqAT8DTgGVA3cB+AN/Af8DhQH/A4oB/wONAf8DjgH/A44B/wOOAf8DjQH/A4kB - /wN3Af8DTQH/AyUB/wNaAfIDSgGLA04BlQFHAXwBRwH4AQAB5QEAAf8BAAHvAQAB/wEAAfgBAAH/AQAB - /QEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH+AQAB/wEAAfYBAAH/AQAB1QEAAf8BAAGLAQAB - /wEAAUEBAAH/A1oB8gNKAYsDTgGVAUcCfAH4AQAC5QH/AQAC7wH/AQAC+AH/AQAC/QH/AQAD/wEAA/8B - AAP/AQAC/gH/AQAC9gH/AQAC1QH/AQACiwH/AQACQQH/A1oB8gNKAYsDTgGVAkcBfAH4AgAB5QH/AgAB - 7wH/AgAB+AH/AgAB/QH/AgAC/wIAAv8CAAL/AgAB/gH/AgAB9gH/AgAB1QH/AgABiwH/AgABQQH/A1oB - 8gNKAYsDXwHTA34B/AOTAf8DjgH/A40B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B/wOFAf8DZwH/AzQB - /wNBAfkDWgHEAVsBXwFbAdMBKwGkASsB/AEOAfsBDgH/AQMB/QEDAf8BAAH+AQAB/wEAAf8BAAH/AQAB - /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH9AQAB/wEAAe8BAAH/AQABuQEAAf8BAAFdAQAB - /wNBAfkDWgHEAVsCXwHTASsCpAH8AQ4C+wH/AQMC/QH/AQAC/gH/AQAD/wEAA/8BAAP/AQAD/wEAA/8B - AAL9Af8BAALvAf8BAAK5Af8BAAJdAf8DQQH5A1oBxAJbAV8B0wIrAaQB/AIOAfsB/wIDAf0B/wIAAf4B - /wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB/QH/AgAB7wH/AgABuQH/AgABXQH/A0EB+QNaAcQDbgH1A4AB - /gOfAf8DkwH/A48B/wOOAf8DjgH/A44B/wOOAf8DjgH/A44B/wOLAf8DdwH/A0gB/wNAAf0DYgHhAVkB - bgFZAfUBQQHFAUEB/gEnAf8BJwH/AQsB/wELAf8BAQH/AQEB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB - /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAfkBAAH/AQAB1gEAAf8BAAGBAQAB/wE6AUABOgH9A2IB - 4QFZAm4B9QFBAsUB/gEnA/8BCwP/AQED/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAvkB/wEAAtYB - /wEAAoEB/wE6AkAB/QNiAeECWQFuAfUCQQHFAf4CJwL/AgsC/wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC - /wIAAv8CAAH5Af8CAAHWAf8CAAGBAf8COgFAAf0DYgHhA2MB9gOAAf4DqwH/A5kB/wOQAf8DjgH/A44B - /wOOAf8DjgH/A44B/wOOAf8DjQH/A38B/wNVAf8DQAH9A14B4gFIAXUBSAH2AWQBxQFkAf4BQgH/AUIB - /wEZAf8BGQH/AQQB/wEEAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB - /wEAAf8BAAH9AQAB/wEAAeQBAAH/AQABmAEAAf8BOgFAAToB/QNeAeIBSAJ1AfYBZALFAf4BQgP/ARkD - /wEEA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAL9Af8BAALkAf8BAAKYAf8BOgJAAf0DXgHiAkgB - dQH2AmQBxQH+AkIC/wIZAv8CBAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAB/QH/AgAB5AH/AgAB - mAH/AjoBQAH9A14B4gNhAdYDfgH8A7gB/wOjAf8DkwH/A44B/wOOAf8DjgH/A44B/wOOAf8DjgH/A40B - /wOCAf8DXAH/A00B+gNaAccBXAFhAVwB1gFkAaoBZAH8AV8B/wFfAf8BLwH/AS8B/wEMAf8BDAH/AQEB - /wEBAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/gEAAf8BAAHqAQAB - /wEAAaUBAAH/ATEBTQExAfoDWgHHAVwCYQHWAWQCqgH8AV8D/wEvA/8BDAP/AQED/wEAA/8BAAP/AQAD - /wEAA/8BAAP/AQAC/gH/AQAC6gH/AQACpQH/ATECTQH6A1oBxwJcAWEB1gJkAaoB/AJfAv8CLwL/AgwC - /wIBAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAf4B/wIAAeoB/wIAAaUB/wIxAU0B+gNaAccDUAGaA4MB - +QPFAf8DsgH/A5wB/wORAf8DjgH/A44B/wOOAf8DjgH/A48B/wOOAf8DgwH/A2AB/wNaAfIDTAGQA1AB - mgFqAYwBagH5AXwB/wF8Af8BUQH/AVEB/wEfAf8BHwH/AQcB/wEHAf8BAQH/AQEB/wEAAf8BAAH/AQAB - /wEAAf8BAAH/AQAB/wECAf8BAgH/AQIB/gECAf8BAAHrAQAB/wEAAa0BAAH/AVoBawFaAfIDTAGQA1AB - mgFqAowB+QF8A/8BUQP/AR8D/wEHA/8BAQP/AQAD/wEAA/8BAAP/AQID/wECAv4B/wEAAusB/wEAAq0B - /wFaAmsB8gNMAZADUAGaAmoBjAH5AnwC/wJRAv8CHwL/AgcC/wIBAv8CAAL/AgAC/wIAAv8CAgL/AgIB - /gH/AgAB6wH/AgABrQH/AloBawHyA0wBkAMvAUkDbAHrA5YB/gPGAf8DrgH/A5wB/wOTAf8DkAH/A48B - /wOQAf8DkwH/A5MB/wOFAf8DSQH9A2AB4AMtAUUDLwFJA2wB6wGAAcUBgAH+AX8B/wF/Af8BSQH/AUkB - /wEfAf8BHwH/AQwB/wEMAf8BBQH/AQUB/wEDAf8BAwH/AQUB/wEFAf8BCgH/AQoB/wEKAf4BCgH/AQEB - 7QEBAf8BOgG2AToB/QFgAWYBYAHgAy0BRQMvAUkDbAHrAYACxQH+AX8D/wFJA/8BHwP/AQwD/wEFA/8B - AwP/AQUD/wEKA/8BCgL+Af8BAQLtAf8BOgK2Af0BYAJmAeADLQFFAy8BSQNsAesCgAHFAf4CfwL/AkkC - /wIfAv8CDAL/AgUC/wIDAv8CBQL/AgoC/wIKAf4B/wIBAe0B/wI6AbYB/QJgAWYB4AMtAUUDAwEEA1YB - rgNuAfUD2QH/A8sB/wO3Af8DpwH/A50B/wOaAf8DnAH/A58B/wObAf8DiQH/A2gB8ANSAaMDAwEEAwMB - BANWAa4DbgH1AagB/wGoAf8BiQH/AYkB/wFcAf8BXAH/ATcB/wE3Af8BIgH/ASIB/wEbAf8BGwH/AR8B - /wEfAf8BJgH/ASYB/wEdAf8BHQH/AQUB8wEFAf8BXgFoAV4B8ANSAaMDAwEEAwMBBANWAa4DbgH1AagD - /wGJA/8BXAP/ATcD/wEiA/8BGwP/AR8D/wEmA/8BHQP/AQUC8wH/AV4CaAHwA1IBowMDAQQDAwEEA1YB - rgNuAfUCqAL/AokC/wJcAv8CNwL/AiIC/wIbAv8CHwL/AiYC/wIdAv8CBQHzAf8CXgFoAfADUgGjAwMB - BAQAAxwBJwNdAccDcgH2A6UB/gPXAf8DzAH/A8IB/wO7Af8DtwH/A7EB/wOAAf4DaAH0A1kBvAMbASYI - AAMcAScDXQHHAWkBdQFpAfYBgAHFAYAB/gGlAf8BpQH/AYsB/wGLAf8BdAH/AXQB/wFmAf8BZgH/AVwB - /wFcAf8BTgH/AU4B/wFNAcUBTQH+AVMBcQFTAfQBVwFZAVcBvAMbASYIAAMcAScDXQHHAWkCdQH2AYAC - xQH+AaUD/wGLA/8BdAP/AWYD/wFcA/8BTgP/AU0CxQH+AVMCcQH0AVcCWQG8AxsBJggAAxwBJwNdAccC - aQF1AfYCgAHFAf4CpQL/AosC/wJ0Av8CZgL/AlwC/wJOAv8CTQHFAf4CUwFxAfQCVwFZAbwDGwEmDAAD - IQEwA1kBtgNiAe4DhAH6A74B/QPUAf8DzAH/A74B/QN/AfkDbAHrA1UBrAMfASwQAAMhATADWQG2AWIB - ZAFiAe4BfQGTAX0B+gGuAb4BrgH9AZ8B/wGfAf8BjAH/AYwB/wFZAb4BWQH9AWgBjAFoAfkBYQFsAWEB - 6wNVAawDHwEsEAADIQEwA1kBtgFiAmQB7gF9ApMB+gGuAr4B/QGfA/8BjAP/AVkCvgH9AWgCjAH5AWEC - bAHrA1UBrAMfASwQAAMhATADWQG2AmIBZAHuAn0BkwH6Aq4BvgH9Ap8C/wKMAv8CWQG+Af0CaAGMAfkC - YQFsAesDVQGsAx8BLBQAAwYBBwM2AVgDVQGsA2YB5QORAfwDjgH7A2UB4gNTAacDMwFRAwYBBxgAAwYB - BwM2AVgDVQGsA2YB5QF+AaoBfgH8AWMBmQFjAfsDZQHiA1MBpwMzAVEDBgEHGAADBgEHAzYBWANVAawD - ZgHlAX4CqgH8AWMCmQH7A2UB4gNTAacDMwFRAwYBBxgAAwYBBwM2AVgDVQGsA2YB5QJ+AaoB/AJjAZkB - +wNlAeIDUwGnAzMBUQMGAQcMAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYAAQEWAAP/gQAB - 4AEHAeABBwHgAQcB4AEHAcABAwHAAQMBwAEDAcABAwGAAQEBgAEBAYABAQGAAQFQAAGAAQEBgAEBAYAB - AQGAAQEBwAEDAcABAwHAAQMBwAEDAeABBwHgAQcB4AEHAeABBws= + YAHoA10B0QNQAZ8DMQFNAwUBBhQAAyABLQNUAasDWwHkA1oB9QMkAfsDRgH+A0YB/gMkAfsDUwH0A2IB + 4QNRAaEDHgEqEAADIAEtA1QBqwNbAeQBWQFaAVkB9QEhAV4BIQH7ASIBYgEiAf4BIgFiASIB/gEhAV4B + IQH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAVkCWgH1ASECXgH7ASICYgH+ASICYgH+ASEC + XgH7A1MB9ANiAeEDUQGhAx4BKhAAAyABLQNUAasDWwHkAlkBWgH1AiEBXgH7AiIBYgH+AiIBYgH+AiEB + XgH7A1MB9ANiAeEDUQGhAx4BKgwAAxsBJQNYAb0DWgHyA0oB/gMwAf8DOQH/AzwB/wM2Af8DKgH/AyQB + /wNAAf0DXgHwA1YBsgMaASMIAAMbASUDWAG9A1oB8gEiAWoBIgH+AQABVwEAAf8BAAFnAQAB/wEAAWwB + AAH/AQABYQEAAf8BAAFMAQAB/wEAAUABAAH/A0AB/QNeAfADVgGyARkBGgEZASMIAAMbASUDWAG9A1oB + 8gEiAmoB/gEAAlcB/wEAAmcB/wEAAmwB/wEAAmEB/wEAAkwB/wEAAkAB/wNAAf0DXgHwA1YBsgEZAhoB + IwgAAxsBJQNYAb0DWgHyAiIBagH+AgABVwH/AgABZwH/AgABbAH/AgABYQH/AgABTAH/AgABQAH/A0AB + /QNeAfADVgGyAhkBGgEjBAADAwEEA1IBpQNgAfMDSQH/A1UB/wNlAf8DcQH/A3UB/wNxAf8DZAH/A0wB + /wMxAf8DRgH+A2IB7gNQAZoDAwEEAwMBBAFSAVMBUgGlAWABbwFgAfMBAAGCAQAB/wEAAZkBAAH/AQAB + tgEAAf8BAAHMAQAB/wEAAdMBAAH/AQABywEAAf8BAAGzAQAB/wEAAYgBAAH/AQABVwEAAf8BIgFiASIB + /gNiAe4DUAGaAwMBBAMDAQQBUgJTAaUBYAJvAfMBAAKCAf8BAAKZAf8BAAK2Af8BAALMAf8BAALTAf8B + AALLAf8BAAKzAf8BAAKIAf8BAAJXAf8BIgJiAf4DYgHuA1ABmgMDAQQDAwEEAlIBUwGlAmABbwHzAgAB + ggH/AgABmQH/AgABtgH/AgABzAH/AgAB0wH/AgABywH/AgABswH/AgABiAH/AgABVwH/AiIBYgH+A2IB + 7gNQAZoDAwEEAy0BRANgAegDgAH+A24B/wN7Af8DhQH/A4oB/wOMAf8DigH/A4UB/wN2Af8DVwH/AzIB + /wNAAf0DXgHdAyoBPwMtAUQBYAFpAWAB6AEiAYABIgH+AQABxgEAAf8BAAHcAQAB/wEAAe4BAAH/AQAB + +AEAAf8BAAH7AQAB/wEAAfkBAAH/AQAB7wEAAf8BAAHUAQAB/wEAAZwBAAH/AQABWgEAAf8DQAH9A14B + 3QMqAT8DLQFEAWACaQHoASICgAH+AQACxgH/AQAC3AH/AQAC7gH/AQAC+AH/AQAC+wH/AQAC+QH/AQAC + 7wH/AQAC1AH/AQACnAH/AQACWgH/A0AB/QNeAd0DKgE/Ay0BRAJgAWkB6AIiAYAB/gIAAcYB/wIAAdwB + /wIAAe4B/wIAAfgB/wIAAfsB/wIAAfkB/wIAAe8B/wIAAdQB/wIAAZwB/wIAAVoB/wNAAf0DXgHdAyoB + PwNOAZUDdwH4A38B/wOFAf8DigH/A40B/wOOAf8DjgH/A44B/wONAf8DiQH/A3cB/wNNAf8DJQH/A1oB + 8gNKAYsDTgGVAU8BfAFPAfgBAAHlAQAB/wEAAe8BAAH/AQAB+AEAAf8BAAH9AQAB/wEAAf8BAAH/AQAB + /wEAAf8BAAH/AQAB/wEAAf4BAAH/AQAB9gEAAf8BAAHVAQAB/wEAAYsBAAH/AQABQQEAAf8DWgHyA0oB + iwNOAZUBTwJ8AfgBAALlAf8BAALvAf8BAAL4Af8BAAL9Af8BAAP/AQAD/wEAA/8BAAL+Af8BAAL2Af8B + AALVAf8BAAKLAf8BAAJBAf8DWgHyA0oBiwNOAZUCTwF8AfgCAAHlAf8CAAHvAf8CAAH4Af8CAAH9Af8C + AAL/AgAC/wIAAv8CAAH+Af8CAAH2Af8CAAHVAf8CAAGLAf8CAAFBAf8DWgHyA0oBiwNfAdMDfgH8A5MB + /wOOAf8DjQH/A44B/wOOAf8DjgH/A44B/wOOAf8DjQH/A4UB/wNnAf8DNAH/A0EB+QNaAcQBWwFfAVsB + 0wErAZUBKwH8AQ4B+wEOAf8BAwH9AQMB/wEAAf4BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB + /wEAAf8BAAH/AQAB/wEAAf0BAAH/AQAB7wEAAf8BAAG5AQAB/wEAAV0BAAH/A0EB+QNaAcQBWwJfAdMB + KwKVAfwBDgL7Af8BAwL9Af8BAAL+Af8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv0B/wEAAu8B/wEAArkB + /wEAAl0B/wNBAfkDWgHEAlsBXwHTAisBlQH8Ag4B+wH/AgMB/QH/AgAB/gH/AgAC/wIAAv8CAAL/AgAC + /wIAAv8CAAH9Af8CAAHvAf8CAAG5Af8CAAFdAf8DQQH5A1oBxANuAfUDgAH+A58B/wOTAf8DjwH/A44B + /wOOAf8DjgH/A44B/wOOAf8DjgH/A4sB/wN3Af8DSAH/A0AB/QNiAeEBWgFuAVoB9QFGAbsBRgH+AScB + /wEnAf8BCwH/AQsB/wEBAf8BAQH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB + /wEAAf8BAAH/AQAB+QEAAf8BAAHWAQAB/wEAAYEBAAH/A0AB/QNiAeEBWgJuAfUBRgK7Af4BJwP/AQsD + /wEBA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAL5Af8BAALWAf8BAAKBAf8DQAH9A2IB4QJaAW4B + 9QJGAbsB/gInAv8CCwL/AgEC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAfkB/wIAAdYB/wIAAYEB + /wNAAf0DYgHhA2MB9gOAAf4DqwH/A5kB/wOQAf8DjgH/A44B/wOOAf8DjgH/A44B/wOOAf8DjQH/A38B + /wNVAf8DQAH9A14B4gFIAW8BSAH2AWkBuwFpAf4BQgH/AUIB/wEZAf8BGQH/AQQB/wEEAf8BAAH/AQAB + /wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH9AQAB/wEAAeQBAAH/AQAB + mAEAAf8DQAH9A14B4gFIAm8B9gFpArsB/gFCA/8BGQP/AQQD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD + /wEAAv0B/wEAAuQB/wEAApgB/wNAAf0DXgHiAkgBbwH2AmkBuwH+AkIC/wIZAv8CBAL/AgAC/wIAAv8C + AAL/AgAC/wIAAv8CAAL/AgAB/QH/AgAB5AH/AgABmAH/A0AB/QNeAeIDYQHWA34B/AO4Af8DowH/A5MB + /wOOAf8DjgH/A44B/wOOAf8DjgH/A44B/wONAf8DggH/A1wB/wNNAfoDWgHHAVwBYQFcAdYBZAGbAWQB + /AFfAf8BXwH/AS8B/wEvAf8BDAH/AQwB/wEBAf8BAQH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAAH/AQAB + /wEAAf8BAAH/AQAB/wEAAf4BAAH/AQAB6gEAAf8BAAGlAQAB/wE4AU0BOAH6A1oBxwFcAmEB1gFkApsB + /AFfA/8BLwP/AQwD/wEBA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv4B/wEAAuoB/wEAAqUB/wE4Ak0B + +gNaAccCXAFhAdYCZAGbAfwCXwL/Ai8C/wIMAv8CAQL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAH+Af8C + AAHqAf8CAAGlAf8COAFNAfoDWgHHA1ABmgN9AfkDxQH/A7IB/wOcAf8DkQH/A44B/wOOAf8DjgH/A44B + /wOPAf8DjgH/A4MB/wNgAf8DWgHyA0wBkANQAZoBagGHAWoB+QF8Af8BfAH/AVEB/wFRAf8BHwH/AR8B + /wEHAf8BBwH/AQEB/wEBAf8BAAH/AQAB/wEAAf8BAAH/AQAB/wEAAf8BAgH/AQIB/wECAf4BAgH/AQAB + 6wEAAf8BAAGtAQAB/wFaAWsBWgHyA0wBkANQAZoBagKHAfkBfAP/AVED/wEfA/8BBwP/AQED/wEAA/8B + AAP/AQAD/wECA/8BAgL+Af8BAALrAf8BAAKtAf8BWgJrAfIDTAGQA1ABmgJqAYcB+QJ8Av8CUQL/Ah8C + /wIHAv8CAQL/AgAC/wIAAv8CAAL/AgIC/wICAf4B/wIAAesB/wIAAa0B/wJaAWsB8gNMAZADLwFJA2wB + 6wOMAf4DxgH/A64B/wOcAf8DkwH/A5AB/wOPAf8DkAH/A5MB/wOTAf8DhQH/A0QB/QNgAeADLQFFAy8B + SQNsAesBgAG7AYAB/gF/Af8BfwH/AUkB/wFJAf8BHwH/AR8B/wEMAf8BDAH/AQUB/wEFAf8BAwH/AQMB + /wEFAf8BBQH/AQoB/wEKAf8BCgH+AQoB/wEBAe0BAQH/AUABtgFAAf0BYAFmAWAB4AMtAUUDLwFJA2wB + 6wGAArsB/gF/A/8BSQP/AR8D/wEMA/8BBQP/AQMD/wEFA/8BCgP/AQoC/gH/AQEC7QH/AUACtgH9AWAC + ZgHgAy0BRQMvAUkDbAHrAoABuwH+An8C/wJJAv8CHwL/AgwC/wIFAv8CAwL/AgUC/wIKAv8CCgH+Af8C + AQHtAf8CQAG2Af0CYAFmAeADLQFFAwMBBANWAa4DbgH1A9kB/wPLAf8DtwH/A6cB/wOdAf8DmgH/A5wB + /wOfAf8DmwH/A4kB/wNoAfADUgGjAwMBBAMDAQQDVgGuA24B9QGoAf8BqAH/AYkB/wGJAf8BXAH/AVwB + /wE3Af8BNwH/ASIB/wEiAf8BGwH/ARsB/wEfAf8BHwH/ASYB/wEmAf8BHQH/AR0B/wEFAfMBBQH/AV4B + aAFeAfADUgGjAwMBBAMDAQQDVgGuA24B9QGoA/8BiQP/AVwD/wE3A/8BIgP/ARsD/wEfA/8BJgP/AR0D + /wEFAvMB/wFeAmgB8ANSAaMDAwEEAwMBBANWAa4DbgH1AqgC/wKJAv8CXAL/AjcC/wIiAv8CGwL/Ah8C + /wImAv8CHQL/AgUB8wH/Al4BaAHwA1IBowMDAQQEAAMcAScDXQHHA2kB9gObAf4D1wH/A8wB/wPCAf8D + uwH/A7cB/wOxAf8DgAH+A2gB9ANZAbwDGwEmCAADHAEnA10BxwFjAW8BYwH2AYABuwGAAf4BpQH/AaUB + /wGLAf8BiwH/AXQB/wF0Af8BZgH/AWYB/wFcAf8BXAH/AU4B/wFOAf8BUgG7AVIB/gFTAWgBUwH0AVcB + WQFXAbwDGwEmCAADHAEnA10BxwFjAm8B9gGAArsB/gGlA/8BiwP/AXQD/wFmA/8BXAP/AU4D/wFSArsB + /gFTAmgB9AFXAlkBvAMbASYIAAMcAScDXQHHAmMBbwH2AoABuwH+AqUC/wKLAv8CdAL/AmYC/wJcAv8C + TgL/AlIBuwH+AlMBaAH0AlcBWQG8AxsBJgwAAyEBMANZAbYDYgHuA30B+gO+Af0D1AH/A8wB/wO+Af0D + dQH5A2wB6wNVAawDHwEsEAADIQEwA1kBtgNiAe4BfQGEAX0B+gGuAb4BrgH9AZ8B/wGfAf8BjAH/AYwB + /wFUAb4BVAH9AWgBhwFoAfkBYQFsAWEB6wNVAawDHwEsEAADIQEwA1kBtgNiAe4BfQKEAfoBrgK+Af0B + nwP/AYwD/wFUAr4B/QFoAocB+QFhAmwB6wNVAawDHwEsEAADIQEwA1kBtgNiAe4CfQGEAfoCrgG+Af0C + nwL/AowC/wJUAb4B/QJoAYcB+QJhAWwB6wNVAawDHwEsFAADBgEHAzYBWANVAawDZgHlA4IB/AOJAfsD + ZQHiA1MBpwMzAVEDBgEHGAADBgEHAzYBWANVAawDZgHlAX4BmwF+AfwBXwGUAV8B+wNlAeIDUwGnAzMB + UQMGAQcYAAMGAQcDNgFYA1UBrANmAeUBfgKbAfwBXwKUAfsDZQHiA1MBpwMzAVEDBgEHGAADBgEHAzYB + WANVAawDZgHlAn4BmwH8Al8BlAH7A2UB4gNTAacDMwFRAwYBBwwAAUIBTQE+BwABPgMAASgDAAFAAwAB + IAMAAQEBAAEBBgABARYAA/+BAAHgAQcB4AEHAeABBwHgAQcBwAEDAcABAwHAAQMBwAEDAYABAQGAAQEB + gAEBAYABAVAAAYABAQGAAQEBgAEBAYABAQHAAQMBwAEDAcABAwHAAQMB4AEHAeABBwHgAQcB4AEHCw== @@ -219,127 +218,125 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu - SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAGBwAAAJNU0Z0AUkBTAMBAQAB - EAEAARABAAEgAQABIAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAYADAAEgAwABAQEAASAGAAFAEgAB - UgFHAUIBgAFSAUcBQgGAAVIBRwFCAYABUgFGAUIBgAFSAUYBQgGAAVIBRwFCAYABUgFHAUIBgAFRAUYB - QgGAAVABRgFCAYABSwFFAUIBgAFGAUUBQgGAAUkBRwFCAYABTAFKAUIBgAFPAUsBQwGAAVEBTQFDAYAB - UgFNAUMBgAFSAU0BQgGAAVEBTQFCAYABUQFNAUMBgAFPAUsBQwGAAUwBSQFCAYABSQFHAUIBgAFGAUUB - QgGAAUgBRQFCAYABSgFEAUIBgAFOAUUBQgGAAVIBRgFCAYABUgFGAUIBgAFSAUcBQgGAAVIBRwFCAYAB - UgFHAUIBgAErAioBQP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFGAQEC/wFHAQEC/wFIAQAB - /wHtAUYBAQH/AdsBQwECAf8BkQE2AQEB/wFGASkBAAH/AXUBUAEBAf8BowF3AQIB/wHMAZABCQH/AfQB - qAEQAf8B+QGtAQgB/wH+AbEBAAH/AfcBrgEGAf8B7wGrAQwB/wHKAY4BBwH/AaUBcAECAf8BcAFOAQEB - /wE7ASwBAAH/AVkBJwEAAf8BdwEiAQAB/wG7ATQBAgH/Af4BRgEEAv8BRwEDAv8BRwEBAv8BRwEBAv8B - RwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFGAQIC/wFGAQMB/wH7AUcBAQH/AfcB - SAEAAf8B2gFQAQEB/wG9AVgBAQH/Aa4BYwEBAf8BoAFvAQAB/wG4AYIBAQH/AdEBlgEBAf8B5AGjAQUB - /wH4Aa8BCQH/AfsBsQEFAv8BswEBAf8B+wGxAQQB/wH3AbABCAH/AeQBogEEAf8B0QGUAQEB/wG3AYMB - AgH/AZ0BcgECAf8BgwFRAQEB/wFoATEBAAH/AZQBMwEBAf8BwQE2AQMB/wHgAT8BAgL/AUgBAQL/AUcB - AQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRgEDAv8BRQEEAf8B9wFGAQIB - /wHvAUcBAAH/AccBWgEAAf8BnwFtAQAB/wHMAZEBAAH/AfkBtAEAAf8B/AG1AQAC/wG1AQAB/wH9AbYB - AQH/AfsBtgEBAf8B/QG1AQEC/wG0AQEC/wG0AQIC/wG0AQMB/wH+AbYBAgH/Af0BtwEAAf8B/gG3AQIC - /wG3AQQB/wGsAXwBAgH/AVkBQAEAAf8BbgEzAQEB/wGDASUBAQH/AcEBNwEBAf8B/gFIAQAC/wFIAQEC - /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAgL/AUcBAgH/AfIBTAEBAf8B - 5gFSAQAB/wHaAXEBAAH/Ac8BkAEAAf8B5gGiAQAB/wH8AbUBAQH/Af4BtQEBAv8BtQEBAf8B/gG1AQEB - /wH9AbYBAQH/Af4BtQEBAv8BtQEBAv8BtQECAv8BtQECAv8BtQEBAf8B/gG2AQEB/wH9AbQBAQH/AfsB - sgECAf8B1AGYAQMB/wGsAX8BAwH/AYcBVQECAf8BYwErAQEB/wGvATkBAQH/AfwBSAEBAf8B/gFHAQEC - /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQL/AUkBAAH/Ae4BUwEAAf8B - 3AFcAQAB/wHuAYgBAAL/AbMBAAL/AbQBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUB - AQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQH/AfsBsQEBAf8B9wGsAQAB/wH7AbUBAwL/Ab4B - BgH/AaEBdwEEAf8BQgEwAQEB/wGeATwBAgH/AfoBRwECAf8B/QFHAQIC/wFHAQEB/wFSAUcBQgGA/wCB - AAH/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQL/AUkBAAH/AfYBZAEQAf8B7gF/ASEB/wH2AZoBEAL/AbUB - AAL/AbUBAQL/AbUBAQL/AbUBAgL/AbUBAgL/AbUBAgL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUB - AQL/AbUBAQL/AbUBAQH/Af0BswEBAf8B+wGxAQEB/wH9AbUBAwL/AboBBQH/AaQBdwEDAf8BSQE0AQEB - /wGjAT0BAgH/Af0BRgEDAf8B/gFHAQIC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcB - AQL/AUgBAQH/Af4BSAEAAv8BdQEhAv8BogFBAv8BrAEhAv8BtgEAAv8BtgEBAv8BtQEBAv8BtQECAv8B - tAEDAv8BtQECAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8B - tQEBAv8BtgEDAv8BtgEEAf8BqAF3AQIB/wFQATcBAAH/AagBPgECAv8BRQEEAv8BRgEDAv8BRwEBAf8B - UgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFIAQEC/wFfARMC/wF3ASYC/wGcASgC - /wHCASoC/wG8ARUC/wG2AQEC/wG1AQEC/wG1AQIC/wG1AQIC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC - /wG1AQEC/wG1AQIC/wG1AQIC/wG1AQEC/wG2AQEB/wH+AbYBAQH/Af0BtgECAf8BvQF5AQEB/wF+AT0B - AAH/Ab4BQgEBAv8BRwECAv8BRwECAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQEC/wFHAQEC/wFJAQYC/wFLAQoC/wGMAS8C/wHNAVMC/wHCASoC/wG2AQAC/wG2AQEC/wG1AQEC - /wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQIC/wG0AQMC/wG1AQIC/wG2AQAB - /wH9AbYBAAH/AfoBtQEAAf8B0wF8AQAB/wGsAUMBAAH/AdUBRgEAAf8B/gFIAQAC/wFIAQEC/wFHAQEB - /wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAgH/Af4BSAEDAf8B/QFJAQUB - /wHvAWsBHAH/AeEBjQE0Af8B8AGtATsC/wHOAUMC/wHBASMC/wG0AQQC/wG1AQIC/wG2AQEC/wG1AQEC - /wG1AQEC/wG1AQEC/wG2AQEB/wH+AbQBAQH/Af4BswECAf8B/gG3AQkC/wG7ARAB/wH+AbQBDQH/Af0B - rQEKAf8B6QF4AQUB/wHWAUMBAAH/AeoBRgEAAv8BSAEAAv8BSAEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB - /wFHAQEC/wFHAQEC/wFHAQEC/wFGAQIC/wFFAQIB/wH9AUYBAQH/AfoBRwEAAf8B3wFKAQoB/wHDAUwB - FAH/AeEBmQFNAv8B5QGGAv8BzAFGAv8BswEGAv8BtQEDAv8BtgEAAv8BtgEBAv8BtQEBAv8BtgEBAv8B - tgEAAf8B/gG0AQAB/wH8AbIBAAH/Af4BuQEQAv8BvwEgAv8BsgEaAv8BpAEUAv8BdAEKAv8BQwEAAv8B - RgEAAv8BSAEAAv8BSAEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC - /wFGAQIB/wH+AUcBAQH/Af0BRwEBAf8B7wFHAQYB/wHhAUgBCwH/AfABcAEnAv8BmAFDAf8B/gGgATwB - /wH9AagBNAH/Af4BugFCAv8BzAFQAv8BzAFOAv8BywFNAv8ByAFHAv8BxgFCAf8B/gHBAT8B/wH+Ab0B - PAH/Af4BoQEnAv8BhgESAv8BfQEOAv8BdQELAv8BXQEGAv8BRQEBAv8BRgEBAv8BSAEBAv8BRwEBAv8B - RwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC - /wFFAQIC/wFDAQIC/wFHAQEC/wFLAQAB/wH9AXQBMQH/AfsBnQFiAf8B/QHAAYEC/wHiAaAC/wHiAZwC - /wHhAZgC/wHbAY4C/wHVAYQC/wHOAX4C/wHHAXcC/wGKAT0C/wFMAQMC/wFJAQMC/wFGAQIC/wFHAQIC - /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcB - AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/Af4BRgECAf8B/gFFAQMB/wH+AUgBAgL/AUsBAAH/AfkB - XQEZAf8B8gFvATMB/wHNAXsBQQH/AacBhwFQAf8BpAGIAU4B/wGgAYoBTAH/AaMBhgFKAf8BpwGDAUkB - /wG3AX4BQgH/AcgBeQE8Af8B4wFhAR8C/wFKAQIC/wFIAQIC/wFHAQIC/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB - AQL/AUcBAQL/AUcBAQH/Af4BRwEDAf8B/AFGAQQB/wH+AUgBAgL/AUoBAAH/AfQBRQECAf8B6QFAAQMB - /wGcATYBAgH/AU8BLAEAAf8BSAEvAQAB/wFBATIBAAH/AUgBMQEHAf8BTgEwAQ0B/wFvAS0BBwH/AZAB - KgEAAf8ByAE5AQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB - AQH/Af4BRwECAf8B/gFHAQIB/wH+AUYBAQL/AUUBAQH/AeEBTQEBAf8BwwFUAQIB/wG1AWEBAQH/AacB - bwEAAf8BowFwAQAB/wGfAXEBAAH/AaMBcgEDAf8BpwFyAQcB/wGHAU8BAwH/AWgBLAEAAf8BoAE1AQAB - /wHYAT8BAQH/AesBQwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8B - UgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQAC/wFEAQEC/wFAAQEB/wHOAVQBAQH/AZ0BaAEAAf8BzgGNAQAC/wGxAQAB/wH+AbEBAAH/AfwB - sAEAAf8B/gGyAQAC/wG0AQAB/wGgAXEBAAH/AUABLQEAAf8BeAEyAQAB/wGwATcBAAH/AdgBPwEBAv8B - RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC - /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQIC/wFGAQIB/wH2AUUBAQH/Ae0B - RQEBAf8B3gFqAQEB/wHOAZABAgH/AecBogEBAv8BtAEAAf8B/gGzAQEB/wH+AbIBAgH/Af4BtAEDAv8B - tQEDAf8BzgGRAQMB/wGdAWwBAgH/AZMBSwEBAf8BiQErAQAB/wHEATkBAQL/AUcBAQL/AUcBAQL/AUcB - AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8B - RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRgEDAv8BRQEEAf8B7QFHAQIB/wHbAUkBAAH/Ae0BgAECAv8B - twEEAv8BtwECAv8BtwEAAv8BtgECAv8BtAEEAv8BtQEFAv8BtgEGAf8B/QGxAQUB/wH6AasBBAH/Aa4B - ZQECAf8BYgEeAQAB/wGxATMBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB - AQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B - RwECAv8BRwECAf8B6gFJAQEB/wHWAUsBAAH/AesBgAEDAv8BtQEGAv8BtgEDAv8BtgEBAv8BtQECAv8B - tQEDAv8BtQEDAv8BtgEEAf8B/gG0AQMB/wH9AbIBAgH/Aa4BawEBAf8BXwEkAQAB/wGvATUBAQL/AUcB - AgL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8B - RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/gFIAQAB/wHoAUsBAAH/AdEB - TQEAAf8B6AGAAQQC/wGzAQcC/wG0AQQC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG3AQEC - /wG4AQAB/wGtAXEBAAH/AVsBKQEAAf8BrQE4AQEC/wFGAQIC/wFHAQIC/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB - AQL/AUcBAQL/AUcBAQL/AUgBAQH/AfMBSgEAAf8B5wFNAQAB/wHzAYYBDgL/Ab8BHAL/AboBDgH/Af4B - tgEBAv8BtgEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAf8BwQFxAQAB/wGDAS4BAAH/AcEB - OgEBAv8BRwECAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB - /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wH+AUoB - AQH/Af0BTQEAAf8B/gGMARkC/wHKATEB/wH+AcEBGQH/Af0BtwEAAf8B/gG2AQEC/wG1AQEC/wG1AQEC - /wG1AQEC/wG0AQEC/wGyAQEB/wHVAXIBAQH/AasBMgEAAf8B1QE9AQEC/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcB - AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQH/Af4BSgEAAv8BjQE2Av8B0QFsAf8B - +wHHAUcB/wH3Ab4BIgH/AfsBuQESAv8BtQECAf8B/QG1AQgB/wH8AbYBDQH/AfsBrwENAf8B+wGoAQ0B - /wHoAXIBCAH/AdUBPAEDAf8B6gFCAQIC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB - AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAAL/AY8BUwL/AdgBpgH/AfgBzgF1Af8B8QHEAUQB/wH4AbwB - JAL/AbQBAwH/AfwBtgEOAf8B+AG3ARkB/wH4AasBGQH/AfcBngEYAf8B+wFyAQ8C/wFFAQYC/wFHAQMC - /wFIAQAC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcB - AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQH/Af0BSAEAAf8B - +wFIAQAB/wH9AW4BLAL/AZQBWQH/AfwBjgE/Af8B+AGIASUB/wHvAYQBFAH/AeYBgQEDAf8B7QGBAQgB - /wH1AYEBDgH/AfgBeQEPAf8B+wFyARAB/wH9AV0BCQL/AUcBAwL/AUcBAgL/AUgBAQL/AUcBAQL/AUcB - AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8B + SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAlhsAAAJNU0Z0AUkBTAMBAQAB + OAEAATgBAAEgAQABIAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAYADAAEgAwABAQEAASAGAAFAEgAC + RwFGAYACRwFGAYACRwFGAYABRwJGAYABRwJGAYACRwFGAYACRwFGAYABRwJGAYABRwJGAYABRwJGAYAD + RgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcBRgGAAkcB + RgGAAkcBRgGAA0YBgAFHAkYBgAFHAkYBgAFHAkYBgAFHAkYBgAFHAkYBgAJHAUYBgAJHAUYBgAJHAUYB + gAMqAUD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRgEBAv8BRwEBAv8BSAEAAf8B7QFGAQEB + /wHbAUMBAgH/AZEBNgEBAf8BRgEpAQAB/wF1AVABAQH/AaMBdwECAf8BzAGQAQkB/wH0AagBEAH/AfkB + rQEIAf8B/gGxAQAB/wH3Aa4BBgH/Ae8BqwEMAf8BygGOAQcB/wGlAXABAgH/AXABTgEBAf8BOwEsAQAB + /wFZAScBAAH/AXcBIgEAAf8BuwE0AQIB/wH+AUYBBAL/AUcBAwL/AUcBAQL/AUcBAQL/AUcBAQH/AkcB + RgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAgL/AUYBAwH/AfsBRwEBAf8B9wFIAQAB/wHaAVAB + AQH/Ab0BWAEBAf8BrgFjAQEB/wGgAW8BAAH/AbgBggEBAf8B0QGWAQEB/wHkAaMBBQH/AfgBrwEJAf8B + +wGxAQUC/wGzAQEB/wH7AbEBBAH/AfcBsAEIAf8B5AGiAQQB/wHRAZQBAQH/AbcBgwECAf8BnQFyAQIB + /wGDAVEBAQH/AWgBMQEAAf8BlAEzAQEB/wHBATYBAwH/AeABPwECAv8BSAEBAv8BRwEBAv8BRwEBAf8C + RwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRgEDAv8BRQEEAf8B9wFGAQIB/wHvAUcBAAH/AccB + WgEAAf8BnwFtAQAB/wHMAZEBAAH/AfkBtAEAAf8B/AG1AQAC/wG1AQAB/wH9AbYBAQH/AfsBtgEBAf8B + /QG1AQEC/wG0AQEC/wG0AQIC/wG0AQMB/wH+AbYBAgH/Af0BtwEAAf8B/gG3AQIC/wG3AQQB/wGsAXwB + AgH/AVkBQAEAAf8BbgEzAQEB/wGDASUBAQH/AcEBNwEBAf8B/gFIAQAC/wFIAQEC/wFHAQEB/wJHAUYB + gP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQIC/wFHAQIB/wHyAUwBAQH/AeYBUgEAAf8B2gFxAQAB + /wHPAZABAAH/AeYBogEAAf8B/AG1AQEB/wH+AbUBAQL/AbUBAQH/Af4BtQEBAf8B/QG2AQEB/wH+AbUB + AQL/AbUBAQL/AbUBAgL/AbUBAgL/AbUBAQH/Af4BtgEBAf8B/QG0AQEB/wH7AbIBAgH/AdQBmAEDAf8B + rAF/AQMB/wGHAVUBAgH/AWMBKwEBAf8BrwE5AQEB/wH8AUgBAQH/Af4BRwEBAv8BRwEBAf8CRwFGAYD/ + AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAv8BSQEAAf8B7gFTAQAB/wHcAVwBAAH/Ae4BiAEAAv8B + swEAAv8BtAEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtQEBAv8B + tQEBAv8BtQEBAv8BtQEBAf8B+wGxAQEB/wH3AawBAAH/AfsBtQEDAv8BvgEGAf8BoQF3AQQB/wFCATAB + AQH/AZ4BPAECAf8B+gFHAQIB/wH9AUcBAgL/AUcBAQH/AkcBRgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcB + AQL/AUgBAQL/AUkBAAH/AfYBZAEQAf8B7gF/ASEB/wH2AZoBEAL/AbUBAAL/AbUBAQL/AbUBAQL/AbUB + AgL/AbUBAgL/AbUBAgL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQH/Af0B + swEBAf8B+wGxAQEB/wH9AbUBAwL/AboBBQH/AaQBdwEDAf8BSQE0AQEB/wGjAT0BAgH/Af0BRgEDAf8B + /gFHAQIC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFIAQEB/wH+AUgBAAL/AXUB + IQL/AaIBQQL/AawBIQL/AbYBAAL/AbYBAQL/AbUBAQL/AbUBAgL/AbQBAwL/AbUBAgL/AbUBAQL/AbUB + AQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbYBAwL/AbYBBAH/AagB + dwECAf8BUAE3AQAB/wGoAT4BAgL/AUUBBAL/AUYBAwL/AUcBAQH/AkcBRgGA/wCBAAH/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUgBAQL/AV8BEwL/AXcBJgL/AZwBKAL/AcIBKgL/AbwBFQL/AbYBAQL/AbUB + AQL/AbUBAgL/AbUBAgL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAgL/AbUBAgL/AbUB + AQL/AbYBAQH/Af4BtgEBAf8B/QG2AQIB/wG9AXkBAQH/AX4BPQEAAf8BvgFCAQEC/wFHAQIC/wFHAQIC + /wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFJAQYC/wFLAQoC + /wGMAS8C/wHNAVMC/wHCASoC/wG2AQAC/wG2AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC + /wG1AQEC/wG1AQEC/wG1AQIC/wG0AQMC/wG1AQIC/wG2AQAB/wH9AbYBAAH/AfoBtQEAAf8B0wF8AQAB + /wGsAUMBAAH/AdUBRgEAAf8B/gFIAQAC/wFIAQEC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFGAQIB/wH+AUgBAwH/Af0BSQEFAf8B7wFrARwB/wHhAY0BNAH/AfABrQE7Av8B + zgFDAv8BwQEjAv8BtAEEAv8BtQECAv8BtgEBAv8BtQEBAv8BtQEBAv8BtQEBAv8BtgEBAf8B/gG0AQEB + /wH+AbMBAgH/Af4BtwEJAv8BuwEQAf8B/gG0AQ0B/wH9Aa0BCgH/AekBeAEFAf8B1gFDAQAB/wHqAUYB + AAL/AUgBAAL/AUgBAQL/AUcBAQH/AkcBRgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAgL/AUUB + AgH/Af0BRgEBAf8B+gFHAQAB/wHfAUoBCgH/AcMBTAEUAf8B4QGZAU0C/wHlAYYC/wHMAUYC/wGzAQYC + /wG1AQMC/wG2AQAC/wG2AQEC/wG1AQEC/wG2AQEC/wG2AQAB/wH+AbQBAAH/AfwBsgEAAf8B/gG5ARAC + /wG/ASAC/wGyARoC/wGkARQC/wF0AQoC/wFDAQAC/wFGAQAC/wFIAQAC/wFIAQEC/wFHAQEB/wJHAUYB + gP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFGAQIB/wH+AUcBAQH/Af0BRwEBAf8B7wFHAQYB + /wHhAUgBCwH/AfABcAEnAv8BmAFDAf8B/gGgATwB/wH9AagBNAH/Af4BugFCAv8BzAFQAv8BzAFOAv8B + ywFNAv8ByAFHAv8BxgFCAf8B/gHBAT8B/wH+Ab0BPAH/Af4BoQEnAv8BhgESAv8BfQEOAv8BdQELAv8B + XQEGAv8BRQEBAv8BRgEBAv8BSAEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRQECAv8BQwECAv8BRwEBAv8BSwEAAf8B/QF0ATEB + /wH7AZ0BYgH/Af0BwAGBAv8B4gGgAv8B4gGcAv8B4QGYAv8B2wGOAv8B1QGEAv8BzgF+Av8BxwF3Av8B + igE9Av8BTAEDAv8BSQEDAv8BRgECAv8BRwECAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8C + RwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8B/gFGAQIB + /wH+AUUBAwH/Af4BSAECAv8BSwEAAf8B+QFdARkB/wHyAW8BMwH/Ac0BewFBAf8BpwGHAVAB/wGkAYgB + TgH/AaABigFMAf8BowGGAUoB/wGnAYMBSQH/AbcBfgFCAf8ByAF5ATwB/wHjAWEBHwL/AUoBAgL/AUgB + AgL/AUcBAgL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AkcBRgGA/wCBAAH/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/Af4BRwEDAf8B/AFGAQQB/wH+AUgB + AgL/AUoBAAH/AfQBRQECAf8B6QFAAQMB/wGcATYBAgH/AU8BLAEAAf8BSAEvAQAB/wFBATIBAAH/AUgB + MQEHAf8BTgEwAQ0B/wFvAS0BBwH/AZABKgEAAf8ByAE5AQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wH+AUcBAgH/Af4BRwECAf8B/gFGAQEC/wFFAQEB/wHhAU0B + AQH/AcMBVAECAf8BtQFhAQEB/wGnAW8BAAH/AaMBcAEAAf8BnwFxAQAB/wGjAXIBAwH/AacBcgEHAf8B + hwFPAQMB/wFoASwBAAH/AaABNQEAAf8B2AE/AQEB/wHrAUMBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQH/AkcBRgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAAL/AUQBAQL/AUABAQH/Ac4BVAEBAf8BnQFoAQAB/wHOAY0B + AAL/AbEBAAH/Af4BsQEAAf8B/AGwAQAB/wH+AbIBAAL/AbQBAAH/AaABcQEAAf8BQAEtAQAB/wF4ATIB + AAH/AbABNwEAAf8B2AE/AQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB + /wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQIC + /wFGAQIB/wH2AUUBAQH/Ae0BRQEBAf8B3gFqAQEB/wHOAZABAgH/AecBogEBAv8BtAEAAf8B/gGzAQEB + /wH+AbIBAgH/Af4BtAEDAv8BtQEDAf8BzgGRAQMB/wGdAWwBAgH/AZMBSwEBAf8BiQErAQAB/wHEATkB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AkcBRgGA/wCBAAH/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUYBAwL/AUUBBAH/Ae0BRwECAf8B + 2wFJAQAB/wHtAYABAgL/AbcBBAL/AbcBAgL/AbcBAAL/AbYBAgL/AbQBBAL/AbUBBQL/AbYBBgH/Af0B + sQEFAf8B+gGrAQQB/wGuAWUBAgH/AWIBHgEAAf8BsQEzAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQIC/wFHAQIB/wHqAUkBAQH/AdYBSwEAAf8B6wGAAQMC/wG1AQYC/wG2AQMC + /wG2AQEC/wG1AQIC/wG1AQMC/wG1AQMC/wG2AQQB/wH+AbQBAwH/Af0BsgECAf8BrgFrAQEB/wFfASQB + AAH/Aa8BNQEBAv8BRwECAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/ + AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/gFIAQAB + /wHoAUsBAAH/AdEBTQEAAf8B6AGAAQQC/wGzAQcC/wG0AQQC/wG1AQEC/wG1AQEC/wG1AQEC/wG1AQEC + /wG1AQEC/wG3AQEC/wG4AQAB/wGtAXEBAAH/AVsBKQEAAf8BrQE4AQEC/wFGAQIC/wFHAQIC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFIAQEB/wHzAUoBAAH/AecBTQEAAf8B8wGGAQ4C/wG/ARwC + /wG6AQ4B/wH+AbYBAQL/AbYBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQL/AbUBAQH/AcEBcQEAAf8B + gwEuAQAB/wHBAToBAQL/AUcBAgL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AkcB + RgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB + AQH/Af4BSgEBAf8B/QFNAQAB/wH+AYwBGQL/AcoBMQH/Af4BwQEZAf8B/QG3AQAB/wH+AbYBAQL/AbUB + AQL/AbUBAQL/AbUBAQL/AbQBAQL/AbIBAQH/AdUBcgEBAf8BqwEyAQAB/wHVAT0BAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQH/AkcBRgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcB + AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUgBAQH/Af4BSgEAAv8BjQE2Av8B + 0QFsAf8B+wHHAUcB/wH3Ab4BIgH/AfsBuQESAv8BtQECAf8B/QG1AQgB/wH8AbYBDQH/AfsBrwENAf8B + +wGoAQ0B/wHoAXIBCAH/AdUBPAEDAf8B6gFCAQIC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFGAQAC/wGPAVMC/wHYAaYB/wH4Ac4BdQH/AfEBxAFEAf8B + +AG8ASQC/wG0AQMB/wH8AbYBDgH/AfgBtwEZAf8B+AGrARkB/wH3AZ4BGAH/AfsBcgEPAv8BRQEGAv8B + RwEDAv8BSAEAAv8BSAEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAf8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/QFIAQAB + /wH7AUgBAAH/Af0BbgEsAv8BlAFZAf8B/AGOAT8B/wH4AYgBJQH/Ae8BhAEUAf8B5gGBAQMB/wHtAYEB + CAH/AfUBgQEOAf8B+AF5AQ8B/wH7AXIBEAH/Af0BXQEJAv8BRwEDAv8BRwECAv8BSAEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8B RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BSAEBAf8B/gFIAQAB/wH6AUkBAAH/AfYBSQEAAf8B+wFNAQYC /wFQAQsC/wFOAQkC/wFMAQYB/wHmAU0BBAH/AcwBTQECAf8B3wFMAQMB/wHyAUoBAwH/AfkBSAEFAv8B RgEHAv8BSAEEAf8B/gFJAQAC/wFIAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB - AQL/AUcBAQL/AUgBAQH/Af0BSAEBAf8B+wFIAQEB/wH9AUoBAwL/AUwBBgL/AUsBBQL/AUoBBAH/AfIB - SgEDAf8B5gFKAQIB/wHvAUkBAgH/AfkBSQECAf8B/AFIAQMC/wFHAQQC/wFHAQIC/wFIAQEC/wFIAQEC - /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAH/AUcB - AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB - AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB - AQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcBAQL/AUcB - AQH/AVIBRwFCAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + /wFHAQEB/wJHAUYBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC + /wFHAQEC/wFIAQEB/wH9AUgBAQH/AfsBSAEBAf8B/QFKAQMC/wFMAQYC/wFLAQUC/wFKAQQB/wHyAUoB + AwH/AeYBSgECAf8B7wFJAQIB/wH5AUkBAgH/AfwBSAEDAv8BRwEEAv8BRwECAv8BSAEBAv8BSAEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAf8BRwEBAv8B RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B - RwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8BUgFHAUIBgP8AgQAB/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC - /wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEC/wFHAQEB/wFSAUcBQgGA/wCBAAFCAU0B - PgcAAT4DAAEoAwABgAMAASADAAEBAQABAQYAAQIWAAP//wD/AAMACw== + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8C + RwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAf8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8B + RwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAv8BRwEBAf8CRwFGAYD/AIEAAUIBTQE+BwABPgMAASgD + AAGAAwABIAMAAQEBAAEBBgABAhYAA///AP8AAwAL diff --git a/qtc-net-client-2/Forms/DirectMessage.Designer.cs b/qtc-net-client-2/Forms/DirectMessage.Designer.cs index 16a58c7..32440ae 100644 --- a/qtc-net-client-2/Forms/DirectMessage.Designer.cs +++ b/qtc-net-client-2/Forms/DirectMessage.Designer.cs @@ -84,11 +84,15 @@ // // lvChat // + lvChat.Alignment = ListViewAlignment.Left; + lvChat.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point, 0); lvChat.Location = new Point(12, 48); + lvChat.MultiSelect = false; lvChat.Name = "lvChat"; lvChat.Size = new Size(593, 325); lvChat.TabIndex = 10; lvChat.UseCompatibleStateImageBehavior = false; + lvChat.View = View.SmallIcon; // // DirectMessage // diff --git a/qtc-net-client-2/Forms/DirectMessage.cs b/qtc-net-client-2/Forms/DirectMessage.cs index aa02ef8..40d1f1c 100644 --- a/qtc-net-client-2/Forms/DirectMessage.cs +++ b/qtc-net-client-2/Forms/DirectMessage.cs @@ -46,8 +46,8 @@ namespace qtc_net_client_2.Forms if(pfpRes != null && pfpRes.Success && pfpRes.Data != null) { using var ms = new MemoryStream(pfpRes.Data); - using var bmp = new Bitmap(ms); - pbPfp.Image = bmp; + using var img = Image.FromStream(ms); + pbPfp.Image = new Bitmap(img); } if (InitMessage != null) @@ -77,7 +77,7 @@ namespace qtc_net_client_2.Forms if (!string.IsNullOrEmpty(rtxtChatbox.Text)) { await _gatewayService.SendDirectMessageAsync(User, new QtCNETAPI.Models.Message { Content = rtxtChatbox.Text, AuthorId = _apiService.CurrentUser.Id }); - Messages.Add($"[{_apiService.CurrentUser.Username}] {rtxtChatbox.Text}\n"); + Messages.Add($"{_apiService.CurrentUser.Username}: {rtxtChatbox.Text}"); rtxtChatbox.Clear(); AudioService.PlaySoundEffect("sndSendClick"); } diff --git a/qtc-net-client-2/Forms/Main.cs b/qtc-net-client-2/Forms/Main.cs index f2611ce..9726e79 100644 --- a/qtc-net-client-2/Forms/Main.cs +++ b/qtc-net-client-2/Forms/Main.cs @@ -79,9 +79,6 @@ namespace qtc_net_client_2 { if (selectedRoom == "Lobby") { - // join lobby - await _gatewayService.JoinRoomAsync(); - ChatRoom frmChat = new ChatRoom(_gatewayService, _apiService); frmChat.Show(); @@ -93,9 +90,7 @@ namespace qtc_net_client_2 Room? room = RoomList.FirstOrDefault(e => e.Name == selectedRoom); if (room != null) { - if (_gatewayService.CurrentRoom != room) await _gatewayService.JoinRoomAsync(room); - - ChatRoom frmChat = new ChatRoom(_gatewayService, _apiService); + ChatRoom frmChat = new ChatRoom(_gatewayService, _apiService, room); frmChat.Show(); LoggingService.LogString($"User Has Joined {room.Name}"); @@ -1094,7 +1089,7 @@ namespace qtc_net_client_2 if (existingForm != null && existingForm.User.Id == args.User.Id) { // we want to just add to its text box - existingForm.Messages.Add($"[{args.User.Username}] {args.Message.Content}\n"); + existingForm.Messages.Add($"{args.User.Username}: {args.Message.Content}"); } else { -- 2.47.2