diff --git a/.github/issue_template.md b/.github/ISSUE_TEMPLATE/bug---.md similarity index 67% rename from .github/issue_template.md rename to .github/ISSUE_TEMPLATE/bug---.md index 79efbbc9..9599ee10 100644 --- a/.github/issue_template.md +++ b/.github/ISSUE_TEMPLATE/bug---.md @@ -1,3 +1,12 @@ +--- +name: Bug 报告 +about: 在提出问题前请先自行排除服务器端问题和升级到最新客户端,同时也请通过搜索确认是否有人提出过相同问题。 +title: "[BUG]" +labels: bug +assignees: '' + +--- + 在提出问题前请先自行排除服务器端问题和升级到最新客户端,同时也请通过搜索确认是否有人提出过相同问题。 ### 预期行为 @@ -22,4 +31,3 @@ ### 环境信息(客户端请升级至最新正式版) ### 额外信息(可选) - diff --git a/.github/ISSUE_TEMPLATE/feature---.md b/.github/ISSUE_TEMPLATE/feature---.md new file mode 100644 index 00000000..a93f12ad --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature---.md @@ -0,0 +1,20 @@ +--- +name: Feature 请求 +about: 为这个项目提出一个建议 +title: "[Feature request]" +labels: enhancement +assignees: '' + +--- + +**你的功能请求是否与一个问题有关?请描述。** +清楚而简洁地描述问题是什么。例如。我总是感到沮丧,当 [...] + +**描述你希望的解决方案** +对你希望发生的事情进行清晰、简明的描述。 + +**描述你所考虑的替代方案** +对你考虑过的任何替代解决方案或功能进行清晰、简洁的描述。 + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/README.md b/README.md index c1197a8b..1856b4d8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,11 @@ # v2rayN +A V2Ray client for Windows, support [Xray core](https://github.com/XTLS/Xray-core) and [v2fly core](https://github.com/v2fly/v2ray-core) + + +[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/2dust/v2rayN)](https://github.com/2dust/v2rayN/commits/master) +[![CodeFactor](https://www.codefactor.io/repository/github/2dust/v2rayn/badge)](https://www.codefactor.io/repository/github/2dust/v2rayn) +[![GitHub Releases](https://img.shields.io/github/downloads/2dust/v2rayN/latest/total?logo=github)](https://github.com/2dust/v2rayN/releases) +[![Chat on Telegram](https://img.shields.io/badge/Chat%20on-Telegram-brightgreen.svg)](https://t.me/v2rayn) ### How to use - If you are newbie please download v2rayN-Core.zip from releases @@ -6,5 +13,6 @@ - Run v2rayN.exe ### Requirements -- Microsoft [.NET Framework 4.6](https://docs.microsoft.com/zh-cn/dotnet/framework/install/guide-for-developers) or higher -- Project V core [https://github.com/v2fly/v2ray-core/releases](https://github.com/v2fly/v2ray-core/releases) +- Microsoft [.NET Framework 4.8](https://dotnet.microsoft.com/zh-cn/download/dotnet-framework/thank-you/net48-web-installer) +- v2fly core [https://github.com/v2fly/v2ray-core/releases](https://github.com/v2fly/v2ray-core/releases) +- Xray core [https://github.com/XTLS/Xray-core/releases](https://github.com/XTLS/Xray-core/releases) diff --git a/v2rayN/v2rayN/Base/HttpClientHelper.cs b/v2rayN/v2rayN/Base/HttpClientHelper.cs new file mode 100644 index 00000000..a3bacb5d --- /dev/null +++ b/v2rayN/v2rayN/Base/HttpClientHelper.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; + +namespace v2rayN.Base +{ + /// + /// + public class HttpClientHelper + { + private static HttpClientHelper httpClientHelper = null; + private HttpClient httpClient; + + /// + /// + private HttpClientHelper() { } + + /// + /// + /// + public static HttpClientHelper GetInstance() + { + if (httpClientHelper != null) + { + return httpClientHelper; + } + else + { + HttpClientHelper httpClientHelper = new HttpClientHelper(); + + HttpClientHandler handler = new HttpClientHandler() { UseCookies = false }; + httpClientHelper.httpClient = new HttpClient(handler); + return httpClientHelper; + } + } + public async Task GetAsync(string url) + { + if (string.IsNullOrEmpty(url)) + { + return null; + } + HttpResponseMessage response = await httpClient.GetAsync(url); + + return await response.Content.ReadAsStringAsync(); + } + public async Task GetAsync(HttpClient client, string url, CancellationToken token) + { + if (string.IsNullOrEmpty(url)) + { + return null; + } + HttpResponseMessage response = await client.GetAsync(url, token); + if (!response.IsSuccessStatusCode) + { + throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode)); + } + return await response.Content.ReadAsStringAsync(); + } + + public async Task PutAsync(string url, Dictionary headers) + { + var myContent = Utils.ToJson(headers); + var buffer = System.Text.Encoding.UTF8.GetBytes(myContent); + var byteContent = new ByteArrayContent(buffer); + byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + + var result = await httpClient.PutAsync(url, byteContent); + } + + public async Task DownloadFileAsync(HttpClient client, string url, string fileName, IProgress progress, CancellationToken token) + { + if (string.IsNullOrEmpty(url)) + { + throw new ArgumentNullException("url"); + } + if (string.IsNullOrEmpty(fileName)) + { + throw new ArgumentNullException("fileName"); + } + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + + var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token); + + if (!response.IsSuccessStatusCode) + { + throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode)); + } + + var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L; + var canReportProgress = total != -1 && progress != null; + + using (var stream = await response.Content.ReadAsStreamAsync()) + { + using (var file = File.Create(fileName)) + { + var totalRead = 0L; + var buffer = new byte[1024 * 1024]; + var isMoreToRead = true; + var progressPercentage = 0; + + do + { + token.ThrowIfCancellationRequested(); + + var read = await stream.ReadAsync(buffer, 0, buffer.Length, token); + + if (read == 0) + { + isMoreToRead = false; + } + else + { + var data = new byte[read]; + buffer.ToList().CopyTo(0, data, 0, read); + + // TODO: put here the code to write the file to disk + file.Write(data, 0, read); + + totalRead += read; + + if (canReportProgress) + { + var percent = Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100); + if (progressPercentage != percent && percent % 10 == 0) + { + progressPercentage = percent; + progress.Report(percent); + } + } + } + } while (isMoreToRead); + file.Close(); + if (canReportProgress) + { + progress.Report(101); + + } + } + } + } + + public async Task DownloadDataAsync4Speed(HttpClient client, string url, IProgress progress, CancellationToken token) + { + if (string.IsNullOrEmpty(url)) + { + throw new ArgumentNullException("url"); + } + + var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token); + + if (!response.IsSuccessStatusCode) + { + throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode)); + } + + //var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L; + //var canReportProgress = total != -1 && progress != null; + + using (var stream = await response.Content.ReadAsStreamAsync()) + { + var totalRead = 0L; + var buffer = new byte[1024 * 64]; + var isMoreToRead = true; + string progressSpeed = string.Empty; + DateTime totalDatetime = DateTime.Now; + + do + { + if (token.IsCancellationRequested) + { + if (totalRead > 0) + { + return; + } + else + { + token.ThrowIfCancellationRequested(); + } + } + + var read = await stream.ReadAsync(buffer, 0, buffer.Length, token); + + if (read == 0) + { + isMoreToRead = false; + } + else + { + var data = new byte[read]; + buffer.ToList().CopyTo(0, data, 0, read); + + // TODO: + totalRead += read; + + TimeSpan ts = (DateTime.Now - totalDatetime); + var speed = (totalRead * 1d / ts.TotalMilliseconds / 1000).ToString("#0.0"); + if (progress != null) + { + if (progressSpeed != speed) + { + progressSpeed = speed; + progress.Report(speed); + } + } + } + } while (isMoreToRead); + } + } + + } +} diff --git a/v2rayN/v2rayN/Base/HttpWebServer.cs b/v2rayN/v2rayN/Base/HttpWebServer.cs deleted file mode 100644 index 9fa72495..00000000 --- a/v2rayN/v2rayN/Base/HttpWebServer.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Net; -using System.Text; -using System.Threading; - -namespace v2rayN.Base -{ - public class HttpWebServer - { - private HttpListener _listener; - private Func _responderMethod; - - public HttpWebServer(string[] prefixes, Func method) - { - try - { - _listener = new HttpListener(); - - if (!HttpListener.IsSupported) - throw new NotSupportedException( - "Needs Windows XP SP2, Server 2003 or later."); - - // URI prefixes are required, for example - // "http://localhost:8080/index/". - if (prefixes == null || prefixes.Length == 0) - throw new ArgumentException("prefixes"); - - // A responder method is required - if (method == null) - throw new ArgumentException("method"); - - foreach (string s in prefixes) - _listener.Prefixes.Add(s); - - _responderMethod = method; - _listener.Start(); - - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - throw; - } - } - - public HttpWebServer(Func method, params string[] prefixes) - : this(prefixes, method) { } - - public void Run() - { - ThreadPool.QueueUserWorkItem((o) => - { - Utils.SaveLog("Webserver running..."); - try - { - while (_listener.IsListening) - { - ThreadPool.QueueUserWorkItem((c) => - { - HttpListenerContext ctx = c as HttpListenerContext; - try - { - string address = ctx.Request.LocalEndPoint.Address.ToString(); - Utils.SaveLog("Webserver Request " + address); - string rstr = _responderMethod(address); - byte[] buf = Encoding.UTF8.GetBytes(rstr); - ctx.Response.StatusCode = 200; - ctx.Response.ContentType = "application/x-ns-proxy-autoconfig"; - ctx.Response.ContentLength64 = buf.Length; - ctx.Response.OutputStream.Write(buf, 0, buf.Length); - } - catch - { - } // suppress any exceptions - finally - { - // always close the stream - ctx.Response.OutputStream.Close(); - } - }, _listener.GetContext()); - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } // suppress any exceptions - }); - } - - public void Stop() - { - if (_listener != null) - { - _listener.Stop(); - _listener.Close(); - _listener = null; - } - } - - } -} diff --git a/v2rayN/v2rayN/Base/HttpWebServerB.cs b/v2rayN/v2rayN/Base/HttpWebServerB.cs deleted file mode 100644 index fcbca1dd..00000000 --- a/v2rayN/v2rayN/Base/HttpWebServerB.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System; -using System.IO; -using System.Net; -using System.Net.Sockets; -using System.Threading; - -namespace v2rayN.Base -{ - public class HttpWebServerB - { - private TcpListener listener; - private int port; - private Func _responderMethod; - - public HttpWebServerB(int port, Func method) - { - this.port = port; - this._responderMethod = method; - - Thread thread = new Thread(StartListen) - { - IsBackground = true - }; - thread.Start(); - } - - public void Stop() - { - if (listener != null) - { - listener.Stop(); - listener = null; - } - } - - private void StartListen() - { - try - { - listener = new TcpListener(IPAddress.Any, port); - listener.Start(); - Utils.SaveLog("WebserverB running..."); - - while (true) - { - if (!listener.Pending()) - { - Thread.Sleep(100); - continue; - } - - TcpClient socket = listener.AcceptTcpClient(); - Thread thread = new Thread(new ParameterizedThreadStart(ProcessThread)) - { - IsBackground = true - }; - thread.Start(socket); - Thread.Sleep(1); - } - } - catch - { - Utils.SaveLog("WebserverB start fail."); - } - } - private void ProcessThread(object obj) - { - try - { - TcpClient socket = obj as TcpClient; - - BufferedStream inputStream = new BufferedStream(socket.GetStream()); - StreamWriter outputStream = new StreamWriter(new BufferedStream(socket.GetStream())); - if (inputStream.CanRead) - { - string data = ReadStream(inputStream); - - if (data.Contains("/pac/")) - { - if (_responderMethod != null) - { - string address = ((IPEndPoint)socket.Client.LocalEndPoint).Address.ToString(); - Utils.SaveLog("WebserverB Request " + address); - string pac = _responderMethod(address); - - if (inputStream.CanWrite) - { - WriteStream(outputStream, pac); - } - } - } - } - - outputStream.BaseStream.Flush(); - inputStream = null; - outputStream = null; - socket.Close(); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - private string ReadStream(Stream inputStream) - { - int nextchar; - string data = ""; - while (true) - { - nextchar = inputStream.ReadByte(); - if (nextchar == '\n') - { - break; - } - if (nextchar == '\r') - { - continue; - } - if (nextchar == -1) - { - Thread.Sleep(1); - continue; - }; - data += Convert.ToChar(nextchar); - } - return data; - } - - private void WriteStream(StreamWriter outputStream, string pac) - { - string content_type = "application/x-ns-proxy-autoconfig"; - outputStream.WriteLine("HTTP/1.1 200 OK"); - outputStream.WriteLine(String.Format("Content-Type:{0}", content_type)); - outputStream.WriteLine("Connection: close"); - outputStream.WriteLine(""); - outputStream.WriteLine(pac); - outputStream.Flush(); - } - } -} diff --git a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs index a113a7bc..4d34e2c0 100644 --- a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs +++ b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs @@ -1,10 +1,13 @@ -using System.Drawing; +using System; +using System.Drawing; using System.Windows.Forms; namespace v2rayN.Base { class ListViewFlickerFree : ListView { + Action _updateFunc; + public ListViewFlickerFree() { SetStyle(ControlStyles.OptimizedDoubleBuffer @@ -13,38 +16,82 @@ namespace v2rayN.Base UpdateStyles(); } - - public void AutoResizeColumns() + public void RegisterDragEvent(Action update) { - try + _updateFunc = update; + AllowDrop = true; + + ItemDrag += lv_ItemDrag; + DragDrop += lv_DragDrop; + DragEnter += lv_DragEnter; + DragOver += lv_DragOver; + DragLeave += lv_DragLeave; + } + + private void lv_DragDrop(object sender, DragEventArgs e) + { + int targetIndex = InsertionMark.Index; + if (targetIndex == -1) { - this.SuspendLayout(); - Graphics graphics = this.CreateGraphics(); - - // 原生 ColumnHeaderAutoResizeStyle.ColumnContent 将忽略列头宽度 - this.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - - for (int i = 0; i < this.Columns.Count; i++) - { - ColumnHeader c = this.Columns[i]; - int cWidth = c.Width; - string MaxStr = ""; - Font font = this.Items[0].SubItems[0].Font; - - foreach (ListViewItem item in this.Items) - { - // 整行视作相同字形,不单独计算每个单元格 - font = item.SubItems[i].Font; - string str = item.SubItems[i].Text; - if (str.Length > MaxStr.Length) // 未考虑非等宽问题 - MaxStr = str; - } - int strWidth = (int)graphics.MeasureString(MaxStr, font).Width; - c.Width = System.Math.Max(cWidth, strWidth); - } - this.ResumeLayout(); + return; } - catch { } + if (InsertionMark.AppearsAfterItem) + { + targetIndex++; + } + + + if (SelectedIndices.Count <= 0) + { + return; + } + + _updateFunc(SelectedIndices[0], targetIndex); + + //ListViewItem draggedItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); + //this.BeginUpdate(); + //this.Items.Insert(targetIndex, (ListViewItem)draggedItem.Clone()); + //this.Items.Remove(draggedItem); + //this.EndUpdate(); + } + + + private void lv_DragEnter(object sender, DragEventArgs e) + { + e.Effect = e.AllowedEffect; + } + + private void lv_DragLeave(object sender, EventArgs e) + { + InsertionMark.Index = -1; + } + + private void lv_DragOver(object sender, DragEventArgs e) + { + Point targetPoint = PointToClient(new Point(e.X, e.Y)); + int targetIndex = InsertionMark.NearestIndex(targetPoint); + + if (targetIndex > -1) + { + Rectangle itemBounds = GetItemRect(targetIndex); + EnsureVisible(targetIndex); + + if (targetPoint.Y > itemBounds.Top + (itemBounds.Height / 2)) + { + InsertionMark.AppearsAfterItem = true; + } + else + { + InsertionMark.AppearsAfterItem = false; + } + } + InsertionMark.Index = targetIndex; + } + + private void lv_ItemDrag(object sender, ItemDragEventArgs e) + { + DoDragDrop(e.Item, DragDropEffects.Move); + InsertionMark.Index = -1; } } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Base/WebClientEx.cs b/v2rayN/v2rayN/Base/WebClientEx.cs deleted file mode 100644 index 096826cc..00000000 --- a/v2rayN/v2rayN/Base/WebClientEx.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Net; - -namespace v2rayN.Base -{ - class WebClientEx : WebClient - { - public int Timeout - { - get; set; - } - public WebClientEx(int timeout = 3000) - { - Timeout = timeout; - } - - protected override WebRequest GetWebRequest(Uri address) - { - HttpWebRequest request; - request = (HttpWebRequest)base.GetWebRequest(address); - request.Timeout = Timeout; - request.ReadWriteTimeout = Timeout; - //request.AllowAutoRedirect = false; - //request.AllowWriteStreamBuffering = true; - - request.ServicePoint.BindIPEndPointDelegate = (servicePoint, remoteEndPoint, retryCount) => - { - if (remoteEndPoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) - return new IPEndPoint(IPAddress.IPv6Any, 0); - else - return new IPEndPoint(IPAddress.Any, 0); - }; - - return request; - } - } -} diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs index 0e407a43..25f8d715 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs @@ -31,6 +31,10 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer2Form)); this.btnClose = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnEdit = new System.Windows.Forms.Button(); + this.cmbCoreType = new System.Windows.Forms.ComboBox(); + this.labCoreType = new System.Windows.Forms.Label(); + this.btnBrowse = new System.Windows.Forms.Button(); this.txtAddress = new System.Windows.Forms.TextBox(); this.label13 = new System.Windows.Forms.Label(); this.txtRemarks = new System.Windows.Forms.TextBox(); @@ -45,23 +49,53 @@ // // btnClose // - resources.ApplyResources(this.btnClose, "btnClose"); this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); this.btnClose.Name = "btnClose"; this.btnClose.UseVisualStyleBackColor = true; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); // // groupBox1 // - resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.btnEdit); + this.groupBox1.Controls.Add(this.cmbCoreType); + this.groupBox1.Controls.Add(this.labCoreType); + this.groupBox1.Controls.Add(this.btnBrowse); this.groupBox1.Controls.Add(this.txtAddress); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.txtRemarks); this.groupBox1.Controls.Add(this.label6); this.groupBox1.Controls.Add(this.label1); + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // btnEdit + // + resources.ApplyResources(this.btnEdit, "btnEdit"); + this.btnEdit.Name = "btnEdit"; + this.btnEdit.UseVisualStyleBackColor = true; + this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click); + // + // cmbCoreType + // + this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); + this.cmbCoreType.Name = "cmbCoreType"; + // + // labCoreType + // + resources.ApplyResources(this.labCoreType, "labCoreType"); + this.labCoreType.Name = "labCoreType"; + // + // btnBrowse + // + resources.ApplyResources(this.btnBrowse, "btnBrowse"); + this.btnBrowse.Name = "btnBrowse"; + this.btnBrowse.UseVisualStyleBackColor = true; + this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click); + // // txtAddress // resources.ApplyResources(this.txtAddress, "txtAddress"); @@ -89,9 +123,9 @@ // // panel2 // - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // btnOK @@ -136,5 +170,9 @@ private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Label label13; private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Button btnBrowse; + private System.Windows.Forms.ComboBox cmbCoreType; + private System.Windows.Forms.Label labCoreType; + private System.Windows.Forms.Button btnEdit; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index 999b0c25..81d87cfa 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -1,12 +1,15 @@ using System; +using System.Diagnostics; +using System.IO; using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { public partial class AddServer2Form : BaseServerForm - { + { public AddServer2Form() { @@ -15,12 +18,24 @@ namespace v2rayN.Forms private void AddServer2Form_Load(object sender, EventArgs e) { - if (EditIndex >= 0) + cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); + cmbCoreType.Items.Add("clash"); + cmbCoreType.Items.Add("clash_meta"); + cmbCoreType.Items.Add("hysteria"); + cmbCoreType.Items.Add("naiveproxy"); + cmbCoreType.Items.Add(string.Empty); + + txtAddress.ReadOnly = true; + if (vmessItem != null) { BindingServer(); } else { + vmessItem = new VmessItem + { + groupId = groupId + }; ClearServer(); } } @@ -30,10 +45,10 @@ namespace v2rayN.Forms /// private void BindingServer() { - vmessItem = config.vmess[EditIndex]; txtRemarks.Text = vmessItem.remarks; txtAddress.Text = vmessItem.address; - txtAddress.ReadOnly = true; + + cmbCoreType.Text = vmessItem.coreType == null ? string.Empty : vmessItem.coreType.ToString(); } @@ -50,24 +65,83 @@ namespace v2rayN.Forms string remarks = txtRemarks.Text; if (Utils.IsNullOrEmpty(remarks)) { - UI.Show(UIRes.I18N("PleaseFillRemarks")); + UI.Show(ResUI.PleaseFillRemarks); + return; + } + if (Utils.IsNullOrEmpty(txtAddress.Text)) + { + UI.Show(ResUI.FillServerAddressCustom); return; } vmessItem.remarks = remarks; - - if (ConfigHandler.EditCustomServer(ref config, vmessItem, EditIndex) == 0) + if (Utils.IsNullOrEmpty(cmbCoreType.Text)) { - this.DialogResult = DialogResult.OK; + vmessItem.coreType = null; } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + vmessItem.coreType = (ECoreType)Enum.Parse(typeof(ECoreType), cmbCoreType.Text); + } + + if (ConfigHandler.EditCustomServer(ref config, vmessItem) == 0) + { + DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(ResUI.OperationFailed); } } private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = Utils.IsNullOrEmpty(vmessItem.indexId) ? DialogResult.Cancel : DialogResult.OK; + } + + private void btnBrowse_Click(object sender, EventArgs e) + { + UI.Show(ResUI.CustomServerTips); + + OpenFileDialog fileDialog = new OpenFileDialog + { + Multiselect = false, + Filter = "Config|*.json|YAML|*.yaml|All|*.*" + }; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + + vmessItem.address = fileName; + vmessItem.remarks = txtRemarks.Text; + + if (ConfigHandler.AddCustomServer(ref config, vmessItem, false) == 0) + { + BindingServer(); + UI.Show(ResUI.SuccessfullyImportedCustomServer); + } + else + { + UI.ShowWarning(ResUI.FailedImportedCustomServer); + } + } + + private void btnEdit_Click(object sender, EventArgs e) + { + var address = txtAddress.Text; + if (Utils.IsNullOrEmpty(address)) + { + UI.Show(ResUI.FillServerAddressCustom); + return; + } + + address = Utils.GetConfigPath(address); + Process.Start(address); } } } diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.resx b/v2rayN/v2rayN/Forms/AddServer2Form.resx index 969bc410..23a0a255 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer2Form.resx @@ -117,74 +117,161 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 6, 12 - - - 611, 271 - - - True - - - Edit custom configuration server - - 396, 17 + 450, 17 75, 23 + 4 &Cancel - - 303, 17 + + btnClose - - 75, 23 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 5 + + panel2 - - &OK - - - Fill - - - 0, 10 - - - 611, 201 - - - 3 - - - Server - - - True - - - 12, 62 - - - 83, 12 - - + 0 - - Address + + + NoControl + + + 208, 110 + + + 75, 23 + + + 43 + + + &Edit + + + btnEdit + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 127, 157 + + + 89, 20 + + + 41 + + + cmbCoreType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + True + + + NoControl + + + 12, 161 + + + 59, 12 + + + 42 + + + Core Type + + + labCoreType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + NoControl + + + 127, 110 + + + 75, 23 + + + 40 + + + &Browse + + + btnBrowse + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + 127, 62 + + + True + + + 432, 37 + + + 23 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 True @@ -201,6 +288,39 @@ * Fill in manually + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + 127, 23 + + + 313, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + True @@ -208,7 +328,7 @@ 12, 27 - 83, 12 + 95, 12 10 @@ -216,6 +336,132 @@ Alias (remarks) + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 12, 62 + + + 47, 12 + + + 0 + + + Address + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + Fill + + + 0, 10 + + + 611, 189 + + + 3 + + + Server + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 199 + + + 611, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 357, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + Top @@ -228,37 +474,34 @@ 6 - - Bottom + + panel1 - - 0, 211 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 611, 60 + + $this - - 7 + + 2 - - 127, 62 - - + True + + + 6, 12 - - 432, 104 + + 611, 259 - - 23 + + Custom configuration server - - 127, 23 + + AddServer2Form - - 313, 21 - - - 11 + + v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx index 482593c4..45296254 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx @@ -118,17 +118,26 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 编辑自定义配置服务器 + 自定义配置 + + + 浏览(&B) 取消(&C) + + 编辑(&E) + 确定(&O) 服务器 + + Core类型 + 地址(address) diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs deleted file mode 100644 index 06312421..00000000 --- a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs +++ /dev/null @@ -1,231 +0,0 @@ -namespace v2rayN.Forms -{ - partial class AddServer3Form - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer3Form)); - this.btnClose = new System.Windows.Forms.Button(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.label13 = new System.Windows.Forms.Label(); - this.cmbSecurity = new System.Windows.Forms.ComboBox(); - this.txtRemarks = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.txtId = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.txtPort = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.txtAddress = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.panel2 = new System.Windows.Forms.Panel(); - this.btnOK = new System.Windows.Forms.Button(); - this.panel1 = new System.Windows.Forms.Panel(); - this.menuServer = new System.Windows.Forms.MenuStrip(); - this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBox1.SuspendLayout(); - this.panel2.SuspendLayout(); - this.menuServer.SuspendLayout(); - this.SuspendLayout(); - // - // btnClose - // - resources.ApplyResources(this.btnClose, "btnClose"); - this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnClose.Name = "btnClose"; - this.btnClose.UseVisualStyleBackColor = true; - this.btnClose.Click += new System.EventHandler(this.btnClose_Click); - // - // groupBox1 - // - resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Controls.Add(this.label13); - this.groupBox1.Controls.Add(this.cmbSecurity); - this.groupBox1.Controls.Add(this.txtRemarks); - this.groupBox1.Controls.Add(this.label6); - this.groupBox1.Controls.Add(this.label5); - this.groupBox1.Controls.Add(this.txtId); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.txtPort); - this.groupBox1.Controls.Add(this.label2); - this.groupBox1.Controls.Add(this.txtAddress); - this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.TabStop = false; - // - // label13 - // - resources.ApplyResources(this.label13, "label13"); - this.label13.Name = "label13"; - // - // cmbSecurity - // - resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); - this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbSecurity.FormattingEnabled = true; - this.cmbSecurity.Items.AddRange(new object[] { - resources.GetString("cmbSecurity.Items"), - resources.GetString("cmbSecurity.Items1"), - resources.GetString("cmbSecurity.Items2"), - resources.GetString("cmbSecurity.Items3"), - resources.GetString("cmbSecurity.Items4"), - resources.GetString("cmbSecurity.Items5"), - resources.GetString("cmbSecurity.Items6"), - resources.GetString("cmbSecurity.Items7")}); - this.cmbSecurity.Name = "cmbSecurity"; - // - // txtRemarks - // - resources.ApplyResources(this.txtRemarks, "txtRemarks"); - this.txtRemarks.Name = "txtRemarks"; - // - // label6 - // - resources.ApplyResources(this.label6, "label6"); - this.label6.Name = "label6"; - // - // label5 - // - resources.ApplyResources(this.label5, "label5"); - this.label5.Name = "label5"; - // - // txtId - // - resources.ApplyResources(this.txtId, "txtId"); - this.txtId.Name = "txtId"; - // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // txtPort - // - resources.ApplyResources(this.txtPort, "txtPort"); - this.txtPort.Name = "txtPort"; - // - // label2 - // - resources.ApplyResources(this.label2, "label2"); - this.label2.Name = "label2"; - // - // txtAddress - // - resources.ApplyResources(this.txtAddress, "txtAddress"); - this.txtAddress.Name = "txtAddress"; - // - // label1 - // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; - // - // panel2 - // - resources.ApplyResources(this.panel2, "panel2"); - this.panel2.Controls.Add(this.btnClose); - this.panel2.Controls.Add(this.btnOK); - this.panel2.Name = "panel2"; - // - // btnOK - // - resources.ApplyResources(this.btnOK, "btnOK"); - this.btnOK.Name = "btnOK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // panel1 - // - resources.ApplyResources(this.panel1, "panel1"); - this.panel1.Name = "panel1"; - // - // menuServer - // - resources.ApplyResources(this.menuServer, "menuServer"); - this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItem1}); - this.menuServer.Name = "menuServer"; - // - // MenuItem1 - // - resources.ApplyResources(this.MenuItem1, "MenuItem1"); - this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuItemImportClipboard}); - this.MenuItem1.Name = "MenuItem1"; - // - // menuItemImportClipboard - // - resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); - this.menuItemImportClipboard.Name = "menuItemImportClipboard"; - this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); - // - // AddServer3Form - // - resources.ApplyResources(this, "$this"); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnClose; - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel1); - this.Controls.Add(this.menuServer); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MinimizeBox = true; - this.Name = "AddServer3Form"; - this.Load += new System.EventHandler(this.AddServer3Form_Load); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.panel2.ResumeLayout(false); - this.menuServer.ResumeLayout(false); - this.menuServer.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Button btnClose; - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.TextBox txtRemarks; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.TextBox txtId; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox txtPort; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.TextBox txtAddress; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.ComboBox cmbSecurity; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.MenuStrip menuServer; - private System.Windows.Forms.ToolStripMenuItem MenuItem1; - private System.Windows.Forms.ToolStripMenuItem menuItemImportClipboard; - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs deleted file mode 100644 index 8113a784..00000000 --- a/v2rayN/v2rayN/Forms/AddServer3Form.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class AddServer3Form : BaseServerForm - { - - public AddServer3Form() - { - InitializeComponent(); - } - - private void AddServer3Form_Load(object sender, EventArgs e) - { - if (EditIndex >= 0) - { - vmessItem = config.vmess[EditIndex]; - BindingServer(); - } - else - { - vmessItem = new VmessItem(); - ClearServer(); - } - } - - /// - /// 绑定数据 - /// - private void BindingServer() - { - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - cmbSecurity.Text = vmessItem.security; - txtRemarks.Text = vmessItem.remarks; - } - - - /// - /// 清除设置 - /// - private void ClearServer() - { - txtAddress.Text = ""; - txtPort.Text = ""; - txtId.Text = ""; - cmbSecurity.Text = Global.DefaultSecurity; - txtRemarks.Text = ""; - } - - private void btnOK_Click(object sender, EventArgs e) - { - string address = txtAddress.Text; - string port = txtPort.Text; - string id = txtId.Text; - string security = cmbSecurity.Text; - string remarks = txtRemarks.Text; - - if (Utils.IsNullOrEmpty(address)) - { - UI.Show(UIRes.I18N("FillServerAddress")); - return; - } - if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) - { - UI.Show(UIRes.I18N("FillCorrectServerPort")); - return; - } - if (Utils.IsNullOrEmpty(id)) - { - UI.Show(UIRes.I18N("FillPassword")); - return; - } - if (Utils.IsNullOrEmpty(security)) - { - UI.Show(UIRes.I18N("PleaseSelectEncryption")); - return; - } - - vmessItem.address = address; - vmessItem.port = Utils.ToInt(port); - vmessItem.id = id; - vmessItem.security = security; - vmessItem.remarks = remarks; - - if (ConfigHandler.AddShadowsocksServer(ref config, vmessItem, EditIndex) == 0) - { - this.DialogResult = DialogResult.OK; - } - else - { - UI.ShowWarning(UIRes.I18N("OperationFailed")); - } - } - private void btnClose_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.Cancel; - } - - - #region 导入配置 - - /// - /// 从剪贴板导入URL - /// - /// - /// - private void menuItemImportClipboard_Click(object sender, EventArgs e) - { - ImportConfig(); - } - - private void ImportConfig() - { - ClearServer(); - - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); - if (vmessItem == null) - { - UI.ShowWarning(msg); - return; - } - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - cmbSecurity.Text = vmessItem.security; - txtId.Text = vmessItem.id; - txtRemarks.Text = vmessItem.remarks; - } - - #endregion - - - } -} diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx deleted file mode 100644 index 272c310f..00000000 --- a/v2rayN/v2rayN/Forms/AddServer3Form.resx +++ /dev/null @@ -1,606 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 113, 12 - - - 53, 12 - - - label6 - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 547, 25 - - - - 11 - - - $this - - - groupBox1 - - - 8 - - - - Bottom - - - Import configuration file - - - groupBox1 - - - panel1 - - - 3 - - - Password - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuItemImportClipboard - - - Fill - - - groupBox1 - - - 8 - - - 89, 12 - - - 127, 27 - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - aes-256-cfb - - - 6 - - - 5 - - - 303, 17 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - MenuItem1 - - - 0 - - - 359, 21 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 396, 17 - - - 8 - - - 0, 0 - - - label1 - - - 547, 60 - - - 0, 25 - - - Encryption - - - groupBox1 - - - True - - - 22 - - - 162, 21 - - - 127, 123 - - - 127, 91 - - - groupBox1 - - - panel2 - - - 5 - - - 2 - - - Alias (remarks) - - - groupBox1 - - - True - - - label5 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 12, 31 - - - groupBox1 - - - 1 - - - AddServer3Form - - - 194, 21 - - - groupBox1 - - - 127, 59 - - - 0 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 71, 12 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 12, 124 - - - 2 - - - 10 - - - txtPort - - - aes-128-cfb - - - 547, 10 - - - 0, 35 - - - 5 - - - 235, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Edit or add a [Shadowsocks] server - - - &OK - - - chacha20 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnClose - - - panel2 - - - 0 - - - 3 - - - 12, 93 - - - 194, 20 - - - 10 - - - chacha20-ietf - - - True - - - panel2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 194, 21 - - - 1 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6 - - - 1 - - - 7 - - - label13 - - - aes-256-gcm - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - label3 - - - Server port - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 231 - - - 9 - - - aes-128-gcm - - - 4 - - - &Cancel - - - True - - - 6, 12 - - - True - - - Server address - - - menuServer - - - txtAddress - - - 127, 154 - - - chacha20-poly1305 - - - 95, 12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - * Fill in manually - - - 7 - - - label2 - - - 12, 62 - - - 547, 291 - - - chacha20-ietf-poly1305 - - - btnOK - - - cmbSecurity - - - $this - - - 547, 196 - - - 3 - - - 75, 23 - - - 6 - - - 337, 158 - - - 65, 12 - - - 4 - - - 2 - - - 1 - - - * - - - 75, 23 - - - Import URL from clipboard - - - groupBox1 - - - Server - - - txtRemarks - - - 12, 155 - - - True - - - 278, 21 - - - Top - - - 3 - - - True - - - 17, 17 - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs deleted file mode 100644 index bdcd694a..00000000 --- a/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs +++ /dev/null @@ -1,220 +0,0 @@ -namespace v2rayN.Forms -{ - partial class AddServer4Form - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer4Form)); - this.btnClose = new System.Windows.Forms.Button(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.txtSecurity = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.txtId = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.label13 = new System.Windows.Forms.Label(); - this.txtRemarks = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.txtPort = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.txtAddress = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.panel2 = new System.Windows.Forms.Panel(); - this.btnOK = new System.Windows.Forms.Button(); - this.panel1 = new System.Windows.Forms.Panel(); - this.menuServer = new System.Windows.Forms.MenuStrip(); - this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.menuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBox1.SuspendLayout(); - this.panel2.SuspendLayout(); - this.menuServer.SuspendLayout(); - this.SuspendLayout(); - // - // btnClose - // - resources.ApplyResources(this.btnClose, "btnClose"); - this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnClose.Name = "btnClose"; - this.btnClose.UseVisualStyleBackColor = true; - this.btnClose.Click += new System.EventHandler(this.btnClose_Click); - // - // groupBox1 - // - resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Controls.Add(this.txtSecurity); - this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Controls.Add(this.txtId); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.label13); - this.groupBox1.Controls.Add(this.txtRemarks); - this.groupBox1.Controls.Add(this.label6); - this.groupBox1.Controls.Add(this.txtPort); - this.groupBox1.Controls.Add(this.label2); - this.groupBox1.Controls.Add(this.txtAddress); - this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.TabStop = false; - // - // txtSecurity - // - resources.ApplyResources(this.txtSecurity, "txtSecurity"); - this.txtSecurity.Name = "txtSecurity"; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // - // txtId - // - resources.ApplyResources(this.txtId, "txtId"); - this.txtId.Name = "txtId"; - // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // label13 - // - resources.ApplyResources(this.label13, "label13"); - this.label13.Name = "label13"; - // - // txtRemarks - // - resources.ApplyResources(this.txtRemarks, "txtRemarks"); - this.txtRemarks.Name = "txtRemarks"; - // - // label6 - // - resources.ApplyResources(this.label6, "label6"); - this.label6.Name = "label6"; - // - // txtPort - // - resources.ApplyResources(this.txtPort, "txtPort"); - this.txtPort.Name = "txtPort"; - // - // label2 - // - resources.ApplyResources(this.label2, "label2"); - this.label2.Name = "label2"; - // - // txtAddress - // - resources.ApplyResources(this.txtAddress, "txtAddress"); - this.txtAddress.Name = "txtAddress"; - // - // label1 - // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; - // - // panel2 - // - resources.ApplyResources(this.panel2, "panel2"); - this.panel2.Controls.Add(this.btnClose); - this.panel2.Controls.Add(this.btnOK); - this.panel2.Name = "panel2"; - // - // btnOK - // - resources.ApplyResources(this.btnOK, "btnOK"); - this.btnOK.Name = "btnOK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // panel1 - // - resources.ApplyResources(this.panel1, "panel1"); - this.panel1.Name = "panel1"; - // - // menuServer - // - resources.ApplyResources(this.menuServer, "menuServer"); - this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItem1}); - this.menuServer.Name = "menuServer"; - // - // MenuItem1 - // - resources.ApplyResources(this.MenuItem1, "MenuItem1"); - this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuItemImportClipboard}); - this.MenuItem1.Name = "MenuItem1"; - // - // menuItemImportClipboard - // - resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); - this.menuItemImportClipboard.Name = "menuItemImportClipboard"; - this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); - // - // AddServer4Form - // - resources.ApplyResources(this, "$this"); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnClose; - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel1); - this.Controls.Add(this.menuServer); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MinimizeBox = true; - this.Name = "AddServer4Form"; - this.Load += new System.EventHandler(this.AddServer4Form_Load); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.panel2.ResumeLayout(false); - this.menuServer.ResumeLayout(false); - this.menuServer.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Button btnClose; - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.TextBox txtRemarks; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.TextBox txtPort; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.TextBox txtAddress; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.MenuStrip menuServer; - private System.Windows.Forms.ToolStripMenuItem MenuItem1; - private System.Windows.Forms.ToolStripMenuItem menuItemImportClipboard; - private System.Windows.Forms.TextBox txtId; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox txtSecurity; - private System.Windows.Forms.Label label4; - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.cs b/v2rayN/v2rayN/Forms/AddServer4Form.cs deleted file mode 100644 index 23ec6aaa..00000000 --- a/v2rayN/v2rayN/Forms/AddServer4Form.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class AddServer4Form : BaseServerForm - { - - public AddServer4Form() - { - InitializeComponent(); - } - - private void AddServer4Form_Load(object sender, EventArgs e) - { - if (EditIndex >= 0) - { - vmessItem = config.vmess[EditIndex]; - BindingServer(); - } - else - { - vmessItem = new VmessItem(); - ClearServer(); - } - } - - /// - /// 绑定数据 - /// - private void BindingServer() - { - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtSecurity.Text = vmessItem.security; - txtRemarks.Text = vmessItem.remarks; - } - - - /// - /// 清除设置 - /// - private void ClearServer() - { - txtAddress.Text = ""; - txtPort.Text = ""; - txtId.Text = ""; - txtSecurity.Text = ""; - txtRemarks.Text = ""; - } - - private void btnOK_Click(object sender, EventArgs e) - { - string address = txtAddress.Text; - string port = txtPort.Text; - string id = txtId.Text; - string security = txtSecurity.Text; - string remarks = txtRemarks.Text; - - if (Utils.IsNullOrEmpty(address)) - { - UI.Show(UIRes.I18N("FillServerAddress")); - return; - } - if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) - { - UI.Show(UIRes.I18N("FillCorrectServerPort")); - return; - } - - vmessItem.address = address; - vmessItem.port = Utils.ToInt(port); - vmessItem.id = id; - vmessItem.security = security; - vmessItem.remarks = remarks; - - if (ConfigHandler.AddSocksServer(ref config, vmessItem, EditIndex) == 0) - { - this.DialogResult = DialogResult.OK; - } - else - { - UI.ShowWarning(UIRes.I18N("OperationFailed")); - } - } - private void btnClose_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.Cancel; - } - - - #region 导入配置 - - /// - /// 从剪贴板导入URL - /// - /// - /// - private void menuItemImportClipboard_Click(object sender, EventArgs e) - { - ImportConfig(); - } - - private void ImportConfig() - { - ClearServer(); - - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); - if (vmessItem == null) - { - UI.ShowWarning(msg); - return; - } - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtSecurity.Text = vmessItem.security; - txtId.Text = vmessItem.id; - txtRemarks.Text = vmessItem.remarks; - } - - #endregion - - - } -} diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs deleted file mode 100644 index 423b7386..00000000 --- a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs +++ /dev/null @@ -1,513 +0,0 @@ -namespace v2rayN.Forms -{ - partial class AddServer5Form - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer5Form)); - this.btnClose = new System.Windows.Forms.Button(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.cmbFlow = new System.Windows.Forms.ComboBox(); - this.label4 = new System.Windows.Forms.Label(); - this.btnGUID = new System.Windows.Forms.Button(); - this.label13 = new System.Windows.Forms.Label(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.label24 = new System.Windows.Forms.Label(); - this.label23 = new System.Windows.Forms.Label(); - this.panTlsMore = new System.Windows.Forms.Panel(); - this.label21 = new System.Windows.Forms.Label(); - this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); - this.label9 = new System.Windows.Forms.Label(); - this.label20 = new System.Windows.Forms.Label(); - this.txtPath = new System.Windows.Forms.TextBox(); - this.cmbNetwork = new System.Windows.Forms.ComboBox(); - this.label7 = new System.Windows.Forms.Label(); - this.label19 = new System.Windows.Forms.Label(); - this.label18 = new System.Windows.Forms.Label(); - this.label17 = new System.Windows.Forms.Label(); - this.label16 = new System.Windows.Forms.Label(); - this.label14 = new System.Windows.Forms.Label(); - this.label15 = new System.Windows.Forms.Label(); - this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); - this.label12 = new System.Windows.Forms.Label(); - this.txtRequestHost = new System.Windows.Forms.TextBox(); - this.label11 = new System.Windows.Forms.Label(); - this.label10 = new System.Windows.Forms.Label(); - this.cmbHeaderType = new System.Windows.Forms.ComboBox(); - this.label8 = new System.Windows.Forms.Label(); - this.cmbSecurity = new System.Windows.Forms.ComboBox(); - this.txtRemarks = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.txtId = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.txtPort = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.txtAddress = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.panel2 = new System.Windows.Forms.Panel(); - this.btnOK = new System.Windows.Forms.Button(); - this.panel1 = new System.Windows.Forms.Panel(); - this.menuServer = new System.Windows.Forms.MenuStrip(); - this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.MenuItemImportClient = new System.Windows.Forms.ToolStripMenuItem(); - this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); - this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.panTlsMore.SuspendLayout(); - this.panel2.SuspendLayout(); - this.menuServer.SuspendLayout(); - this.SuspendLayout(); - // - // btnClose - // - this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; - resources.ApplyResources(this.btnClose, "btnClose"); - this.btnClose.Name = "btnClose"; - this.btnClose.UseVisualStyleBackColor = true; - this.btnClose.Click += new System.EventHandler(this.btnClose_Click); - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.cmbFlow); - this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Controls.Add(this.btnGUID); - this.groupBox1.Controls.Add(this.label13); - this.groupBox1.Controls.Add(this.groupBox2); - this.groupBox1.Controls.Add(this.label8); - this.groupBox1.Controls.Add(this.cmbSecurity); - this.groupBox1.Controls.Add(this.txtRemarks); - this.groupBox1.Controls.Add(this.label6); - this.groupBox1.Controls.Add(this.label5); - this.groupBox1.Controls.Add(this.txtId); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.txtPort); - this.groupBox1.Controls.Add(this.label2); - this.groupBox1.Controls.Add(this.txtAddress); - this.groupBox1.Controls.Add(this.label1); - resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.TabStop = false; - // - // cmbFlow - // - this.cmbFlow.FormattingEnabled = true; - this.cmbFlow.Items.AddRange(new object[] { - resources.GetString("cmbFlow.Items"), - resources.GetString("cmbFlow.Items1"), - resources.GetString("cmbFlow.Items2"), - resources.GetString("cmbFlow.Items3"), - resources.GetString("cmbFlow.Items4")}); - resources.ApplyResources(this.cmbFlow, "cmbFlow"); - this.cmbFlow.Name = "cmbFlow"; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // - // btnGUID - // - resources.ApplyResources(this.btnGUID, "btnGUID"); - this.btnGUID.Name = "btnGUID"; - this.btnGUID.UseVisualStyleBackColor = true; - this.btnGUID.Click += new System.EventHandler(this.btnGUID_Click); - // - // label13 - // - resources.ApplyResources(this.label13, "label13"); - this.label13.Name = "label13"; - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.label24); - this.groupBox2.Controls.Add(this.label23); - this.groupBox2.Controls.Add(this.panTlsMore); - this.groupBox2.Controls.Add(this.label9); - this.groupBox2.Controls.Add(this.label20); - this.groupBox2.Controls.Add(this.txtPath); - this.groupBox2.Controls.Add(this.cmbNetwork); - this.groupBox2.Controls.Add(this.label7); - this.groupBox2.Controls.Add(this.label19); - this.groupBox2.Controls.Add(this.label18); - this.groupBox2.Controls.Add(this.label17); - this.groupBox2.Controls.Add(this.label16); - this.groupBox2.Controls.Add(this.label14); - this.groupBox2.Controls.Add(this.label15); - this.groupBox2.Controls.Add(this.cmbStreamSecurity); - this.groupBox2.Controls.Add(this.label12); - this.groupBox2.Controls.Add(this.txtRequestHost); - this.groupBox2.Controls.Add(this.label11); - this.groupBox2.Controls.Add(this.label10); - this.groupBox2.Controls.Add(this.cmbHeaderType); - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; - // - // label24 - // - resources.ApplyResources(this.label24, "label24"); - this.label24.Name = "label24"; - // - // label23 - // - resources.ApplyResources(this.label23, "label23"); - this.label23.Name = "label23"; - // - // panTlsMore - // - this.panTlsMore.Controls.Add(this.label21); - this.panTlsMore.Controls.Add(this.cmbAllowInsecure); - resources.ApplyResources(this.panTlsMore, "panTlsMore"); - this.panTlsMore.Name = "panTlsMore"; - // - // label21 - // - resources.ApplyResources(this.label21, "label21"); - this.label21.Name = "label21"; - // - // cmbAllowInsecure - // - this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbAllowInsecure.FormattingEnabled = true; - this.cmbAllowInsecure.Items.AddRange(new object[] { - resources.GetString("cmbAllowInsecure.Items"), - resources.GetString("cmbAllowInsecure.Items1"), - resources.GetString("cmbAllowInsecure.Items2")}); - resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); - this.cmbAllowInsecure.Name = "cmbAllowInsecure"; - // - // label9 - // - resources.ApplyResources(this.label9, "label9"); - this.label9.Name = "label9"; - // - // label20 - // - resources.ApplyResources(this.label20, "label20"); - this.label20.Name = "label20"; - // - // txtPath - // - resources.ApplyResources(this.txtPath, "txtPath"); - this.txtPath.Name = "txtPath"; - // - // cmbNetwork - // - this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbNetwork.FormattingEnabled = true; - this.cmbNetwork.Items.AddRange(new object[] { - resources.GetString("cmbNetwork.Items"), - resources.GetString("cmbNetwork.Items1"), - resources.GetString("cmbNetwork.Items2"), - resources.GetString("cmbNetwork.Items3"), - resources.GetString("cmbNetwork.Items4")}); - resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); - this.cmbNetwork.Name = "cmbNetwork"; - this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); - // - // label7 - // - resources.ApplyResources(this.label7, "label7"); - this.label7.Name = "label7"; - // - // label19 - // - resources.ApplyResources(this.label19, "label19"); - this.label19.Name = "label19"; - // - // label18 - // - resources.ApplyResources(this.label18, "label18"); - this.label18.Name = "label18"; - // - // label17 - // - resources.ApplyResources(this.label17, "label17"); - this.label17.Name = "label17"; - // - // label16 - // - resources.ApplyResources(this.label16, "label16"); - this.label16.Name = "label16"; - // - // label14 - // - resources.ApplyResources(this.label14, "label14"); - this.label14.Name = "label14"; - // - // label15 - // - resources.ApplyResources(this.label15, "label15"); - this.label15.Name = "label15"; - // - // cmbStreamSecurity - // - this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbStreamSecurity.FormattingEnabled = true; - this.cmbStreamSecurity.Items.AddRange(new object[] { - resources.GetString("cmbStreamSecurity.Items"), - resources.GetString("cmbStreamSecurity.Items1"), - resources.GetString("cmbStreamSecurity.Items2")}); - resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); - this.cmbStreamSecurity.Name = "cmbStreamSecurity"; - this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); - // - // label12 - // - resources.ApplyResources(this.label12, "label12"); - this.label12.Name = "label12"; - // - // txtRequestHost - // - resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); - this.txtRequestHost.Name = "txtRequestHost"; - // - // label11 - // - resources.ApplyResources(this.label11, "label11"); - this.label11.Name = "label11"; - // - // label10 - // - resources.ApplyResources(this.label10, "label10"); - this.label10.Name = "label10"; - // - // cmbHeaderType - // - this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbHeaderType.FormattingEnabled = true; - this.cmbHeaderType.Items.AddRange(new object[] { - resources.GetString("cmbHeaderType.Items"), - resources.GetString("cmbHeaderType.Items1"), - resources.GetString("cmbHeaderType.Items2"), - resources.GetString("cmbHeaderType.Items3"), - resources.GetString("cmbHeaderType.Items4"), - resources.GetString("cmbHeaderType.Items5"), - resources.GetString("cmbHeaderType.Items6")}); - resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); - this.cmbHeaderType.Name = "cmbHeaderType"; - // - // label8 - // - resources.ApplyResources(this.label8, "label8"); - this.label8.Name = "label8"; - // - // cmbSecurity - // - this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.Simple; - this.cmbSecurity.FormattingEnabled = true; - this.cmbSecurity.Items.AddRange(new object[] { - resources.GetString("cmbSecurity.Items")}); - resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); - this.cmbSecurity.Name = "cmbSecurity"; - // - // txtRemarks - // - resources.ApplyResources(this.txtRemarks, "txtRemarks"); - this.txtRemarks.Name = "txtRemarks"; - // - // label6 - // - resources.ApplyResources(this.label6, "label6"); - this.label6.Name = "label6"; - // - // label5 - // - resources.ApplyResources(this.label5, "label5"); - this.label5.Name = "label5"; - // - // txtId - // - resources.ApplyResources(this.txtId, "txtId"); - this.txtId.Name = "txtId"; - // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // txtPort - // - resources.ApplyResources(this.txtPort, "txtPort"); - this.txtPort.Name = "txtPort"; - // - // label2 - // - resources.ApplyResources(this.label2, "label2"); - this.label2.Name = "label2"; - // - // txtAddress - // - resources.ApplyResources(this.txtAddress, "txtAddress"); - this.txtAddress.Name = "txtAddress"; - // - // label1 - // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; - // - // panel2 - // - this.panel2.Controls.Add(this.btnClose); - this.panel2.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel2, "panel2"); - this.panel2.Name = "panel2"; - // - // btnOK - // - resources.ApplyResources(this.btnOK, "btnOK"); - this.btnOK.Name = "btnOK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // panel1 - // - resources.ApplyResources(this.panel1, "panel1"); - this.panel1.Name = "panel1"; - // - // menuServer - // - this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItem1}); - resources.ApplyResources(this.menuServer, "menuServer"); - this.menuServer.Name = "menuServer"; - // - // MenuItem1 - // - this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItemImportClient, - this.MenuItemImportServer, - this.toolStripSeparator1, - this.MenuItemImportClipboard}); - this.MenuItem1.Name = "MenuItem1"; - resources.ApplyResources(this.MenuItem1, "MenuItem1"); - // - // MenuItemImportClient - // - this.MenuItemImportClient.Name = "MenuItemImportClient"; - resources.ApplyResources(this.MenuItemImportClient, "MenuItemImportClient"); - this.MenuItemImportClient.Click += new System.EventHandler(this.MenuItemImportClient_Click); - // - // MenuItemImportServer - // - this.MenuItemImportServer.Name = "MenuItemImportServer"; - resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); - this.MenuItemImportServer.Click += new System.EventHandler(this.MenuItemImportServer_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); - // - // MenuItemImportClipboard - // - this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; - resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); - this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); - // - // AddServer5Form - // - resources.ApplyResources(this, "$this"); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnClose; - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel1); - this.Controls.Add(this.menuServer); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Name = "AddServer5Form"; - this.Load += new System.EventHandler(this.AddServer5Form_Load); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.panTlsMore.ResumeLayout(false); - this.panTlsMore.PerformLayout(); - this.panel2.ResumeLayout(false); - this.menuServer.ResumeLayout(false); - this.menuServer.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.Button btnClose; - private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.TextBox txtRemarks; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.TextBox txtId; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox txtPort; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.TextBox txtAddress; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.ComboBox cmbSecurity; - private System.Windows.Forms.ComboBox cmbNetwork; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.Label label9; - private System.Windows.Forms.Label label8; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.TextBox txtRequestHost; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.Label label11; - private System.Windows.Forms.ComboBox cmbHeaderType; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.MenuStrip menuServer; - private System.Windows.Forms.ToolStripMenuItem MenuItem1; - private System.Windows.Forms.ToolStripMenuItem MenuItemImportClient; - private System.Windows.Forms.ToolStripMenuItem MenuItemImportServer; - private System.Windows.Forms.Label label15; - private System.Windows.Forms.ComboBox cmbStreamSecurity; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem MenuItemImportClipboard; - private System.Windows.Forms.Button btnGUID; - private System.Windows.Forms.Label label16; - private System.Windows.Forms.Label label14; - private System.Windows.Forms.Label label17; - private System.Windows.Forms.Label label18; - private System.Windows.Forms.Label label19; - private System.Windows.Forms.TextBox txtPath; - private System.Windows.Forms.Label label20; - private System.Windows.Forms.Label label21; - private System.Windows.Forms.ComboBox cmbAllowInsecure; - private System.Windows.Forms.Panel panTlsMore; - private System.Windows.Forms.Label label24; - private System.Windows.Forms.Label label23; - private System.Windows.Forms.ComboBox cmbFlow; - private System.Windows.Forms.Label label4; - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs deleted file mode 100644 index d426e5c6..00000000 --- a/v2rayN/v2rayN/Forms/AddServer5Form.cs +++ /dev/null @@ -1,286 +0,0 @@ -using System; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class AddServer5Form : BaseServerForm - { - - public AddServer5Form() - { - InitializeComponent(); - } - - private void AddServer5Form_Load(object sender, EventArgs e) - { - if (EditIndex >= 0) - { - vmessItem = config.vmess[EditIndex]; - BindingServer(); - } - else - { - vmessItem = new VmessItem(); - ClearServer(); - } - } - - /// - /// 绑定数据 - /// - private void BindingServer() - { - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - cmbFlow.Text = vmessItem.flow; - cmbSecurity.Text = vmessItem.security; - cmbNetwork.Text = vmessItem.network; - txtRemarks.Text = vmessItem.remarks; - - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; - cmbAllowInsecure.Text = vmessItem.allowInsecure; - } - - - /// - /// 清除设置 - /// - private void ClearServer() - { - txtAddress.Text = ""; - txtPort.Text = ""; - txtId.Text = ""; - cmbFlow.Text = ""; - cmbSecurity.Text = Global.None; - cmbNetwork.Text = Global.DefaultNetwork; - txtRemarks.Text = ""; - - cmbHeaderType.Text = Global.None; - txtRequestHost.Text = ""; - cmbStreamSecurity.Text = ""; - cmbAllowInsecure.Text = ""; - txtPath.Text = ""; - } - - - private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) - { - SetHeaderType(); - } - - /// - /// 设置伪装选项 - /// - private void SetHeaderType() - { - cmbHeaderType.Items.Clear(); - - string network = cmbNetwork.Text; - if (Utils.IsNullOrEmpty(network)) - { - cmbHeaderType.Items.Add(Global.None); - return; - } - - cmbHeaderType.Items.Add(Global.None); - if (network.Equals(Global.DefaultNetwork)) - { - cmbHeaderType.Items.Add(Global.TcpHeaderHttp); - } - else if (network.Equals("kcp") || network.Equals("quic")) - { - cmbHeaderType.Items.Add("srtp"); - cmbHeaderType.Items.Add("utp"); - cmbHeaderType.Items.Add("wechat-video"); - cmbHeaderType.Items.Add("dtls"); - cmbHeaderType.Items.Add("wireguard"); - } - else - { - } - cmbHeaderType.Text = Global.None; - } - - private void btnOK_Click(object sender, EventArgs e) - { - string address = txtAddress.Text; - string port = txtPort.Text; - string id = txtId.Text; - string flow = cmbFlow.Text; - string security = cmbSecurity.Text; - string network = cmbNetwork.Text; - string remarks = txtRemarks.Text; - - string headerType = cmbHeaderType.Text; - string requestHost = txtRequestHost.Text; - string path = txtPath.Text; - string streamSecurity = cmbStreamSecurity.Text; - string allowInsecure = cmbAllowInsecure.Text; - - if (Utils.IsNullOrEmpty(address)) - { - UI.Show(UIRes.I18N("FillServerAddress")); - return; - } - if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) - { - UI.Show(UIRes.I18N("FillCorrectServerPort")); - return; - } - if (Utils.IsNullOrEmpty(id)) - { - UI.Show(UIRes.I18N("FillUUID")); - return; - } - - - vmessItem.address = address; - vmessItem.port = Utils.ToInt(port); - vmessItem.id = id; - vmessItem.flow = flow; - vmessItem.security = security; - vmessItem.network = network; - vmessItem.remarks = remarks; - - vmessItem.headerType = headerType; - vmessItem.requestHost = requestHost.Replace(" ", ""); - vmessItem.path = path.Replace(" ", ""); - vmessItem.streamSecurity = streamSecurity; - vmessItem.allowInsecure = allowInsecure; - - if (ConfigHandler.AddVlessServer(ref config, vmessItem, EditIndex) == 0) - { - this.DialogResult = DialogResult.OK; - } - else - { - UI.ShowWarning(UIRes.I18N("OperationFailed")); - } - } - - private void btnGUID_Click(object sender, EventArgs e) - { - txtId.Text = Utils.GetGUID(); - } - - private void btnClose_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.Cancel; - } - - private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) - { - string security = cmbStreamSecurity.Text; - if (Utils.IsNullOrEmpty(security)) - { - panTlsMore.Hide(); - } - else - { - panTlsMore.Show(); - } - } - - #region 导入客户端/服务端配置 - - /// - /// 导入客户端 - /// - /// - /// - private void MenuItemImportClient_Click(object sender, EventArgs e) - { - MenuItemImport(1); - } - - /// - /// 导入服务端 - /// - /// - /// - private void MenuItemImportServer_Click(object sender, EventArgs e) - { - MenuItemImport(2); - } - - private void MenuItemImport(int type) - { - ClearServer(); - - OpenFileDialog fileDialog = new OpenFileDialog - { - Multiselect = false, - Filter = "Config|*.json|All|*.*" - }; - if (fileDialog.ShowDialog() != DialogResult.OK) - { - return; - } - string fileName = fileDialog.FileName; - if (Utils.IsNullOrEmpty(fileName)) - { - return; - } - string msg; - VmessItem vmessItem; - if (type.Equals(1)) - { - vmessItem = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg); - } - else - { - vmessItem = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg); - } - if (vmessItem == null) - { - UI.ShowWarning(msg); - return; - } - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtRemarks.Text = vmessItem.remarks; - cmbNetwork.Text = vmessItem.network; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; - } - - /// - /// 从剪贴板导入URL - /// - /// - /// - private void MenuItemImportClipboard_Click(object sender, EventArgs e) - { - ClearServer(); - - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); - if (vmessItem == null) - { - UI.ShowWarning(msg); - return; - } - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtRemarks.Text = vmessItem.remarks; - cmbNetwork.Text = vmessItem.network; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; - } - #endregion - - } -} diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.resx b/v2rayN/v2rayN/Forms/AddServer5Form.resx deleted file mode 100644 index e4c57a41..00000000 --- a/v2rayN/v2rayN/Forms/AddServer5Form.resx +++ /dev/null @@ -1,1386 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 396, 17 - - - 75, 23 - - - - 4 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - - - - xtls-rprx-origin - - - xtls-rprx-origin-udp443 - - - xtls-rprx-direct - - - xtls-rprx-direct-udp443 - - - 127, 123 - - - 211, 20 - - - 24 - - - cmbFlow - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - True - - - - NoControl - - - 12, 127 - - - 29, 12 - - - 25 - - - Flow - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - 411, 91 - - - 75, 23 - - - 23 - - - &Generate - - - btnGUID - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - True - - - 353, 189 - - - 113, 12 - - - 22 - - - * Fill in manually - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - True - - - NoControl - - - 529, 207 - - - 119, 12 - - - 35 - - - 3)QUIC key/Kcp seed - - - label24 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - True - - - NoControl - - - 465, 140 - - - 89, 12 - - - 34 - - - 4)QUIC securty - - - label23 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - True - - - NoControl - - - 12, 11 - - - 83, 12 - - - 31 - - - allowInsecure - - - label21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 0 - - - - - - true - - - false - - - 107, 7 - - - 91, 20 - - - 30 - - - cmbAllowInsecure - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 1 - - - 284, 232 - - - 338, 35 - - - 33 - - - panTlsMore - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - True - - - 353, 32 - - - 113, 12 - - - 15 - - - *Default value tcp - - - label9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 3 - - - True - - - 464, 124 - - - 203, 12 - - - 29 - - - 3)h2 host Separated by commas (,) - - - label20 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 4 - - - 127, 169 - - - True - - - 396, 54 - - - 28 - - - txtPath - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 5 - - - tcp - - - kcp - - - ws - - - h2 - - - quic - - - 192, 28 - - - 143, 20 - - - 12 - - - cmbNetwork - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 6 - - - True - - - 9, 32 - - - 167, 12 - - - 13 - - - Transport protocol(network) - - - label7 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 7 - - - True - - - 9, 169 - - - 29, 12 - - - 27 - - - Path - - - label19 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 8 - - - True - - - 529, 189 - - - 59, 12 - - - 26 - - - 2)h2 path - - - label18 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 9 - - - True - - - 464, 109 - - - 59, 12 - - - 25 - - - 2)ws host - - - label17 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 10 - - - True - - - 529, 172 - - - 59, 12 - - - 24 - - - 1)ws path - - - label16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 11 - - - True - - - 464, 94 - - - 215, 12 - - - 23 - - - 1)http host Separated by commas (,) - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 12 - - - True - - - 9, 243 - - - 23, 12 - - - 22 - - - TLS - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 13 - - - - - - tls - - - xtls - - - 127, 239 - - - 143, 20 - - - 21 - - - cmbStreamSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 14 - - - True - - - 282, 68 - - - 299, 12 - - - 20 - - - *tcp or kcp or QUIC camouflage type, default none - - - label12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 15 - - - 158, 100 - - - True - - - 300, 53 - - - 16 - - - txtRequestHost - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 16 - - - True - - - 9, 68 - - - 95, 12 - - - 19 - - - Camouflage type - - - label11 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 17 - - - True - - - 9, 100 - - - 143, 12 - - - 17 - - - Camouflage domain(host) - - - label10 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 18 - - - none - - - http - - - srtp - - - utp - - - wechat-video - - - dtls - - - wireguard - - - 127, 64 - - - 143, 20 - - - 18 - - - cmbHeaderType - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 19 - - - Bottom - - - 3, 215 - - - 723, 281 - - - 21 - - - Transport - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - True - - - NoControl - - - 353, 157 - - - 119, 12 - - - 14 - - - *Recommended (none) - - - label8 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - none - - - 127, 154 - - - 211, 20 - - - 6 - - - cmbSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - 127, 185 - - - 211, 21 - - - 11 - - - txtRemarks - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - True - - - 12, 189 - - - 95, 12 - - - 10 - - - Alias (remarks) - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - - - True - - - 12, 158 - - - 65, 12 - - - 8 - - - Encryption - - - label5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - 127, 91 - - - 278, 21 - - - 5 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 10 - - - True - - - 12, 95 - - - 53, 12 - - - 4 - - - UUID(id) - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 11 - - - 127, 59 - - - 143, 21 - - - 3 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 12 - - - True - - - 12, 63 - - - 29, 12 - - - 2 - - - Port - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 13 - - - 127, 27 - - - 359, 21 - - - 1 - - - txtAddress - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 14 - - - True - - - 12, 31 - - - 47, 12 - - - 0 - - - Address - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 15 - - - Fill - - - 0, 35 - - - 729, 499 - - - 3 - - - Server - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - 303, 17 - - - 75, 23 - - - 5 - - - &OK - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Bottom - - - 0, 534 - - - 729, 60 - - - 7 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - Top - - - 0, 25 - - - 729, 10 - - - 6 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - 17, 17 - - - 237, 22 - - - Import client configuration - - - 237, 22 - - - Import server configuration - - - 234, 6 - - - 237, 22 - - - Import URL from clipboard - - - 162, 21 - - - Import configuration file - - - 0, 0 - - - 729, 25 - - - 8 - - - menuServer - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - True - - - 25 - - - 6, 12 - - - 729, 594 - - - Edit or add a [VLESS] server - - - MenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MenuItemImportClient - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MenuItemImportServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator1 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MenuItemImportClipboard - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - AddServer5Form - - - v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.cs b/v2rayN/v2rayN/Forms/AddServer6Form.cs deleted file mode 100644 index 6911714f..00000000 --- a/v2rayN/v2rayN/Forms/AddServer6Form.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class AddServer6Form : BaseServerForm - { - public AddServer6Form() - { - InitializeComponent(); - } - - private void AddServer6Form_Load(object sender, EventArgs e) - { - if (EditIndex >= 0) - { - vmessItem = config.vmess[EditIndex]; - BindingServer(); - } - else - { - vmessItem = new VmessItem(); - ClearServer(); - } - } - - /// - /// 绑定数据 - /// - private void BindingServer() - { - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtRequestHost.Text = vmessItem.requestHost; - txtRemarks.Text = vmessItem.remarks; - } - - - /// - /// 清除设置 - /// - private void ClearServer() - { - txtAddress.Text = ""; - txtPort.Text = ""; - txtId.Text = ""; - txtRequestHost.Text = ""; - txtRemarks.Text = ""; - } - - private void btnOK_Click(object sender, EventArgs e) - { - string address = txtAddress.Text; - string port = txtPort.Text; - string id = txtId.Text; - string requestHost = txtRequestHost.Text; - string remarks = txtRemarks.Text; - - if (Utils.IsNullOrEmpty(address)) - { - UI.Show(UIRes.I18N("FillServerAddress")); - return; - } - if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) - { - UI.Show(UIRes.I18N("FillCorrectServerPort")); - return; - } - if (Utils.IsNullOrEmpty(id)) - { - UI.Show(UIRes.I18N("FillPassword")); - return; - } - - vmessItem.address = address; - vmessItem.port = Utils.ToInt(port); - vmessItem.id = id; - vmessItem.requestHost = requestHost.Replace(" ", ""); - vmessItem.remarks = remarks; - - if (ConfigHandler.AddTrojanServer(ref config, vmessItem, EditIndex) == 0) - { - this.DialogResult = DialogResult.OK; - } - else - { - UI.ShowWarning(UIRes.I18N("OperationFailed")); - } - } - private void btnClose_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.Cancel; - } - - } -} diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index a96b32ab..33aa7ade 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -31,58 +31,62 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServerForm)); this.btnClose = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.btnGUID = new System.Windows.Forms.Button(); - this.label13 = new System.Windows.Forms.Label(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.label24 = new System.Windows.Forms.Label(); - this.label23 = new System.Windows.Forms.Label(); - this.panTlsMore = new System.Windows.Forms.Panel(); - this.label21 = new System.Windows.Forms.Label(); - this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); - this.label9 = new System.Windows.Forms.Label(); - this.label20 = new System.Windows.Forms.Label(); - this.txtPath = new System.Windows.Forms.TextBox(); - this.cmbNetwork = new System.Windows.Forms.ComboBox(); - this.label7 = new System.Windows.Forms.Label(); - this.label19 = new System.Windows.Forms.Label(); - this.label18 = new System.Windows.Forms.Label(); + this.panSocks = new System.Windows.Forms.Panel(); this.label17 = new System.Windows.Forms.Label(); - this.label16 = new System.Windows.Forms.Label(); - this.label14 = new System.Windows.Forms.Label(); + this.txtSecurity4 = new System.Windows.Forms.TextBox(); + this.label18 = new System.Windows.Forms.Label(); + this.txtId4 = new System.Windows.Forms.TextBox(); + this.panSs = new System.Windows.Forms.Panel(); + this.txtId3 = new System.Windows.Forms.TextBox(); this.label15 = new System.Windows.Forms.Label(); - this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); + this.cmbSecurity3 = new System.Windows.Forms.ComboBox(); + this.label16 = new System.Windows.Forms.Label(); + this.panTrojan = new System.Windows.Forms.Panel(); this.label12 = new System.Windows.Forms.Label(); - this.txtRequestHost = new System.Windows.Forms.TextBox(); - this.label11 = new System.Windows.Forms.Label(); + this.cmbFlow6 = new System.Windows.Forms.ComboBox(); + this.txtId6 = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.panVless = new System.Windows.Forms.Panel(); + this.label7 = new System.Windows.Forms.Label(); + this.cmbFlow5 = new System.Windows.Forms.ComboBox(); + this.txtId5 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); this.label10 = new System.Windows.Forms.Label(); - this.cmbHeaderType = new System.Windows.Forms.ComboBox(); - this.label8 = new System.Windows.Forms.Label(); - this.cmbSecurity = new System.Windows.Forms.ComboBox(); - this.txtRemarks = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.txtAlterId = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.txtId = new System.Windows.Forms.TextBox(); + this.btnGUID5 = new System.Windows.Forms.Button(); + this.cmbSecurity5 = new System.Windows.Forms.ComboBox(); + this.label11 = new System.Windows.Forms.Label(); + this.panVmess = new System.Windows.Forms.Panel(); this.label3 = new System.Windows.Forms.Label(); - this.txtPort = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.txtAddress = new System.Windows.Forms.TextBox(); + this.txtId = new System.Windows.Forms.TextBox(); + this.btnGUID = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.txtAlterId = new System.Windows.Forms.TextBox(); + this.cmbSecurity = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.panAddr = new System.Windows.Forms.Panel(); + this.label6 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); - this.panel2 = new System.Windows.Forms.Panel(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.panBottom = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); - this.panel1 = new System.Windows.Forms.Panel(); - this.menuServer = new System.Windows.Forms.MenuStrip(); - this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.MenuItemImportClient = new System.Windows.Forms.ToolStripMenuItem(); - this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.panTop = new System.Windows.Forms.Panel(); + this.panTran = new System.Windows.Forms.Panel(); + this.transportControl = new v2rayN.Forms.ServerTransportControl(); + this.cmbCoreType = new System.Windows.Forms.ComboBox(); + this.labCoreType = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.panTlsMore.SuspendLayout(); - this.panel2.SuspendLayout(); - this.menuServer.SuspendLayout(); + this.panSocks.SuspendLayout(); + this.panSs.SuspendLayout(); + this.panTrojan.SuspendLayout(); + this.panVless.SuspendLayout(); + this.panVmess.SuspendLayout(); + this.panAddr.SuspendLayout(); + this.panBottom.SuspendLayout(); + this.panTran.SuspendLayout(); this.SuspendLayout(); // // btnClose @@ -95,26 +99,189 @@ // // groupBox1 // - this.groupBox1.Controls.Add(this.btnGUID); - this.groupBox1.Controls.Add(this.label13); - this.groupBox1.Controls.Add(this.groupBox2); - this.groupBox1.Controls.Add(this.label8); - this.groupBox1.Controls.Add(this.cmbSecurity); - this.groupBox1.Controls.Add(this.txtRemarks); - this.groupBox1.Controls.Add(this.label6); - this.groupBox1.Controls.Add(this.label5); - this.groupBox1.Controls.Add(this.txtAlterId); - this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Controls.Add(this.txtId); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.txtPort); - this.groupBox1.Controls.Add(this.label2); - this.groupBox1.Controls.Add(this.txtAddress); - this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.panSocks); + this.groupBox1.Controls.Add(this.panSs); + this.groupBox1.Controls.Add(this.panTrojan); + this.groupBox1.Controls.Add(this.panVless); + this.groupBox1.Controls.Add(this.panVmess); + this.groupBox1.Controls.Add(this.panAddr); resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // panSocks + // + this.panSocks.Controls.Add(this.label17); + this.panSocks.Controls.Add(this.txtSecurity4); + this.panSocks.Controls.Add(this.label18); + this.panSocks.Controls.Add(this.txtId4); + resources.ApplyResources(this.panSocks, "panSocks"); + this.panSocks.Name = "panSocks"; + // + // label17 + // + resources.ApplyResources(this.label17, "label17"); + this.label17.Name = "label17"; + // + // txtSecurity4 + // + resources.ApplyResources(this.txtSecurity4, "txtSecurity4"); + this.txtSecurity4.Name = "txtSecurity4"; + // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // txtId4 + // + resources.ApplyResources(this.txtId4, "txtId4"); + this.txtId4.Name = "txtId4"; + // + // panSs + // + this.panSs.Controls.Add(this.txtId3); + this.panSs.Controls.Add(this.label15); + this.panSs.Controls.Add(this.cmbSecurity3); + this.panSs.Controls.Add(this.label16); + resources.ApplyResources(this.panSs, "panSs"); + this.panSs.Name = "panSs"; + // + // txtId3 + // + resources.ApplyResources(this.txtId3, "txtId3"); + this.txtId3.Name = "txtId3"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // cmbSecurity3 + // + this.cmbSecurity3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbSecurity3.FormattingEnabled = true; + resources.ApplyResources(this.cmbSecurity3, "cmbSecurity3"); + this.cmbSecurity3.Name = "cmbSecurity3"; + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // panTrojan + // + this.panTrojan.Controls.Add(this.label12); + this.panTrojan.Controls.Add(this.cmbFlow6); + this.panTrojan.Controls.Add(this.txtId6); + this.panTrojan.Controls.Add(this.label14); + resources.ApplyResources(this.panTrojan, "panTrojan"); + this.panTrojan.Name = "panTrojan"; + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // cmbFlow6 + // + this.cmbFlow6.FormattingEnabled = true; + resources.ApplyResources(this.cmbFlow6, "cmbFlow6"); + this.cmbFlow6.Name = "cmbFlow6"; + // + // txtId6 + // + resources.ApplyResources(this.txtId6, "txtId6"); + this.txtId6.Name = "txtId6"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // panVless + // + this.panVless.Controls.Add(this.label7); + this.panVless.Controls.Add(this.cmbFlow5); + this.panVless.Controls.Add(this.txtId5); + this.panVless.Controls.Add(this.label9); + this.panVless.Controls.Add(this.label10); + this.panVless.Controls.Add(this.btnGUID5); + this.panVless.Controls.Add(this.cmbSecurity5); + this.panVless.Controls.Add(this.label11); + resources.ApplyResources(this.panVless, "panVless"); + this.panVless.Name = "panVless"; + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // cmbFlow5 + // + this.cmbFlow5.FormattingEnabled = true; + resources.ApplyResources(this.cmbFlow5, "cmbFlow5"); + this.cmbFlow5.Name = "cmbFlow5"; + // + // txtId5 + // + resources.ApplyResources(this.txtId5, "txtId5"); + this.txtId5.Name = "txtId5"; + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // btnGUID5 + // + resources.ApplyResources(this.btnGUID5, "btnGUID5"); + this.btnGUID5.Name = "btnGUID5"; + this.btnGUID5.UseVisualStyleBackColor = true; + this.btnGUID5.Click += new System.EventHandler(this.btnGUID_Click); + // + // cmbSecurity5 + // + this.cmbSecurity5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.Simple; + this.cmbSecurity5.FormattingEnabled = true; + this.cmbSecurity5.Items.AddRange(new object[] { + resources.GetString("cmbSecurity5.Items")}); + resources.ApplyResources(this.cmbSecurity5, "cmbSecurity5"); + this.cmbSecurity5.Name = "cmbSecurity5"; + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // panVmess + // + this.panVmess.Controls.Add(this.label3); + this.panVmess.Controls.Add(this.txtId); + this.panVmess.Controls.Add(this.btnGUID); + this.panVmess.Controls.Add(this.label4); + this.panVmess.Controls.Add(this.label8); + this.panVmess.Controls.Add(this.txtAlterId); + this.panVmess.Controls.Add(this.cmbSecurity); + this.panVmess.Controls.Add(this.label5); + resources.ApplyResources(this.panVmess, "panVmess"); + this.panVmess.Name = "panVmess"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtId + // + resources.ApplyResources(this.txtId, "txtId"); + this.txtId.Name = "txtId"; + // // btnGUID // resources.ApplyResources(this.btnGUID, "btnGUID"); @@ -122,258 +289,82 @@ this.btnGUID.UseVisualStyleBackColor = true; this.btnGUID.Click += new System.EventHandler(this.btnGUID_Click); // - // label13 + // label4 // - resources.ApplyResources(this.label13, "label13"); - this.label13.Name = "label13"; - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.label24); - this.groupBox2.Controls.Add(this.label23); - this.groupBox2.Controls.Add(this.panTlsMore); - this.groupBox2.Controls.Add(this.label9); - this.groupBox2.Controls.Add(this.label20); - this.groupBox2.Controls.Add(this.txtPath); - this.groupBox2.Controls.Add(this.cmbNetwork); - this.groupBox2.Controls.Add(this.label7); - this.groupBox2.Controls.Add(this.label19); - this.groupBox2.Controls.Add(this.label18); - this.groupBox2.Controls.Add(this.label17); - this.groupBox2.Controls.Add(this.label16); - this.groupBox2.Controls.Add(this.label14); - this.groupBox2.Controls.Add(this.label15); - this.groupBox2.Controls.Add(this.cmbStreamSecurity); - this.groupBox2.Controls.Add(this.label12); - this.groupBox2.Controls.Add(this.txtRequestHost); - this.groupBox2.Controls.Add(this.label11); - this.groupBox2.Controls.Add(this.label10); - this.groupBox2.Controls.Add(this.cmbHeaderType); - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; - // - // label24 - // - resources.ApplyResources(this.label24, "label24"); - this.label24.Name = "label24"; - // - // label23 - // - resources.ApplyResources(this.label23, "label23"); - this.label23.Name = "label23"; - // - // panTlsMore - // - this.panTlsMore.Controls.Add(this.label21); - this.panTlsMore.Controls.Add(this.cmbAllowInsecure); - resources.ApplyResources(this.panTlsMore, "panTlsMore"); - this.panTlsMore.Name = "panTlsMore"; - // - // label21 - // - resources.ApplyResources(this.label21, "label21"); - this.label21.Name = "label21"; - // - // cmbAllowInsecure - // - this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbAllowInsecure.FormattingEnabled = true; - this.cmbAllowInsecure.Items.AddRange(new object[] { - resources.GetString("cmbAllowInsecure.Items"), - resources.GetString("cmbAllowInsecure.Items1"), - resources.GetString("cmbAllowInsecure.Items2")}); - resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); - this.cmbAllowInsecure.Name = "cmbAllowInsecure"; - // - // label9 - // - resources.ApplyResources(this.label9, "label9"); - this.label9.Name = "label9"; - // - // label20 - // - resources.ApplyResources(this.label20, "label20"); - this.label20.Name = "label20"; - // - // txtPath - // - resources.ApplyResources(this.txtPath, "txtPath"); - this.txtPath.Name = "txtPath"; - // - // cmbNetwork - // - this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbNetwork.FormattingEnabled = true; - this.cmbNetwork.Items.AddRange(new object[] { - resources.GetString("cmbNetwork.Items"), - resources.GetString("cmbNetwork.Items1"), - resources.GetString("cmbNetwork.Items2"), - resources.GetString("cmbNetwork.Items3"), - resources.GetString("cmbNetwork.Items4")}); - resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); - this.cmbNetwork.Name = "cmbNetwork"; - this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); - // - // label7 - // - resources.ApplyResources(this.label7, "label7"); - this.label7.Name = "label7"; - // - // label19 - // - resources.ApplyResources(this.label19, "label19"); - this.label19.Name = "label19"; - // - // label18 - // - resources.ApplyResources(this.label18, "label18"); - this.label18.Name = "label18"; - // - // label17 - // - resources.ApplyResources(this.label17, "label17"); - this.label17.Name = "label17"; - // - // label16 - // - resources.ApplyResources(this.label16, "label16"); - this.label16.Name = "label16"; - // - // label14 - // - resources.ApplyResources(this.label14, "label14"); - this.label14.Name = "label14"; - // - // label15 - // - resources.ApplyResources(this.label15, "label15"); - this.label15.Name = "label15"; - // - // cmbStreamSecurity - // - this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbStreamSecurity.FormattingEnabled = true; - this.cmbStreamSecurity.Items.AddRange(new object[] { - resources.GetString("cmbStreamSecurity.Items"), - resources.GetString("cmbStreamSecurity.Items1")}); - resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); - this.cmbStreamSecurity.Name = "cmbStreamSecurity"; - this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); - // - // label12 - // - resources.ApplyResources(this.label12, "label12"); - this.label12.Name = "label12"; - // - // txtRequestHost - // - resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); - this.txtRequestHost.Name = "txtRequestHost"; - // - // label11 - // - resources.ApplyResources(this.label11, "label11"); - this.label11.Name = "label11"; - // - // label10 - // - resources.ApplyResources(this.label10, "label10"); - this.label10.Name = "label10"; - // - // cmbHeaderType - // - this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbHeaderType.FormattingEnabled = true; - this.cmbHeaderType.Items.AddRange(new object[] { - resources.GetString("cmbHeaderType.Items"), - resources.GetString("cmbHeaderType.Items1"), - resources.GetString("cmbHeaderType.Items2"), - resources.GetString("cmbHeaderType.Items3"), - resources.GetString("cmbHeaderType.Items4"), - resources.GetString("cmbHeaderType.Items5"), - resources.GetString("cmbHeaderType.Items6")}); - resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); - this.cmbHeaderType.Name = "cmbHeaderType"; + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; // // label8 // resources.ApplyResources(this.label8, "label8"); this.label8.Name = "label8"; // + // txtAlterId + // + resources.ApplyResources(this.txtAlterId, "txtAlterId"); + this.txtAlterId.Name = "txtAlterId"; + // // cmbSecurity // this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbSecurity.FormattingEnabled = true; - this.cmbSecurity.Items.AddRange(new object[] { - resources.GetString("cmbSecurity.Items"), - resources.GetString("cmbSecurity.Items1"), - resources.GetString("cmbSecurity.Items2"), - resources.GetString("cmbSecurity.Items3")}); resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // - // txtRemarks - // - resources.ApplyResources(this.txtRemarks, "txtRemarks"); - this.txtRemarks.Name = "txtRemarks"; - // - // label6 - // - resources.ApplyResources(this.label6, "label6"); - this.label6.Name = "label6"; - // // label5 // resources.ApplyResources(this.label5, "label5"); this.label5.Name = "label5"; // - // txtAlterId + // panAddr // - resources.ApplyResources(this.txtAlterId, "txtAlterId"); - this.txtAlterId.Name = "txtAlterId"; + this.panAddr.Controls.Add(this.cmbCoreType); + this.panAddr.Controls.Add(this.labCoreType); + this.panAddr.Controls.Add(this.label6); + this.panAddr.Controls.Add(this.label1); + this.panAddr.Controls.Add(this.txtAddress); + this.panAddr.Controls.Add(this.label2); + this.panAddr.Controls.Add(this.txtPort); + this.panAddr.Controls.Add(this.txtRemarks); + resources.ApplyResources(this.panAddr, "panAddr"); + this.panAddr.Name = "panAddr"; // - // label4 + // label6 // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // - // txtId - // - resources.ApplyResources(this.txtId, "txtId"); - this.txtId.Name = "txtId"; - // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // txtPort - // - resources.ApplyResources(this.txtPort, "txtPort"); - this.txtPort.Name = "txtPort"; - // - // label2 - // - resources.ApplyResources(this.label2, "label2"); - this.label2.Name = "label2"; - // - // txtAddress - // - resources.ApplyResources(this.txtAddress, "txtAddress"); - this.txtAddress.Name = "txtAddress"; + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; // // label1 // resources.ApplyResources(this.label1, "label1"); this.label1.Name = "label1"; // - // panel2 + // txtAddress // - this.panel2.Controls.Add(this.btnClose); - this.panel2.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel2, "panel2"); - this.panel2.Name = "panel2"; + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // panBottom + // + this.panBottom.Controls.Add(this.btnClose); + this.panBottom.Controls.Add(this.btnOK); + resources.ApplyResources(this.panBottom, "panBottom"); + this.panBottom.Name = "panBottom"; // // btnOK // @@ -382,50 +373,34 @@ this.btnOK.UseVisualStyleBackColor = true; this.btnOK.Click += new System.EventHandler(this.btnOK_Click); // - // panel1 + // panTop // - resources.ApplyResources(this.panel1, "panel1"); - this.panel1.Name = "panel1"; + resources.ApplyResources(this.panTop, "panTop"); + this.panTop.Name = "panTop"; // - // menuServer + // panTran // - this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItem1}); - resources.ApplyResources(this.menuServer, "menuServer"); - this.menuServer.Name = "menuServer"; + this.panTran.Controls.Add(this.transportControl); + resources.ApplyResources(this.panTran, "panTran"); + this.panTran.Name = "panTran"; // - // MenuItem1 + // transportControl // - this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.MenuItemImportClient, - this.MenuItemImportServer, - this.toolStripSeparator1, - this.MenuItemImportClipboard}); - this.MenuItem1.Name = "MenuItem1"; - resources.ApplyResources(this.MenuItem1, "MenuItem1"); + this.transportControl.AllowXtls = false; + resources.ApplyResources(this.transportControl, "transportControl"); + this.transportControl.Name = "transportControl"; // - // MenuItemImportClient + // cmbCoreType // - this.MenuItemImportClient.Name = "MenuItemImportClient"; - resources.ApplyResources(this.MenuItemImportClient, "MenuItemImportClient"); - this.MenuItemImportClient.Click += new System.EventHandler(this.MenuItemImportClient_Click); + this.cmbCoreType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType.FormattingEnabled = true; + resources.ApplyResources(this.cmbCoreType, "cmbCoreType"); + this.cmbCoreType.Name = "cmbCoreType"; // - // MenuItemImportServer + // labCoreType // - this.MenuItemImportServer.Name = "MenuItemImportServer"; - resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); - this.MenuItemImportServer.Click += new System.EventHandler(this.MenuItemImportServer_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); - // - // MenuItemImportClipboard - // - this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; - resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); - this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); + resources.ApplyResources(this.labCoreType, "labCoreType"); + this.labCoreType.Name = "labCoreType"; // // AddServerForm // @@ -433,23 +408,28 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; this.Controls.Add(this.groupBox1); - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel1); - this.Controls.Add(this.menuServer); + this.Controls.Add(this.panTran); + this.Controls.Add(this.panBottom); + this.Controls.Add(this.panTop); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.Name = "AddServerForm"; this.Load += new System.EventHandler(this.AddServerForm_Load); this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.panTlsMore.ResumeLayout(false); - this.panTlsMore.PerformLayout(); - this.panel2.ResumeLayout(false); - this.menuServer.ResumeLayout(false); - this.menuServer.PerformLayout(); + this.panSocks.ResumeLayout(false); + this.panSocks.PerformLayout(); + this.panSs.ResumeLayout(false); + this.panSs.PerformLayout(); + this.panTrojan.ResumeLayout(false); + this.panTrojan.PerformLayout(); + this.panVless.ResumeLayout(false); + this.panVless.PerformLayout(); + this.panVmess.ResumeLayout(false); + this.panVmess.PerformLayout(); + this.panAddr.ResumeLayout(false); + this.panAddr.PerformLayout(); + this.panBottom.ResumeLayout(false); + this.panTran.ResumeLayout(false); this.ResumeLayout(false); - this.PerformLayout(); } @@ -470,39 +450,39 @@ private System.Windows.Forms.TextBox txtAddress; private System.Windows.Forms.Label label1; private System.Windows.Forms.ComboBox cmbSecurity; - private System.Windows.Forms.ComboBox cmbNetwork; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.Label label9; private System.Windows.Forms.Label label8; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.TextBox txtRequestHost; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.Label label11; - private System.Windows.Forms.ComboBox cmbHeaderType; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.MenuStrip menuServer; - private System.Windows.Forms.ToolStripMenuItem MenuItem1; - private System.Windows.Forms.ToolStripMenuItem MenuItemImportClient; - private System.Windows.Forms.ToolStripMenuItem MenuItemImportServer; - private System.Windows.Forms.Label label15; - private System.Windows.Forms.ComboBox cmbStreamSecurity; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - private System.Windows.Forms.ToolStripMenuItem MenuItemImportClipboard; + private System.Windows.Forms.Panel panTop; + private System.Windows.Forms.Panel panBottom; private System.Windows.Forms.Button btnGUID; - private System.Windows.Forms.Label label16; + private System.Windows.Forms.Panel panTran; + private ServerTransportControl transportControl; + private System.Windows.Forms.Panel panAddr; + private System.Windows.Forms.Panel panVmess; + private System.Windows.Forms.Panel panVless; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.ComboBox cmbFlow5; + private System.Windows.Forms.TextBox txtId5; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Button btnGUID5; + private System.Windows.Forms.ComboBox cmbSecurity5; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Panel panTrojan; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.ComboBox cmbFlow6; + private System.Windows.Forms.TextBox txtId6; private System.Windows.Forms.Label label14; + private System.Windows.Forms.Panel panSs; + private System.Windows.Forms.TextBox txtId3; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.ComboBox cmbSecurity3; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Panel panSocks; private System.Windows.Forms.Label label17; + private System.Windows.Forms.TextBox txtSecurity4; private System.Windows.Forms.Label label18; - private System.Windows.Forms.Label label19; - private System.Windows.Forms.TextBox txtPath; - private System.Windows.Forms.Label label20; - private System.Windows.Forms.Label label21; - private System.Windows.Forms.ComboBox cmbAllowInsecure; - private System.Windows.Forms.Panel panTlsMore; - private System.Windows.Forms.Label label24; - private System.Windows.Forms.Label label23; + private System.Windows.Forms.TextBox txtId4; + private System.Windows.Forms.ComboBox cmbCoreType; + private System.Windows.Forms.Label labCoreType; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index bd80867b..80458e83 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -1,13 +1,14 @@ using System; +using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { public partial class AddServerForm : BaseServerForm - { - + { public AddServerForm() { InitializeComponent(); @@ -15,14 +16,59 @@ namespace v2rayN.Forms private void AddServerForm_Load(object sender, EventArgs e) { - if (EditIndex >= 0) + Text = (eConfigType).ToString(); + + cmbCoreType.Items.AddRange(Global.coreTypes.ToArray()); + cmbCoreType.Items.Add(string.Empty); + + switch (eConfigType) + { + case EConfigType.VMess: + panVmess.Dock = DockStyle.Fill; + panVmess.Visible = true; + + cmbSecurity.Items.AddRange(Global.vmessSecuritys.ToArray()); + break; + case EConfigType.Shadowsocks: + panSs.Dock = DockStyle.Fill; + panSs.Visible = true; + //panTran.Visible = false; + //this.Height = this.Height - panTran.Height; + + cmbSecurity3.Items.AddRange(LazyConfig.Instance.GetShadowsocksSecuritys().ToArray()); + break; + case EConfigType.Socks: + panSocks.Dock = DockStyle.Fill; + panSocks.Visible = true; + panTran.Visible = false; + Height = Height - panTran.Height; + break; + case EConfigType.VLESS: + panVless.Dock = DockStyle.Fill; + panVless.Visible = true; + transportControl.AllowXtls = true; + + cmbFlow5.Items.AddRange(Global.xtlsFlows.ToArray()); + break; + case EConfigType.Trojan: + panTrojan.Dock = DockStyle.Fill; + panTrojan.Visible = true; + transportControl.AllowXtls = true; + + cmbFlow6.Items.AddRange(Global.xtlsFlows.ToArray()); + break; + } + + if (vmessItem != null) { - vmessItem = config.vmess[EditIndex]; BindingServer(); } else { - vmessItem = new VmessItem(); + vmessItem = new VmessItem + { + groupId = groupId + }; ClearServer(); } } @@ -32,261 +78,208 @@ namespace v2rayN.Forms /// private void BindingServer() { + txtRemarks.Text = vmessItem.remarks; txtAddress.Text = vmessItem.address; txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtAlterId.Text = vmessItem.alterId.ToString(); - cmbSecurity.Text = vmessItem.security; - cmbNetwork.Text = vmessItem.network; - txtRemarks.Text = vmessItem.remarks; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; - cmbAllowInsecure.Text = vmessItem.allowInsecure; + switch (eConfigType) + { + case EConfigType.VMess: + txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); + cmbSecurity.Text = vmessItem.security; + break; + case EConfigType.Shadowsocks: + txtId3.Text = vmessItem.id; + cmbSecurity3.Text = vmessItem.security; + break; + case EConfigType.Socks: + txtId4.Text = vmessItem.id; + txtSecurity4.Text = vmessItem.security; + break; + case EConfigType.VLESS: + txtId5.Text = vmessItem.id; + cmbFlow5.Text = vmessItem.flow; + cmbSecurity5.Text = vmessItem.security; + break; + case EConfigType.Trojan: + txtId6.Text = vmessItem.id; + cmbFlow6.Text = vmessItem.flow; + break; + } + + cmbCoreType.Text = vmessItem.coreType == null ? string.Empty : vmessItem.coreType.ToString(); + + transportControl.BindingServer(vmessItem); } - /// /// 清除设置 /// private void ClearServer() { + txtRemarks.Text = ""; txtAddress.Text = ""; txtPort.Text = ""; - txtId.Text = ""; - txtAlterId.Text = "0"; - cmbSecurity.Text = Global.DefaultSecurity; - cmbNetwork.Text = Global.DefaultNetwork; - txtRemarks.Text = ""; - cmbHeaderType.Text = Global.None; - txtRequestHost.Text = ""; - cmbStreamSecurity.Text = ""; - cmbAllowInsecure.Text = ""; - txtPath.Text = ""; - } - - - private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) - { - SetHeaderType(); - } - - /// - /// 设置伪装选项 - /// - private void SetHeaderType() - { - cmbHeaderType.Items.Clear(); - - string network = cmbNetwork.Text; - if (Utils.IsNullOrEmpty(network)) + switch (eConfigType) { - cmbHeaderType.Items.Add(Global.None); - return; + case EConfigType.VMess: + txtId.Text = ""; + txtAlterId.Text = "0"; + cmbSecurity.Text = Global.DefaultSecurity; + break; + case EConfigType.Shadowsocks: + txtId3.Text = ""; + cmbSecurity3.Text = Global.DefaultSecurity; + break; + case EConfigType.Socks: + txtId4.Text = ""; + txtSecurity4.Text = ""; + break; + case EConfigType.VLESS: + txtId5.Text = ""; + cmbFlow5.Text = ""; + cmbSecurity5.Text = Global.None; + break; + case EConfigType.Trojan: + txtId6.Text = ""; + cmbFlow6.Text = ""; + break; } - cmbHeaderType.Items.Add(Global.None); - if (network.Equals(Global.DefaultNetwork)) - { - cmbHeaderType.Items.Add(Global.TcpHeaderHttp); - } - else if (network.Equals("kcp") || network.Equals("quic")) - { - cmbHeaderType.Items.Add("srtp"); - cmbHeaderType.Items.Add("utp"); - cmbHeaderType.Items.Add("wechat-video"); - cmbHeaderType.Items.Add("dtls"); - cmbHeaderType.Items.Add("wireguard"); - } - else - { - } - cmbHeaderType.Text = Global.None; + transportControl.ClearServer(vmessItem); } private void btnOK_Click(object sender, EventArgs e) { + string remarks = txtRemarks.Text; string address = txtAddress.Text; string port = txtPort.Text; - string id = txtId.Text; - string alterId = txtAlterId.Text; - string security = cmbSecurity.Text; - string network = cmbNetwork.Text; - string remarks = txtRemarks.Text; - string headerType = cmbHeaderType.Text; - string requestHost = txtRequestHost.Text; - string path = txtPath.Text; - string streamSecurity = cmbStreamSecurity.Text; - string allowInsecure = cmbAllowInsecure.Text; + string id = string.Empty; + string alterId = string.Empty; + string security = string.Empty; + string flow = string.Empty; + + switch (eConfigType) + { + case EConfigType.VMess: + id = txtId.Text; + alterId = txtAlterId.Text; + security = cmbSecurity.Text; + break; + case EConfigType.Shadowsocks: + id = txtId3.Text; + security = cmbSecurity3.Text; + break; + case EConfigType.Socks: + id = txtId4.Text; + security = txtSecurity4.Text; + break; + case EConfigType.VLESS: + id = txtId5.Text; + flow = cmbFlow5.Text; + security = cmbSecurity5.Text; + break; + case EConfigType.Trojan: + id = txtId6.Text; + flow = cmbFlow6.Text; + break; + } if (Utils.IsNullOrEmpty(address)) { - UI.Show(UIRes.I18N("FillServerAddress")); + UI.Show(ResUI.FillServerAddress); return; } if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) { - UI.Show(UIRes.I18N("FillCorrectServerPort")); + UI.Show(ResUI.FillCorrectServerPort); return; } - if (Utils.IsNullOrEmpty(id)) + if (eConfigType == EConfigType.Shadowsocks) { - UI.Show(UIRes.I18N("FillUUID")); - return; + if (Utils.IsNullOrEmpty(id)) + { + UI.Show(ResUI.FillPassword); + return; + } + if (Utils.IsNullOrEmpty(security)) + { + UI.Show(ResUI.PleaseSelectEncryption); + return; + } } - if (Utils.IsNullOrEmpty(alterId) || !Utils.IsNumberic(alterId)) + if (eConfigType != EConfigType.Socks) { - UI.Show(UIRes.I18N("FillCorrectAlterId")); - return; + if (Utils.IsNullOrEmpty(id)) + { + UI.Show(ResUI.FillUUID); + return; + } } + transportControl.EndBindingServer(); + + vmessItem.remarks = remarks; vmessItem.address = address; vmessItem.port = Utils.ToInt(port); vmessItem.id = id; vmessItem.alterId = Utils.ToInt(alterId); vmessItem.security = security; - vmessItem.network = network; - vmessItem.remarks = remarks; - vmessItem.headerType = headerType; - vmessItem.requestHost = requestHost.Replace(" ", ""); - vmessItem.path = path.Replace(" ", ""); - vmessItem.streamSecurity = streamSecurity; - vmessItem.allowInsecure = allowInsecure; - - if (ConfigHandler.AddServer(ref config, vmessItem, EditIndex) == 0) + if (Utils.IsNullOrEmpty(cmbCoreType.Text)) { - this.DialogResult = DialogResult.OK; + vmessItem.coreType = null; } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + vmessItem.coreType = (ECoreType)Enum.Parse(typeof(ECoreType), cmbCoreType.Text); } + + int ret = -1; + switch (eConfigType) + { + case EConfigType.VMess: + ret = ConfigHandler.AddServer(ref config, vmessItem); + break; + case EConfigType.Shadowsocks: + ret = ConfigHandler.AddShadowsocksServer(ref config, vmessItem); + break; + case EConfigType.Socks: + ret = ConfigHandler.AddSocksServer(ref config, vmessItem); + break; + case EConfigType.VLESS: + vmessItem.flow = flow; + ret = ConfigHandler.AddVlessServer(ref config, vmessItem); + break; + case EConfigType.Trojan: + vmessItem.flow = flow; + ret = ConfigHandler.AddTrojanServer(ref config, vmessItem); + break; + } + + if (ret == 0) + { + DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(ResUI.OperationFailed); + } + } private void btnGUID_Click(object sender, EventArgs e) { - txtId.Text = Utils.GetGUID(); + txtId.Text = + txtId5.Text = Utils.GetGUID(); } private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } - - private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) - { - string security = cmbStreamSecurity.Text; - if (Utils.IsNullOrEmpty(security)) - { - panTlsMore.Hide(); - } - else - { - panTlsMore.Show(); - } - } - - #region 导入客户端/服务端配置 - - /// - /// 导入客户端 - /// - /// - /// - private void MenuItemImportClient_Click(object sender, EventArgs e) - { - MenuItemImport(1); - } - - /// - /// 导入服务端 - /// - /// - /// - private void MenuItemImportServer_Click(object sender, EventArgs e) - { - MenuItemImport(2); - } - - private void MenuItemImport(int type) - { - ClearServer(); - - OpenFileDialog fileDialog = new OpenFileDialog - { - Multiselect = false, - Filter = "Config|*.json|All|*.*" - }; - if (fileDialog.ShowDialog() != DialogResult.OK) - { - return; - } - string fileName = fileDialog.FileName; - if (Utils.IsNullOrEmpty(fileName)) - { - return; - } - string msg; - VmessItem vmessItem; - if (type.Equals(1)) - { - vmessItem = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg); - } - else - { - vmessItem = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg); - } - if (vmessItem == null) - { - UI.ShowWarning(msg); - return; - } - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtAlterId.Text = vmessItem.alterId.ToString(); - txtRemarks.Text = vmessItem.remarks; - cmbNetwork.Text = vmessItem.network; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; - } - - /// - /// 从剪贴板导入URL - /// - /// - /// - private void MenuItemImportClipboard_Click(object sender, EventArgs e) - { - ClearServer(); - - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); - if (vmessItem == null) - { - UI.ShowWarning(msg); - return; - } - - txtAddress.Text = vmessItem.address; - txtPort.Text = vmessItem.port.ToString(); - txtId.Text = vmessItem.id; - txtAlterId.Text = vmessItem.alterId.ToString(); - txtRemarks.Text = vmessItem.remarks; - cmbNetwork.Text = vmessItem.network; - cmbHeaderType.Text = vmessItem.headerType; - txtRequestHost.Text = vmessItem.requestHost; - txtPath.Text = vmessItem.path; - cmbStreamSecurity.Text = vmessItem.streamSecurity; - } - #endregion - } } diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index 6d3eec6c..31a88ee9 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -138,410 +138,29 @@ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - panel2 + panBottom 0 - - 411, 83 - - - 75, 23 - - - 23 - - - &Generate - - - btnGUID - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - True - - - 285, 175 - - - 113, 12 - - - 22 - - - * Fill in manually - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - True - - - - NoControl - - - 529, 207 - - - 119, 12 - - - 35 - - - 3)QUIC key/Kcp seed - - - label24 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - True - - - NoControl - - - 465, 146 - - - 89, 12 - - - 34 - - - 4)QUIC securty - - - label23 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - True - - - 12, 11 - - - 83, 12 - - - 31 - - - allowInsecure - - - label21 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 0 - - - - - - true - - - false - - - 107, 7 - - - 91, 20 - - - 30 - - - cmbAllowInsecure - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 1 - - - 284, 234 - - - 338, 35 - - - 33 - - - panTlsMore - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - True - - - 350, 32 - - - 113, 12 - - - 15 - - - *Default value tcp - - - label9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 3 - - - True - - - 464, 130 - - - 203, 12 - - - 29 - - - 3)h2 host Separated by commas (,) - - - label20 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 4 - - - 127, 169 - - - True - - - 396, 54 - - - 28 - - - txtPath - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 5 - - - tcp - - - kcp - - - ws - - - h2 - - - quic - - - 192, 28 - - - 143, 20 - - - 12 - - - cmbNetwork - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 6 - - - True - - - 9, 32 - - - 167, 12 - - - 13 - - - Transport protocol(network) - - - label7 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 7 - - - True - - - 9, 169 - - - 29, 12 - - - 27 - - - Path - - - label19 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 8 - - - True - - - 529, 189 - - - 59, 12 - - - 26 - - - 2)h2 path - - - label18 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 9 - True + + + NoControl + - 464, 115 + 11, 11 - 59, 12 + 89, 12 25 - 2)ws host + User(Optional) label17 @@ -550,79 +169,145 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 + panSocks - 10 + 0 - + + 126, 7 + + + 278, 21 + + + 2 + + + txtSecurity4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panSocks + + + 1 + + True - - 529, 172 + + NoControl - - 59, 12 + + 11, 42 - - 24 + + 113, 12 - - 1)ws path - - - label16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 11 - - - True - - - 464, 100 - - - 215, 12 - - + 23 - - 1)http host Separated by commas (,) + + Password(Optional) - - label14 + + label18 - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox2 + + panSocks - - 12 + + 2 + + + 126, 38 + + + 278, 21 + + + 3 + + + txtId4 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panSocks + + + 3 + + + 303, 163 + + + 82, 39 + + + 31 + + + False + + + panSocks + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 126, 7 + + + 278, 21 + + + 2 + + + txtId3 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panSs + + + 0 True + + NoControl + - 9, 243 + 11, 9 - 23, 12 + 53, 12 - 22 + 4 - TLS + Password label15 @@ -631,52 +316,103 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 + panSs - 13 + 1 - - + + 126, 39 - - tls + + 278, 20 - - 127, 239 + + 3 - - 143, 20 + + cmbSecurity3 - - 21 - - - cmbStreamSecurity - - + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox2 + + panSs - - 14 + + 2 + + + True + + + NoControl + + + 11, 40 + + + 65, 12 + + + 8 + + + Encryption + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panSs + + + 3 + + + 142, 163 + + + 82, 39 + + + 30 + + + False + + + panSs + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 True + + NoControl + - 282, 66 + 12, 9 - 299, 12 + 53, 12 - 20 + 4 - *tcp or kcp or QUIC camouflage type, default none + Password label12 @@ -685,76 +421,226 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 + panTrojan - 15 + 0 - - 158, 100 + + 127, 39 - - True + + 211, 20 - - 300, 53 + + 3 - - 16 + + cmbFlow6 - - txtRequestHost + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + panTrojan + + + 1 + + + 127, 7 + + + 265, 21 + + + 2 + + + txtId6 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox2 + + panTrojan - - 16 + + 2 - + True - - 9, 66 + + NoControl - - 95, 12 + + 12, 43 - - 19 + + 29, 12 - - Camouflage type + + 27 - - label11 + + Flow - + + label14 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox2 + + panTrojan - - 17 + + 3 + + + 534, 163 + + + 82, 39 + + + 29 + + + False + + + panTrojan + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + NoControl + + + 11, 11 + + + 53, 12 + + + 4 + + + UUID(id) + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 0 + + + 126, 39 + + + 211, 20 + + + 3 + + + cmbFlow5 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 1 + + + 126, 7 + + + 278, 21 + + + 2 + + + txtId5 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 2 + + + True + + + NoControl + + + 11, 43 + + + 29, 12 + + + 25 + + + Flow + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + + 3 True + + NoControl + - 9, 100 + 11, 74 - 143, 12 + 65, 12 - 17 + 8 - Camouflage domain(host) + Encryption label10 @@ -763,289 +649,121 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox2 + panVless - 18 - - - none - - - http - - - srtp - - - utp - - - wechat-video - - - dtls - - - wireguard - - - 127, 64 - - - 143, 20 - - - 18 - - - cmbHeaderType - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 19 - - - Bottom - - - 3, 215 - - - 723, 281 - - - 21 - - - Transport - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - True - - - 353, 147 - - - 119, 12 - - - 14 - - - *Recommended (auto) - - - label8 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - aes-128-gcm - - - chacha20-poly1305 - - - auto - - - none - - - 195, 143 - - - 143, 20 - - - 6 - - - cmbSecurity - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - 4 - - 127, 171 + + NoControl - - 143, 21 + + 410, 7 - - 11 + + 75, 23 - - txtRemarks + + 23 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Generate - - groupBox1 + + btnGUID5 - + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVless + + 5 - - True + + none - - 12, 175 + + 126, 70 - - 95, 12 + + 211, 20 - - 10 + + 4 - - Alias (remarks) + + cmbSecurity5 - - label6 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + panVless - - groupBox1 - - + 6 - + True - - 12, 147 + + NoControl - - 173, 12 + + 352, 73 - - 8 + + 119, 12 - - Encryption method (security) + + 14 - - label5 + + *Recommended (none) - + + label11 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + panVless - + 7 - - 127, 114 + + 396, 166 - - 143, 21 + + 92, 36 - - 7 + + 27 - - txtAlterId + + False - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + panVless - + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 - - 8 - - - True - - - 12, 118 - - - 47, 12 - - - 6 - - - AlterId - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - 127, 85 - - - 278, 21 - - - 5 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 10 + + 3 True - 12, 89 + 11, 11 53, 12 @@ -1063,85 +781,286 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox1 + panVmess - 11 + 0 - - 127, 56 + + 126, 7 - - 143, 21 + + 278, 21 - - 3 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 12 - - - True - - - 12, 60 - - - 29, 12 - - + 2 - - Port + + txtId - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 13 - - - 127, 27 - - - 359, 21 - - - 1 - - - txtAddress - - + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + panVmess + + + 1 + + + 410, 5 + + + 75, 23 + + + 23 + + + &Generate + + + btnGUID + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 2 + + + True + + + 11, 40 + + + 47, 12 + + + 6 + + + AlterId + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 3 + + + True + + + 410, 69 + + + 119, 12 + + + 14 + + + *Recommended (auto) + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 4 + + + 126, 36 + + + 143, 21 + + + 3 + + + txtAlterId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 5 + + + 194, 65 + + + 210, 20 + + + 4 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 6 + + + True + + + 11, 69 + + + 173, 12 + + + 8 + + + Encryption method (security) + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panVmess + + + 7 + + + 16, 163 + + + 82, 39 + + + 25 + + + False + + + panVmess + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 - - 14 + + 4 + + + 625, 8 + + + 89, 20 + + + 38 + + + cmbCoreType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 0 + + + True + + + NoControl + + + 553, 12 + + + 59, 12 + + + 39 + + + Core Type + + + labCoreType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 1 + + + True + + + 11, 12 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 2 True - 12, 31 + 11, 43 47, 12 @@ -1159,19 +1078,133 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox1 + panAddr - 15 + 3 + + + 126, 39 + + + 359, 21 + + + 1 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 4 + + + True + + + 11, 72 + + + 29, 12 + + + 2 + + + Port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 5 + + + 126, 68 + + + 143, 21 + + + 2 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 6 + + + 126, 8 + + + 278, 21 + + + 0 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panAddr + + + 7 + + + Top + + + 3, 17 + + + 723, 100 + + + 24 + + + panAddr + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 Fill - 0, 35 + 0, 10 - 729, 499 + 729, 221 3 @@ -1210,110 +1243,107 @@ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - panel2 + panBottom 1 - + Bottom - - 0, 534 + + 0, 461 - + 729, 60 - + 7 - - panel2 + + panBottom - + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - 1 - - - Top - - - 0, 25 - - - 729, 10 - - - 6 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - + 2 - - 17, 17 - - - 237, 22 + + Top - - Import client configuration - - - 237, 22 - - - Import server configuration - - - 234, 6 - - - 237, 22 - - - Import URL from clipboard - - - 162, 21 - - - Import configuration file - - + 0, 0 - - 729, 25 + + 729, 10 - - 8 + + 6 - - menuServer + + panTop - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + 3 + + Fill + + + 0, 0 + + + 729, 230 + + + 0 + + + transportControl + + + v2rayN.Forms.ServerTransportControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + panTran + + + 0 + + + Bottom + + + 0, 231 + + + 729, 230 + + + 9 + + + panTran + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + True @@ -1324,41 +1354,11 @@ 6, 12 - 729, 594 + 729, 521 Edit or add a [VMess] server - - MenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MenuItemImportClient - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MenuItemImportServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator1 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MenuItemImportClipboard - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - AddServerForm diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx index 489f5fd2..b9c81218 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -123,132 +123,106 @@ 服务器 + + + None + + + + 270, 156 + + + 115, 61 + + + 77, 12 + + + 用户名(可选) + + + 65, 12 + + + 密码(可选) + + + None + + + 142, 147 + + + 137, 78 + + + 89, 12 + + + 密码(password) + + + 125, 12 + + + 加密方式(encryption) + + + 89, 12 + + + 密码(password) + + + 65, 12 + + + 流控(flow) + + + 110, 52 + + + 65, 12 + + + 用户ID(id) + + + 65, 12 + + + 流控(flow) + + + 101, 12 + + + 加密(encryption) + + + 生成 + + + 71, 12 + + + *非空(none) + + + 65, 12 + + + 用户ID(id) + 生成(&G) - - *手填,方便识别管理 - - - 底层传输方式(transport) - - - - 149, 12 - - - 3)QUIC 加密密钥/Kcp seed - - + 95, 12 - - 4)QUIC 加密方式 - - - 167, 12 - - - 跳过证书验证(allowInsecure) - - - 223, 7 - - - 350, 36 - - - 143, 12 - - - *默认tcp,选错会无法连接 - - - 149, 12 - - - 3)h2 host中间逗号(,)隔开 - - - 127, 168 - - - 127, 32 - - - 211, 20 - - - 9, 36 - - - 107, 12 - - - 传输协议(network) - - - 9, 168 - - - 65, 12 - - - 路径(path) - - - 161, 12 - - - 1)http host中间逗号(,)隔开 - - - 9, 237 - - - 107, 12 - - - 底层传输安全(tls) - - - 127, 237 - - - 282, 71 - - - 197, 12 - - - *tcp或kcp或QUIC伪装类型,默认none - - - 127, 102 - - - 334, 51 - - - 9, 71 - - - 89, 12 - - - 伪装类型(type) - - - 9, 102 - - - 89, 12 - - - 伪装域名(host) - - - 127, 67 + + 额外ID(alterId) 113, 12 @@ -257,40 +231,22 @@ *随便选,建议(auto) - 127, 143 + 126, 65 211, 20 - - 83, 12 - - - 别名(remarks) - 113, 12 加密方式(security) - - 95, 12 + + 83, 12 - - 额外ID(alterId) - - - 65, 12 - - - 用户ID(id) - - - 65, 12 - - - 端口(port) + + 别名(remarks) 83, 12 @@ -298,37 +254,22 @@ 地址(address) + + 65, 12 + + + 端口(port) + 确定(&O) - - 92, 21 - - - 导入配置文件 - - - 171, 22 - - - 导入客户端配置 - - - 171, 22 - - - 导入服务端配置 - - - 168, 6 - - - 171, 22 - - - 从剪贴板导入URL - 编辑或添加[VMess]服务器 + + 生成 + + + Core类型 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/BaseForm.cs b/v2rayN/v2rayN/Forms/BaseForm.cs index 4ea789b1..a307c13a 100644 --- a/v2rayN/v2rayN/Forms/BaseForm.cs +++ b/v2rayN/v2rayN/Forms/BaseForm.cs @@ -7,7 +7,6 @@ namespace v2rayN.Forms public partial class BaseForm : Form { protected static Config config; - protected static System.Drawing.Icon icon; public BaseForm() { @@ -19,16 +18,14 @@ namespace v2rayN.Forms { try { - if (icon == null) + string file = Utils.GetPath(Global.CustomIconName); + if (System.IO.File.Exists(file)) { - string file = Utils.GetPath(Global.CustomIconName); - if (!System.IO.File.Exists(file)) - { - return; - } - icon = new System.Drawing.Icon(file); + Icon = new System.Drawing.Icon(file); + return; } - this.Icon = icon; + + Icon = Properties.Resources.NotifyIcon1; } catch (Exception e) { diff --git a/v2rayN/v2rayN/Forms/BaseForm.resx b/v2rayN/v2rayN/Forms/BaseForm.resx index 61360d3d..1af7de15 100644 --- a/v2rayN/v2rayN/Forms/BaseForm.resx +++ b/v2rayN/v2rayN/Forms/BaseForm.resx @@ -117,1137 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAgAAAAIAAAACAAAAAwAA - AAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAADAAAAAwAAAAMAAAADAAAAAgAAAAIAAAACAAAAAQAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAA - AAIAAAADAAAABAAAAAUAAAAGAAAACAAAAAgAAAAKAAAACgAAAAsAAAAMAAAADQAAAA0AAAANAAAADQAA - AAwAAAALAAAACgAAAAoAAAAIAAAACAAAAAYAAAAFAAAABAAAAAMAAAACAAAAAQAAAAEAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAIAAAACAAAABAAAAAUAAAAHAAAACQAAAAwAAAAOAAAAEQAAABMAAAAVAAAAFwAA - ABgAAAAaAAAAGwAAABwAAAAcAAAAHQAAAB0AAAAcAAAAHAAAABsAAAAaAAAAGAAAABcAAAAVAAAAEwAA - ABEAAAAOAAAADAAAAAkAAAAHAAAABQAAAAQAAAACAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAMAAAAEAAAABwAAAAkAAAAMAAAAEAAA - ABMAAAAXAAAAGgAAAB4BAQAgAgEBIwMDASUDAgEmAwMBKAUEASkGAwMrCAUDKwgFAysIBQMsCAUDLAgF - AysIBQMrBgMDKwUEASkDAwEoAwIBJgMDASUCAQEjAQEAIAAAAB4AAAAaAAAAFwAAABMAAAAQAAAADAAA - AAkAAAAHAAAABAAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA - AAQAAAAHAAAACgAAAA4AAAASAAAAFwAAABwAAAAgAwIBJAUDAicGBAIqBQUCKwICAi0FAwMvCQcEMQgH - BjACAwQwAAECMQYFBTURDgg5GRMJPBwWCz0cFgs9GRMJPBEOCDkGBQU1AAECMQICBDAIBwYwCQcEMQUD - Ay8CAgItBQUCKwYEAioFAwInAwIBJAAAACAAAAAcAAAAFwAAABIAAAAOAAAACgAAAAcAAAAEAAAAAgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAUAAAAIAAAADQAAABIAAAAXAQAAHQIBASIDAgEmBgMDKgQD - AywAAAEtBQQEMRYRCTckHA0+OCoTSlU/G19sUCF1elomhoZjKZWOaCufkmstqphwL7Kccy+3nnQwup51 - MLqccy+3mXEvspNsLaqOaSufh2QqlHtbJ4ZtTyJ1Vj8cXzgpE0okHA0+FhEJNwUEBDEAAAEtBAMDLAYD - AyoDAgEmAgEBIgAAAB0AAAAXAAAAEgAAAA0AAAAIAAAABQAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAADwAA - ABUAAAAcAgIAIgQCAicFBAErBAMDLgUEBDAWEQo5QjEWT2BHH2d6WiaHkGssq6B2MMWtfzTbt4Y367+M - OfXEjzv5yZM8/M2WPv7PmD7/0Zk//9KaP//Tmz//05s//9OaP//Smj//0Jg+/82WPv3KlD37xZA7+cCM - OvW4iDjrroA126F2McWRbCyre1smh2FHH2dCMRZPFhEKOQUEBDAEAwMuBQQBKwQCAicCAgAiAAAAHAAA - ABUAAAAPAAAACgAAAAYAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAwAAAAYAAAAKAAAAEAAAABcBAQAeAwIBJAYDAyoBAAEsBwUEMSIaDDxSPBtaelomhpRt - LbGoezPVt4Y37MSQO/nMlj3/0Zk//9WcQP/YnkH/2J5B/9ieQP/XnkD/155A/9eeQP7XnkD+155A/tee - QP7XnkD+155A/teeQP7XnkD+155A/9eeQP/YnkD/2J5B/9ieQf/WnED/0po//82WPf/FkTv5uog47Kp8 - M9WVbi6xelomh1E8GlshGQw8BwUFMgEAASwGAwMqAwIBJAEBAB4AAAAXAAAAEAAAAAoAAAAGAAAAAwAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAAEQAAABgBAQAgBAMBJgUD - AysDAgMvGRIKOVQ+G1p+XSiKm3MvvrKDNubCjjr5zZY+/tWcQP/XnUD/2J9B/tieQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/2J5A/9ifQf7XnUD/1ZxA/8+YPv7Djzv5s4M25pxyL799XCeLUj0bWhkT - CzkDAgMvBQMDKwQDASYBAQAfAAAAGAAAABEAAAAKAAAABgAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA - AAQAAAAJAAAADwAAABcBAQAfBAMBJgMCASsIBgQwMSQRQ2xQIXOUbS2xr4A14cOOO/nPmD7/1p1A/9ie - QP/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/tieQP/WnUD/0Jg+/8SPO/mvgTXhlG0usWtOInQwIxJDCAYEMAMCASsEAwEnAQEAHwAA - ABcAAAAPAAAACQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAHAAAADQAAABQBAQAdBQQBJQUFAiwGBQQwRDMXTXxc - J4ahdjHKuog48syVPf7VnED/155B/9ieQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/9Wc - QP/Nlj3+uok486B2Mcp6WiaGQjIWTgYFBDAEAwIsBAMBJQEBAB0AAAAUAAAADQAAAAcAAAADAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAACgAA - ABEAAAAaAwIBIwUDAioHBgQvQDAVSoFeKIynejLTv4w6+NCYPv/XnkD/155A/teeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7XnkD/0Jk+/8CNOvimejLTfl0njT0u - FEoGBQQvBQMCKgMCASMAAAAaAAAAEQAAAAoAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAADAAAABwAAAA0AAAAWAQAAHwQDASgDAgIuNScSRHxbJoOnejPSwY06+dKa - P//YnkD+2J5A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/2J5B/tObP//Bjjr5pXky03hZJoQzJhJEAwMCLgQDASgBAAAfAAAAFgAA - AA0AAAAHAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAgAAAAQAAAAGQQC - AiQDAQIqFBAINWlOIWuedDDBvos59dGZP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie - Qf/Smj//vYs59ZtyL8JlSh9sEw8INQMBAioEAgIkAAAAGQAAABAAAAAIAAAAAwAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAgAAAAQAAAAKAAAAEwIBAR0FAwInAQECLUg1GE2QaiyjtoU3686WPf/XnUD/2J5A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/zpc+/7SEN+yLZiqlRTMXTwEB - Ai4FAwInAgEBHQAAABMAAAAKAAAABAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAADAAAABUDAgEgBAIBKBoU - CTVxUyNxpnkyzcWQO/zVnED/2J5A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/1ZxA/8WQO/yidzHPak8hcxkTCTUEAgEoAwIBIAAAABUAAAAMAAAABQAA - AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAACAAAABgAAAA0AAAAXAwMBIgIBAis4KhNDj2ksm7iHN+7QmD7/155A/teeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/tCZ - Pv+2hTfviGQqnTUnEkUDAgIrAwMBIwAAABcAAAANAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAOAQEAGQQCAiQIBgMsXEQdWaB2 - Mb3Djzr51ZxA/9ieQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tacQP/Cjjr5mnAvv1U/G1sIBgMtBAICJAEB - ABkAAAAOAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAIAAAAHAAAADwEBABkFAwIlCQcDLnVWJHCvgDXZzJY9/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/LlT3/qHwz2m1QInIJBwMvBQMCJgEBABkAAAAPAAAABwAAAAIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAA8CAQAaAwIBJhIOBjJ/Xid+toY35tGZ - P//YnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ieQP7RmT7/sYI26HZX - JYARDQYzBAIBJgIBABoAAAAPAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA - AAYAAAAOAQEAGgYFASYjGgw4jGcrkLuJOO7Tmz//2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7UnD//toY374FeKJIgGAs5BgUBJwEBABoAAAAOAAAABgAA - AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAADQIBABkBAQEkLCENOpJrLZnAjTrz1Js//9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/VnED/u4k49IdjKZwpHw07AgEBJAIBABkAAAANAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAA - AAwBAQAXBgQBJSwiDjmXby2fw4469tadQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnUD/vYs594tmKqEqHg07BwUBJQEB - ABcAAAAMAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAAKAQEAFgMCASImHAw2lm4umMSPO/bVnED+155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/VnED+vos59ohkKZsiGgw4AwIBIgEBABYAAAAKAAAABAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAACQEB - ABMGBAIhFQ8IMJJrLY/Djzrz1p1A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnUD/vIo59INh - KZMUDggxBgQCIQEBABMAAAAJAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAQBQICHQgGAyqHYyl8wI067tWcQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/VnED/uIc38HhYJYAIBgMrBQICHQAAABAAAAAGAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAADQQD - ARoEAwEnf10mbr2LOebVnED/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/UnD//s4M26HBSInEFAwEnBAQBGgAAAA0AAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAoFAwIWAQABI2hNIFW5hzjY05o//9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/RmT//qn0021tCHFoDAQEjBAMCFgAA - AAoAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAHAwICEgAA - AB9GNBU/roA0vdCZPv7XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP7Mlj3/nXIwwTwsEkEAAAEfAwICEgAAAAcAAAACAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAA0GBAMbHRUJLaF2MJnMlT35155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Djzv6jGcrnhoT - CC8HBAMbAAAADQAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAJBgQDFgAA - ACOGYiluxpE779adQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ifQ//cq1n/2qVN/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9adQP+5hzfwc1QjcwAAACQGAwMWAAAACQAAAAMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABgIBARAAAAEdW0MbR7mIN83Um0D/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/2KFH/+XCiP/pypf/26dS/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tGZ - P/+nejPRTjkYSgAAAR0CAQEQAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMBAAEKBgMDGBwU - CSypfDOh0Jg+/deeQf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Zokf/6cqX//jw5P/qzZ7/2aNL/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155B/seSPP2SayynGBEILQcDAxgBAAELAAAAAwAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAACAAAABwcEAxECAAIghWEoZciSPOvXnUD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/154//9iiR//pyZf//Pr3//n06//mw4v/2aRM/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/1p1A/reHN+1uUSFqBAICIAcEAhEAAAAHAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCAwALAAAAGE05 - Fzm6iDe/1ZtA/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f7+//jv - 4//nxY7/2aJJ/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/0Jg+/6F3McVBMBQ9AgIAGAID - AAsAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABggGAhIHBQMgnHMvf8+YPvbXnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//Yokf/6cmX//z69//9/f7//f39//jw4v/kvX//2aJI/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/YnkH/wY4694JhKIQIBgMhCAYCEgAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEBAELAQEAGFxC - G0DCjjrR151A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 - /f/9/f3//f39//bs3P/kv4L/2KFG/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Tmz//q3401Us3 - F0MCAgAYBQMBCwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABQkHARACAgEgpXgxh9KaP/rYnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//fz8//br2f/huHX/2KFF/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/FkDv7iWQpjQQCASEJBwERAAAABQAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDAwAJAAAAFWhL - H0HGkTzS2J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 - +P/9/f3//f39//39/f/9/f3//f39//Xo1P/iuXf/2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tSb - QP+tfzTWVD0ZRQAAABUDAwAJAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABAsIAw4HBQIdpnkygNObP/nYnkH+155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//fz6//Tl - zv/fs2v/159C/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/sSQO/qJZCmHCQYCHgsIAw4AAAAEAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGBQEHBgYAE1Q+ - GTTFkTvI155B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ - l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//fz7//Pky//gtW3/159C/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/0po//6p8M85FMRQ4BwcBEwYFAQcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwkGBAsCAAEZnHMvatObP/LYnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//Pv4//Hfwf/er2H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/wI069H5cJnIDAgIZCQYECwAA - AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFCgQFDzUn - ESfAjTqt155B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii - R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pv5//Hfwv/esWb/155B/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP7QmD7/n3YwtCwhDioLBQYQAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQoJAQgAAAAShmIoTM+YPt/YnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//Pn1/+/Ztv/drFz/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9adQP+2hjfkaE0gUgAA - ABIJCQEIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEw0GCw4K - BRmygjWC1p1A+teeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7//Pn2/+/Y - tf/drV3/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/2J5B/siTPPuOaSuKDwsFGxMNBgsAAAADAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUEAAQEBAANRjQVKMiSPLrYnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7/+/fx/+3Uq//bqVX/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/0po//6h7 - M8I2JxErBgUADQUEAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDgoFBgYE - AhGOaCpK05s/5tieQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f7/+/fy/+zSqP/bqVX/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnUD/vIk56m1PIVMJBQMSDgoEBgAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIUEQMIAAAAFLSENnvXnUH5155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7/+vTs/+rOof/apk//154//9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie - QP/Ikzz6jWgrhAAAABUUEQMIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxcP - Bws+LBMhyJI8rdieQf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3/+vTs/+rMnP/apU7/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5A/tKZP/+keDK0MSMPJRcPBwsAAAADAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQADAAAADIRgJznRmT/S2J9B/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+fHm/+jJ - lv/Zo0r/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/1p1A/7SFNthlSh5AAAAADAABAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARsV - BgUAAAAMpXkyV9acQOvYnkH/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+PLm/+fGj//Zo0r/154//9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH/wY06735cJl4AAAANGRQFBgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIxcMBwwHBRK7iTl82J5B/NeeQf7XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/fz/9+7g/+bDi//YoUb/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9ieQf7LlT38lGwthg8KBhQiFgsHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEQCAcIQS4UG8iSPKLZn0H/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pz/9+7g/+S/gv/YoUf/154//9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5A/tGZPv+leTGsMyQPHRMK - CAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAABkVw0ACwoAAgAAAAhcQxwizpg+wdmfQf/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 - +P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/Pz/9erX/+S+gP/YoEP/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/1ZxA/7CBNchCMBQmAgEACAoKAAJLQQoAAAAAAAAAAAAAAAAAAAAAAAAA - AAAcEQsCBwAFCodiKTPUmz/c2J5B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/9uvZ/+K5 - dv/YoEX/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnUH/uog34GRK - HjoLBAYKGxALAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8VCgMLBgQLpXkxTNadQO7YnkH/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ - l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/8+TM/+G3c//Xn0L/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9ieQf/Cjjrwf10mVQ4IBQweFAoDAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIBcJAwsIAg21hDZj155A9deeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/8+/r/9ObR/9+zaf/YoEP/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/8eS - PPeOaCtsDgoEDR8WCQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVDgcEAAABDL+MOXfXnkH4155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii - R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/8d/C/9+yaf/Xn0H/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/y5U9+phwLoAAAAIMFQ4HBAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAASAfAQQAAAAMxpA7idieQfzXnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/8+/n/8uDF/92vYv/Xn0L/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Plz79oHYwkAAAAAwfHgEEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABKxoQBQwKBQ/JkzyX2J5B/tee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/8+/n/79m2/92t - X//XnkH/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tGZP/+leTKeDAkFEigYDwUAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAE4IxUFRC8UE82WPaTYnkH/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/8+vf/8Nu6/9ysW//Xn0H/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD+05s//6x+M6s0JBEYNiMTBgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAS8eEAZcQhwXz5g+rtie - Qf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/7+fX/7NOq/9upV//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Um0D/sIE0tEYzFhwvHhEGAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAABKRoPBmlMIBnQmT+12J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/7+PP/7dWu/9uoVf/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/tWcQP+0gza7UzoYHioaDwYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAE5Kg4FcVMiGtGZ - PrjYnkH/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/69u//6s2d/9qmT//Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+1ZxA/7WENr5aQBkfOSsPBgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAADwsDwV1VSIa0Zk+uNieQf/XnkD+155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/69vD/69Ci/9qm - UP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP7VnED/tYU2vltCGh89LRAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCATBHNU - IhjSmj+12J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/58+n/6MiU/9qkTP/Xnj//155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tWcQP+1hTa6WUAaHTUh - EwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBKRcEa04gFdGZP67YnkH/155A/teeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /v/58uj/6MiU/9mkS//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD+1ZtA/7ODNbRSPRcaPSYWBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFM0 - HgRbQhwQ0Jg+pdieQf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/37+H/5cGH/9miSP/Xnj//155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Tmz//sIE0q0Uy - FhVKLxoEAAAAAAAAAAAAAAAAAAAAAAAAAACCRD4AYC4xAyQXDArPlz6W2J5B/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//YoUf/6cmX//z6 - 9//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/7+PT/+fLo//38+//9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/37uD/5cKI/9iiSP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/tKaP/+rfTOdHRMKDlQpKwNpNzIAAAAAAAAAAAAAAAAAAAAAACQb - CgBVPhcCAAAABs2WPYfYnkH8155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/154//9ihR//pyZf//Pr3//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f7///ft3v/pypn/9ejT//38+//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/P/27Nv/471//9ih - Rf/Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkD/0Jg+/ah7 - Mo4AAAAHUDsWAiMaCQAAAAAAAAAAAAAAAAAAAAAAPzMNADUvCgEAAAAFyZM9ddieQfnYnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ - l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/96wZP/ht3P/8+TM//z7 - +v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/P/26tj/47x9/9igRP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Nlj36pHgxfQAAAAU2MAoBPzMNAAAAAAAAAAAAAAAAAAAA - AABuUB4AVj8XARsTBQbGkDte2J5B9deeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//3+///26tn/3a5f/9igQ//htnD/8+LJ//z7+f/9/f7//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//38 - +v/159P/4rh0/9ifQ//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/8mT - PPadcy9nIBcHBlE7FgFmShsAAAAAAAAAAAAAAAAAAAAAAH1bIgBrTh0BKB0JBcCMOkbYnkHu2J5B/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii - R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150+/9ef - Qv/gs2v/8d/B//z6+P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//38+//05c7/4bdy/9efQv/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH/xZE78JduLU8rHwoFYEYaAW1QHgAAAAAAAAAAAAAA - AAAAAAAAi1M4ALluSwASABEDsYI2LNedQN3Zn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9efQv/fsWf/8d6///z59v/9/f7//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//z7+P/z48r/37Nq/9eeQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie - Qf/AjTnghGIoMhsGEgOPVToAckQuAAAAAAAAAAAAAAAAAAAAAAB/dAsAvasRAAARAAKacC4Y1ZxAwdmf - Qf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9ed - P//XnkD/155A/9eeQf/esGT/79m3//v49P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//z7+f/x4MP/37Np/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/1ZxA/7mHN8dwUiIbCh4AArGgEAB6bwoAAAAAAAAA - AAAAAAAAAAAAAEZHAAAADwAATT8MAolkKQ7Smj+g2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9efQf/drV7/7tex//v3 - 8P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//z59v/w3sD/3a5g/9eeQf/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Smj//soI2qWhMIBBZSA8CABAAAEdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAALR4PACfZzcBRTAXBs+Y - PnjZn0H92J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92u - YP/XnT//155A/9eeQP/XnkD/155A/9eeQP/cq1n/69Gl//r28P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//v6 - 9v/v2rf/3q5h/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J9A/s6XPf2pfDOBOygVCIpZMAKVYzIAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAt25JAL9yTQEAAAAAyJI8TtieQezYn0H/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9ee - QP/bqVT/69Gl//r17P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//v48//u2LT/26lW/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/YnkH+yJI87590MFQAAAABlVk8AY5WOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADixB0A/+AeAAAA - AADAjDkt151A0tmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq - 2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/aqFP/6cuZ//n07P/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//v49P/s0qj/3KpY/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9edQP+/jDnXlGwsMgAAAADjyBsAy7AaAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcPx4AfU8rAqF1MBHVnD+r2Z9B/9ieQP7XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/apU3/6cyb//nx5v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//r27v/s0af/2qVO/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/YnkD+1JtA/7eGNrF3VyQWdksoAlM5GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdO - GQCMdxUBAAAAAtGZPnTZn0H52J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+ - ///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//apEz/5sSL//ny - 5//9/Pz//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f3+//v48v/py5r/2qdS/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ifQP7Olz76rX40fAAAAAONeBUBZU0ZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArXY3AMqKQQAtFhICyJM9PtieQejYnkH/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yokj/58eR//fv4f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//nz - 6f/pyZf/2aNL/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/2J5B/8aRO+ueczBGOSAVAq53OACZaDEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACSghAAtrAHAAADAAGwgDYV1p1AutmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - P//Yokf/5L6B//ft3v/8/Pr//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//r17f/nxpH/2qVN/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/VnED/u4k4wIJfKBgbGAABop0GAId4 - DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+dEsAvWpTAXdSJgXSmj972Z9B/Nie - QP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 - +P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YoEX/5cGF//br2f/9/fz//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//jw4//mxIz/2KJH/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/2J5B/s+YPv2xgjWDWz0cB6pgSQGkZEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAO+CbgD+iXYA//+JAMuUPTvYnkHf2J9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/YoET/4bh1//Xo1P/8+/n//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//ny6P/lwof/2aNJ/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/xZA746J3MUH//4YA8oJxAd55 - ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJMKACQVDgBtIM3Etad - QKvZn0H/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KFH/+nJ - l//8+vf//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YoET/4rp5//Tn - 0P/9/Pv//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//bs3P/kvX//2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/2J5A/tObP/+6iDiwiGMrFZpcOQFrRyYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAnVxAALlxSAEAABMB0po/XtmfQfTYnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - Qf/Xn0L/159C/9efQv/Xn0L/159C/9efQv/Zo0n/6cqY//z6+P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0L/37Jn//Lgxf/8+vf//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//fu - 4P/kvX7/2KFG/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH+y5U99q6ANGUGABcCn2E+AY1T - OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyiycAyJ0rAB4k - AAHDjzse155BydmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2qZQ/+K5dv/kvoH/5L6A/+S+gP/kvoD/5L6A/+XA - hf/v27r//Pv5//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Yn0L/4LNr//LgxP/8+/n//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//fz7//Tn0v/iuXb/2J9D/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9WdQP/AjTrNmXEuITk1AAGphSUAm3kiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKfU4AynRVAaNvNQPUmz922Z9B+tifQP7XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - P//gtGz/9OjU//r38P/69u//+vbv//r27//69u//+vbw//v59f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0H/3a5g/+/auP/8+fT//f3+//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//fz8//Xo1P/iuHT/2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0D+zpc9+7OENn10UCYFv25PAbRw - RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+B - gwD/i5AA//91AMuWPSzYnkHS2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/150//+C2b//37uD//f7+//39/v/9/f7//f3+//39 - /v/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9ed - P//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/Xn0H/3a9h/+/Ztv/7+fX//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pv6//LiyP/fs2v/159B/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9adQP/EkDrWo3gxMf//ZAC2Wl0AqlVWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZaPQDLZWYBjmcpBdWcP37Zn0H62J9A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnT//4LZv//fu3//9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/3KtZ/+3U - rf/69/D//f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//Pv5//Lhxv/fsmj/159C/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkD/z5g++7eGNoRoSx4GolBQAX9L - MwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAwXFRANB5VwBGAEQBzZc+KNieQdLZn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9edP//gtm//9+7f//39/v/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92u - YP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/3KpZ/+zSqf/69vD//f3+//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pr3//Dd - vf/er2P/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9adQP/FkDvVpnozLFoORQG3a00ArGRJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/mswA87wPAP/AWgDCjzUD1p1Ac9mf - QfjYn0D+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/150//+C2b//37t///f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/26hT/+rPov/69Oz//f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7//Pr2/+/bu//drV//155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0D+z5g++bmIN3mMaSUE/+FqAPSv - DgD/v/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD//wAA//8AAP/+agDTmkEf2J5Bv9mfQf/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnT//4LZv//fu4P/9/v7//f3+//39 - /v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//v7///br - 2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/26hU/+rMnf/59Or//f3+//39 - /v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39 - /v/9/f7/+/n1/+7Xs//drFz/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9WdQP/EkDvDrH00Iv//dwD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGdVEA1YJTAF4h - PQHVnEBW2Z9B7difQf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//gtW3/9erY//z59v/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z5 - 9f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+vf/9OfS/92tX//XnT//155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/2qVP/+nJlv/37+H//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z5 - 9f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX/+fPq/+zSqP/bp1P/154//9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+zZY97riHN1pbJTECtm9HAbBo - SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+sVQD/3nIAwXpDAceROw3XnkGd2Z9B/tifQP7XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9upV//mxYz/6syb/+rM - m//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rM - nP/mw4n/2qZP/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2qVO/+O9 - f//pzJr/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rM - m//qzJv/6syb/+rMm//qzJv/58WO/9yrW//Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/tObP//CjjqhnnIvD7RzPgHLh0UAwIFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfK - HgDu0xsA5aVJANKZPy7YnkHO2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155B/9igQ//YoET/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9ig - Q//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBE/9ifQ//XnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/159C/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9ig - Q//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9igRP/YoET/159C/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnkD/yZM80bKCNjHVmkcA9tkcAOfK - HgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaSNADwpkgBpXwvA9acP2HZn0Hy2J9B/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/2J5B/8+YPvO9iThliGQpBMuNPQG8ijEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA6s8bAOXPFgD//wAAzZc8C9edQJPZn0H62J9B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9efQP7Tmz/7xJA7l6h9MQz//wAA5ccWAOrP - GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6pWAP+wWQD//0MA0Jg/JNif - Qb/Zn0H/2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/YnkD+1p1A/8qUPcG0hDcn//9RAP+0WwD/qlYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAwIs2AMaKPABOQBEB151AP9mfQdrZn0H/2J5A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQf/Plz7cwIw5QlxRGwHWlEAAyJE4AAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP+7 - dgDXik8B151BW9mfQejZn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Yn0D/0Zo/6cSPO16dYz0C/+KKAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gIAA/3yEAP+6egDVmj8H2J5Ac9mfQfHYn0H+155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tSbP/LJkjx2sYA1CP/ikQD/fIQA/4CAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADAgEAAxIVAAKJbQAHOlj4O2J5AitmfQfbYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9if - QP7VnD/3ypQ9jbKAOA++bkkBwoRAAMGBQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/gEAAxYRCAP///wDOmD4U2J9Bldmf - QfrYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0H+155A+82XPZi3hzgW//9PAMeGQwC/gEAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADSpiwA0qoqAMabGQDUmj8Z2J5BntmfQfrYn0H+155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J9A/tee - QPrRmT6gwo07GvrDIgDUrCoA1qktAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD/4CcA/+seAMN8 - TwDZnkEY2Z9BltmfQffYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9ieQP7XnkD30po/mMiTPBm6dUkA/+0eAP/gJwD//wAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3SsA//YVAPHUHgDVm0EU2Z5Bi9mfQfLZn0H/2J5A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0D/2J5A8tOa - P4zGkD0V//8qAP/4FQD/4iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - AAB+AIEAyZQ3AP//SADUmkAO2Z9BdNmfQejZn0H/2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD+2J5B/9edQOnTmj91xo88D///KgDKlTcAfgCBAP//AAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6ekAAv4FAAJ5YPwHJlj4G2Z5BXNmf - QdvZn0H/2J9B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/159A/tifQf/YnkHb1Js/XbiI - NwepYUMBwoNAAL19QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAC/gEAAv4BAALdxQQHXnEED2J9BQNmfQcHZn0H72J9B/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9ifQf/Zn0H72J9BwdSdQEHPlz0DvXVEAb+AQAC/gEAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qlUA/6pVAP+t - WQDBjC4A2Z5BJdmfQZTZn0Hy2Z9B/9ifQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Yn0H/2Z9B8tmfQZTXnUAlqHoqAP+v - WQD/q1UA/6tVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAOCaRQAIAEwA155AC9ieQWLZn0HQ2Z9B/dif - Qf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Yn0H+2Z9B/dmfQdDYnkFi155ACwoAUwDinEUA//8AAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA/6tWAP+sVgD/k2MAx4tCA9ieQS/YnkGg2Z9B7tmfQf/Yn0D+155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+2J9B/9mfQe7YnkGg2J5BL8eLQgP/k2MA/6xWAP+r - VgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAypc1APXnDwC4eD4Bn1w2ANab - Qg/Zn0FZ2Z9BxNmfQfjZn0H/2J5B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+2J9B/9mf - QfjZn0HE2Z9BWdabQg+fXDYAuHg+AfXnDwDKlzUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaVMQDjzRMAxopOAeGlUAHZoEEh2J5Bd9mfQdXZn0H72Z9B/9if - QP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD+2J9B/9mfQfvZn0HV2Z9BdtmgQSHhpVABxopOAePNEwDGlTEAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+q - VQD/q1gA7dAbAYdJLQDbnUUE2J9CKtmfQYLZn0HV2Z9B+tmfQf/Yn0D/155A/teeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7YnkD/2J9B/9ifQfrZn0HV2Z9Bg9if - QirgoEYEh0ktAO3QGwH/q1gA/6pVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/f4EA/3+BAP+fcgEMAIwA1pxIBNme - Qi7Zn0F72Z9BztmfQffZn0H/2J9B/tieQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie - QP7Yn0D+2J9B/9mfQffZn0HO2Z9Be9qfQi7ZlkMFAgCRAP+ecgH/f4EA/3+BAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD/gIAA/4CqANp/XADzpFQB/9emAN6gQQTZn0Ae2Z9CY9mfQbDZn0Hj2Z9B/dif - Qf/YnkH/2J5A/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD+2J5A/9ieQf/Yn0H/2Z9B/dmfQePZn0Gw2Z9CY9mfQB7eoEEE/+ezAPOm - VQHaf1wA/4CqAP+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9+ - hAD/foQA/6BzAY5EQwC6cUYB2Z9DEtmfQT7Zn0GB2Z9Bv9mfQezZn0H62Z9B/9ifQf/Yn0H+155A/tee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7YnkD+2J5B/9ifQf/Zn0H62Z9B7Nmf - Qb/Zn0GB2Z9BPtmfQxK6cUYBjkRDAP+gcwH/foQA/36EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA0KMtAN+pPwD/uGIAAAAAAOGi - SATbnkMV2aBBQtmfQXnZn0Gx2Z9B1tmfQfDZn0H+2Z9B/9mfQf/YnkH/2J5A/9eeQP/YnkD+155A/tee - QP7XnkD+155A/teeQP7XnkD+155A/teeQP7XnkD+155A/teeQP7XnkD+155A/teeQP/XnkD/2J5B/9if - Qf/Zn0H/2Z9B/tmfQfDZn0HW2Z9BsdmfQXnZoEFC255DFeGiSAQAAAAA/7hiAN+pPwDQoy0A//8AAP// - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+ZbAD/iHsA/6BoAbohkgCBMUIA3aFBAdmeQBHYnkEt2Z9AUtqf - QX/Zn0Gm2Z9ByNmfQePZn0Hx2Z9B9tmfQfrZn0H+2Z9B/9ieQf/YnkH/2J5B/9ieQf/YnkH/2J5B/9ie - Qf/YnkH/2Z9B/9mfQf7Zn0H62Z9B9tmfQfHZn0Hj2Z9ByNmfQabZn0F+2Z9AUtieQS3ZnkAR3aFBAYEx - QgC6IZIA/6BoAf+IewD/mWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADSgFMA635uANaMSgD/jXgB7qBwAQAAIAD//2kA46NHBNueRAvYn0MW2Z9CLtmfQEnZn0Fj2Z9Bedie - QYzZn0Ge2Z9BrNmfQbbZn0G82Z9Bv9mfQb/Zn0G82Z9BttmfQazZn0Ge2J5BjNmfQXnZn0Fj2Z9ASdmf - Qi7Yn0MW255EC+GkSgP///8AAAAbAO6gcAH/jXgB1oxKAOt+bgDSgFMAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/p1oA/94hAP+Z - awH/rGAB/2SnAP/B6gC9f2oAqngnAcCcGgDRpzoA0ao7AdudPwfZnD8M2KBBEdmgQxTaoEIX2qBCF9mg - QxTYoEER2Zw/DNudPwfRqjsB0ac6AMCcGgCqeCcBvX9qAP/B6gD/Y6YA/6xgAf+ZagH/3iEA/6daAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA/6NgAOOUUADLkzkB951ZAP/P - MQD/mW4B9qlcAbJxQwGhWz8Bj0U8AX0yOgF9MjoBj0U8AaFbPwGycUMB9qlcAf+ZbgH/zzEA951ZAMuT - OQHjlFAA/6NgAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////////4AAAB///////////////+AAAAAAf/////////////+AAAAAA - B/////////////8AAAAAAAD////////////8AAAAAAAAP///////////4AAAAAAAAAf//////////8AA - AAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////////+AAAAAAAAAAAH/////// - //AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////wAAAAAAAAAAAA////////wAAAAAAAAAAAAD/ - //////4AAAAAAAAAAAAAf//////8AAAAAAAAAAAAAD//////+AAAAAAAAAAAAAAf//////AAAAAAAAAA - AAAAD//////gAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAD/////4AAAAAAAAAAAAAAAf////8AAAAA - AAAAAAAAAAD////+AAAAAAAAAAAAAAAAf////AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///4 - AAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAA - B///wAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAf//gAAAAAAAAAAA - AAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAA - AAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAP/gA - AAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA - AB/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA - AAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAA - AAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAA8AA - AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA - AAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAA - AAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAA - AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AA - AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAA - AAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAA - AAAAAAAP8AAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAA - AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAv/4A - AAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAf/8AAAAAAAAAAAAAAAAA - AP//QAAAAAAAAAAAAAAAAAL//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAA - AAAAAAP//9AAAAAAAAAAAAAAAAAL///gAAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf///QAAAAA - AAAAAAAAAAAv///4AAAAAAAAAAAAAAAAH///+AAAAAAAAAAAAAAAAB////0AAAAAAAAAAAAAAAC////+ - AAAAAAAAAAAAAAAAf////gAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAB - /////9AAAAAAAAAAAAAAC//////gAAAAAAAAAAAAAAf/////9AAAAAAAAAAAAAAv//////gAAAAAAAAA - AAAAH//////9AAAAAAAAAAAAAL///////gAAAAAAAAAAAAB///////8AAAAAAAAAAAAA////////gAAA - AAAAAAAAAf///////8AAAAAAAAAAAAP////////wAAAAAAAAAAAP////////+AAAAAAAAAAAH/////// - //4AAAAAAAAAAH//////////AAAAAAAAAAD//////////8AAAAAAAAAD///////////gAAAAAAAAB/// - /////////AAAAAAAAD////////////4QAAAAAAh/////////////4AAAAAAH//////////////gAAAAA - H///////////////gEACAf////////////////AAAA////////////////////////////////////// - //////////////////////////////////8= - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs b/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs index 7fe6a797..4a9b49d4 100644 --- a/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs @@ -36,7 +36,6 @@ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(292, 273); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "BaseServerForm"; diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.cs b/v2rayN/v2rayN/Forms/BaseServerForm.cs index 84711727..9618c480 100644 --- a/v2rayN/v2rayN/Forms/BaseServerForm.cs +++ b/v2rayN/v2rayN/Forms/BaseServerForm.cs @@ -6,13 +6,14 @@ namespace v2rayN.Forms { public partial class BaseServerForm : BaseForm { - public int EditIndex { get; set; } - protected VmessItem vmessItem = null; + public VmessItem vmessItem = null; + public string groupId; + public EConfigType eConfigType; public BaseServerForm() { InitializeComponent(); - } - + } + } } diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.resx b/v2rayN/v2rayN/Forms/BaseServerForm.resx index 61360d3d..c5e46818 100644 --- a/v2rayN/v2rayN/Forms/BaseServerForm.resx +++ b/v2rayN/v2rayN/Forms/BaseServerForm.resx @@ -118,1136 +118,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAgAAAAIAAAACAAAAAwAA - AAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAADAAAAAwAAAAMAAAADAAAAAgAAAAIAAAACAAAAAQAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAA - AAIAAAADAAAABAAAAAUAAAAGAAAACAAAAAgAAAAKAAAACgAAAAsAAAAMAAAADQAAAA0AAAANAAAADQAA - AAwAAAALAAAACgAAAAoAAAAIAAAACAAAAAYAAAAFAAAABAAAAAMAAAACAAAAAQAAAAEAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAQAAAAIAAAACAAAABAAAAAUAAAAHAAAACQAAAAwAAAAOAAAAEQAAABMAAAAVAAAAFwAA - ABgAAAAaAAAAGwAAABwAAAAcAAAAHQAAAB0AAAAcAAAAHAAAABsAAAAaAAAAGAAAABcAAAAVAAAAEwAA - ABEAAAAOAAAADAAAAAkAAAAHAAAABQAAAAQAAAACAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAMAAAAEAAAABwAAAAkAAAAMAAAAEAAA - ABMAAAAXAAAAGgAAAB4BAQAgAgEBIwMDASUDAgEmAwMBKAUEASkGAwMrCAUDKwgFAysIBQMsCAUDLAgF - AysIBQMrBgMDKwUEASkDAwEoAwIBJgMDASUCAQEjAQEAIAAAAB4AAAAaAAAAFwAAABMAAAAQAAAADAAA - AAkAAAAHAAAABAAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA - AAQAAAAHAAAACgAAAA4AAAASAAAAFwAAABwAAAAgAwIBJAUDAicGBAIqBQUCKwICAi0FAwMvCQcEMQgH - BjACAwQwAAECMQYFBTURDgg5GRMJPBwWCz0cFgs9GRMJPBEOCDkGBQU1AAECMQICBDAIBwYwCQcEMQUD - Ay8CAgItBQUCKwYEAioFAwInAwIBJAAAACAAAAAcAAAAFwAAABIAAAAOAAAACgAAAAcAAAAEAAAAAgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAUAAAAIAAAADQAAABIAAAAXAQAAHQIBASIDAgEmBgMDKgQD - AywAAAEtBQQEMRYRCTckHA0+OCoTSlU/G19sUCF1elomhoZjKZWOaCufkmstqphwL7Kccy+3nnQwup51 - MLqccy+3mXEvspNsLaqOaSufh2QqlHtbJ4ZtTyJ1Vj8cXzgpE0okHA0+FhEJNwUEBDEAAAEtBAMDLAYD - AyoDAgEmAgEBIgAAAB0AAAAXAAAAEgAAAA0AAAAIAAAABQAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAADwAA - ABUAAAAcAgIAIgQCAicFBAErBAMDLgUEBDAWEQo5QjEWT2BHH2d6WiaHkGssq6B2MMWtfzTbt4Y367+M - OfXEjzv5yZM8/M2WPv7PmD7/0Zk//9KaP//Tmz//05s//9OaP//Smj//0Jg+/82WPv3KlD37xZA7+cCM - OvW4iDjrroA126F2McWRbCyre1smh2FHH2dCMRZPFhEKOQUEBDAEAwMuBQQBKwQCAicCAgAiAAAAHAAA - ABUAAAAPAAAACgAAAAYAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAABAAAAAwAAAAYAAAAKAAAAEAAAABcBAQAeAwIBJAYDAyoBAAEsBwUEMSIaDDxSPBtaelomhpRt - LbGoezPVt4Y37MSQO/nMlj3/0Zk//9WcQP/YnkH/2J5B/9ieQP/XnkD/155A/9eeQP7XnkD+155A/tee - QP7XnkD+155A/teeQP7XnkD+155A/9eeQP/YnkD/2J5B/9ieQf/WnED/0po//82WPf/FkTv5uog47Kp8 - M9WVbi6xelomh1E8GlshGQw8BwUFMgEAASwGAwMqAwIBJAEBAB4AAAAXAAAAEAAAAAoAAAAGAAAAAwAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAAEQAAABgBAQAgBAMBJgUD - AysDAgMvGRIKOVQ+G1p+XSiKm3MvvrKDNubCjjr5zZY+/tWcQP/XnUD/2J9B/tieQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/2J5A/9ifQf7XnUD/1ZxA/8+YPv7Djzv5s4M25pxyL799XCeLUj0bWhkT - CzkDAgMvBQMDKwQDASYBAQAfAAAAGAAAABEAAAAKAAAABgAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA - AAQAAAAJAAAADwAAABcBAQAfBAMBJgMCASsIBgQwMSQRQ2xQIXOUbS2xr4A14cOOO/nPmD7/1p1A/9ie - QP/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/tieQP/WnUD/0Jg+/8SPO/mvgTXhlG0usWtOInQwIxJDCAYEMAMCASsEAwEnAQEAHwAA - ABcAAAAPAAAACQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAHAAAADQAAABQBAQAdBQQBJQUFAiwGBQQwRDMXTXxc - J4ahdjHKuog48syVPf7VnED/155B/9ieQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/9Wc - QP/Nlj3+uok486B2Mcp6WiaGQjIWTgYFBDAEAwIsBAMBJQEBAB0AAAAUAAAADQAAAAcAAAADAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAACgAA - ABEAAAAaAwIBIwUDAioHBgQvQDAVSoFeKIynejLTv4w6+NCYPv/XnkD/155A/teeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7XnkD/0Jk+/8CNOvimejLTfl0njT0u - FEoGBQQvBQMCKgMCASMAAAAaAAAAEQAAAAoAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAEAAAADAAAABwAAAA0AAAAWAQAAHwQDASgDAgIuNScSRHxbJoOnejPSwY06+dKa - P//YnkD+2J5A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/2J5B/tObP//Bjjr5pXky03hZJoQzJhJEAwMCLgQDASgBAAAfAAAAFgAA - AA0AAAAHAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAgAAAAQAAAAGQQC - AiQDAQIqFBAINWlOIWuedDDBvos59dGZP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie - Qf/Smj//vYs59ZtyL8JlSh9sEw8INQMBAioEAgIkAAAAGQAAABAAAAAIAAAAAwAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAgAAAAQAAAAKAAAAEwIBAR0FAwInAQECLUg1GE2QaiyjtoU3686WPf/XnUD/2J5A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/zpc+/7SEN+yLZiqlRTMXTwEB - Ai4FAwInAgEBHQAAABMAAAAKAAAABAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAADAAAABUDAgEgBAIBKBoU - CTVxUyNxpnkyzcWQO/zVnED/2J5A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/1ZxA/8WQO/yidzHPak8hcxkTCTUEAgEoAwIBIAAAABUAAAAMAAAABQAA - AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAACAAAABgAAAA0AAAAXAwMBIgIBAis4KhNDj2ksm7iHN+7QmD7/155A/teeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/tCZ - Pv+2hTfviGQqnTUnEkUDAgIrAwMBIwAAABcAAAANAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAOAQEAGQQCAiQIBgMsXEQdWaB2 - Mb3Djzr51ZxA/9ieQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tacQP/Cjjr5mnAvv1U/G1sIBgMtBAICJAEB - ABkAAAAOAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAIAAAAHAAAADwEBABkFAwIlCQcDLnVWJHCvgDXZzJY9/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/LlT3/qHwz2m1QInIJBwMvBQMCJgEBABkAAAAPAAAABwAAAAIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAA8CAQAaAwIBJhIOBjJ/Xid+toY35tGZ - P//YnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ieQP7RmT7/sYI26HZX - JYARDQYzBAIBJgIBABoAAAAPAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA - AAYAAAAOAQEAGgYFASYjGgw4jGcrkLuJOO7Tmz//2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7UnD//toY374FeKJIgGAs5BgUBJwEBABoAAAAOAAAABgAA - AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAADQIBABkBAQEkLCENOpJrLZnAjTrz1Js//9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/VnED/u4k49IdjKZwpHw07AgEBJAIBABkAAAANAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAA - AAwBAQAXBgQBJSwiDjmXby2fw4469tadQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnUD/vYs594tmKqEqHg07BwUBJQEB - ABcAAAAMAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAAKAQEAFgMCASImHAw2lm4umMSPO/bVnED+155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/VnED+vos59ohkKZsiGgw4AwIBIgEBABYAAAAKAAAABAAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAACQEB - ABMGBAIhFQ8IMJJrLY/Djzrz1p1A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnUD/vIo59INh - KZMUDggxBgQCIQEBABMAAAAJAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAQBQICHQgGAyqHYyl8wI067tWcQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/VnED/uIc38HhYJYAIBgMrBQICHQAAABAAAAAGAAAAAgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAADQQD - ARoEAwEnf10mbr2LOebVnED/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/UnD//s4M26HBSInEFAwEnBAQBGgAAAA0AAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAoFAwIWAQABI2hNIFW5hzjY05o//9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/RmT//qn0021tCHFoDAQEjBAMCFgAA - AAoAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAHAwICEgAA - AB9GNBU/roA0vdCZPv7XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP7Mlj3/nXIwwTwsEkEAAAEfAwICEgAAAAcAAAACAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAA0GBAMbHRUJLaF2MJnMlT35155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Djzv6jGcrnhoT - CC8HBAMbAAAADQAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAJBgQDFgAA - ACOGYiluxpE779adQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ifQ//cq1n/2qVN/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9adQP+5hzfwc1QjcwAAACQGAwMWAAAACQAAAAMAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABgIBARAAAAEdW0MbR7mIN83Um0D/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/2KFH/+XCiP/pypf/26dS/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tGZ - P/+nejPRTjkYSgAAAR0CAQEQAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMBAAEKBgMDGBwU - CSypfDOh0Jg+/deeQf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Zokf/6cqX//jw5P/qzZ7/2aNL/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155B/seSPP2SayynGBEILQcDAxgBAAELAAAAAwAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAACAAAABwcEAxECAAIghWEoZciSPOvXnUD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/154//9iiR//pyZf//Pr3//n06//mw4v/2aRM/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/1p1A/reHN+1uUSFqBAICIAcEAhEAAAAHAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCAwALAAAAGE05 - Fzm6iDe/1ZtA/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f7+//jv - 4//nxY7/2aJJ/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/0Jg+/6F3McVBMBQ9AgIAGAID - AAsAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABggGAhIHBQMgnHMvf8+YPvbXnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//Yokf/6cmX//z69//9/f7//f39//jw4v/kvX//2aJI/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/YnkH/wY4694JhKIQIBgMhCAYCEgAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEBAELAQEAGFxC - G0DCjjrR151A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 - /f/9/f3//f39//bs3P/kv4L/2KFG/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Tmz//q3401Us3 - F0MCAgAYBQMBCwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABQkHARACAgEgpXgxh9KaP/rYnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//fz8//br2f/huHX/2KFF/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/FkDv7iWQpjQQCASEJBwERAAAABQAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDAwAJAAAAFWhL - H0HGkTzS2J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 - +P/9/f3//f39//39/f/9/f3//f39//Xo1P/iuXf/2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tSb - QP+tfzTWVD0ZRQAAABUDAwAJAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAABAAAABAsIAw4HBQIdpnkygNObP/nYnkH+155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//fz6//Tl - zv/fs2v/159C/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/sSQO/qJZCmHCQYCHgsIAw4AAAAEAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGBQEHBgYAE1Q+ - GTTFkTvI155B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ - l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//fz7//Pky//gtW3/159C/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/0po//6p8M85FMRQ4BwcBEwYFAQcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwkGBAsCAAEZnHMvatObP/LYnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//Pv4//Hfwf/er2H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/wI069H5cJnIDAgIZCQYECwAA - AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFCgQFDzUn - ESfAjTqt155B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii - R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pv5//Hfwv/esWb/155B/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP7QmD7/n3YwtCwhDioLBQYQAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQoJAQgAAAAShmIoTM+YPt/YnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//Pn1/+/Ztv/drFz/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9adQP+2hjfkaE0gUgAA - ABIJCQEIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEw0GCw4K - BRmygjWC1p1A+teeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7//Pn2/+/Y - tf/drV3/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/2J5B/siTPPuOaSuKDwsFGxMNBgsAAAADAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUEAAQEBAANRjQVKMiSPLrYnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7/+/fx/+3Uq//bqVX/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/0po//6h7 - M8I2JxErBgUADQUEAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDgoFBgYE - AhGOaCpK05s/5tieQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f7/+/fy/+zSqP/bqVX/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnUD/vIk56m1PIVMJBQMSDgoEBgAAAAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIUEQMIAAAAFLSENnvXnUH5155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7/+vTs/+rOof/apk//154//9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie - QP/Ikzz6jWgrhAAAABUUEQMIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxcP - Bws+LBMhyJI8rdieQf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3/+vTs/+rMnP/apU7/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5A/tKZP/+keDK0MSMPJRcPBwsAAAADAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQADAAAADIRgJznRmT/S2J9B/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+fHm/+jJ - lv/Zo0r/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/1p1A/7SFNthlSh5AAAAADAABAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARsV - BgUAAAAMpXkyV9acQOvYnkH/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+PLm/+fGj//Zo0r/154//9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH/wY06735cJl4AAAANGRQFBgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIxcMBwwHBRK7iTl82J5B/NeeQf7XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/fz/9+7g/+bDi//YoUb/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9ieQf7LlT38lGwthg8KBhQiFgsHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAEQCAcIQS4UG8iSPKLZn0H/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pz/9+7g/+S/gv/YoUf/154//9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5A/tGZPv+leTGsMyQPHRMK - CAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAABkVw0ACwoAAgAAAAhcQxwizpg+wdmfQf/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 - +P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/Pz/9erX/+S+gP/YoEP/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/1ZxA/7CBNchCMBQmAgEACAoKAAJLQQoAAAAAAAAAAAAAAAAAAAAAAAAA - AAAcEQsCBwAFCodiKTPUmz/c2J5B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/9uvZ/+K5 - dv/YoEX/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnUH/uog34GRK - HjoLBAYKGxALAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8VCgMLBgQLpXkxTNadQO7YnkH/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ - l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/8+TM/+G3c//Xn0L/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9ieQf/Cjjrwf10mVQ4IBQweFAoDAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAIBcJAwsIAg21hDZj155A9deeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/8+/r/9ObR/9+zaf/YoEP/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/8eS - PPeOaCtsDgoEDR8WCQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVDgcEAAABDL+MOXfXnkH4155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii - R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/8d/C/9+yaf/Xn0H/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/y5U9+phwLoAAAAIMFQ4HBAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAASAfAQQAAAAMxpA7idieQfzXnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/8+/n/8uDF/92vYv/Xn0L/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Plz79oHYwkAAAAAwfHgEEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABKxoQBQwKBQ/JkzyX2J5B/tee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/8+/n/79m2/92t - X//XnkH/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tGZP/+leTKeDAkFEigYDwUAAAABAAAAAAAA - AAAAAAAAAAAAAAAAAAE4IxUFRC8UE82WPaTYnkH/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/8+vf/8Nu6/9ysW//Xn0H/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD+05s//6x+M6s0JBEYNiMTBgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAS8eEAZcQhwXz5g+rtie - Qf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/7+fX/7NOq/9upV//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Um0D/sIE0tEYzFhwvHhEGAAAAAQAA - AAAAAAAAAAAAAAAAAAAAAAABKRoPBmlMIBnQmT+12J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/7+PP/7dWu/9uoVf/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/tWcQP+0gza7UzoYHioaDwYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAE5Kg4FcVMiGtGZ - PrjYnkH/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/69u//6s2d/9qmT//Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+1ZxA/7WENr5aQBkfOSsPBgAA - AAEAAAAAAAAAAAAAAAAAAAAAAAAAADwsDwV1VSIa0Zk+uNieQf/XnkD+155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/69vD/69Ci/9qm - UP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP7VnED/tYU2vltCGh89LRAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCATBHNU - IhjSmj+12J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/58+n/6MiU/9qkTP/Xnj//155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tWcQP+1hTa6WUAaHTUh - EwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBKRcEa04gFdGZP67YnkH/155A/teeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /v/58uj/6MiU/9mkS//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD+1ZtA/7ODNbRSPRcaPSYWBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFM0 - HgRbQhwQ0Jg+pdieQf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/37+H/5cGH/9miSP/Xnj//155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Tmz//sIE0q0Uy - FhVKLxoEAAAAAAAAAAAAAAAAAAAAAAAAAACCRD4AYC4xAyQXDArPlz6W2J5B/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//YoUf/6cmX//z6 - 9//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/7+PT/+fLo//38+//9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/37uD/5cKI/9iiSP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/tKaP/+rfTOdHRMKDlQpKwNpNzIAAAAAAAAAAAAAAAAAAAAAACQb - CgBVPhcCAAAABs2WPYfYnkH8155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/154//9ihR//pyZf//Pr3//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f7///ft3v/pypn/9ejT//38+//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/P/27Nv/471//9ih - Rf/Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkD/0Jg+/ah7 - Mo4AAAAHUDsWAiMaCQAAAAAAAAAAAAAAAAAAAAAAPzMNADUvCgEAAAAFyZM9ddieQfnYnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ - l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/96wZP/ht3P/8+TM//z7 - +v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/P/26tj/47x9/9igRP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Nlj36pHgxfQAAAAU2MAoBPzMNAAAAAAAAAAAAAAAAAAAA - AABuUB4AVj8XARsTBQbGkDte2J5B9deeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//3+///26tn/3a5f/9igQ//htnD/8+LJ//z7+f/9/f7//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//38 - +v/159P/4rh0/9ifQ//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/8mT - PPadcy9nIBcHBlE7FgFmShsAAAAAAAAAAAAAAAAAAAAAAH1bIgBrTh0BKB0JBcCMOkbYnkHu2J5B/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii - R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150+/9ef - Qv/gs2v/8d/B//z6+P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//38+//05c7/4bdy/9efQv/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH/xZE78JduLU8rHwoFYEYaAW1QHgAAAAAAAAAAAAAA - AAAAAAAAi1M4ALluSwASABEDsYI2LNedQN3Zn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9efQv/fsWf/8d6///z59v/9/f7//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//z7+P/z48r/37Nq/9eeQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie - Qf/AjTnghGIoMhsGEgOPVToAckQuAAAAAAAAAAAAAAAAAAAAAAB/dAsAvasRAAARAAKacC4Y1ZxAwdmf - Qf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9ed - P//XnkD/155A/9eeQf/esGT/79m3//v49P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//z7+f/x4MP/37Np/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/1ZxA/7mHN8dwUiIbCh4AArGgEAB6bwoAAAAAAAAA - AAAAAAAAAAAAAEZHAAAADwAATT8MAolkKQ7Smj+g2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9efQf/drV7/7tex//v3 - 8P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//z59v/w3sD/3a5g/9eeQf/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Smj//soI2qWhMIBBZSA8CABAAAEdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAALR4PACfZzcBRTAXBs+Y - PnjZn0H92J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92u - YP/XnT//155A/9eeQP/XnkD/155A/9eeQP/cq1n/69Gl//r28P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//v6 - 9v/v2rf/3q5h/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J9A/s6XPf2pfDOBOygVCIpZMAKVYzIAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAt25JAL9yTQEAAAAAyJI8TtieQezYn0H/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9ee - QP/bqVT/69Gl//r17P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//v48//u2LT/26lW/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/YnkH+yJI87590MFQAAAABlVk8AY5WOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADixB0A/+AeAAAA - AADAjDkt151A0tmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq - 2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/aqFP/6cuZ//n07P/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//v49P/s0qj/3KpY/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9edQP+/jDnXlGwsMgAAAADjyBsAy7AaAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcPx4AfU8rAqF1MBHVnD+r2Z9B/9ieQP7XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/apU3/6cyb//nx5v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//r27v/s0af/2qVO/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/YnkD+1JtA/7eGNrF3VyQWdksoAlM5GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdO - GQCMdxUBAAAAAtGZPnTZn0H52J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+ - ///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//apEz/5sSL//ny - 5//9/Pz//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f3+//v48v/py5r/2qdS/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ifQP7Olz76rX40fAAAAAONeBUBZU0ZAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArXY3AMqKQQAtFhICyJM9PtieQejYnkH/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yokj/58eR//fv4f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//nz - 6f/pyZf/2aNL/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/2J5B/8aRO+ueczBGOSAVAq53OACZaDEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AACSghAAtrAHAAADAAGwgDYV1p1AutmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - P//Yokf/5L6B//ft3v/8/Pr//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//r17f/nxpH/2qVN/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/VnED/u4k4wIJfKBgbGAABop0GAId4 - DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+dEsAvWpTAXdSJgXSmj972Z9B/Nie - QP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 - +P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YoEX/5cGF//br2f/9/fz//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//jw4//mxIz/2KJH/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/2J5B/s+YPv2xgjWDWz0cB6pgSQGkZEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAO+CbgD+iXYA//+JAMuUPTvYnkHf2J9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/YoET/4bh1//Xo1P/8+/n//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//ny6P/lwof/2aNJ/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/xZA746J3MUH//4YA8oJxAd55 - ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJMKACQVDgBtIM3Etad - QKvZn0H/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KFH/+nJ - l//8+vf//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YoET/4rp5//Tn - 0P/9/Pv//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//bs3P/kvX//2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/2J5A/tObP/+6iDiwiGMrFZpcOQFrRyYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAnVxAALlxSAEAABMB0po/XtmfQfTYnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - Qf/Xn0L/159C/9efQv/Xn0L/159C/9efQv/Zo0n/6cqY//z6+P/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0L/37Jn//Lgxf/8+vf//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//fu - 4P/kvX7/2KFG/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH+y5U99q6ANGUGABcCn2E+AY1T - OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyiycAyJ0rAB4k - AAHDjzse155BydmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2qZQ/+K5dv/kvoH/5L6A/+S+gP/kvoD/5L6A/+XA - hf/v27r//Pv5//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Yn0L/4LNr//LgxP/8+/n//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//fz7//Tn0v/iuXb/2J9D/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9WdQP/AjTrNmXEuITk1AAGphSUAm3kiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKfU4AynRVAaNvNQPUmz922Z9B+tifQP7XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - P//gtGz/9OjU//r38P/69u//+vbv//r27//69u//+vbw//v59f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0H/3a5g/+/auP/8+fT//f3+//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//fz8//Xo1P/iuHT/2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0D+zpc9+7OENn10UCYFv25PAbRw - RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+B - gwD/i5AA//91AMuWPSzYnkHS2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/150//+C2b//37uD//f7+//39/v/9/f7//f3+//39 - /v/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9ed - P//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/Xn0H/3a9h/+/Ztv/7+fX//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pv6//LiyP/fs2v/159B/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9adQP/EkDrWo3gxMf//ZAC2Wl0AqlVWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZaPQDLZWYBjmcpBdWcP37Zn0H62J9A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnT//4LZv//fu3//9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/3KtZ/+3U - rf/69/D//f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//Pv5//Lhxv/fsmj/159C/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkD/z5g++7eGNoRoSx4GolBQAX9L - MwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAwXFRANB5VwBGAEQBzZc+KNieQdLZn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9edP//gtm//9+7f//39/v/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92u - YP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/3KpZ/+zSqf/69vD//f3+//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pr3//Dd - vf/er2P/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9adQP/FkDvVpnozLFoORQG3a00ArGRJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/mswA87wPAP/AWgDCjzUD1p1Ac9mf - QfjYn0D+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/150//+C2b//37t///f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/26hT/+rPov/69Oz//f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 - /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7//Pr2/+/bu//drV//155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0D+z5g++bmIN3mMaSUE/+FqAPSv - DgD/v/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD//wAA//8AAP/+agDTmkEf2J5Bv9mfQf/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnT//4LZv//fu4P/9/v7//f3+//39 - /v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//v7///br - 2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/26hU/+rMnf/59Or//f3+//39 - /v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39 - /v/9/f7/+/n1/+7Xs//drFz/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9WdQP/EkDvDrH00Iv//dwD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGdVEA1YJTAF4h - PQHVnEBW2Z9B7difQf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeP//gtW3/9erY//z59v/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z5 - 9f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+vf/9OfS/92tX//XnT//155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/2qVP/+nJlv/37+H//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z5 - 9f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX/+fPq/+zSqP/bp1P/154//9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+zZY97riHN1pbJTECtm9HAbBo - SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+sVQD/3nIAwXpDAceROw3XnkGd2Z9B/tifQP7XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9upV//mxYz/6syb/+rM - m//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rM - nP/mw4n/2qZP/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2qVO/+O9 - f//pzJr/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rM - m//qzJv/6syb/+rMm//qzJv/58WO/9yrW//Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/tObP//CjjqhnnIvD7RzPgHLh0UAwIFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfK - HgDu0xsA5aVJANKZPy7YnkHO2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155B/9igQ//YoET/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9ig - Q//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBE/9ifQ//XnkH/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/159C/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9ig - Q//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9igRP/YoET/159C/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnkD/yZM80bKCNjHVmkcA9tkcAOfK - HgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaSNADwpkgBpXwvA9acP2HZn0Hy2J9B/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/2J5B/8+YPvO9iThliGQpBMuNPQG8ijEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA6s8bAOXPFgD//wAAzZc8C9edQJPZn0H62J9B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9efQP7Tmz/7xJA7l6h9MQz//wAA5ccWAOrP - GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6pWAP+wWQD//0MA0Jg/JNif - Qb/Zn0H/2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/YnkD+1p1A/8qUPcG0hDcn//9RAP+0WwD/qlYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAwIs2AMaKPABOQBEB151AP9mfQdrZn0H/2J5A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQf/Plz7cwIw5QlxRGwHWlEAAyJE4AAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP+7 - dgDXik8B151BW9mfQejZn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Yn0D/0Zo/6cSPO16dYz0C/+KKAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gIAA/3yEAP+6egDVmj8H2J5Ac9mfQfHYn0H+155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tSbP/LJkjx2sYA1CP/ikQD/fIQA/4CAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADAgEAAxIVAAKJbQAHOlj4O2J5AitmfQfbYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9if - QP7VnD/3ypQ9jbKAOA++bkkBwoRAAMGBQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/gEAAxYRCAP///wDOmD4U2J9Bldmf - QfrYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0H+155A+82XPZi3hzgW//9PAMeGQwC/gEAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAADSpiwA0qoqAMabGQDUmj8Z2J5BntmfQfrYn0H+155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J9A/tee - QPrRmT6gwo07GvrDIgDUrCoA1qktAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD/4CcA/+seAMN8 - TwDZnkEY2Z9BltmfQffYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9ieQP7XnkD30po/mMiTPBm6dUkA/+0eAP/gJwD//wAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3SsA//YVAPHUHgDVm0EU2Z5Bi9mfQfLZn0H/2J5A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0D/2J5A8tOa - P4zGkD0V//8qAP/4FQD/4iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// - AAB+AIEAyZQ3AP//SADUmkAO2Z9BdNmfQejZn0H/2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD+2J5B/9edQOnTmj91xo88D///KgDKlTcAfgCBAP//AAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6ekAAv4FAAJ5YPwHJlj4G2Z5BXNmf - QdvZn0H/2J9B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/159A/tifQf/YnkHb1Js/XbiI - NwepYUMBwoNAAL19QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAC/gEAAv4BAALdxQQHXnEED2J9BQNmfQcHZn0H72J9B/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9ifQf/Zn0H72J9BwdSdQEHPlz0DvXVEAb+AQAC/gEAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qlUA/6pVAP+t - WQDBjC4A2Z5BJdmfQZTZn0Hy2Z9B/9ifQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Yn0H/2Z9B8tmfQZTXnUAlqHoqAP+v - WQD/q1UA/6tVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAOCaRQAIAEwA155AC9ieQWLZn0HQ2Z9B/dif - Qf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/Yn0H+2Z9B/dmfQdDYnkFi155ACwoAUwDinEUA//8AAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA/6tWAP+sVgD/k2MAx4tCA9ieQS/YnkGg2Z9B7tmfQf/Yn0D+155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+2J9B/9mfQe7YnkGg2J5BL8eLQgP/k2MA/6xWAP+r - VgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAypc1APXnDwC4eD4Bn1w2ANab - Qg/Zn0FZ2Z9BxNmfQfjZn0H/2J5B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+2J9B/9mf - QfjZn0HE2Z9BWdabQg+fXDYAuHg+AfXnDwDKlzUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaVMQDjzRMAxopOAeGlUAHZoEEh2J5Bd9mfQdXZn0H72Z9B/9if - QP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD+2J9B/9mfQfvZn0HV2Z9BdtmgQSHhpVABxopOAePNEwDGlTEAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+q - VQD/q1gA7dAbAYdJLQDbnUUE2J9CKtmfQYLZn0HV2Z9B+tmfQf/Yn0D/155A/teeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7YnkD/2J9B/9ifQfrZn0HV2Z9Bg9if - QirgoEYEh0ktAO3QGwH/q1gA/6pVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/f4EA/3+BAP+fcgEMAIwA1pxIBNme - Qi7Zn0F72Z9BztmfQffZn0H/2J9B/tieQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie - QP7Yn0D+2J9B/9mfQffZn0HO2Z9Be9qfQi7ZlkMFAgCRAP+ecgH/f4EA/3+BAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD/gIAA/4CqANp/XADzpFQB/9emAN6gQQTZn0Ae2Z9CY9mfQbDZn0Hj2Z9B/dif - Qf/YnkH/2J5A/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD+2J5A/9ieQf/Yn0H/2Z9B/dmfQePZn0Gw2Z9CY9mfQB7eoEEE/+ezAPOm - VQHaf1wA/4CqAP+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9+ - hAD/foQA/6BzAY5EQwC6cUYB2Z9DEtmfQT7Zn0GB2Z9Bv9mfQezZn0H62Z9B/9ifQf/Yn0H+155A/tee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee - QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7YnkD+2J5B/9ifQf/Zn0H62Z9B7Nmf - Qb/Zn0GB2Z9BPtmfQxK6cUYBjkRDAP+gcwH/foQA/36EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA0KMtAN+pPwD/uGIAAAAAAOGi - SATbnkMV2aBBQtmfQXnZn0Gx2Z9B1tmfQfDZn0H+2Z9B/9mfQf/YnkH/2J5A/9eeQP/YnkD+155A/tee - QP7XnkD+155A/teeQP7XnkD+155A/teeQP7XnkD+155A/teeQP7XnkD+155A/teeQP/XnkD/2J5B/9if - Qf/Zn0H/2Z9B/tmfQfDZn0HW2Z9BsdmfQXnZoEFC255DFeGiSAQAAAAA/7hiAN+pPwDQoy0A//8AAP// - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+ZbAD/iHsA/6BoAbohkgCBMUIA3aFBAdmeQBHYnkEt2Z9AUtqf - QX/Zn0Gm2Z9ByNmfQePZn0Hx2Z9B9tmfQfrZn0H+2Z9B/9ieQf/YnkH/2J5B/9ieQf/YnkH/2J5B/9ie - Qf/YnkH/2Z9B/9mfQf7Zn0H62Z9B9tmfQfHZn0Hj2Z9ByNmfQabZn0F+2Z9AUtieQS3ZnkAR3aFBAYEx - QgC6IZIA/6BoAf+IewD/mWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADSgFMA635uANaMSgD/jXgB7qBwAQAAIAD//2kA46NHBNueRAvYn0MW2Z9CLtmfQEnZn0Fj2Z9Bedie - QYzZn0Ge2Z9BrNmfQbbZn0G82Z9Bv9mfQb/Zn0G82Z9BttmfQazZn0Ge2J5BjNmfQXnZn0Fj2Z9ASdmf - Qi7Yn0MW255EC+GkSgP///8AAAAbAO6gcAH/jXgB1oxKAOt+bgDSgFMAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/p1oA/94hAP+Z - awH/rGAB/2SnAP/B6gC9f2oAqngnAcCcGgDRpzoA0ao7AdudPwfZnD8M2KBBEdmgQxTaoEIX2qBCF9mg - QxTYoEER2Zw/DNudPwfRqjsB0ac6AMCcGgCqeCcBvX9qAP/B6gD/Y6YA/6xgAf+ZagH/3iEA/6daAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA/6NgAOOUUADLkzkB951ZAP/P - MQD/mW4B9qlcAbJxQwGhWz8Bj0U8AX0yOgF9MjoBj0U8AaFbPwGycUMB9qlcAf+ZbgH/zzEA951ZAMuT - OQHjlFAA/6NgAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAA////////4AAAB///////////////+AAAAAAf/////////////+AAAAAA - B/////////////8AAAAAAAD////////////8AAAAAAAAP///////////4AAAAAAAAAf//////////8AA - AAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////////+AAAAAAAAAAAH/////// - //AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////wAAAAAAAAAAAA////////wAAAAAAAAAAAAD/ - //////4AAAAAAAAAAAAAf//////8AAAAAAAAAAAAAD//////+AAAAAAAAAAAAAAf//////AAAAAAAAAA - AAAAD//////gAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAD/////4AAAAAAAAAAAAAAAf////8AAAAA - AAAAAAAAAAD////+AAAAAAAAAAAAAAAAf////AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///4 - AAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAA - B///wAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAf//gAAAAAAAAAAA - AAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAA - AAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAP/gA - AAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA - AB/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA - AAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAA - AAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAA8AA - AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA - AAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAA - AAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAA - AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AA - AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAA - AAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAA - AAAAAAAP8AAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAA - AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAv/4A - AAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAf/8AAAAAAAAAAAAAAAAA - AP//QAAAAAAAAAAAAAAAAAL//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAA - AAAAAAP//9AAAAAAAAAAAAAAAAAL///gAAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf///QAAAAA - AAAAAAAAAAAv///4AAAAAAAAAAAAAAAAH///+AAAAAAAAAAAAAAAAB////0AAAAAAAAAAAAAAAC////+ - AAAAAAAAAAAAAAAAf////gAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAB - /////9AAAAAAAAAAAAAAC//////gAAAAAAAAAAAAAAf/////9AAAAAAAAAAAAAAv//////gAAAAAAAAA - AAAAH//////9AAAAAAAAAAAAAL///////gAAAAAAAAAAAAB///////8AAAAAAAAAAAAA////////gAAA - AAAAAAAAAf///////8AAAAAAAAAAAAP////////wAAAAAAAAAAAP////////+AAAAAAAAAAAH/////// - //4AAAAAAAAAAH//////////AAAAAAAAAAD//////////8AAAAAAAAAD///////////gAAAAAAAAB/// - /////////AAAAAAAAD////////////4QAAAAAAh/////////////4AAAAAAH//////////////gAAAAA - H///////////////gEACAf////////////////AAAA////////////////////////////////////// - //////////////////////////////////8= - - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.Designer.cs similarity index 59% rename from v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs rename to v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.Designer.cs index f14d46e4..ba25fdee 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.Designer.cs @@ -1,6 +1,6 @@ namespace v2rayN.Forms { - partial class AddServer6Form + partial class GlobalHotkeySettingForm { /// /// Required designer variable. @@ -28,25 +28,24 @@ /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer6Form)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GlobalHotkeySettingForm)); this.btnClose = new System.Windows.Forms.Button(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.label4 = new System.Windows.Forms.Label(); - this.txtRequestHost = new System.Windows.Forms.TextBox(); - this.label13 = new System.Windows.Forms.Label(); - this.txtRemarks = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.txtId = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.txtPort = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.txtAddress = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); this.panel2 = new System.Windows.Forms.Panel(); + this.btnReset = new System.Windows.Forms.Button(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); - this.groupBox1.SuspendLayout(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txtGlobalHotkey3 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtGlobalHotkey2 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtGlobalHotkey1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.txtGlobalHotkey0 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); this.panel2.SuspendLayout(); + this.panel1.SuspendLayout(); this.SuspendLayout(); // // btnClose @@ -57,85 +56,21 @@ this.btnClose.UseVisualStyleBackColor = true; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); // - // groupBox1 - // - resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Controls.Add(this.txtRequestHost); - this.groupBox1.Controls.Add(this.label13); - this.groupBox1.Controls.Add(this.txtRemarks); - this.groupBox1.Controls.Add(this.label6); - this.groupBox1.Controls.Add(this.txtId); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.txtPort); - this.groupBox1.Controls.Add(this.label2); - this.groupBox1.Controls.Add(this.txtAddress); - this.groupBox1.Controls.Add(this.label1); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.TabStop = false; - // - // label4 - // - resources.ApplyResources(this.label4, "label4"); - this.label4.Name = "label4"; - // - // txtRequestHost - // - resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); - this.txtRequestHost.Name = "txtRequestHost"; - // - // label13 - // - resources.ApplyResources(this.label13, "label13"); - this.label13.Name = "label13"; - // - // txtRemarks - // - resources.ApplyResources(this.txtRemarks, "txtRemarks"); - this.txtRemarks.Name = "txtRemarks"; - // - // label6 - // - resources.ApplyResources(this.label6, "label6"); - this.label6.Name = "label6"; - // - // txtId - // - resources.ApplyResources(this.txtId, "txtId"); - this.txtId.Name = "txtId"; - // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // txtPort - // - resources.ApplyResources(this.txtPort, "txtPort"); - this.txtPort.Name = "txtPort"; - // - // label2 - // - resources.ApplyResources(this.label2, "label2"); - this.label2.Name = "label2"; - // - // txtAddress - // - resources.ApplyResources(this.txtAddress, "txtAddress"); - this.txtAddress.Name = "txtAddress"; - // - // label1 - // - resources.ApplyResources(this.label1, "label1"); - this.label1.Name = "label1"; - // // panel2 // resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.btnReset); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); this.panel2.Name = "panel2"; // + // btnReset + // + resources.ApplyResources(this.btnReset, "btnReset"); + this.btnReset.Name = "btnReset"; + this.btnReset.UseVisualStyleBackColor = true; + this.btnReset.Click += new System.EventHandler(this.btnReset_Click); + // // btnOK // resources.ApplyResources(this.btnOK, "btnOK"); @@ -146,44 +81,106 @@ // panel1 // resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Controls.Add(this.label6); + this.panel1.Controls.Add(this.label5); + this.panel1.Controls.Add(this.txtGlobalHotkey3); + this.panel1.Controls.Add(this.label4); + this.panel1.Controls.Add(this.txtGlobalHotkey2); + this.panel1.Controls.Add(this.label3); + this.panel1.Controls.Add(this.txtGlobalHotkey1); + this.panel1.Controls.Add(this.label1); + this.panel1.Controls.Add(this.txtGlobalHotkey0); + this.panel1.Controls.Add(this.label2); this.panel1.Name = "panel1"; // - // AddServer6Form + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.ForeColor = System.Drawing.Color.Red; + this.label6.Name = "label6"; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.ForeColor = System.Drawing.Color.Red; + this.label5.Name = "label5"; + // + // txtGlobalHotkey3 + // + resources.ApplyResources(this.txtGlobalHotkey3, "txtGlobalHotkey3"); + this.txtGlobalHotkey3.Name = "txtGlobalHotkey3"; + this.txtGlobalHotkey3.ReadOnly = true; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // txtGlobalHotkey2 + // + resources.ApplyResources(this.txtGlobalHotkey2, "txtGlobalHotkey2"); + this.txtGlobalHotkey2.Name = "txtGlobalHotkey2"; + this.txtGlobalHotkey2.ReadOnly = true; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtGlobalHotkey1 + // + resources.ApplyResources(this.txtGlobalHotkey1, "txtGlobalHotkey1"); + this.txtGlobalHotkey1.Name = "txtGlobalHotkey1"; + this.txtGlobalHotkey1.ReadOnly = true; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // txtGlobalHotkey0 + // + resources.ApplyResources(this.txtGlobalHotkey0, "txtGlobalHotkey0"); + this.txtGlobalHotkey0.Name = "txtGlobalHotkey0"; + this.txtGlobalHotkey0.ReadOnly = true; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // GlobalHotkeySettingForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.panel2); this.Controls.Add(this.panel1); + this.Controls.Add(this.panel2); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MinimizeBox = true; - this.Name = "AddServer6Form"; - this.Load += new System.EventHandler(this.AddServer6Form_Load); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); + this.Name = "GlobalHotkeySettingForm"; + this.Load += new System.EventHandler(this.GlobalHotkeySettingForm_Load); this.panel2.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); this.ResumeLayout(false); } #endregion - - private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.Button btnClose; private System.Windows.Forms.Button btnOK; - private System.Windows.Forms.TextBox txtRemarks; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.TextBox txtId; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox txtPort; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.TextBox txtAddress; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.Label label13; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TextBox txtGlobalHotkey0; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtGlobalHotkey3; private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox txtRequestHost; + private System.Windows.Forms.TextBox txtGlobalHotkey2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtGlobalHotkey1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Button btnReset; + private System.Windows.Forms.Label label6; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs new file mode 100644 index 00000000..0bf81688 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.Forms +{ + public partial class GlobalHotkeySettingForm : BaseForm + { + List lstKey; + public GlobalHotkeySettingForm() + { + InitializeComponent(); + } + + private void GlobalHotkeySettingForm_Load(object sender, EventArgs e) + { + if (config.globalHotkeys == null) + { + config.globalHotkeys = new List(); + } + + foreach (EGlobalHotkey it in Enum.GetValues(typeof(EGlobalHotkey))) + { + if (config.globalHotkeys.FindIndex(t => t.eGlobalHotkey == it) >= 0) + { + continue; + } + + config.globalHotkeys.Add(new KeyEventItem() + { + eGlobalHotkey = it, + Alt = false, + Control = false, + Shift = false, + KeyCode = null + }); + } + + lstKey = Utils.DeepCopy(config.globalHotkeys); + + txtGlobalHotkey0.KeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey1.KeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey2.KeyDown += TxtGlobalHotkey_KeyDown; + txtGlobalHotkey3.KeyDown += TxtGlobalHotkey_KeyDown; + + BindingData(-1); + } + + private void TxtGlobalHotkey_KeyDown(object sender, KeyEventArgs e) + { + var txt = ((TextBox)sender); + var index = Utils.ToInt(txt.Name.Substring(txt.Name.Length - 1, 1)); + + lstKey[index].KeyCode = e.KeyCode; + lstKey[index].Alt = e.Alt; + lstKey[index].Control = e.Control; + lstKey[index].Shift = e.Shift; + + BindingData(index); + } + + private void BindingData(int index) + { + for (int k = 0; k < lstKey.Count; k++) + { + if (index >= 0 && index != k) + { + continue; + } + var item = lstKey[k]; + var keys = string.Empty; + + if (item.Control) + { + keys += $"{Keys.Control.ToString()} + "; + } + if (item.Alt) + { + keys += $"{Keys.Alt.ToString()} + "; + } + if (item.Shift) + { + keys += $"{Keys.Shift.ToString()} + "; + } + if (item.KeyCode != null) + { + keys += $"{item.KeyCode.ToString()}"; + } + + panel1.Controls[$"txtGlobalHotkey{k}"].Text = keys; + } + } + + private void btnOK_Click(object sender, EventArgs e) + { + config.globalHotkeys = lstKey; + + if (ConfigHandler.SaveConfig(ref config, false) == 0) + { + DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(ResUI.OperationFailed); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void btnReset_Click(object sender, EventArgs e) + { + lstKey.Clear(); + foreach (EGlobalHotkey it in Enum.GetValues(typeof(EGlobalHotkey))) + { + if (lstKey.FindIndex(t => t.eGlobalHotkey == it) >= 0) + { + continue; + } + + lstKey.Add(new KeyEventItem() + { + eGlobalHotkey = it, + Alt = false, + Control = false, + Shift = false, + KeyCode = null + }); + } + BindingData(-1); + } + } +} diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.resx similarity index 72% rename from v2rayN/v2rayN/Forms/AddServer6Form.resx rename to v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.resx index 6d3c8975..62c49a4f 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.resx +++ b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.resx @@ -117,410 +117,407 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 - - Server address + Clear system proxy - - - 3 + + + NoControl System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bottom - - NoControl + + 1 - - txtPort + + + 75, 23 - + + panel2 + + + panel1 + + + &Reset + + + True - - Alias (remarks) + + 0 System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl + btnOK - - txtRemarks - - - - 194, 21 + + panel2 System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 5 + - AddServer6Form + GlobalHotkeySettingForm label1 - - 359, 21 + + 189, 138 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 34 - - groupBox1 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 37 panel2 - 12, 155 + 18, 215 - - Fill + + 6 - 53, 12 + 101, 12 - - 127, 123 + + 8 - - 194, 21 + + 75, 23 - - groupBox1 + + NoControl - - 6, 12 + + NoControl - - 396, 17 + + Take effect after restart - - True + + 278, 21 - - label3 - - - 127, 154 - - - True + + 189, 18 - 6 + 11 7 - groupBox1 - - - 113, 12 + panel1 - 12, 93 + 18, 103 - - 10 + + 18, 190 - - Server + + panel1 - - 3 + + 278, 21 System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 - - - txtRequestHost + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 547, 60 + 527, 60 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 113, 12 - - groupBox1 + + 32 - - 359, 21 - - - Edit or add a [Trojan] server - - - 359, 21 + + txtGlobalHotkey2 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - * + + label5 - - groupBox1 + + 527, 242 - - * Fill in manually + + 211, 17 - - 11 + + 9 - 10 + 40 71, 12 - - 24 + + panel1 - - label4 - - - txtId - - - 303, 17 - - - $this + + panel1 75, 23 + + 1 + + + panel1 + + + 18, 22 + + + label4 + + + txtGlobalHotkey1 + + + 33 + + + Do not change system proxy + + + Set system proxy + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + txtGlobalHotkey0 + + + 39 + btnClose - - Host(SNI) + + 303, 17 - - label6 + + 0, 242 - - 5 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Password - - - 75, 23 - - - 1 - - - txtAddress + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - groupBox1 + panel1 - Top + Fill - - 0, 10 - - - 4 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 547, 221 - - - 2 - - - groupBox1 - - - 4 - - + 3 - - 127, 27 + + btnReset - - 5 + + 6, 12 - - groupBox1 + + 6 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 189, 58 - - 23 + + 0 - - 127, 59 + + 7 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + panel1 + + + NoControl + + + 36 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 31 + + + NoControl + + + True + + + 278, 21 True + + NoControl + + + 189, 99 + + + label2 + + + label3 + True - - 89, 12 + + Set directly by pressing the keyboard - - groupBox1 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 0 - - 547, 10 - - - 8 - &Cancel - 12, 31 + 18, 62 &OK - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 + 1 - Server port + Display GUI - 4 + 35 - - 337, 158 + + NoControl - + True - - 12, 62 - - - 127, 91 + + panel1 - 12, 126 + 18, 142 - - 7 + + 2 $this - 59, 12 + 161, 12 - - 1 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + 227, 12 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null 0, 0 - - 1 - - - label13 - - - 5 - - - 95, 12 - - - label2 - - - 2 - - + panel2 - - 0, 231 + + 4 - - 22 + + 155, 12 - - 9 + + GlobalHotkey Setting + + + 2 + + + 5 - 547, 291 + 527, 302 - - 0 + + 4 - - v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + 38 - - groupBox1 + + txtGlobalHotkey3 + + + 278, 21 $this - - 6 + + 396, 17 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 + + label6 - - panel2 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 panel1 @@ -528,10 +525,13 @@ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 2 + + panel1 True + + 25 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.zh-Hans.resx similarity index 91% rename from v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx rename to v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.zh-Hans.resx index 375c223d..06a7a69c 100644 --- a/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/GlobalHotkeySettingForm.zh-Hans.resx @@ -120,44 +120,47 @@ 取消(&C) - - 服务器 + + 重置(&R) - - 域名(SNI) - - - *手填,方便识别管理 + + 确定(&O) - 83, 12 + 65, 12 - 别名(remarks) + 重启后生效 - - 29, 12 + + 113, 12 + + + 直接按键盘进行设置 + + + 89, 12 + + + 不改变系统代理 - 密码 + 自动配置系统代理 + + + 77, 12 + + + 清除系统代理 65, 12 - 服务器端口 - - - 65, 12 - - - 服务器地址 - - - 确定(&O) + 显示主界面 - 编辑或添加[Trojan]服务器 + 全局热键设置 \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs new file mode 100644 index 00000000..9dfcc635 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.Designer.cs @@ -0,0 +1,105 @@ +namespace v2rayN.Forms +{ + partial class GroupSettingControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GroupSettingControl)); + this.grbMain = new System.Windows.Forms.GroupBox(); + this.btnRemove = new System.Windows.Forms.Button(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.numSort = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); + this.grbMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numSort)).BeginInit(); + this.SuspendLayout(); + // + // grbMain + // + this.grbMain.Controls.Add(this.label1); + this.grbMain.Controls.Add(this.numSort); + this.grbMain.Controls.Add(this.btnRemove); + this.grbMain.Controls.Add(this.txtRemarks); + this.grbMain.Controls.Add(this.label2); + resources.ApplyResources(this.grbMain, "grbMain"); + this.grbMain.Name = "grbMain"; + this.grbMain.TabStop = false; + // + // btnRemove + // + resources.ApplyResources(this.btnRemove, "btnRemove"); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.UseVisualStyleBackColor = true; + this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click); + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // numSort + // + resources.ApplyResources(this.numSort, "numSort"); + this.numSort.Name = "numSort"; + this.numSort.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // GroupSettingControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.grbMain); + this.Name = "GroupSettingControl"; + this.Load += new System.EventHandler(this.GroupSettingControl_Load); + this.grbMain.ResumeLayout(false); + this.grbMain.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numSort)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grbMain; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button btnRemove; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.NumericUpDown numSort; + } +} diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.cs b/v2rayN/v2rayN/Forms/GroupSettingControl.cs new file mode 100644 index 00000000..07abc73d --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.cs @@ -0,0 +1,61 @@ +using System; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class GroupSettingControl : UserControl + { + public event ChangeEventHandler OnButtonClicked; + + + public GroupItem groupItem + { + get; set; + } + + public GroupSettingControl() + { + InitializeComponent(); + } + + private void GroupSettingControl_Load(object sender, EventArgs e) + { + Height = grbMain.Height; + BindingSub(); + } + + private void BindingSub() + { + if (groupItem != null) + { + txtRemarks.Text = groupItem.remarks.ToString(); + numSort.Value = groupItem.sort; + } + } + private void EndBindingSub() + { + if (groupItem != null) + { + groupItem.remarks = txtRemarks.Text.TrimEx(); + groupItem.sort = Convert.ToInt32(numSort.Value); + } + } + private void txtRemarks_Leave(object sender, EventArgs e) + { + EndBindingSub(); + } + + private void btnRemove_Click(object sender, EventArgs e) + { + if (groupItem != null) + { + groupItem.remarks = string.Empty; + } + + OnButtonClicked?.Invoke(sender, e); + } + } +} diff --git a/v2rayN/v2rayN/Forms/GroupSettingControl.resx b/v2rayN/v2rayN/Forms/GroupSettingControl.resx new file mode 100644 index 00000000..75f7057e --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.resx @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + True + + + + NoControl + + + + 12, 61 + + + 71, 12 + + + 26 + + + Sort number + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 0 + + + 127, 57 + + + 120, 21 + + + 25 + + + numSort + + + System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 1 + + + NoControl + + + 525, 21 + + + 75, 23 + + + 24 + + + Remove + + + btnRemove + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 2 + + + 127, 21 + + + 292, 21 + + + 1 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 3 + + + True + + + NoControl + + + 12, 25 + + + 47, 12 + + + 10 + + + Remarks + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + 4 + + + Fill + + + 0, 0 + + + 619, 91 + + + 10 + + + Group details + + + grbMain + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 12 + + + 619, 91 + + + GroupSettingControl + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx similarity index 78% rename from v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx rename to v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx index e2cbcede..34dd0092 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/GroupSettingControl.zh-Hans.resx @@ -117,62 +117,20 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 取消(&C) - - - 服务器 - - - *手填,方便识别管理 + + 移除 - - 83, 12 - - - 别名(remarks) - - - 53, 12 - - - 加密方式 - - + 29, 12 - - 密码 - - - 65, 12 - - 服务器端口 + 备注 - - 65, 12 + + 分组详情 - 服务器地址 - - - 确定(&O) - - - 92, 21 - - - 导入配置文件 - - - 171, 22 - - - 从剪贴板导入URL - - - 编辑或添加[Shadowsocks]服务器 + 排序编号 \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs new file mode 100644 index 00000000..1eedb2ee --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.Designer.cs @@ -0,0 +1,97 @@ +namespace v2rayN.Forms +{ + partial class GroupSettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GroupSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panCon = new System.Windows.Forms.Panel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // panCon + // + resources.ApplyResources(this.panCon, "panCon"); + this.panCon.Name = "panCon"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnAdd); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnAdd + // + resources.ApplyResources(this.btnAdd, "btnAdd"); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.UseVisualStyleBackColor = true; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // GroupSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panCon); + this.Controls.Add(this.panel2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "GroupSettingForm"; + this.Load += new System.EventHandler(this.GroupSettingForm_Load); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Panel panCon; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.cs b/v2rayN/v2rayN/Forms/GroupSettingForm.cs new file mode 100644 index 00000000..77860153 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.Forms +{ + public partial class GroupSettingForm : BaseForm + { + List lstControls = new List(); + + public GroupSettingForm() + { + InitializeComponent(); + } + + private void GroupSettingForm_Load(object sender, EventArgs e) + { + if (config.groupItem == null) + { + config.groupItem = new List(); + } + + RefreshGroupsView(); + } + + /// + /// 刷新列表 + /// + private void RefreshGroupsView() + { + panCon.Controls.Clear(); + lstControls.Clear(); + + for (int k = config.groupItem.Count - 1; k >= 0; k--) + { + GroupItem item = config.groupItem[k]; + if (Utils.IsNullOrEmpty(item.remarks)) + { + if (!Utils.IsNullOrEmpty(item.id)) + { + ConfigHandler.RemoveGroupItem(ref config, item.id); + } + config.groupItem.RemoveAt(k); + } + } + + foreach (GroupItem item in config.groupItem) + { + GroupSettingControl control = new GroupSettingControl(); + control.OnButtonClicked += Control_OnButtonClicked; + control.groupItem = item; + control.Dock = DockStyle.Top; + + panCon.Controls.Add(control); + panCon.Controls.SetChildIndex(control, 0); + + lstControls.Add(control); + } + } + + private void Control_OnButtonClicked(object sender, EventArgs e) + { + RefreshGroupsView(); + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (ConfigHandler.SaveGroupItem(ref config) == 0) + { + DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(ResUI.OperationFailed); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void btnAdd_Click(object sender, EventArgs e) + { + AddGroup(); + + RefreshGroupsView(); + } + + + private void AddGroup() + { + GroupItem groupItem = new GroupItem + { + id = string.Empty, + remarks = "Group" + }; + config.groupItem.Add(groupItem); + } + } +} diff --git a/v2rayN/v2rayN/Forms/GroupSettingForm.resx b/v2rayN/v2rayN/Forms/GroupSettingForm.resx new file mode 100644 index 00000000..043f3152 --- /dev/null +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.resx @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + NoControl + + + + 448, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + True + + + Fill + + + 0, 0 + + + 614, 351 + + + 10 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + NoControl + + + 47, 17 + + + 75, 23 + + + 6 + + + &Add + + + btnAdd + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 355, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 351 + + + 614, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 614, 411 + + + Group settings + + + GroupSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.resx b/v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx similarity index 93% rename from v2rayN/v2rayN/Forms/QRCodeForm.resx rename to v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx index 1af7de15..0d4dba82 100644 --- a/v2rayN/v2rayN/Forms/QRCodeForm.resx +++ b/v2rayN/v2rayN/Forms/GroupSettingForm.zh-Hans.resx @@ -117,4 +117,16 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 取消(&C) + + + 添加(&A) + + + 确定(&O) + + + 服务器分组设置 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 86a73954..6a76630c 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -30,7 +30,7 @@ { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.scMain = new System.Windows.Forms.SplitContainer(); + this.scServers = new System.Windows.Forms.SplitContainer(); this.lvServers = new v2rayN.Base.ListViewFlickerFree(); this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components); this.menuAddVmessServer = new System.Windows.Forms.ToolStripMenuItem(); @@ -46,7 +46,10 @@ this.menuRemoveDuplicateServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuCopyServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuSetDefaultServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuServerFilter = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.menuMoveToGroup = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveEvent = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); @@ -57,65 +60,63 @@ this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuRealPingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSortServerResult = new System.Windows.Forms.ToolStripMenuItem(); this.tsbTestMe = new System.Windows.Forms.ToolStripMenuItem(); + this.menuClearServerStatistics = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); this.menuExport2ClientConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem(); - this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); + this.tabGroup = new System.Windows.Forms.TabControl(); + this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); + this.scBig = new System.Windows.Forms.SplitContainer(); + this.gbServers = new System.Windows.Forms.GroupBox(); + this.mainMsgControl = new v2rayN.Forms.MainMsgControl(); this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components); this.cmsMain = new System.Windows.Forms.ContextMenuStrip(this.components); this.menuSysAgentMode = new System.Windows.Forms.ToolStripMenuItem(); - this.menuNotEnabledHttp = new System.Windows.Forms.ToolStripMenuItem(); + this.menuKeepClear = new System.Windows.Forms.ToolStripMenuItem(); this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem(); - this.menuGlobalPAC = new System.Windows.Forms.ToolStripMenuItem(); - this.menuKeep = new System.Windows.Forms.ToolStripMenuItem(); - this.menuKeepPAC = new System.Windows.Forms.ToolStripMenuItem(); this.menuKeepNothing = new System.Windows.Forms.ToolStripMenuItem(); - this.menuKeepPACNothing = new System.Windows.Forms.ToolStripMenuItem(); + this.menuRoutings = new System.Windows.Forms.ToolStripMenuItem(); this.menuServers = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem(); this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem(); - this.menuCopyPACUrl = new System.Windows.Forms.ToolStripMenuItem(); this.menuUpdateSubscriptions = new System.Windows.Forms.ToolStripMenuItem(); + this.menuUpdateSubViaProxy = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.menuExit = new System.Windows.Forms.ToolStripMenuItem(); - this.bgwScan = new System.ComponentModel.BackgroundWorker(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.txtMsgBox = new System.Windows.Forms.TextBox(); - this.ssMain = new System.Windows.Forms.StatusStrip(); - this.toolSslSocksPortLab = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslSocksPort = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslHttpPortLab = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslHttpPort = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslPacPortLab = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslPacPort = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); this.panel1 = new System.Windows.Forms.Panel(); this.tsMain = new System.Windows.Forms.ToolStrip(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); this.tsbSub = new System.Windows.Forms.ToolStripDropDownButton(); this.tsbSubSetting = new System.Windows.Forms.ToolStripMenuItem(); this.tsbSubUpdate = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbSubUpdateViaProxy = new System.Windows.Forms.ToolStripMenuItem(); this.tsbQRCodeSwitch = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.tsbOptionSetting = new System.Windows.Forms.ToolStripButton(); + this.tsbSetting = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsbOptionSetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbRoutingSetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbGlobalHotkeySetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbGroupSetting = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbBackupGuiNConfig = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); this.tsbReload = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); this.tsbCheckUpdate = new System.Windows.Forms.ToolStripDropDownButton(); this.tsbCheckUpdateN = new System.Windows.Forms.ToolStripMenuItem(); this.tsbCheckUpdateCore = new System.Windows.Forms.ToolStripMenuItem(); - this.tsbCheckUpdatePACList = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.tsbCheckClearPACList = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdateXrayCore = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbCheckUpdateClashCore = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdateClashMetaCore = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbCheckUpdateGeo = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); this.tsbHelp = new System.Windows.Forms.ToolStripDropDownButton(); this.tsbAbout = new System.Windows.Forms.ToolStripMenuItem(); @@ -126,39 +127,40 @@ this.tsbPromotion = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); this.tsbClose = new System.Windows.Forms.ToolStripButton(); - ((System.ComponentModel.ISupportInitialize)(this.scMain)).BeginInit(); - this.scMain.Panel1.SuspendLayout(); - this.scMain.Panel2.SuspendLayout(); - this.scMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.scServers)).BeginInit(); + this.scServers.Panel1.SuspendLayout(); + this.scServers.Panel2.SuspendLayout(); + this.scServers.SuspendLayout(); this.cmsLv.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.scBig)).BeginInit(); + this.scBig.Panel1.SuspendLayout(); + this.scBig.Panel2.SuspendLayout(); + this.scBig.SuspendLayout(); + this.gbServers.SuspendLayout(); this.cmsMain.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.ssMain.SuspendLayout(); this.tsMain.SuspendLayout(); this.SuspendLayout(); // - // scMain + // scServers // - resources.ApplyResources(this.scMain, "scMain"); - this.scMain.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; - this.scMain.Name = "scMain"; + resources.ApplyResources(this.scServers, "scServers"); + this.scServers.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.scServers.Name = "scServers"; // - // scMain.Panel1 + // scServers.Panel1 // - resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); - this.scMain.Panel1.Controls.Add(this.lvServers); + this.scServers.Panel1.Controls.Add(this.lvServers); + this.scServers.Panel1.Controls.Add(this.tabGroup); // - // scMain.Panel2 + // scServers.Panel2 // - resources.ApplyResources(this.scMain.Panel2, "scMain.Panel2"); - this.scMain.Panel2.Controls.Add(this.qrCodeControl); - this.scMain.TabStop = false; + this.scServers.Panel2.Controls.Add(this.qrCodeControl); + this.scServers.TabStop = false; // // lvServers // - resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.FullRowSelect = true; this.lvServers.GridLines = true; this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -177,7 +179,6 @@ // // cmsLv // - resources.ApplyResources(this.cmsLv, "cmsLv"); this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20); this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuAddVmessServer, @@ -193,230 +194,301 @@ this.menuRemoveDuplicateServer, this.menuCopyServer, this.menuSetDefaultServer, + this.menuServerFilter, this.toolStripSeparator3, - this.menuMoveTop, - this.menuMoveUp, - this.menuMoveDown, - this.menuMoveBottom, + this.menuMoveToGroup, + this.menuMoveEvent, this.menuSelectAll, this.toolStripSeparator9, this.menuPingServer, this.menuTcpingServer, this.menuRealPingServer, this.menuSpeedServer, + this.menuSortServerResult, this.tsbTestMe, + this.menuClearServerStatistics, this.toolStripSeparator6, this.menuExport2ClientConfig, this.menuExport2ServerConfig, this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; + resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer // - resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Name = "menuAddVmessServer"; + resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click); // // menuAddVlessServer // - resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Name = "menuAddVlessServer"; + resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); this.menuAddVlessServer.Click += new System.EventHandler(this.menuAddVlessServer_Click); // // menuAddShadowsocksServer // - resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; + resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click); // // menuAddSocksServer // - resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Name = "menuAddSocksServer"; + resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click); // // menuAddTrojanServer // - resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Name = "menuAddTrojanServer"; + resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); this.menuAddTrojanServer.Click += new System.EventHandler(this.menuAddTrojanServer_Click); // // menuAddCustomServer // - resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Name = "menuAddCustomServer"; + resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click); // // menuAddServers // - resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Name = "menuAddServers"; + resources.ApplyResources(this.menuAddServers, "menuAddServers"); this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen // - resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Name = "menuScanScreen"; + resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click); // // toolStripSeparator1 // - resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); // // menuRemoveServer // - resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Name = "menuRemoveServer"; + resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click); // // menuRemoveDuplicateServer // - resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer"; + resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click); // // menuCopyServer // - resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Name = "menuCopyServer"; + resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click); // // menuSetDefaultServer // - resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Name = "menuSetDefaultServer"; + resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); // + // menuServerFilter + // + this.menuServerFilter.Name = "menuServerFilter"; + resources.ApplyResources(this.menuServerFilter, "menuServerFilter"); + this.menuServerFilter.Click += new System.EventHandler(this.menuServerFilter_Click); + // // toolStripSeparator3 // - resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); this.toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); + // + // menuMoveToGroup + // + this.menuMoveToGroup.Name = "menuMoveToGroup"; + resources.ApplyResources(this.menuMoveToGroup, "menuMoveToGroup"); + this.menuMoveToGroup.Click += new System.EventHandler(this.menuMoveToGroup_Click); + // + // menuMoveEvent + // + this.menuMoveEvent.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuMoveTop, + this.menuMoveUp, + this.menuMoveDown, + this.menuMoveBottom}); + this.menuMoveEvent.Name = "menuMoveEvent"; + resources.ApplyResources(this.menuMoveEvent, "menuMoveEvent"); // // menuMoveTop // - resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Name = "menuMoveTop"; + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); // // menuMoveUp // - resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Name = "menuMoveUp"; + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); // // menuMoveDown // - resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Name = "menuMoveDown"; + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); // // menuMoveBottom // - resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Name = "menuMoveBottom"; + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // // menuSelectAll // - resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // toolStripSeparator9 // - resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); this.toolStripSeparator9.Name = "toolStripSeparator9"; + resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); // // menuPingServer // - resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Name = "menuPingServer"; + resources.ApplyResources(this.menuPingServer, "menuPingServer"); this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click); // // menuTcpingServer // - resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Name = "menuTcpingServer"; + resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click); // // menuRealPingServer // - resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Name = "menuRealPingServer"; + resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click); // // menuSpeedServer // - resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Name = "menuSpeedServer"; + resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); // + // menuSortServerResult + // + this.menuSortServerResult.Name = "menuSortServerResult"; + resources.ApplyResources(this.menuSortServerResult, "menuSortServerResult"); + this.menuSortServerResult.Click += new System.EventHandler(this.menuSortServerResult_Click); + // // tsbTestMe // - resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Name = "tsbTestMe"; + resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // + // menuClearServerStatistics + // + this.menuClearServerStatistics.Name = "menuClearServerStatistics"; + resources.ApplyResources(this.menuClearServerStatistics, "menuClearServerStatistics"); + this.menuClearServerStatistics.Click += new System.EventHandler(this.menuClearStatistic_Click); + // // toolStripSeparator6 // - resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); this.toolStripSeparator6.Name = "toolStripSeparator6"; + resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); // // menuExport2ClientConfig // - resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; + resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click); // // menuExport2ServerConfig // - resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; + resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click); // // menuExport2ShareUrl // - resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; + resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click); // // menuExport2SubContent // - resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Name = "menuExport2SubContent"; + resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); // + // tsbServer + // + this.tsbServer.DropDown = this.cmsLv; + this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + resources.ApplyResources(this.tsbServer, "tsbServer"); + this.tsbServer.Name = "tsbServer"; + // + // tabGroup + // + resources.ApplyResources(this.tabGroup, "tabGroup"); + this.tabGroup.Name = "tabGroup"; + this.tabGroup.SelectedIndex = 0; + this.tabGroup.SelectedIndexChanged += new System.EventHandler(this.tabGroup_SelectedIndexChanged); + // // qrCodeControl // resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); this.qrCodeControl.Name = "qrCodeControl"; // - // tsbServer + // scBig // - resources.ApplyResources(this.tsbServer, "tsbServer"); - this.tsbServer.DropDown = this.cmsLv; - this.tsbServer.Image = global::v2rayN.Properties.Resources.server; - this.tsbServer.Name = "tsbServer"; + resources.ApplyResources(this.scBig, "scBig"); + this.scBig.Name = "scBig"; + // + // scBig.Panel1 + // + this.scBig.Panel1.Controls.Add(this.gbServers); + // + // scBig.Panel2 + // + this.scBig.Panel2.Controls.Add(this.mainMsgControl); + // + // gbServers + // + this.gbServers.Controls.Add(this.scServers); + resources.ApplyResources(this.gbServers, "gbServers"); + this.gbServers.Name = "gbServers"; + this.gbServers.TabStop = false; + // + // mainMsgControl + // + resources.ApplyResources(this.mainMsgControl, "mainMsgControl"); + this.mainMsgControl.Name = "mainMsgControl"; // // notifyMain // - resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.ContextMenuStrip = this.cmsMain; + resources.ApplyResources(this.notifyMain, "notifyMain"); this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); // // cmsMain // - resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); + resources.ApplyResources(this.cmsMain, "cmsMain"); this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuSysAgentMode, + this.menuRoutings, this.menuServers, + this.toolStripSeparator13, this.menuAddServers2, this.menuScanScreen2, - this.menuCopyPACUrl, this.menuUpdateSubscriptions, + this.menuUpdateSubViaProxy, this.toolStripSeparator2, this.menuExit}); this.cmsMain.Name = "contextMenuStrip1"; @@ -426,206 +498,81 @@ // // menuSysAgentMode // - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.menuNotEnabledHttp, + this.menuKeepClear, this.menuGlobal, - this.menuGlobalPAC, - this.menuKeep, - this.menuKeepPAC, - this.menuKeepNothing, - this.menuKeepPACNothing}); + this.menuKeepNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // - // menuNotEnabledHttp + // menuKeepClear // - resources.ApplyResources(this.menuNotEnabledHttp, "menuNotEnabledHttp"); - this.menuNotEnabledHttp.Name = "menuNotEnabledHttp"; - this.menuNotEnabledHttp.Click += new System.EventHandler(this.menuNotEnabledHttp_Click); + this.menuKeepClear.Name = "menuKeepClear"; + resources.ApplyResources(this.menuKeepClear, "menuKeepClear"); + this.menuKeepClear.Click += new System.EventHandler(this.menuKeepClear_Click); // // menuGlobal // - resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Name = "menuGlobal"; + resources.ApplyResources(this.menuGlobal, "menuGlobal"); this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // - // menuGlobalPAC - // - resources.ApplyResources(this.menuGlobalPAC, "menuGlobalPAC"); - this.menuGlobalPAC.Name = "menuGlobalPAC"; - this.menuGlobalPAC.Click += new System.EventHandler(this.menuGlobalPAC_Click); - // - // menuKeep - // - resources.ApplyResources(this.menuKeep, "menuKeep"); - this.menuKeep.Name = "menuKeep"; - this.menuKeep.Click += new System.EventHandler(this.menuKeep_Click); - // - // menuKeepPAC - // - resources.ApplyResources(this.menuKeepPAC, "menuKeepPAC"); - this.menuKeepPAC.Name = "menuKeepPAC"; - this.menuKeepPAC.Click += new System.EventHandler(this.menuKeepPAC_Click); - // // menuKeepNothing // - resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Name = "menuKeepNothing"; + resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); // - // menuKeepPACNothing + // menuRoutings // - resources.ApplyResources(this.menuKeepPACNothing, "menuKeepPACNothing"); - this.menuKeepPACNothing.Name = "menuKeepPACNothing"; - this.menuKeepPACNothing.Click += new System.EventHandler(this.menuKeepPACNothing_Click); + this.menuRoutings.Name = "menuRoutings"; + resources.ApplyResources(this.menuRoutings, "menuRoutings"); // // menuServers // - resources.ApplyResources(this.menuServers, "menuServers"); this.menuServers.Name = "menuServers"; + resources.ApplyResources(this.menuServers, "menuServers"); + // + // toolStripSeparator13 + // + this.toolStripSeparator13.Name = "toolStripSeparator13"; + resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); // // menuAddServers2 // - resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Name = "menuAddServers2"; + resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen2 // - resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Name = "menuScanScreen2"; + resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); // - // menuCopyPACUrl - // - resources.ApplyResources(this.menuCopyPACUrl, "menuCopyPACUrl"); - this.menuCopyPACUrl.Name = "menuCopyPACUrl"; - this.menuCopyPACUrl.Click += new System.EventHandler(this.menuCopyPACUrl_Click); - // // menuUpdateSubscriptions // - resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; + resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); // + // menuUpdateSubViaProxy + // + this.menuUpdateSubViaProxy.Name = "menuUpdateSubViaProxy"; + resources.ApplyResources(this.menuUpdateSubViaProxy, "menuUpdateSubViaProxy"); + this.menuUpdateSubViaProxy.Click += new System.EventHandler(this.menuUpdateSubViaProxy_Click); + // // toolStripSeparator2 // - resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); this.toolStripSeparator2.Name = "toolStripSeparator2"; + resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); // // menuExit // - resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Name = "menuExit"; + resources.ApplyResources(this.menuExit, "menuExit"); this.menuExit.Click += new System.EventHandler(this.menuExit_Click); // - // bgwScan - // - this.bgwScan.WorkerReportsProgress = true; - this.bgwScan.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwScan_DoWork); - this.bgwScan.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgwScan_ProgressChanged); - // - // groupBox1 - // - resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Controls.Add(this.scMain); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.TabStop = false; - // - // groupBox2 - // - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Controls.Add(this.txtMsgBox); - this.groupBox2.Controls.Add(this.ssMain); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; - // - // txtMsgBox - // - resources.ApplyResources(this.txtMsgBox, "txtMsgBox"); - this.txtMsgBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(41)))), ((int)(((byte)(49)))), ((int)(((byte)(52))))); - this.txtMsgBox.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228))))); - this.txtMsgBox.Name = "txtMsgBox"; - this.txtMsgBox.ReadOnly = true; - // - // ssMain - // - resources.ApplyResources(this.ssMain, "ssMain"); - this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolSslSocksPortLab, - this.toolSslSocksPort, - this.toolSslBlank1, - this.toolSslHttpPortLab, - this.toolSslHttpPort, - this.toolSslBlank2, - this.toolSslPacPortLab, - this.toolSslPacPort, - this.toolSslBlank3, - this.toolSslServerSpeed, - this.toolSslBlank4}); - this.ssMain.Name = "ssMain"; - this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); - // - // toolSslSocksPortLab - // - resources.ApplyResources(this.toolSslSocksPortLab, "toolSslSocksPortLab"); - this.toolSslSocksPortLab.Name = "toolSslSocksPortLab"; - // - // toolSslSocksPort - // - resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); - this.toolSslSocksPort.Name = "toolSslSocksPort"; - // - // toolSslBlank1 - // - resources.ApplyResources(this.toolSslBlank1, "toolSslBlank1"); - this.toolSslBlank1.Name = "toolSslBlank1"; - this.toolSslBlank1.Spring = true; - // - // toolSslHttpPortLab - // - resources.ApplyResources(this.toolSslHttpPortLab, "toolSslHttpPortLab"); - this.toolSslHttpPortLab.Name = "toolSslHttpPortLab"; - // - // toolSslHttpPort - // - resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); - this.toolSslHttpPort.Name = "toolSslHttpPort"; - // - // toolSslBlank2 - // - resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); - this.toolSslBlank2.Name = "toolSslBlank2"; - this.toolSslBlank2.Spring = true; - // - // toolSslPacPortLab - // - resources.ApplyResources(this.toolSslPacPortLab, "toolSslPacPortLab"); - this.toolSslPacPortLab.Name = "toolSslPacPortLab"; - // - // toolSslPacPort - // - resources.ApplyResources(this.toolSslPacPort, "toolSslPacPort"); - this.toolSslPacPort.Name = "toolSslPacPort"; - // - // toolSslBlank3 - // - resources.ApplyResources(this.toolSslBlank3, "toolSslBlank3"); - this.toolSslBlank3.Name = "toolSslBlank3"; - this.toolSslBlank3.Spring = true; - // - // toolSslServerSpeed - // - resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed"); - this.toolSslServerSpeed.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolSslServerSpeed.Name = "toolSslServerSpeed"; - // - // toolSslBlank4 - // - resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); - this.toolSslBlank4.Name = "toolSslBlank4"; - // // panel1 // resources.ApplyResources(this.panel1, "panel1"); @@ -633,7 +580,6 @@ // // tsMain // - resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.ImageScalingSize = new System.Drawing.Size(32, 32); this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbServer, @@ -641,7 +587,7 @@ this.tsbSub, this.tsbQRCodeSwitch, this.toolStripSeparator8, - this.tsbOptionSetting, + this.tsbSetting, this.toolStripSeparator5, this.tsbReload, this.toolStripSeparator7, @@ -651,121 +597,190 @@ this.tsbPromotion, this.toolStripSeparator11, this.tsbClose}); + resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.Name = "tsMain"; this.tsMain.TabStop = true; // // toolStripSeparator4 // - resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); this.toolStripSeparator4.Name = "toolStripSeparator4"; + resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); // // tsbSub // - resources.ApplyResources(this.tsbSub, "tsbSub"); this.tsbSub.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbSubSetting, - this.tsbSubUpdate}); + this.tsbSubUpdate, + this.tsbSubUpdateViaProxy}); this.tsbSub.Image = global::v2rayN.Properties.Resources.sub; + resources.ApplyResources(this.tsbSub, "tsbSub"); this.tsbSub.Name = "tsbSub"; // // tsbSubSetting // - resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Name = "tsbSubSetting"; + resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click); // // tsbSubUpdate // - resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Name = "tsbSubUpdate"; + resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); this.tsbSubUpdate.Click += new System.EventHandler(this.tsbSubUpdate_Click); // + // tsbSubUpdateViaProxy + // + this.tsbSubUpdateViaProxy.Name = "tsbSubUpdateViaProxy"; + resources.ApplyResources(this.tsbSubUpdateViaProxy, "tsbSubUpdateViaProxy"); + this.tsbSubUpdateViaProxy.Click += new System.EventHandler(this.tsbSubUpdateViaProxy_Click); + // // tsbQRCodeSwitch // - resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); this.tsbQRCodeSwitch.CheckOnClick = true; this.tsbQRCodeSwitch.ForeColor = System.Drawing.Color.Black; this.tsbQRCodeSwitch.Image = global::v2rayN.Properties.Resources.share; + resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); this.tsbQRCodeSwitch.Name = "tsbQRCodeSwitch"; this.tsbQRCodeSwitch.CheckedChanged += new System.EventHandler(this.tsbQRCodeSwitch_CheckedChanged); // // toolStripSeparator8 // - resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); this.toolStripSeparator8.Name = "toolStripSeparator8"; + resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); + // + // tsbSetting + // + this.tsbSetting.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbOptionSetting, + this.tsbRoutingSetting, + this.tsbGlobalHotkeySetting, + this.tsbGroupSetting, + this.toolStripSeparator14, + this.tsbBackupGuiNConfig}); + this.tsbSetting.Image = global::v2rayN.Properties.Resources.option; + resources.ApplyResources(this.tsbSetting, "tsbSetting"); + this.tsbSetting.Name = "tsbSetting"; // // tsbOptionSetting // - resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); - this.tsbOptionSetting.Image = global::v2rayN.Properties.Resources.option; this.tsbOptionSetting.Name = "tsbOptionSetting"; + resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // + // tsbRoutingSetting + // + this.tsbRoutingSetting.Name = "tsbRoutingSetting"; + resources.ApplyResources(this.tsbRoutingSetting, "tsbRoutingSetting"); + this.tsbRoutingSetting.Click += new System.EventHandler(this.tsbRoutingSetting_Click); + // + // tsbGlobalHotkeySetting + // + this.tsbGlobalHotkeySetting.Name = "tsbGlobalHotkeySetting"; + resources.ApplyResources(this.tsbGlobalHotkeySetting, "tsbGlobalHotkeySetting"); + this.tsbGlobalHotkeySetting.Click += new System.EventHandler(this.tsbGlobalHotkeySetting_Click); + // + // tsbGroupSetting + // + this.tsbGroupSetting.Name = "tsbGroupSetting"; + resources.ApplyResources(this.tsbGroupSetting, "tsbGroupSetting"); + this.tsbGroupSetting.Click += new System.EventHandler(this.tsbGroupSetting_Click); + // + // toolStripSeparator14 + // + this.toolStripSeparator14.Name = "toolStripSeparator14"; + resources.ApplyResources(this.toolStripSeparator14, "toolStripSeparator14"); + // + // tsbBackupGuiNConfig + // + this.tsbBackupGuiNConfig.Name = "tsbBackupGuiNConfig"; + resources.ApplyResources(this.tsbBackupGuiNConfig, "tsbBackupGuiNConfig"); + this.tsbBackupGuiNConfig.Click += new System.EventHandler(this.tsbBackupGuiNConfig_Click); + // // toolStripSeparator5 // - resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); this.toolStripSeparator5.Name = "toolStripSeparator5"; + resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); // // tsbReload // + this.tsbReload.Image = global::v2rayN.Properties.Resources.restart; resources.ApplyResources(this.tsbReload, "tsbReload"); this.tsbReload.Name = "tsbReload"; this.tsbReload.Click += new System.EventHandler(this.tsbReload_Click); // // toolStripSeparator7 // - resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); this.toolStripSeparator7.Name = "toolStripSeparator7"; + resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); // // tsbCheckUpdate // - resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbCheckUpdateN, this.tsbCheckUpdateCore, - this.tsbCheckUpdatePACList, - this.toolStripSeparator13, - this.tsbCheckClearPACList}); + this.tsbCheckUpdateXrayCore, + this.toolStripSeparator16, + this.tsbCheckUpdateClashCore, + this.tsbCheckUpdateClashMetaCore, + this.toolStripSeparator15, + this.tsbCheckUpdateGeo}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; + resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.Name = "tsbCheckUpdate"; // // tsbCheckUpdateN // - resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; + resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click); // // tsbCheckUpdateCore // - resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; + resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); // - // tsbCheckUpdatePACList + // tsbCheckUpdateXrayCore // - resources.ApplyResources(this.tsbCheckUpdatePACList, "tsbCheckUpdatePACList"); - this.tsbCheckUpdatePACList.Name = "tsbCheckUpdatePACList"; - this.tsbCheckUpdatePACList.Click += new System.EventHandler(this.tsbCheckUpdatePACList_Click); + this.tsbCheckUpdateXrayCore.Name = "tsbCheckUpdateXrayCore"; + resources.ApplyResources(this.tsbCheckUpdateXrayCore, "tsbCheckUpdateXrayCore"); + this.tsbCheckUpdateXrayCore.Click += new System.EventHandler(this.tsbCheckUpdateXrayCore_Click); // - // toolStripSeparator13 + // toolStripSeparator16 // - resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); - this.toolStripSeparator13.Name = "toolStripSeparator13"; + this.toolStripSeparator16.Name = "toolStripSeparator16"; + resources.ApplyResources(this.toolStripSeparator16, "toolStripSeparator16"); // - // tsbCheckClearPACList + // tsbCheckUpdateClashCore // - resources.ApplyResources(this.tsbCheckClearPACList, "tsbCheckClearPACList"); - this.tsbCheckClearPACList.Name = "tsbCheckClearPACList"; - this.tsbCheckClearPACList.Click += new System.EventHandler(this.tsbCheckClearPACList_Click); + this.tsbCheckUpdateClashCore.Name = "tsbCheckUpdateClashCore"; + resources.ApplyResources(this.tsbCheckUpdateClashCore, "tsbCheckUpdateClashCore"); + this.tsbCheckUpdateClashCore.Click += new System.EventHandler(this.tsbCheckUpdateClashCore_Click); + // + // tsbCheckUpdateClashMetaCore + // + this.tsbCheckUpdateClashMetaCore.Name = "tsbCheckUpdateClashMetaCore"; + resources.ApplyResources(this.tsbCheckUpdateClashMetaCore, "tsbCheckUpdateClashMetaCore"); + this.tsbCheckUpdateClashMetaCore.Click += new System.EventHandler(this.tsbCheckUpdateClashMetaCore_Click); + // + // toolStripSeparator15 + // + this.toolStripSeparator15.Name = "toolStripSeparator15"; + resources.ApplyResources(this.toolStripSeparator15, "toolStripSeparator15"); + // + // tsbCheckUpdateGeo + // + this.tsbCheckUpdateGeo.Name = "tsbCheckUpdateGeo"; + resources.ApplyResources(this.tsbCheckUpdateGeo, "tsbCheckUpdateGeo"); + this.tsbCheckUpdateGeo.Click += new System.EventHandler(this.tsbCheckUpdateGeo_Click); // // toolStripSeparator10 // - resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); this.toolStripSeparator10.Name = "toolStripSeparator10"; + resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); // // tsbHelp // - resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbAbout, this.tsbV2rayWebsite, @@ -773,52 +788,54 @@ this.tsbLanguageDef, this.tsbLanguageZhHans}); this.tsbHelp.Image = global::v2rayN.Properties.Resources.help; + resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.Name = "tsbHelp"; // // tsbAbout // - resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Name = "tsbAbout"; + resources.ApplyResources(this.tsbAbout, "tsbAbout"); this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click); // // tsbV2rayWebsite // - resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Name = "tsbV2rayWebsite"; + resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click); // // toolStripSeparator12 // - resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); this.toolStripSeparator12.Name = "toolStripSeparator12"; + resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); // // tsbLanguageDef // - resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Name = "tsbLanguageDef"; + resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click); // // tsbLanguageZhHans // - resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; + resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); this.tsbLanguageZhHans.Click += new System.EventHandler(this.tsbLanguageZhHans_Click); // // tsbPromotion // - resources.ApplyResources(this.tsbPromotion, "tsbPromotion"); this.tsbPromotion.ForeColor = System.Drawing.Color.Black; this.tsbPromotion.Image = global::v2rayN.Properties.Resources.promotion; + resources.ApplyResources(this.tsbPromotion, "tsbPromotion"); this.tsbPromotion.Name = "tsbPromotion"; this.tsbPromotion.Click += new System.EventHandler(this.tsbPromotion_Click); // // toolStripSeparator11 // - resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); this.toolStripSeparator11.Name = "toolStripSeparator11"; + resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); // // tsbClose // + this.tsbClose.Image = global::v2rayN.Properties.Resources.minimize; resources.ApplyResources(this.tsbClose, "tsbClose"); this.tsbClose.Name = "tsbClose"; this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click); @@ -827,8 +844,7 @@ // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.groupBox2); + this.Controls.Add(this.scBig); this.Controls.Add(this.panel1); this.Controls.Add(this.tsMain); this.MaximizeBox = true; @@ -839,17 +855,17 @@ this.Shown += new System.EventHandler(this.MainForm_Shown); this.VisibleChanged += new System.EventHandler(this.MainForm_VisibleChanged); this.Resize += new System.EventHandler(this.MainForm_Resize); - this.scMain.Panel1.ResumeLayout(false); - this.scMain.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.scMain)).EndInit(); - this.scMain.ResumeLayout(false); + this.scServers.Panel1.ResumeLayout(false); + this.scServers.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.scServers)).EndInit(); + this.scServers.ResumeLayout(false); this.cmsLv.ResumeLayout(false); + this.scBig.Panel1.ResumeLayout(false); + this.scBig.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.scBig)).EndInit(); + this.scBig.ResumeLayout(false); + this.gbServers.ResumeLayout(false); this.cmsMain.ResumeLayout(false); - this.groupBox1.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); - this.ssMain.ResumeLayout(false); - this.ssMain.PerformLayout(); this.tsMain.ResumeLayout(false); this.tsMain.PerformLayout(); this.ResumeLayout(false); @@ -859,9 +875,7 @@ #endregion - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.TextBox txtMsgBox; + private System.Windows.Forms.GroupBox gbServers; private v2rayN.Base.ListViewFlickerFree lvServers; private System.Windows.Forms.NotifyIcon notifyMain; private System.Windows.Forms.ContextMenuStrip cmsMain; @@ -880,32 +894,24 @@ private System.Windows.Forms.ToolStripMenuItem menuExport2ServerConfig; private System.Windows.Forms.ToolStrip tsMain; private System.Windows.Forms.ToolStripDropDownButton tsbServer; - private System.Windows.Forms.ToolStripButton tsbOptionSetting; private System.Windows.Forms.ToolStripButton tsbClose; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; - private System.Windows.Forms.ToolStripMenuItem menuMoveTop; - private System.Windows.Forms.ToolStripMenuItem menuMoveUp; - private System.Windows.Forms.ToolStripMenuItem menuMoveDown; - private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; private System.Windows.Forms.ToolStripMenuItem menuSysAgentMode; private System.Windows.Forms.ToolStripMenuItem menuGlobal; - private System.Windows.Forms.ToolStripMenuItem menuGlobalPAC; - private System.Windows.Forms.ToolStripMenuItem menuKeep; - private System.Windows.Forms.ToolStripMenuItem menuCopyPACUrl; + private System.Windows.Forms.ToolStripMenuItem menuKeepClear; private System.Windows.Forms.ToolStripMenuItem menuAddCustomServer; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem menuAddShadowsocksServer; - private System.Windows.Forms.SplitContainer scMain; + private System.Windows.Forms.SplitContainer scServers; private QRCodeControl qrCodeControl; private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; private System.Windows.Forms.ToolStripDropDownButton tsbCheckUpdate; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateN; private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateCore; - private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdatePACList; private System.Windows.Forms.ToolStripMenuItem menuAddServers; private System.Windows.Forms.ToolStripMenuItem menuExport2ShareUrl; private System.Windows.Forms.ToolStripMenuItem menuSpeedServer; @@ -913,15 +919,12 @@ private System.Windows.Forms.ToolStripDropDownButton tsbHelp; private System.Windows.Forms.ToolStripMenuItem tsbAbout; private System.Windows.Forms.ToolStripMenuItem menuAddServers2; - private System.ComponentModel.BackgroundWorker bgwScan; private System.Windows.Forms.ToolStripMenuItem menuScanScreen; private System.Windows.Forms.ToolStripMenuItem menuScanScreen2; private System.Windows.Forms.ToolStripDropDownButton tsbSub; private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; private System.Windows.Forms.ToolStripMenuItem tsbSubSetting; private System.Windows.Forms.ToolStripMenuItem tsbSubUpdate; - private System.Windows.Forms.ToolStripMenuItem tsbCheckClearPACList; - private System.Windows.Forms.ToolStripMenuItem menuKeepPAC; private System.Windows.Forms.ToolStripMenuItem menuSelectAll; private System.Windows.Forms.ToolStripMenuItem menuExport2SubContent; private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; @@ -929,32 +932,46 @@ private System.Windows.Forms.ToolStripMenuItem tsbLanguageZhHans; private System.Windows.Forms.ToolStripButton tsbPromotion; private System.Windows.Forms.ToolStripMenuItem menuAddSocksServer; - private System.Windows.Forms.StatusStrip ssMain; - private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPort; - private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPort; - private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; - private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1; - private System.Windows.Forms.ToolStripStatusLabel toolSslPacPort; - private System.Windows.Forms.ToolStripStatusLabel toolSslBlank3; - private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPortLab; - private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPortLab; - private System.Windows.Forms.ToolStripStatusLabel toolSslPacPortLab; - private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed; - private System.Windows.Forms.ToolStripStatusLabel toolSslBlank4; private System.Windows.Forms.ToolStripMenuItem menuRemoveDuplicateServer; private System.Windows.Forms.ToolStripMenuItem menuTcpingServer; private System.Windows.Forms.ToolStripMenuItem menuRealPingServer; - private System.Windows.Forms.ToolStripMenuItem menuNotEnabledHttp; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; private System.Windows.Forms.ToolStripMenuItem menuUpdateSubscriptions; private System.Windows.Forms.ToolStripMenuItem tsbV2rayWebsite; private System.Windows.Forms.ToolStripMenuItem menuKeepNothing; - private System.Windows.Forms.ToolStripMenuItem menuKeepPACNothing; private System.Windows.Forms.ToolStripMenuItem tsbTestMe; private System.Windows.Forms.ToolStripButton tsbReload; private System.Windows.Forms.ToolStripButton tsbQRCodeSwitch; private System.Windows.Forms.ToolStripMenuItem menuAddVlessServer; private System.Windows.Forms.ToolStripMenuItem menuAddTrojanServer; + private System.Windows.Forms.ToolStripDropDownButton tsbSetting; + private System.Windows.Forms.ToolStripMenuItem tsbOptionSetting; + private System.Windows.Forms.ToolStripMenuItem tsbRoutingSetting; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateXrayCore; + private System.Windows.Forms.ToolStripMenuItem menuClearServerStatistics; + private System.Windows.Forms.ToolStripMenuItem menuRoutings; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; + private System.Windows.Forms.ToolStripMenuItem tsbBackupGuiNConfig; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateGeo; + private System.Windows.Forms.SplitContainer scBig; + private System.Windows.Forms.ToolStripMenuItem tsbSubUpdateViaProxy; + private System.Windows.Forms.ToolStripMenuItem menuUpdateSubViaProxy; + private System.Windows.Forms.ToolStripMenuItem tsbGlobalHotkeySetting; + private System.Windows.Forms.TabControl tabGroup; + private System.Windows.Forms.ToolStripMenuItem tsbGroupSetting; + private System.Windows.Forms.ToolStripMenuItem menuMoveToGroup; + private MainMsgControl mainMsgControl; + private System.Windows.Forms.ToolStripMenuItem menuMoveEvent; + private System.Windows.Forms.ToolStripMenuItem menuMoveTop; + private System.Windows.Forms.ToolStripMenuItem menuMoveUp; + private System.Windows.Forms.ToolStripMenuItem menuMoveDown; + private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; + private System.Windows.Forms.ToolStripMenuItem menuServerFilter; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateClashCore; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateClashMetaCore; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator16; + private System.Windows.Forms.ToolStripMenuItem menuSortServerResult; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index f33781c5..fd491217 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1,52 +1,56 @@ -using System; +using NHotkey; +using System; using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.HttpProxyHandler; -using v2rayN.Mode; -using v2rayN.Base; -using v2rayN.Tool; using System.Diagnostics; using System.Drawing; -using System.Net; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; +using v2rayN.Resx; +using v2rayN.Tool; namespace v2rayN.Forms { public partial class MainForm : BaseForm { private V2rayHandler v2rayHandler; - private List lvSelecteds = new List(); - private StatisticsHandler statistics = null; + private List lstSelecteds = new List(); + private StatisticsHandler statistics; + private List lstVmess; + private string groupId = string.Empty; + private string serverFilter = string.Empty; #region Window 事件 public MainForm() { InitializeComponent(); - this.ShowInTaskbar = false; - this.WindowState = FormWindowState.Minimized; + ShowInTaskbar = false; + WindowState = FormWindowState.Minimized; HideForm(); - this.Text = Utils.GetVersion(); + Text = Utils.GetVersion(); Global.processJob = new Job(); Application.ApplicationExit += (sender, args) => { - v2rayHandler.V2rayStop(); - - HttpProxyHandle.CloseHttpAgent(config); - PACServerHandle.Stop(); - - ConfigHandler.SaveConfig(ref config); - statistics?.SaveToFile(); - statistics?.Close(); + MyAppExit(false); }; } private void MainForm_Load(object sender, EventArgs e) { - ConfigHandler.LoadConfig(ref config); + if (ConfigHandler.LoadConfig(ref config) != 0) + { + UI.ShowWarning($"Loading GUI configuration file is abnormal,please restart the application{Environment.NewLine}加载GUI配置文件异常,请重启应用"); + Environment.Exit(0); + return; + } + + ConfigHandler.InitBuiltinRouting(ref config); + MainFormHandler.Instance.BackupGuiNConfig(config, true); v2rayHandler = new V2rayHandler(); v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent; @@ -71,24 +75,37 @@ namespace v2rayN.Forms private void MainForm_Shown(object sender, EventArgs e) { + InitGroupView(); InitServersView(); RefreshServers(); + RefreshRoutingsMenu(); RestoreUI(); - LoadV2ray(); - HideForm(); + MainFormHandler.Instance.UpdateTask(config, UpdateTaskHandler); + MainFormHandler.Instance.RegisterGlobalHotkey(config, OnHotkeyHandler, UpdateTaskHandler); + + _ = LoadV2ray(); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { - if (e.CloseReason == CloseReason.UserClosing) + switch (e.CloseReason) { - StorageUI(); - e.Cancel = true; - HideForm(); - return; + case CloseReason.UserClosing: + StorageUI(); + e.Cancel = true; + HideForm(); + break; + case CloseReason.ApplicationExitCall: + case CloseReason.FormOwnerClosing: + case CloseReason.TaskManagerClosing: + MyAppExit(false); + break; + case CloseReason.WindowsShutDown: + MyAppExit(true); + break; } } @@ -103,37 +120,49 @@ namespace v2rayN.Forms //} } + private void MyAppExit(bool blWindowsShutDown) + { + try + { + Utils.SaveLog("MyAppExit Begin"); + StorageUI(); + ConfigHandler.SaveConfig(ref config); - //private const int WM_QUERYENDSESSION = 0x0011; - //protected override void WndProc(ref Message m) - //{ - // switch (m.Msg) - // { - // case WM_QUERYENDSESSION: - // Utils.SaveLog("Windows shutdown UnsetProxy"); + //HttpProxyHandle.CloseHttpAgent(config); + if (blWindowsShutDown) + { + SysProxyHandle.ResetIEProxy4WindowsShutDown(); + } + else + { + SysProxyHandle.UpdateSysProxy(config, true); + } - // ConfigHandler.ToJsonFile(config); - // statistics?.SaveToFile(); - // ProxySetting.UnsetProxy(); - // m.Result = (IntPtr)1; - // break; - // default: - // base.WndProc(ref m); - // break; - // } - //} + statistics?.SaveToFile(); + statistics?.Close(); + + v2rayHandler.V2rayStop(); + Utils.SaveLog("MyAppExit End"); + } + catch { } + } private void RestoreUI() { - scMain.Panel2Collapsed = true; + scServers.Panel2Collapsed = true; + if (!config.uiItem.mainLocation.IsEmpty) + { + Location = config.uiItem.mainLocation; + } if (!config.uiItem.mainSize.IsEmpty) { - this.Width = config.uiItem.mainSize.Width; - this.Height = config.uiItem.mainSize.Height; + Width = config.uiItem.mainSize.Width; + Height = config.uiItem.mainSize.Height; } + for (int k = 0; k < lvServers.Columns.Count; k++) { var width = ConfigHandler.GetformMainLvColWidth(ref config, ((EServerColName)k).ToString(), lvServers.Columns[k].Width); @@ -143,7 +172,9 @@ namespace v2rayN.Forms private void StorageUI() { - config.uiItem.mainSize = new Size(this.Width, this.Height); + config.uiItem.mainLocation = Location; + + config.uiItem.mainSize = new Size(Width, Height); for (int k = 0; k < lvServers.Columns.Count; k++) { @@ -151,6 +182,26 @@ namespace v2rayN.Forms } } + private void OnHotkeyHandler(object sender, HotkeyEventArgs e) + { + switch (Utils.ToInt(e.Name)) + { + case (int)EGlobalHotkey.ShowForm: + if (ShowInTaskbar) HideForm(); else ShowForm(); + break; + case (int)EGlobalHotkey.SystemProxyClear: + SetListenerType(ESysProxyType.ForcedClear); + break; + case (int)EGlobalHotkey.SystemProxySet: + SetListenerType(ESysProxyType.ForcedChange); + break; + case (int)EGlobalHotkey.SystemProxyUnchanged: + SetListenerType(ESysProxyType.Unchanged); + break; + } + e.Handled = true; + } + #endregion #region 显示服务器 listview 和 menu @@ -160,8 +211,14 @@ namespace v2rayN.Forms /// private void RefreshServers() { + lstVmess = config.vmess + .Where(it => Utils.IsNullOrEmpty(groupId) || it.groupId == groupId) + .Where(it => Utils.IsNullOrEmpty(serverFilter) || it.remarks.Contains(serverFilter)) + .OrderBy(it => it.sort) + .ToList(); + + ConfigHandler.SetDefaultServer(config, lstVmess); RefreshServersView(); - //lvServers.AutoResizeColumns(); RefreshServersMenu(); } @@ -179,57 +236,78 @@ namespace v2rayN.Forms lvServers.Scrollable = true; lvServers.MultiSelect = true; lvServers.HeaderStyle = ColumnHeaderStyle.Clickable; + lvServers.RegisterDragEvent(UpdateDragEventHandler); lvServers.Columns.Add("", 30); - lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80); - lvServers.Columns.Add(UIRes.I18N("LvAlias"), 100); - lvServers.Columns.Add(UIRes.I18N("LvAddress"), 120); - lvServers.Columns.Add(UIRes.I18N("LvPort"), 50); - lvServers.Columns.Add(UIRes.I18N("LvEncryptionMethod"), 90); - lvServers.Columns.Add(UIRes.I18N("LvTransportProtocol"), 70); - lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 50); - lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 70, HorizontalAlignment.Right); + lvServers.Columns.Add(ResUI.LvServiceType, 80); + lvServers.Columns.Add(ResUI.LvAlias, 100); + lvServers.Columns.Add(ResUI.LvAddress, 120); + lvServers.Columns.Add(ResUI.LvPort, 100); + lvServers.Columns.Add(ResUI.LvEncryptionMethod, 120); + lvServers.Columns.Add(ResUI.LvTransportProtocol, 120); + lvServers.Columns.Add(ResUI.LvTLS, 100); + lvServers.Columns.Add(ResUI.LvSubscription, 100); + lvServers.Columns.Add(ResUI.LvTestResults, 120, HorizontalAlignment.Right); if (statistics != null && statistics.Enable) { - lvServers.Columns.Add(UIRes.I18N("LvTodayDownloadDataAmount"), 70); - lvServers.Columns.Add(UIRes.I18N("LvTodayUploadDataAmount"), 70); - lvServers.Columns.Add(UIRes.I18N("LvTotalDownloadDataAmount"), 70); - lvServers.Columns.Add(UIRes.I18N("LvTotalUploadDataAmount"), 70); + lvServers.Columns.Add(ResUI.LvTodayDownloadDataAmount, 70); + lvServers.Columns.Add(ResUI.LvTodayUploadDataAmount, 70); + lvServers.Columns.Add(ResUI.LvTotalDownloadDataAmount, 70); + lvServers.Columns.Add(ResUI.LvTotalUploadDataAmount, 70); } lvServers.EndUpdate(); } + private void UpdateDragEventHandler(int index, int targetIndex) + { + if (index < 0 || targetIndex < 0) + { + return; + } + if (ConfigHandler.MoveServer(ref config, ref lstVmess, index, EMove.Position, targetIndex) == 0) + { + RefreshServers(); + } + } + /// /// 刷新服务器列表 /// private void RefreshServersView() { + int index = GetLvSelectedIndex(false); + lvServers.BeginUpdate(); lvServers.Items.Clear(); - for (int k = 0; k < config.vmess.Count; k++) + for (int k = 0; k < lstVmess.Count; k++) { string def = string.Empty; - string totalUp = string.Empty, - totalDown = string.Empty, - todayUp = string.Empty, - todayDown = string.Empty; - if (config.index.Equals(k)) + VmessItem item = lstVmess[k]; + if (config.IsActiveNode(item)) { def = "√"; } - VmessItem item = config.vmess[k]; + ListViewItem lvItem = new ListViewItem(def); + Utils.AddSubItem(lvItem, EServerColName.configType.ToString(), (item.configType).ToString()); + Utils.AddSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks); + Utils.AddSubItem(lvItem, EServerColName.address.ToString(), item.address); + Utils.AddSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString()); + Utils.AddSubItem(lvItem, EServerColName.security.ToString(), item.security); + Utils.AddSubItem(lvItem, EServerColName.network.ToString(), item.network); + Utils.AddSubItem(lvItem, EServerColName.streamSecurity.ToString(), item.streamSecurity); + Utils.AddSubItem(lvItem, EServerColName.subRemarks.ToString(), item.GetSubRemarks(config)); + Utils.AddSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult); - void _addSubItem(ListViewItem i, string name, string text) + if (statistics != null && statistics.Enable) { - i.SubItems.Add(new ListViewItem.ListViewSubItem() { Name = name, Text = text }); - } - bool stats = statistics != null && statistics.Enable; - if (stats) - { - ServerStatItem sItem = statistics.Statistic.Find(item_ => item_.itemId == item.getItemId()); + string totalUp = string.Empty, + totalDown = string.Empty, + todayUp = string.Empty, + todayDown = string.Empty; + ServerStatItem sItem = statistics.Statistic.Find(item_ => item_.itemId == item.indexId); if (sItem != null) { totalUp = Utils.HumanFy(sItem.totalUp); @@ -237,29 +315,18 @@ namespace v2rayN.Forms todayUp = Utils.HumanFy(sItem.todayUp); todayDown = Utils.HumanFy(sItem.todayDown); } - } - ListViewItem lvItem = new ListViewItem(def); - _addSubItem(lvItem, EServerColName.configType.ToString(), ((EConfigType)item.configType).ToString()); - _addSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks); - _addSubItem(lvItem, EServerColName.address.ToString(), item.address); - _addSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString()); - _addSubItem(lvItem, EServerColName.security.ToString(), item.security); - _addSubItem(lvItem, EServerColName.network.ToString(), item.network); - _addSubItem(lvItem, EServerColName.subRemarks.ToString(), item.getSubRemarks(config)); - _addSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult); - if (stats) - { - _addSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown); - _addSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp); - _addSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown); - _addSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp); + + Utils.AddSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown); + Utils.AddSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp); + Utils.AddSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown); + Utils.AddSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp); } if (k % 2 == 1) // 隔行着色 { lvItem.BackColor = Color.WhiteSmoke; } - if (config.index.Equals(k)) + if (config.IsActiveNode(item)) { //lvItem.Checked = true; lvItem.ForeColor = Color.DodgerBlue; @@ -270,15 +337,11 @@ namespace v2rayN.Forms } lvServers.EndUpdate(); - //if (lvServers.Items.Count > 0) - //{ - // if (lvServers.Items.Count <= testConfigIndex) - // { - // testConfigIndex = lvServers.Items.Count - 1; - // } - // lvServers.Items[testConfigIndex].Selected = true; - // lvServers.Select(); - //} + if (index >= 0 && index < lvServers.Items.Count && lvServers.Items.Count > 0) + { + lvServers.Items[index].Selected = true; + lvServers.EnsureVisible(index); // workaround + } } /// @@ -288,24 +351,31 @@ namespace v2rayN.Forms { menuServers.DropDownItems.Clear(); - List lst = new List(); - for (int k = 0; k < config.vmess.Count; k++) + if (lstVmess.Count > config.trayMenuServersLimit) { - VmessItem item = config.vmess[k]; - string name = item.getSummary(); + menuServers.DropDownItems.Add(new ToolStripMenuItem(ResUI.TooManyServersTip)); + return; + } + + List lst = new List(); + for (int k = 0; k < lstVmess.Count; k++) + { + VmessItem item = lstVmess[k]; + string name = item.GetSummary(); ToolStripMenuItem ts = new ToolStripMenuItem(name) { Tag = k }; - if (config.index.Equals(k)) + if (config.IsActiveNode(item)) { ts.Checked = true; } - ts.Click += new EventHandler(ts_Click); + ts.Click += ts_Click; lst.Add(ts); } menuServers.DropDownItems.AddRange(lst.ToArray()); + menuServers.Visible = true; } private void ts_Click(object sender, EventArgs e) @@ -323,59 +393,8 @@ namespace v2rayN.Forms private void lvServers_SelectedIndexChanged(object sender, EventArgs e) { - int index = -1; - try - { - if (lvServers.SelectedIndices.Count > 0) - { - index = lvServers.SelectedIndices[0]; - } - } - catch - { - } - if (index < 0) - { - return; - } - //qrCodeControl.showQRCode(index, config); } - private void DisplayToolStatus() - { - toolSslSocksPort.Text = - toolSslHttpPort.Text = - toolSslPacPort.Text = "OFF"; - - toolSslSocksPort.Text = $"{Global.Loopback}:{config.inbound[0].localPort}"; - - if (config.listenerType != (int)ListenerType.noHttpProxy) - { - toolSslHttpPort.Text = $"{Global.Loopback}:{Global.httpPort}"; - if (config.listenerType == ListenerType.GlobalPac || - config.listenerType == ListenerType.PacOpenAndClear || - config.listenerType == ListenerType.PacOpenOnly) - { - if (PACServerHandle.IsRunning) - { - toolSslPacPort.Text = $"{HttpProxyHandle.GetPacUrl()}"; - } - else - { - toolSslPacPort.Text = UIRes.I18N("StartPacFailed"); - } - } - } - - notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); - } - private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) - { - if (!Utils.IsNullOrEmpty(e.ClickedItem.Text)) - { - Utils.SetClipboardData(e.ClickedItem.Text); - } - } private void lvServers_ColumnClick(object sender, ColumnClickEventArgs e) { @@ -386,9 +405,18 @@ namespace v2rayN.Forms try { + if ((EServerColName)e.Column == EServerColName.def) + { + foreach (ColumnHeader it in lvServers.Columns) + { + it.Width = -2; + } + return; + } + var tag = lvServers.Columns[e.Column].Tag?.ToString(); - bool asc = Utils.IsNullOrEmpty(tag) ? true : !Convert.ToBoolean(tag); - if (ConfigHandler.SortServers(ref config, (EServerColName)e.Column, asc) != 0) + bool asc = Utils.IsNullOrEmpty(tag) || !Convert.ToBoolean(tag); + if (ConfigHandler.SortServers(ref config, ref lstVmess, (EServerColName)e.Column, asc) != 0) { return; } @@ -406,29 +434,112 @@ namespace v2rayN.Forms } } + + private void InitGroupView() + { + tabGroup.TabPages.Clear(); + + string title = $" {ResUI.AllGroupServers} "; + var tabPage = new TabPage(title); + tabPage.Name = ""; + tabGroup.TabPages.Add(tabPage); + + foreach (var item in config.groupItem.OrderBy(t => t.sort)) + { + var tabPage2 = new TabPage($" {item.remarks} "); + tabPage2.Name = item.id; + tabGroup.TabPages.Add(tabPage2); + } + + tabGroup.SelectedIndex = 0; + + //menuMoveToGroup + menuMoveToGroup.DropDownItems.Clear(); + + List lst = new List(); + foreach (var item in config.groupItem) + { + string name = item.remarks; + + ToolStripMenuItem ts = new ToolStripMenuItem(name) + { + Tag = item.id, + }; + ts.Click += ts_Group_Click; + lst.Add(ts); + } + menuMoveToGroup.DropDownItems.AddRange(lst.ToArray()); + } + + private void tabGroup_SelectedIndexChanged(object sender, EventArgs e) + { + if (tabGroup.SelectedIndex < 0) + { + return; + } + groupId = string.Empty; + //groupId = tabGroup.TabPages[tabGroup.SelectedIndex].Name; + groupId = tabGroup.SelectedTab.Name; + + RefreshServers(); + + lvServers.Focus(); + } + + private void ts_Group_Click(object sender, EventArgs e) + { + try + { + ToolStripItem ts = (ToolStripItem)sender; + var groupIdSelected = Utils.ToString(ts.Tag); + + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + + if (ConfigHandler.MoveServerToGroup(config, lstSelecteds, groupIdSelected) == 0) + { + RefreshServers(); + } + } + catch + { + } + } #endregion #region v2ray 操作 - /// /// 载入V2ray /// - private void LoadV2ray() + async Task LoadV2ray() { - tsbReload.Enabled = false; + BeginInvoke(new Action(() => + { + tsbReload.Enabled = false; + })); if (Global.reloadV2ray) { - ClearMsg(); + mainMsgControl.ClearMsg(); } - v2rayHandler.LoadV2ray(config); + await Task.Run(() => + { + v2rayHandler.LoadV2ray(config); + }); + Global.reloadV2ray = false; ConfigHandler.SaveConfig(ref config, false); statistics?.SaveToFile(); - ChangePACButtonStatus(config.listenerType); + ChangePACButtonStatus(config.sysProxyType); - tsbReload.Enabled = true; + BeginInvoke(new Action(() => + { + tsbReload.Enabled = true; + })); } /// @@ -439,7 +550,7 @@ namespace v2rayN.Forms ConfigHandler.SaveConfig(ref config, false); statistics?.SaveToFile(); - ChangePACButtonStatus(0); + ChangePACButtonStatus(ESysProxyType.ForcedClear); v2rayHandler.V2rayStop(); } @@ -450,22 +561,12 @@ namespace v2rayN.Forms private void lvServers_Click(object sender, EventArgs e) { - int index = -1; - try - { - if (lvServers.SelectedIndices.Count > 0) - { - index = lvServers.SelectedIndices[0]; - } - } - catch - { - } + int index = GetLvSelectedIndex(false); if (index < 0) { return; } - qrCodeControl.showQRCode(index, config); + qrCodeControl.showQRCode(lstVmess[index]); } private void lvServers_DoubleClick(object sender, EventArgs e) @@ -475,38 +576,26 @@ namespace v2rayN.Forms { return; } - ShowServerForm(config.vmess[index].configType, index); + ShowServerForm(lstVmess[index].configType, index); } - private void ShowServerForm(int configType, int index) + private void ShowServerForm(EConfigType configType, int index) { BaseServerForm fm; - switch (configType) + if (configType == EConfigType.Custom) { - case (int)EConfigType.Vmess: - fm = new AddServerForm(); - break; - case (int)EConfigType.Shadowsocks: - fm = new AddServer3Form(); - break; - case (int)EConfigType.Socks: - fm = new AddServer4Form(); - break; - case (int)EConfigType.VLESS: - fm = new AddServer5Form(); - break; - case (int)EConfigType.Trojan: - fm = new AddServer6Form(); - break; - default: - fm = new AddServer2Form(); - break; + fm = new AddServer2Form(); } - fm.EditIndex = index; + else + { + fm = new AddServerForm(); + } + fm.vmessItem = index >= 0 ? lstVmess[index] : null; + fm.groupId = groupId; + fm.eConfigType = configType; if (fm.ShowDialog() == DialogResult.OK) { - //刷新 RefreshServers(); - LoadV2ray(); + _ = LoadV2ray(); } } @@ -541,6 +630,12 @@ namespace v2rayN.Forms case Keys.T: menuSpeedServer_Click(null, null); break; + case Keys.F: + menuServerFilter_Click(null, null); + break; + case Keys.E: + menuSortServerResult_Click(null, null); + break; } } else @@ -571,12 +666,12 @@ namespace v2rayN.Forms private void menuAddVmessServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Vmess, -1); + ShowServerForm(EConfigType.VMess, -1); } private void menuAddVlessServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.VLESS, -1); + ShowServerForm(EConfigType.VLESS, -1); } private void menuRemoveServer_Click(object sender, EventArgs e) @@ -587,33 +682,24 @@ namespace v2rayN.Forms { return; } - if (UI.ShowYesNo(UIRes.I18N("RemoveServer")) == DialogResult.No) + if (UI.ShowYesNo(ResUI.RemoveServer) == DialogResult.No) { return; } - for (int k = lvSelecteds.Count - 1; k >= 0; k--) - { - ConfigHandler.RemoveServer(ref config, lvSelecteds[k]); - } - //刷新 - RefreshServers(); - LoadV2ray(); + ConfigHandler.RemoveServer(config, lstSelecteds); + + RefreshServers(); + _ = LoadV2ray(); } private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) { - Utils.DedupServerList(config.vmess, out List servers, config.keepOlderDedupl); - int oldCount = config.vmess.Count; - int newCount = servers.Count; - if (servers != null) - { - config.vmess = servers; - } - //刷新 + int oldCount = lstVmess.Count; + int newCount = ConfigHandler.DedupServerList(ref config, ref lstVmess); RefreshServers(); - LoadV2ray(); - UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount)); + _ = LoadV2ray(); + UI.Show(string.Format(ResUI.RemoveDuplicateServerResult, oldCount, newCount)); } private void menuCopyServer_Click(object sender, EventArgs e) @@ -623,9 +709,8 @@ namespace v2rayN.Forms { return; } - if (ConfigHandler.CopyServer(ref config, index) == 0) + if (ConfigHandler.CopyServer(ref config, lstSelecteds) == 0) { - //刷新 RefreshServers(); } } @@ -640,69 +725,95 @@ namespace v2rayN.Forms SetDefaultServer(index); } + private void menuServerFilter_Click(object sender, EventArgs e) + { + var fm = new MsgFilterSetForm(); + fm.MsgFilter = serverFilter; + if (fm.ShowDialog() == DialogResult.OK) + { + serverFilter = fm.MsgFilter; + gbServers.Text = string.Format(ResUI.MsgServerTitle, serverFilter); + RefreshServers(); + } + } private void menuPingServer_Click(object sender, EventArgs e) { - Speedtest("ping"); + Speedtest(ESpeedActionType.Ping); } private void menuTcpingServer_Click(object sender, EventArgs e) { - Speedtest("tcping"); + Speedtest(ESpeedActionType.Tcping); } private void menuRealPingServer_Click(object sender, EventArgs e) { //if (!config.sysAgentEnabled) //{ - // UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); + // UI.Show(ResUI.NeedHttpGlobalProxy")); // return; //} - //UI.Show(UIRes.I18N("SpeedServerTips")); + //UI.Show(ResUI.SpeedServerTips")); - Speedtest("realping"); + Speedtest(ESpeedActionType.Realping); } private void menuSpeedServer_Click(object sender, EventArgs e) { //if (!config.sysAgentEnabled) //{ - // UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); + // UI.Show(ResUI.NeedHttpGlobalProxy")); // return; //} - //UI.Show(UIRes.I18N("SpeedServerTips")); + //UI.Show(ResUI.SpeedServerTips")); - Speedtest("speedtest"); + Speedtest(ESpeedActionType.Speedtest); } - private void Speedtest(string actionType) + private void Speedtest(ESpeedActionType actionType) { if (GetLvSelectedIndex() < 0) return; ClearTestResult(); - SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, actionType, UpdateSpeedtestHandler); + SpeedtestHandler statistics = new SpeedtestHandler(config, v2rayHandler, lstSelecteds, actionType, UpdateSpeedtestHandler); + } + private void menuSortServerResult_Click(object sender, EventArgs e) + { + lvServers_ColumnClick(null, new ColumnClickEventArgs((int)EServerColName.testResult)); } private void tsbTestMe_Click(object sender, EventArgs e) { - string result = httpProxyTest() + "ms"; - AppendText(false, string.Format(UIRes.I18N("TestMeOutput"), result)); + var updateHandle = new UpdateHandle(); + updateHandle.RunAvailabilityCheck(UpdateTaskHandler); } - private int httpProxyTest() + + private void menuClearStatistic_Click(object sender, EventArgs e) { - SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, "", UpdateSpeedtestHandler); - return statistics.RunAvailabilityCheck(); + if (statistics != null) + { + statistics.ClearAllServerStatistics(); + } } private void menuExport2ClientConfig_Click(object sender, EventArgs e) { int index = GetLvSelectedIndex(); - MainFormHandler.Instance.Export2ClientConfig(index, config); + if (index < 0) + { + return; + } + MainFormHandler.Instance.Export2ClientConfig(lstVmess[index], config); } private void menuExport2ServerConfig_Click(object sender, EventArgs e) { int index = GetLvSelectedIndex(); - MainFormHandler.Instance.Export2ServerConfig(index, config); + if (index < 0) + { + return; + } + MainFormHandler.Instance.Export2ServerConfig(lstVmess[index], config); } private void menuExport2ShareUrl_Click(object sender, EventArgs e) @@ -710,9 +821,9 @@ namespace v2rayN.Forms GetLvSelectedIndex(); StringBuilder sb = new StringBuilder(); - foreach (int v in lvSelecteds) + foreach (var it in lstSelecteds) { - string url = ConfigHandler.GetVmessQRCode(config, v); + string url = ShareHandler.GetShareUrl(it); if (Utils.IsNullOrEmpty(url)) { continue; @@ -723,8 +834,8 @@ namespace v2rayN.Forms if (sb.Length > 0) { Utils.SetClipboardData(sb.ToString()); - AppendText(false, UIRes.I18N("BatchExportURLSuccessfully")); - //UI.Show(UIRes.I18N("BatchExportURLSuccessfully")); + AppendText(false, ResUI.BatchExportURLSuccessfully); + //UI.Show(ResUI.BatchExportURLSuccessfully")); } } @@ -733,9 +844,9 @@ namespace v2rayN.Forms GetLvSelectedIndex(); StringBuilder sb = new StringBuilder(); - foreach (int v in lvSelecteds) + foreach (var it in lstSelecteds) { - string url = ConfigHandler.GetVmessQRCode(config, v); + string url = ShareHandler.GetShareUrl(it); if (Utils.IsNullOrEmpty(url)) { continue; @@ -746,7 +857,7 @@ namespace v2rayN.Forms if (sb.Length > 0) { Utils.SetClipboardData(Utils.Base64Encode(sb.ToString())); - UI.Show(UIRes.I18N("BatchExportSubscriptionSuccessfully")); + UI.Show(ResUI.BatchExportSubscriptionSuccessfully); } } @@ -755,21 +866,54 @@ namespace v2rayN.Forms OptionSettingForm fm = new OptionSettingForm(); if (fm.ShowDialog() == DialogResult.OK) { - //刷新 RefreshServers(); - LoadV2ray(); - HttpProxyHandle.RestartHttpAgent(config, true); + _ = LoadV2ray(); } } + private void tsbRoutingSetting_Click(object sender, EventArgs e) + { + var fm = new RoutingSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshRoutingsMenu(); + RefreshServers(); + _ = LoadV2ray(); + } + } + + private void tsbGlobalHotkeySetting_Click(object sender, EventArgs e) + { + var fm = new GlobalHotkeySettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + //RefreshRoutingsMenu(); + //RefreshServers(); + //_ = LoadV2ray(); + } + + } + + private void tsbGroupSetting_Click(object sender, EventArgs e) + { + var fm = new GroupSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + InitGroupView(); + RefreshServers(); + } + + } + private void tsbReload_Click(object sender, EventArgs e) { Global.reloadV2ray = true; - LoadV2ray(); + _ = LoadV2ray(); } private void tsbClose_Click(object sender, EventArgs e) { + StorageUI(); HideForm(); //this.WindowState = FormWindowState.Minimized; } @@ -783,14 +927,13 @@ namespace v2rayN.Forms { if (index < 0) { - UI.Show(UIRes.I18N("PleaseSelectServer")); + UI.Show(ResUI.PleaseSelectServer); return -1; } - if (ConfigHandler.SetDefaultServer(ref config, index) == 0) + if (ConfigHandler.SetDefaultServer(ref config, lstVmess[index]) == 0) { - //刷新 RefreshServers(); - LoadV2ray(); + _ = LoadV2ray(); } return 0; } @@ -799,22 +942,25 @@ namespace v2rayN.Forms /// 取得ListView选中的行 /// /// - private int GetLvSelectedIndex() + private int GetLvSelectedIndex(bool show = true) { int index = -1; - lvSelecteds.Clear(); + lstSelecteds.Clear(); try { if (lvServers.SelectedIndices.Count <= 0) { - UI.Show(UIRes.I18N("PleaseSelectServer")); + if (show) + { + UI.Show(ResUI.PleaseSelectServer); + } return index; } index = lvServers.SelectedIndices[0]; foreach (int i in lvServers.SelectedIndices) { - lvSelecteds.Add(i); + lstSelecteds.Add(lstVmess[i]); } return index; } @@ -826,92 +972,82 @@ namespace v2rayN.Forms private void menuAddCustomServer_Click(object sender, EventArgs e) { - UI.Show(UIRes.I18N("CustomServerTips")); - - OpenFileDialog fileDialog = new OpenFileDialog - { - Multiselect = false, - Filter = "Config|*.json|All|*.*" - }; - if (fileDialog.ShowDialog() != DialogResult.OK) - { - return; - } - string fileName = fileDialog.FileName; - if (Utils.IsNullOrEmpty(fileName)) - { - return; - } - - if (ConfigHandler.AddCustomServer(ref config, fileName) == 0) - { - //刷新 - RefreshServers(); - //LoadV2ray(); - UI.Show(UIRes.I18N("SuccessfullyImportedCustomServer")); - } - else - { - UI.ShowWarning(UIRes.I18N("FailedImportedCustomServer")); - } + ShowServerForm(EConfigType.Custom, -1); } private void menuAddShadowsocksServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Shadowsocks, -1); + ShowServerForm(EConfigType.Shadowsocks, -1); ShowForm(); } private void menuAddSocksServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Socks, -1); + ShowServerForm(EConfigType.Socks, -1); ShowForm(); } private void menuAddTrojanServer_Click(object sender, EventArgs e) { - ShowServerForm((int)EConfigType.Trojan, -1); + ShowServerForm(EConfigType.Trojan, -1); ShowForm(); } private void menuAddServers_Click(object sender, EventArgs e) { string clipboardData = Utils.GetClipboardData(); - int result = AddBatchServers(clipboardData); - if (result > 0) + int ret = ConfigHandler.AddBatchServers(ref config, clipboardData, "", groupId); + if (ret > 0) { - UI.Show(string.Format(UIRes.I18N("SuccessfullyImportedServerViaClipboard"), result)); + RefreshServers(); + UI.Show(string.Format(ResUI.SuccessfullyImportedServerViaClipboard, ret)); } } private void menuScanScreen_Click(object sender, EventArgs e) { - HideForm(); - bgwScan.RunWorkerAsync(); + _ = ScanScreenTaskAsync(); } - private int AddBatchServers(string clipboardData, string subid = "") + public async Task ScanScreenTaskAsync() { - int counter; - int _Add() + HideForm(); + + string result = await Task.Run(() => { - return ConfigHandler.AddBatchServers(ref config, clipboardData, subid); - } - counter = _Add(); - if (counter < 1) + return Utils.ScanScreen(); + }); + + ShowForm(); + + if (Utils.IsNullOrEmpty(result)) { - clipboardData = Utils.Base64Decode(clipboardData); - counter = _Add(); + UI.ShowWarning(ResUI.NoValidQRcodeFound); + } + else + { + int ret = ConfigHandler.AddBatchServers(ref config, result, "", groupId); + if (ret > 0) + { + RefreshServers(); + UI.Show(ResUI.SuccessfullyImportedServerViaScan); + } } - RefreshServers(); - return counter; } private void menuUpdateSubscriptions_Click(object sender, EventArgs e) { - UpdateSubscriptionProcess(); + UpdateSubscriptionProcess(false); + } + private void menuUpdateSubViaProxy_Click(object sender, EventArgs e) + { + UpdateSubscriptionProcess(true); } + private void tsbBackupGuiNConfig_Click(object sender, EventArgs e) + { + MainFormHandler.Instance.BackupGuiNConfig(config); + } #endregion @@ -927,58 +1063,17 @@ namespace v2rayN.Forms AppendText(notify, msg); } - delegate void AppendTextDelegate(string text); void AppendText(bool notify, string msg) { try { - AppendText(msg); + mainMsgControl.AppendText(msg); if (notify) { notifyMsg(msg); } } - catch - { - } - } - - void AppendText(string text) - { - if (this.txtMsgBox.InvokeRequired) - { - Invoke(new AppendTextDelegate(AppendText), new object[] { text }); - } - else - { - //this.txtMsgBox.AppendText(text); - ShowMsg(text); - } - } - - /// - /// 提示信息 - /// - /// - private void ShowMsg(string msg) - { - if (txtMsgBox.Lines.Length > 999) - { - ClearMsg(); - } - this.txtMsgBox.AppendText(msg); - if (!msg.EndsWith(Environment.NewLine)) - { - this.txtMsgBox.AppendText(Environment.NewLine); - } - } - - /// - /// 清除信息 - /// - private void ClearMsg() - { - this.txtMsgBox.Clear(); + catch { } } /// @@ -1005,8 +1100,8 @@ namespace v2rayN.Forms private void menuExit_Click(object sender, EventArgs e) { - this.Visible = false; - this.Close(); + Visible = false; + Close(); Application.Exit(); } @@ -1014,15 +1109,21 @@ namespace v2rayN.Forms private void ShowForm() { - this.Show(); - this.WindowState = FormWindowState.Normal; - this.Activate(); - this.ShowInTaskbar = true; - //this.notifyIcon1.Visible = false; - this.txtMsgBox.ScrollToCaret(); - if (config.index >= 0 && config.index < lvServers.Items.Count) + Show(); + if (WindowState == FormWindowState.Minimized) { - lvServers.EnsureVisible(config.index); // workaround + WindowState = FormWindowState.Normal; + } + Activate(); + ShowInTaskbar = true; + //this.notifyIcon1.Visible = false; + mainMsgControl.ScrollToCaret(); + + int index = GetLvSelectedIndex(false); + if (index >= 0 && index < lvServers.Items.Count && lvServers.Items.Count > 0) + { + lvServers.Items[index].Selected = true; + lvServers.EnsureVisible(index); // workaround } SetVisibleCore(true); @@ -1031,38 +1132,56 @@ namespace v2rayN.Forms private void HideForm() { //this.WindowState = FormWindowState.Minimized; - this.Hide(); + Hide(); //this.notifyMain.Icon = this.Icon; - this.notifyMain.Visible = true; - this.ShowInTaskbar = false; + notifyMain.Visible = true; + ShowInTaskbar = false; SetVisibleCore(false); + + //write Handle to reg + if (IsHandleCreated) + { + Utils.RegWriteValue(Global.MyRegPath, Utils.WindowHwndKey, Convert.ToString((long)Handle)); + } } #endregion #region 后台测速 - + private void SetTestResult(string indexId, string txt) + { + int k = lstVmess.FindIndex(it => it.indexId == indexId); + if (k >= 0 && k < lvServers.Items.Count) + { + lstVmess[k].testResult = txt; + lvServers.Items[k].SubItems["testResult"].Text = txt; + } + else + { + AppendText(false, txt); + } + } private void SetTestResult(int k, string txt) { if (k < lvServers.Items.Count) { - config.vmess[k].testResult = txt; + lstVmess[k].testResult = txt; lvServers.Items[k].SubItems["testResult"].Text = txt; } } private void ClearTestResult() { - foreach (int s in lvSelecteds) + foreach (var it in lstSelecteds) { - SetTestResult(s, ""); + SetTestResult(it.indexId, ""); } } - private void UpdateSpeedtestHandler(int index, string msg) + private void UpdateSpeedtestHandler(string indexId, string msg) { lvServers.Invoke((MethodInvoker)delegate { - SetTestResult(index, msg); + SetTestResult(indexId, msg); }); } @@ -1070,29 +1189,30 @@ namespace v2rayN.Forms { try { - up /= (ulong)(config.statisticsFreshRate / 1000f); - down /= (ulong)(config.statisticsFreshRate / 1000f); - toolSslServerSpeed.Text = string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down)); + up /= (ulong)(config.statisticsFreshRate); + down /= (ulong)(config.statisticsFreshRate); + mainMsgControl.SetToolSslInfo("speed", string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down))); - List datas = new List(); - for (int i = 0; i < config.vmess.Count; i++) + foreach (var it in statistics) { - int index = statistics.FindIndex(item_ => item_.itemId == config.vmess[i].getItemId()); - if (index != -1) + int index = lstVmess.FindIndex(item => item.indexId == it.itemId); + if (index < 0) { - lvServers.Invoke((MethodInvoker)delegate - { - lvServers.BeginUpdate(); - - lvServers.Items[i].SubItems["todayDown"].Text = Utils.HumanFy(statistics[index].todayDown); - lvServers.Items[i].SubItems["todayUp"].Text = Utils.HumanFy(statistics[index].todayUp); - lvServers.Items[i].SubItems["totalDown"].Text = Utils.HumanFy(statistics[index].totalDown); - lvServers.Items[i].SubItems["totalUp"].Text = Utils.HumanFy(statistics[index].totalUp); - - lvServers.EndUpdate(); - }); + continue; } + lvServers.Invoke((MethodInvoker)delegate + { + lvServers.BeginUpdate(); + + lvServers.Items[index].SubItems["todayDown"].Text = Utils.HumanFy(it.todayDown); + lvServers.Items[index].SubItems["todayUp"].Text = Utils.HumanFy(it.todayUp); + lvServers.Items[index].SubItems["totalDown"].Text = Utils.HumanFy(it.totalDown); + lvServers.Items[index].SubItems["totalUp"].Text = Utils.HumanFy(it.totalUp); + + lvServers.EndUpdate(); + }); } + } catch (Exception ex) { @@ -1100,6 +1220,15 @@ namespace v2rayN.Forms } } + private async void UpdateTaskHandler(bool success, string msg) + { + AppendText(false, msg); + if (success) + { + Global.reloadV2ray = true; + await LoadV2ray(); + } + } #endregion #region 移动服务器 @@ -1129,10 +1258,9 @@ namespace v2rayN.Forms int index = GetLvSelectedIndex(); if (index < 0) { - UI.Show(UIRes.I18N("PleaseSelectServer")); return; } - if (ConfigHandler.MoveServer(ref config, index, eMove) == 0) + if (ConfigHandler.MoveServer(ref config, ref lstVmess, index, eMove) == 0) { //TODO: reload is not good. RefreshServers(); @@ -1146,60 +1274,34 @@ namespace v2rayN.Forms item.Selected = true; } } - + private void menuMoveToGroup_Click(object sender, EventArgs e) + { + } #endregion #region 系统代理相关 - - private void menuCopyPACUrl_Click(object sender, EventArgs e) + private void menuKeepClear_Click(object sender, EventArgs e) { - Utils.SetClipboardData(HttpProxyHandle.GetPacUrl()); - } - - private void menuNotEnabledHttp_Click(object sender, EventArgs e) - { - SetListenerType(ListenerType.noHttpProxy); + SetListenerType(ESysProxyType.ForcedClear); } private void menuGlobal_Click(object sender, EventArgs e) { - SetListenerType(ListenerType.GlobalHttp); - } - private void menuGlobalPAC_Click(object sender, EventArgs e) - { - SetListenerType(ListenerType.GlobalPac); - } - private void menuKeep_Click(object sender, EventArgs e) - { - SetListenerType(ListenerType.HttpOpenAndClear); - } - private void menuKeepPAC_Click(object sender, EventArgs e) - { - SetListenerType(ListenerType.PacOpenAndClear); + SetListenerType(ESysProxyType.ForcedChange); } + private void menuKeepNothing_Click(object sender, EventArgs e) { - SetListenerType(ListenerType.HttpOpenOnly); + SetListenerType(ESysProxyType.Unchanged); } - private void menuKeepPACNothing_Click(object sender, EventArgs e) + private void SetListenerType(ESysProxyType type) { - SetListenerType(ListenerType.PacOpenOnly); - } - private void SetListenerType(ListenerType type) - { - config.listenerType = type; + config.sysProxyType = type; ChangePACButtonStatus(type); } - private void ChangePACButtonStatus(ListenerType type) + private void ChangePACButtonStatus(ESysProxyType type) { - if (type != ListenerType.noHttpProxy) - { - HttpProxyHandle.RestartHttpAgent(config, false); - } - else - { - HttpProxyHandle.CloseHttpAgent(config); - } + SysProxyHandle.UpdateSysProxy(config, false); for (int k = 0; k < menuSysAgentMode.DropDownItems.Count; k++) { @@ -1208,7 +1310,13 @@ namespace v2rayN.Forms } ConfigHandler.SaveConfig(ref config, false); - DisplayToolStatus(); + + mainMsgControl.DisplayToolStatus(config); + + BeginInvoke(new Action(() => + { + notifyMain.Icon = Icon = MainFormHandler.Instance.GetNotifyIcon(config, Icon); + })); } #endregion @@ -1216,200 +1324,72 @@ namespace v2rayN.Forms #region CheckUpdate - private void askToDownload(DownloadHandle downloadHandle, string url) - { - if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.Yes) - { - if (httpProxyTest() > 0) - { - int httpPort = config.GetLocalPort(Global.InboundHttp); - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); - downloadHandle.DownloadFileAsync(url, webProxy, 600); - } - else - { - downloadHandle.DownloadFileAsync(url, null, 600); - } - } - } private void tsbCheckUpdateN_Click(object sender, EventArgs e) { - //System.Diagnostics.Process.Start(Global.UpdateUrl); - DownloadHandle downloadHandle = null; - if (downloadHandle == null) + void _updateUI(bool success, string msg) { - downloadHandle = new DownloadHandle(); - downloadHandle.AbsoluteCompleted += (sender2, args) => + AppendText(false, msg); + if (success) { - if (args.Success) - { - AppendText(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "v2rayN")); - - string url = args.Msg; - this.Invoke((MethodInvoker)(delegate - { - askToDownload(downloadHandle, url); - })); - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - AppendText(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); - - try - { - string fileName = Utils.GetPath(downloadHandle.DownloadFileName); - Process process = new Process - { - StartInfo = new ProcessStartInfo - { - FileName = "v2rayUpgrade.exe", - Arguments = "\"" + fileName + "\"", - WorkingDirectory = Utils.StartupPath() - } - }; - process.Start(); - if (process.Id > 0) - { - menuExit_Click(null, null); - } - } - catch (Exception ex) - { - AppendText(false, ex.Message); - } - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; - } - - AppendText(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayN")); - downloadHandle.CheckUpdateAsync("v2rayN"); + menuExit_Click(null, null); + } + }; + (new UpdateHandle()).CheckUpdateGuiN(config, _updateUI); } private void tsbCheckUpdateCore_Click(object sender, EventArgs e) { - DownloadHandle downloadHandle = null; - if (downloadHandle == null) - { - downloadHandle = new DownloadHandle(); - downloadHandle.AbsoluteCompleted += (sender2, args) => - { - if (args.Success) - { - AppendText(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "v2rayCore")); - - string url = args.Msg; - this.Invoke((MethodInvoker)(delegate - { - askToDownload(downloadHandle, url); - })); - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - AppendText(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); - AppendText(false, UIRes.I18N("MsgUnpacking")); - - try - { - CloseV2ray(); - - string fileName = downloadHandle.DownloadFileName; - fileName = Utils.GetPath(fileName); - FileManager.ZipExtractToFile(fileName); - - AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfullyMore")); - - Global.reloadV2ray = true; - LoadV2ray(); - - AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfully")); - } - catch (Exception ex) - { - AppendText(false, ex.Message); - } - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; - } - - AppendText(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayCore")); - downloadHandle.CheckUpdateAsync("Core"); + CheckUpdateCore(ECoreType.v2fly); } - private void tsbCheckUpdatePACList_Click(object sender, EventArgs e) + private void tsbCheckUpdateXrayCore_Click(object sender, EventArgs e) { - DownloadHandle pacListHandle = null; - if (pacListHandle == null) - { - pacListHandle = new DownloadHandle(); - pacListHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - string result = args.Msg; - if (Utils.IsNullOrEmpty(result)) - { - return; - } - pacListHandle.GenPacFile(result); - - AppendText(false, UIRes.I18N("MsgPACUpdateSuccessfully")); - } - else - { - AppendText(false, UIRes.I18N("MsgPACUpdateFailed")); - } - }; - pacListHandle.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; - } - AppendText(false, UIRes.I18N("MsgStartUpdatingPAC")); - pacListHandle.WebDownloadString(config.urlGFWList); + CheckUpdateCore(ECoreType.Xray); } - private void tsbCheckClearPACList_Click(object sender, EventArgs e) + private void tsbCheckUpdateClashCore_Click(object sender, EventArgs e) { - try - { - File.WriteAllText(Utils.GetPath(Global.pacFILE), Utils.GetEmbedText(Global.BlankPacFileName), Encoding.UTF8); - AppendText(false, UIRes.I18N("MsgSimplifyPAC")); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } + CheckUpdateCore(ECoreType.clash); } + + private void tsbCheckUpdateClashMetaCore_Click(object sender, EventArgs e) + { + CheckUpdateCore(ECoreType.clash_meta); + } + + private void CheckUpdateCore(ECoreType type) + { + void _updateUI(bool success, string msg) + { + AppendText(false, msg); + if (success) + { + CloseV2ray(); + + string fileName = Utils.GetPath(Utils.GetDownloadFileName(msg)); + FileManager.ZipExtractToFile(fileName, config.ignoreGeoUpdateCore ? "geo" : ""); + + AppendText(false, ResUI.MsgUpdateV2rayCoreSuccessfullyMore); + + Global.reloadV2ray = true; + _ = LoadV2ray(); + + AppendText(false, ResUI.MsgUpdateV2rayCoreSuccessfully); + } + }; + (new UpdateHandle()).CheckUpdateCore(type, config, _updateUI); + } + + private void tsbCheckUpdateGeo_Click(object sender, EventArgs e) + { + Task.Run(() => + { + var updateHandle = new UpdateHandle(); + updateHandle.UpdateGeoFile("geosite", config, UpdateTaskHandler); + updateHandle.UpdateGeoFile("geoip", config, UpdateTaskHandler); + }); + } + #endregion #region Help @@ -1431,35 +1411,6 @@ namespace v2rayN.Forms } #endregion - #region ScanScreen - - - private void bgwScan_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) - { - string ret = Utils.ScanScreen(); - bgwScan.ReportProgress(0, ret); - } - - private void bgwScan_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) - { - ShowForm(); - - string result = Convert.ToString(e.UserState); - if (Utils.IsNullOrEmpty(result)) - { - UI.ShowWarning(UIRes.I18N("NoValidQRcodeFound")); - } - else - { - if (AddBatchServers(result) > 0) - { - UI.Show(UIRes.I18N("SuccessfullyImportedServerViaScan")); - } - } - } - - #endregion - #region 订阅 private void tsbSubSetting_Click(object sender, EventArgs e) { @@ -1472,81 +1423,42 @@ namespace v2rayN.Forms private void tsbSubUpdate_Click(object sender, EventArgs e) { - UpdateSubscriptionProcess(); + UpdateSubscriptionProcess(false); + } + + private void tsbSubUpdateViaProxy_Click(object sender, EventArgs e) + { + UpdateSubscriptionProcess(true); } /// /// the subscription update process /// - private void UpdateSubscriptionProcess() + private void UpdateSubscriptionProcess(bool blProxy) { - AppendText(false, UIRes.I18N("MsgUpdateSubscriptionStart")); - - if (config.subItem == null || config.subItem.Count <= 0) + void _updateUI(bool success, string msg) { - AppendText(false, UIRes.I18N("MsgNoValidSubscription")); - return; - } - - for (int k = 1; k <= config.subItem.Count; k++) - { - string id = config.subItem[k - 1].id.TrimEx(); - string url = config.subItem[k - 1].url.TrimEx(); - string hashCode = $"{k}->"; - if (config.subItem[k - 1].enabled == false) + AppendText(false, msg); + if (success) { - continue; - } - if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url)) - { - AppendText(false, $"{hashCode}{UIRes.I18N("MsgNoValidSubscription")}"); - continue; - } - - DownloadHandle downloadHandle3 = new DownloadHandle(); - downloadHandle3.UpdateCompleted += (sender2, args) => - { - if (args.Success) + RefreshServers(); + if (config.uiItem.enableAutoAdjustMainLvColWidth) { - AppendText(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); - string result = Utils.Base64Decode(args.Msg); - if (Utils.IsNullOrEmpty(result)) + foreach (ColumnHeader it in lvServers.Columns) { - AppendText(false, $"{hashCode}{UIRes.I18N("MsgSubscriptionDecodingFailed")}"); - return; + it.Width = -2; } - - ConfigHandler.RemoveServerViaSubid(ref config, id); - AppendText(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); - RefreshServers(); - if (AddBatchServers(result, id) > 0) - { - } - else - { - AppendText(false, $"{hashCode}{UIRes.I18N("MsgFailedImportSubscription")}"); - } - AppendText(false, $"{hashCode}{UIRes.I18N("MsgUpdateSubscriptionEnd")}"); } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle3.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; + } + }; - downloadHandle3.WebDownloadString(url); - AppendText(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); - } + (new UpdateHandle()).UpdateSubscriptionProcess(config, blProxy, _updateUI); } private void tsbQRCodeSwitch_CheckedChanged(object sender, EventArgs e) { bool bShow = tsbQRCodeSwitch.Checked; - scMain.Panel2Collapsed = !bShow; + scServers.Panel2Collapsed = !bShow; } #endregion @@ -1567,11 +1479,68 @@ namespace v2rayN.Forms //Application.Restart(); } - - - #endregion - + + #region RoutingsMenu + + /// + /// + /// + private void RefreshRoutingsMenu() + { + menuRoutings.Visible = config.enableRoutingAdvanced; + if (!config.enableRoutingAdvanced) + { + mainMsgControl.SetToolSslInfo("routing", string.Empty); + return; + } + + menuRoutings.DropDownItems.Clear(); + + List lst = new List(); + for (int k = 0; k < config.routings.Count; k++) + { + var item = config.routings[k]; + if (item.locked == true) + { + continue; + } + string name = item.remarks; + + ToolStripMenuItem ts = new ToolStripMenuItem(name) + { + Tag = k + }; + if (config.routingIndex.Equals(k)) + { + ts.Checked = true; + mainMsgControl.SetToolSslInfo("routing", item.remarks); + } + ts.Click += ts_Routing_Click; + lst.Add(ts); + } + menuRoutings.DropDownItems.AddRange(lst.ToArray()); + } + + private void ts_Routing_Click(object sender, EventArgs e) + { + try + { + ToolStripItem ts = (ToolStripItem)sender; + int index = Utils.ToInt(ts.Tag); + + if (ConfigHandler.SetDefaultRouting(ref config, index) == 0) + { + RefreshRoutingsMenu(); + _ = LoadV2ray(); + } + } + catch + { + } + } + #endregion + } } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index eb1e2e63..5714620a 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,703 +117,238 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Remove duplicate servers + + + Fill - + + 3, 17 + + + 226, 19 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [VMess] server - - Magenta - - + 355, 22 - - 97, 53 - - - groupBox2 - Add [VLESS] server - - 2 + + 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add [Shadowsocks] server - - Restart service - - - 184, 6 - - - tsbSubSetting - - - 264, 22 - - - groupBox2 - - - menuMoveUp + + 355, 22 Add [Socks] server - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ImageAboveText - - - 语言-[中文简体] - - - NoControl - - - Top - - - tsbHelp - - - 5 - - - - False - - - toolStripSeparator6 - 355, 22 - - 99, 53 + + Add [Trojan] server - - Update subscriptions + + 355, 22 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add a custom configuration server - - 187, 22 + + 355, 22 - - toolSslBlank2 + + Import bulk URL from clipboard (Ctrl+V) - - tsbCheckUpdateN + + 355, 22 + + + Scan QR code on the screen (Ctrl+S) + + + 352, 6 355, 22 - + + Remove selected servers (Delete) + + 355, 22 - - Move to top (T) - - - 45, 53 - - - Only open Http proxy and do nothing - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator7 - - - Update v2rayCore - - - Magenta - - - menuKeepNothing + + Remove duplicate servers 355, 22 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Clone selected server - - menuExport2SubContent + + 355, 22 - - 52, 17 + + Set as active server (Enter) - - Share + + 355, 22 - - tsbQRCodeSwitch + + Set server filter (Ctrl+F) + + + 352, 6 + + + 355, 22 + + + Move to Group + 192, 22 + + + Move to top (T) + + + 192, 22 + + + Up (U) + + + 192, 22 + + + Down (D) + + + 192, 22 + + + Move to bottom (B) + + + 355, 22 + + + Move to + + + 355, 22 + + + Select All (Ctrl+A) + + + 352, 6 + + + 355, 22 + + + Test servers ping (Ctrl+P) + + + 355, 22 + + + Test servers with tcping (Ctrl+O) + + + 355, 22 + + + Test servers real delay (Ctrl+R) + + + 355, 22 + + + Test servers download speed (Ctrl+T) + + + 355, 22 + + + Sort by test result (Ctrl+E) + + + 355, 22 + + + Test current service status + + + 355, 22 + + + Clear all service statistics + + + 352, 6 + + 355, 22 Export selected server for client configuration - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 355, 22 Export selected server for server configuration - - ImageAboveText - - - 952, 56 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Test servers real delay (Ctrl+R) - - - menuTcpingServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - 411, 22 - - + 355, 22 - - toolStripSeparator1 + + Export share URLs to clipboard (Ctrl+C) - - 3 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 393, 22 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbClose - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuPingServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageDef - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM - mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY - FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr - flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh - VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh - 6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC - - - - 411, 22 - - - 3 - - - 3, 17 - - + 355, 22 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Export subscription (base64) share to clipboard - - Fill - - - 6, 56 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 220, 17 - - - menuAddCustomServer - - - menuMoveDown - - - Import bulk URL from clipboard - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 411, 22 - - - Move to bottom (B) - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6, 12 - - - 48, 53 - - - 393, 22 - - - 355, 22 - - - System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel1 - - - 195, 17 - - - 0 - - - 686, 331 - - - toolStripSeparator4 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bottom - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain.Panel2 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 39, 17 - - - menuAddServers2 - - - Fill - - - tsbServer - - - Add [VMess] server - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - tsbAbout - - - 195, 17 - - - toolStripSeparator5 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 352, 6 - - - 256, 331 - - - 4, 4, 4, 4 - - - Test servers with tcping (Ctrl+O) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6, 56 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 195, 17 - - - 2 - - - 125, 22 - - - 0, 17 - - - scMain.Panel2 - - - 58, 53 - - - 355, 22 - - - Not Enabled Http Proxy - - - 187, 22 - - - 6, 56 - - - Test servers download speed (Ctrl+T) - - - ssMain - - - 686 - - - ImageAboveText - - - 265, 164 - - - 355, 22 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - Check for updates - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslServerSpeed - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - 125, 22 - - - Only open Http proxy and clear the proxy settings - - - scMain - - - HTTP: - - - Remove selected servers (Delete) - - - 411, 22 - - - menuKeepPAC - - - 0 - - - Help - - - menuSelectAll - - - $this - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Scan QR code on the screen (Ctrl+S) - - - ImageAboveText - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 187, 22 - - - menuAddServers - - - 355, 22 - - - menuAddVmessServer - - - tsbLanguageZhHans - - - menuRemoveDuplicateServer - - - BottomCenter - - - menuExport2ShareUrl - - - tsMain - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbReload - - - v2rayN (this software) - - + Magenta - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 64, 53 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Servers - - 0, 66 + + ImageAboveText - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 356, 644 - - tsbV2rayWebsite - - - Server - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - menuAddShadowsocksServer - - - txtMsgBox - - - toolSslBlank4 - - - menuAddTrojanServer - - - 261, 6 - - - v2rayN - - - Language-[English] - - - menuSpeedServer - - - 264, 22 - - - 0 - - - toolSslBlank3 - - - 128, 53 - - - Add [Trojan] server - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator11 + + cmsLv System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 417 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 352, 6 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - V2Ray Website - - - No - - - 1 - - - toolSslPacPort - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Settings - - - menuMoveTop - - - menuKeep + + Fill @@ -832,539 +367,573 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 952, 351 + + 0, 20 - - menuScanScreen + + 686, 260 - - cmsLv - - - toolStripSeparator12 - - - 6, 56 - - - Fill - - - toolSslBlank1 - - - tsbSubUpdate - - - 微软雅黑, 8pt - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - SPEED Disabled - - - PAC: - - - Promotion - - - menuSysAgentMode - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 0 - - - Export subscription (base64) share to clipboard - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuScanScreen2 - - - cmsMain - - - 264, 22 - - - menuServers - - - menuUpdateSubscriptions - - - $this - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator13 - - - 1 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 17 - - - 3, 151 - - - True - - - 355, 22 - - - Subscriptions - - - 952, 10 - - - Updates - - - 264, 22 - - - menuNotEnabledHttp - - + + 0 - - Informations - - - toolStripSeparator8 - - - 89, 53 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - BottomCenter - - - Test servers ping (Ctrl+P) - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 22 - - - 264, 22 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSetDefaultServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Settings - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuCopyServer - - - Http proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 411, 22 - - - Only open PAC and clear the proxy settings - - - 355, 22 - - - groupBox1 - - - MainForm - - - toolStripSeparator9 - - - menuExit - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Servers list - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - lvServers - - menuRealPingServer + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - Magenta + + scServers.Panel1 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuGlobal - - - 100 - - - 2 - - - menuKeepPACNothing - - - Check for updated PAC (need the HTTP proxy are ON) - - - 355, 22 - - - v2rayN Project - - - Servers - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Select All (Ctrl+A) - - - ImageAboveText - - - 3 - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateCore - - - SOCKS5: - - - 33, 17 - - - 355, 22 - - - menuRemoveServer - - - tsbTestMe - - - 355, 22 - - - 946, 134 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - scMain - - - Down (D) - - - menuCopyPACUrl - - - 352, 6 - - - Magenta - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Only open PAC and do nothing - - - 355, 22 - - - tsbSub - - - Magenta - - - ImageAboveText - - - Clone selected server - - - 0, 0 - - - 355, 22 - - - groupBox2 - - - tsbCheckUpdate - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 微软雅黑, 8pt - - - Export share URLs to clipboard (Ctrl+C) - - - 411, 22 - - - 355, 22 - - - v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - 微软雅黑, 8pt - - - System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Simplify PAC (need to set Core route) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 0 - - $this + + Top - + + 0, 0 + + + 686, 20 + + + 0 + + + tabGroup + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scServers.Panel1 + + + 1 + + + scServers.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scServers + + + 0 + + Fill + + 0, 0 + + + 4, 4, 4, 4 + + + 256, 280 + + + 2 + qrCodeControl - - 264, 22 + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - 355, 22 + + scServers.Panel2 - + 0 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + scServers.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scServers + + + 1 + + + 100 + + + 946, 280 + + + 686 + + + 0 + + + scServers + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbServers + + + 0 + + + Fill + + + 0, 66 + + + Horizontal + + + Fill + + + 0, 0 + + + 952, 300 + + + 0 + + + gbServers + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scBig.Panel1 + + + 0 + + + scBig.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scBig + + + 0 + + + Fill + + + 0, 0 + + + 952, 223 + + + 0 + + + mainMsgControl + + + v2rayN.Forms.MainMsgControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + scBig.Panel2 + + + 0 + + + scBig.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scBig + + + 1 + + + 952, 527 + + + 300 + + + 5 + + + scBig + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + 137, 17 + + + NoControl + + + 243, 22 + + + Clear system proxy + + + 243, 22 + + + Set system proxy + + + 243, 22 + + + Do not change system proxy + + + 277, 22 + + + System proxy + + + 277, 22 + + + Routing + + + 277, 22 + + + Server + + + 274, 6 + + + 277, 22 + + + Import bulk URL from clipboard + + + 277, 22 + + + Scan QR code on the screen + + + 277, 22 + + + Update subscription without proxy + + + 277, 22 + + + Update subscriptions via proxy + + + 274, 6 + + + 277, 22 + + + Exit + + + 278, 192 + + + cmsMain + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + True + + + Top + + + 0, 56 + + + 952, 10 + + + 2 + + + panel1 System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 微软雅黑, 8pt + + $this - - tsbPromotion + + 3 - - ImageAboveText + + 315, 17 + + + 6, 56 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 277, 22 - - menuGlobalPAC + + Settings - - 393, 22 + + 277, 22 - - 356, 600 + + Update subscription without proxy - - 0, 0 + + 277, 22 - - scMain.Panel1 + + Update subscription with proxy - - Up (U) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - notifyMain - - - Open Http proxy and set the system proxy (global mode) - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MiddleRight - - - tsbOptionSetting - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddSocksServer - - - scMain.Panel1 - - - 微软雅黑, 8pt - - - 64, 53 - - + Magenta - - 946, 22 + + 99, 53 - - Open PAC and set the system proxy (PAC mode) + + Subscriptions - - 355, 22 + + ImageAboveText - - Set as active server (Enter) + + Magenta - - menuAddVlessServer + + 45, 53 - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Share - - 946, 331 + + BottomCenter + + + ImageAboveText + + + 6, 56 + + + 195, 22 + + + OptionSetting + + + 195, 22 + + + RoutingSetting + + + 195, 22 + + + GlobalHotkeySetting + + + 195, 22 + + + GroupSetting + + + 192, 6 + + + 195, 22 + + + BackupGuiConfig + + + Magenta + + + 67, 53 + + + Settings + + + ImageAboveText + + + 6, 56 + + + BottomCenter + + + Magenta + + + 97, 53 + + + Restart service + + + ImageAboveText + + + 6, 56 + + + 219, 22 + + + v2rayN (this software) + + + 219, 22 + + + Update v2fly Core + + + 219, 22 + + + Update Xray Core + + + 216, 6 + + + 219, 22 + + + Update clash Core + + + 219, 22 + + + Update Clash.Meta Core + + + 216, 6 + + + 219, 22 + + + Update Geo files + + + Magenta + + + 128, 53 + + + Check for updates + + + ImageAboveText 6, 56 - - Add [Shadowsocks] server + + 187, 22 - - 390, 6 + + v2rayN Project - - 微软雅黑, 8pt + + 187, 22 - - 952, 593 + + V2Ray Website - - 411, 22 - - - tsbCheckClearPACList - - - Test current service status - - - toolSslSocksPort - - - toolStripSeparator10 - - - toolSslHttpPortLab - - - menuMoveBottom - - - 393, 22 - - - 1 - - - Magenta - - - menuExport2ClientConfig + + 184, 6 187, 22 - - menuExport2ServerConfig + + Language-[English] - - 0 + + 187, 22 + + + 语言-[中文简体] + + + Magenta + + + 48, 53 + + + Help + + + ImageAboveText + + + Magenta + + + 89, 53 + + + Promotion ImageAboveText @@ -1372,152 +941,577 @@ 6, 56 - - 0, 17 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + Magenta 52, 53 - - ImageAboveText - - - toolSslPacPortLab - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Exit - - - bgwScan - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Scan QR code on the screen - - - 0, 56 - Close - - 264, 22 + + ImageAboveText - - 0, 17 + + 0, 0 - - 0 + + 952, 56 - - Import bulk URL from clipboard (Ctrl+V) + + 1 + + + tsMain + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this - - toolStripSeparator2 + + 4 - - toolSslSocksPortLab - - - Add a custom configuration server - - - toolSslHttpPort - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 352, 6 - - - 952, 176 - - - statusStrip1 - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - Fill - - - Copy local PAC URL - - - 3, 17 - - - toolStripSeparator3 - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA - 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC - - - - 355, 22 - - - 微软雅黑, 8pt - - - 355, 22 - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdatePACList - - - 228, 18 - True - 108 - - - 137, 17 - - - 498, 17 - - - 17, 17 - - - 409, 17 - - - 327, 17 + 64 + + 6, 12 + + + 952, 593 + + + 4, 4, 4, 4 + + + v2rayN + + + menuAddVmessServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddVlessServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddShadowsocksServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddSocksServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddTrojanServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddCustomServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddServers + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuScanScreen + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemoveServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemoveDuplicateServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuCopyServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSetDefaultServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuServerFilter + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator3 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveToGroup + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveEvent + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveTop + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveUp + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveDown + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveBottom + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSelectAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator9 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuPingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuTcpingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRealPingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSpeedServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSortServerResult + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbTestMe + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuClearServerStatistics + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator6 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ClientConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ServerConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ShareUrl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2SubContent + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbServer + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + notifyMain + + + System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSysAgentMode + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeepClear + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobal + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeepNothing + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRoutings + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuServers + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator13 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddServers2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuScanScreen2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuUpdateSubscriptions + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuUpdateSubViaProxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator2 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExit + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator4 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSub + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubUpdate + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubUpdateViaProxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbQRCodeSwitch + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator8 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSetting + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbRoutingSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbGlobalHotkeySetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbGroupSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator14 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbBackupGuiNConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdate + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateN + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateXrayCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator16 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateClashCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateClashMetaCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator15 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateGeo + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator10 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbHelp + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbAbout + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbV2rayWebsite + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator12 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageDef + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageZhHans + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbPromotion + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator11 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbClose + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MainForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index 83e8f530..695e1a3d 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -259,6 +259,12 @@ 测试当前服务状态 + + 300, 22 + + + 清除所有服务统计数据 + 297, 6 @@ -286,8 +292,14 @@ 批量导出订阅内容至剪贴板(多选) + + 73, 53 + + + 服务器 + - 301, 600 + 301, 622 @@ -306,110 +318,125 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 73, 53 + + 221, 22 - - 服务器 + + 221, 22 - - 196, 164 + + 221, 22 - - 195, 22 + + 221, 22 - - Http代理 + + 221, 22 - - 316, 22 + + 221, 22 - - 关闭Http代理 + + 222, 136 + + + 网速显示未启用 + + + 172, 22 + + + 清除系统代理 - 316, 22 + 172, 22 - 开启Http代理,并自动配置系统代理(全局模式) - - - 316, 22 - - - 开启PAC,并自动配置系统代理(PAC模式) - - - 316, 22 - - - 仅开启Http代理,并清除系统代理 - - - 316, 22 - - - 仅开启PAC,并清除系统代理 + 自动配置系统代理 - 316, 22 + 172, 22 - 仅开启Http代理,不改变系统代理 + 不改变系统代理 - - 316, 22 + + 260, 22 - - 仅开启PAC,不改变系统代理 + + 系统代理 + + + 260, 22 + + + 路由 - 195, 22 + 260, 22 服务器 + + 服务器 + + + 257, 6 + - 195, 22 + 260, 22 从剪贴板导入批量URL - 195, 22 + 260, 22 扫描屏幕上的二维码 - - 195, 22 - - - 复制本地PAC网址 - - 195, 22 + 260, 22 - 更新订阅 + 更新订阅(不通过代理) + + + 260, 22 + + + 更新订阅(通过代理) - 192, 6 + 257, 6 - 195, 22 + 260, 22 退出 - - 服务器列表 + + 261, 221 - - 信息 + + 180, 22 - - 网速显示未启用 + + 订阅设置 + + + 180, 22 + + + 更新订阅(不通过代理) + + + 180, 22 + + + 更新订阅(通过代理) 61, 53 @@ -417,18 +444,6 @@ 订阅 - - 124, 22 - - - 订阅设置 - - - 124, 22 - - - 更新订阅 - 52, 53 @@ -436,21 +451,43 @@ 分享 - 76, 53 + 189, 22 - 参数设置 + 参数设置 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd - QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X - jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY - 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 - NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY - B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== - + + 189, 22 + + + 路由设置 + + + 189, 22 + + + 全局热键设置 + + + 189, 22 + + + 服务器分组设置 + + + 186, 6 + + + 189, 22 + + + 备份v2rayN配置文件 + + + 61, 53 + + + 设置 76, 53 @@ -458,44 +495,38 @@ 重启服务 - - 85, 53 - - - 检查更新 - - 223, 22 + 168, 22 v2rayN - 223, 22 + 168, 22 - v2rayCore + v2fly-Core - - 223, 22 + + 168, 22 - - PAC + + Xray-Core - - 220, 6 + + 165, 6 - - 223, 22 + + 168, 22 - - 简化PAC (请设置Core路由) + + 168, 22 - - 69, 53 + + 85, 53 - - 帮助 + + 检查更新 v2rayN 项目 @@ -503,23 +534,40 @@ V2Ray 官网 + + 69, 53 + + + 帮助 + 68, 53 推广 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== - - 76, 53 关闭窗口 + + 移至分组 + + + 上下移至 + + + 设置服务器过滤器 (Ctrl+F) + + + Update clash Core + + + Update Clash.Meta Core + + + 按测试结果排序 (Ctrl+E) + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs b/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs new file mode 100644 index 00000000..d23bd9f9 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainMsgControl.Designer.cs @@ -0,0 +1,204 @@ + +namespace v2rayN.Forms +{ + partial class MainMsgControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainMsgControl)); + this.txtMsgBox = new System.Windows.Forms.TextBox(); + this.cmsMsgBox = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuMsgBoxSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxCopy = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxCopyAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxClear = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxAddRoutingRule = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMsgBoxFilter = new System.Windows.Forms.ToolStripMenuItem(); + this.gbMsgTitle = new System.Windows.Forms.GroupBox(); + this.ssMain = new System.Windows.Forms.StatusStrip(); + this.toolSslInboundInfo = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslRoutingRule = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); + this.cmsMsgBox.SuspendLayout(); + this.gbMsgTitle.SuspendLayout(); + this.ssMain.SuspendLayout(); + this.SuspendLayout(); + // + // txtMsgBox + // + resources.ApplyResources(this.txtMsgBox, "txtMsgBox"); + this.txtMsgBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(41)))), ((int)(((byte)(49)))), ((int)(((byte)(52))))); + this.txtMsgBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtMsgBox.ContextMenuStrip = this.cmsMsgBox; + this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228))))); + this.txtMsgBox.Name = "txtMsgBox"; + this.txtMsgBox.ReadOnly = true; + this.txtMsgBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtMsgBox_KeyDown); + // + // cmsMsgBox + // + resources.ApplyResources(this.cmsMsgBox, "cmsMsgBox"); + this.cmsMsgBox.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuMsgBoxSelectAll, + this.menuMsgBoxCopy, + this.menuMsgBoxCopyAll, + this.menuMsgBoxClear, + this.menuMsgBoxAddRoutingRule, + this.menuMsgBoxFilter}); + this.cmsMsgBox.Name = "cmsMsgBox"; + // + // menuMsgBoxSelectAll + // + resources.ApplyResources(this.menuMsgBoxSelectAll, "menuMsgBoxSelectAll"); + this.menuMsgBoxSelectAll.Name = "menuMsgBoxSelectAll"; + this.menuMsgBoxSelectAll.Click += new System.EventHandler(this.menuMsgBoxSelectAll_Click); + // + // menuMsgBoxCopy + // + resources.ApplyResources(this.menuMsgBoxCopy, "menuMsgBoxCopy"); + this.menuMsgBoxCopy.Name = "menuMsgBoxCopy"; + this.menuMsgBoxCopy.Click += new System.EventHandler(this.menuMsgBoxCopy_Click); + // + // menuMsgBoxCopyAll + // + resources.ApplyResources(this.menuMsgBoxCopyAll, "menuMsgBoxCopyAll"); + this.menuMsgBoxCopyAll.Name = "menuMsgBoxCopyAll"; + this.menuMsgBoxCopyAll.Click += new System.EventHandler(this.menuMsgBoxCopyAll_Click); + // + // menuMsgBoxClear + // + resources.ApplyResources(this.menuMsgBoxClear, "menuMsgBoxClear"); + this.menuMsgBoxClear.Name = "menuMsgBoxClear"; + this.menuMsgBoxClear.Click += new System.EventHandler(this.menuMsgBoxClear_Click); + // + // menuMsgBoxAddRoutingRule + // + resources.ApplyResources(this.menuMsgBoxAddRoutingRule, "menuMsgBoxAddRoutingRule"); + this.menuMsgBoxAddRoutingRule.Name = "menuMsgBoxAddRoutingRule"; + this.menuMsgBoxAddRoutingRule.Click += new System.EventHandler(this.menuMsgBoxAddRoutingRule_Click); + // + // menuMsgBoxFilter + // + resources.ApplyResources(this.menuMsgBoxFilter, "menuMsgBoxFilter"); + this.menuMsgBoxFilter.Name = "menuMsgBoxFilter"; + this.menuMsgBoxFilter.Click += new System.EventHandler(this.menuMsgBoxFilter_Click); + // + // gbMsgTitle + // + resources.ApplyResources(this.gbMsgTitle, "gbMsgTitle"); + this.gbMsgTitle.Controls.Add(this.txtMsgBox); + this.gbMsgTitle.Controls.Add(this.ssMain); + this.gbMsgTitle.Name = "gbMsgTitle"; + this.gbMsgTitle.TabStop = false; + // + // ssMain + // + resources.ApplyResources(this.ssMain, "ssMain"); + this.ssMain.ImageScalingSize = new System.Drawing.Size(20, 20); + this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolSslInboundInfo, + this.toolSslBlank1, + this.toolSslRoutingRule, + this.toolSslBlank2, + this.toolSslServerSpeed, + this.toolSslBlank4}); + this.ssMain.Name = "ssMain"; + this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); + // + // toolSslInboundInfo + // + resources.ApplyResources(this.toolSslInboundInfo, "toolSslInboundInfo"); + this.toolSslInboundInfo.Name = "toolSslInboundInfo"; + // + // toolSslBlank1 + // + resources.ApplyResources(this.toolSslBlank1, "toolSslBlank1"); + this.toolSslBlank1.Name = "toolSslBlank1"; + this.toolSslBlank1.Spring = true; + // + // toolSslRoutingRule + // + resources.ApplyResources(this.toolSslRoutingRule, "toolSslRoutingRule"); + this.toolSslRoutingRule.Name = "toolSslRoutingRule"; + // + // toolSslBlank2 + // + resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); + this.toolSslBlank2.Name = "toolSslBlank2"; + this.toolSslBlank2.Spring = true; + // + // toolSslServerSpeed + // + resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed"); + this.toolSslServerSpeed.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolSslServerSpeed.Name = "toolSslServerSpeed"; + // + // toolSslBlank4 + // + resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); + this.toolSslBlank4.Name = "toolSslBlank4"; + // + // MainMsgControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.gbMsgTitle); + this.Name = "MainMsgControl"; + this.Load += new System.EventHandler(this.MainMsgControl_Load); + this.cmsMsgBox.ResumeLayout(false); + this.gbMsgTitle.ResumeLayout(false); + this.gbMsgTitle.PerformLayout(); + this.ssMain.ResumeLayout(false); + this.ssMain.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TextBox txtMsgBox; + private System.Windows.Forms.ContextMenuStrip cmsMsgBox; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxSelectAll; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopy; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxCopyAll; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxClear; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxAddRoutingRule; + private System.Windows.Forms.ToolStripMenuItem menuMsgBoxFilter; + private System.Windows.Forms.GroupBox gbMsgTitle; + private System.Windows.Forms.StatusStrip ssMain; + private System.Windows.Forms.ToolStripStatusLabel toolSslInboundInfo; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1; + private System.Windows.Forms.ToolStripStatusLabel toolSslRoutingRule; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; + private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank4; + } +} diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.cs b/v2rayN/v2rayN/Forms/MainMsgControl.cs new file mode 100644 index 00000000..27986f5a --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainMsgControl.cs @@ -0,0 +1,205 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.Forms +{ + public partial class MainMsgControl : UserControl + { + private string _msgFilter = string.Empty; + delegate void AppendTextDelegate(string text); + + public MainMsgControl() + { + InitializeComponent(); + } + + private void MainMsgControl_Load(object sender, EventArgs e) + { + + } + + #region 提示信息 + + public void AppendText(string text) + { + if (txtMsgBox.InvokeRequired) + { + Invoke(new AppendTextDelegate(AppendText), text); + } + else + { + if (!Utils.IsNullOrEmpty(_msgFilter)) + { + if (!Regex.IsMatch(text, _msgFilter)) + { + return; + } + } + //this.txtMsgBox.AppendText(text); + ShowMsg(text); + } + } + + /// + /// 提示信息 + /// + /// + private void ShowMsg(string msg) + { + if (txtMsgBox.Lines.Length > 999) + { + ClearMsg(); + } + txtMsgBox.AppendText(msg); + if (!msg.EndsWith(Environment.NewLine)) + { + txtMsgBox.AppendText(Environment.NewLine); + } + } + + /// + /// 清除信息 + /// + public void ClearMsg() + { + txtMsgBox.Invoke((Action)delegate + { + txtMsgBox.Clear(); + }); + } + + public void DisplayToolStatus(Config config) + { + StringBuilder sb = new StringBuilder(); + sb.Append($"{ResUI.LabLocal}:"); + sb.Append($"[{Global.InboundSocks}:{config.GetLocalPort(Global.InboundSocks)}]"); + sb.Append(" | "); + if (config.sysProxyType == ESysProxyType.ForcedChange) + { + sb.Append($"[{Global.InboundHttp}({ResUI.SystemProxy}):{config.GetLocalPort(Global.InboundHttp)}]"); + } + else + { + sb.Append($"[{Global.InboundHttp}:{config.GetLocalPort(Global.InboundHttp)}]"); + } + + if (config.inbound[0].allowLANConn) + { + sb.Append($" {ResUI.LabLAN}:"); + sb.Append($"[{Global.InboundSocks}:{config.GetLocalPort(Global.InboundSocks2)}]"); + sb.Append(" | "); + sb.Append($"[{Global.InboundHttp}:{config.GetLocalPort(Global.InboundHttp2)}]"); + } + + SetToolSslInfo("inbound", sb.ToString()); + } + + public void SetToolSslInfo(string type, string value) + { + switch (type) + { + case "speed": + toolSslServerSpeed.Text = value; + break; + case "inbound": + toolSslInboundInfo.Text = value; + break; + case "routing": + toolSslRoutingRule.Text = value; + break; + } + + } + + public void ScrollToCaret() + { + txtMsgBox.ScrollToCaret(); + } + #endregion + + + #region MsgBoxMenu + private void menuMsgBoxSelectAll_Click(object sender, EventArgs e) + { + txtMsgBox.Focus(); + txtMsgBox.SelectAll(); + } + + private void menuMsgBoxCopy_Click(object sender, EventArgs e) + { + var data = txtMsgBox.SelectedText.TrimEx(); + Utils.SetClipboardData(data); + } + + private void menuMsgBoxCopyAll_Click(object sender, EventArgs e) + { + var data = txtMsgBox.Text; + Utils.SetClipboardData(data); + } + private void menuMsgBoxClear_Click(object sender, EventArgs e) + { + txtMsgBox.Clear(); + } + private void menuMsgBoxAddRoutingRule_Click(object sender, EventArgs e) + { + menuMsgBoxCopy_Click(null, null); + var fm = new RoutingSettingForm(); + fm.ShowDialog(); + + } + + private void txtMsgBox_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control) + { + switch (e.KeyCode) + { + case Keys.A: + menuMsgBoxSelectAll_Click(null, null); + break; + case Keys.C: + menuMsgBoxCopy_Click(null, null); + break; + case Keys.V: + menuMsgBoxAddRoutingRule_Click(null, null); + break; + + } + } + + } + private void menuMsgBoxFilter_Click(object sender, EventArgs e) + { + var fm = new MsgFilterSetForm(); + fm.MsgFilter = _msgFilter; + fm.ShowDefFilter = true; + if (fm.ShowDialog() == DialogResult.OK) + { + _msgFilter = fm.MsgFilter; + gbMsgTitle.Text = string.Format(ResUI.MsgInformationTitle, _msgFilter); + } + } + + private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + if (!Utils.IsNullOrEmpty(e.ClickedItem.Text)) + { + Utils.SetClipboardData(e.ClickedItem.Text); + } + } + #endregion + + + } +} diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.resx b/v2rayN/v2rayN/Forms/MainMsgControl.resx new file mode 100644 index 00000000..80eab070 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainMsgControl.resx @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslRoutingRule + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Select All (Ctrl+A) + + + ssMain + + + menuMsgBoxSelectAll + + + + False + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslServerSpeed + + + + 227, 22 + + + menuMsgBoxCopyAll + + + 0 + + + 1 + + + 3, 221 + + + 227, 22 + + + 227, 22 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 17 + + + 80, 17 + + + toolSslInboundInfo + + + txtMsgBox + + + 0, 17 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 微软雅黑, 8pt + + + 227, 22 + + + gbMsgTitle + + + 227, 22 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add Routing Rule (Ctrl+V) + + + MiddleRight + + + 微软雅黑, 8pt + + + 696, 246 + + + InboundInfo + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxClear + + + 4 + + + 5 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 17 + + + toolSslBlank4 + + + gbMsgTitle + + + Informations + + + 0 + + + 172, 17 + + + True + + + Clear All + + + 6, 12 + + + + Vertical + + + $this + + + 690, 22 + + + cmsMsgBox + + + Fill + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 690, 204 + + + 227, 22 + + + 172, 17 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MainMsgControl + + + 0, 0 + + + 696, 246 + + + toolSslBlank1 + + + No + + + Copy All + + + 250, 17 + + + statusStrip1 + + + menuMsgBoxAddRoutingRule + + + toolSslBlank2 + + + Set message filters + + + SPEED Disabled + + + 0 + + + gbMsgTitle + + + menuMsgBoxFilter + + + 1 + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMsgBoxCopy + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Copy (Ctrl+C) + + + 228, 136 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 131, 18 + + + True + + + 17, 17 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx new file mode 100644 index 00000000..d54a14f8 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainMsgControl.zh-Hans.resx @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 221, 22 + + + 全选 (Ctrl+A) + + + 221, 22 + + + 复制 (Ctrl+C) + + + 221, 22 + + + 复制所有 + + + 221, 22 + + + 清除所有 + + + 221, 22 + + + 快速添加路由规则 (Ctrl+V) + + + 221, 22 + + + 设置信息过滤器 + + + 222, 136 + + + 157, 17 + + + 157, 17 + + + 信息 + + + 网速显示未启用 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs new file mode 100644 index 00000000..ff3ca4f8 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.Designer.cs @@ -0,0 +1,129 @@ +namespace v2rayN.Forms +{ + partial class MsgFilterSetForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MsgFilterSetForm)); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnFilderProxy = new System.Windows.Forms.Button(); + this.btnFilterDirect = new System.Windows.Forms.Button(); + this.txtMsgFilter = new System.Windows.Forms.TextBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnClose = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnClear = new System.Windows.Forms.Button(); + this.groupBox1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.btnFilderProxy); + this.groupBox1.Controls.Add(this.btnFilterDirect); + this.groupBox1.Controls.Add(this.txtMsgFilter); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // btnFilderProxy + // + resources.ApplyResources(this.btnFilderProxy, "btnFilderProxy"); + this.btnFilderProxy.Name = "btnFilderProxy"; + this.btnFilderProxy.UseVisualStyleBackColor = true; + this.btnFilderProxy.Click += new System.EventHandler(this.btnFilderProxy_Click); + // + // btnFilterDirect + // + resources.ApplyResources(this.btnFilterDirect, "btnFilterDirect"); + this.btnFilterDirect.Name = "btnFilterDirect"; + this.btnFilterDirect.UseVisualStyleBackColor = true; + this.btnFilterDirect.Click += new System.EventHandler(this.btnFilterDirect_Click); + // + // txtMsgFilter + // + resources.ApplyResources(this.txtMsgFilter, "txtMsgFilter"); + this.txtMsgFilter.Name = "txtMsgFilter"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnClear); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // btnClear + // + resources.ApplyResources(this.btnClear, "btnClear"); + this.btnClear.Name = "btnClear"; + this.btnClear.UseVisualStyleBackColor = true; + this.btnClear.Click += new System.EventHandler(this.btnClear_Click); + // + // MsgFilterSetForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Name = "MsgFilterSetForm"; + this.Load += new System.EventHandler(this.MsgFilterSetForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtMsgFilter; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Button btnFilderProxy; + private System.Windows.Forms.Button btnFilterDirect; + private System.Windows.Forms.Button btnClear; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs new file mode 100644 index 00000000..926b00cb --- /dev/null +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace v2rayN.Forms +{ + public partial class MsgFilterSetForm : BaseForm + { + public string MsgFilter { get; set; } + public bool ShowDefFilter { get; set; } + + public MsgFilterSetForm() + { + InitializeComponent(); + } + + private void MsgFilterSetForm_Load(object sender, EventArgs e) + { + txtMsgFilter.Text = MsgFilter; + btnFilderProxy.Visible = + btnFilterDirect.Visible = ShowDefFilter; + } + + private void btnOK_Click(object sender, EventArgs e) + { + MsgFilter = txtMsgFilter.Text; + DialogResult = DialogResult.OK; + } + + private void btnClose_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void btnFilderProxy_Click(object sender, EventArgs e) + { + txtMsgFilter.Text = "^(?!.*proxy).*$"; + } + + private void btnFilterDirect_Click(object sender, EventArgs e) + { + txtMsgFilter.Text = "^(?!.*direct).*$"; + } + + private void btnClear_Click(object sender, EventArgs e) + { + MsgFilter = string.Empty; + DialogResult = DialogResult.OK; + } + } +} diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx b/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx new file mode 100644 index 00000000..82cacfe0 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.resx @@ -0,0 +1,381 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnFilderProxy + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + btnFilterDirect + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + txtMsgFilter + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + + Fill + + + + 0, 0 + + + 490, 76 + + + + 8 + + + Filter + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 157, 47 + + + 95, 23 + + + 13 + + + Filter Proxy + + + btnFilderProxy + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + NoControl + + + 41, 47 + + + 95, 23 + + + 12 + + + Filter Direct + + + btnFilterDirect + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 41, 20 + + + 409, 21 + + + 11 + + + txtMsgFilter + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + NoControl + + + 211, 17 + + + 75, 23 + + + 14 + + + Clear + + + btnClear + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 396, 17 + + + 75, 23 + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + NoControl + + + 303, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 76 + + + 490, 60 + + + 9 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 490, 136 + + + MsgFilterSetForm + + + MsgFilterSetForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx new file mode 100644 index 00000000..3ec9e0e7 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MsgFilterSetForm.zh-Hans.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 过滤器 + + + 取消(&C) + + + 确定(&O) + + + 设置过滤器 + + + 过滤Proxy + + + 过滤Direct + + + 清空 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 62af6048..d2968958 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -33,19 +33,14 @@ this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabPage1 = new System.Windows.Forms.TabPage(); this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.chkdefAllowInsecure = new System.Windows.Forms.CheckBox(); this.label16 = new System.Windows.Forms.Label(); - this.cmblistenerType = new System.Windows.Forms.ComboBox(); - this.chksniffingEnabled2 = new System.Windows.Forms.CheckBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtpass = new System.Windows.Forms.TextBox(); + this.txtuser = new System.Windows.Forms.TextBox(); + this.chkdefAllowInsecure = new System.Windows.Forms.CheckBox(); + this.chkAllowLANConn = new System.Windows.Forms.CheckBox(); this.chksniffingEnabled = new System.Windows.Forms.CheckBox(); - this.txtremoteDNS = new System.Windows.Forms.TextBox(); - this.label14 = new System.Windows.Forms.Label(); this.chkmuxEnabled = new System.Windows.Forms.CheckBox(); - this.chkAllowIn2 = new System.Windows.Forms.CheckBox(); - this.chkudpEnabled2 = new System.Windows.Forms.CheckBox(); - this.cmbprotocol2 = new System.Windows.Forms.ComboBox(); - this.label3 = new System.Windows.Forms.Label(); - this.txtlocalPort2 = new System.Windows.Forms.TextBox(); this.cmbprotocol = new System.Windows.Forms.ComboBox(); this.label1 = new System.Windows.Forms.Label(); this.chkudpEnabled = new System.Windows.Forms.CheckBox(); @@ -55,21 +50,9 @@ this.txtlocalPort = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.tabPage2 = new System.Windows.Forms.TabPage(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.tabControl2 = new System.Windows.Forms.TabControl(); - this.tabPage3 = new System.Windows.Forms.TabPage(); - this.txtUseragent = new System.Windows.Forms.TextBox(); - this.tabPage4 = new System.Windows.Forms.TabPage(); - this.txtUserdirect = new System.Windows.Forms.TextBox(); - this.tabPage5 = new System.Windows.Forms.TabPage(); - this.txtUserblock = new System.Windows.Forms.TextBox(); - this.tabPage8 = new System.Windows.Forms.TabPage(); - this.cmbroutingMode = new System.Windows.Forms.ComboBox(); - this.panel3 = new System.Windows.Forms.Panel(); - this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); - this.btnSetDefRountingRule = new System.Windows.Forms.Button(); - this.labRoutingTips = new System.Windows.Forms.Label(); - this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); + this.linkDnsObjectDoc = new System.Windows.Forms.LinkLabel(); + this.txtremoteDNS = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); this.tabPage6 = new System.Windows.Forms.TabPage(); this.chkKcpcongestion = new System.Windows.Forms.CheckBox(); this.txtKcpwriteBufferSize = new System.Windows.Forms.TextBox(); @@ -85,18 +68,41 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.numStatisticsFreshRate = new System.Windows.Forms.NumericUpDown(); + this.txttrayMenuServersLimit = new System.Windows.Forms.TextBox(); + this.label17 = new System.Windows.Forms.Label(); + this.txtautoUpdateSubInterval = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.chkEnableSecurityProtocolTls13 = new System.Windows.Forms.CheckBox(); + this.chkEnableAutoAdjustMainLvColWidth = new System.Windows.Forms.CheckBox(); + this.btnSetLoopback = new System.Windows.Forms.Button(); + this.txtautoUpdateInterval = new System.Windows.Forms.TextBox(); + this.label15 = new System.Windows.Forms.Label(); + this.chkIgnoreGeoUpdateCore = new System.Windows.Forms.CheckBox(); this.chkKeepOlderDedupl = new System.Windows.Forms.CheckBox(); - this.cbFreshrate = new System.Windows.Forms.ComboBox(); this.lbFreshrate = new System.Windows.Forms.Label(); this.chkEnableStatistics = new System.Windows.Forms.CheckBox(); - this.chkAllowLANConn = new System.Windows.Forms.CheckBox(); - this.txturlGFWList = new System.Windows.Forms.TextBox(); - this.label13 = new System.Windows.Forms.Label(); this.chkAutoRun = new System.Windows.Forms.CheckBox(); - this.tabPage9 = new System.Windows.Forms.TabPage(); - this.txtuserPacRule = new System.Windows.Forms.TextBox(); - this.panel4 = new System.Windows.Forms.Panel(); - this.label4 = new System.Windows.Forms.Label(); + this.tabPageCoreType = new System.Windows.Forms.TabPage(); + this.cmbCoreType6 = new System.Windows.Forms.ComboBox(); + this.labCoreType6 = new System.Windows.Forms.Label(); + this.cmbCoreType5 = new System.Windows.Forms.ComboBox(); + this.labCoreType5 = new System.Windows.Forms.Label(); + this.cmbCoreType4 = new System.Windows.Forms.ComboBox(); + this.labCoreType4 = new System.Windows.Forms.Label(); + this.cmbCoreType3 = new System.Windows.Forms.ComboBox(); + this.labCoreType3 = new System.Windows.Forms.Label(); + this.cmbCoreType2 = new System.Windows.Forms.ComboBox(); + this.labCoreType2 = new System.Windows.Forms.Label(); + this.cmbCoreType1 = new System.Windows.Forms.ComboBox(); + this.labCoreType1 = new System.Windows.Forms.Label(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label18 = new System.Windows.Forms.Label(); + this.cmbSystemProxyAdvancedProtocol = new System.Windows.Forms.ComboBox(); + this.label13 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.txtsystemProxyExceptions = new System.Windows.Forms.TextBox(); this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); @@ -104,17 +110,12 @@ this.tabPage1.SuspendLayout(); this.groupBox1.SuspendLayout(); this.tabPage2.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.tabControl2.SuspendLayout(); - this.tabPage3.SuspendLayout(); - this.tabPage4.SuspendLayout(); - this.tabPage5.SuspendLayout(); - this.tabPage8.SuspendLayout(); - this.panel3.SuspendLayout(); this.tabPage6.SuspendLayout(); this.tabPage7.SuspendLayout(); - this.tabPage9.SuspendLayout(); - this.panel4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numStatisticsFreshRate)).BeginInit(); + this.tabPageCoreType.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.groupBox2.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); // @@ -133,7 +134,8 @@ this.tabControl1.Controls.Add(this.tabPage2); this.tabControl1.Controls.Add(this.tabPage6); this.tabControl1.Controls.Add(this.tabPage7); - this.tabControl1.Controls.Add(this.tabPage9); + this.tabControl1.Controls.Add(this.tabPageCoreType); + this.tabControl1.Controls.Add(this.tabPage3); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; // @@ -147,19 +149,14 @@ // groupBox1 // resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Controls.Add(this.chkdefAllowInsecure); this.groupBox1.Controls.Add(this.label16); - this.groupBox1.Controls.Add(this.cmblistenerType); - this.groupBox1.Controls.Add(this.chksniffingEnabled2); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.txtpass); + this.groupBox1.Controls.Add(this.txtuser); + this.groupBox1.Controls.Add(this.chkdefAllowInsecure); + this.groupBox1.Controls.Add(this.chkAllowLANConn); this.groupBox1.Controls.Add(this.chksniffingEnabled); - this.groupBox1.Controls.Add(this.txtremoteDNS); - this.groupBox1.Controls.Add(this.label14); this.groupBox1.Controls.Add(this.chkmuxEnabled); - this.groupBox1.Controls.Add(this.chkAllowIn2); - this.groupBox1.Controls.Add(this.chkudpEnabled2); - this.groupBox1.Controls.Add(this.cmbprotocol2); - this.groupBox1.Controls.Add(this.label3); - this.groupBox1.Controls.Add(this.txtlocalPort2); this.groupBox1.Controls.Add(this.cmbprotocol); this.groupBox1.Controls.Add(this.label1); this.groupBox1.Controls.Add(this.chkudpEnabled); @@ -171,37 +168,37 @@ this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // txtpass + // + resources.ApplyResources(this.txtpass, "txtpass"); + this.txtpass.Name = "txtpass"; + // + // txtuser + // + resources.ApplyResources(this.txtuser, "txtuser"); + this.txtuser.Name = "txtuser"; + // // chkdefAllowInsecure // resources.ApplyResources(this.chkdefAllowInsecure, "chkdefAllowInsecure"); this.chkdefAllowInsecure.Name = "chkdefAllowInsecure"; this.chkdefAllowInsecure.UseVisualStyleBackColor = true; // - // label16 + // chkAllowLANConn // - resources.ApplyResources(this.label16, "label16"); - this.label16.Name = "label16"; - // - // cmblistenerType - // - resources.ApplyResources(this.cmblistenerType, "cmblistenerType"); - this.cmblistenerType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmblistenerType.FormattingEnabled = true; - this.cmblistenerType.Items.AddRange(new object[] { - resources.GetString("cmblistenerType.Items"), - resources.GetString("cmblistenerType.Items1"), - resources.GetString("cmblistenerType.Items2"), - resources.GetString("cmblistenerType.Items3"), - resources.GetString("cmblistenerType.Items4"), - resources.GetString("cmblistenerType.Items5"), - resources.GetString("cmblistenerType.Items6")}); - this.cmblistenerType.Name = "cmblistenerType"; - // - // chksniffingEnabled2 - // - resources.ApplyResources(this.chksniffingEnabled2, "chksniffingEnabled2"); - this.chksniffingEnabled2.Name = "chksniffingEnabled2"; - this.chksniffingEnabled2.UseVisualStyleBackColor = true; + resources.ApplyResources(this.chkAllowLANConn, "chkAllowLANConn"); + this.chkAllowLANConn.Name = "chkAllowLANConn"; + this.chkAllowLANConn.UseVisualStyleBackColor = true; // // chksniffingEnabled // @@ -209,55 +206,12 @@ this.chksniffingEnabled.Name = "chksniffingEnabled"; this.chksniffingEnabled.UseVisualStyleBackColor = true; // - // txtremoteDNS - // - resources.ApplyResources(this.txtremoteDNS, "txtremoteDNS"); - this.txtremoteDNS.Name = "txtremoteDNS"; - // - // label14 - // - resources.ApplyResources(this.label14, "label14"); - this.label14.Name = "label14"; - // // chkmuxEnabled // resources.ApplyResources(this.chkmuxEnabled, "chkmuxEnabled"); this.chkmuxEnabled.Name = "chkmuxEnabled"; this.chkmuxEnabled.UseVisualStyleBackColor = true; // - // chkAllowIn2 - // - resources.ApplyResources(this.chkAllowIn2, "chkAllowIn2"); - this.chkAllowIn2.Name = "chkAllowIn2"; - this.chkAllowIn2.UseVisualStyleBackColor = true; - this.chkAllowIn2.CheckedChanged += new System.EventHandler(this.chkAllowIn2_CheckedChanged); - // - // chkudpEnabled2 - // - resources.ApplyResources(this.chkudpEnabled2, "chkudpEnabled2"); - this.chkudpEnabled2.Name = "chkudpEnabled2"; - this.chkudpEnabled2.UseVisualStyleBackColor = true; - // - // cmbprotocol2 - // - resources.ApplyResources(this.cmbprotocol2, "cmbprotocol2"); - this.cmbprotocol2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbprotocol2.FormattingEnabled = true; - this.cmbprotocol2.Items.AddRange(new object[] { - resources.GetString("cmbprotocol2.Items"), - resources.GetString("cmbprotocol2.Items1")}); - this.cmbprotocol2.Name = "cmbprotocol2"; - // - // label3 - // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; - // - // txtlocalPort2 - // - resources.ApplyResources(this.txtlocalPort2, "txtlocalPort2"); - this.txtlocalPort2.Name = "txtlocalPort2"; - // // cmbprotocol // resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); @@ -316,122 +270,28 @@ // tabPage2 // resources.ApplyResources(this.tabPage2, "tabPage2"); - this.tabPage2.Controls.Add(this.groupBox2); + this.tabPage2.Controls.Add(this.linkDnsObjectDoc); + this.tabPage2.Controls.Add(this.txtremoteDNS); + this.tabPage2.Controls.Add(this.label14); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // - // groupBox2 + // linkDnsObjectDoc // - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Controls.Add(this.tabControl2); - this.groupBox2.Controls.Add(this.panel3); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; + resources.ApplyResources(this.linkDnsObjectDoc, "linkDnsObjectDoc"); + this.linkDnsObjectDoc.Name = "linkDnsObjectDoc"; + this.linkDnsObjectDoc.TabStop = true; + this.linkDnsObjectDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkDnsObjectDoc_LinkClicked); // - // tabControl2 + // txtremoteDNS // - resources.ApplyResources(this.tabControl2, "tabControl2"); - this.tabControl2.Controls.Add(this.tabPage3); - this.tabControl2.Controls.Add(this.tabPage4); - this.tabControl2.Controls.Add(this.tabPage5); - this.tabControl2.Controls.Add(this.tabPage8); - this.tabControl2.Name = "tabControl2"; - this.tabControl2.SelectedIndex = 0; + resources.ApplyResources(this.txtremoteDNS, "txtremoteDNS"); + this.txtremoteDNS.Name = "txtremoteDNS"; // - // tabPage3 + // label14 // - resources.ApplyResources(this.tabPage3, "tabPage3"); - this.tabPage3.Controls.Add(this.txtUseragent); - this.tabPage3.Name = "tabPage3"; - this.tabPage3.UseVisualStyleBackColor = true; - // - // txtUseragent - // - resources.ApplyResources(this.txtUseragent, "txtUseragent"); - this.txtUseragent.Name = "txtUseragent"; - // - // tabPage4 - // - resources.ApplyResources(this.tabPage4, "tabPage4"); - this.tabPage4.Controls.Add(this.txtUserdirect); - this.tabPage4.Name = "tabPage4"; - this.tabPage4.UseVisualStyleBackColor = true; - // - // txtUserdirect - // - resources.ApplyResources(this.txtUserdirect, "txtUserdirect"); - this.txtUserdirect.Name = "txtUserdirect"; - // - // tabPage5 - // - resources.ApplyResources(this.tabPage5, "tabPage5"); - this.tabPage5.Controls.Add(this.txtUserblock); - this.tabPage5.Name = "tabPage5"; - this.tabPage5.UseVisualStyleBackColor = true; - // - // txtUserblock - // - resources.ApplyResources(this.txtUserblock, "txtUserblock"); - this.txtUserblock.Name = "txtUserblock"; - // - // tabPage8 - // - resources.ApplyResources(this.tabPage8, "tabPage8"); - this.tabPage8.Controls.Add(this.cmbroutingMode); - this.tabPage8.Name = "tabPage8"; - this.tabPage8.UseVisualStyleBackColor = true; - // - // cmbroutingMode - // - resources.ApplyResources(this.cmbroutingMode, "cmbroutingMode"); - this.cmbroutingMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbroutingMode.FormattingEnabled = true; - this.cmbroutingMode.Items.AddRange(new object[] { - resources.GetString("cmbroutingMode.Items"), - resources.GetString("cmbroutingMode.Items1"), - resources.GetString("cmbroutingMode.Items2"), - resources.GetString("cmbroutingMode.Items3")}); - this.cmbroutingMode.Name = "cmbroutingMode"; - // - // panel3 - // - resources.ApplyResources(this.panel3, "panel3"); - this.panel3.Controls.Add(this.linkLabelRoutingDoc); - this.panel3.Controls.Add(this.btnSetDefRountingRule); - this.panel3.Controls.Add(this.labRoutingTips); - this.panel3.Controls.Add(this.cmbdomainStrategy); - this.panel3.Name = "panel3"; - // - // linkLabelRoutingDoc - // - resources.ApplyResources(this.linkLabelRoutingDoc, "linkLabelRoutingDoc"); - this.linkLabelRoutingDoc.Name = "linkLabelRoutingDoc"; - this.linkLabelRoutingDoc.TabStop = true; - this.linkLabelRoutingDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelRoutingDoc_LinkClicked); - // - // btnSetDefRountingRule - // - resources.ApplyResources(this.btnSetDefRountingRule, "btnSetDefRountingRule"); - this.btnSetDefRountingRule.Name = "btnSetDefRountingRule"; - this.btnSetDefRountingRule.UseVisualStyleBackColor = true; - this.btnSetDefRountingRule.Click += new System.EventHandler(this.btnSetDefRountingRule_Click); - // - // labRoutingTips - // - resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); - this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; - this.labRoutingTips.Name = "labRoutingTips"; - // - // cmbdomainStrategy - // - resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); - this.cmbdomainStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbdomainStrategy.FormattingEnabled = true; - this.cmbdomainStrategy.Items.AddRange(new object[] { - resources.GetString("cmbdomainStrategy.Items"), - resources.GetString("cmbdomainStrategy.Items1"), - resources.GetString("cmbdomainStrategy.Items2")}); - this.cmbdomainStrategy.Name = "cmbdomainStrategy"; + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; // // tabPage6 // @@ -521,30 +381,90 @@ // tabPage7 // resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.numStatisticsFreshRate); + this.tabPage7.Controls.Add(this.txttrayMenuServersLimit); + this.tabPage7.Controls.Add(this.label17); + this.tabPage7.Controls.Add(this.txtautoUpdateSubInterval); + this.tabPage7.Controls.Add(this.label3); + this.tabPage7.Controls.Add(this.chkEnableSecurityProtocolTls13); + this.tabPage7.Controls.Add(this.chkEnableAutoAdjustMainLvColWidth); + this.tabPage7.Controls.Add(this.btnSetLoopback); + this.tabPage7.Controls.Add(this.txtautoUpdateInterval); + this.tabPage7.Controls.Add(this.label15); + this.tabPage7.Controls.Add(this.chkIgnoreGeoUpdateCore); this.tabPage7.Controls.Add(this.chkKeepOlderDedupl); - this.tabPage7.Controls.Add(this.cbFreshrate); this.tabPage7.Controls.Add(this.lbFreshrate); this.tabPage7.Controls.Add(this.chkEnableStatistics); - this.tabPage7.Controls.Add(this.chkAllowLANConn); - this.tabPage7.Controls.Add(this.txturlGFWList); - this.tabPage7.Controls.Add(this.label13); this.tabPage7.Controls.Add(this.chkAutoRun); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // numStatisticsFreshRate + // + resources.ApplyResources(this.numStatisticsFreshRate, "numStatisticsFreshRate"); + this.numStatisticsFreshRate.Name = "numStatisticsFreshRate"; + // + // txttrayMenuServersLimit + // + resources.ApplyResources(this.txttrayMenuServersLimit, "txttrayMenuServersLimit"); + this.txttrayMenuServersLimit.Name = "txttrayMenuServersLimit"; + // + // label17 + // + resources.ApplyResources(this.label17, "label17"); + this.label17.Name = "label17"; + // + // txtautoUpdateSubInterval + // + resources.ApplyResources(this.txtautoUpdateSubInterval, "txtautoUpdateSubInterval"); + this.txtautoUpdateSubInterval.Name = "txtautoUpdateSubInterval"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // chkEnableSecurityProtocolTls13 + // + resources.ApplyResources(this.chkEnableSecurityProtocolTls13, "chkEnableSecurityProtocolTls13"); + this.chkEnableSecurityProtocolTls13.Name = "chkEnableSecurityProtocolTls13"; + this.chkEnableSecurityProtocolTls13.UseVisualStyleBackColor = true; + // + // chkEnableAutoAdjustMainLvColWidth + // + resources.ApplyResources(this.chkEnableAutoAdjustMainLvColWidth, "chkEnableAutoAdjustMainLvColWidth"); + this.chkEnableAutoAdjustMainLvColWidth.Name = "chkEnableAutoAdjustMainLvColWidth"; + this.chkEnableAutoAdjustMainLvColWidth.UseVisualStyleBackColor = true; + // + // btnSetLoopback + // + resources.ApplyResources(this.btnSetLoopback, "btnSetLoopback"); + this.btnSetLoopback.Name = "btnSetLoopback"; + this.btnSetLoopback.UseVisualStyleBackColor = true; + this.btnSetLoopback.Click += new System.EventHandler(this.btnSetLoopback_Click); + // + // txtautoUpdateInterval + // + resources.ApplyResources(this.txtautoUpdateInterval, "txtautoUpdateInterval"); + this.txtautoUpdateInterval.Name = "txtautoUpdateInterval"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // chkIgnoreGeoUpdateCore + // + resources.ApplyResources(this.chkIgnoreGeoUpdateCore, "chkIgnoreGeoUpdateCore"); + this.chkIgnoreGeoUpdateCore.Name = "chkIgnoreGeoUpdateCore"; + this.chkIgnoreGeoUpdateCore.UseVisualStyleBackColor = true; + // // chkKeepOlderDedupl // resources.ApplyResources(this.chkKeepOlderDedupl, "chkKeepOlderDedupl"); this.chkKeepOlderDedupl.Name = "chkKeepOlderDedupl"; this.chkKeepOlderDedupl.UseVisualStyleBackColor = true; // - // cbFreshrate - // - resources.ApplyResources(this.cbFreshrate, "cbFreshrate"); - this.cbFreshrate.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cbFreshrate.FormattingEnabled = true; - this.cbFreshrate.Name = "cbFreshrate"; - // // lbFreshrate // resources.ApplyResources(this.lbFreshrate, "lbFreshrate"); @@ -556,52 +476,145 @@ this.chkEnableStatistics.Name = "chkEnableStatistics"; this.chkEnableStatistics.UseVisualStyleBackColor = true; // - // chkAllowLANConn - // - resources.ApplyResources(this.chkAllowLANConn, "chkAllowLANConn"); - this.chkAllowLANConn.Name = "chkAllowLANConn"; - this.chkAllowLANConn.UseVisualStyleBackColor = true; - // - // txturlGFWList - // - resources.ApplyResources(this.txturlGFWList, "txturlGFWList"); - this.txturlGFWList.Name = "txturlGFWList"; - // - // label13 - // - resources.ApplyResources(this.label13, "label13"); - this.label13.Name = "label13"; - // // chkAutoRun // resources.ApplyResources(this.chkAutoRun, "chkAutoRun"); this.chkAutoRun.Name = "chkAutoRun"; this.chkAutoRun.UseVisualStyleBackColor = true; // - // tabPage9 + // tabPageCoreType // - resources.ApplyResources(this.tabPage9, "tabPage9"); - this.tabPage9.Controls.Add(this.txtuserPacRule); - this.tabPage9.Controls.Add(this.panel4); - this.tabPage9.Name = "tabPage9"; - this.tabPage9.UseVisualStyleBackColor = true; + resources.ApplyResources(this.tabPageCoreType, "tabPageCoreType"); + this.tabPageCoreType.Controls.Add(this.cmbCoreType6); + this.tabPageCoreType.Controls.Add(this.labCoreType6); + this.tabPageCoreType.Controls.Add(this.cmbCoreType5); + this.tabPageCoreType.Controls.Add(this.labCoreType5); + this.tabPageCoreType.Controls.Add(this.cmbCoreType4); + this.tabPageCoreType.Controls.Add(this.labCoreType4); + this.tabPageCoreType.Controls.Add(this.cmbCoreType3); + this.tabPageCoreType.Controls.Add(this.labCoreType3); + this.tabPageCoreType.Controls.Add(this.cmbCoreType2); + this.tabPageCoreType.Controls.Add(this.labCoreType2); + this.tabPageCoreType.Controls.Add(this.cmbCoreType1); + this.tabPageCoreType.Controls.Add(this.labCoreType1); + this.tabPageCoreType.Name = "tabPageCoreType"; + this.tabPageCoreType.UseVisualStyleBackColor = true; // - // txtuserPacRule + // cmbCoreType6 // - resources.ApplyResources(this.txtuserPacRule, "txtuserPacRule"); - this.txtuserPacRule.Name = "txtuserPacRule"; + resources.ApplyResources(this.cmbCoreType6, "cmbCoreType6"); + this.cmbCoreType6.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType6.FormattingEnabled = true; + this.cmbCoreType6.Name = "cmbCoreType6"; // - // panel4 + // labCoreType6 // - resources.ApplyResources(this.panel4, "panel4"); - this.panel4.Controls.Add(this.label4); - this.panel4.Name = "panel4"; + resources.ApplyResources(this.labCoreType6, "labCoreType6"); + this.labCoreType6.Name = "labCoreType6"; // - // label4 + // cmbCoreType5 // - resources.ApplyResources(this.label4, "label4"); - this.label4.ForeColor = System.Drawing.Color.Brown; - this.label4.Name = "label4"; + resources.ApplyResources(this.cmbCoreType5, "cmbCoreType5"); + this.cmbCoreType5.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType5.FormattingEnabled = true; + this.cmbCoreType5.Name = "cmbCoreType5"; + // + // labCoreType5 + // + resources.ApplyResources(this.labCoreType5, "labCoreType5"); + this.labCoreType5.Name = "labCoreType5"; + // + // cmbCoreType4 + // + resources.ApplyResources(this.cmbCoreType4, "cmbCoreType4"); + this.cmbCoreType4.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType4.FormattingEnabled = true; + this.cmbCoreType4.Name = "cmbCoreType4"; + // + // labCoreType4 + // + resources.ApplyResources(this.labCoreType4, "labCoreType4"); + this.labCoreType4.Name = "labCoreType4"; + // + // cmbCoreType3 + // + resources.ApplyResources(this.cmbCoreType3, "cmbCoreType3"); + this.cmbCoreType3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType3.FormattingEnabled = true; + this.cmbCoreType3.Name = "cmbCoreType3"; + // + // labCoreType3 + // + resources.ApplyResources(this.labCoreType3, "labCoreType3"); + this.labCoreType3.Name = "labCoreType3"; + // + // cmbCoreType2 + // + resources.ApplyResources(this.cmbCoreType2, "cmbCoreType2"); + this.cmbCoreType2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType2.FormattingEnabled = true; + this.cmbCoreType2.Name = "cmbCoreType2"; + // + // labCoreType2 + // + resources.ApplyResources(this.labCoreType2, "labCoreType2"); + this.labCoreType2.Name = "labCoreType2"; + // + // cmbCoreType1 + // + resources.ApplyResources(this.cmbCoreType1, "cmbCoreType1"); + this.cmbCoreType1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbCoreType1.FormattingEnabled = true; + this.cmbCoreType1.Name = "cmbCoreType1"; + // + // labCoreType1 + // + resources.ApplyResources(this.labCoreType1, "labCoreType1"); + this.labCoreType1.Name = "labCoreType1"; + // + // tabPage3 + // + resources.ApplyResources(this.tabPage3, "tabPage3"); + this.tabPage3.Controls.Add(this.groupBox2); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.UseVisualStyleBackColor = true; + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.label18); + this.groupBox2.Controls.Add(this.cmbSystemProxyAdvancedProtocol); + this.groupBox2.Controls.Add(this.label13); + this.groupBox2.Controls.Add(this.label12); + this.groupBox2.Controls.Add(this.txtsystemProxyExceptions); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // cmbSystemProxyAdvancedProtocol + // + resources.ApplyResources(this.cmbSystemProxyAdvancedProtocol, "cmbSystemProxyAdvancedProtocol"); + this.cmbSystemProxyAdvancedProtocol.FormattingEnabled = true; + this.cmbSystemProxyAdvancedProtocol.Name = "cmbSystemProxyAdvancedProtocol"; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // txtsystemProxyExceptions + // + resources.ApplyResources(this.txtsystemProxyExceptions, "txtsystemProxyExceptions"); + this.txtsystemProxyExceptions.Name = "txtsystemProxyExceptions"; // // panel2 // @@ -638,24 +651,17 @@ this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); this.tabPage2.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.tabControl2.ResumeLayout(false); - this.tabPage3.ResumeLayout(false); - this.tabPage3.PerformLayout(); - this.tabPage4.ResumeLayout(false); - this.tabPage4.PerformLayout(); - this.tabPage5.ResumeLayout(false); - this.tabPage5.PerformLayout(); - this.tabPage8.ResumeLayout(false); - this.panel3.ResumeLayout(false); - this.panel3.PerformLayout(); + this.tabPage2.PerformLayout(); this.tabPage6.ResumeLayout(false); this.tabPage6.PerformLayout(); this.tabPage7.ResumeLayout(false); this.tabPage7.PerformLayout(); - this.tabPage9.ResumeLayout(false); - this.tabPage9.PerformLayout(); - this.panel4.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.numStatisticsFreshRate)).EndInit(); + this.tabPageCoreType.ResumeLayout(false); + this.tabPageCoreType.PerformLayout(); + this.tabPage3.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); this.panel2.ResumeLayout(false); this.ResumeLayout(false); @@ -675,25 +681,10 @@ private System.Windows.Forms.Panel panel1; private System.Windows.Forms.TabControl tabControl1; private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.ComboBox cmbprotocol; private System.Windows.Forms.Label label1; - private System.Windows.Forms.ComboBox cmbprotocol2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox txtlocalPort2; - private System.Windows.Forms.CheckBox chkudpEnabled2; - private System.Windows.Forms.CheckBox chkAllowIn2; private System.Windows.Forms.CheckBox chkmuxEnabled; - private System.Windows.Forms.TabControl tabControl2; - private System.Windows.Forms.TabPage tabPage3; - private System.Windows.Forms.TabPage tabPage4; - private System.Windows.Forms.Label labRoutingTips; - private System.Windows.Forms.TextBox txtUseragent; - private System.Windows.Forms.TabPage tabPage5; - private System.Windows.Forms.TextBox txtUserdirect; - private System.Windows.Forms.TextBox txtUserblock; private System.Windows.Forms.TabPage tabPage6; private System.Windows.Forms.TextBox txtKcpmtu; private System.Windows.Forms.Label label6; @@ -710,29 +701,50 @@ private System.Windows.Forms.CheckBox chkKcpcongestion; private System.Windows.Forms.TabPage tabPage7; private System.Windows.Forms.CheckBox chkAutoRun; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.TextBox txturlGFWList; private System.Windows.Forms.CheckBox chkAllowLANConn; + private System.Windows.Forms.CheckBox chksniffingEnabled; + private System.Windows.Forms.CheckBox chkEnableStatistics; + private System.Windows.Forms.Label lbFreshrate; + private System.Windows.Forms.CheckBox chkKeepOlderDedupl; + private System.Windows.Forms.CheckBox chkdefAllowInsecure; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.LinkLabel linkDnsObjectDoc; private System.Windows.Forms.TextBox txtremoteDNS; private System.Windows.Forms.Label label14; - private System.Windows.Forms.Panel panel3; - private System.Windows.Forms.ComboBox cmbdomainStrategy; - private System.Windows.Forms.ComboBox cmbroutingMode; - private System.Windows.Forms.CheckBox chksniffingEnabled; - private System.Windows.Forms.CheckBox chksniffingEnabled2; - private System.Windows.Forms.Button btnSetDefRountingRule; - private System.Windows.Forms.CheckBox chkEnableStatistics; - private System.Windows.Forms.ComboBox cbFreshrate; - private System.Windows.Forms.Label lbFreshrate; + private System.Windows.Forms.CheckBox chkIgnoreGeoUpdateCore; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TextBox txtsystemProxyExceptions; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox txtautoUpdateInterval; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.Button btnSetLoopback; + private System.Windows.Forms.CheckBox chkEnableAutoAdjustMainLvColWidth; + private System.Windows.Forms.CheckBox chkEnableSecurityProtocolTls13; + private System.Windows.Forms.TabPage tabPageCoreType; + private System.Windows.Forms.ComboBox cmbCoreType1; + private System.Windows.Forms.Label labCoreType1; + private System.Windows.Forms.ComboBox cmbCoreType6; + private System.Windows.Forms.Label labCoreType6; + private System.Windows.Forms.ComboBox cmbCoreType5; + private System.Windows.Forms.Label labCoreType5; + private System.Windows.Forms.ComboBox cmbCoreType4; + private System.Windows.Forms.Label labCoreType4; + private System.Windows.Forms.ComboBox cmbCoreType3; + private System.Windows.Forms.Label labCoreType3; + private System.Windows.Forms.ComboBox cmbCoreType2; + private System.Windows.Forms.Label labCoreType2; private System.Windows.Forms.Label label16; - private System.Windows.Forms.ComboBox cmblistenerType; - private System.Windows.Forms.TabPage tabPage8; - private System.Windows.Forms.TabPage tabPage9; - private System.Windows.Forms.TextBox txtuserPacRule; - private System.Windows.Forms.Panel panel4; private System.Windows.Forms.Label label4; - private System.Windows.Forms.CheckBox chkKeepOlderDedupl; - private System.Windows.Forms.LinkLabel linkLabelRoutingDoc; - private System.Windows.Forms.CheckBox chkdefAllowInsecure; + private System.Windows.Forms.TextBox txtpass; + private System.Windows.Forms.TextBox txtuser; + private System.Windows.Forms.TextBox txtautoUpdateSubInterval; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txttrayMenuServersLimit; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.ComboBox cmbSystemProxyAdvancedProtocol; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.NumericUpDown numStatisticsFreshRate; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 78d4eeff..5d065166 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Windows.Forms; -using v2rayN.Handler; using v2rayN.Base; -using v2rayN.HttpProxyHandler; +using v2rayN.Handler; +using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -16,15 +18,15 @@ namespace v2rayN.Forms private void OptionSettingForm_Load(object sender, EventArgs e) { + cmbSystemProxyAdvancedProtocol.Items.AddRange(Global.IEProxyProtocols.ToArray()); + InitBase(); - InitRouting(); - InitKCP(); InitGUI(); - InitUserPAC(); + InitCoreType(); } /// @@ -46,47 +48,22 @@ namespace v2rayN.Forms cmbprotocol.Text = config.inbound[0].protocol.ToString(); chkudpEnabled.Checked = config.inbound[0].udpEnabled; chksniffingEnabled.Checked = config.inbound[0].sniffingEnabled; + chkAllowLANConn.Checked = config.inbound[0].allowLANConn; + txtuser.Text = config.inbound[0].user; + txtpass.Text = config.inbound[0].pass; - txtlocalPort2.Text = $"{config.inbound[0].localPort + 1}"; - cmbprotocol2.Text = Global.InboundHttp; - - if (config.inbound.Count > 1) - { - txtlocalPort2.Text = config.inbound[1].localPort.ToString(); - cmbprotocol2.Text = config.inbound[1].protocol.ToString(); - chkudpEnabled2.Checked = config.inbound[1].udpEnabled; - chksniffingEnabled2.Checked = config.inbound[1].sniffingEnabled; - chkAllowIn2.Checked = true; - } - else - { - chkAllowIn2.Checked = false; - } - chkAllowIn2State(); } //remoteDNS txtremoteDNS.Text = config.remoteDNS; - cmblistenerType.SelectedIndex = (int)config.listenerType; - chkdefAllowInsecure.Checked = config.defAllowInsecure; + + txtsystemProxyExceptions.Text = config.systemProxyExceptions; + + cmbSystemProxyAdvancedProtocol.Text = config.systemProxyAdvancedProtocol; } - /// - /// 初始化路由设置 - /// - private void InitRouting() - { - //路由 - cmbdomainStrategy.Text = config.domainStrategy; - int.TryParse(config.routingMode, out int routingMode); - cmbroutingMode.SelectedIndex = routingMode; - - txtUseragent.Text = Utils.List2String(config.useragent, true); - txtUserdirect.Text = Utils.List2String(config.userdirect, true); - txtUserblock.Text = Utils.List2String(config.userblock, true); - } /// /// 初始化KCP设置 @@ -110,45 +87,46 @@ namespace v2rayN.Forms //开机自动启动 chkAutoRun.Checked = Utils.IsAutoRun(); - //自定义GFWList - txturlGFWList.Text = config.urlGFWList; - - chkAllowLANConn.Checked = config.allowLANConn; chkEnableStatistics.Checked = config.enableStatistics; + numStatisticsFreshRate.Value = config.statisticsFreshRate; chkKeepOlderDedupl.Checked = config.keepOlderDedupl; + chkIgnoreGeoUpdateCore.Checked = config.ignoreGeoUpdateCore; + chkEnableAutoAdjustMainLvColWidth.Checked = config.uiItem.enableAutoAdjustMainLvColWidth; + chkEnableSecurityProtocolTls13.Checked = config.enableSecurityProtocolTls13; - - - ComboItem[] cbSource = new ComboItem[] - { - new ComboItem{ID = (int)Global.StatisticsFreshRate.quick, Text = UIRes.I18N("QuickFresh")}, - new ComboItem{ID = (int)Global.StatisticsFreshRate.medium, Text = UIRes.I18N("MediumFresh")}, - new ComboItem{ID = (int)Global.StatisticsFreshRate.slow, Text = UIRes.I18N("SlowFresh")}, - }; - cbFreshrate.DataSource = cbSource; - - cbFreshrate.DisplayMember = "Text"; - cbFreshrate.ValueMember = "ID"; - - switch (config.statisticsFreshRate) - { - case (int)Global.StatisticsFreshRate.quick: - cbFreshrate.SelectedItem = cbSource[0]; - break; - case (int)Global.StatisticsFreshRate.medium: - cbFreshrate.SelectedItem = cbSource[1]; - break; - case (int)Global.StatisticsFreshRate.slow: - cbFreshrate.SelectedItem = cbSource[2]; - break; - } - + txtautoUpdateInterval.Text = config.autoUpdateInterval.ToString(); + txtautoUpdateSubInterval.Text = config.autoUpdateSubInterval.ToString(); + txttrayMenuServersLimit.Text = config.trayMenuServersLimit.ToString(); } - private void InitUserPAC() + private void InitCoreType() { - txtuserPacRule.Text = Utils.List2String(config.userPacRule, true); + if (config.coreTypeItem == null) + { + config.coreTypeItem = new List(); + } + + foreach (EConfigType it in Enum.GetValues(typeof(EConfigType))) + { + if (config.coreTypeItem.FindIndex(t => t.configType == it) >= 0) + { + continue; + } + + config.coreTypeItem.Add(new CoreTypeItem() + { + configType = it, + coreType = ECoreType.Xray + }); + } + for (int k = 1; k <= config.coreTypeItem.Count; k++) + { + var item = config.coreTypeItem[k - 1]; + ((ComboBox)tabPageCoreType.Controls[$"cmbCoreType{k}"]).Items.AddRange(Global.coreTypes.ToArray()); + tabPageCoreType.Controls[$"labCoreType{k}"].Text = item.configType.ToString(); + tabPageCoreType.Controls[$"cmbCoreType{k}"].Text = item.coreType.ToString(); + } } private void btnOK_Click(object sender, EventArgs e) @@ -158,10 +136,6 @@ namespace v2rayN.Forms return; } - if (SaveRouting() != 0) - { - return; - } if (SaveKCP() != 0) { @@ -173,18 +147,18 @@ namespace v2rayN.Forms return; } - if (SaveUserPAC() != 0) + if (SaveCoreType() != 0) { return; } if (ConfigHandler.SaveConfig(ref config) == 0) { - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } @@ -206,55 +180,46 @@ namespace v2rayN.Forms string protocol = cmbprotocol.Text.TrimEx(); bool udpEnabled = chkudpEnabled.Checked; bool sniffingEnabled = chksniffingEnabled.Checked; + bool allowLANConn = chkAllowLANConn.Checked; if (Utils.IsNullOrEmpty(localPort) || !Utils.IsNumberic(localPort)) { - UI.Show(UIRes.I18N("FillLocalListeningPort")); + UI.Show(ResUI.FillLocalListeningPort); return -1; } if (Utils.IsNullOrEmpty(protocol)) { - UI.Show(UIRes.I18N("PleaseSelectProtocol")); + UI.Show(ResUI.PleaseSelectProtocol); return -1; } + + var remoteDNS = txtremoteDNS.Text.TrimEx(); + var obj = Utils.ParseJson(remoteDNS); + if (obj != null && obj.ContainsKey("servers")) + { + } + else + { + if (remoteDNS.Contains("{") || remoteDNS.Contains("}")) + { + UI.Show(ResUI.FillCorrectDNSText); + return -1; + } + } + config.inbound[0].localPort = Utils.ToInt(localPort); config.inbound[0].protocol = protocol; config.inbound[0].udpEnabled = udpEnabled; config.inbound[0].sniffingEnabled = sniffingEnabled; + config.inbound[0].allowLANConn = allowLANConn; + config.inbound[0].user = txtuser.Text; + config.inbound[0].pass = txtpass.Text; - //本地监听2 - string localPort2 = txtlocalPort2.Text.TrimEx(); - string protocol2 = cmbprotocol2.Text.TrimEx(); - bool udpEnabled2 = chkudpEnabled2.Checked; - bool sniffingEnabled2 = chksniffingEnabled2.Checked; - if (chkAllowIn2.Checked) + if (config.inbound.Count > 1) { - if (Utils.IsNullOrEmpty(localPort2) || !Utils.IsNumberic(localPort2)) - { - UI.Show(UIRes.I18N("FillLocalListeningPort")); - return -1; - } - if (Utils.IsNullOrEmpty(protocol2)) - { - UI.Show(UIRes.I18N("PleaseSelectProtocol")); - return -1; - } - if (config.inbound.Count < 2) - { - config.inbound.Add(new Mode.InItem()); - } - config.inbound[1].localPort = Utils.ToInt(localPort2); - config.inbound[1].protocol = protocol2; - config.inbound[1].udpEnabled = udpEnabled2; - config.inbound[1].sniffingEnabled = sniffingEnabled2; - } - else - { - if (config.inbound.Count > 1) - { - config.inbound.RemoveAt(1); - } + config.inbound.RemoveAt(1); } + //日志 config.logEnabled = logEnabled; config.loglevel = loglevel; @@ -262,40 +227,19 @@ namespace v2rayN.Forms //Mux config.muxEnabled = muxEnabled; - //remoteDNS + //remoteDNS config.remoteDNS = txtremoteDNS.Text.TrimEx(); - config.listenerType = (ListenerType)Enum.ToObject(typeof(ListenerType), cmblistenerType.SelectedIndex); - config.defAllowInsecure = chkdefAllowInsecure.Checked; - return 0; - } + config.systemProxyExceptions = txtsystemProxyExceptions.Text.TrimEx(); - /// - /// 保存路由设置 - /// - /// - private int SaveRouting() - { - //路由 - string domainStrategy = cmbdomainStrategy.Text; - string routingMode = cmbroutingMode.SelectedIndex.ToString(); - - string useragent = txtUseragent.Text.TrimEx(); - string userdirect = txtUserdirect.Text.TrimEx(); - string userblock = txtUserblock.Text.TrimEx(); - - config.domainStrategy = domainStrategy; - config.routingMode = routingMode; - - config.useragent = Utils.String2List(useragent); - config.userdirect = Utils.String2List(userdirect); - config.userblock = Utils.String2List(userblock); + config.systemProxyAdvancedProtocol = cmbSystemProxyAdvancedProtocol.Text.TrimEx(); return 0; } + /// /// 保存KCP设置 /// @@ -317,7 +261,7 @@ namespace v2rayN.Forms || Utils.IsNullOrEmpty(readBufferSize) || !Utils.IsNumberic(readBufferSize) || Utils.IsNullOrEmpty(writeBufferSize) || !Utils.IsNumberic(writeBufferSize)) { - UI.Show(UIRes.I18N("FillKcpParameters")); + UI.Show(ResUI.FillKcpParameters); return -1; } config.kcpItem.mtu = Utils.ToInt(mtu); @@ -340,123 +284,48 @@ namespace v2rayN.Forms //开机自动启动 Utils.SetAutoRun(chkAutoRun.Checked); - //自定义GFWList - config.urlGFWList = txturlGFWList.Text.TrimEx(); - - config.allowLANConn = chkAllowLANConn.Checked; - bool lastEnableStatistics = config.enableStatistics; config.enableStatistics = chkEnableStatistics.Checked; - config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; + config.statisticsFreshRate = Convert.ToInt32(numStatisticsFreshRate.Value); + config.keepOlderDedupl = chkKeepOlderDedupl.Checked; - //if(lastEnableStatistics != config.enableStatistics) - //{ - // /// https://stackoverflow.com/questions/779405/how-do-i-restart-my-c-sharp-winform-application - // // Shut down the current app instance. - // Application.Exit(); + config.ignoreGeoUpdateCore = chkIgnoreGeoUpdateCore.Checked; + config.uiItem.enableAutoAdjustMainLvColWidth = chkEnableAutoAdjustMainLvColWidth.Checked; + config.enableSecurityProtocolTls13 = chkEnableSecurityProtocolTls13.Checked; - // // Restart the app passing "/restart [processId]" as cmd line args - // Process.Start(Application.ExecutablePath, "/restart " + Process.GetCurrentProcess().Id); - //} + config.autoUpdateInterval = Utils.ToInt(txtautoUpdateInterval.Text); + config.autoUpdateSubInterval = Utils.ToInt(txtautoUpdateSubInterval.Text); + config.trayMenuServersLimit = Utils.ToInt(txttrayMenuServersLimit.Text); return 0; } - private int SaveUserPAC() + private int SaveCoreType() { - string userPacRule = txtuserPacRule.Text.TrimEx(); - userPacRule = userPacRule.Replace("\"", ""); - - config.userPacRule = Utils.String2List(userPacRule); + for (int k = 1; k <= config.coreTypeItem.Count; k++) + { + var item = config.coreTypeItem[k - 1]; + item.coreType = (ECoreType)Enum.Parse(typeof(ECoreType), tabPageCoreType.Controls[$"cmbCoreType{k}"].Text); + } return 0; } + private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } - private void chkAllowIn2_CheckedChanged(object sender, EventArgs e) + + private void linkDnsObjectDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - chkAllowIn2State(); + Process.Start("https://www.v2fly.org/config/dns.html#dnsobject"); } - private void chkAllowIn2State() + + private void btnSetLoopback_Click(object sender, EventArgs e) { - bool blAllow2 = chkAllowIn2.Checked; - txtlocalPort2.Enabled = - cmbprotocol2.Enabled = - chkudpEnabled2.Enabled = blAllow2; + Process.Start(Utils.GetPath("EnableLoopback.exe")); } - private void btnSetDefRountingRule_Click(object sender, EventArgs e) - { - txtUseragent.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.agentTag); - txtUserdirect.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.directTag); - txtUserblock.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.blockTag); - cmbroutingMode.SelectedIndex = 3; - - List lstUrl = new List - { - Global.CustomRoutingListUrl + Global.agentTag, - Global.CustomRoutingListUrl + Global.directTag, - Global.CustomRoutingListUrl + Global.blockTag - }; - - List lstTxt = new List - { - txtUseragent, - txtUserdirect, - txtUserblock - }; - - for (int k = 0; k < lstUrl.Count; k++) - { - TextBox txt = lstTxt[k]; - DownloadHandle downloadHandle = new DownloadHandle(); - downloadHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - string result = args.Msg; - if (Utils.IsNullOrEmpty(result)) - { - return; - } - txt.Text = result; - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; - - downloadHandle.WebDownloadString(lstUrl[k]); - } - } - void AppendText(bool notify, string text) - { - labRoutingTips.Text = text; - } - - private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - System.Diagnostics.Process.Start("https://www.v2fly.org/config/routing.html"); - } - } - - class ComboItem - { - public int ID - { - get; set; - } - public string Text - { - get; set; - } } } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 2d85641a..d4682ccc 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,1607 +117,128 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 11 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 2 - - - - 30, 176 - - - Record local logs - - - 634, 460 - - - 12 - - - 4, 22 - - - txtKcpwriteBufferSize - - - txtuserPacRule - - - 2 - - - False - - - 18 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - groupBox1 - - - 5 - - - 94, 21 - - - 9 - - - groupBox1 - - - tabPage9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - linkLabelRoutingDoc - - - 468, 60 - - - - Top - - - 102, 16 - - - 6 - - - txtKcptti - - - tabPage3 - - - 4, 22 - - - cmblistenerType - - - 0 - - - 634, 460 - - - 0 - - - 111, 100 - - - True - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3 - - - 598, 16 - - - Core: basic settings - - - True - - - 120, 16 - - - 281, 12 - - - panel3 - - - True - - - tti - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 84, 16 - - - groupBox1 - - - 65, 12 - - - 628, 454 - - - tabPage7 - - - Only open PAC, do not automatically configure PAC - - - 12 - - - 662, 60 - - - 20 - - - http - - - 7 - - - chkdefAllowInsecure - - - 648, 573 - - - 206, 64 - - - 95, 12 - - - tabPage6 - - - 14 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 63 - - - tabControl2 - - - 16 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - Enable UDP - - - 94, 21 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - &Cancel - - - label10 - - - 648, 573 - - - Vertical - - - groupBox1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 1 - - - Bypassing the LAN address - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bypassing LAN and mainland address - - - Bypass mainland address - - - Top - - - 12 - - - txtKcpmtu - - - lbFreshrate - - - 1 - - - label11 - - - 29 - - - 1 - - - NoControl - - - Turn on Sniffing - - - Only open Http proxy, do not automatically configure proxy server (direct mode) - - - False - - - 4 - - - tabPage6 - - - False - - - tabControl2 - - - 1 - - - $this - - - 7 - - - 3 - - - 4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - readBufferSize - - - 0 - - - tabPage6 - - - 3 - - - True - - - 18 - - - True - - - Fill - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - congestion - - - NoControl - - - groupBox1 - - - panel3 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3, 3, 3 - - - 89, 12 - - - info - - - txtUseragent - - - 1 - - - tabPage7 - - - v2rayN settings - - - 20 - - - groupBox1 - - - 16 - - - Not Enabled Http Proxy - - - 14 - - - 32 - - - 628, 454 - - - 6, 12 - - - groupBox1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - txtKcpdownlinkCapacity - - - 198, 16 - - - Automatically start at system startup - - - 3, 3, 3, 3 - - - 1 - - - Http proxy - - - 4 - - - groupBox1 - tabPage6 - - 355, 16 + + + 351, 211 - - 3, 3, 3, 3 - - - 97, 20 - - - 3 - - - 662, 605 - - - 33, 29 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 78, 21 - - - 5, 45 - - - Custom DNS (multiple, separated by commas (,)) - - - tabControl1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 598, 16 - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - warning - - + groupBox1 - - 0 - - - tabPage7 - - - Statistics freshrate - - - label5 - - - 120, 16 - - - 20 - - - 89, 12 - - - Only open Http proxy and do nothing - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 18, 66 - - - 20, 143 - - - 11 - - - 4, 4, 4, 4 - - - tabPage6 - - - btnClose - - - Turn on Sniffing - - - groupBox1 - - - 18, 28 - - - 30 - - - 34 - - - 20 - - - 29 - - - 0 - - - 21, 17 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 14 - - - 19 - - - 4, 22 - - - *Set user pac rules, separated by commas (,) - - - True - - - chksniffingEnabled - - + + 6 - - 174, 16 - - - 16 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 18, 104 - - - tabPage2 - - - NoControl - - - 97, 20 - - - socks - - - tabPage5 - - - 576, 16 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 464, 20 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage9 - - - True - - - tabPage6 - - - *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP - - - tabPage3 - - - 30 - - - 53, 12 - - - 17 - - - label8 - - - 468, 27 - - - label13 - - - chkAutoRun - - - tabControl2 - - - 654, 579 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 345, 62 - - - 15 - - - 12 - - - 1 - - - chkudpEnabled - - - True - - - 33, 253 - - - tabPage1 - - - 5 - - - tabPage6 - - - 2 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - - - btnSetDefRountingRule - - - True - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 32 - - - label1 - - - 84, 16 - - - tabPage8 - - - True - - - panel4 - - - label7 - - - allowInsecure - - - txtlocalPort - - - True - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 3, 17 - - - 3, 40 - - - labRoutingTips - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3, 3, 3, 3 - - - 124, 25 - - - protocol - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl2 - - - Top, Right - - - Turn on Mux Multiplexing - - - True - - - 23, 12 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 555, 100 - - - socks - - - 0 - - - 3, 3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - chkAllowLANConn - - - 84, 16 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - tabControl1 - - - True - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15, 38 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - 10 - - - 369, 62 - - - 13 - - - 1.Proxy Domain or IP - - - groupBox1 - - - panel3 - - - NoControl - - - 654, 579 - - - chkEnableStatistics - - - 14 - - - 8 - - - 7 - - - http - - - 53, 12 - - - 193, 162 - - - True - - - 2 - - - 0 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - label2 - - - 165, 20 - - - False - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 3, 3 - - - 9 - - - groupBox1 - - - 4.Pre-defined rules - - - 101, 12 - - - 3 - - - 12 - - - 431, 12 - - - Domain strategy - - - cmbprotocol - - - 648, 37 - - - True - - - Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - Listening port - - Vertical - - - Fill - - - 1 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Vertical - - - 1 - - - 28 - - - 257, 60 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 94, 21 - - - True - - - cmbprotocol2 - - - Open Http proxy and automatically configure proxy server (global mode) - - - groupBox2 - - - chkKeepOlderDedupl - - - 15, 129 - - - 255, 20 - - - mtu - - - True - - - True - - - True - - - chkKcpcongestion - - - 1 - - - 0 - - - 257, 25 - - - 3, 84 - - - groupBox1 - - - Top - - - listening port 2 - - - 97, 20 - - - chkAllowIn2 - - - tabPage2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - True - - - False - - - 3 - - - 33 - - - 4, 22 - - - 9 - - - 541, 100 - - - Core: KCP settings - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - error - - - 15, 160 - - - True - - - 59, 12 - - - 5, 14 - - - groupBox1 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 634, 460 - - - 12 - - - 120, 16 - - - 662, 10 - - - txtlocalPort2 - - - Only open PAC and do nothing - - - True - - - Fill - - - groupBox1 - - - 654, 579 - - - 7 - - - 27 - - - 10 - - - False - - - Vertical - - - 206, 29 - - + 8 - - txtUserdirect + + 317, 12 - - chkudpEnabled2 - - - 0 - - - 0 - - - 648, 536 - - - Allow connections from the LAN - - - 161, 84 - - - panel3 - - - 0 - - - tabPage6 - - - tabControl2 - - - 30, 87 - - - txtKcpreadBufferSize - - - 4 - - + panel2 - - 3 - - - 8 - - - 35 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - User PAC settings - - - 95, 12 - - - tabPage7 - - - 10 - - - none - - - Log level - - - tabControl1 - - - protocol - - - 6 - - - tabPage4 - - - NoControl - - - 2 - - - AsIs - - - 15, 62 - - - 7 - - - tabPage7 - - - 642, 486 - - - 4, 22 - - - 58, 20 - - - groupBox1 - - - 1 - - - 42, 98 - - - 13 - - - 13 - - - 2 - - - downlinkCapacity - - - True - - - 78, 21 - - - tabPage7 - - - True - - - 19 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - cmbroutingMode - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - 23, 12 - - - True - - - 8 - - - True - - - 3, 3, 3, 3 - - - Custom GFWList address (please fill in the blank without customization) - - - 345, 100 - - - panel3 - - - 75, 23 - - - 654, 579 - - - 10 - - - 204, 16 - - - 17 - - - 628, 454 - - - debug - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6 - - - 1 - - - txtUserblock - - - 229, 23 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage1 - - - 15 - - - 2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 11 - - - 18 - - - 126, 16 - - - 345, 24 - - - NoControl - - - 4, 22 - - - cmbdomainStrategy - - - False - - - 257, 158 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - &OK - - - 10 - - - 634, 460 - - - panel2 - - - txtKcpuplinkCapacity - - - 115, 10 - - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage4 - - - chklogEnabled - - - chksniffingEnabled2 - tabPage7 - - 642, 67 - - - 0 - - - 4, 22 - - - True - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage5 - - - 9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - IPIfNonMatch - - - groupBox1 - - - 4, 22 - - - 23 - - - 3.Block Domain or IP - - - label3 - - - 6 - - - 236, 66 - - + tabPage7 - - $this + + 355, 16 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 97, 21 + + + error + + + 15, 129 + + + readBufferSize + + + + NoControl + + + chkudpEnabled + + + 45 + + + txtpass + + + 282, 23 + + + info + + + downlinkCapacity + + + mtu + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + labCoreType4 + + + 506, 16 + + + 41 + + + 36 + + + 143, 20 + + + 10 + + + 120, 21 + + True - - $this + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 8 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - txtremoteDNS + + Log level - - 3, 3 + + groupBox1 - - 0, 615 + + panel1 - - 19 - - - 33 - - - 94, 21 - - - 4, 22 - - - writeBufferSize + + tabPage6 11 @@ -1725,347 +246,1913 @@ System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 89, 12 + + 35 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 31 - - - 369, 27 - - - 4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - tabPage6 - - - groupBox1 - - - groupBox1 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel4 - - - True - - - 29 - - - Fill - - - True - - - 3, 3 - - - OptionSettingForm - - - 124, 94 - - - Core: Routing settings - - - 13 - - - tabPage8 - - - 2 - - - 236, 104 - - - 5 - - - Open PAC and automatically configure PAC (PAC mode) - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - NoControl - - - tabPage9 - - - 94, 21 - - - 75, 23 - - - 15, 16 - - - 33, 277 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 0, 0, 0 - - - 662, 675 - - - uplinkCapacity - - - IPOnDemand - - - NoControl - - - True - - + 6 - - 1 - - - 0 - - - Settings - - - 0 - - - 3, 3, 3, 3 - - - 3, 3 - - - 32, 205 - - - cmbloglevel - - - 111, 62 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - label4 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - label16 - - - btnOK - - - Set default custom routing rules - - - tabPage6 - - - txturlGFWList - - - chkmuxEnabled - - - 654, 579 - - - tabPage6 - - - tabControl1 - - - 0 - - - 15, 110 - - - 5, 11 - - - 0 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0, 0 + + 45, 150 Enable UDP - + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 3, 3, 3, 3 + + 15, 131 - + + tabPage7 + + + 8, 41 + + + 45, 46 + + + 94, 21 + + + 390, 16 + + groupBox1 - - 19 + + 2 - - 2.Direct Domain or IP + + tabPage7 - - 267, 16 + + 285, 25 - - Global + + 15, 16 - + + 179, 12 + + + 97, 21 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Fill + + Statistics freshrate (second) - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 9 + + warning 0 - - 322, 10 + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 15, 192 - - - 0 - - - 94, 21 - - - 3 + + groupBox1 Keep older when deduplication - + + txtlocalPort + + + 84, 16 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + True + + + 15 + + + groupBox2 + + + System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 193, 162 + + + 342, 17 + + + 95, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 27, 188 + + + 8 + + + tabPage7 + + + 236, 66 + + + 1 + + + groupBox1 + + + 13 + + + 2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 39 + + + 124, 25 + + + True + + + 11 + + + 0 + + + 9 + + + protocol + + + True + + + tabPage6 + + 3, 3, 3, 3 - - 236, 28 + + True - - Bottom + + chkEnableStatistics + + + OptionSettingForm + + + 9 + + + 12 + + + label14 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + Record local logs + + + Automatically adjust column width after updating subscription + + + Auth user + + + 3, 3, 3, 3 + + + label15 + + + 43 + + + labCoreType3 + + + 5 + + + True + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 33, 29 + + + 11 + + + 117, 172 + + + Use semicolon (;) + + + 75, 23 + + + tabControl1 + + + tabPage2 + + + 12 + + + 3, 3, 3, 3 + + + groupBox1 + + + lbFreshrate + + + labCoreType1 + + + 44 + + + 10 + + + 9 + + + 14 + + + 4, 4, 4, 4 + + + True + + + NoControl + + + 4, 22 + + + Core Type + + + 736, 453 + + + 59, 12 + + + 15, 108 + + + True + + + 2 + + + True + + + 31 + + + 0 + + + 36 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + none + + + 7 + + + 45, 98 + + + label10 + + + 94, 21 + + + 4 + + + True + + + 78, 21 3 - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + txtsystemProxyExceptions - + + 236, 104 + + + 42 + + + True + + + label11 + + + 12 + + + True + + + chkEnableAutoAdjustMainLvColWidth + + 0 + + 7 + + + $this + + + btnSetLoopback + + + chkEnableSecurityProtocolTls13 + + + 10 + + + 15, 160 + + + 97, 20 + + + 143, 20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 23 + + + cmbloglevel + + + 496, 61 + + + label16 + + + 20 + + + v2rayN settings + + + groupBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + tabPage7 + + + 4 + + + 120, 16 + + + groupBox1 + + + NoControl + + + cmbCoreType6 + + + True + + + 663, 37 + + + label17 + + + 97, 21 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tabPageCoreType + + + tabPageCoreType + + + 496, 27 + + + linkDnsObjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + cmbCoreType5 + + + tabPageCoreType + + + Do not use proxy server for addresses beginning with + + + tabPageCoreType + + + 0, 463 + + + 143, 20 + + + True + + + Bottom + + + tti + + + 468, 16 + + + Enable Security Protocol TLS v1.3 (subscription/update/speedtest) + + + 94, 21 + + + 0 + + + NoControl + + + groupBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 6 + + + groupBox2 + + + 3 + + + 9 + + + 94, 21 + + + tabPage6 + + + Settings + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 11 + + + 89, 12 + + + label12 + + + 0 + + + chkmuxEnabled + + + 0 + + + Automatic update interval of and Geo (hours) + + + label2 + + + 1 + + + Automatically start at system startup + groupBox1 - - 125, 12 - - - 3, 3, 3, 3 - - - 11 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 124, 60 - - - cbFreshrate - - - 246, 16 - - - tabPage6 - label6 + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 13 + + + label13 + + + 46 + + + 0 + + + tabControl1 + + + 111, 100 + + + 2 + + + 37 + + + label18 + + + 0 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 7 + + + Automatic update interval of subscriptions (hours) + + + Custom DNS (multiple, separated by commas (,)) + + + 2 + + + 30, 376 + + + chklogEnabled + + + True + + + 345, 62 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 59, 12 + + + 4 + + + 5 + + + 8, 17 + + + 41 + + + 39 + 111, 24 - - panel2 + + 97, 21 - - 21 + + &OK - - label9 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + txtKcpmtu + + + 6 + + + Fill + + + 3, 3 + + + NoControl + + + 8, 52 + + + 4 + + + 102, 16 + + + cmbCoreType4 + + + groupBox2 + + + Fill + + + groupBox1 + + + 6 + + + 736, 523 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + txtKcpwriteBufferSize + + + 18, 28 + + + 62, 21 + + + 736, 10 + + + 236, 28 + + + groupBox2 + + + groupBox1 + + + NoControl + + + 8 + + + 75, 23 + + + 0 + + + 345, 100 + + + 39 + + + 3 + + + 15, 63 + + + Exception + + + cmbSystemProxyAdvancedProtocol + + + tabPage7 + + + 38 + + + chkIgnoreGeoUpdateCore + + + NoControl + + + chksniffingEnabled + + + tabPage7 + + + 5 + + + labCoreType6 + + + 198, 16 + + + numStatisticsFreshRate + + + 0, 0, 0, 0 + + + 15, 62 0, 10 - - panel1 + + NoControl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 42 + + + 397, 65 + + + tabPageCoreType + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 44 + + + tabPage7 + + + 53, 12 + + + 2 + + + tabPageCoreType + + + Core Type + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 5 + + + 728, 427 + + + labCoreType2 + + + 8 + + + NoControl + + + 8, 28 + + + 9 + + + 59, 12 + + + chkKeepOlderDedupl + + + 45 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 6, 12 + + + 84, 16 + + + 329, 12 + + + 1 + + + NoControl + + + label5 + + + 59, 12 + + + 728, 427 + + + Core Type + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 728, 427 + + + True + + + 479, 41 + + + tabControl1 + + + 1 + + + tabPage1 + + + 45, 176 + + + 10 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 9 + + + 3 + + + 351, 157 + + + 43 + + + 47 + + + 59, 12 + + + allowInsecure + + + 36 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + tabPage7 + + + Core Type + + + 728, 427 + + + True + + + btnOK + + + True + + + 8 + + + cmbCoreType3 + + + 397, 27 + + + 42 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 41 + + + 42 + + + 45, 124 + + + tabPage7 + + + tabControl1 + + + 59, 12 + + + 10 + + + Core: basic settings + + + 6 + + + CoreType settings + + + 6 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage3 + + + 263, 12 + + + panel2 + + + tabPage7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + chkAutoRun + + + 143, 20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 192 + + + tabPage2 + + + btnClose + + + 638, 356 + + + chkdefAllowInsecure + + + 1 + + + groupBox2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 638, 219 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + tabPage3 + + + 40 + + + 143, 20 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtKcptti + + + 23, 12 + + + 3, 3, 3, 3 + + + 23, 12 + + + 4, 22 + + + True + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 30 + + + 285, 61 + + + 45, 72 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + writeBufferSize + + + 117, 146 + + + Ignore Geo files when updating core + + + 736, 60 + + + 39 + + + 38 + + + txtKcpdownlinkCapacity + + + 117, 42 + + + label4 + + + 29 + + + label8 + + + 257, 158 + + + NoControl + + + True + + + &Cancel + + + 15, 85 + + + 4, 22 + + + 351, 184 + + + NoControl + + + groupBox1 + + + chkAllowLANConn + + + txtautoUpdateSubInterval + + + tabPage7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 27, 215 + + + 89, 12 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 234, 16 + + + 89, 12 + + + 12 + + + Tray right-click menu servers display limit + + + congestion + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 107, 12 + + + groupBox1 + + + False + + + 97, 20 + + + 5 + + + 11 + + + tabPage6 + + + txtuser + + + tabControl1 + + + 107, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 20 + + + 117, 120 + + + True + + + 143, 20 + + + 345, 24 + + + Top + + + 11 + + + True + + + NoControl + + + 4, 22 + + + NoControl + + + 8 + + + 59, 12 + + + 39 + + + 18, 66 + + + Allow connections from the LAN + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 18, 104 + + + Set Windows10 UWP Loopback + + + txtautoUpdateInterval + + + 246, 16 + + + tabPage1 + + + 2 + + + 94, 21 + + + Fill + + + True + + + 13 + + + txtKcpreadBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 6 + + + Turn on Mux Multiplexing + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + + tabPageCoreType + + + groupBox1 + + + 7 + + + 94, 21 + + + Turn on Sniffing + + + socks + + + tabPageCoreType + + + 117, 94 + + + 14 + + + 29 + + + http + + + True + + + NoControl + + + Vertical + + + 8 + + + True + + + 37 + + + label1 + + + 5 + + + groupBox1 + + + 37 + + + $this + + + 728, 427 + + + 3 + + + label9 + + + True + + + tabPage7 + + + txttrayMenuServersLimit + + + Support DnsObject + + + True + + + 267, 16 + + + NoControl + + + txtKcpuplinkCapacity + + + 3 + + + tabPage6 + + + 40 + + + 174, 16 + + + 224, 29 + + + 40 + + + 722, 421 + + + 117, 68 + + + 4 + + + True + + + 224, 65 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Vertical + + + Core Type + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + + cmbCoreType2 + + + 8, 346 + + + 38 + + + 281, 12 + + + NoControl + + + 20, 143 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Core Type + + + 44 + + + True + + + System proxy settings + + + 15 + + + 126, 16 + + + cmbCoreType1 + + + label3 + + + 5 + + + tabPage6 + + + 2 + + + label7 + + + NoControl + + + tabPage6 + + + 59, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtremoteDNS + + + Auth pass + + + tabPage7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 40 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 204, 16 + + + True + + + 12 + + + 47 2 - - label14 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Core: DNS settings + + + 45 + + + 59, 12 + + + 27, 161 + + + 0, 0 + + + Enable Statistics (Realtime netspeed and traffic records. Require restart) + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + debug + + + 7 + + + Core: KCP settings + + + tabControl1 + + + labCoreType5 + + + 111, 62 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 305, 12 + + + 38 + + + 1 + + + 4 + + + chkKcpcongestion + + + 1 + + + 0 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 33 + + + 7 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 101, 12 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 269, 12 + + + 728, 427 + + + NoControl + + + tabPageCoreType + + + tabPage6 + + + 728, 427 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 638, 20 + + + tabPageCoreType + + + True + + + 6, 283 + + + 11 + + + cmbprotocol + + + 2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageCoreType + + + 4 + + + 3 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + tabPage2 + + + tabPageCoreType + + + NoControl + + + True + + + 9 + + + 0, 0 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + 8, 371 + + + uplinkCapacity + + + 10 + + + 14 + + + tabControl1 + + + Advanced proxy settings, protocol selection (optional) + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + tabPage6 + + + 1 + + + 0 True diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index 81c0d92c..04e93138 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -120,48 +120,36 @@ 取消(&C) - - Core:基础设置 - - - 222, 16 - - - 底层传输安全选tls时,默认跳过证书验证(allowInsecure) - 53, 12 - Http代理 + 认证密码 - - 关闭Http代理 + + 219, 65 - - 开启Http代理,并自动配置系统代理(全局模式) + + 65, 12 - - 开启PAC,并自动配置系统代理(PAC模式) + + 认证用户名 - - 仅开启Http代理,并清除系统代理 + + 15, 208 - - 仅开启PAC,并清除系统代理 + + 324, 16 - - 仅开启Http代理,不改变系统代理 + + 传输层安全选tls时,默认跳过证书验证(allowInsecure) - - 仅开启PAC,不改变系统代理 + + 144, 16 - - 96, 16 - - - 开启流量探测 + + 允许来自局域网的连接 96, 16 @@ -169,32 +157,17 @@ 开启流量探测 - - 191, 12 + + 15, 145 - - 自定义DNS(可多个,用逗号(,)隔开) + + 114, 16 - 开启Mux多路复用(默认开启) + 开启Mux多路复用 - - 102, 16 - - - 本地监听端口2 - - - 66, 16 - - - 开启UDP - - - 29, 12 - - - 协议 + + 219, 29 29, 12 @@ -208,12 +181,21 @@ 开启UDP + + 15, 176 + 156, 16 记录本地日志(默认关闭) + + 257, 174 + + + 193, 178 + 53, 12 @@ -226,106 +208,86 @@ 本地监听端口 + + 648, 437 + + + 654, 443 + + + Core:基础设置 + + + 161, 12 + + + 支持填写DnsObject,JSON格式 + + + 191, 12 + + + 自定义DNS(可多个,用逗号(,)隔开) + + + 654, 443 + - Core:路由设置 + Core:DNS设置 - - 3, 89 - - - 642, 481 - - - 634, 455 - - - 1.代理的Domain或IP - - - 628, 449 - - - 634, 455 - - - 2.直连的Domain或IP - - - 628, 449 - - - 634, 455 - - - 3.阻止的Domain或IP - - - 628, 449 - - - 634, 455 - - - 4.预定义规则 - - - 全局 - - - 绕过局域网地址 - - - 绕过大陆地址 - - - 绕过局域网及大陆地址 - - - 19, 26 - - - 244, 20 - - - 642, 72 - - - 77, 12 - - - 域名解析策略 - - - - NoControl - - - 351, 14 - - - 201, 23 - - - 一键设置默认自定义路由规则 - - - - True - - - 5, 49 - - - 383, 12 - - - *设置的规则,用逗号(,)隔开;支持Domain(纯字符串/正则/子域名)和IP + + 654, 443 Core:KCP设置 - - v2rayN设置 + + 472, 37 + + + 248, 211 + + + 185, 12 + + + 托盘右键菜单服务器展示数量限制 + + + 248, 184 + + + 173, 12 + + + 自动更新订阅的间隔(单位小时) + + + 启用安全协议TLS v1.3 (订阅/检查更新/测速) + + + 204, 16 + + + 自动调整服务器列宽在更新订阅后 + + + 解除Windows10 UWP应用回环代理限制 + + + 248, 157 + + + 191, 12 + + + 自动更新Geo文件的间隔(单位小时) + + + 150, 16 + + + 更新Core时忽略Geo文件 156, 16 @@ -333,29 +295,20 @@ 去重时保留序号较小的项 + + 339, 41 + - 77, 12 + 125, 12 - 统计刷新频率 + 统计刷新频率(单位秒) - 372, 16 + 300, 16 - 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) - - - 144, 16 - - - 允许来自局域网的连接 - - - 227, 12 - - - 自定义GFWList地址(不需自定义请填空白) + 启用统计(实时网速显示和使用流量显示,需要重启) 180, 16 @@ -363,15 +316,66 @@ 开机自动启动(可能会不成功) - - 用户PAC设置 + + 654, 443 - - *设置用户PAC规则,用逗号(,)隔开 + + v2rayN设置 + + + 654, 443 + + + Core类型设置 + + + 173, 12 + + + 高级代理设置, 协议选择(可选) + + + 95, 12 + + + 使用分号(;)分隔 + + + 239, 12 + + + 对于下列字符开头的地址不使用代理服务器: + + + 654, 443 + + + 例外 + + + 654, 443 + + + 系统代理设置 + + + 662, 469 确定(&O) + + 0, 479 + + + 662, 60 + + + 662, 10 + + + 662, 539 + 参数设置 diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.cs b/v2rayN/v2rayN/Forms/QRCodeControl.cs index 02d59b48..89e47cd1 100644 --- a/v2rayN/v2rayN/Forms/QRCodeControl.cs +++ b/v2rayN/v2rayN/Forms/QRCodeControl.cs @@ -12,7 +12,7 @@ namespace v2rayN.Forms } private void QRCodeControl_Load(object sender, System.EventArgs e) { - txtUrl.MouseUp += txtUrl_MouseUp; + txtUrl.MouseUp += txtUrl_MouseUp; } void txtUrl_MouseUp(object sender, MouseEventArgs e) @@ -20,11 +20,11 @@ namespace v2rayN.Forms txtUrl.SelectAll(); } - public void showQRCode(int Index, Config config) + public void showQRCode(VmessItem item) { - if (Index >= 0) + if (item != null) { - string url = ConfigHandler.GetVmessQRCode(config, Index); + string url = ShareHandler.GetShareUrl(item); if (Utils.IsNullOrEmpty(url)) { picQRCode.Image = null; @@ -32,7 +32,7 @@ namespace v2rayN.Forms return; } txtUrl.Text = url; - picQRCode.Image = QRCodeHelper.GetQRCode(url); + picQRCode.Image = QRCodeHelper.GetQRCode(url); } } } diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs b/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs deleted file mode 100644 index 733adb47..00000000 --- a/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace v2rayN.Forms -{ - partial class QRCodeForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.picQRCode = new System.Windows.Forms.PictureBox(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.txtUrl = new System.Windows.Forms.TextBox(); - ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit(); - this.groupBox1.SuspendLayout(); - this.SuspendLayout(); - // - // picQRCode - // - this.picQRCode.Dock = System.Windows.Forms.DockStyle.Fill; - this.picQRCode.Location = new System.Drawing.Point(0, 0); - this.picQRCode.Name = "picQRCode"; - this.picQRCode.Size = new System.Drawing.Size(482, 483); - this.picQRCode.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.picQRCode.TabIndex = 23; - this.picQRCode.TabStop = false; - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.txtUrl); - this.groupBox1.Dock = System.Windows.Forms.DockStyle.Bottom; - this.groupBox1.Location = new System.Drawing.Point(0, 483); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(482, 90); - this.groupBox1.TabIndex = 0; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "URL"; - // - // txtUrl - // - this.txtUrl.Dock = System.Windows.Forms.DockStyle.Fill; - this.txtUrl.Location = new System.Drawing.Point(3, 17); - this.txtUrl.Multiline = true; - this.txtUrl.Name = "txtUrl"; - this.txtUrl.ReadOnly = true; - this.txtUrl.Size = new System.Drawing.Size(476, 70); - this.txtUrl.TabIndex = 0; - // - // QRCodeForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(482, 573); - this.Controls.Add(this.picQRCode); - this.Controls.Add(this.groupBox1); - this.Name = "QRCodeForm"; - this.Text = "服务器配置二维码和URL"; - this.Load += new System.EventHandler(this.QRCodeForm_Load); - this.Shown += new System.EventHandler(this.QRCodeForm_Shown); - ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit(); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.TextBox txtUrl; - private System.Windows.Forms.PictureBox picQRCode; - - } -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.cs b/v2rayN/v2rayN/Forms/QRCodeForm.cs deleted file mode 100644 index d170b173..00000000 --- a/v2rayN/v2rayN/Forms/QRCodeForm.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.Mode; - -namespace v2rayN.Forms -{ - public partial class QRCodeForm : BaseForm - { - public int Index { get; set; } - - public QRCodeForm() - { - InitializeComponent(); - } - - private void QRCodeForm_Load(object sender, EventArgs e) - { - txtUrl.MouseUp += txtUrl_MouseUp; - } - - void txtUrl_MouseUp(object sender, MouseEventArgs e) - { - txtUrl.SelectAll(); - } - - private void QRCodeForm_Shown(object sender, EventArgs e) - { - if (Index >= 0) - { - VmessQRCode vmessQRCode = null; - if (ConfigHandler.GetVmessQRCode(config, Index, ref vmessQRCode) != 0) - { - return; - } - string url = Utils.ToJson(vmessQRCode); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}", Global.vmessProtocol, url); - picQRCode.Image = QRCodeHelper.GetQRCode(url); - txtUrl.Text = url; - } - } - - } -} diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs new file mode 100644 index 00000000..5733b856 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.Designer.cs @@ -0,0 +1,271 @@ +namespace v2rayN.Forms +{ + partial class RoutingRuleSettingDetailsForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingRuleSettingDetailsForm)); + this.panel1 = new System.Windows.Forms.Panel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.chkEnabled = new System.Windows.Forms.CheckBox(); + this.clbInboundTag = new System.Windows.Forms.CheckedListBox(); + this.label2 = new System.Windows.Forms.Label(); + this.clbProtocol = new System.Windows.Forms.CheckedListBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.labRoutingTips = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.cmbOutboundTag = new System.Windows.Forms.ComboBox(); + this.panel4 = new System.Windows.Forms.Panel(); + this.chkAutoSort = new System.Windows.Forms.CheckBox(); + this.btnClose = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.txtIP = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtDomain = new System.Windows.Forms.TextBox(); + this.linkRuleobjectDoc = new System.Windows.Forms.LinkLabel(); + this.panel3.SuspendLayout(); + this.panel4.SuspendLayout(); + this.panel2.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // panel3 + // + this.panel3.Controls.Add(this.linkRuleobjectDoc); + this.panel3.Controls.Add(this.chkEnabled); + this.panel3.Controls.Add(this.clbInboundTag); + this.panel3.Controls.Add(this.label2); + this.panel3.Controls.Add(this.clbProtocol); + this.panel3.Controls.Add(this.label3); + this.panel3.Controls.Add(this.txtPort); + this.panel3.Controls.Add(this.label1); + this.panel3.Controls.Add(this.labRoutingTips); + this.panel3.Controls.Add(this.label4); + this.panel3.Controls.Add(this.cmbOutboundTag); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // chkEnabled + // + resources.ApplyResources(this.chkEnabled, "chkEnabled"); + this.chkEnabled.Name = "chkEnabled"; + this.chkEnabled.UseVisualStyleBackColor = true; + // + // clbInboundTag + // + this.clbInboundTag.CheckOnClick = true; + resources.ApplyResources(this.clbInboundTag, "clbInboundTag"); + this.clbInboundTag.FormattingEnabled = true; + this.clbInboundTag.Items.AddRange(new object[] { + resources.GetString("clbInboundTag.Items"), + resources.GetString("clbInboundTag.Items1"), + resources.GetString("clbInboundTag.Items2"), + resources.GetString("clbInboundTag.Items3")}); + this.clbInboundTag.MultiColumn = true; + this.clbInboundTag.Name = "clbInboundTag"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // clbProtocol + // + this.clbProtocol.CheckOnClick = true; + resources.ApplyResources(this.clbProtocol, "clbProtocol"); + this.clbProtocol.FormattingEnabled = true; + this.clbProtocol.Items.AddRange(new object[] { + resources.GetString("clbProtocol.Items"), + resources.GetString("clbProtocol.Items1"), + resources.GetString("clbProtocol.Items2")}); + this.clbProtocol.MultiColumn = true; + this.clbProtocol.Name = "clbProtocol"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // labRoutingTips + // + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.Name = "labRoutingTips"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // cmbOutboundTag + // + this.cmbOutboundTag.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbOutboundTag.FormattingEnabled = true; + this.cmbOutboundTag.Items.AddRange(new object[] { + resources.GetString("cmbOutboundTag.Items"), + resources.GetString("cmbOutboundTag.Items1"), + resources.GetString("cmbOutboundTag.Items2")}); + resources.ApplyResources(this.cmbOutboundTag, "cmbOutboundTag"); + this.cmbOutboundTag.Name = "cmbOutboundTag"; + // + // panel4 + // + this.panel4.Controls.Add(this.chkAutoSort); + this.panel4.Controls.Add(this.btnClose); + this.panel4.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel4, "panel4"); + this.panel4.Name = "panel4"; + // + // chkAutoSort + // + resources.ApplyResources(this.chkAutoSort, "chkAutoSort"); + this.chkAutoSort.Name = "chkAutoSort"; + this.chkAutoSort.UseVisualStyleBackColor = true; + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel2 + // + this.panel2.Controls.Add(this.groupBox2); + this.panel2.Controls.Add(this.groupBox1); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.txtIP); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // txtIP + // + resources.ApplyResources(this.txtIP, "txtIP"); + this.txtIP.Name = "txtIP"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.txtDomain); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // txtDomain + // + resources.ApplyResources(this.txtDomain, "txtDomain"); + this.txtDomain.Name = "txtDomain"; + // + // linkRuleobjectDoc + // + resources.ApplyResources(this.linkRuleobjectDoc, "linkRuleobjectDoc"); + this.linkRuleobjectDoc.Name = "linkRuleobjectDoc"; + this.linkRuleobjectDoc.TabStop = true; + this.linkRuleobjectDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkRuleobjectDoc_LinkClicked); + // + // RoutingRuleSettingDetailsForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel4); + this.Controls.Add(this.panel3); + this.Controls.Add(this.panel1); + this.Name = "RoutingRuleSettingDetailsForm"; + this.Load += new System.EventHandler(this.RoutingRuleSettingDetailsForm_Load); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.panel4.ResumeLayout(false); + this.panel4.PerformLayout(); + this.panel2.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox cmbOutboundTag; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtDomain; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtIP; + private System.Windows.Forms.Label labRoutingTips; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckedListBox clbProtocol; + private System.Windows.Forms.CheckedListBox clbInboundTag; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox chkEnabled; + private System.Windows.Forms.CheckBox chkAutoSort; + private System.Windows.Forms.LinkLabel linkRuleobjectDoc; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs new file mode 100644 index 00000000..fa600925 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.cs @@ -0,0 +1,148 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.Forms +{ + public partial class RoutingRuleSettingDetailsForm : BaseForm + { + public RulesItem rulesItem + { + get; set; + } + + public RoutingRuleSettingDetailsForm() + { + InitializeComponent(); + } + + private void RoutingRuleSettingDetailsForm_Load(object sender, EventArgs e) + { + if (Utils.IsNullOrEmpty(rulesItem.outboundTag)) + { + ClearBind(); + } + else + { + BindingData(); + } + } + + private void EndBindingData() + { + if (rulesItem != null) + { + rulesItem.port = txtPort.Text.TrimEx(); + + var inboundTag = new List(); + for (int i = 0; i < clbInboundTag.Items.Count; i++) + { + if (clbInboundTag.GetItemChecked(i)) + { + inboundTag.Add(clbInboundTag.Items[i].ToString()); + } + } + rulesItem.inboundTag = inboundTag; + rulesItem.outboundTag = cmbOutboundTag.Text; + if (chkAutoSort.Checked) + { + rulesItem.domain = Utils.String2ListSorted(txtDomain.Text); + rulesItem.ip = Utils.String2ListSorted(txtIP.Text); + } + else + { + rulesItem.domain = Utils.String2List(txtDomain.Text); + rulesItem.ip = Utils.String2List(txtIP.Text); + } + + var protocol = new List(); + for (int i = 0; i < clbProtocol.Items.Count; i++) + { + if (clbProtocol.GetItemChecked(i)) + { + protocol.Add(clbProtocol.Items[i].ToString()); + } + } + rulesItem.protocol = protocol; + rulesItem.enabled = chkEnabled.Checked; + } + } + private void BindingData() + { + if (rulesItem != null) + { + txtPort.Text = rulesItem.port ?? string.Empty; + cmbOutboundTag.Text = rulesItem.outboundTag; + txtDomain.Text = Utils.List2String(rulesItem.domain, true); + txtIP.Text = Utils.List2String(rulesItem.ip, true); + + if (rulesItem.inboundTag != null) + { + for (int i = 0; i < clbInboundTag.Items.Count; i++) + { + if (rulesItem.inboundTag.Contains(clbInboundTag.Items[i].ToString())) + { + clbInboundTag.SetItemChecked(i, true); + } + } + } + + if (rulesItem.protocol != null) + { + for (int i = 0; i < clbProtocol.Items.Count; i++) + { + if (rulesItem.protocol.Contains(clbProtocol.Items[i].ToString())) + { + clbProtocol.SetItemChecked(i, true); + } + } + } + chkEnabled.Checked = rulesItem.enabled; + } + } + private void ClearBind() + { + txtPort.Text = string.Empty; + cmbOutboundTag.Text = Global.agentTag; + txtDomain.Text = string.Empty; + txtIP.Text = string.Empty; + chkEnabled.Checked = true; + } + private void btnOK_Click(object sender, EventArgs e) + { + EndBindingData(); + + bool hasRule = + rulesItem.domain != null + && rulesItem.domain.Count > 0 + || rulesItem.ip != null + && rulesItem.ip.Count > 0 + || rulesItem.protocol != null + && rulesItem.protocol.Count > 0 + || !Utils.IsNullOrEmpty(rulesItem.port); + + if (!hasRule) + { + UI.ShowWarning(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Port/Protocol/Domain/IP")); + return; + } + + DialogResult = DialogResult.OK; + } + + private void btnClose_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + + private void linkRuleobjectDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start("https://www.v2fly.org/config/routing.html#ruleobject"); + } + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx new file mode 100644 index 00000000..1ffc0db3 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.resx @@ -0,0 +1,846 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Top + + + + 0, 0 + + + 742, 10 + + + + 7 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + NoControl + + + 19, 86 + + + 0, 0, 0, 0 + + + 89, 12 + + + 43 + + + Ruleobject Doc + + + linkRuleobjectDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + + + True + + + NoControl + + + 632, 45 + + + 60, 16 + + + 42 + + + Enable + + + chkEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + 80 + + + socks + + + http + + + socks2 + + + http2 + + + 347, 16 + + + 345, 20 + + + 41 + + + clbInboundTag + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 2 + + + True + + + NoControl + + + 274, 20 + + + 65, 12 + + + 40 + + + inboundTag + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 3 + + + 80 + + + http + + + tls + + + bittorrent + + + 347, 43 + + + 245, 20 + + + 39 + + + clbProtocol + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 4 + + + True + + + NoControl + + + 274, 47 + + + 53, 12 + + + 36 + + + Protocol + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 5 + + + 107, 43 + + + 119, 21 + + + 35 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 6 + + + True + + + NoControl + + + 19, 47 + + + 29, 12 + + + 34 + + + Port + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 7 + + + NoControl + + + 144, 86 + + + 575, 16 + + + 33 + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 8 + + + True + + + NoControl + + + 19, 20 + + + 71, 12 + + + 32 + + + outboundTag + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 9 + + + proxy + + + direct + + + block + + + 107, 16 + + + 119, 20 + + + 31 + + + cmbOutboundTag + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 10 + + + Top + + + 0, 10 + + + 742, 111 + + + 8 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + chkAutoSort + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 2 + + + Bottom + + + 0, 516 + + + 742, 60 + + + 10 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + NoControl + + + 41, 18 + + + 270, 16 + + + 41 + + + Domain and ip are auto sorted when saving + + + chkAutoSort + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + NoControl + + + 504, 15 + + + 75, 23 + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + NoControl + + + 411, 15 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 2 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Fill + + + 0, 121 + + + 742, 395 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + txtIP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + Fill + + + 392, 0 + + + 350, 395 + + + 4 + + + IP + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + Fill + + + 3, 17 + + + True + + + 344, 375 + + + 25 + + + txtIP + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + txtDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + Left + + + 0, 0 + + + 392, 395 + + + 3 + + + Domain + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Fill + + + 3, 17 + + + True + + + 386, 375 + + + 24 + + + txtDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + 6, 12 + + + 742, 576 + + + 4, 4, 4, 4 + + + RoutingSettingDetailsForm + + + RoutingRuleSettingDetailsForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx similarity index 76% rename from v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx rename to v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx index 2e8e0912..3776d004 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingDetailsForm.zh-Hans.resx @@ -117,68 +117,63 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 取消(&C) - - - 服务器 - - - 194, 21 + + 670, 18 - - 77, 12 + + 372, 16 + + + 272, 20 + + + 279, 20 + + + 372, 46 + + + 272, 20 + + + 279, 50 + + + 120, 46 + + + 19, 50 + + + *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代 - 用户名(可选) + OutboundTag - - 194, 21 + + 120, 16 - - 65, 12 - - - 密码(可选) - - - *手填,方便识别管理 - - - 83, 12 - - - 别名(remarks) - - - 65, 12 - - - 服务器端口 - - - 65, 12 - - - 服务器地址 + + 取消(&C) 确定(&O) - - 92, 21 + + + Vertical - - 导入配置文件 - - - 171, 22 - - - 从剪贴板导入URL + + Vertical - 编辑或添加[Socks]服务器 + 路由规则详情设置 + + + 保存时Domain和IP自动排序 + + + 规则详细说明文档 \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs new file mode 100644 index 00000000..5f76c47d --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.Designer.cs @@ -0,0 +1,357 @@ +namespace v2rayN.Forms +{ + partial class RoutingRuleSettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingRuleSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.label5 = new System.Windows.Forms.Label(); + this.btnBrowse = new System.Windows.Forms.Button(); + this.txtCustomIcon = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.txtUrl = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.lvRoutings = new v2rayN.Base.ListViewFlickerFree(); + this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.menuRemove = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuExportSelectedRules = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.tabControl2 = new System.Windows.Forms.TabControl(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportRulesFromFile = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportRulesFromClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportRulesFromUrl = new System.Windows.Forms.ToolStripMenuItem(); + this.panel2.SuspendLayout(); + this.panel1.SuspendLayout(); + this.cmsLv.SuspendLayout(); + this.tabControl2.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.menuServer.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // panel2 + // + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Controls.Add(this.label5); + this.panel1.Controls.Add(this.btnBrowse); + this.panel1.Controls.Add(this.txtCustomIcon); + this.panel1.Controls.Add(this.label4); + this.panel1.Controls.Add(this.label1); + this.panel1.Controls.Add(this.txtUrl); + this.panel1.Controls.Add(this.label3); + this.panel1.Controls.Add(this.txtRemarks); + this.panel1.Controls.Add(this.label2); + this.panel1.Name = "panel1"; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // btnBrowse + // + resources.ApplyResources(this.btnBrowse, "btnBrowse"); + this.btnBrowse.Name = "btnBrowse"; + this.btnBrowse.UseVisualStyleBackColor = true; + this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click); + // + // txtCustomIcon + // + resources.ApplyResources(this.txtCustomIcon, "txtCustomIcon"); + this.txtCustomIcon.Name = "txtCustomIcon"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // txtUrl + // + resources.ApplyResources(this.txtUrl, "txtUrl"); + this.txtUrl.Name = "txtUrl"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // lvRoutings + // + resources.ApplyResources(this.lvRoutings, "lvRoutings"); + this.lvRoutings.ContextMenuStrip = this.cmsLv; + this.lvRoutings.FullRowSelect = true; + this.lvRoutings.GridLines = true; + this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lvRoutings.HideSelection = false; + this.lvRoutings.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvRoutings.Items")))}); + this.lvRoutings.MultiSelect = false; + this.lvRoutings.Name = "lvRoutings"; + this.lvRoutings.UseCompatibleStateImageBehavior = false; + this.lvRoutings.View = System.Windows.Forms.View.Details; + this.lvRoutings.DoubleClick += new System.EventHandler(this.lvRoutings_DoubleClick); + this.lvRoutings.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvRoutings_KeyDown); + // + // cmsLv + // + resources.ApplyResources(this.cmsLv, "cmsLv"); + this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20); + this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuAdd, + this.menuRemove, + this.menuSelectAll, + this.menuExportSelectedRules, + this.toolStripSeparator3, + this.menuMoveTop, + this.menuMoveUp, + this.menuMoveDown, + this.menuMoveBottom}); + this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.MenuItem1; + // + // menuAdd + // + resources.ApplyResources(this.menuAdd, "menuAdd"); + this.menuAdd.Name = "menuAdd"; + this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); + // + // menuRemove + // + resources.ApplyResources(this.menuRemove, "menuRemove"); + this.menuRemove.Name = "menuRemove"; + this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); + // + // menuSelectAll + // + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Name = "menuSelectAll"; + this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); + // + // menuExportSelectedRules + // + resources.ApplyResources(this.menuExportSelectedRules, "menuExportSelectedRules"); + this.menuExportSelectedRules.Name = "menuExportSelectedRules"; + this.menuExportSelectedRules.Click += new System.EventHandler(this.menuExportSelectedRules_Click); + // + // toolStripSeparator3 + // + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); + this.toolStripSeparator3.Name = "toolStripSeparator3"; + // + // menuMoveTop + // + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); + this.menuMoveTop.Name = "menuMoveTop"; + this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); + // + // menuMoveUp + // + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); + this.menuMoveUp.Name = "menuMoveUp"; + this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); + // + // menuMoveDown + // + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); + this.menuMoveDown.Name = "menuMoveDown"; + this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); + // + // menuMoveBottom + // + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); + this.menuMoveBottom.Name = "menuMoveBottom"; + this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); + // + // MenuItem1 + // + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + this.MenuItem1.DropDown = this.cmsLv; + this.MenuItem1.Name = "MenuItem1"; + // + // tabControl2 + // + resources.ApplyResources(this.tabControl2, "tabControl2"); + this.tabControl2.Controls.Add(this.tabPage2); + this.tabControl2.Name = "tabControl2"; + this.tabControl2.SelectedIndex = 0; + // + // tabPage2 + // + resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Controls.Add(this.lvRoutings); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // menuServer + // + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1, + this.toolStripMenuItem1}); + this.menuServer.Name = "menuServer"; + // + // toolStripMenuItem1 + // + resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1"); + this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuImportRulesFromFile, + this.menuImportRulesFromClipboard, + this.menuImportRulesFromUrl}); + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + // + // menuImportRulesFromFile + // + resources.ApplyResources(this.menuImportRulesFromFile, "menuImportRulesFromFile"); + this.menuImportRulesFromFile.Name = "menuImportRulesFromFile"; + this.menuImportRulesFromFile.Click += new System.EventHandler(this.menuImportRulesFromFile_Click); + // + // menuImportRulesFromClipboard + // + resources.ApplyResources(this.menuImportRulesFromClipboard, "menuImportRulesFromClipboard"); + this.menuImportRulesFromClipboard.Name = "menuImportRulesFromClipboard"; + this.menuImportRulesFromClipboard.Click += new System.EventHandler(this.menuImportRulesFromClipboard_Click); + // + // menuImportRulesFromUrl + // + resources.ApplyResources(this.menuImportRulesFromUrl, "menuImportRulesFromUrl"); + this.menuImportRulesFromUrl.Name = "menuImportRulesFromUrl"; + this.menuImportRulesFromUrl.Click += new System.EventHandler(this.menuImportRulesFromUrl_Click); + // + // RoutingRuleSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.tabControl2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.menuServer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "RoutingRuleSettingForm"; + this.Load += new System.EventHandler(this.RoutingRuleSettingForm_Load); + this.panel2.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.cmsLv.ResumeLayout(false); + this.tabControl2.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Panel panel1; + private Base.ListViewFlickerFree lvRoutings; + private System.Windows.Forms.TabControl tabControl2; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.ContextMenuStrip cmsLv; + private System.Windows.Forms.ToolStripMenuItem menuRemove; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem menuMoveTop; + private System.Windows.Forms.ToolStripMenuItem menuMoveUp; + private System.Windows.Forms.ToolStripMenuItem menuMoveDown; + private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; + private System.Windows.Forms.ToolStripMenuItem menuSelectAll; + private System.Windows.Forms.ToolStripMenuItem menuAdd; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromFile; + private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromClipboard; + private System.Windows.Forms.ToolStripMenuItem menuExportSelectedRules; + private System.Windows.Forms.ToolStripMenuItem menuImportRulesFromUrl; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtUrl; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtCustomIcon; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Button btnBrowse; + private System.Windows.Forms.Label label5; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs new file mode 100644 index 00000000..b88d67d1 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.cs @@ -0,0 +1,365 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.Forms +{ + public partial class RoutingRuleSettingForm : BaseForm + { + public int EditIndex + { + get; set; + } + protected RoutingItem routingItem; + + private readonly List lvSelecteds = new List(); + public RoutingRuleSettingForm() + { + InitializeComponent(); + } + + private void RoutingRuleSettingForm_Load(object sender, EventArgs e) + { + routingItem = EditIndex >= 0 ? config.routings[EditIndex] : new RoutingItem(); + if (routingItem.rules == null) + { + routingItem.rules = new List(); + } + + txtRemarks.Text = routingItem.remarks ?? string.Empty; + txtUrl.Text = routingItem.url ?? string.Empty; + txtCustomIcon.Text = routingItem.customIcon ?? string.Empty; + + InitRoutingsView(); + RefreshRoutingsView(); + } + + private void InitRoutingsView() + { + lvRoutings.BeginUpdate(); + lvRoutings.Items.Clear(); + + lvRoutings.GridLines = true; + lvRoutings.FullRowSelect = true; + lvRoutings.View = View.Details; + lvRoutings.MultiSelect = true; + lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; + lvRoutings.RegisterDragEvent(UpdateDragEventHandler); + + lvRoutings.Columns.Add("", 30); + lvRoutings.Columns.Add("outboundTag", 80); + lvRoutings.Columns.Add("port", 80); + lvRoutings.Columns.Add("protocol", 80); + lvRoutings.Columns.Add("inboundTag", 80); + lvRoutings.Columns.Add("domain", 160); + lvRoutings.Columns.Add("ip", 160); + lvRoutings.Columns.Add("enable", 60); + + lvRoutings.EndUpdate(); + } + private void UpdateDragEventHandler(int index, int targetIndex) + { + if (index < 0 || targetIndex < 0) + { + return; + } + if (ConfigHandler.MoveRoutingRule(ref routingItem, index, EMove.Position, targetIndex) == 0) + { + RefreshRoutingsView(); + } + } + + private void RefreshRoutingsView() + { + lvRoutings.BeginUpdate(); + lvRoutings.Items.Clear(); + + foreach (var item in routingItem.rules) + { + ListViewItem lvItem = new ListViewItem(""); + Utils.AddSubItem(lvItem, "outboundTag", item.outboundTag); + Utils.AddSubItem(lvItem, "port", item.port); + Utils.AddSubItem(lvItem, "protocol", Utils.List2String(item.protocol)); + Utils.AddSubItem(lvItem, "inboundTag", Utils.List2String(item.inboundTag)); + Utils.AddSubItem(lvItem, "domain", Utils.List2String(item.domain)); + Utils.AddSubItem(lvItem, "ip", Utils.List2String(item.ip)); + Utils.AddSubItem(lvItem, "enable", item.enabled.ToString()); + + if (lvItem != null) lvRoutings.Items.Add(lvItem); + } + lvRoutings.EndUpdate(); + } + + private void btnOK_Click(object sender, EventArgs e) + { + routingItem.remarks = txtRemarks.Text.Trim(); + routingItem.url = txtUrl.Text.Trim(); + routingItem.customIcon = txtCustomIcon.Text.Trim(); + + if (ConfigHandler.AddRoutingItem(ref config, routingItem, EditIndex) == 0) + { + DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(ResUI.OperationFailed); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + private void btnBrowse_Click(object sender, EventArgs e) + { + OpenFileDialog openFileDialog1 = new OpenFileDialog(); + openFileDialog1.Filter = "PNG|*.png"; + openFileDialog1.ShowDialog(); + txtCustomIcon.Text = openFileDialog1.FileName; + + } + + private void lvRoutings_DoubleClick(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + var fm = new RoutingRuleSettingDetailsForm(); + fm.rulesItem = routingItem.rules[index]; + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshRoutingsView(); + } + } + + private int GetLvSelectedIndex() + { + int index = -1; + lvSelecteds.Clear(); + try + { + if (lvRoutings.SelectedIndices.Count <= 0) + { + UI.Show(ResUI.PleaseSelectRules); + return index; + } + + index = lvRoutings.SelectedIndices[0]; + foreach (int i in lvRoutings.SelectedIndices) + { + lvSelecteds.Add(i); + } + return index; + } + catch + { + return index; + } + } + + #region Edit function + + private void menuMoveTop_Click(object sender, EventArgs e) + { + MoveRule(EMove.Top); + } + + private void menuMoveUp_Click(object sender, EventArgs e) + { + MoveRule(EMove.Up); + } + + private void menuMoveDown_Click(object sender, EventArgs e) + { + MoveRule(EMove.Down); + } + + private void menuMoveBottom_Click(object sender, EventArgs e) + { + MoveRule(EMove.Bottom); + } + + private void MoveRule(EMove eMove) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + UI.Show(ResUI.PleaseSelectRules); + return; + } + if (ConfigHandler.MoveRoutingRule(ref routingItem, index, eMove) == 0) + { + RefreshRoutingsView(); + } + } + private void menuSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in lvRoutings.Items) + { + item.Selected = true; + } + } + + private void menuAdd_Click(object sender, EventArgs e) + { + var fm = new RoutingRuleSettingDetailsForm(); + fm.rulesItem = new RulesItem(); + if (fm.ShowDialog() == DialogResult.OK) + { + routingItem.rules.Insert(0, fm.rulesItem); + RefreshRoutingsView(); + } + } + + private void menuRemove_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (UI.ShowYesNo(ResUI.RemoveRules) == DialogResult.No) + { + return; + } + for (int k = lvSelecteds.Count - 1; k >= 0; k--) + { + routingItem.rules.RemoveAt(index); + } + RefreshRoutingsView(); + } + private void menuExportSelectedRules_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + var lst = new List(); + foreach (int v in lvSelecteds) + { + lst.Add(routingItem.rules[v]); + } + if (lst.Count > 0) + { + Utils.SetClipboardData(Utils.ToJson(lst)); + //UI.Show(ResUI.OperationSuccess")); + } + + } + + private void lvRoutings_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control) + { + switch (e.KeyCode) + { + case Keys.A: + menuSelectAll_Click(null, null); + break; + case Keys.C: + menuExportSelectedRules_Click(null, null); + break; + } + } + else + { + switch (e.KeyCode) + { + case Keys.Delete: + menuRemove_Click(null, null); + break; + case Keys.T: + menuMoveTop_Click(null, null); + break; + case Keys.B: + menuMoveBottom_Click(null, null); + break; + case Keys.U: + menuMoveUp_Click(null, null); + break; + case Keys.D: + menuMoveDown_Click(null, null); + break; + } + } + } + #endregion + + #region preset rules + + private void menuImportRulesFromFile_Click(object sender, EventArgs e) + { + OpenFileDialog fileDialog = new OpenFileDialog + { + Multiselect = false, + Filter = "Rules|*.json|All|*.*" + }; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + string result = Utils.LoadResource(fileName); + if (Utils.IsNullOrEmpty(result)) + { + return; + } + + if (AddBatchRoutingRules(ref routingItem, result) == 0) + { + RefreshRoutingsView(); + UI.Show(ResUI.OperationSuccess); + } + } + + private void menuImportRulesFromClipboard_Click(object sender, EventArgs e) + { + string clipboardData = Utils.GetClipboardData(); + if (AddBatchRoutingRules(ref routingItem, clipboardData) == 0) + { + RefreshRoutingsView(); + UI.Show(ResUI.OperationSuccess); + } + } + private void menuImportRulesFromUrl_Click(object sender, EventArgs e) + { + var url = txtUrl.Text.Trim(); + if (Utils.IsNullOrEmpty(url)) + { + UI.Show(ResUI.MsgNeedUrl); + return; + } + + Task.Run(async () => + { + DownloadHandle downloadHandle = new DownloadHandle(); + string result = await downloadHandle.DownloadStringAsync(url, false, ""); + if (AddBatchRoutingRules(ref routingItem, result) == 0) + { + RefreshRoutingsView(); + UI.Show(ResUI.OperationSuccess); + } + }); + } + private int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData) + { + bool blReplace = false; + if (UI.ShowYesNo(ResUI.AddBatchRoutingRulesYesNo) == DialogResult.No) + { + blReplace = true; + } + return ConfigHandler.AddBatchRoutingRules(ref routingItem, clipboardData, blReplace); + } + + #endregion + + } +} diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx similarity index 52% rename from v2rayN/v2rayN/Forms/AddServer4Form.resx rename to v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx index d245b984..481e5f26 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.resx @@ -117,107 +117,137 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + - - 113, 12 - - - 113, 12 - - - label6 - - - groupBox1 - - - - True - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 547, 25 - - - 11 + + 199, 6 + + Fill + + + menuImportRulesFromUrl + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Down (D) + + + 762, 25 + + + + 32 + + + 5 + + + 47, 12 + + + Move to bottom (B) + + + panel1 + + + 40 + Bottom - Import configuration file + Edit and Function panel1 - + 3 - - Password(Optional) + + 75, 23 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 + + NoControl System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - menuItemImportClipboard - - - Fill - - - groupBox1 - - - 8 - - - 89, 12 - - - 127, 27 - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + 4 + + True + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 15 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + + $this + + + panel1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + - Edit or add a [Socks] server + Rule Settings + + + Remove selected NoControl + + tabPage2 + - 10 + 4 - - 24 - - - Import URL from clipboard + + 202, 22 - 303, 17 + 475, 17 + + + 75, 23 System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 23 + 33 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 MenuItem1 @@ -225,18 +255,27 @@ 0 - - 359, 21 + + 754, 231 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 1 - 396, 17 + 568, 17 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 8 + + txtCustomIcon + + + NoControl + 0, 0 @@ -244,118 +283,151 @@ label1 - 547, 60 + 762, 60 - - 0, 25 + + Sub Url + + + 95, 21 + + + PNG(128*128) - groupBox1 + panel1 True - - 22 - - 162, 21 + 120, 21 True - - Server - - - 127, 120 - - - panel2 - - - groupBox1 - - - 5 + + Import Rules From Sub Url 2 - - 26 + + menuSelectAll - - groupBox1 + + menuMoveTop - - menuServer + + 202, 22 - - groupBox1 + + cmsLv - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 5 - - NoControl + + Add - - txtId + + 12 - - 235, 22 + + toolStripSeparator3 + + + label5 + + + tabPage2 + + + 644, 48 + + + menuMoveBottom + + + 0, 25 - 12, 93 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 18, 105 System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 12, 31 + 18, 63 - - groupBox1 + + Import Rules From File + + + 202, 22 + + + 762, 257 1 - AddServer4Form + RoutingRuleSettingForm - 194, 21 + 166, 21 System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + panel1 - - 127, 58 + + 202, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 1 + 3 - - 0 + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + btnClose - - $this + + Up (U) + + + 203, 186 + + + btnOK - 71, 12 + 47, 12 + + + 14 + + + Import Rules + + + NoControl System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -363,32 +435,79 @@ $this + + 3, 3 + + + 10, 117 + + + menuImportRulesFromClipboard + + + Import Rules From Clipboard + - groupBox1 + panel1 - - txtPort + + menuAdd - - panel2 + + 0, 167 + + + 247, 22 + + + 4 + + + Move to top (T) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 547, 10 + 762, 142 - - * + + txtUrl - - 2 + + 748, 225 - - txtSecurity + + 660, 104 $this - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 34 + + + 2 + + + 1 label4 @@ -396,193 +515,271 @@ &OK - - btnClose + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 278, 21 + + True + + + 247, 22 + + + panel2 - 0 + 35 - - 3 + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + 71, 12 - 12, 124 + 18, 45 - 2 + 31 - - 10 + + 91, 45 - - btnOK + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 194, 21 + + menuMoveDown - - 1 + + panel2 + + + 202, 22 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportRulesFromFile + + + label3 System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 6 + 11 - - 1 + + panel2 7 - - label13 + + Vertical - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + &Browse - + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + panel1 + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - label3 + + tabControl2 - Server port + Remarks System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 3, 3, 3, 3 + - 0, 231 + 0, 424 - - 9 + + menuMoveUp - - &Cancel + + RuleList - - True + + toolStripMenuItem1 + + + 563, 21 + + + 0 + + + Select All (Ctrl+A) + + + 53, 12 + + + Fill + + + 18, 13 6, 12 + + 37 + + + menuExportSelectedRules + - Server address + Optional + + + Export Selected Rules - 25 - - - txtAddress + 36 - 127, 151 + 91, 13 - - 95, 12 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 247, 22 - - Alias (remarks) + + 202, 22 - - * Fill in manually + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 7 + + lvRoutings + + + 202, 22 + + + 91, 105 label2 - - 12, 62 + + menuRemove + + + True + + + NoControl + + + NoControl - 547, 291 + 762, 484 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnBrowse $this - - 547, 196 + + NoControl - - 6 + + 39 - - 0 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 75, 23 + + 202, 22 - 3 + 6 - - 127, 89 + + &Cancel - - 337, 155 + + NoControl - - True + + 77, 12 - - 4 + + 0 - 5 + 7 + + + panel1 75, 23 - - 89, 12 + + tabControl2 - - groupBox1 + + panel1 - - groupBox1 + + 0 - - 0, 35 + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 txtRemarks - - 12, 155 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + True - User(Optional) + Custom icon - - 278, 21 + + 0 Top - - 3 - True + + 25 + + 139, 17 + + 17, 17 \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx similarity index 53% rename from v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx rename to v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx index 46ec6353..6c7dcd5f 100644 --- a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/RoutingRuleSettingForm.zh-Hans.resx @@ -120,225 +120,181 @@ 取消(&C) - - 服务器 - - - 220, 20 + + 0, 501 + + + 785, 60 + + + 确定(&O) + + + 785, 147 + + + 670, 104 + + + 浏览(&B) + + + 101, 105 65, 12 - 流控(flow) - - - 生成(&G) - - - *手填,方便识别管理 - - - 底层传输方式(transport) - - - 149, 12 - - - 3)QUIC 加密密钥/Kcp seed - - - 95, 12 - - - 4)QUIC 加密方式 - - - 167, 12 - - - 跳过证书验证(allowInsecure) - - - 223, 7 - - - 353, 36 - - - 143, 12 - - - *默认tcp,选错会无法连接 - - - 149, 12 - - - 3)h2 host中间逗号(,)隔开 - - - 127, 168 - - - 127, 32 - - - 220, 20 - - - 9, 36 - - - 107, 12 - - - 传输协议(network) - - - 9, 168 - - - 65, 12 - - - 路径(path) - - - 161, 12 - - - 1)http host中间逗号(,)隔开 - - - 9, 241 - - - 107, 12 - - - 底层传输安全(tls) - - - 127, 237 - - - 282, 71 - - - 197, 12 - - - *tcp或kcp或QUIC伪装类型,默认none - - - 127, 102 - - - 334, 51 - - - 9, 71 - - - 89, 12 - - - 伪装类型(type) - - - 9, 102 - - - 89, 12 - - - 伪装域名(host) - - - 127, 67 - - - 353, 158 - - - 71, 12 - - - *非空(none) - - - 220, 20 - - - 220, 21 - - - 83, 12 - - - 别名(remarks) - - - 101, 12 - - - 加密(encryption) - - - 65, 12 - - - 用户ID(id) - - - 65, 12 - - - 端口(port) + 自定义图标 - 83, 12 + 29, 12 - 地址(address) + 可选 - - 确定(&O) + + 101, 45 - - - False + + 83, 12 + + + 订阅地址(Url) + + + 101, 13 + + + 29, 12 + + + 别名 + + + 196, 22 + + + 添加规则 + + + 196, 22 + + + 移除所选规则 + + + 196, 22 + + + 全选 + + + 196, 22 + + + 导出所选规则至剪贴板 + + + 193, 6 + + + 196, 22 + + + 上移至顶 (T) + + + 196, 22 + + + 上移 (U) + + + 196, 22 + + + 下移 (D) + + + 196, 22 + + + 下移至底 (B) - 92, 21 + 68, 21 - 导入配置文件 + 规则功能 - - 171, 22 + + 197, 186 - - 导入客户端配置 + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + - - 171, 22 + + 771, 297 - - 导入服务端配置 + + 0, 172 - - 168, 6 + + 785, 329 - - 171, 22 + + 777, 303 - - 从剪贴板导入URL + + 规则列表 + + + 785, 25 + + + 68, 21 + + + 导入规则 + + + 189, 22 + + + 从文件中导入规则 + + + 189, 22 + + + 从剪贴板中导入规则 + + + 189, 22 + + + 从订阅Url中导入规则 + + + 785, 561 - 编辑或添加[VLESS]服务器 + 规则集设置 \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs new file mode 100644 index 00000000..5deebb1a --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.Designer.cs @@ -0,0 +1,485 @@ +namespace v2rayN.Forms +{ + partial class RoutingSettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RoutingSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panel2 = new System.Windows.Forms.Panel(); + this.labRoutingTips = new System.Windows.Forms.Label(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.cmbdomainMatcher = new System.Windows.Forms.ComboBox(); + this.label6 = new System.Windows.Forms.Label(); + this.chkenableRoutingAdvanced = new System.Windows.Forms.CheckBox(); + this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); + this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); + this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuAdd = new System.Windows.Forms.ToolStripMenuItem(); + this.menuRemove = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSetDefaultRouting = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportAdvancedRules = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItemAdvanced = new System.Windows.Forms.ToolStripMenuItem(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.MenuItemBasic = new System.Windows.Forms.ToolStripMenuItem(); + this.menuImportBasicRules = new System.Windows.Forms.ToolStripMenuItem(); + this.tabNormal = new System.Windows.Forms.TabControl(); + this.tabPageProxy = new System.Windows.Forms.TabPage(); + this.panel5 = new System.Windows.Forms.Panel(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.txtProxyIp = new System.Windows.Forms.TextBox(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.txtProxyDomain = new System.Windows.Forms.TextBox(); + this.tabPageDirect = new System.Windows.Forms.TabPage(); + this.panel4 = new System.Windows.Forms.Panel(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.txtDirectIp = new System.Windows.Forms.TextBox(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.txtDirectDomain = new System.Windows.Forms.TextBox(); + this.tabPageBlock = new System.Windows.Forms.TabPage(); + this.panel3 = new System.Windows.Forms.Panel(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.txtBlockIp = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtBlockDomain = new System.Windows.Forms.TextBox(); + this.tabPageRuleList = new System.Windows.Forms.TabPage(); + this.lvRoutings = new v2rayN.Base.ListViewFlickerFree(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.panel2.SuspendLayout(); + this.panel1.SuspendLayout(); + this.cmsLv.SuspendLayout(); + this.menuServer.SuspendLayout(); + this.tabNormal.SuspendLayout(); + this.tabPageProxy.SuspendLayout(); + this.panel5.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.tabPageDirect.SuspendLayout(); + this.panel4.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.tabPageBlock.SuspendLayout(); + this.panel3.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.tabPageRuleList.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // panel2 + // + this.panel2.Controls.Add(this.labRoutingTips); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // labRoutingTips + // + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.Name = "labRoutingTips"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + this.panel1.Controls.Add(this.cmbdomainMatcher); + this.panel1.Controls.Add(this.label6); + this.panel1.Controls.Add(this.chkenableRoutingAdvanced); + this.panel1.Controls.Add(this.linkLabelRoutingDoc); + this.panel1.Controls.Add(this.cmbdomainStrategy); + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // cmbdomainMatcher + // + this.cmbdomainMatcher.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbdomainMatcher.FormattingEnabled = true; + this.cmbdomainMatcher.Items.AddRange(new object[] { + resources.GetString("cmbdomainMatcher.Items"), + resources.GetString("cmbdomainMatcher.Items1")}); + resources.ApplyResources(this.cmbdomainMatcher, "cmbdomainMatcher"); + this.cmbdomainMatcher.Name = "cmbdomainMatcher"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // chkenableRoutingAdvanced + // + resources.ApplyResources(this.chkenableRoutingAdvanced, "chkenableRoutingAdvanced"); + this.chkenableRoutingAdvanced.Name = "chkenableRoutingAdvanced"; + this.chkenableRoutingAdvanced.UseVisualStyleBackColor = true; + this.chkenableRoutingAdvanced.CheckedChanged += new System.EventHandler(this.chkenableRoutingAdvanced_CheckedChanged_1); + // + // linkLabelRoutingDoc + // + resources.ApplyResources(this.linkLabelRoutingDoc, "linkLabelRoutingDoc"); + this.linkLabelRoutingDoc.Name = "linkLabelRoutingDoc"; + this.linkLabelRoutingDoc.TabStop = true; + this.linkLabelRoutingDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelRoutingDoc_LinkClicked); + // + // cmbdomainStrategy + // + this.cmbdomainStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbdomainStrategy.FormattingEnabled = true; + this.cmbdomainStrategy.Items.AddRange(new object[] { + resources.GetString("cmbdomainStrategy.Items"), + resources.GetString("cmbdomainStrategy.Items1"), + resources.GetString("cmbdomainStrategy.Items2")}); + resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); + this.cmbdomainStrategy.Name = "cmbdomainStrategy"; + // + // cmsLv + // + this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20); + this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuAdd, + this.menuRemove, + this.menuSelectAll, + this.menuSetDefaultRouting, + this.toolStripSeparator1, + this.menuImportAdvancedRules}); + this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.MenuItemAdvanced; + resources.ApplyResources(this.cmsLv, "cmsLv"); + // + // menuAdd + // + this.menuAdd.Name = "menuAdd"; + resources.ApplyResources(this.menuAdd, "menuAdd"); + this.menuAdd.Click += new System.EventHandler(this.menuAdd_Click); + // + // menuRemove + // + this.menuRemove.Name = "menuRemove"; + resources.ApplyResources(this.menuRemove, "menuRemove"); + this.menuRemove.Click += new System.EventHandler(this.menuRemove_Click); + // + // menuSelectAll + // + this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); + // + // menuSetDefaultRouting + // + this.menuSetDefaultRouting.Name = "menuSetDefaultRouting"; + resources.ApplyResources(this.menuSetDefaultRouting, "menuSetDefaultRouting"); + this.menuSetDefaultRouting.Click += new System.EventHandler(this.menuSetDefaultRouting_Click); + // + // menuImportAdvancedRules + // + this.menuImportAdvancedRules.Name = "menuImportAdvancedRules"; + resources.ApplyResources(this.menuImportAdvancedRules, "menuImportAdvancedRules"); + this.menuImportAdvancedRules.Click += new System.EventHandler(this.menuImportAdvancedRules_Click); + // + // MenuItemAdvanced + // + this.MenuItemAdvanced.DropDown = this.cmsLv; + this.MenuItemAdvanced.Name = "MenuItemAdvanced"; + resources.ApplyResources(this.MenuItemAdvanced, "MenuItemAdvanced"); + // + // menuServer + // + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItemBasic, + this.MenuItemAdvanced}); + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Name = "menuServer"; + // + // MenuItemBasic + // + this.MenuItemBasic.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuImportBasicRules}); + this.MenuItemBasic.Name = "MenuItemBasic"; + resources.ApplyResources(this.MenuItemBasic, "MenuItemBasic"); + // + // menuImportBasicRules + // + this.menuImportBasicRules.Name = "menuImportBasicRules"; + resources.ApplyResources(this.menuImportBasicRules, "menuImportBasicRules"); + this.menuImportBasicRules.Click += new System.EventHandler(this.menuImportBasicRules_Click); + // + // tabNormal + // + this.tabNormal.Controls.Add(this.tabPageProxy); + this.tabNormal.Controls.Add(this.tabPageDirect); + this.tabNormal.Controls.Add(this.tabPageBlock); + this.tabNormal.Controls.Add(this.tabPageRuleList); + resources.ApplyResources(this.tabNormal, "tabNormal"); + this.tabNormal.Name = "tabNormal"; + this.tabNormal.SelectedIndex = 0; + this.tabNormal.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabNormal_Selecting); + // + // tabPageProxy + // + this.tabPageProxy.Controls.Add(this.panel5); + resources.ApplyResources(this.tabPageProxy, "tabPageProxy"); + this.tabPageProxy.Name = "tabPageProxy"; + this.tabPageProxy.UseVisualStyleBackColor = true; + // + // panel5 + // + this.panel5.Controls.Add(this.groupBox5); + this.panel5.Controls.Add(this.groupBox6); + resources.ApplyResources(this.panel5, "panel5"); + this.panel5.Name = "panel5"; + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.txtProxyIp); + resources.ApplyResources(this.groupBox5, "groupBox5"); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.TabStop = false; + // + // txtProxyIp + // + resources.ApplyResources(this.txtProxyIp, "txtProxyIp"); + this.txtProxyIp.Name = "txtProxyIp"; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.txtProxyDomain); + resources.ApplyResources(this.groupBox6, "groupBox6"); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.TabStop = false; + // + // txtProxyDomain + // + resources.ApplyResources(this.txtProxyDomain, "txtProxyDomain"); + this.txtProxyDomain.Name = "txtProxyDomain"; + // + // tabPageDirect + // + this.tabPageDirect.Controls.Add(this.panel4); + resources.ApplyResources(this.tabPageDirect, "tabPageDirect"); + this.tabPageDirect.Name = "tabPageDirect"; + this.tabPageDirect.UseVisualStyleBackColor = true; + // + // panel4 + // + this.panel4.Controls.Add(this.groupBox3); + this.panel4.Controls.Add(this.groupBox4); + resources.ApplyResources(this.panel4, "panel4"); + this.panel4.Name = "panel4"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.txtDirectIp); + resources.ApplyResources(this.groupBox3, "groupBox3"); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.TabStop = false; + // + // txtDirectIp + // + resources.ApplyResources(this.txtDirectIp, "txtDirectIp"); + this.txtDirectIp.Name = "txtDirectIp"; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.txtDirectDomain); + resources.ApplyResources(this.groupBox4, "groupBox4"); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.TabStop = false; + // + // txtDirectDomain + // + resources.ApplyResources(this.txtDirectDomain, "txtDirectDomain"); + this.txtDirectDomain.Name = "txtDirectDomain"; + // + // tabPageBlock + // + this.tabPageBlock.Controls.Add(this.panel3); + resources.ApplyResources(this.tabPageBlock, "tabPageBlock"); + this.tabPageBlock.Name = "tabPageBlock"; + this.tabPageBlock.UseVisualStyleBackColor = true; + // + // panel3 + // + this.panel3.Controls.Add(this.groupBox2); + this.panel3.Controls.Add(this.groupBox1); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.txtBlockIp); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // txtBlockIp + // + resources.ApplyResources(this.txtBlockIp, "txtBlockIp"); + this.txtBlockIp.Name = "txtBlockIp"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.txtBlockDomain); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // txtBlockDomain + // + resources.ApplyResources(this.txtBlockDomain, "txtBlockDomain"); + this.txtBlockDomain.Name = "txtBlockDomain"; + // + // tabPageRuleList + // + this.tabPageRuleList.Controls.Add(this.lvRoutings); + resources.ApplyResources(this.tabPageRuleList, "tabPageRuleList"); + this.tabPageRuleList.Name = "tabPageRuleList"; + this.tabPageRuleList.UseVisualStyleBackColor = true; + // + // lvRoutings + // + this.lvRoutings.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvRoutings, "lvRoutings"); + this.lvRoutings.FullRowSelect = true; + this.lvRoutings.GridLines = true; + this.lvRoutings.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lvRoutings.HideSelection = false; + this.lvRoutings.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvRoutings.Items")))}); + this.lvRoutings.MultiSelect = false; + this.lvRoutings.Name = "lvRoutings"; + this.lvRoutings.UseCompatibleStateImageBehavior = false; + this.lvRoutings.View = System.Windows.Forms.View.Details; + this.lvRoutings.DoubleClick += new System.EventHandler(this.lvRoutings_DoubleClick); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + // + // RoutingSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.tabNormal); + this.Controls.Add(this.panel1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.menuServer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "RoutingSettingForm"; + this.Load += new System.EventHandler(this.RoutingSettingForm_Load); + this.panel2.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.cmsLv.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); + this.tabNormal.ResumeLayout(false); + this.tabPageProxy.ResumeLayout(false); + this.panel5.ResumeLayout(false); + this.groupBox5.ResumeLayout(false); + this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); + this.tabPageDirect.ResumeLayout(false); + this.panel4.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.tabPageBlock.ResumeLayout(false); + this.panel3.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.tabPageRuleList.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.LinkLabel linkLabelRoutingDoc; + private System.Windows.Forms.ComboBox cmbdomainStrategy; + private System.Windows.Forms.ContextMenuStrip cmsLv; + private System.Windows.Forms.ToolStripMenuItem menuRemove; + private System.Windows.Forms.ToolStripMenuItem menuSelectAll; + private System.Windows.Forms.ToolStripMenuItem menuAdd; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItemAdvanced; + private System.Windows.Forms.ToolStripMenuItem menuSetDefaultRouting; + private System.Windows.Forms.TabControl tabNormal; + private System.Windows.Forms.TabPage tabPageProxy; + private System.Windows.Forms.TabPage tabPageDirect; + private System.Windows.Forms.TabPage tabPageBlock; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.TextBox txtProxyIp; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.TextBox txtProxyDomain; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.TextBox txtDirectIp; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.TextBox txtDirectDomain; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtBlockIp; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtBlockDomain; + private System.Windows.Forms.TabPage tabPageRuleList; + private Base.ListViewFlickerFree lvRoutings; + private System.Windows.Forms.Label labRoutingTips; + private System.Windows.Forms.CheckBox chkenableRoutingAdvanced; + private System.Windows.Forms.ToolStripMenuItem MenuItemBasic; + private System.Windows.Forms.ToolStripMenuItem menuImportBasicRules; + private System.Windows.Forms.ComboBox cmbdomainMatcher; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.ToolStripMenuItem menuImportAdvancedRules; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.cs b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs new file mode 100644 index 00000000..13bc1e59 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.cs @@ -0,0 +1,319 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Handler; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.Forms +{ + public partial class RoutingSettingForm : BaseForm + { + private readonly List _lvSelecteds = new List(); + private RoutingItem _lockedItem; + public RoutingSettingForm() + { + InitializeComponent(); + } + + private void RoutingSettingForm_Load(object sender, EventArgs e) + { + ConfigHandler.InitBuiltinRouting(ref config); + + cmbdomainStrategy.Text = config.domainStrategy; + chkenableRoutingAdvanced.Checked = config.enableRoutingAdvanced; + cmbdomainMatcher.Text = config.domainMatcher; + + if (config.routings == null) + { + config.routings = new List(); + } + InitRoutingsView(); + RefreshRoutingsView(); + + BindingLockedData(); + InitUI(); + } + + + private void tabNormal_Selecting(object sender, TabControlCancelEventArgs e) + { + //if (tabNormal.SelectedTab == tabPageRuleList) + //{ + // MenuItem1.Enabled = true; + //} + //else + //{ + // MenuItem1.Enabled = false; + //} + } + private void btnOK_Click(object sender, EventArgs e) + { + config.domainStrategy = cmbdomainStrategy.Text; + config.enableRoutingAdvanced = chkenableRoutingAdvanced.Checked; + config.domainMatcher = cmbdomainMatcher.Text; + + EndBindingLockedData(); + + if (ConfigHandler.SaveRouting(ref config) == 0) + { + DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(ResUI.OperationFailed); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + } + private void chkenableRoutingAdvanced_CheckedChanged_1(object sender, EventArgs e) + { + InitUI(); + } + private void InitUI() + { + if (chkenableRoutingAdvanced.Checked) + { + tabPageProxy.Parent = null; + tabPageDirect.Parent = null; + tabPageBlock.Parent = null; + tabPageRuleList.Parent = tabNormal; + MenuItemBasic.Enabled = false; + MenuItemAdvanced.Enabled = true; + + } + else + { + tabPageProxy.Parent = tabNormal; + tabPageDirect.Parent = tabNormal; + tabPageBlock.Parent = tabNormal; + tabPageRuleList.Parent = null; + MenuItemBasic.Enabled = true; + MenuItemAdvanced.Enabled = false; + } + + } + + + #region locked + private void BindingLockedData() + { + _lockedItem = ConfigHandler.GetLockedRoutingItem(ref config); + if (_lockedItem != null) + { + txtProxyDomain.Text = Utils.List2String(_lockedItem.rules[0].domain, true); + txtProxyIp.Text = Utils.List2String(_lockedItem.rules[0].ip, true); + + txtDirectDomain.Text = Utils.List2String(_lockedItem.rules[1].domain, true); + txtDirectIp.Text = Utils.List2String(_lockedItem.rules[1].ip, true); + + txtBlockDomain.Text = Utils.List2String(_lockedItem.rules[2].domain, true); + txtBlockIp.Text = Utils.List2String(_lockedItem.rules[2].ip, true); + } + } + private void EndBindingLockedData() + { + if (_lockedItem != null) + { + _lockedItem.rules[0].domain = Utils.String2List(txtProxyDomain.Text.TrimEx()); + _lockedItem.rules[0].ip = Utils.String2List(txtProxyIp.Text.TrimEx()); + + _lockedItem.rules[1].domain = Utils.String2List(txtDirectDomain.Text.TrimEx()); + _lockedItem.rules[1].ip = Utils.String2List(txtDirectIp.Text.TrimEx()); + + _lockedItem.rules[2].domain = Utils.String2List(txtBlockDomain.Text.TrimEx()); + _lockedItem.rules[2].ip = Utils.String2List(txtBlockIp.Text.TrimEx()); + + } + } + #endregion + + #region ListView + private void InitRoutingsView() + { + lvRoutings.BeginUpdate(); + lvRoutings.Items.Clear(); + + lvRoutings.GridLines = true; + lvRoutings.FullRowSelect = true; + lvRoutings.View = View.Details; + lvRoutings.MultiSelect = true; + lvRoutings.HeaderStyle = ColumnHeaderStyle.Clickable; + + lvRoutings.Columns.Add("", 30); + lvRoutings.Columns.Add(ResUI.LvAlias, 200); + lvRoutings.Columns.Add(ResUI.LvCount, 60); + lvRoutings.Columns.Add(ResUI.LvUrl, 240); + lvRoutings.Columns.Add(ResUI.LvCustomIcon, 240); + + lvRoutings.EndUpdate(); + } + + private void RefreshRoutingsView() + { + lvRoutings.BeginUpdate(); + lvRoutings.Items.Clear(); + + for (int k = 0; k < config.routings.Count; k++) + { + var item = config.routings[k]; + if (item.locked == true) + { + continue; + } + + string def = string.Empty; + if (config.routingIndex.Equals(k)) + { + def = "√"; + } + + ListViewItem lvItem = new ListViewItem(def); + Utils.AddSubItem(lvItem, "remarks", item.remarks); + Utils.AddSubItem(lvItem, "count", item.rules.Count.ToString()); + Utils.AddSubItem(lvItem, "url", item.url); + Utils.AddSubItem(lvItem, "customIcon", item.customIcon); + + if (lvItem != null) lvRoutings.Items.Add(lvItem); + } + lvRoutings.EndUpdate(); + } + + + private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start("https://www.v2fly.org/config/routing.html"); + } + + private void lvRoutings_DoubleClick(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + var fm = new RoutingRuleSettingForm(); + fm.EditIndex = index; + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshRoutingsView(); + } + } + + private int GetLvSelectedIndex() + { + int index = -1; + _lvSelecteds.Clear(); + try + { + if (lvRoutings.SelectedIndices.Count <= 0) + { + UI.Show(ResUI.PleaseSelectRules); + return index; + } + + index = lvRoutings.SelectedIndices[0]; + foreach (int i in lvRoutings.SelectedIndices) + { + _lvSelecteds.Add(i); + } + return index; + } + catch + { + return index; + } + } + + #endregion + + + #region Edit function + + + private void menuSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in lvRoutings.Items) + { + item.Selected = true; + } + } + + private void menuAdd_Click(object sender, EventArgs e) + { + var fm = new RoutingRuleSettingForm(); + fm.EditIndex = -1; + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshRoutingsView(); + } + } + + private void menuRemove_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (UI.ShowYesNo(ResUI.RemoveRules) == DialogResult.No) + { + return; + } + for (int k = _lvSelecteds.Count - 1; k >= 0; k--) + { + config.routings.RemoveAt(index); + } + RefreshRoutingsView(); + } + private void menuSetDefaultRouting_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + SetDefaultRouting(index); + } + private int SetDefaultRouting(int index) + { + if (index < 0) + { + UI.Show(ResUI.PleaseSelectServer); + return -1; + } + if (ConfigHandler.SetDefaultRouting(ref config, index) == 0) + { + RefreshRoutingsView(); + } + return 0; + } + + private void menuImportBasicRules_Click(object sender, EventArgs e) + { + //Extra to bypass the mainland + txtProxyDomain.Text = "geosite:google"; + txtDirectDomain.Text = "geosite:cn"; + txtDirectIp.Text = "geoip:private,geoip:cn"; + + txtBlockDomain.Text = "geosite:category-ads-all"; + + UI.Show(ResUI.OperationSuccess); + } + + private void menuImportAdvancedRules_Click(object sender, EventArgs e) + { + if (ConfigHandler.InitBuiltinRouting(ref config, true) == 0) + { + RefreshRoutingsView(); + } + } + + #endregion + + } +} diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx new file mode 100644 index 00000000..c3346803 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.resx @@ -0,0 +1,1412 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + NoControl + + + + 753, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 613 + + + 853, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + NoControl + + + 5, 22 + + + 562, 16 + + + 34 + + + *Set the rules, separated by commas (,); The comma in the regular is replaced by <COMMA> + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 660, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + cmbdomainMatcher + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + chkenableRoutingAdvanced + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 2 + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 3 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 4 + + + Top + + + 0, 25 + + + 853, 51 + + + 11 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + linear + + + mph + + + 681, 17 + + + 116, 20 + + + 28 + + + cmbdomainMatcher + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 0 + + + True + + + NoControl + + + 575, 21 + + + 89, 12 + + + 27 + + + Domain Matcher + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 1 + + + True + + + NoControl + + + 318, 17 + + + 216, 16 + + + 26 + + + Enable advanced routing function + + + chkenableRoutingAdvanced + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 2 + + + True + + + NoControl + + + 6, 21 + + + 0, 0, 0, 0 + + + 95, 12 + + + 19 + + + Domain strategy + + + linkLabelRoutingDoc + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 3 + + + AsIs + + + IPIfNonMatch + + + IPOnDemand + + + 116, 17 + + + 165, 20 + + + 16 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 4 + + + 17, 17 + + + 212, 22 + + + Add + + + 212, 22 + + + Remove selected + + + 212, 22 + + + Select All (Ctrl+A) + + + 212, 22 + + + Set as active routing + + + 209, 6 + + + 212, 22 + + + Import Advanced Rules + + + 129, 21 + + + Advanced Function + + + 213, 142 + + + cmsLv + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 139, 17 + + + 0, 0 + + + 853, 25 + + + 15 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 102, 21 + + + Basic Function + + + 185, 22 + + + Import Basic Rules + + + panel5 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageProxy + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 0 + + + 1.Proxy Domain or IP + + + tabPageProxy + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 0 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageDirect + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 1 + + + 2.Direct Domain or IP + + + tabPageDirect + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 1 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageBlock + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 2 + + + 3.Block Domain or IP + + + tabPageBlock + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 2 + + + Fill + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 3, 3 + + + 839, 505 + + + 15 + + + lvRoutings + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tabPageRuleList + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 845, 511 + + + 3 + + + Pre-defined Rule Set List + + + tabPageRuleList + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabNormal + + + 3 + + + Fill + + + 0, 76 + + + 853, 537 + + + 16 + + + tabNormal + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 0 + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 1 + + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel5 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageProxy + + + 0 + + + txtProxyIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox5 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 0 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 441, 485 + + + 25 + + + txtProxyIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox5 + + + 0 + + + txtProxyDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + Left + + + 0, 0 + + + 392, 505 + + + 3 + + + Domain + + + groupBox6 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel5 + + + 1 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 386, 485 + + + 24 + + + txtProxyDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox6 + + + 0 + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageDirect + + + 0 + + + txtDirectIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox3 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 0 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 441, 485 + + + 25 + + + txtDirectIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox3 + + + 0 + + + txtDirectDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + Left + + + 0, 0 + + + 392, 505 + + + 3 + + + Domain + + + groupBox4 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + 1 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 386, 485 + + + 24 + + + txtDirectDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox4 + + + 0 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + Fill + + + 3, 3 + + + 839, 505 + + + 12 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageBlock + + + 0 + + + txtBlockIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + Fill + + + 392, 0 + + + 447, 505 + + + 4 + + + IP + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 441, 485 + + + 25 + + + txtBlockIp + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + txtBlockDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + Left + + + 0, 0 + + + 392, 505 + + + 3 + + + Domain + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + Fill + + + 3, 17 + + + True + + + Vertical + + + 386, 485 + + + 24 + + + txtBlockDomain + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + 6, 12 + + + 853, 673 + + + Routing Settings + + + menuAdd + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemove + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSelectAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSetDefaultRouting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportAdvancedRules + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemAdvanced + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemBasic + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuImportBasicRules + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + RoutingSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx new file mode 100644 index 00000000..fe451130 --- /dev/null +++ b/v2rayN/v2rayN/Forms/RoutingSettingForm.zh-Hans.resx @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 691, 17 + + + 取消(&C) + + + 0, 545 + + + 817, 60 + + + 518, 16 + + + *设置的路由规则,用逗号(,)分隔;正则中的逗号用<COMMA>替代 + + + 598, 17 + + + 确定(&O) + + + 817, 51 + + + 77, 12 + + + 域名匹配算法 + + + 120, 16 + + + 启用路由高级功能 + + + 77, 12 + + + 域名解析策略 + + + 149, 114 + + + 148, 22 + + + 添加规则集 + + + 148, 22 + + + 移除所选规则 + + + 148, 22 + + + 全选 + + + 148, 22 + + + 设为活动路由 + + + 68, 21 + + + 高级功能 + + + 817, 25 + + + 68, 21 + + + 基础功能 + + + 180, 22 + + + 一键导入基础规则 + + + 817, 469 + + + 809, 443 + + + 1.代理的Domain或IP + + + 803, 437 + + + 411, 437 + + + 405, 417 + + + 392, 437 + + + 386, 417 + + + 809, 443 + + + 2.直连的Domain或IP + + + 803, 437 + + + 411, 437 + + + 405, 417 + + + 392, 437 + + + 386, 417 + + + 809, 443 + + + 3.阻止的Domain或IP + + + 803, 437 + + + 411, 437 + + + 405, 417 + + + 392, 437 + + + 386, 417 + + + 809, 443 + + + 预定义规则集列表 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 803, 437 + + + 一键导入高级规则 + + + 817, 605 + + + 路由设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs new file mode 100644 index 00000000..ba748ccd --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.Designer.cs @@ -0,0 +1,250 @@ +namespace v2rayN.Forms +{ + partial class ServerTransportControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServerTransportControl)); + this.gbTransport = new System.Windows.Forms.GroupBox(); + this.panTlsMore = new System.Windows.Forms.Panel(); + this.clbAlpn = new System.Windows.Forms.CheckedListBox(); + this.label1 = new System.Windows.Forms.Label(); + this.txtSNI = new System.Windows.Forms.TextBox(); + this.labSNI = new System.Windows.Forms.Label(); + this.labAllowInsecure = new System.Windows.Forms.Label(); + this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); + this.tipNetwork = new System.Windows.Forms.Label(); + this.txtPath = new System.Windows.Forms.TextBox(); + this.cmbNetwork = new System.Windows.Forms.ComboBox(); + this.labNetwork = new System.Windows.Forms.Label(); + this.labPath = new System.Windows.Forms.Label(); + this.tipPath = new System.Windows.Forms.Label(); + this.tipRequestHost = new System.Windows.Forms.Label(); + this.labStreamSecurity = new System.Windows.Forms.Label(); + this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); + this.tipHeaderType = new System.Windows.Forms.Label(); + this.txtRequestHost = new System.Windows.Forms.TextBox(); + this.labHeaderType = new System.Windows.Forms.Label(); + this.labRequestHost = new System.Windows.Forms.Label(); + this.cmbHeaderType = new System.Windows.Forms.ComboBox(); + this.gbTransport.SuspendLayout(); + this.panTlsMore.SuspendLayout(); + this.SuspendLayout(); + // + // gbTransport + // + this.gbTransport.Controls.Add(this.panTlsMore); + this.gbTransport.Controls.Add(this.tipNetwork); + this.gbTransport.Controls.Add(this.txtPath); + this.gbTransport.Controls.Add(this.cmbNetwork); + this.gbTransport.Controls.Add(this.labNetwork); + this.gbTransport.Controls.Add(this.labPath); + this.gbTransport.Controls.Add(this.tipPath); + this.gbTransport.Controls.Add(this.tipRequestHost); + this.gbTransport.Controls.Add(this.labStreamSecurity); + this.gbTransport.Controls.Add(this.cmbStreamSecurity); + this.gbTransport.Controls.Add(this.tipHeaderType); + this.gbTransport.Controls.Add(this.txtRequestHost); + this.gbTransport.Controls.Add(this.labHeaderType); + this.gbTransport.Controls.Add(this.labRequestHost); + this.gbTransport.Controls.Add(this.cmbHeaderType); + resources.ApplyResources(this.gbTransport, "gbTransport"); + this.gbTransport.Name = "gbTransport"; + this.gbTransport.TabStop = false; + // + // panTlsMore + // + this.panTlsMore.Controls.Add(this.clbAlpn); + this.panTlsMore.Controls.Add(this.label1); + this.panTlsMore.Controls.Add(this.txtSNI); + this.panTlsMore.Controls.Add(this.labSNI); + this.panTlsMore.Controls.Add(this.labAllowInsecure); + this.panTlsMore.Controls.Add(this.cmbAllowInsecure); + resources.ApplyResources(this.panTlsMore, "panTlsMore"); + this.panTlsMore.Name = "panTlsMore"; + // + // clbAlpn + // + this.clbAlpn.CheckOnClick = true; + resources.ApplyResources(this.clbAlpn, "clbAlpn"); + this.clbAlpn.FormattingEnabled = true; + this.clbAlpn.Items.AddRange(new object[] { + resources.GetString("clbAlpn.Items"), + resources.GetString("clbAlpn.Items1")}); + this.clbAlpn.MultiColumn = true; + this.clbAlpn.Name = "clbAlpn"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // txtSNI + // + resources.ApplyResources(this.txtSNI, "txtSNI"); + this.txtSNI.Name = "txtSNI"; + // + // labSNI + // + resources.ApplyResources(this.labSNI, "labSNI"); + this.labSNI.Name = "labSNI"; + // + // labAllowInsecure + // + resources.ApplyResources(this.labAllowInsecure, "labAllowInsecure"); + this.labAllowInsecure.Name = "labAllowInsecure"; + // + // cmbAllowInsecure + // + this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbAllowInsecure.FormattingEnabled = true; + this.cmbAllowInsecure.Items.AddRange(new object[] { + resources.GetString("cmbAllowInsecure.Items"), + resources.GetString("cmbAllowInsecure.Items1"), + resources.GetString("cmbAllowInsecure.Items2")}); + resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); + this.cmbAllowInsecure.Name = "cmbAllowInsecure"; + // + // tipNetwork + // + resources.ApplyResources(this.tipNetwork, "tipNetwork"); + this.tipNetwork.Name = "tipNetwork"; + // + // txtPath + // + resources.ApplyResources(this.txtPath, "txtPath"); + this.txtPath.Name = "txtPath"; + // + // cmbNetwork + // + this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbNetwork.FormattingEnabled = true; + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); + this.cmbNetwork.Name = "cmbNetwork"; + this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); + // + // labNetwork + // + resources.ApplyResources(this.labNetwork, "labNetwork"); + this.labNetwork.Name = "labNetwork"; + // + // labPath + // + resources.ApplyResources(this.labPath, "labPath"); + this.labPath.Name = "labPath"; + // + // tipPath + // + resources.ApplyResources(this.tipPath, "tipPath"); + this.tipPath.Name = "tipPath"; + // + // tipRequestHost + // + resources.ApplyResources(this.tipRequestHost, "tipRequestHost"); + this.tipRequestHost.Name = "tipRequestHost"; + // + // labStreamSecurity + // + resources.ApplyResources(this.labStreamSecurity, "labStreamSecurity"); + this.labStreamSecurity.Name = "labStreamSecurity"; + // + // cmbStreamSecurity + // + this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbStreamSecurity.FormattingEnabled = true; + resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); + this.cmbStreamSecurity.Name = "cmbStreamSecurity"; + this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); + // + // tipHeaderType + // + resources.ApplyResources(this.tipHeaderType, "tipHeaderType"); + this.tipHeaderType.Name = "tipHeaderType"; + // + // txtRequestHost + // + resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); + this.txtRequestHost.Name = "txtRequestHost"; + // + // labHeaderType + // + resources.ApplyResources(this.labHeaderType, "labHeaderType"); + this.labHeaderType.Name = "labHeaderType"; + // + // labRequestHost + // + resources.ApplyResources(this.labRequestHost, "labRequestHost"); + this.labRequestHost.Name = "labRequestHost"; + // + // cmbHeaderType + // + this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbHeaderType.FormattingEnabled = true; + resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); + this.cmbHeaderType.Name = "cmbHeaderType"; + // + // ServerTransportControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.gbTransport); + this.Name = "ServerTransportControl"; + this.Load += new System.EventHandler(this.ServerTransportControl_Load); + this.gbTransport.ResumeLayout(false); + this.gbTransport.PerformLayout(); + this.panTlsMore.ResumeLayout(false); + this.panTlsMore.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox gbTransport; + private System.Windows.Forms.Panel panTlsMore; + private System.Windows.Forms.TextBox txtSNI; + private System.Windows.Forms.Label labSNI; + private System.Windows.Forms.Label labAllowInsecure; + private System.Windows.Forms.ComboBox cmbAllowInsecure; + private System.Windows.Forms.Label tipNetwork; + private System.Windows.Forms.TextBox txtPath; + private System.Windows.Forms.ComboBox cmbNetwork; + private System.Windows.Forms.Label labNetwork; + private System.Windows.Forms.Label labPath; + private System.Windows.Forms.Label tipPath; + private System.Windows.Forms.Label tipRequestHost; + private System.Windows.Forms.Label labStreamSecurity; + private System.Windows.Forms.ComboBox cmbStreamSecurity; + private System.Windows.Forms.Label tipHeaderType; + private System.Windows.Forms.TextBox txtRequestHost; + private System.Windows.Forms.Label labHeaderType; + private System.Windows.Forms.Label labRequestHost; + private System.Windows.Forms.ComboBox cmbHeaderType; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckedListBox clbAlpn; + } +} diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.cs b/v2rayN/v2rayN/Forms/ServerTransportControl.cs new file mode 100644 index 00000000..c35f10a6 --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.cs @@ -0,0 +1,205 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.Forms +{ + public partial class ServerTransportControl : UserControl + { + public bool AllowXtls { get; set; } + private VmessItem vmessItem; + + public ServerTransportControl() + { + InitializeComponent(); + } + private void ServerTransportControl_Load(object sender, EventArgs e) + { + } + + private void Init(VmessItem item) + { + vmessItem = item; + + cmbNetwork.Items.AddRange(Global.networks.ToArray()); + + cmbStreamSecurity.Items.Clear(); + cmbStreamSecurity.Items.Add(string.Empty); + cmbStreamSecurity.Items.Add(Global.StreamSecurity); + if (AllowXtls) + { + cmbStreamSecurity.Items.Add(Global.StreamSecurityX); + } + } + + public void BindingServer(VmessItem item) + { + Init(item); + + cmbNetwork.Text = vmessItem.network; + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + cmbAllowInsecure.Text = vmessItem.allowInsecure; + txtSNI.Text = vmessItem.sni; + + if (vmessItem.alpn != null) + { + for (int i = 0; i < clbAlpn.Items.Count; i++) + { + if (vmessItem.alpn.Contains(clbAlpn.Items[i].ToString())) + { + clbAlpn.SetItemChecked(i, true); + } + } + } + } + + public void ClearServer(VmessItem item) + { + Init(item); + + cmbNetwork.Text = Global.DefaultNetwork; + cmbHeaderType.Text = Global.None; + txtRequestHost.Text = ""; + cmbStreamSecurity.Text = ""; + cmbAllowInsecure.Text = ""; + txtPath.Text = ""; + txtSNI.Text = ""; + for (int i = 0; i < clbAlpn.Items.Count; i++) + { + clbAlpn.SetItemChecked(i, false); + } + } + + public void EndBindingServer() + { + string network = cmbNetwork.Text; + string headerType = cmbHeaderType.Text; + string requestHost = txtRequestHost.Text; + string path = txtPath.Text; + string streamSecurity = cmbStreamSecurity.Text; + string allowInsecure = cmbAllowInsecure.Text; + string sni = txtSNI.Text; + + vmessItem.network = network; + vmessItem.headerType = headerType; + vmessItem.requestHost = requestHost.Replace(" ", ""); + vmessItem.path = path.Replace(" ", ""); + vmessItem.streamSecurity = streamSecurity; + vmessItem.allowInsecure = allowInsecure; + vmessItem.sni = sni; + + var alpn = new List(); + for (int i = 0; i < clbAlpn.Items.Count; i++) + { + if (clbAlpn.GetItemChecked(i)) + { + alpn.Add(clbAlpn.Items[i].ToString()); + } + } + vmessItem.alpn = alpn; + } + + private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) + { + SetHeaderType(); + SetTips(); + } + + private void SetHeaderType() + { + cmbHeaderType.Items.Clear(); + + string network = cmbNetwork.Text; + if (Utils.IsNullOrEmpty(network)) + { + cmbHeaderType.Items.Add(Global.None); + return; + } + + if (network.Equals(Global.DefaultNetwork)) + { + cmbHeaderType.Items.Add(Global.None); + cmbHeaderType.Items.Add(Global.TcpHeaderHttp); + } + else if (network.Equals("kcp") || network.Equals("quic")) + { + cmbHeaderType.Items.Add(Global.None); + cmbHeaderType.Items.AddRange(Global.kcpHeaderTypes.ToArray()); + } + else if (network.Equals("grpc")) + { + cmbHeaderType.Items.Add(Global.GrpcgunMode); + cmbHeaderType.Items.Add(Global.GrpcmultiMode); + } + else + { + cmbHeaderType.Items.Add(Global.None); + } + cmbHeaderType.SelectedIndex = 0; + } + + private void SetTips() + { + string network = cmbNetwork.Text; + if (Utils.IsNullOrEmpty(network)) + { + network = Global.DefaultNetwork; + } + labHeaderType.Visible = true; + tipRequestHost.Text = + tipPath.Text = + tipHeaderType.Text = string.Empty; + + if (network.Equals(Global.DefaultNetwork)) + { + tipRequestHost.Text = ResUI.TransportRequestHostTip1; + tipHeaderType.Text = ResUI.TransportHeaderTypeTip1; + } + else if (network.Equals("kcp")) + { + tipHeaderType.Text = ResUI.TransportHeaderTypeTip2; + tipPath.Text = ResUI.TransportPathTip5; + } + else if (network.Equals("ws")) + { + tipRequestHost.Text = ResUI.TransportRequestHostTip2; + tipPath.Text = ResUI.TransportPathTip1; + } + else if (network.Equals("h2")) + { + tipRequestHost.Text = ResUI.TransportRequestHostTip3; + tipPath.Text = ResUI.TransportPathTip2; + } + else if (network.Equals("quic")) + { + tipRequestHost.Text = ResUI.TransportRequestHostTip4; + tipPath.Text = ResUI.TransportPathTip3; + tipHeaderType.Text = ResUI.TransportHeaderTypeTip3; + } + else if (network.Equals("grpc")) + { + tipPath.Text = ResUI.TransportPathTip4; + tipHeaderType.Text = ResUI.TransportHeaderTypeTip4; + labHeaderType.Visible = false; + } + } + + private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) + { + string security = cmbStreamSecurity.Text; + if (Utils.IsNullOrEmpty(security)) + { + panTlsMore.Hide(); + } + else + { + panTlsMore.Show(); + } + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.resx new file mode 100644 index 00000000..61cd439f --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.resx @@ -0,0 +1,738 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 70 + + + h2 + + + http/1.1 + + + + 313, 7 + + + 172, 20 + + + 44 + + + clbAlpn + + + System.Windows.Forms.CheckedListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 0 + + + True + + + + NoControl + + + 241, 11 + + + 29, 12 + + + 43 + + + alpn + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 1 + + + 100, 39 + + + 385, 21 + + + 1 + + + txtSNI + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 2 + + + True + + + NoControl + + + 12, 43 + + + 23, 12 + + + 32 + + + SNI + + + labSNI + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 3 + + + True + + + NoControl + + + 12, 11 + + + 83, 12 + + + 31 + + + allowInsecure + + + labAllowInsecure + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 4 + + + + + + true + + + false + + + 100, 7 + + + 80, 20 + + + 0 + + + cmbAllowInsecure + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 5 + + + 200, 149 + + + 500, 71 + + + 33 + + + panTlsMore + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 0 + + + True + + + NoControl + + + 350, 32 + + + 113, 12 + + + 15 + + + *Default value tcp + + + tipNetwork + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 1 + + + 127, 124 + + + True + + + 396, 20 + + + 4 + + + txtPath + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 2 + + + 192, 28 + + + 143, 20 + + + 1 + + + cmbNetwork + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 3 + + + True + + + NoControl + + + 9, 32 + + + 167, 12 + + + 13 + + + Transport protocol(network) + + + labNetwork + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 4 + + + True + + + NoControl + + + 9, 128 + + + 29, 12 + + + 27 + + + Path + + + labPath + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 5 + + + True + + + NoControl + + + 529, 128 + + + 11, 12 + + + 24 + + + * + + + tipPath + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 6 + + + True + + + NoControl + + + 464, 96 + + + 11, 12 + + + 23 + + + * + + + tipRequestHost + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 7 + + + True + + + NoControl + + + 9, 160 + + + 23, 12 + + + 22 + + + TLS + + + labStreamSecurity + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 8 + + + 127, 156 + + + 60, 20 + + + 5 + + + cmbStreamSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 9 + + + True + + + NoControl + + + 282, 64 + + + 11, 12 + + + 20 + + + * + + + tipHeaderType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 10 + + + 158, 92 + + + True + + + 300, 20 + + + 3 + + + txtRequestHost + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 11 + + + True + + + NoControl + + + 9, 64 + + + 95, 12 + + + 19 + + + Camouflage type + + + labHeaderType + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 12 + + + True + + + NoControl + + + 9, 96 + + + 143, 12 + + + 17 + + + Camouflage domain(host) + + + labRequestHost + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 13 + + + 127, 60 + + + 143, 20 + + + 2 + + + cmbHeaderType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gbTransport + + + 14 + + + Fill + + + 0, 0 + + + 723, 223 + + + 22 + + + Transport + + + gbTransport + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 12 + + + 723, 223 + + + ServerTransportControl + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx new file mode 100644 index 00000000..4ca97072 --- /dev/null +++ b/v2rayN/v2rayN/Forms/ServerTransportControl.zh-Hans.resx @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 143, 12 + + + *默认tcp,选错会无法连接 + + + 127, 28 + + + 208, 20 + + + 107, 12 + + + 传输协议(network) + + + 65, 12 + + + 路径(path) + + + 107, 12 + + + 传输层安全(tls) + + + 127, 92 + + + 331, 20 + + + 89, 12 + + + 伪装类型(type) + + + 89, 12 + + + 伪装域名(host) + + + 底层传输方式(transport) + + + 282, 11 + + + 331, 7 + + + 160, 20 + + + 391, 21 + + + 167, 12 + + + 跳过证书验证(allowInsecure) + + + 183, 7 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs index 30fcadf5..bff96482 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs @@ -29,27 +29,70 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingControl)); - this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.grbMain = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.cmbGroup = new System.Windows.Forms.ComboBox(); + this.txtUserAgent = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.btnShare = new System.Windows.Forms.Button(); this.chkEnabled = new System.Windows.Forms.CheckBox(); this.btnRemove = new System.Windows.Forms.Button(); this.txtUrl = new System.Windows.Forms.TextBox(); this.txtRemarks = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); - this.groupBox2.SuspendLayout(); + this.picQRCode = new System.Windows.Forms.PictureBox(); + this.grbMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit(); this.SuspendLayout(); // - // groupBox2 + // grbMain // - resources.ApplyResources(this.groupBox2, "groupBox2"); - this.groupBox2.Controls.Add(this.chkEnabled); - this.groupBox2.Controls.Add(this.btnRemove); - this.groupBox2.Controls.Add(this.txtUrl); - this.groupBox2.Controls.Add(this.txtRemarks); - this.groupBox2.Controls.Add(this.label2); - this.groupBox2.Controls.Add(this.label3); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.TabStop = false; + resources.ApplyResources(this.grbMain, "grbMain"); + this.grbMain.Controls.Add(this.label4); + this.grbMain.Controls.Add(this.cmbGroup); + this.grbMain.Controls.Add(this.txtUserAgent); + this.grbMain.Controls.Add(this.label1); + this.grbMain.Controls.Add(this.btnShare); + this.grbMain.Controls.Add(this.chkEnabled); + this.grbMain.Controls.Add(this.btnRemove); + this.grbMain.Controls.Add(this.txtUrl); + this.grbMain.Controls.Add(this.txtRemarks); + this.grbMain.Controls.Add(this.label2); + this.grbMain.Controls.Add(this.label3); + this.grbMain.Name = "grbMain"; + this.grbMain.TabStop = false; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // cmbGroup + // + resources.ApplyResources(this.cmbGroup, "cmbGroup"); + this.cmbGroup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbGroup.FormattingEnabled = true; + this.cmbGroup.Name = "cmbGroup"; + this.cmbGroup.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // txtUserAgent + // + resources.ApplyResources(this.txtUserAgent, "txtUserAgent"); + this.txtUserAgent.Name = "txtUserAgent"; + this.txtUserAgent.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // btnShare + // + resources.ApplyResources(this.btnShare, "btnShare"); + this.btnShare.Name = "btnShare"; + this.btnShare.UseVisualStyleBackColor = true; + this.btnShare.Click += new System.EventHandler(this.btnShare_Click); // // chkEnabled // @@ -87,27 +130,41 @@ resources.ApplyResources(this.label3, "label3"); this.label3.Name = "label3"; // + // picQRCode + // + resources.ApplyResources(this.picQRCode, "picQRCode"); + this.picQRCode.Name = "picQRCode"; + this.picQRCode.TabStop = false; + // // SubSettingControl // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.groupBox2); + this.Controls.Add(this.picQRCode); + this.Controls.Add(this.grbMain); this.Name = "SubSettingControl"; this.Load += new System.EventHandler(this.SubSettingControl_Load); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); + this.grbMain.ResumeLayout(false); + this.grbMain.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit(); this.ResumeLayout(false); } #endregion - private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox grbMain; private System.Windows.Forms.TextBox txtUrl; private System.Windows.Forms.TextBox txtRemarks; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Button btnRemove; private System.Windows.Forms.CheckBox chkEnabled; + private System.Windows.Forms.Button btnShare; + private System.Windows.Forms.PictureBox picQRCode; + private System.Windows.Forms.TextBox txtUserAgent; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox cmbGroup; } } diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs index 9836be5d..12f8896c 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -1,7 +1,10 @@ using System; using System.Windows.Forms; using v2rayN.Base; +using v2rayN.Handler; using v2rayN.Mode; +using System.Linq; +using System.Collections.Generic; namespace v2rayN.Forms { @@ -9,9 +12,12 @@ namespace v2rayN.Forms public partial class SubSettingControl : UserControl { public event ChangeEventHandler OnButtonClicked; + private List groupItem; - - public SubItem subItem { get; set; } + public SubItem subItem + { + get; set; + } public SubSettingControl() { @@ -20,6 +26,13 @@ namespace v2rayN.Forms private void SubSettingControl_Load(object sender, EventArgs e) { + Height = grbMain.Height; + + groupItem = LazyConfig.Instance.GetConfig().groupItem; + + cmbGroup.Items.AddRange(groupItem.Select(t => t.remarks).ToArray()); + cmbGroup.Items.Add(string.Empty); + BindingSub(); } @@ -30,6 +43,13 @@ namespace v2rayN.Forms txtRemarks.Text = subItem.remarks.ToString(); txtUrl.Text = subItem.url.ToString(); chkEnabled.Checked = subItem.enabled; + txtUserAgent.Text = subItem.userAgent; + + var index = groupItem.FindIndex(t => t.id == subItem.groupId); + if (index >= 0) + { + cmbGroup.SelectedIndex = index; + } } } private void EndBindingSub() @@ -39,6 +59,17 @@ namespace v2rayN.Forms subItem.remarks = txtRemarks.Text.TrimEx(); subItem.url = txtUrl.Text.TrimEx(); subItem.enabled = chkEnabled.Checked; + subItem.userAgent = txtUserAgent.Text.TrimEx(); + + var index = groupItem.FindIndex(t => t.remarks == cmbGroup.Text); + if (index >= 0) + { + subItem.groupId = groupItem[index].id; + } + else + { + subItem.groupId = string.Empty; + } } } private void txtRemarks_Leave(object sender, EventArgs e) @@ -56,5 +87,23 @@ namespace v2rayN.Forms OnButtonClicked?.Invoke(sender, e); } + + private void btnShare_Click(object sender, EventArgs e) + { + if (Height <= grbMain.Height) + { + if (Utils.IsNullOrEmpty(subItem.url)) + { + picQRCode.Image = null; + return; + } + picQRCode.Image = QRCodeHelper.GetQRCode(subItem.url); + Height = grbMain.Height + 200; + } + else + { + Height = grbMain.Height; + } + } } } diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx index a5dec524..d750067b 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -117,124 +117,373 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + User Agent(optional) + + + NoControl + + + grbMain + - - - 6, 12 + + 619, 162 - - zh-Hans - - - True - - - 584, 119 - - - NoControl - - - 484, 21 - - - 75, 23 - - - 24 - - - &Remove - - - True - - - NoControl - - - 406, 23 + + 127, 147 60, 16 - - 25 + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Enable + + txtUrl - - Bottom + + grbMain - - 0, 9 + + picQRCode - - 584, 110 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 10 + + Remove - + + 525, 21 + + + + 24 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 127, 111 + + + SubSettingControl + + + label1 + + Subscription details - - True + + 26 - - NoControl + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 12, 25 - - - 47, 12 - - - 10 - - - Remarks - - - True - - - NoControl - - - 12, 55 - - - 83, 12 - - - 0 - - - Address (url) - - - 127, 21 - - - 265, 21 - - - 11 - - - 127, 55 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 True - - 432, 46 + + grbMain + + + 36 + + + 434, 21 + + + 83, 12 + + + cmbGroup + + + 232, 21 + + + Top + + + 6, 12 + + + label3 + + + 127, 21 + + + NoControl + + + Share + + + 10 + + + grbMain + + + 5 + + + 12, 53 + + + 3 + + + Fill + + + 27 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 473, 21 + + + 125, 12 + + + label4 + + + 127, 53 + + + 3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 7 + + + grbMain + + + 232, 20 + + + 2 + + + 1 + + + NoControl + + + 47, 12 + + + Vertical + + + btnRemove + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Enable + + + chkEnabled + + + Zoom + + + 8 + + + 25 + + + Belong to Group + + + 35 + + + txtRemarks + + + NoControl + + + 75, 23 + + + 6 + + + grbMain + + + 25 + + + 0 + + + grbMain + + + 1 - 23 + 2 + + 10 + + + grbMain + + + grbMain + + + 368, 23 + + + True + + + True + + + 0, 0 + + + True + + + True + + + 0 + + + NoControl + + + label2 + + + $this + + + True + + + 619, 188 + + + btnShare + + + 619, 350 + + + 4 + + + 9 + + + NoControl + + + 12, 115 + + + 0, 188 + + + txtUserAgent + + + Remarks + + + grbMain + + + NoControl + + + 473, 46 + + + 12, 25 + + + 75, 23 + + + 12, 151 + + + 95, 12 + + + grbMain + + + 1 + + + Address (url) + + + $this + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + grbMain + + + NoControl + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + True + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx index 95e5122f..27cc0315 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx @@ -118,8 +118,20 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 移除 + + 53, 12 + + + 所属分组 + + + 101, 12 + + + User Agent(可选) + + + 分享 48, 16 @@ -127,8 +139,8 @@ 启用 - - 订阅详情 + + 移除 29, 12 @@ -142,4 +154,7 @@ 地址 (url) + + 订阅详情 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.cs b/v2rayN/v2rayN/Forms/SubSettingForm.cs index c8e7725b..1312c4a0 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.cs +++ b/v2rayN/v2rayN/Forms/SubSettingForm.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Forms { @@ -68,24 +69,19 @@ namespace v2rayN.Forms private void btnOK_Click(object sender, EventArgs e) { - if (config.subItem.Count <= 0) - { - AddSub(); - } - if (ConfigHandler.SaveSubItem(ref config) == 0) { - this.DialogResult = DialogResult.OK; + DialogResult = DialogResult.OK; } else { - UI.ShowWarning(UIRes.I18N("OperationFailed")); + UI.ShowWarning(ResUI.OperationFailed); } } private void btnClose_Click(object sender, EventArgs e) { - this.DialogResult = DialogResult.Cancel; + DialogResult = DialogResult.Cancel; } private void btnAdd_Click(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.resx b/v2rayN/v2rayN/Forms/SubSettingForm.resx index e2001bb5..316b8ff2 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.resx +++ b/v2rayN/v2rayN/Forms/SubSettingForm.resx @@ -118,19 +118,61 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + NoControl + + + 448, 17 + + + 75, 23 + - - 6, 12 + + 4 - - 581, 629 + + &Cancel - + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + True - - Subscription settings + + Fill + + + 0, 0 + + + 634, 401 + + + 10 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 NoControl @@ -147,20 +189,17 @@ &Add - - NoControl + + btnAdd - - 448, 17 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 75, 23 + + panel2 - - 4 - - - &Cancel + + 0 NoControl @@ -177,31 +216,58 @@ &OK - - True + + btnOK - - Fill + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0, 0 + + panel2 - - 581, 569 - - - 10 + + 2 Bottom - 0, 569 + 0, 401 - 581, 60 + 634, 60 7 + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 634, 461 + + + Subscription settings + + + SubSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 3d736b4e..e93fd214 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -1,14 +1,26 @@  +using System.Collections.Generic; + namespace v2rayN { class Global { #region 常量 - + //public const string DownloadFileName = "v2ray-windows.zip"; public const string v2rayWebsiteUrl = @"https://www.v2fly.org/"; public const string AboutUrl = @"https://github.com/cg3s/v2rayN"; public const string UpdateUrl = AboutUrl + @"/releases"; + public const string v2flyCoreUrl = "https://github.com/v2fly/v2ray-core/releases"; + public const string xrayCoreUrl = "https://github.com/XTLS/Xray-core/releases"; + public const string NUrl = @"https://github.com/2dust/v2rayN/releases"; + public const string clashCoreUrl = "https://github.com/Dreamacro/clash/releases"; + public const string clashMetaCoreUrl = "https://github.com/MetaCubeX/Clash.Meta/releases"; + public const string hysteriaCoreUrl = "https://github.com/HyNetwork/hysteria/releases"; + public const string naiveproxyCoreUrl = "https://github.com/klzgrad/naiveproxy/releases"; + public const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat"; + + /// @@ -16,14 +28,12 @@ namespace v2rayN /// public const string SpeedTestUrl = @"http://cachefly.cachefly.net/10mb.test"; public const string SpeedPingTestUrl = @"https://www.google.com/generate_204"; - public const string AvailabilityTestUrl = @"https://www.google.com/generate_204"; /// /// CustomRoutingListUrl /// public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/cg3s/v2rayCustomRoutingList/master/"; - public const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"; /// /// PromotionUrl @@ -56,13 +66,11 @@ namespace v2rayN /// v2ray配置Httpresponse文件名 /// public const string v2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse.txt"; - /// - /// 空白的pac文件 - /// - public const string BlankPacFileName = "v2rayN.Sample.BlankPac.txt"; public const string CustomRoutingFileName = "v2rayN.Sample.custom_routing_"; + public const string v2raySampleInbound = "v2rayN.Sample.SampleInbound.txt"; + /// /// 默认加密方式 @@ -107,6 +115,8 @@ namespace v2rayN public const string InboundSocks = "socks"; public const string InboundHttp = "http"; + public const string InboundSocks2 = "socks2"; + public const string InboundHttp2 = "http2"; public const string Loopback = "127.0.0.1"; public const string InboundAPITagName = "api"; public const string InboundAPIProtocal = "dokodemo-door"; @@ -161,11 +171,6 @@ namespace v2rayN /// public const string trojanProtocolLite = "trojan"; - /// - /// pac - /// - public const string pacFILE = "pac.txt"; - /// /// email /// @@ -180,20 +185,34 @@ namespace v2rayN /// Language /// public const string MyRegKeyLanguage = "CurrentLanguage"; + /// /// Icon /// public const string CustomIconName = "v2rayN.ico"; - public enum StatisticsFreshRate - { - quick = 1000, - medium = 2000, - slow = 3000 - } public const string StatisticLogOverall = "StatisticLogOverall.json"; public const string IEProxyExceptions = "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*"; + public static readonly List IEProxyProtocols = new List { + "{ip}:{http_port}", + "socks={ip}:{socks_port}", + "http={ip}:{http_port};https={ip}:{http_port};ftp={ip}:{http_port};socks={ip}:{socks_port}", + "http=http://{ip}:{http_port};https=http://{ip}:{http_port}", + "" + }; + + public const string RoutingRuleComma = ""; + + public static readonly List vmessSecuritys = new List { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" }; + public static readonly List ssSecuritys = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; + public static readonly List ssSecuritysInXray = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "none", "plain", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305" }; + public static readonly List xtlsFlows = new List { "", "xtls-rprx-origin", "xtls-rprx-origin-udp443", "xtls-rprx-direct", "xtls-rprx-direct-udp443" }; + public static readonly List networks = new List { "tcp", "kcp", "ws", "h2", "quic", "grpc" }; + public static readonly List kcpHeaderTypes = new List { "srtp", "utp", "wechat-video", "dtls", "wireguard" }; + public static readonly List coreTypes = new List { "v2fly", "Xray" }; + public const string GrpcgunMode = "gun"; + public const string GrpcmultiMode = "multi"; #endregion @@ -208,39 +227,7 @@ namespace v2rayN } /// - /// 是否开启全局代理(http) - /// - public static bool sysAgent - { - get; set; - } - - /// - /// socks端口 - /// - public static int socksPort - { - get; set; - } - - /// - /// http端口 - /// - public static int httpPort - { - get; set; - } - - /// - /// PAC端口 - /// - public static int pacPort - { - get; set; - } - - /// - /// + /// /// public static int statePort { diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 37a9878e..9f50d6d9 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -6,6 +6,7 @@ using v2rayN.Mode; using v2rayN.Base; using System.Linq; using v2rayN.Tool; +using System.Threading.Tasks; namespace v2rayN.Handler { @@ -15,6 +16,9 @@ namespace v2rayN.Handler class ConfigHandler { private static string configRes = Global.ConfigFileName; + private static readonly object objLock = new object(); + + #region ConfigHandler /// /// 载入配置文件 @@ -30,11 +34,19 @@ namespace v2rayN.Handler //转成Json config = Utils.FromJson(result); } + else + { + if (File.Exists(Utils.GetPath(configRes))) + { + Utils.SaveLog("LoadConfig Exception"); + return -1; + } + } + if (config == null) { config = new Config { - index = -1, logEnabled = false, loglevel = "warning", vmess = new List(), @@ -42,14 +54,11 @@ namespace v2rayN.Handler //Mux muxEnabled = false, - ////默认监听端口 - //config.pacPort = 8888; - - // 默认不开启统计 enableStatistics = false, - // 默认中等刷新率 - statisticsFreshRate = (int)Global.StatisticsFreshRate.medium + statisticsFreshRate = 1, + + enableRoutingAdvanced = true }; } @@ -76,7 +85,6 @@ namespace v2rayN.Handler } else { - //http协议不由core提供,只保留socks if (config.inbound.Count > 0) { config.inbound[0].protocol = Global.InboundSocks; @@ -87,22 +95,11 @@ namespace v2rayN.Handler { config.domainStrategy = "IPIfNonMatch"; } - if (Utils.IsNullOrEmpty(config.routingMode)) + if (Utils.IsNullOrEmpty(config.domainMatcher)) { - config.routingMode = "0"; - } - if (config.useragent == null) - { - config.useragent = new List(); - } - if (config.userdirect == null) - { - config.userdirect = new List(); - } - if (config.userblock == null) - { - config.userblock = new List(); + config.domainMatcher = "linear"; } + //kcp if (config.kcpItem == null) { @@ -119,29 +116,32 @@ namespace v2rayN.Handler } if (config.uiItem == null) { - config.uiItem = new UIItem(); + config.uiItem = new UIItem() + { + enableAutoAdjustMainLvColWidth = true + }; } if (config.uiItem.mainLvColWidth == null) { config.uiItem.mainLvColWidth = new Dictionary(); } - //// 如果是用户升级,首次会有端口号为0的情况,不可用,这里处理 - //if (config.pacPort == 0) - //{ - // config.pacPort = 8888; - //} - if (Utils.IsNullOrEmpty(config.speedTestUrl)) + + if (config.constItem == null) { - config.speedTestUrl = Global.SpeedTestUrl; + config.constItem = new ConstItem(); } - if (Utils.IsNullOrEmpty(config.speedPingTestUrl)) + if (Utils.IsNullOrEmpty(config.constItem.speedTestUrl)) { - config.speedPingTestUrl = Global.SpeedPingTestUrl; + config.constItem.speedTestUrl = Global.SpeedTestUrl; } - if (Utils.IsNullOrEmpty(config.urlGFWList)) + if (Utils.IsNullOrEmpty(config.constItem.speedPingTestUrl)) { - config.urlGFWList = Global.GFWLIST_URL; + config.constItem.speedPingTestUrl = Global.SpeedPingTestUrl; + } + if (Utils.IsNullOrEmpty(config.constItem.defIEProxyExceptions)) + { + config.constItem.defIEProxyExceptions = Global.IEProxyExceptions; } //if (Utils.IsNullOrEmpty(config.remoteDNS)) //{ @@ -152,15 +152,17 @@ namespace v2rayN.Handler { config.subItem = new List(); } - if (config.userPacRule == null) + if (config.groupItem == null) { - config.userPacRule = new List(); + config.groupItem = new List(); + } + if (config.statisticsFreshRate > 100) + { + config.statisticsFreshRate = 1; } if (config == null - || config.index < 0 || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 ) { Global.reloadV2ray = false; @@ -174,167 +176,17 @@ namespace v2rayN.Handler { VmessItem vmessItem = config.vmess[i]; UpgradeServerVersion(ref vmessItem); + + if (Utils.IsNullOrEmpty(vmessItem.indexId)) + { + vmessItem.indexId = Utils.GetGUID(false); + } } } + LazyConfig.Instance.SetConfig(ref config); return 0; } - - /// - /// 添加服务器或编辑 - /// - /// - /// - /// - /// - public static int AddServer(ref Config config, VmessItem vmessItem, int index) - { - vmessItem.configVersion = 2; - vmessItem.configType = (int)EConfigType.Vmess; - - vmessItem.address = vmessItem.address.TrimEx(); - vmessItem.id = vmessItem.id.TrimEx(); - vmessItem.security = vmessItem.security.TrimEx(); - vmessItem.network = vmessItem.network.TrimEx(); - vmessItem.headerType = vmessItem.headerType.TrimEx(); - vmessItem.requestHost = vmessItem.requestHost.TrimEx(); - vmessItem.path = vmessItem.path.TrimEx(); - vmessItem.streamSecurity = vmessItem.streamSecurity.TrimEx(); - - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - //添加 - if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) - { - vmessItem.allowInsecure = config.defAllowInsecure.ToString(); - } - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; - } - } - - ToJsonFile(config); - - return 0; - } - - /// - /// 移除服务器 - /// - /// - /// - /// - public static int RemoveServer(ref Config config, int index) - { - if (index < 0 || index > config.vmess.Count - 1) - { - return -1; - } - - //删除 - config.vmess.RemoveAt(index); - - - //移除的是活动的 - if (config.index.Equals(index)) - { - if (config.vmess.Count > 0) - { - config.index = 0; - } - else - { - config.index = -1; - } - Global.reloadV2ray = true; - } - else if (index < config.index)//移除活动之前的 - { - config.index--; - Global.reloadV2ray = true; - } - - ToJsonFile(config); - - return 0; - } - - /// - /// 克隆服务器 - /// - /// - /// - /// - public static int CopyServer(ref Config config, int index) - { - if (index < 0 || index > config.vmess.Count - 1) - { - return -1; - } - - VmessItem vmessItem = new VmessItem - { - configVersion = config.vmess[index].configVersion, - address = config.vmess[index].address, - port = config.vmess[index].port, - id = config.vmess[index].id, - alterId = config.vmess[index].alterId, - security = config.vmess[index].security, - network = config.vmess[index].network, - remarks = string.Format("{0}-clone", config.vmess[index].remarks), - headerType = config.vmess[index].headerType, - requestHost = config.vmess[index].requestHost, - path = config.vmess[index].path, - streamSecurity = config.vmess[index].streamSecurity, - allowInsecure = config.vmess[index].allowInsecure, - configType = config.vmess[index].configType - }; - - config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 - - ToJsonFile(config); - - return 0; - } - - /// - /// 设置活动服务器 - /// - /// - /// - /// - public static int SetDefaultServer(ref Config config, int index) - { - if (index < 0 || index > config.vmess.Count - 1) - { - return -1; - } - - ////和现在相同 - //if (config.index.Equals(index)) - //{ - // return -1; - //} - config.index = index; - Global.reloadV2ray = true; - - ToJsonFile(config); - - return 0; - } - /// /// 保参数 /// @@ -355,117 +207,202 @@ namespace v2rayN.Handler /// private static void ToJsonFile(Config config) { - Utils.ToJsonFile(config, Utils.GetPath(configRes)); + lock (objLock) + { + try + { + + //save temp file + var resPath = Utils.GetPath(configRes); + var tempPath = $"{resPath}_temp"; + if (Utils.ToJsonFile(config, tempPath) != 0) + { + return; + } + + if (File.Exists(resPath)) + { + File.Delete(resPath); + } + //rename + File.Move(tempPath, resPath); + } + catch (Exception ex) + { + Utils.SaveLog("ToJsonFile", ex); + } + } + } + + #endregion + + #region Server + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + public static int AddServer(ref Config config, VmessItem vmessItem, bool toFile = true) + { + vmessItem.configType = EConfigType.VMess; + + vmessItem.address = vmessItem.address.TrimEx(); + vmessItem.id = vmessItem.id.TrimEx(); + vmessItem.security = vmessItem.security.TrimEx(); + vmessItem.network = vmessItem.network.TrimEx(); + vmessItem.headerType = vmessItem.headerType.TrimEx(); + vmessItem.requestHost = vmessItem.requestHost.TrimEx(); + vmessItem.path = vmessItem.path.TrimEx(); + vmessItem.streamSecurity = vmessItem.streamSecurity.TrimEx(); + + if (!Global.vmessSecuritys.Contains(vmessItem.security)) + { + return -1; + } + + AddServerCommon(ref config, vmessItem); + + if (toFile) + { + ToJsonFile(config); + } + return 0; } /// - /// 取得服务器QRCode配置 + /// 移除服务器 + /// + /// + /// + /// + public static int RemoveServer(Config config, List indexs) + { + foreach (var item in indexs) + { + var index = config.FindIndexId(item.indexId); + if (index >= 0) + { + RemoveVmessItem(config, index); + } + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 克隆服务器 /// /// /// /// - public static string GetVmessQRCode(Config config, int index) + public static int CopyServer(ref Config config, List indexs) { - try + foreach (var item in indexs) { - string url = string.Empty; + VmessItem vmessItem = Utils.DeepCopy(item); + vmessItem.indexId = string.Empty; + vmessItem.remarks = $"{item.remarks}-clone"; - VmessItem vmessItem = config.vmess[index]; - if (vmessItem.configType == (int)EConfigType.Vmess) + if (vmessItem.configType == EConfigType.Custom) { - VmessQRCode vmessQRCode = new VmessQRCode + vmessItem.address = Utils.GetConfigPath(vmessItem.address); + if (AddCustomServer(ref config, vmessItem, false) == 0) { - v = vmessItem.configVersion.ToString(), - ps = vmessItem.remarks.TrimEx(), //备注也许很长 ; - add = vmessItem.address, - port = vmessItem.port.ToString(), - id = vmessItem.id, - aid = vmessItem.alterId.ToString(), - net = vmessItem.network, - type = vmessItem.headerType, - host = vmessItem.requestHost, - path = vmessItem.path, - tls = vmessItem.streamSecurity - }; - - url = Utils.ToJson(vmessQRCode); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}", Global.vmessProtocol, url); - - } - else if (vmessItem.configType == (int)EConfigType.Shadowsocks) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(vmessItem.remarks)) - { - remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); } - url = string.Format("{0}:{1}@{2}:{3}", - vmessItem.security, - vmessItem.id, - vmessItem.address, - vmessItem.port); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); - } - else if (vmessItem.configType == (int)EConfigType.Socks) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(vmessItem.remarks)) - { - remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); - } - url = string.Format("{0}:{1}@{2}:{3}", - vmessItem.security, - vmessItem.id, - vmessItem.address, - vmessItem.port); - url = Utils.Base64Encode(url); - url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); - } - else if (vmessItem.configType == (int)EConfigType.Trojan) - { - string remark = string.Empty; - if (!Utils.IsNullOrEmpty(vmessItem.remarks)) - { - remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); - } - string query = string.Empty; - if (!Utils.IsNullOrEmpty(vmessItem.requestHost)) - { - query = string.Format("?sni={0}", vmessItem.requestHost); - } - url = string.Format("{0}@{1}:{2}", - vmessItem.id, - vmessItem.address, - vmessItem.port); - url = string.Format("{0}{1}{2}{3}", Global.trojanProtocol, url, query, remark); } else { + AddServerCommon(ref config, vmessItem); } - return url; } - catch + + ToJsonFile(config); + + return 0; + } + + /// + /// 设置活动服务器 + /// + /// + /// + /// + public static int SetDefaultServer(ref Config config, VmessItem item) + { + if (item == null) { - return ""; + return -1; } + + config.indexId = item.indexId; + Global.reloadV2ray = true; + + ToJsonFile(config); + + return 0; + } + + public static int SetDefaultServer(Config config, List lstVmess) + { + if (lstVmess.Exists(t => t.indexId == config.indexId)) + { + return 0; + } + if (config.vmess.Exists(t => t.indexId == config.indexId)) + { + return 0; + } + if (lstVmess.Count > 0) + { + return SetDefaultServer(ref config, lstVmess[0]); + } + if (config.vmess.Count > 0) + { + return SetDefaultServer(ref config, config.vmess[0]); + } + return -1; + } + public static VmessItem GetDefaultServer(ref Config config) + { + if (config.vmess.Count <= 0) + { + return null; + } + var index = config.FindIndexId(config.indexId); + if (index < 0) + { + SetDefaultServer(ref config, config.vmess[0]); + return config.vmess[0]; + } + + return config.vmess[index]; } /// /// 移动服务器 /// /// + /// /// /// /// - public static int MoveServer(ref Config config, int index, EMove eMove) + public static int MoveServer(ref Config config, ref List lstVmess, int index, EMove eMove, int pos = -1) { - int count = config.vmess.Count; - if (index < 0 || index > config.vmess.Count - 1) + int count = lstVmess.Count; + if (index < 0 || index > lstVmess.Count - 1) { return -1; } + + for (int i = 0; i < lstVmess.Count; i++) + { + lstVmess[i].sort = (i + 1) * 10; + } + switch (eMove) { case EMove.Top: @@ -474,21 +411,8 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Insert(0, vmess); - if (index < config.index) - { - // - } - else if (config.index == index) - { - config.index = 0; - } - else - { - config.index++; - } + lstVmess[index].sort = lstVmess[0].sort - 1; + break; } case EMove.Up: @@ -497,17 +421,8 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Insert(index - 1, vmess); - if (index == config.index + 1) - { - config.index++; - } - else if (config.index == index) - { - config.index--; - } + lstVmess[index].sort = lstVmess[index - 1].sort - 1; + break; } @@ -517,17 +432,8 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Insert(index + 1, vmess); - if (index == config.index - 1) - { - config.index--; - } - else if (config.index == index) - { - config.index++; - } + lstVmess[index].sort = lstVmess[index + 1].sort + 1; + break; } case EMove.Bottom: @@ -536,26 +442,14 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); - config.vmess.RemoveAt(index); - config.vmess.Add(vmess); - if (index < config.index) - { - config.index--; - } - else if (config.index == index) - { - config.index = count - 1; - } - else - { - // - } + lstVmess[index].sort = lstVmess[lstVmess.Count - 1].sort + 1; + break; } - + case EMove.Position: + lstVmess[index].sort = pos * 10 + 1; + break; } - Global.reloadV2ray = true; ToJsonFile(config); @@ -566,36 +460,43 @@ namespace v2rayN.Handler /// 添加自定义服务器 /// /// - /// + /// /// - public static int AddCustomServer(ref Config config, string fileName) + public static int AddCustomServer(ref Config config, VmessItem vmessItem, bool blDelete) { - string newFileName = string.Format("{0}.json", Utils.GetGUID()); + var fileName = vmessItem.address; + if (!File.Exists(fileName)) + { + return -1; + } + var ext = Path.GetExtension(fileName); + string newFileName = $"{Utils.GetGUID()}{ext}"; //newFileName = Path.Combine(Utils.GetTempPath(), newFileName); try { - File.Copy(fileName, Path.Combine(Utils.GetTempPath(), newFileName)); + File.Copy(fileName, Utils.GetConfigPath(newFileName)); + if (blDelete) + { + File.Delete(fileName); + } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); return -1; } - VmessItem vmessItem = new VmessItem + vmessItem.address = newFileName; + vmessItem.configType = EConfigType.Custom; + if (Utils.IsNullOrEmpty(vmessItem.remarks)) { - address = newFileName, - configType = (int)EConfigType.Custom, - remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()) - }; - - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; + vmessItem.remarks = $"import custom@{DateTime.Now.ToShortDateString()}"; } + + AddServerCommon(ref config, vmessItem); + ToJsonFile(config); return 0; @@ -606,17 +507,9 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int EditCustomServer(ref Config config, VmessItem vmessItem, int index) + public static int EditCustomServer(ref Config config, VmessItem vmessItem) { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - ToJsonFile(config); return 0; @@ -627,38 +520,26 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, int index) + public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, bool toFile = true) { - vmessItem.configVersion = 2; - vmessItem.configType = (int)EConfigType.Shadowsocks; + vmessItem.configType = EConfigType.Shadowsocks; vmessItem.address = vmessItem.address.TrimEx(); vmessItem.id = vmessItem.id.TrimEx(); vmessItem.security = vmessItem.security.TrimEx(); - if (index >= 0) + if (!LazyConfig.Instance.GetShadowsocksSecuritys().Contains(vmessItem.security)) { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - //添加 - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; - } + return -1; } - ToJsonFile(config); + AddServerCommon(ref config, vmessItem); + + if (toFile) + { + ToJsonFile(config); + } return 0; } @@ -668,80 +549,50 @@ namespace v2rayN.Handler /// /// /// - /// /// - public static int AddSocksServer(ref Config config, VmessItem vmessItem, int index) + public static int AddSocksServer(ref Config config, VmessItem vmessItem, bool toFile = true) { - vmessItem.configVersion = 2; - vmessItem.configType = (int)EConfigType.Socks; + vmessItem.configType = EConfigType.Socks; vmessItem.address = vmessItem.address.TrimEx(); - if (index >= 0) - { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } - } - else - { - //添加 - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; - } - } + AddServerCommon(ref config, vmessItem); - ToJsonFile(config); + if (toFile) + { + ToJsonFile(config); + } return 0; } - /// /// 添加服务器或编辑 /// /// /// - /// /// - public static int AddTrojanServer(ref Config config, VmessItem vmessItem, int index) + public static int AddTrojanServer(ref Config config, VmessItem vmessItem, bool toFile = true) { - vmessItem.configVersion = 2; - vmessItem.configType = (int)EConfigType.Trojan; + vmessItem.configType = EConfigType.Trojan; vmessItem.address = vmessItem.address.TrimEx(); vmessItem.id = vmessItem.id.TrimEx(); - - vmessItem.streamSecurity = Global.StreamSecurity; - vmessItem.allowInsecure = "false"; - - if (index >= 0) + if (Utils.IsNullOrEmpty(vmessItem.streamSecurity)) { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } + vmessItem.streamSecurity = Global.StreamSecurity; } - else + if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) { - //添加 - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; - } + vmessItem.allowInsecure = config.defAllowInsecure.ToString(); } - ToJsonFile(config); + AddServerCommon(ref config, vmessItem); + + if (toFile) + { + ToJsonFile(config); + } return 0; } @@ -760,7 +611,7 @@ namespace v2rayN.Handler { return 0; } - if (vmessItem.configType == (int)EConfigType.Vmess) + if (vmessItem.configType == EConfigType.VMess) { string path = ""; string host = ""; @@ -811,6 +662,184 @@ namespace v2rayN.Handler return 0; } + public static int SortServers(ref Config config, ref List lstVmess, EServerColName name, bool asc) + { + if (lstVmess.Count <= 0) + { + return -1; + } + var propertyName = string.Empty; + switch (name) + { + case EServerColName.configType: + case EServerColName.remarks: + case EServerColName.address: + case EServerColName.port: + case EServerColName.security: + case EServerColName.network: + case EServerColName.streamSecurity: + case EServerColName.testResult: + propertyName = name.ToString(); + break; + case EServerColName.subRemarks: + propertyName = "subid"; + break; + default: + return -1; + } + + var items = lstVmess.AsQueryable(); + + if (asc) + { + lstVmess = items.OrderBy(propertyName).ToList(); + } + else + { + lstVmess = items.OrderByDescending(propertyName).ToList(); + } + for (int i = 0; i < lstVmess.Count; i++) + { + lstVmess[i].sort = (i + 1) * 10; + } + + ToJsonFile(config); + return 0; + } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + public static int AddVlessServer(ref Config config, VmessItem vmessItem, bool toFile = true) + { + vmessItem.configType = EConfigType.VLESS; + + vmessItem.address = vmessItem.address.TrimEx(); + vmessItem.id = vmessItem.id.TrimEx(); + vmessItem.security = vmessItem.security.TrimEx(); + vmessItem.network = vmessItem.network.TrimEx(); + vmessItem.headerType = vmessItem.headerType.TrimEx(); + vmessItem.requestHost = vmessItem.requestHost.TrimEx(); + vmessItem.path = vmessItem.path.TrimEx(); + vmessItem.streamSecurity = vmessItem.streamSecurity.TrimEx(); + + AddServerCommon(ref config, vmessItem); + + if (toFile) + { + ToJsonFile(config); + } + + return 0; + } + + public static int DedupServerList(ref Config config, ref List lstVmess) + { + List source = lstVmess; + bool keepOlder = config.keepOlderDedupl; + + List list = new List(); + if (!keepOlder) source.Reverse(); // Remove the early items first + + foreach (VmessItem item in source) + { + if (!list.Exists(i => CompareVmessItem(i, item, false))) + { + list.Add(item); + } + else + { + var index = config.FindIndexId(item.indexId); + if (index >= 0) + { + RemoveVmessItem(config, index); + } + } + } + //if (!keepOlder) list.Reverse(); + //config.vmess = list; + + return list.Count; + } + + public static int AddServerCommon(ref Config config, VmessItem vmessItem) + { + vmessItem.configVersion = 2; + if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) + { + vmessItem.allowInsecure = config.defAllowInsecure.ToString(); + } + if (!Utils.IsNullOrEmpty(vmessItem.network) && !Global.networks.Contains(vmessItem.network)) + { + vmessItem.network = Global.DefaultNetwork; + } + + if (Utils.IsNullOrEmpty(vmessItem.indexId)) + { + vmessItem.indexId = Utils.GetGUID(false); + } + else if (vmessItem.indexId == config.indexId) + { + Global.reloadV2ray = true; + } + if (!config.vmess.Exists(it => it.indexId == vmessItem.indexId)) + { + var maxSort = config.vmess.Any() ? config.vmess.Max(t => t.sort) : 0; + vmessItem.sort = maxSort++; + + config.vmess.Add(vmessItem); + } + + return 0; + } + + private static bool CompareVmessItem(VmessItem o, VmessItem n, bool remarks) + { + if (o == null || n == null) + { + return false; + } + + return o.configVersion == n.configVersion + && o.configType == n.configType + && o.address == n.address + && o.port == n.port + && o.id == n.id + && o.alterId == n.alterId + && o.security == n.security + && o.network == n.network + && o.headerType == n.headerType + && o.requestHost == n.requestHost + && o.path == n.path + && o.streamSecurity == n.streamSecurity + && o.flow == n.flow + && (!remarks || o.remarks == n.remarks); + } + + private static int RemoveVmessItem(Config config, int index) + { + try + { + if (config.vmess[index].configType == EConfigType.Custom) + { + File.Delete(Utils.GetConfigPath(config.vmess[index].address)); + } + } + catch (Exception ex) + { + Utils.SaveLog("RemoveVmessItem", ex); + } + config.vmess.RemoveAt(index); + + return 0; + } + #endregion + + #region Batch add servers + /// /// 批量添加服务器 /// @@ -818,12 +847,18 @@ namespace v2rayN.Handler /// /// /// 成功导入的数量 - public static int AddBatchServers(ref Config config, string clipboardData, string subid = "") + private static int AddBatchServers(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId) { if (Utils.IsNullOrEmpty(clipboardData)) { return -1; } + + //copy sub items + if (!Utils.IsNullOrEmpty(subid)) + { + RemoveServerViaSubid(ref config, subid); + } //if (clipboardData.IndexOf("vmess") >= 0 && clipboardData.IndexOf("vmess") == clipboardData.LastIndexOf("vmess")) //{ // clipboardData = clipboardData.Replace("\r\n", "").Replace("\n", ""); @@ -835,7 +870,7 @@ namespace v2rayN.Handler foreach (string str in arrData) { //maybe sub - if (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol)) + if (Utils.IsNullOrEmpty(subid) && (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol))) { if (AddSubItem(ref config, str) == 0) { @@ -843,44 +878,251 @@ namespace v2rayN.Handler } continue; } - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(str, out string msg); + VmessItem vmessItem = ShareHandler.ImportFromClipboardConfig(str, out string msg); if (vmessItem == null) { continue; } - vmessItem.subid = subid; - if (vmessItem.configType == (int)EConfigType.Vmess) + + //exist sub items + if (!Utils.IsNullOrEmpty(subid)) { - if (AddServer(ref config, vmessItem, -1) == 0) + var existItem = lstOriSub?.FirstOrDefault(t => CompareVmessItem(t, vmessItem, true)); + if (existItem != null) + { + vmessItem = existItem; + } + vmessItem.subid = subid; + } + + //groupId + vmessItem.groupId = groupId; + + if (vmessItem.configType == EConfigType.VMess) + { + if (AddServer(ref config, vmessItem, false) == 0) { countServers++; } } - else if (vmessItem.configType == (int)EConfigType.Shadowsocks) + else if (vmessItem.configType == EConfigType.Shadowsocks) { - if (AddShadowsocksServer(ref config, vmessItem, -1) == 0) + if (AddShadowsocksServer(ref config, vmessItem, false) == 0) { countServers++; } } - else if (vmessItem.configType == (int)EConfigType.Socks) + else if (vmessItem.configType == EConfigType.Socks) { - if (AddSocksServer(ref config, vmessItem, -1) == 0) + if (AddSocksServer(ref config, vmessItem, false) == 0) { countServers++; } } - else if (vmessItem.configType == (int)EConfigType.Trojan) + else if (vmessItem.configType == EConfigType.Trojan) { - if (AddTrojanServer(ref config, vmessItem, -1) == 0) + if (AddTrojanServer(ref config, vmessItem, false) == 0) + { + countServers++; + } + } + else if (vmessItem.configType == EConfigType.VLESS) + { + if (AddVlessServer(ref config, vmessItem, false) == 0) { countServers++; } } } + + ToJsonFile(config); return countServers; } + private static int AddBatchServers4Custom(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId) + { + if (Utils.IsNullOrEmpty(clipboardData)) + { + return -1; + } + + VmessItem vmessItem = new VmessItem(); + //Is v2ray configuration + V2rayConfig v2rayConfig = Utils.FromJson(clipboardData); + if (v2rayConfig != null + && v2rayConfig.inbounds != null + && v2rayConfig.inbounds.Count > 0 + && v2rayConfig.outbounds != null + && v2rayConfig.outbounds.Count > 0) + { + var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); + File.WriteAllText(fileName, clipboardData); + + vmessItem.coreType = ECoreType.Xray; + vmessItem.address = fileName; + vmessItem.remarks = "v2ray_custom"; + } + //Is Clash configuration + else if (clipboardData.IndexOf("port") >= 0 + && clipboardData.IndexOf("socks-port") >= 0 + && clipboardData.IndexOf("proxies") >= 0) + { + var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.yaml"); + File.WriteAllText(fileName, clipboardData); + + vmessItem.coreType = ECoreType.clash; + vmessItem.address = fileName; + vmessItem.remarks = "clash_custom"; + } + //Is hysteria configuration + else if (clipboardData.IndexOf("server") >= 0 + && clipboardData.IndexOf("up") >= 0 + && clipboardData.IndexOf("down") >= 0 + && clipboardData.IndexOf("listen") >= 0 + && clipboardData.IndexOf("") < 0 + && clipboardData.IndexOf("") < 0) + { + var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); + File.WriteAllText(fileName, clipboardData); + + vmessItem.coreType = ECoreType.hysteria; + vmessItem.address = fileName; + vmessItem.remarks = "hysteria_custom"; + } + //Is naiveproxy configuration + else if (clipboardData.IndexOf("listen") >= 0 + && clipboardData.IndexOf("proxy") >= 0 + && clipboardData.IndexOf("") < 0 + && clipboardData.IndexOf("") < 0) + { + var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); + File.WriteAllText(fileName, clipboardData); + + vmessItem.coreType = ECoreType.naiveproxy; + vmessItem.address = fileName; + vmessItem.remarks = "naiveproxy_custom"; + } + //Is Other configuration + else + { + return -1; + //var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.txt"); + //File.WriteAllText(fileName, clipboardData); + + //vmessItem.address = fileName; + //vmessItem.remarks = "other_custom"; + } + + if (!Utils.IsNullOrEmpty(subid)) + { + RemoveServerViaSubid(ref config, subid); + } + if (lstOriSub != null && lstOriSub.Count == 1) + { + vmessItem.indexId = lstOriSub[0].indexId; + } + vmessItem.subid = subid; + vmessItem.groupId = groupId; + + if (Utils.IsNullOrEmpty(vmessItem.address)) + { + return -1; + } + + if (AddCustomServer(ref config, vmessItem, true) == 0) + { + return 1; + + } + else + { + return -1; + } + } + + private static int AddBatchServers4SsSIP008(ref Config config, string clipboardData, string subid, List lstOriSub, string groupId) + { + if (Utils.IsNullOrEmpty(clipboardData)) + { + return -1; + } + + if (!Utils.IsNullOrEmpty(subid)) + { + RemoveServerViaSubid(ref config, subid); + } + + //SsSIP008 + var lstSsServer = Utils.FromJson>(clipboardData); + if (lstSsServer == null || lstSsServer.Count <= 0) + { + var ssSIP008 = Utils.FromJson(clipboardData); + if (ssSIP008?.servers != null && ssSIP008.servers.Count > 0) + { + lstSsServer = ssSIP008.servers; + } + } + + if (lstSsServer != null && lstSsServer.Count > 0) + { + int counter = 0; + foreach (var it in lstSsServer) + { + var ssItem = new VmessItem() + { + subid = subid, + groupId = groupId, + remarks = it.remarks, + security = it.method, + id = it.password, + address = it.server, + port = Utils.ToInt(it.server_port) + }; + if (AddShadowsocksServer(ref config, ssItem, false) == 0) + { + counter++; + } + } + ToJsonFile(config); + return counter; + } + + return -1; + } + + public static int AddBatchServers(ref Config config, string clipboardData, string subid, string groupId) + { + List lstOriSub = null; + if (!Utils.IsNullOrEmpty(subid)) + { + lstOriSub = config.vmess.Where(it => it.subid == subid).ToList(); + } + + int counter = AddBatchServers(ref config, clipboardData, subid, lstOriSub, groupId); + if (counter < 1) + { + counter = AddBatchServers(ref config, Utils.Base64Decode(clipboardData), subid, lstOriSub, groupId); + } + + if (counter < 1) + { + counter = AddBatchServers4SsSIP008(ref config, clipboardData, subid, lstOriSub, groupId); + } + + //maybe other sub + if (counter < 1) + { + counter = AddBatchServers4Custom(ref config, clipboardData, subid, lstOriSub, groupId); + } + + return counter; + } + + + #endregion + + #region Sub & Group + /// /// add sub /// @@ -890,12 +1132,9 @@ namespace v2rayN.Handler public static int AddSubItem(ref Config config, string url) { //already exists - foreach (SubItem sub in config.subItem) + if (config.subItem.FindIndex(e => e.url == url) >= 0) { - if (url == sub.url) - { - return 0; - } + return 0; } SubItem subItem = new SubItem @@ -916,17 +1155,14 @@ namespace v2rayN.Handler /// public static int SaveSubItem(ref Config config) { - if (config.subItem == null || config.subItem.Count <= 0) + if (config.subItem == null) { return -1; } - foreach (SubItem sub in config.subItem) + foreach (var item in config.subItem.Where(item => Utils.IsNullOrEmpty(item.id))) { - if (Utils.IsNullOrEmpty(sub.id)) - { - sub.id = Utils.GetGUID(); - } + item.id = Utils.GetGUID(false); } ToJsonFile(config); @@ -949,7 +1185,7 @@ namespace v2rayN.Handler { if (config.vmess[k].subid.Equals(subid)) { - config.vmess.RemoveAt(k); + RemoveVmessItem(config, k); } } @@ -957,6 +1193,70 @@ namespace v2rayN.Handler return 0; } + + /// + /// save Group + /// + /// + /// + public static int SaveGroupItem(ref Config config) + { + if (config.groupItem == null) + { + return -1; + } + + foreach (var item in config.groupItem.Where(item => Utils.IsNullOrEmpty(item.id))) + { + item.id = Utils.GetGUID(false); + } + + ToJsonFile(config); + return 0; + } + + public static int RemoveGroupItem(ref Config config, string groupId) + { + if (Utils.IsNullOrEmpty(groupId)) + { + return -1; + } + + var items = config.vmess.Where(t => t.groupId == groupId).ToList(); + foreach (var item in items) + { + if (item.groupId.Equals(groupId)) + { + item.groupId = string.Empty; + } + } + foreach (var item in config.subItem) + { + if (item.groupId.Equals(groupId)) + { + item.groupId = string.Empty; + } + } + + ToJsonFile(config); + return 0; + } + + public static int MoveServerToGroup(Config config, List indexs, string groupId) + { + foreach (var item in indexs) + { + item.groupId = groupId; + } + + ToJsonFile(config); + + return 0; + } + #endregion + + #region UI + public static int AddformMainLvColWidth(ref Config config, string name, int width) { if (config.uiItem.mainLvColWidth == null) @@ -971,6 +1271,8 @@ namespace v2rayN.Handler { config.uiItem.mainLvColWidth.Add(name, width); } + + ToJsonFile(config); return 0; } public static int GetformMainLvColWidth(ref Config config, string name, int width) @@ -989,96 +1291,263 @@ namespace v2rayN.Handler } } - public static int SortServers(ref Config config, EServerColName name, bool asc) + #endregion + + #region Routing + + public static int SaveRouting(ref Config config) { - if (config.vmess.Count <= 0) + if (config.routings == null) { return -1; } - switch (name) - { - case EServerColName.configType: - case EServerColName.remarks: - case EServerColName.address: - case EServerColName.port: - case EServerColName.security: - case EServerColName.network: - case EServerColName.testResult: - break; - default: - return -1; - } - string itemId = config.getItemId(); - var items = config.vmess.AsQueryable(); - if (asc) + foreach (var item in config.routings) { - config.vmess = items.OrderBy(name.ToString()).ToList(); + + } + //move locked item + int index = config.routings.FindIndex(it => it.locked == true); + if (index != -1) + { + var item = Utils.DeepCopy(config.routings[index]); + config.routings.RemoveAt(index); + config.routings.Add(item); + } + if (config.routingIndex >= config.routings.Count) + { + config.routingIndex = 0; + } + if (config.trayMenuServersLimit <= 0) + { + config.trayMenuServersLimit = 30; + } + + Global.reloadV2ray = true; + + ToJsonFile(config); + return 0; + } + + public static int AddRoutingItem(ref Config config, RoutingItem item, int index) + { + if (index >= 0) + { + config.routings[index] = item; } else { - config.vmess = items.OrderByDescending(name.ToString()).ToList(); + config.routings.Add(item); + int indexLocked = config.routings.FindIndex(it => it.locked == true); + if (indexLocked != -1) + { + var itemLocked = Utils.DeepCopy(config.routings[indexLocked]); + config.routings.RemoveAt(indexLocked); + config.routings.Add(itemLocked); + } } - - var index_ = config.vmess.FindIndex(it => it.getItemId() == itemId); - if (index_ >= 0) - { - config.index = index_; - } - ToJsonFile(config); + return 0; } /// - /// 添加服务器或编辑 + /// AddBatchRoutingRules /// /// - /// - /// + /// /// - public static int AddVlessServer(ref Config config, VmessItem vmessItem, int index) + public static int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData, bool blReplace = true) { - vmessItem.configVersion = 2; - vmessItem.configType = (int)EConfigType.VLESS; - - vmessItem.address = vmessItem.address.TrimEx(); - vmessItem.id = vmessItem.id.TrimEx(); - vmessItem.security = vmessItem.security.TrimEx(); - vmessItem.network = vmessItem.network.TrimEx(); - vmessItem.headerType = vmessItem.headerType.TrimEx(); - vmessItem.requestHost = vmessItem.requestHost.TrimEx(); - vmessItem.path = vmessItem.path.TrimEx(); - vmessItem.streamSecurity = vmessItem.streamSecurity.TrimEx(); - - if (index >= 0) + if (Utils.IsNullOrEmpty(clipboardData)) { - //修改 - config.vmess[index] = vmessItem; - if (config.index.Equals(index)) - { - Global.reloadV2ray = true; - } + return -1; } - else + + var lstRules = Utils.FromJson>(clipboardData); + if (lstRules == null) { - //添加 - if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) - { - vmessItem.allowInsecure = config.defAllowInsecure.ToString(); - } - config.vmess.Add(vmessItem); - if (config.vmess.Count == 1) - { - config.index = 0; - Global.reloadV2ray = true; - } + return -1; } + if (routingItem.rules == null) + { + routingItem.rules = new List(); + } + if (blReplace) + { + routingItem.rules.Clear(); + } + foreach (var item in lstRules) + { + routingItem.rules.Add(item); + } + return 0; + } + + /// + /// MoveRoutingRule + /// + /// + /// + /// + /// + public static int MoveRoutingRule(ref RoutingItem routingItem, int index, EMove eMove, int pos = -1) + { + int count = routingItem.rules.Count; + if (index < 0 || index > routingItem.rules.Count - 1) + { + return -1; + } + switch (eMove) + { + case EMove.Top: + { + if (index == 0) + { + return 0; + } + var item = Utils.DeepCopy(routingItem.rules[index]); + routingItem.rules.RemoveAt(index); + routingItem.rules.Insert(0, item); + + break; + } + case EMove.Up: + { + if (index == 0) + { + return 0; + } + var item = Utils.DeepCopy(routingItem.rules[index]); + routingItem.rules.RemoveAt(index); + routingItem.rules.Insert(index - 1, item); + + break; + } + + case EMove.Down: + { + if (index == count - 1) + { + return 0; + } + var item = Utils.DeepCopy(routingItem.rules[index]); + routingItem.rules.RemoveAt(index); + routingItem.rules.Insert(index + 1, item); + + break; + } + case EMove.Bottom: + { + if (index == count - 1) + { + return 0; + } + var item = Utils.DeepCopy(routingItem.rules[index]); + routingItem.rules.RemoveAt(index); + routingItem.rules.Add(item); + + break; + } + case EMove.Position: + { + var removeItem = routingItem.rules[index]; + var item = Utils.DeepCopy(routingItem.rules[index]); + routingItem.rules.Insert(pos, item); + routingItem.rules.Remove(removeItem); + break; + } + + } + return 0; + } + + public static int SetDefaultRouting(ref Config config, int index) + { + if (index < 0 || index > config.routings.Count - 1) + { + return -1; + } + + ////和现在相同 + //if (config.index.Equals(index)) + //{ + // return -1; + //} + config.routingIndex = index; + Global.reloadV2ray = true; ToJsonFile(config); return 0; } + public static int InitBuiltinRouting(ref Config config, bool blImportAdvancedRules = false) + { + if (config.routings == null) + { + config.routings = new List(); + } + + if (blImportAdvancedRules || config.routings.Count(it => it.locked != true) <= 0) + { + //Bypass the mainland + var item2 = new RoutingItem() + { + remarks = "绕过大陆(Whitelist)", + url = string.Empty, + }; + AddBatchRoutingRules(ref item2, Utils.GetEmbedText(Global.CustomRoutingFileName + "white")); + config.routings.Add(item2); + + //Blacklist + var item3 = new RoutingItem() + { + remarks = "黑名单(Blacklist)", + url = string.Empty, + }; + AddBatchRoutingRules(ref item3, Utils.GetEmbedText(Global.CustomRoutingFileName + "black")); + config.routings.Add(item3); + + //Global + var item1 = new RoutingItem() + { + remarks = "全局(Global)", + url = string.Empty, + }; + AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global")); + config.routings.Add(item1); + + if (!blImportAdvancedRules) + { + config.routingIndex = 0; + } + } + + if (GetLockedRoutingItem(ref config) == null) + { + var item1 = new RoutingItem() + { + remarks = "locked", + url = string.Empty, + locked = true, + }; + AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "locked")); + config.routings.Add(item1); + } + + SaveRouting(ref config); + return 0; + } + + public static RoutingItem GetLockedRoutingItem(ref Config config) + { + if (config.routings == null) + { + return null; + } + return config.routings.Find(it => it.locked == true); + } + #endregion } } diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 1a186641..f52e373f 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -1,16 +1,15 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; +using System; using System.Diagnostics; using System.IO; using System.Net; using System.Net.Http; +using System.Net.Http.Headers; +using System.Net.Sockets; using System.Text; -using System.Text.RegularExpressions; +using System.Threading; using System.Threading.Tasks; using v2rayN.Base; -using v2rayN.Mode; -using v2rayN.Properties; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -19,19 +18,10 @@ namespace v2rayN.Handler /// class DownloadHandle { - public event EventHandler AbsoluteCompleted; - public event EventHandler UpdateCompleted; public event ErrorEventHandler Error; - public string DownloadFileName - { - get - { - return "v2ray-windows.zip"; - } - } public class ResultEventArgs : EventArgs { @@ -40,232 +30,112 @@ namespace v2rayN.Handler public ResultEventArgs(bool success, string msg) { - this.Success = success; - this.Msg = msg; + Success = success; + Msg = msg; } } - private int progressPercentage = -1; - private long totalBytesToReceive = 0; - private DateTime totalDatetime = new DateTime(); - private int DownloadTimeout = -1; - - #region Check for updates - - private readonly string nLatestUrl = "https://github.com/cg3s/v2rayN/releases/latest"; - private const string nUrl = "https://github.com/cg3s/v2rayN/releases/download/{0}/v2rayN.zip"; - private readonly string coreLatestUrl = "https://github.com/v2fly/v2ray-core/releases/latest"; - private const string coreUrl = "https://github.com/v2fly/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip"; - - public async void CheckUpdateAsync(string type) + public async Task DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout) { - Utils.SetSecurityProtocol(); + try + { + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); + UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Speedtesting)); + + var client = new HttpClient(new WebRequestHandler() + { + Proxy = webProxy + }); + + var progress = new Progress(); + progress.ProgressChanged += (sender, value) => + { + if (UpdateCompleted != null) + { + string msg = $"{value} M/s".PadLeft(9, ' '); + UpdateCompleted(this, new ResultEventArgs(false, msg)); + } + }; + + var cancellationToken = new CancellationTokenSource(); + cancellationToken.CancelAfter(downloadTimeout * 1000); + await HttpClientHelper.GetInstance().DownloadDataAsync4Speed(client, + url, + progress, + cancellationToken.Token); + } + catch (Exception ex) + { + //Utils.SaveLog(ex.Message, ex); + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } + } + return 0; + } + + public void DownloadFileAsync(string url, bool blProxy, int downloadTimeout) + { + try + { + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); + UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading)); + + var client = new HttpClient(new WebRequestHandler() + { + Proxy = GetWebProxy(blProxy) + }); + + var progress = new Progress(); + progress.ProgressChanged += (sender, value) => + { + if (UpdateCompleted != null) + { + string msg = $"...{value}%"; + UpdateCompleted(this, new ResultEventArgs(value > 100 ? true : false, msg)); + } + }; + + var cancellationToken = new CancellationTokenSource(); + _ = HttpClientHelper.GetInstance().DownloadFileAsync(client, + url, + Utils.GetPath(Utils.GetDownloadFileName(url)), + progress, + cancellationToken.Token); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } + } + } + + public async Task UrlRedirectAsync(string url, bool blProxy) + { + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); WebRequestHandler webRequestHandler = new WebRequestHandler { - AllowAutoRedirect = false + AllowAutoRedirect = false, + Proxy = GetWebProxy(blProxy) }; - HttpClient httpClient = new HttpClient(webRequestHandler); + HttpClient client = new HttpClient(webRequestHandler); - string url; - if (type == "Core") - { - url = coreLatestUrl; - } - else if (type == "v2rayN") - { - url = nLatestUrl; - } - else - { - throw new ArgumentException("Type"); - } - HttpResponseMessage response = await httpClient.GetAsync(url); + HttpResponseMessage response = await client.GetAsync(url); if (response.StatusCode.ToString() == "Redirect") { - responseHandler(type, response.Headers.Location.ToString()); + return response.Headers.Location.ToString(); } else { Utils.SaveLog("StatusCode error: " + url); - return; - } - } - - /// - /// 获取V2RayCore版本 - /// - public string getV2rayVersion() - { - try - { - string filePath = Utils.GetPath("V2ray.exe"); - if (!File.Exists(filePath)) - { - string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2fly/v2ray-core/releases"); - //ShowMsg(true, msg); - return ""; - } - - Process p = new Process(); - p.StartInfo.FileName = filePath; - p.StartInfo.Arguments = "-version"; - p.StartInfo.WorkingDirectory = Utils.StartupPath(); - p.StartInfo.UseShellExecute = false; - p.StartInfo.RedirectStandardOutput = true; - p.StartInfo.CreateNoWindow = true; - p.StartInfo.StandardOutputEncoding = Encoding.UTF8; - p.Start(); - p.WaitForExit(5000); - string echo = p.StandardOutput.ReadToEnd(); - string version = Regex.Match(echo, "V2Ray ([0-9.]+) \\(").Groups[1].Value; - return version; - } - - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - return ""; - } - } - private void responseHandler(string type, string redirectUrl) - { - try - { - string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1); - - string curVersion; - string message; - string url; - if (type == "Core") - { - curVersion = "v" + getV2rayVersion(); - message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); - string osBit = Environment.Is64BitProcess ? "64" : "32"; - url = string.Format(coreUrl, version, osBit); - } - else if (type == "v2rayN") - { - curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString(); - message = string.Format(UIRes.I18N("IsLatestN"), curVersion); - url = string.Format(nUrl, version); - } - else - { - throw new ArgumentException("Type"); - } - - if (curVersion == version) - { - AbsoluteCompleted?.Invoke(this, new ResultEventArgs(false, message)); - return; - } - - AbsoluteCompleted?.Invoke(this, new ResultEventArgs(true, url)); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - - Error?.Invoke(this, new ErrorEventArgs(ex)); - } - } - - #endregion - - #region Download - - public WebClientEx DownloadFileAsync(string url, WebProxy webProxy, int downloadTimeout) - { - WebClientEx ws = new WebClientEx(); - try - { - Utils.SetSecurityProtocol(); - UpdateCompleted?.Invoke(this, new ResultEventArgs(false, UIRes.I18N("Downloading"))); - - progressPercentage = -1; - totalBytesToReceive = 0; - - //WebClientEx ws = new WebClientEx(); - DownloadTimeout = downloadTimeout; - if (webProxy != null) - { - ws.Proxy = webProxy;// new WebProxy(Global.Loopback, Global.httpPort); - } - - ws.DownloadFileCompleted += ws_DownloadFileCompleted; - ws.DownloadProgressChanged += ws_DownloadProgressChanged; - ws.DownloadFileAsync(new Uri(url), Utils.GetPath(DownloadFileName)); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - - Error?.Invoke(this, new ErrorEventArgs(ex)); - } - return ws; - } - - void ws_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) - { - if (UpdateCompleted != null) - { - if (totalBytesToReceive == 0) - { - totalDatetime = DateTime.Now; - totalBytesToReceive = e.BytesReceived; - return; - } - totalBytesToReceive = e.BytesReceived; - - if (DownloadTimeout != -1) - { - if ((DateTime.Now - totalDatetime).TotalSeconds > DownloadTimeout) - { - ((WebClientEx)sender).CancelAsync(); - } - } - if (progressPercentage != e.ProgressPercentage && e.ProgressPercentage % 10 == 0) - { - progressPercentage = e.ProgressPercentage; - string msg = string.Format("...{0}%", e.ProgressPercentage); - UpdateCompleted(this, new ResultEventArgs(false, msg)); - } - } - } - void ws_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) - { - try - { - if (UpdateCompleted != null) - { - if (e.Cancelled) - { - ((WebClientEx)sender).Dispose(); - TimeSpan ts = (DateTime.Now - totalDatetime); - string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##")); - UpdateCompleted(this, new ResultEventArgs(true, speed)); - return; - } - - if (e.Error == null - || Utils.IsNullOrEmpty(e.Error.ToString())) - { - - TimeSpan ts = (DateTime.Now - totalDatetime); - string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##")); - UpdateCompleted(this, new ResultEventArgs(true, speed)); - } - else - { - throw e.Error; - } - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - - Error?.Invoke(this, new ErrorEventArgs(ex)); + return null; } } @@ -273,87 +143,144 @@ namespace v2rayN.Handler /// DownloadString /// /// - public void WebDownloadString(string url) + public async Task DownloadStringAsync(string url, bool blProxy, string userAgent) { - string source = string.Empty; try { - Utils.SetSecurityProtocol(); + Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13); + var client = new HttpClient(new WebRequestHandler() + { + Proxy = GetWebProxy(blProxy) + }); - WebClientEx ws = new WebClientEx(); - ws.DownloadStringCompleted += Ws_DownloadStringCompleted; - ws.DownloadStringAsync(new Uri(url)); + if (Utils.IsNullOrEmpty(userAgent)) + { + userAgent = $"{Utils.GetVersion(false)}"; + } + client.DefaultRequestHeaders.UserAgent.TryParseAdd(userAgent); + + Uri uri = new Uri(url); + //Authorization Header + if (!Utils.IsNullOrEmpty(uri.UserInfo)) + { + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Utils.Base64Encode(uri.UserInfo)); + } + + var cts = new CancellationTokenSource(); + cts.CancelAfter(1000 * 30); + + var result = await HttpClientHelper.GetInstance().GetAsync(client, url, cts.Token); + return result; } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); - } - } - - private void Ws_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) - { - try - { - if (e.Error == null - || Utils.IsNullOrEmpty(e.Error.ToString())) - { - string source = e.Result; - UpdateCompleted?.Invoke(this, new ResultEventArgs(true, source)); - } - else - { - throw e.Error; - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } } + return null; } - #endregion - - #region PAC - - public string GenPacFile(string result) + public int RunAvailabilityCheck(WebProxy webProxy) { try { - File.WriteAllText(Utils.GetTempPath("gfwlist.txt"), result, Encoding.UTF8); - List lines = ParsePacResult(result); - string abpContent = Utils.UnGzip(Resources.abp_js); - abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented)); - File.WriteAllText(Utils.GetPath(Global.pacFILE), abpContent, Encoding.UTF8); + if (webProxy == null) + { + var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp); + webProxy = new WebProxy(Global.Loopback, httpPort); + } + + try + { + string status = GetRealPingTime(Global.SpeedPingTestUrl, webProxy, out int responseTime); + bool noError = Utils.IsNullOrEmpty(status); + return noError ? responseTime : -1; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return -1; + } } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); - return ex.Message; + return -1; } - return string.Empty; } - private List ParsePacResult(string response) + public string GetRealPingTime(string url, WebProxy webProxy, out int responseTime) { - IEnumerable IgnoredLineBegins = new[] { '!', '[' }; - - byte[] bytes = Convert.FromBase64String(response); - string content = Encoding.UTF8.GetString(bytes); - List valid_lines = new List(); - using (StringReader sr = new StringReader(content)) + string msg = string.Empty; + responseTime = -1; + try { - foreach (string line in sr.NonWhiteSpaceLines()) + HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); + myHttpWebRequest.Timeout = 30 * 1000; + myHttpWebRequest.Proxy = webProxy; + + Stopwatch timer = new Stopwatch(); + timer.Start(); + + HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); + if (myHttpWebResponse.StatusCode != HttpStatusCode.OK + && myHttpWebResponse.StatusCode != HttpStatusCode.NoContent) { - if (line.BeginWithAny(IgnoredLineBegins)) - continue; - valid_lines.Add(line); + msg = myHttpWebResponse.StatusDescription; + } + timer.Stop(); + responseTime = timer.Elapsed.Milliseconds; + + myHttpWebResponse.Close(); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + msg = ex.Message; + } + return msg; + } + + private WebProxy GetWebProxy(bool blProxy) + { + if (!blProxy) + { + return null; + } + var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp); + if (!SocketCheck(Global.Loopback, httpPort)) + { + return null; + } + + return new WebProxy(Global.Loopback, httpPort); + } + + private bool SocketCheck(string ip, int port) + { + Socket sock = null; + try + { + IPAddress ipa = IPAddress.Parse(ip); + IPEndPoint point = new IPEndPoint(ipa, port); + sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + sock.Connect(point); + return true; + } + catch { } + finally + { + if (sock != null) + { + sock.Close(); + sock.Dispose(); } } - return valid_lines; + return false; } - - #endregion } } diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs new file mode 100644 index 00000000..fb8bd77b --- /dev/null +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using v2rayN.Mode; +using System.Linq; + +namespace v2rayN.Handler +{ + public sealed class LazyConfig + { + private static readonly Lazy _instance = new Lazy(() => new LazyConfig()); + private Config _config; + private List coreInfos; + + public static LazyConfig Instance => _instance.Value; + + public void SetConfig(ref Config config) + { + _config = config; + } + public Config GetConfig() + { + return _config; + } + + public List GetShadowsocksSecuritys() + { + if (GetCoreType(null, EConfigType.Shadowsocks) == ECoreType.v2fly) + { + return Global.ssSecuritys; + } + + return Global.ssSecuritysInXray; + } + + public ECoreType GetCoreType(VmessItem vmessItem, EConfigType eConfigType) + { + if (vmessItem != null && vmessItem.coreType != null) + { + return (ECoreType)vmessItem.coreType; + } + + if (_config.coreTypeItem == null) + { + return ECoreType.Xray; + } + var item = _config.coreTypeItem.FirstOrDefault(it => it.configType == eConfigType); + if (item == null) + { + return ECoreType.Xray; + } + return item.coreType; + } + + public CoreInfo GetCoreInfo(ECoreType coreType) + { + if (coreInfos == null) + { + InitCoreInfo(); + } + return coreInfos.Where(t => t.coreType == coreType).FirstOrDefault(); + } + + private void InitCoreInfo() + { + coreInfos = new List(); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.v2rayN, + coreUrl = Global.NUrl, + coreLatestUrl = Global.NUrl + "/latest", + coreDownloadUrl32 = Global.NUrl + "/download/{0}/v2rayN.zip", + coreDownloadUrl64 = Global.NUrl + "/download/{0}/v2rayN.zip", + }); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.v2fly, + coreExes = new List { "wv2ray", "v2ray" }, + arguments = "", + coreUrl = Global.v2flyCoreUrl, + coreLatestUrl = Global.v2flyCoreUrl + "/latest", + coreDownloadUrl32 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip", + coreDownloadUrl64 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip", + match = "V2Ray" + }); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.Xray, + coreExes = new List { "xray" }, + arguments = "", + coreUrl = Global.xrayCoreUrl, + coreLatestUrl = Global.xrayCoreUrl + "/latest", + coreDownloadUrl32 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip", + coreDownloadUrl64 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip", + match = "Xray" + }); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.clash, + coreExes = new List { "clash-windows-amd64-v3", "clash-windows-amd64", "clash-windows-386", "clash" }, + arguments = "-f config.json", + coreUrl = Global.clashCoreUrl, + coreLatestUrl = Global.clashCoreUrl + "/latest", + coreDownloadUrl32 = Global.clashCoreUrl + "/download/{0}/clash-windows-386-{0}.zip", + coreDownloadUrl64 = Global.clashCoreUrl + "/download/{0}/clash-windows-amd64-{0}.zip", + match = "v" + }); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.clash_meta, + coreExes = new List { "Clash.Meta-windows-amd64v1", "Clash.Meta-windows-amd64", "Clash.Meta-windows-amd64-compatible", "Clash.Meta-windows-386", "Clash.Meta", "clash" }, + arguments = "-f config.json", + coreUrl = Global.clashMetaCoreUrl, + coreLatestUrl = Global.clashMetaCoreUrl + "/latest", + coreDownloadUrl32 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-386-{0}.zip", + coreDownloadUrl64 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-amd64-compatible-{0}.zip", + }); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.hysteria, + coreExes = new List { "hysteria-tun-windows-6.0-amd64", "hysteria-tun-windows-6.0-386", "hysteria" }, + arguments = "", + coreUrl = Global.hysteriaCoreUrl, + coreLatestUrl = Global.hysteriaCoreUrl + "/latest", + coreDownloadUrl32 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-tun-windows-6.0-386.exe", + coreDownloadUrl64 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-tun-windows-6.0-amd64.exe", + }); + + coreInfos.Add(new CoreInfo + { + coreType = ECoreType.naiveproxy, + coreExes = new List { "naiveproxy", "naive" }, + arguments = "config.json", + coreUrl = Global.naiveproxyCoreUrl + }); + } + + } +} diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 419ba374..975de934 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -1,13 +1,22 @@ -using System; +using NHotkey; +using NHotkey.WindowsForms; +using System; +using System.Collections.Generic; using System.Drawing; +using System.IO; +using System.Threading; +using System.Threading.Tasks; using System.Windows.Forms; using v2rayN.Mode; +using System.Linq; +using v2rayN.Resx; namespace v2rayN.Handler { - class MainFormHandler + public sealed class MainFormHandler { - private static MainFormHandler instance; + private static readonly Lazy instance = new Lazy(() => new MainFormHandler()); + //Action _updateUI; //private DownloadHandle downloadHandle2; //private Config _config; @@ -15,28 +24,65 @@ namespace v2rayN.Handler //private List _selecteds; //private Thread _workThread; //Action _updateFunc; - public static MainFormHandler Instance - { - get - { - if (instance == null) - { - instance = new MainFormHandler(); - } - return instance; - } - } + public static MainFormHandler Instance => instance.Value; public Icon GetNotifyIcon(Config config, Icon def) { try { + int index = (int)config.sysProxyType; + + //Load from routing setting + var createdIcon = GetNotifyIcon4Routing(config); + if (createdIcon != null) + { + return createdIcon; + } + + //Load from local file + var fileName = Utils.GetPath($"NotifyIcon{index + 1}.ico"); + if (File.Exists(fileName)) + { + return new Icon(fileName); + } + switch (index) + { + case 0: + return Properties.Resources.NotifyIcon1; + case 1: + return Properties.Resources.NotifyIcon2; + case 2: + return Properties.Resources.NotifyIcon3; + } + + return Properties.Resources.NotifyIcon1; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return def; + } + } + private Icon GetNotifyIcon4Routing(Config config) + { + try + { + if (!config.enableRoutingAdvanced) + { + return null; + } + + var item = config.routings[config.routingIndex]; + if (Utils.IsNullOrEmpty(item.customIcon) || !File.Exists(item.customIcon)) + { + return null; + } + Color color = ColorTranslator.FromHtml("#3399CC"); - int index = (int)config.listenerType; + int index = (int)config.sysProxyType; if (index > 0) { - color = (new Color[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1]; - //color = ColorTranslator.FromHtml(new string[] { "#CC0066", "#CC6600", "#99CC99", "#666699" }[index - 1]); + color = (new[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1]; } int width = 128; @@ -46,9 +92,10 @@ namespace v2rayN.Handler Graphics graphics = Graphics.FromImage(bitmap); SolidBrush drawBrush = new SolidBrush(color); - graphics.FillEllipse(drawBrush, new Rectangle(0, 0, width, height)); - int zoom = 16; - graphics.DrawImage(new Bitmap(Properties.Resources.notify, width - zoom, width - zoom), zoom / 2, zoom / 2); + graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + //graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height)); + graphics.DrawImage(new Bitmap(item.customIcon), 0, 0, width, height); + graphics.FillEllipse(drawBrush, width / 2, width / 2, width / 2, width / 2); Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); @@ -61,21 +108,19 @@ namespace v2rayN.Handler catch (Exception ex) { Utils.SaveLog(ex.Message, ex); - return def; + return null; } } - public void Export2ClientConfig(int index, Config config) + public void Export2ClientConfig(VmessItem item, Config config) { - //int index = GetLvSelectedIndex(); - if (index < 0) + if (item == null) { return; } - if (config.vmess[index].configType != (int)EConfigType.Vmess - && config.vmess[index].configType != (int)EConfigType.VLESS) + if (item.configType == EConfigType.Custom) { - UI.Show(UIRes.I18N("NonVmessService")); + UI.Show(ResUI.NonVmessService); return; } @@ -94,29 +139,28 @@ namespace v2rayN.Handler { return; } - Config configCopy = Utils.DeepCopy(config); - configCopy.index = index; - if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out string msg) != 0) + //Config configCopy = Utils.DeepCopy(config); + //configCopy.index = index; + if (V2rayConfigHandler.Export2ClientConfig(item, fileName, out string msg) != 0) { UI.Show(msg); } else { - UI.ShowWarning(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); + UI.ShowWarning(string.Format(ResUI.SaveClientConfigurationIn, fileName)); } } - public void Export2ServerConfig(int index, Config config) + public void Export2ServerConfig(VmessItem item, Config config) { - //int index = GetLvSelectedIndex(); - if (index < 0) + if (item == null) { return; } - if (config.vmess[index].configType != (int)EConfigType.Vmess - && config.vmess[index].configType != (int)EConfigType.VLESS) + if (item.configType != EConfigType.VMess + && item.configType != EConfigType.VLESS) { - UI.Show(UIRes.I18N("NonVmessService")); + UI.Show(ResUI.NonVmessService); return; } @@ -135,18 +179,159 @@ namespace v2rayN.Handler { return; } - Config configCopy = Utils.DeepCopy(config); - configCopy.index = index; - if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out string msg) != 0) + //Config configCopy = Utils.DeepCopy(config); + //configCopy.index = index; + if (V2rayConfigHandler.Export2ServerConfig(item, fileName, out string msg) != 0) { UI.Show(msg); } else { - UI.ShowWarning(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); + UI.ShowWarning(string.Format(ResUI.SaveServerConfigurationIn, fileName)); } } + public void BackupGuiNConfig(Config config, bool auto = false) + { + string fileName = $"guiNConfig_{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fff")}.json"; + if (auto) + { + fileName = Utils.GetBackupPath(fileName); + } + else + { + SaveFileDialog fileDialog = new SaveFileDialog + { + FileName = fileName, + Filter = "guiNConfig|*.json", + FilterIndex = 2, + RestoreDirectory = true + }; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + fileName = fileDialog.FileName; + } + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + var ret = Utils.ToJsonFile(config, fileName); + if (!auto) + { + if (ret == 0) + { + + UI.Show(ResUI.OperationSuccess); + } + else + { + UI.ShowWarning(ResUI.OperationFailed); + } + } + } + + public void UpdateTask(Config config, Action update) + { + Task.Run(() => UpdateTaskRun(config, update)); + } + + private void UpdateTaskRun(Config config, Action update) + { + var autoUpdateSubTime = DateTime.Now; + var autoUpdateGeoTime = DateTime.Now; + + Thread.Sleep(60000); + Utils.SaveLog("UpdateTaskRun"); + + var updateHandle = new UpdateHandle(); + while (true) + { + var dtNow = DateTime.Now; + + if (config.autoUpdateSubInterval > 0) + { + if ((dtNow - autoUpdateSubTime).Hours % config.autoUpdateSubInterval == 0) + { + updateHandle.UpdateSubscriptionProcess(config, true, (bool success, string msg) => + { + update(success, msg); + if (success) + Utils.SaveLog("subscription" + msg); + }); + autoUpdateSubTime = dtNow; + } + Thread.Sleep(60000); + } + + if (config.autoUpdateInterval > 0) + { + if ((dtNow - autoUpdateGeoTime).Hours % config.autoUpdateInterval == 0) + { + updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) => + { + update(false, msg); + if (success) + Utils.SaveLog("geosite" + msg); + }); + + updateHandle.UpdateGeoFile("geoip", config, (bool success, string msg) => + { + update(false, msg); + if (success) + Utils.SaveLog("geoip" + msg); + }); + autoUpdateGeoTime = dtNow; + } + } + + Thread.Sleep(1000 * 3600); + } + } + + public void RegisterGlobalHotkey(Config config, EventHandler handler, Action update) + { + if (config.globalHotkeys == null) + { + return; + } + + foreach (var item in config.globalHotkeys) + { + if (item.KeyCode == null) + { + continue; + } + + Keys keys = (Keys)item.KeyCode; + if (item.Control) + { + keys |= Keys.Control; + } + if (item.Alt) + { + keys |= Keys.Alt; + } + if (item.Shift) + { + keys |= Keys.Shift; + } + + try + { + HotkeyManager.Current.AddOrReplace(((int)item.eGlobalHotkey).ToString(), keys, handler); + var msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{item.eGlobalHotkey.ToString()} = {keys}"); + update(false, msg); + } + catch (Exception ex) + { + var msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{item.eGlobalHotkey.ToString()} = {keys}", ex.Message); + update(false, msg); + Utils.SaveLog(msg); + } + } + } } -} +} \ No newline at end of file diff --git a/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs b/v2rayN/v2rayN/Handler/ProxySetting.cs similarity index 99% rename from v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs rename to v2rayN/v2rayN/Handler/ProxySetting.cs index 2ee71072..4e900eee 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs +++ b/v2rayN/v2rayN/Handler/ProxySetting.cs @@ -2,7 +2,7 @@ using System; using System.Runtime.InteropServices; -namespace v2rayN.HttpProxyHandler +namespace v2rayN.Handler { class ProxySetting { diff --git a/v2rayN/v2rayN/Handler/QRCodeHelper.cs b/v2rayN/v2rayN/Handler/QRCodeHelper.cs index 2fc56954..4214f485 100644 --- a/v2rayN/v2rayN/Handler/QRCodeHelper.cs +++ b/v2rayN/v2rayN/Handler/QRCodeHelper.cs @@ -1,4 +1,5 @@ -using System.Drawing; +using System; +using System.Drawing; using ZXing; using ZXing.QrCode; @@ -34,8 +35,9 @@ namespace v2rayN.Handler img = (Image)bmp; return img; } - catch + catch(Exception ex) { + Utils.SaveLog(ex.Message, ex); return img; } } diff --git a/v2rayN/v2rayN/Handler/ShareHandler.cs b/v2rayN/v2rayN/Handler/ShareHandler.cs new file mode 100644 index 00000000..55a40eac --- /dev/null +++ b/v2rayN/v2rayN/Handler/ShareHandler.cs @@ -0,0 +1,812 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Web; +using v2rayN.Base; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.Handler +{ + class ShareHandler + { + + #region GetShareUrl + + /// + /// GetShareUrl + /// + /// + /// + public static string GetShareUrl(VmessItem item) + { + try + { + string url = string.Empty; + + switch (item.configType) + { + case EConfigType.VMess: + url = ShareVmess(item); + break; + case EConfigType.Shadowsocks: + url = ShareShadowsocks(item); + break; + case EConfigType.Socks: + url = ShareSocks(item); + break; + case EConfigType.Trojan: + url = ShareTrojan(item); + break; + case EConfigType.VLESS: + url = ShareVLESS(item); + break; + default: + break; + } + return url; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return ""; + } + } + + private static string ShareVmess(VmessItem item) + { + string url = string.Empty; + + VmessQRCode vmessQRCode = new VmessQRCode + { + v = item.configVersion.ToString(), + ps = item.remarks.TrimEx(), //备注也许很长 ; + add = item.address, + port = item.port.ToString(), + id = item.id, + aid = item.alterId.ToString(), + scy = item.security, + net = item.network, + type = item.headerType, + host = item.requestHost, + path = item.path, + tls = item.streamSecurity, + sni = item.sni, + alpn = Utils.List2String(item.alpn) + }; + + url = Utils.ToJson(vmessQRCode); + url = Utils.Base64Encode(url); + url = $"{Global.vmessProtocol}{url}"; + + return url; + } + + private static string ShareShadowsocks(VmessItem item) + { + string url = string.Empty; + + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + //url = string.Format("{0}:{1}@{2}:{3}", + // item.security, + // item.id, + // item.address, + // item.port); + //url = Utils.Base64Encode(url); + //new Sip002 + var pw = Utils.Base64Encode($"{item.security}:{item.id}"); + url = $"{pw}@{GetIpv6(item.address)}:{ item.port}"; + url = $"{Global.ssProtocol}{url}{remark}"; + return url; + } + + private static string ShareSocks(VmessItem item) + { + string url = string.Empty; + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + //url = string.Format("{0}:{1}@{2}:{3}", + // item.security, + // item.id, + // item.address, + // item.port); + //url = Utils.Base64Encode(url); + //new + var pw = Utils.Base64Encode($"{item.security}:{item.id}"); + url = $"{pw}@{GetIpv6(item.address)}:{ item.port}"; + url = $"{Global.socksProtocol}{url}{remark}"; + return url; + } + + private static string ShareTrojan(VmessItem item) + { + string url = string.Empty; + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + var dicQuery = new Dictionary(); + GetStdTransport(item, null, ref dicQuery); + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + item.id, + GetIpv6(item.address), + item.port); + url = $"{Global.trojanProtocol}{url}{query}{remark}"; + return url; + } + + private static string ShareVLESS(VmessItem item) + { + string url = string.Empty; + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(item.remarks)) + { + remark = "#" + Utils.UrlEncode(item.remarks); + } + var dicQuery = new Dictionary(); + if (!Utils.IsNullOrEmpty(item.security)) + { + dicQuery.Add("encryption", item.security); + } + else + { + dicQuery.Add("encryption", "none"); + } + GetStdTransport(item, "none", ref dicQuery); + string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); + + url = string.Format("{0}@{1}:{2}", + item.id, + GetIpv6(item.address), + item.port); + url = $"{Global.vlessProtocol}{url}{query}{remark}"; + return url; + } + private static string GetIpv6(string address) + { + return Utils.IsIpv6(address) ? $"[{address}]" : address; + } + + private static int GetStdTransport(VmessItem item, string securityDef, ref Dictionary dicQuery) + { + if (!Utils.IsNullOrEmpty(item.flow)) + { + dicQuery.Add("flow", item.flow); + } + + if (!Utils.IsNullOrEmpty(item.streamSecurity)) + { + dicQuery.Add("security", item.streamSecurity); + } + else + { + if (securityDef != null) + { + dicQuery.Add("security", securityDef); + } + } + if (!Utils.IsNullOrEmpty(item.sni)) + { + dicQuery.Add("sni", item.sni); + } + if (item.alpn != null && item.alpn.Count > 0) + { + dicQuery.Add("alpn", Utils.UrlEncode(Utils.List2String(item.alpn))); + } + + dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : "tcp"); + + switch (item.network) + { + case "tcp": + dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + break; + case "kcp": + dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("seed", Utils.UrlEncode(item.path)); + } + break; + + case "ws": + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.path)); + } + break; + + case "http": + case "h2": + dicQuery["type"] = "http"; + if (!Utils.IsNullOrEmpty(item.requestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); + } + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.path)); + } + break; + + case "quic": + dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); + dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); + dicQuery.Add("key", Utils.UrlEncode(item.path)); + break; + case "grpc": + if (!Utils.IsNullOrEmpty(item.path)) + { + dicQuery.Add("serviceName", Utils.UrlEncode(item.path)); + if (item.headerType == Global.GrpcgunMode || item.headerType == Global.GrpcmultiMode) + { + dicQuery.Add("mode", Utils.UrlEncode(item.headerType)); + } + } + break; + } + return 0; + } + + #endregion + + #region ImportShareUrl + + + /// + /// 从剪贴板导入URL + /// + /// + /// + /// + public static VmessItem ImportFromClipboardConfig(string clipboardData, out string msg) + { + msg = string.Empty; + VmessItem vmessItem = new VmessItem(); + + try + { + //载入配置文件 + string result = clipboardData.TrimEx();// Utils.GetClipboardData(); + if (Utils.IsNullOrEmpty(result)) + { + msg = ResUI.FailedReadConfiguration; + return null; + } + + if (result.StartsWith(Global.vmessProtocol)) + { + int indexSplit = result.IndexOf("?"); + if (indexSplit > 0) + { + vmessItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result); + } + else + { + vmessItem = ResolveVmess(result, out msg); + } + + ConfigHandler.UpgradeServerVersion(ref vmessItem); + } + else if (result.StartsWith(Global.ssProtocol)) + { + msg = ResUI.ConfigurationFormatIncorrect; + + vmessItem = ResolveSSLegacy(result) ?? ResolveSip002(result); + if (vmessItem == null) + { + return null; + } + if (vmessItem.address.Length == 0 || vmessItem.port == 0 || vmessItem.security.Length == 0 || vmessItem.id.Length == 0) + { + return null; + } + + vmessItem.configType = EConfigType.Shadowsocks; + } + else if (result.StartsWith(Global.socksProtocol)) + { + msg = ResUI.ConfigurationFormatIncorrect; + + vmessItem = ResolveSocksNew(result) ?? ResolveSocks(result); + if (vmessItem == null) + { + return null; + } + if (vmessItem.address.Length == 0 || vmessItem.port == 0) + { + return null; + } + + vmessItem.configType = EConfigType.Socks; + } + else if (result.StartsWith(Global.trojanProtocol)) + { + msg = ResUI.ConfigurationFormatIncorrect; + + vmessItem = ResolveTrojan(result); + } + else if (result.StartsWith(Global.vlessProtocol)) + { + vmessItem = ResolveStdVLESS(result); + + ConfigHandler.UpgradeServerVersion(ref vmessItem); + } + else + { + msg = ResUI.NonvmessOrssProtocol; + return null; + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + msg = ResUI.Incorrectconfiguration; + return null; + } + + return vmessItem; + } + + private static VmessItem ResolveVmess(string result, out string msg) + { + msg = string.Empty; + var vmessItem = new VmessItem + { + configType = EConfigType.VMess + }; + + result = result.Substring(Global.vmessProtocol.Length); + result = Utils.Base64Decode(result); + + //转成Json + VmessQRCode vmessQRCode = Utils.FromJson(result); + if (vmessQRCode == null) + { + msg = ResUI.FailedConversionConfiguration; + return null; + } + + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + + vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); + vmessItem.remarks = Utils.ToString(vmessQRCode.ps); + vmessItem.address = Utils.ToString(vmessQRCode.add); + vmessItem.port = Utils.ToInt(vmessQRCode.port); + vmessItem.id = Utils.ToString(vmessQRCode.id); + vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); + vmessItem.security = Utils.ToString(vmessQRCode.scy); + + vmessItem.security = !Utils.IsNullOrEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity; + if (!Utils.IsNullOrEmpty(vmessQRCode.net)) + { + vmessItem.network = vmessQRCode.net; + } + if (!Utils.IsNullOrEmpty(vmessQRCode.type)) + { + vmessItem.headerType = vmessQRCode.type; + } + + vmessItem.requestHost = Utils.ToString(vmessQRCode.host); + vmessItem.path = Utils.ToString(vmessQRCode.path); + vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); + vmessItem.sni = Utils.ToString(vmessQRCode.sni); + vmessItem.alpn = Utils.String2List(vmessQRCode.alpn); + + return vmessItem; + } + + private static VmessItem ResolveVmess4Kitsunebi(string result) + { + VmessItem vmessItem = new VmessItem + { + configType = EConfigType.VMess + }; + result = result.Substring(Global.vmessProtocol.Length); + int indexSplit = result.IndexOf("?"); + if (indexSplit > 0) + { + result = result.Substring(0, indexSplit); + } + result = Utils.Base64Decode(result); + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + string[] arr21 = arr1[0].Split(':'); + string[] arr22 = arr1[1].Split(':'); + if (arr21.Length != 2 || arr21.Length != 2) + { + return null; + } + + vmessItem.address = arr22[0]; + vmessItem.port = Utils.ToInt(arr22[1]); + vmessItem.security = arr21[0]; + vmessItem.id = arr21[1]; + + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + vmessItem.remarks = "Alien"; + + return vmessItem; + } + + private static VmessItem ResolveStdVmess(string result) + { + VmessItem i = new VmessItem + { + configType = EConfigType.VMess, + security = "auto" + }; + + Uri u = new Uri(result); + + i.address = u.IdnHost; + i.port = u.Port; + i.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + var q = HttpUtility.ParseQueryString(u.Query); + + var m = StdVmessUserInfo.Match(u.UserInfo); + if (!m.Success) return null; + + i.id = m.Groups["id"].Value; + + if (m.Groups["streamSecurity"].Success) + { + i.streamSecurity = m.Groups["streamSecurity"].Value; + } + switch (i.streamSecurity) + { + case "tls": + // TODO tls config + break; + default: + if (!string.IsNullOrWhiteSpace(i.streamSecurity)) + return null; + break; + } + + i.network = m.Groups["network"].Value; + switch (i.network) + { + case "tcp": + string t1 = q["type"] ?? "none"; + i.headerType = t1; + // TODO http option + + break; + case "kcp": + i.headerType = q["type"] ?? "none"; + // TODO kcp seed + break; + + case "ws": + string p1 = q["path"] ?? "/"; + string h1 = q["host"] ?? ""; + i.requestHost = Utils.UrlDecode(h1); + i.path = p1; + break; + + case "http": + case "h2": + i.network = "h2"; + string p2 = q["path"] ?? "/"; + string h2 = q["host"] ?? ""; + i.requestHost = Utils.UrlDecode(h2); + i.path = p2; + break; + + case "quic": + string s = q["security"] ?? "none"; + string k = q["key"] ?? ""; + string t3 = q["type"] ?? "none"; + i.headerType = t3; + i.requestHost = Utils.UrlDecode(s); + i.path = k; + break; + + default: + return null; + } + + return i; + } + + private static VmessItem ResolveSip002(string result) + { + Uri parsedUrl; + try + { + parsedUrl = new Uri(result); + } + catch (UriFormatException) + { + return null; + } + VmessItem server = new VmessItem + { + remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), + address = parsedUrl.IdnHost, + port = parsedUrl.Port, + }; + string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.UriEscaped); + //2022-blake3 + if (rawUserInfo.Contains(":")) + { + string[] userInfoParts = rawUserInfo.Split(new[] { ':' }, 2); + if (userInfoParts.Length != 2) + { + return null; + } + server.security = userInfoParts[0]; + server.id = Utils.UrlDecode(userInfoParts[1]); + } + else + { + // parse base64 UserInfo + string userInfo = Utils.Base64Decode(rawUserInfo); + string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); + if (userInfoParts.Length != 2) + { + return null; + } + server.security = userInfoParts[0]; + server.id = userInfoParts[1]; + } + + NameValueCollection queryParameters = HttpUtility.ParseQueryString(parsedUrl.Query); + if (queryParameters["plugin"] != null) + { + //obfs-host exists + var obfsHost = queryParameters["plugin"].Split(';').FirstOrDefault(t => t.Contains("obfs-host")); + if (queryParameters["plugin"].Contains("obfs=http") && !Utils.IsNullOrEmpty(obfsHost)) + { + obfsHost = obfsHost.Replace("obfs-host=", ""); + server.network = Global.DefaultNetwork; + server.headerType = Global.TcpHeaderHttp; + server.requestHost = obfsHost; + } + else + { + return null; + } + } + + return server; + } + + private static readonly Regex UrlFinder = new Regex(@"ss://(?[A-Za-z0-9+-/=_]+)(?:#(?\S+))?", RegexOptions.IgnoreCase); + private static readonly Regex DetailsParser = new Regex(@"^((?.+?):(?.*)@(?.+?):(?\d+?))$", RegexOptions.IgnoreCase); + + private static VmessItem ResolveSSLegacy(string result) + { + var match = UrlFinder.Match(result); + if (!match.Success) + return null; + + VmessItem server = new VmessItem(); + var base64 = match.Groups["base64"].Value.TrimEnd('/'); + var tag = match.Groups["tag"].Value; + if (!Utils.IsNullOrEmpty(tag)) + { + server.remarks = Utils.UrlDecode(tag); + } + Match details; + try + { + details = DetailsParser.Match(Utils.Base64Decode(base64)); + } + catch (FormatException) + { + return null; + } + if (!details.Success) + return null; + server.security = details.Groups["method"].Value; + server.id = details.Groups["password"].Value; + server.address = details.Groups["hostname"].Value; + server.port = int.Parse(details.Groups["port"].Value); + return server; + } + + + private static readonly Regex StdVmessUserInfo = new Regex( + @"^(?[a-z]+)(\+(?[a-z]+))?:(?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$"); + + private static VmessItem ResolveSocks(string result) + { + VmessItem vmessItem = new VmessItem + { + configType = EConfigType.Socks + }; + result = result.Substring(Global.socksProtocol.Length); + //remark + int indexRemark = result.IndexOf("#"); + if (indexRemark > 0) + { + try + { + vmessItem.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); + } + catch { } + result = result.Substring(0, indexRemark); + } + //part decode + int indexS = result.IndexOf("@"); + if (indexS > 0) + { + } + else + { + result = Utils.Base64Decode(result); + } + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + string[] arr21 = arr1[0].Split(':'); + //string[] arr22 = arr1[1].Split(':'); + int indexPort = arr1[1].LastIndexOf(":"); + if (arr21.Length != 2 || indexPort < 0) + { + return null; + } + vmessItem.address = arr1[1].Substring(0, indexPort); + vmessItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1))); + vmessItem.security = arr21[0]; + vmessItem.id = arr21[1]; + + return vmessItem; + } + + private static VmessItem ResolveSocksNew(string result) + { + Uri parsedUrl; + try + { + parsedUrl = new Uri(result); + } + catch (UriFormatException) + { + return null; + } + VmessItem server = new VmessItem + { + remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), + address = parsedUrl.IdnHost, + port = parsedUrl.Port, + }; + + // parse base64 UserInfo + string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.Unescaped); + string userInfo = Utils.Base64Decode(rawUserInfo); + string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); + if (userInfoParts.Length == 2) + { + server.security = userInfoParts[0]; + server.id = userInfoParts[1]; + } + + return server; + } + + private static VmessItem ResolveTrojan(string result) + { + VmessItem item = new VmessItem + { + configType = EConfigType.Trojan + }; + + Uri url = new Uri(result); + + item.address = url.IdnHost; + item.port = url.Port; + item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.id = url.UserInfo; + + var query = HttpUtility.ParseQueryString(url.Query); + ResolveStdTransport(query, ref item); + + return item; + } + private static VmessItem ResolveStdVLESS(string result) + { + VmessItem item = new VmessItem + { + configType = EConfigType.VLESS, + security = "none" + }; + + Uri url = new Uri(result); + + item.address = url.IdnHost; + item.port = url.Port; + item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.id = url.UserInfo; + + var query = HttpUtility.ParseQueryString(url.Query); + item.security = query["encryption"] ?? "none"; + item.streamSecurity = query["security"] ?? ""; + ResolveStdTransport(query, ref item); + + return item; + } + + private static int ResolveStdTransport(NameValueCollection query, ref VmessItem item) + { + item.flow = query["flow"] ?? ""; + item.streamSecurity = query["security"] ?? ""; + item.sni = query["sni"] ?? ""; + item.alpn = Utils.String2List(Utils.UrlDecode(query["alpn"] ?? "")); + item.network = query["type"] ?? "tcp"; + switch (item.network) + { + case "tcp": + item.headerType = query["headerType"] ?? "none"; + item.requestHost = Utils.UrlDecode(query["host"] ?? ""); + + break; + case "kcp": + item.headerType = query["headerType"] ?? "none"; + item.path = Utils.UrlDecode(query["seed"] ?? ""); + break; + + case "ws": + item.requestHost = Utils.UrlDecode(query["host"] ?? ""); + item.path = Utils.UrlDecode(query["path"] ?? "/"); + break; + + case "http": + case "h2": + item.network = "h2"; + item.requestHost = Utils.UrlDecode(query["host"] ?? ""); + item.path = Utils.UrlDecode(query["path"] ?? "/"); + break; + + case "quic": + item.headerType = query["headerType"] ?? "none"; + item.requestHost = query["quicSecurity"] ?? "none"; + item.path = Utils.UrlDecode(query["key"] ?? ""); + break; + case "grpc": + item.path = Utils.UrlDecode(query["serviceName"] ?? ""); + item.headerType = Utils.UrlDecode(query["mode"] ?? Global.GrpcgunMode); + break; + default: + break; + } + return 0; + } + + #endregion + } +} diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index 91523091..e5d6022d 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Net; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -13,48 +15,60 @@ namespace v2rayN.Handler { private Config _config; private V2rayHandler _v2rayHandler; - private List _selecteds; - Action _updateFunc; + private List _selecteds; + Action _updateFunc; + public SpeedtestHandler(Config config) + { + _config = config; + } - public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List selecteds, string actionType, Action update) + public SpeedtestHandler(Config config, V2rayHandler v2rayHandler, List selecteds, ESpeedActionType actionType, Action update) { _config = config; _v2rayHandler = v2rayHandler; - _selecteds = Utils.DeepCopy(selecteds); + //_selecteds = Utils.DeepCopy(selecteds); _updateFunc = update; - if (actionType == "ping") + _selecteds = new List(); + foreach (var it in selecteds) { - Task.Run(() => RunPing()); + _selecteds.Add(new ServerTestItem() + { + indexId = it.indexId, + address = it.address, + port = it.port, + configType = it.configType + }); } - if (actionType == "tcping") + + if (actionType == ESpeedActionType.Ping) { - Task.Run(() => RunTcping()); + Task.Run(RunPing); } - else if (actionType == "realping") + else if (actionType == ESpeedActionType.Tcping) { - Task.Run(() => RunRealPing()); + Task.Run(RunTcping); } - else if (actionType == "speedtest") + else if (actionType == ESpeedActionType.Realping) { - Task.Run(() => RunSpeedTest()); + Task.Run(RunRealPing); + } + else if (actionType == ESpeedActionType.Speedtest) + { + Task.Run(RunSpeedTestAsync); } } - private void RunPingSub(Action updateFun) + private void RunPingSub(Action updateFun) { try { - foreach (int index in _selecteds) + foreach (var it in _selecteds.Where(it => it.configType != EConfigType.Custom)) { - if (_config.vmess[index].configType == (int)EConfigType.Custom) - { - continue; - } try { - updateFun(index); + Task.Run(() => updateFun(it)); } catch (Exception ex) { @@ -73,19 +87,21 @@ namespace v2rayN.Handler private void RunPing() { - RunPingSub((int index) => + RunPingSub((ServerTestItem it) => { - long time = Utils.Ping(_config.vmess[index].address); - _updateFunc(index, FormatOut(time, "ms")); + long time = Utils.Ping(it.address); + + _updateFunc(it.indexId, FormatOut(time, "ms")); }); } private void RunTcping() { - RunPingSub((int index) => + RunPingSub((ServerTestItem it) => { - int time = GetTcpingTime(_config.vmess[index].address, _config.vmess[index].port); - _updateFunc(index, FormatOut(time, "ms")); + int time = GetTcpingTime(it.address, it.port); + + _updateFunc(it.indexId, FormatOut(time, "ms")); }); } @@ -97,13 +113,22 @@ namespace v2rayN.Handler string msg = string.Empty; pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); - - //Thread.Sleep(5000); - int httpPort = _config.GetLocalPort("speedtest"); - List tasks = new List(); - foreach (int itemIndex in _selecteds) + if (pid < 0) { - if (_config.vmess[itemIndex].configType == (int)EConfigType.Custom) + _updateFunc(_selecteds[0].indexId, ResUI.OperationFailed); + return; + } + + DownloadHandle downloadHandle = new DownloadHandle(); + //Thread.Sleep(5000); + List tasks = new List(); + foreach (var it in _selecteds) + { + if (!it.allowTest) + { + continue; + } + if (it.configType == EConfigType.Custom) { continue; } @@ -111,11 +136,13 @@ namespace v2rayN.Handler { try { - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + itemIndex); + WebProxy webProxy = new WebProxy(Global.Loopback, it.port); int responseTime = -1; - string status = GetRealPingTime(_config.speedPingTestUrl, webProxy, out responseTime); - string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : FormatOut(status, ""); - _updateFunc(itemIndex, output); + string status = downloadHandle.GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, out responseTime); + string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status; + + _config.GetVmessItem(it.indexId)?.SetTestResult(output); + _updateFunc(it.indexId, output); } catch (Exception ex) { @@ -136,84 +163,48 @@ namespace v2rayN.Handler } } - public int RunAvailabilityCheck() // alias: isLive + private async Task RunSpeedTestAsync() { - try - { - int httpPort = _config.GetLocalPort(Global.InboundHttp); - - Task t = Task.Run(() => - { - try - { - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); - int responseTime = -1; - string status = GetRealPingTime(Global.AvailabilityTestUrl, webProxy, out responseTime); - bool noError = Utils.IsNullOrEmpty(status); - return noError ? responseTime : -1; - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - return -1; - } - }); - return t.Result; - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - return -1; - } - } - - private void RunSpeedTest() - { - int testCounter = 0; + string testIndexId = string.Empty; int pid = -1; - if (_config.vmess.Count <= 0) + pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); + if (pid < 0) { + _updateFunc(_selecteds[0].indexId, ResUI.OperationFailed); return; } - pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); - - string url = _config.speedTestUrl; + string url = _config.constItem.speedTestUrl; DownloadHandle downloadHandle2 = new DownloadHandle(); downloadHandle2.UpdateCompleted += (sender2, args) => { - _updateFunc(testCounter, args.Msg); + _config.GetVmessItem(testIndexId)?.SetTestResult(args.Msg); + _updateFunc(testIndexId, args.Msg); }; downloadHandle2.Error += (sender2, args) => { - _updateFunc(testCounter, args.GetException().Message); + _updateFunc(testIndexId, args.GetException().Message); }; - var timeout = 10; - foreach (int itemIndex in _selecteds) + var timeout = 8; + foreach (var it in _selecteds) { - if (itemIndex >= _config.vmess.Count) - { - break; - } - - if (_config.vmess[itemIndex].configType == (int)EConfigType.Custom) + if (!it.allowTest) { continue; } - testCounter = itemIndex; - int httpPort = _config.GetLocalPort("speedtest"); + if (it.configType == EConfigType.Custom) + { + continue; + } + testIndexId = it.indexId; + if (_config.FindIndexId(it.indexId) < 0) continue; - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + itemIndex); - var ws = downloadHandle2.DownloadFileAsync(url, webProxy, timeout - 2); - - Thread.Sleep(1000 * timeout); - - ws.CancelAsync(); - - Thread.Sleep(1000 * 2); + WebProxy webProxy = new WebProxy(Global.Loopback, it.port); + await downloadHandle2.DownloadDataAsync(url, webProxy, timeout); } + if (pid > 0) _v2rayHandler.V2rayStopPid(pid); } @@ -252,44 +243,13 @@ namespace v2rayN.Handler return responseTime; } - private string GetRealPingTime(string url, WebProxy webProxy, out int responseTime) - { - string msg = string.Empty; - responseTime = -1; - try - { - HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); - myHttpWebRequest.Timeout = 5000; - myHttpWebRequest.Proxy = webProxy;//new WebProxy(Global.Loopback, Global.httpPort); - - Stopwatch timer = new Stopwatch(); - timer.Start(); - - HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); - if (myHttpWebResponse.StatusCode != HttpStatusCode.OK - && myHttpWebResponse.StatusCode != HttpStatusCode.NoContent) - { - msg = myHttpWebResponse.StatusDescription; - } - timer.Stop(); - responseTime = timer.Elapsed.Milliseconds; - - myHttpWebResponse.Close(); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - msg = ex.Message; - } - return msg; - } private string FormatOut(object time, string unit) { if (time.ToString().Equals("-1")) { return "Timeout"; } - return string.Format("{0}{1}", time, unit).PadLeft(6, ' '); + return $"{time}{unit}".PadLeft(8, ' '); } } } diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index ab4d4a6a..32242e3f 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -30,13 +30,8 @@ namespace v2rayN.Handler get; set; } - public List Statistic - { - get - { - return serverStatistics_.server; - } - } + + public List Statistic => serverStatistics_.server; public StatisticsHandler(Mode.Config config, Action> update) { @@ -67,7 +62,7 @@ namespace v2rayN.Handler GrpcInit(); - Task.Run(() => Run()); + Task.Run(Run); } private void GrpcInit() @@ -110,12 +105,12 @@ namespace v2rayN.Handler } catch (Exception ex) { - Utils.SaveLog(ex.Message, ex); + //Utils.SaveLog(ex.Message, ex); } if (res != null) { - string itemId = config_.getItemId(); + string itemId = config_.indexId; ServerStatItem serverStatItem = GetServerStatItem(itemId); //TODO: parse output @@ -132,12 +127,12 @@ namespace v2rayN.Handler } } } - Thread.Sleep(config_.statisticsFreshRate); + Thread.Sleep(1000 * config_.statisticsFreshRate); channel_.ConnectAsync(); } catch (Exception ex) { - Utils.SaveLog(ex.Message, ex); + //Utils.SaveLog(ex.Message, ex); } } } @@ -191,6 +186,25 @@ namespace v2rayN.Handler } } + public void ClearAllServerStatistics() + { + if (serverStatistics_ != null) + { + foreach (var item in serverStatistics_.server) + { + item.todayUp = 0; + item.todayDown = 0; + item.totalUp = 0; + item.totalDown = 0; + // update ui display to zero + updateFunc_(0, 0, new List { item }); + } + + // update statistic json file + SaveToFile(); + } + } + private ServerStatItem GetServerStatItem(string itemId) { long ticks = DateTime.Now.Date.Ticks; @@ -251,7 +265,7 @@ namespace v2rayN.Handler } catch (Exception ex) { - Utils.SaveLog(ex.Message, ex); + //Utils.SaveLog(ex.Message, ex); } } diff --git a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs b/v2rayN/v2rayN/Handler/SysProxyHandle.cs similarity index 70% rename from v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs rename to v2rayN/v2rayN/Handler/SysProxyHandle.cs index 7c5410ca..815580ae 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/Handler/SysProxyHandle.cs @@ -8,7 +8,7 @@ using v2rayN.Mode; using v2rayN.Properties; using v2rayN.Tool; -namespace v2rayN.HttpProxyHandler +namespace v2rayN.Handler { public static class SysProxyHandle { @@ -47,38 +47,76 @@ namespace v2rayN.HttpProxyHandler } } - public static void SetIEProxy(bool enable, bool global, string strProxy) + + public static bool UpdateSysProxy(Config config, bool forceDisable) { - //Read(); + var type = config.sysProxyType; - //if (!_userSettings.UserSettingsRecorded) - //{ - // // record user settings - // ExecSysproxy("query"); - // //ParseQueryStr(_queryStr); - //} - - string arguments; - if (enable) + if (forceDisable && type == ESysProxyType.ForcedChange) { - arguments = global - ? $"global {strProxy} {Global.IEProxyExceptions}" - : $"pac {strProxy}"; - } - else - { - // restore user settings - string flags = _userSettings.Flags; - string proxy_server = _userSettings.ProxyServer ?? "-"; - string bypass_list = _userSettings.BypassList ?? "-"; - string pac_url = _userSettings.PacUrl ?? "-"; - arguments = $"set {flags} {proxy_server} {bypass_list} {pac_url}"; - - // have to get new settings - _userSettings.UserSettingsRecorded = false; + type = ESysProxyType.ForcedClear; } - //Save(); + try + { + int port = config.GetLocalPort(Global.InboundHttp); + int portSocks = config.GetLocalPort(Global.InboundSocks); + if (port <= 0) + { + return false; + } + if (type == ESysProxyType.ForcedChange) + { + var strExceptions = $"{config.constItem.defIEProxyExceptions};{config.systemProxyExceptions}"; + + var strProxy = string.Empty; + if (Utils.IsNullOrEmpty(config.systemProxyAdvancedProtocol)) + { + strProxy = $"{Global.Loopback}:{port}"; + } + else + { + strProxy = config.systemProxyAdvancedProtocol + .Replace("{ip}", Global.Loopback) + .Replace("{http_port}", port.ToString()) + .Replace("{socks_port}", portSocks.ToString()); + } + SetIEProxy(true, strProxy, strExceptions); + } + else if (type == ESysProxyType.ForcedClear) + { + ResetIEProxy(); + } + else if (type == ESysProxyType.Unchanged) + { + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + return true; + } + + public static void ResetIEProxy4WindowsShutDown() + { + try + { + //TODO To be verified + Utils.RegWriteValue(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0); + } + catch + { + } + } + + + public static void SetIEProxy(bool global, string strProxy, string strExceptions) + { + string arguments = global + ? $"global {strProxy} {strExceptions}" + : $"pac {strProxy}"; + ExecSysproxy(arguments); } diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs new file mode 100644 index 00000000..88ade46d --- /dev/null +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -0,0 +1,465 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using v2rayN.Base; +using v2rayN.Mode; +using v2rayN.Resx; + +namespace v2rayN.Handler +{ + class UpdateHandle + { + Action _updateFunc; + private Config _config; + + public event EventHandler AbsoluteCompleted; + + public class ResultEventArgs : EventArgs + { + public bool Success; + public string Msg; + + public ResultEventArgs(bool success, string msg) + { + Success = success; + Msg = msg; + } + } + + public void CheckUpdateGuiN(Config config, Action update) + { + _config = config; + _updateFunc = update; + var url = string.Empty; + + DownloadHandle downloadHandle = null; + if (downloadHandle == null) + { + downloadHandle = new DownloadHandle(); + + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, ResUI.MsgDownloadV2rayCoreSuccessfully); + + try + { + string fileName = Utils.GetPath(Utils.GetDownloadFileName(url)); + fileName = Utils.UrlEncode(fileName); + Process process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "v2rayUpgrade.exe", + Arguments = "\"" + fileName + "\"", + WorkingDirectory = Utils.StartupPath() + } + }; + process.Start(); + if (process.Id > 0) + { + _updateFunc(true, ""); + } + } + catch (Exception ex) + { + _updateFunc(false, ex.Message); + } + } + else + { + _updateFunc(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + _updateFunc(false, args.GetException().Message); + }; + } + AbsoluteCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, string.Format(ResUI.MsgParsingSuccessfully, "v2rayN")); + + url = args.Msg; + askToDownload(downloadHandle, url, true); + } + else + { + _updateFunc(false, args.Msg); + } + }; + _updateFunc(false, string.Format(ResUI.MsgStartUpdating, "v2rayN")); + CheckUpdateAsync(ECoreType.v2rayN); + } + + + public void CheckUpdateCore(ECoreType type, Config config, Action update) + { + _config = config; + _updateFunc = update; + var url = string.Empty; + + DownloadHandle downloadHandle = null; + if (downloadHandle == null) + { + downloadHandle = new DownloadHandle(); + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, ResUI.MsgDownloadV2rayCoreSuccessfully); + _updateFunc(false, ResUI.MsgUnpacking); + + try + { + _updateFunc(true, url); + } + catch (Exception ex) + { + _updateFunc(false, ex.Message); + } + } + else + { + _updateFunc(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + _updateFunc(true, args.GetException().Message); + }; + } + + AbsoluteCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, string.Format(ResUI.MsgParsingSuccessfully, "Core")); + url = args.Msg; + askToDownload(downloadHandle, url, true); + } + else + { + _updateFunc(false, args.Msg); + } + }; + _updateFunc(false, string.Format(ResUI.MsgStartUpdating, "Core")); + CheckUpdateAsync(type); + } + + + public void UpdateSubscriptionProcess(Config config, bool blProxy, Action update) + { + _config = config; + _updateFunc = update; + + _updateFunc(false, ResUI.MsgUpdateSubscriptionStart); + + if (config.subItem == null || config.subItem.Count <= 0) + { + _updateFunc(false, ResUI.MsgNoValidSubscription); + return; + } + + Task.Run(async () => + { + //Turn off system proxy + bool bSysProxyType = false; + if (!blProxy && config.sysProxyType == ESysProxyType.ForcedChange) + { + bSysProxyType = true; + config.sysProxyType = ESysProxyType.ForcedClear; + SysProxyHandle.UpdateSysProxy(config, false); + Thread.Sleep(3000); + } + + foreach (var item in config.subItem) + { + if (item.enabled == false) + { + continue; + } + string id = item.id.TrimEx(); + string url = item.url.TrimEx(); + string userAgent = item.userAgent.TrimEx(); + string groupId = item.groupId.TrimEx(); + string hashCode = $"{item.remarks}->"; + if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url)) + { + //_updateFunc(false, $"{hashCode}{ResUI.MsgNoValidSubscription}"); + continue; + } + + var downloadHandle = new DownloadHandle(); + downloadHandle.Error += (sender2, args) => + { + _updateFunc(false, $"{hashCode}{args.GetException().Message}"); + }; + + _updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); + var result = await downloadHandle.DownloadStringAsync(url, blProxy, userAgent); + if (blProxy && Utils.IsNullOrEmpty(result)) + { + result = await downloadHandle.DownloadStringAsync(url, false, userAgent); + } + + if (Utils.IsNullOrEmpty(result)) + { + _updateFunc(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); + } + else + { + _updateFunc(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); + if (result.Length < 99) + { + _updateFunc(false, $"{hashCode}{result}"); + } + + int ret = ConfigHandler.AddBatchServers(ref config, result, id, groupId); + _updateFunc(false, + ret > 0 + ? $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}" + : $"{hashCode}{ResUI.MsgFailedImportSubscription}"); + } + _updateFunc(false, "-------------------------------------------------------"); + } + //restore system proxy + if (bSysProxyType) + { + config.sysProxyType = ESysProxyType.ForcedChange; + SysProxyHandle.UpdateSysProxy(config, false); + } + _updateFunc(true, $"{ResUI.MsgUpdateSubscriptionEnd}"); + + }); + } + + + public void UpdateGeoFile(string geoName, Config config, Action update) + { + _config = config; + _updateFunc = update; + var url = string.Format(Global.geoUrl, geoName); + + DownloadHandle downloadHandle = null; + if (downloadHandle == null) + { + downloadHandle = new DownloadHandle(); + + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(false, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, geoName)); + + try + { + string fileName = Utils.GetPath(Utils.GetDownloadFileName(url)); + if (File.Exists(fileName)) + { + string targetPath = Utils.GetPath($"{geoName}.dat"); + if (File.Exists(targetPath)) + { + File.Delete(targetPath); + } + File.Move(fileName, targetPath); + //_updateFunc(true, ""); + } + } + catch (Exception ex) + { + _updateFunc(false, ex.Message); + } + } + else + { + _updateFunc(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + _updateFunc(false, args.GetException().Message); + }; + } + askToDownload(downloadHandle, url, false); + + } + + public void RunAvailabilityCheck(Action update) + { + Task.Run(() => + { + var time = (new DownloadHandle()).RunAvailabilityCheck(null); + + update(false, string.Format(ResUI.TestMeOutput, time)); + }); + } + + #region private + + private async void CheckUpdateAsync(ECoreType type) + { + try + { + var coreInfo = LazyConfig.Instance.GetCoreInfo(type); + string url = coreInfo.coreLatestUrl; + + var result = await (new DownloadHandle()).UrlRedirectAsync(url, true); + if (!Utils.IsNullOrEmpty(result)) + { + responseHandler(type, result); + } + else + { + Utils.SaveLog("StatusCode error: " + url); + return; + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + _updateFunc(false, ex.Message); + } + } + + /// + /// 获取V2RayCore版本 + /// + private string getCoreVersion(ECoreType type) + { + try + { + + var coreInfo = LazyConfig.Instance.GetCoreInfo(type); + string filePath = string.Empty; + foreach (string name in coreInfo.coreExes) + { + string vName = $"{name}.exe"; + vName = Utils.GetPath(vName); + if (File.Exists(vName)) + { + filePath = vName; + break; + } + } + + if (!File.Exists(filePath)) + { + string msg = string.Format(ResUI.NotFoundCore, @""); + //ShowMsg(true, msg); + return ""; + } + + Process p = new Process(); + p.StartInfo.FileName = filePath; + p.StartInfo.Arguments = "-version"; + p.StartInfo.WorkingDirectory = Utils.StartupPath(); + p.StartInfo.UseShellExecute = false; + p.StartInfo.RedirectStandardOutput = true; + p.StartInfo.CreateNoWindow = true; + p.StartInfo.StandardOutputEncoding = Encoding.UTF8; + p.Start(); + p.WaitForExit(5000); + string echo = p.StandardOutput.ReadToEnd(); + string version = Regex.Match(echo, $"{coreInfo.match} ([0-9.]+) \\(").Groups[1].Value; + return version; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + _updateFunc(false, ex.Message); + return ""; + } + } + private void responseHandler(ECoreType type, string redirectUrl) + { + try + { + string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1); + var coreInfo = LazyConfig.Instance.GetCoreInfo(type); + + string curVersion; + string message; + string url; + switch (type) + { + case ECoreType.v2fly: + case ECoreType.Xray: + { + curVersion = "v" + getCoreVersion(type); + message = string.Format(ResUI.IsLatestCore, curVersion); + string osBit = Environment.Is64BitProcess ? "64" : "32"; + url = string.Format(coreInfo.coreDownloadUrl64, version, osBit); + break; + } + case ECoreType.clash: + case ECoreType.clash_meta: + { + curVersion = "";//getCoreVersion(type); + message = string.Format(ResUI.IsLatestCore, curVersion); + if (Environment.Is64BitProcess) + { + url = string.Format(coreInfo.coreDownloadUrl64, version); + } + else + { + url = string.Format(coreInfo.coreDownloadUrl32, version); + } + break; + } + case ECoreType.v2rayN: + { + curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString(); + message = string.Format(ResUI.IsLatestN, curVersion); + url = string.Format(coreInfo.coreDownloadUrl64, version); + break; + } + default: + throw new ArgumentException("Type"); + } + + if (curVersion == version) + { + AbsoluteCompleted?.Invoke(this, new ResultEventArgs(false, message)); + return; + } + + AbsoluteCompleted?.Invoke(this, new ResultEventArgs(true, url)); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + _updateFunc(false, ex.Message); + } + } + + private void askToDownload(DownloadHandle downloadHandle, string url, bool blAsk) + { + bool blDownload = false; + if (blAsk) + { + if (UI.ShowYesNo(string.Format(ResUI.DownloadYesNo, url)) == DialogResult.Yes) + { + blDownload = true; + } + } + else + { + blDownload = true; + } + if (blDownload) + { + downloadHandle.DownloadFileAsync(url, true, 600); + } + } + #endregion + } +} diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index b02ea327..a5707bee 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -1,14 +1,12 @@ using System; using System.Collections.Generic; -using System.Collections.Specialized; using System.IO; using System.Linq; using System.Net; -using System.Text; -using System.Text.RegularExpressions; -using System.Web; +using System.Net.NetworkInformation; using v2rayN.Base; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -25,36 +23,31 @@ namespace v2rayN.Handler /// /// 生成v2ray的客户端配置文件 /// - /// + /// /// /// /// - public static int GenerateClientConfig(Config config, string fileName, bool blExport, out string msg) + public static int GenerateClientConfig(VmessItem node, string fileName, bool blExport, out string msg) { try { - //检查GUI设置 - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (node == null) { - msg = UIRes.I18N("CheckServerSettings"); + msg = ResUI.CheckServerSettings; return -1; } - msg = UIRes.I18N("InitialConfiguration"); - if (config.configType() == (int)EConfigType.Custom) + msg = ResUI.InitialConfiguration; + if (node.configType == EConfigType.Custom) { - return GenerateClientCustomConfig(config, fileName, out msg); + return GenerateClientCustomConfig(node, fileName, out msg); } //取得默认配置 string result = Utils.GetEmbedText(SampleClient); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedGetDefaultConfiguration"); + msg = ResUI.FailedGetDefaultConfiguration; return -1; } @@ -62,10 +55,12 @@ namespace v2rayN.Handler V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } + var config = LazyConfig.Instance.GetConfig(); + //开始修改配置 log(config, ref v2rayConfig, blExport); @@ -76,7 +71,7 @@ namespace v2rayN.Handler routing(config, ref v2rayConfig); //outbound - outbound(config, ref v2rayConfig); + outbound(node, ref v2rayConfig); //dns dns(config, ref v2rayConfig); @@ -86,11 +81,12 @@ namespace v2rayN.Handler Utils.ToJsonFile(v2rayConfig, fileName, false); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + msg = string.Format(ResUI.SuccessfulConfiguration, $"[{config.GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); } - catch + catch (Exception ex) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + Utils.SaveLog("GenerateClientConfig", ex); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } return 0; @@ -135,8 +131,9 @@ namespace v2rayN.Handler } } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -151,28 +148,65 @@ namespace v2rayN.Handler { try { - Inbounds inbound = v2rayConfig.inbounds[0]; - //端口 - inbound.port = config.inbound[0].localPort; - inbound.protocol = config.inbound[0].protocol; - if (config.allowLANConn) + v2rayConfig.inbounds = new List(); + + Inbounds inbound = GetInbound(config.inbound[0], Global.InboundSocks, 0, true); + v2rayConfig.inbounds.Add(inbound); + + //http + Inbounds inbound2 = GetInbound(config.inbound[0], Global.InboundHttp, 1, false); + v2rayConfig.inbounds.Add(inbound2); + + if (config.inbound[0].allowLANConn) { - inbound.listen = "0.0.0.0"; + Inbounds inbound3 = GetInbound(config.inbound[0], Global.InboundSocks2, 2, true); + inbound3.listen = "0.0.0.0"; + v2rayConfig.inbounds.Add(inbound3); + + Inbounds inbound4 = GetInbound(config.inbound[0], Global.InboundHttp2, 3, false); + inbound4.listen = "0.0.0.0"; + v2rayConfig.inbounds.Add(inbound4); + + //auth + if (!Utils.IsNullOrEmpty(config.inbound[0].user) && !Utils.IsNullOrEmpty(config.inbound[0].pass)) + { + inbound3.settings.auth = "password"; + inbound3.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } }; + + inbound4.settings.auth = "password"; + inbound4.settings.accounts = new List { new AccountsItem() { user = config.inbound[0].user, pass = config.inbound[0].pass } }; + } } - else - { - inbound.listen = Global.Loopback; - } - //开启udp - inbound.settings.udp = config.inbound[0].udpEnabled; - inbound.sniffing.enabled = config.inbound[0].sniffingEnabled; } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } + private static Inbounds GetInbound(InItem inItem, string tag, int offset, bool bSocks) + { + string result = Utils.GetEmbedText(Global.v2raySampleInbound); + if (Utils.IsNullOrEmpty(result)) + { + return null; + } + + var inbound = Utils.FromJson(result); + if (inbound == null) + { + return null; + } + inbound.tag = tag; + inbound.port = inItem.localPort + offset; + inbound.protocol = bSocks ? Global.InboundSocks : Global.InboundHttp; + inbound.settings.udp = inItem.udpEnabled; + inbound.sniffing.enabled = inItem.sniffingEnabled; + + return inbound; + } + /// /// 路由 /// @@ -187,134 +221,137 @@ namespace v2rayN.Handler && v2rayConfig.routing.rules != null) { v2rayConfig.routing.domainStrategy = config.domainStrategy; + v2rayConfig.routing.domainMatcher = config.domainMatcher; - //自定义 - //需代理 - routingUserRule(config.useragent, Global.agentTag, ref v2rayConfig); - //直连 - routingUserRule(config.userdirect, Global.directTag, ref v2rayConfig); - //阻止 - routingUserRule(config.userblock, Global.blockTag, ref v2rayConfig); - - - switch (config.routingMode) + if (config.enableRoutingAdvanced) { - case "0": - break; - case "1": - routingGeo("ip", "private", Global.directTag, ref v2rayConfig); - break; - case "2": - routingGeo("", "cn", Global.directTag, ref v2rayConfig); - break; - case "3": - routingGeo("ip", "private", Global.directTag, ref v2rayConfig); - routingGeo("", "cn", Global.directTag, ref v2rayConfig); - break; + if (config.routings != null && config.routingIndex < config.routings.Count) + { + foreach (var item in config.routings[config.routingIndex].rules) + { + if (item.enabled) + { + routingUserRule(item, ref v2rayConfig); + } + } + } + } + else + { + var lockedItem = ConfigHandler.GetLockedRoutingItem(ref config); + if (lockedItem != null) + { + foreach (var item in lockedItem.rules) + { + routingUserRule(item, ref v2rayConfig); + } + } } - } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } - private static int routingUserRule(List userRule, string tag, ref V2rayConfig v2rayConfig) + private static int routingUserRule(RulesItem rules, ref V2rayConfig v2rayConfig) { try { - if (userRule != null - && userRule.Count > 0) + if (rules == null) { - //Domain - RulesItem rulesDomain = new RulesItem - { - type = "field", - outboundTag = tag, - domain = new List() - }; + return 0; + } + if (Utils.IsNullOrEmpty(rules.port)) + { + rules.port = null; + } + if (rules.domain != null && rules.domain.Count == 0) + { + rules.domain = null; + } + if (rules.ip != null && rules.ip.Count == 0) + { + rules.ip = null; + } + if (rules.protocol != null && rules.protocol.Count == 0) + { + rules.protocol = null; + } - //IP - RulesItem rulesIP = new RulesItem + var hasDomainIp = false; + if (rules.domain != null && rules.domain.Count > 0) + { + var it = Utils.DeepCopy(rules); + it.ip = null; + it.type = "field"; + for (int k = it.domain.Count - 1; k >= 0; k--) { - type = "field", - outboundTag = tag, - ip = new List() - }; - - foreach (string u in userRule) - { - string url = u.TrimEx(); - if (Utils.IsNullOrEmpty(url)) + if (it.domain[k].StartsWith("#")) { - continue; - } - if (Utils.IsIP(url) || url.StartsWith("geoip:")) - { - rulesIP.ip.Add(url); - } - else if (Utils.IsDomain(url) - || url.StartsWith("geosite:") - || url.StartsWith("regexp:") - || url.StartsWith("domain:") - || url.StartsWith("full:")) - { - rulesDomain.domain.Add(url); + it.domain.RemoveAt(k); } + it.domain[k] = it.domain[k].Replace(Global.RoutingRuleComma, ","); } - if (rulesDomain.domain.Count > 0) + //if (Utils.IsNullOrEmpty(it.port)) + //{ + // it.port = null; + //} + //if (it.protocol != null && it.protocol.Count == 0) + //{ + // it.protocol = null; + //} + v2rayConfig.routing.rules.Add(it); + hasDomainIp = true; + } + if (rules.ip != null && rules.ip.Count > 0) + { + var it = Utils.DeepCopy(rules); + it.domain = null; + it.type = "field"; + //if (Utils.IsNullOrEmpty(it.port)) + //{ + // it.port = null; + //} + //if (it.protocol != null && it.protocol.Count == 0) + //{ + // it.protocol = null; + //} + v2rayConfig.routing.rules.Add(it); + hasDomainIp = true; + } + if (!hasDomainIp) + { + if (!Utils.IsNullOrEmpty(rules.port)) { - v2rayConfig.routing.rules.Add(rulesDomain); + var it = Utils.DeepCopy(rules); + //it.domain = null; + //it.ip = null; + //if (it.protocol != null && it.protocol.Count == 0) + //{ + // it.protocol = null; + //} + it.type = "field"; + v2rayConfig.routing.rules.Add(it); } - if (rulesIP.ip.Count > 0) + else if (rules.protocol != null && rules.protocol.Count > 0) { - v2rayConfig.routing.rules.Add(rulesIP); + var it = Utils.DeepCopy(rules); + //it.domain = null; + //it.ip = null; + //if (Utils.IsNullOrEmpty(it.port)) + //{ + // it.port = null; + //} + it.type = "field"; + v2rayConfig.routing.rules.Add(it); } } } - catch - { - } - return 0; - } - - - private static int routingGeo(string ipOrDomain, string code, string tag, ref V2rayConfig v2rayConfig) - { - try - { - if (!Utils.IsNullOrEmpty(code)) - { - //IP - if (ipOrDomain == "ip" || ipOrDomain == "") - { - RulesItem rulesItem = new RulesItem - { - type = "field", - outboundTag = Global.directTag, - ip = new List() - }; - rulesItem.ip.Add($"geoip:{code}"); - - v2rayConfig.routing.rules.Add(rulesItem); - } - - if (ipOrDomain == "domain" || ipOrDomain == "") - { - RulesItem rulesItem = new RulesItem - { - type = "field", - outboundTag = Global.directTag, - domain = new List() - }; - rulesItem.domain.Add($"geosite:{code}"); - v2rayConfig.routing.rules.Add(rulesItem); - } - } - } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -322,15 +359,16 @@ namespace v2rayN.Handler /// /// vmess协议服务器配置 /// - /// + /// /// /// - private static int outbound(Config config, ref V2rayConfig v2rayConfig) + private static int outbound(VmessItem node, ref V2rayConfig v2rayConfig) { try { + var config = LazyConfig.Instance.GetConfig(); Outbounds outbound = v2rayConfig.outbounds[0]; - if (config.configType() == (int)EConfigType.Vmess) + if (node.configType == EConfigType.VMess) { VnextItem vnextItem; if (outbound.settings.vnext.Count <= 0) @@ -343,8 +381,8 @@ namespace v2rayN.Handler vnextItem = outbound.settings.vnext[0]; } //远程服务器地址和端口 - vnextItem.address = config.address(); - vnextItem.port = config.port(); + vnextItem.address = node.address; + vnextItem.port = node.port; UsersItem usersItem; if (vnextItem.users.Count <= 0) @@ -357,23 +395,28 @@ namespace v2rayN.Handler usersItem = vnextItem.users[0]; } //远程服务器用户ID - usersItem.id = config.id(); - usersItem.alterId = config.alterId(); + usersItem.id = node.id; + usersItem.alterId = node.alterId; usersItem.email = Global.userEMail; - usersItem.security = config.security(); + if (Global.vmessSecuritys.Contains(node.security)) + { + usersItem.security = node.security; + } + else + { + usersItem.security = Global.DefaultSecurity; + } //Mux outbound.mux.enabled = config.muxEnabled; outbound.mux.concurrency = config.muxEnabled ? 8 : -1; - //远程服务器底层传输配置 - StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(config, "out", ref streamSettings); + boundStreamSettings(node, "out", outbound.streamSettings); outbound.protocol = Global.vmessProtocolLite; outbound.settings.servers = null; } - else if (config.configType() == (int)EConfigType.Shadowsocks) + else if (node.configType == EConfigType.Shadowsocks) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -386,10 +429,11 @@ namespace v2rayN.Handler serversItem = outbound.settings.servers[0]; } //远程服务器地址和端口 - serversItem.address = config.address(); - serversItem.port = config.port(); - serversItem.password = config.id(); - serversItem.method = config.security(); + serversItem.address = node.address; + serversItem.port = node.port; + serversItem.password = node.id; + serversItem.method = LazyConfig.Instance.GetShadowsocksSecuritys().Contains(node.security) ? node.security : "none"; + serversItem.ota = false; serversItem.level = 1; @@ -397,11 +441,12 @@ namespace v2rayN.Handler outbound.mux.enabled = false; outbound.mux.concurrency = -1; + boundStreamSettings(node, "out", outbound.streamSettings); outbound.protocol = Global.ssProtocolLite; outbound.settings.vnext = null; } - else if (config.configType() == (int)EConfigType.Socks) + else if (node.configType == EConfigType.Socks) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -414,18 +459,18 @@ namespace v2rayN.Handler serversItem = outbound.settings.servers[0]; } //远程服务器地址和端口 - serversItem.address = config.address(); - serversItem.port = config.port(); + serversItem.address = node.address; + serversItem.port = node.port; serversItem.method = null; serversItem.password = null; - if (!Utils.IsNullOrEmpty(config.security()) - && !Utils.IsNullOrEmpty(config.id())) + if (!Utils.IsNullOrEmpty(node.security) + && !Utils.IsNullOrEmpty(node.id)) { SocksUsersItem socksUsersItem = new SocksUsersItem { - user = config.security(), - pass = config.id(), + user = node.security, + pass = node.id, level = 1 }; @@ -438,7 +483,7 @@ namespace v2rayN.Handler outbound.protocol = Global.socksProtocolLite; outbound.settings.vnext = null; } - else if (config.configType() == (int)EConfigType.VLESS) + else if (node.configType == EConfigType.VLESS) { VnextItem vnextItem; if (outbound.settings.vnext.Count <= 0) @@ -451,8 +496,8 @@ namespace v2rayN.Handler vnextItem = outbound.settings.vnext[0]; } //远程服务器地址和端口 - vnextItem.address = config.address(); - vnextItem.port = config.port(); + vnextItem.address = node.address; + vnextItem.port = node.port; UsersItem usersItem; if (vnextItem.users.Count <= 0) @@ -465,32 +510,29 @@ namespace v2rayN.Handler usersItem = vnextItem.users[0]; } //远程服务器用户ID - usersItem.id = config.id(); - usersItem.alterId = 0; + usersItem.id = node.id; usersItem.flow = string.Empty; usersItem.email = Global.userEMail; - usersItem.encryption = config.security(); - + usersItem.encryption = node.security; + //Mux outbound.mux.enabled = config.muxEnabled; outbound.mux.concurrency = config.muxEnabled ? 8 : -1; - //远程服务器底层传输配置 - StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(config, "out", ref streamSettings); + boundStreamSettings(node, "out", outbound.streamSettings); //if xtls - if (config.streamSecurity() == Global.StreamSecurityX) + if (node.streamSecurity == Global.StreamSecurityX) { - if (Utils.IsNullOrEmpty(config.flow())) + if (Utils.IsNullOrEmpty(node.flow)) { - usersItem.flow = "xtls-rprx-origin"; + usersItem.flow = Global.xtlsFlows[1]; } else { - usersItem.flow = config.flow(); + usersItem.flow = node.flow.Replace("splice", "direct"); } - + outbound.mux.enabled = false; outbound.mux.concurrency = -1; } @@ -498,7 +540,7 @@ namespace v2rayN.Handler outbound.protocol = Global.vlessProtocolLite; outbound.settings.servers = null; } - else if (config.configType() == (int)EConfigType.Trojan) + else if (node.configType == EConfigType.Trojan) { ServersItem serversItem; if (outbound.settings.servers.Count <= 0) @@ -511,55 +553,78 @@ namespace v2rayN.Handler serversItem = outbound.settings.servers[0]; } //远程服务器地址和端口 - serversItem.address = config.address(); - serversItem.port = config.port(); - serversItem.password = config.id(); + serversItem.address = node.address; + serversItem.port = node.port; + serversItem.password = node.id; + serversItem.flow = string.Empty; serversItem.ota = false; serversItem.level = 1; + //if xtls + if (node.streamSecurity == Global.StreamSecurityX) + { + if (Utils.IsNullOrEmpty(node.flow)) + { + serversItem.flow = Global.xtlsFlows[1]; + } + else + { + serversItem.flow = node.flow.Replace("splice", "direct"); + } + + outbound.mux.enabled = false; + outbound.mux.concurrency = -1; + } + outbound.mux.enabled = false; outbound.mux.concurrency = -1; - - //远程服务器底层传输配置 - StreamSettings streamSettings = outbound.streamSettings; - boundStreamSettings(config, "out", ref streamSettings); + boundStreamSettings(node, "out", outbound.streamSettings); outbound.protocol = Global.trojanProtocolLite; outbound.settings.vnext = null; } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } /// - /// vmess协议远程服务器底层传输配置 + /// 底层传输配置 /// - /// + /// /// /// /// - private static int boundStreamSettings(Config config, string iobound, ref StreamSettings streamSettings) + private static int boundStreamSettings(VmessItem node, string iobound, StreamSettings streamSettings) { try { - //远程服务器底层传输配置 - streamSettings.network = config.network(); - string host = config.requestHost(); + var config = LazyConfig.Instance.GetConfig(); + + streamSettings.network = node.GetNetwork(); + string host = node.requestHost.TrimEx(); + string sni = node.sni; + //if tls - if (config.streamSecurity() == Global.StreamSecurity) + if (node.streamSecurity == Global.StreamSecurity) { - streamSettings.security = config.streamSecurity(); + streamSettings.security = node.streamSecurity; TlsSettings tlsSettings = new TlsSettings { - allowInsecure = config.allowInsecure() + allowInsecure = Utils.ToBool(node.allowInsecure), + alpn = node.GetAlpn() }; - if (!string.IsNullOrWhiteSpace(host)) + if (!string.IsNullOrWhiteSpace(sni)) + { + tlsSettings.serverName = sni; + } + else if (!string.IsNullOrWhiteSpace(host)) { tlsSettings.serverName = Utils.String2List(host)[0]; } @@ -567,15 +632,20 @@ namespace v2rayN.Handler } //if xtls - if (config.streamSecurity() == Global.StreamSecurityX) + if (node.streamSecurity == Global.StreamSecurityX) { - streamSettings.security = config.streamSecurity(); + streamSettings.security = node.streamSecurity; TlsSettings xtlsSettings = new TlsSettings { - allowInsecure = config.allowInsecure() + allowInsecure = Utils.ToBool(node.allowInsecure), + alpn = node.GetAlpn() }; - if (!string.IsNullOrWhiteSpace(host)) + if (!string.IsNullOrWhiteSpace(sni)) + { + xtlsSettings.serverName = sni; + } + else if (!string.IsNullOrWhiteSpace(host)) { xtlsSettings.serverName = Utils.String2List(host)[0]; } @@ -583,7 +653,7 @@ namespace v2rayN.Handler } //streamSettings - switch (config.network()) + switch (node.GetNetwork()) { //kcp基本配置暂时是默认值,用户能自己设置伪装类型 case "kcp": @@ -613,21 +683,21 @@ namespace v2rayN.Handler kcpSettings.writeBufferSize = config.kcpItem.writeBufferSize; kcpSettings.header = new Header { - type = config.headerType() + type = node.headerType }; - if (!Utils.IsNullOrEmpty(config.path())) + if (!Utils.IsNullOrEmpty(node.path)) { - kcpSettings.seed = config.path(); + kcpSettings.seed = node.path; } streamSettings.kcpSettings = kcpSettings; break; //ws case "ws": WsSettings wsSettings = new WsSettings - { + { }; - string path = config.path(); + string path = node.path; if (!string.IsNullOrWhiteSpace(host)) { wsSettings.headers = new Headers @@ -657,7 +727,7 @@ namespace v2rayN.Handler { httpSettings.host = Utils.String2List(host); } - httpSettings.path = config.path(); + httpSettings.path = node.path; streamSettings.httpSettings = httpSettings; @@ -670,27 +740,43 @@ namespace v2rayN.Handler QuicSettings quicsettings = new QuicSettings { security = host, - key = config.path(), + key = node.path, header = new Header { - type = config.headerType() + type = node.headerType } }; streamSettings.quicSettings = quicsettings; - if (config.streamSecurity() == Global.StreamSecurity) + if (node.streamSecurity == Global.StreamSecurity) { - streamSettings.tlsSettings.serverName = config.address(); + if (!string.IsNullOrWhiteSpace(sni)) + { + streamSettings.tlsSettings.serverName = sni; + } + else + { + streamSettings.tlsSettings.serverName = node.address; + } } break; + case "grpc": + var grpcSettings = new GrpcSettings + { + serviceName = node.path, + multiMode = (node.headerType == Global.GrpcmultiMode) + }; + + streamSettings.grpcSettings = grpcSettings; + break; default: //tcp带http伪装 - if (config.headerType().Equals(Global.TcpHeaderHttp)) + if (node.headerType.Equals(Global.TcpHeaderHttp)) { TcpSettings tcpSettings = new TcpSettings { header = new Header { - type = config.headerType() + type = node.headerType } }; @@ -700,17 +786,17 @@ namespace v2rayN.Handler string request = Utils.GetEmbedText(Global.v2raySampleHttprequestFileName); string[] arrHost = host.Split(','); string host2 = string.Join("\",\"", arrHost); - request = request.Replace("$requestHost$", string.Format("\"{0}\"", host2)); + request = request.Replace("$requestHost$", $"\"{host2}\""); //request = request.Replace("$requestHost$", string.Format("\"{0}\"", config.requestHost())); //填入自定义Path string pathHttp = @"/"; - if (!Utils.IsNullOrEmpty(config.path())) + if (!Utils.IsNullOrEmpty(node.path)) { - string[] arrPath = config.path().Split(','); + string[] arrPath = node.path.Split(','); pathHttp = string.Join("\",\"", arrPath); } - request = request.Replace("$requestPath$", string.Format("\"{0}\"", pathHttp)); + request = request.Replace("$requestPath$", $"\"{pathHttp}\""); tcpSettings.header.request = Utils.FromJson(request); } else if (iobound.Equals("in")) @@ -724,8 +810,9 @@ namespace v2rayN.Handler break; } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -744,29 +831,39 @@ namespace v2rayN.Handler { return 0; } - List servers = new List(); - string[] arrDNS = config.remoteDNS.Split(','); - foreach (string str in arrDNS) + var obj = Utils.ParseJson(config.remoteDNS); + if (obj != null && obj.ContainsKey("servers")) { - //if (Utils.IsIP(str)) - //{ - servers.Add(str); - //} + v2rayConfig.dns = obj; } - //servers.Add("localhost"); - v2rayConfig.dns = new Mode.Dns + else { - servers = servers - }; + List servers = new List(); + + string[] arrDNS = config.remoteDNS.Split(','); + foreach (string str in arrDNS) + { + //if (Utils.IsIP(str)) + //{ + servers.Add(str); + //} + } + //servers.Add("localhost"); + v2rayConfig.dns = new Mode.Dns + { + servers = servers + }; + } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } - public static int statistic(Config config, ref V2rayConfig v2rayConfig) + private static int statistic(Config config, ref V2rayConfig v2rayConfig) { if (config.enableStatistics) { @@ -783,12 +880,12 @@ namespace v2rayN.Handler apiObj.services = services.ToList(); v2rayConfig.api = apiObj; - policySystemSetting.statsInboundDownlink = true; - policySystemSetting.statsInboundUplink = true; + policySystemSetting.statsOutboundDownlink = true; + policySystemSetting.statsOutboundUplink = true; policyObj.system = policySystemSetting; v2rayConfig.policy = policyObj; - if (!v2rayConfig.inbounds.Exists(item => { return item.tag == tag; })) + if (!v2rayConfig.inbounds.Exists(item => item.tag == tag)) { Inbounds apiInbound = new Inbounds(); Inboundsettings apiInboundSettings = new Inboundsettings(); @@ -801,7 +898,7 @@ namespace v2rayN.Handler v2rayConfig.inbounds.Add(apiInbound); } - if (!v2rayConfig.routing.rules.Exists(item => { return item.outboundTag == tag; })) + if (!v2rayConfig.routing.rules.Exists(item => item.outboundTag == tag)) { RulesItem apiRoutingRule = new RulesItem { @@ -818,22 +915,18 @@ namespace v2rayN.Handler /// /// 生成v2ray的客户端配置文件(自定义配置) /// - /// + /// /// /// /// - public static int GenerateClientCustomConfig(Config config, string fileName, out string msg) + private static int GenerateClientCustomConfig(VmessItem node, string fileName, out string msg) { try { //检查GUI设置 - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (node == null) { - msg = UIRes.I18N("CheckServerSettings"); + msg = ResUI.CheckServerSettings; return -1; } @@ -842,23 +935,59 @@ namespace v2rayN.Handler File.Delete(fileName); } - string addressFileName = config.address(); + string addressFileName = node.address; if (!File.Exists(addressFileName)) { - addressFileName = Path.Combine(Utils.GetTempPath(), addressFileName); + addressFileName = Utils.GetConfigPath(addressFileName); } if (!File.Exists(addressFileName)) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } File.Copy(addressFileName, fileName); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + //check again + if (!File.Exists(fileName)) + { + msg = ResUI.FailedGenDefaultConfiguration; + return -1; + } + + //overwrite port + var fileContent = File.ReadAllLines(fileName).ToList(); + var coreType = LazyConfig.Instance.GetCoreType(node, node.configType); + switch (coreType) + { + case ECoreType.v2fly: + case ECoreType.Xray: + break; + case ECoreType.clash: + case ECoreType.clash_meta: + //remove the original + var indexPort = fileContent.FindIndex(t => t.Contains("port:")); + if (indexPort >= 0) + { + fileContent.RemoveAt(indexPort); + } + indexPort = fileContent.FindIndex(t => t.Contains("socks-port:")); + if (indexPort >= 0) + { + fileContent.RemoveAt(indexPort); + } + + fileContent.Add($"port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp)}"); + fileContent.Add($"socks-port: {LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundSocks)}"); + break; + } + File.WriteAllLines(fileName, fileContent); + + msg = string.Format(ResUI.SuccessfulConfiguration, $"[{LazyConfig.Instance.GetConfig().GetGroupRemarks(node.groupId)}] {node.GetSummary()}"); } - catch + catch (Exception ex) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + Utils.SaveLog("GenerateClientCustomConfig", ex); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } return 0; @@ -871,32 +1000,28 @@ namespace v2rayN.Handler /// /// 生成v2ray的客户端配置文件 /// - /// + /// /// /// /// - public static int GenerateServerConfig(Config config, string fileName, out string msg) + public static int GenerateServerConfig(VmessItem node, string fileName, out string msg) { try { //检查GUI设置 - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (node == null) { - msg = UIRes.I18N("CheckServerSettings"); + msg = ResUI.CheckServerSettings; return -1; } - msg = UIRes.I18N("InitialConfiguration"); + msg = ResUI.InitialConfiguration; //取得默认配置 string result = Utils.GetEmbedText(SampleServer); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedGetDefaultConfiguration"); + msg = ResUI.FailedGetDefaultConfiguration; return -1; } @@ -904,26 +1029,29 @@ namespace v2rayN.Handler V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } + var config = LazyConfig.Instance.GetConfig(); + ////开始修改配置 log(config, ref v2rayConfig, true); //vmess协议服务器配置 - ServerInbound(config, ref v2rayConfig); + ServerInbound(node, ref v2rayConfig); //传出设置 ServerOutbound(config, ref v2rayConfig); Utils.ToJsonFile(v2rayConfig, fileName, false); - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + msg = string.Format(ResUI.SuccessfulConfiguration, node.GetSummary()); } - catch + catch (Exception ex) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + Utils.SaveLog(ex.Message, ex); + msg = ResUI.FailedGenDefaultConfiguration; return -1; } return 0; @@ -932,10 +1060,10 @@ namespace v2rayN.Handler /// /// vmess协议服务器配置 /// - /// + /// /// /// - private static int ServerInbound(Config config, ref V2rayConfig v2rayConfig) + private static int ServerInbound(VmessItem node, ref V2rayConfig v2rayConfig) { try { @@ -951,32 +1079,30 @@ namespace v2rayN.Handler usersItem = inbound.settings.clients[0]; } //远程服务器端口 - inbound.port = config.port(); + inbound.port = node.port; //远程服务器用户ID - usersItem.id = config.id(); + usersItem.id = node.id; usersItem.email = Global.userEMail; - if (config.configType() == (int)EConfigType.Vmess) + if (node.configType == EConfigType.VMess) { inbound.protocol = Global.vmessProtocolLite; - usersItem.alterId = config.alterId(); + usersItem.alterId = node.alterId; } - else if (config.configType() == (int)EConfigType.VLESS) + else if (node.configType == EConfigType.VLESS) { inbound.protocol = Global.vlessProtocolLite; - usersItem.alterId = 0; - usersItem.flow = config.flow(); - inbound.settings.decryption = config.security(); + usersItem.flow = node.flow; + inbound.settings.decryption = node.security; } - //远程服务器底层传输配置 - StreamSettings streamSettings = inbound.streamSettings; - boundStreamSettings(config, "in", ref streamSettings); + boundStreamSettings(node, "in", inbound.streamSettings); } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -984,7 +1110,7 @@ namespace v2rayN.Handler /// /// 传出设置 /// - /// + /// /// /// private static int ServerOutbound(Config config, ref V2rayConfig v2rayConfig) @@ -996,8 +1122,9 @@ namespace v2rayN.Handler v2rayConfig.outbounds[0].settings = null; } } - catch + catch (Exception ex) { + Utils.SaveLog(ex.Message, ex); } return 0; } @@ -1022,7 +1149,7 @@ namespace v2rayN.Handler string result = Utils.LoadResource(fileName); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedReadConfiguration"); + msg = ResUI.FailedReadConfiguration; return null; } @@ -1030,14 +1157,14 @@ namespace v2rayN.Handler V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { - msg = UIRes.I18N("FailedConversionConfiguration"); + msg = ResUI.FailedConversionConfiguration; return null; } if (v2rayConfig.outbounds == null || v2rayConfig.outbounds.Count <= 0) { - msg = UIRes.I18N("IncorrectClientConfiguration"); + msg = ResUI.IncorrectClientConfiguration; return null; } @@ -1051,7 +1178,7 @@ namespace v2rayN.Handler || outbound.settings.vnext[0].users == null || outbound.settings.vnext[0].users.Count <= 0) { - msg = UIRes.I18N("IncorrectClientConfiguration"); + msg = ResUI.IncorrectClientConfiguration; return null; } @@ -1062,7 +1189,7 @@ namespace v2rayN.Handler vmessItem.port = outbound.settings.vnext[0].port; vmessItem.id = outbound.settings.vnext[0].users[0].id; vmessItem.alterId = outbound.settings.vnext[0].users[0].alterId; - vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); + vmessItem.remarks = $"import@{DateTime.Now.ToShortDateString()}"; //tcp or kcp if (outbound.streamSettings != null @@ -1142,9 +1269,10 @@ namespace v2rayN.Handler vmessItem.streamSecurity = Global.StreamSecurity; } } - catch + catch (Exception ex) { - msg = UIRes.I18N("IncorrectClientConfiguration"); + Utils.SaveLog(ex.Message, ex); + msg = ResUI.IncorrectClientConfiguration; return null; } @@ -1168,7 +1296,7 @@ namespace v2rayN.Handler string result = Utils.LoadResource(fileName); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedReadConfiguration"); + msg = ResUI.FailedReadConfiguration; return null; } @@ -1176,14 +1304,14 @@ namespace v2rayN.Handler V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { - msg = UIRes.I18N("FailedConversionConfiguration"); + msg = ResUI.FailedConversionConfiguration; return null; } if (v2rayConfig.inbounds == null || v2rayConfig.inbounds.Count <= 0) { - msg = UIRes.I18N("IncorrectServerConfiguration"); + msg = ResUI.IncorrectServerConfiguration; return null; } @@ -1195,7 +1323,7 @@ namespace v2rayN.Handler || inbound.settings.clients == null || inbound.settings.clients.Count <= 0) { - msg = UIRes.I18N("IncorrectServerConfiguration"); + msg = ResUI.IncorrectServerConfiguration; return null; } @@ -1207,7 +1335,7 @@ namespace v2rayN.Handler vmessItem.id = inbound.settings.clients[0].id; vmessItem.alterId = inbound.settings.clients[0].alterId; - vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); + vmessItem.remarks = $"import@{DateTime.Now.ToShortDateString()}"; //tcp or kcp if (inbound.streamSettings != null @@ -1287,486 +1415,140 @@ namespace v2rayN.Handler vmessItem.streamSecurity = Global.StreamSecurity; } } - catch + catch (Exception ex) { - msg = UIRes.I18N("IncorrectClientConfiguration"); + Utils.SaveLog(ex.Message, ex); + msg = ResUI.IncorrectClientConfiguration; return null; } return vmessItem; } - /// - /// 从剪贴板导入URL - /// - /// - /// - /// - public static VmessItem ImportFromClipboardConfig(string clipboardData, out string msg) - { - msg = string.Empty; - VmessItem vmessItem = new VmessItem(); - - try - { - //载入配置文件 - string result = clipboardData.TrimEx();// Utils.GetClipboardData(); - if (Utils.IsNullOrEmpty(result)) - { - msg = UIRes.I18N("FailedReadConfiguration"); - return null; - } - - if (result.StartsWith(Global.vmessProtocol)) - { - int indexSplit = result.IndexOf("?"); - if (indexSplit > 0) - { - vmessItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result); - } - else - { - vmessItem.configType = (int)EConfigType.Vmess; - result = result.Substring(Global.vmessProtocol.Length); - result = Utils.Base64Decode(result); - - //转成Json - VmessQRCode vmessQRCode = Utils.FromJson(result); - if (vmessQRCode == null) - { - msg = UIRes.I18N("FailedConversionConfiguration"); - return null; - } - vmessItem.security = Global.DefaultSecurity; - vmessItem.network = Global.DefaultNetwork; - vmessItem.headerType = Global.None; - - - vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); - vmessItem.remarks = Utils.ToString(vmessQRCode.ps); - vmessItem.address = Utils.ToString(vmessQRCode.add); - vmessItem.port = Utils.ToInt(vmessQRCode.port); - vmessItem.id = Utils.ToString(vmessQRCode.id); - vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); - - if (!Utils.IsNullOrEmpty(vmessQRCode.net)) - { - vmessItem.network = vmessQRCode.net; - } - if (!Utils.IsNullOrEmpty(vmessQRCode.type)) - { - vmessItem.headerType = vmessQRCode.type; - } - - vmessItem.requestHost = Utils.ToString(vmessQRCode.host); - vmessItem.path = Utils.ToString(vmessQRCode.path); - vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); - } - - ConfigHandler.UpgradeServerVersion(ref vmessItem); - } - else if (result.StartsWith(Global.ssProtocol)) - { - msg = UIRes.I18N("ConfigurationFormatIncorrect"); - - vmessItem = ResolveSSLegacy(result); - if (vmessItem == null) - { - vmessItem = ResolveSip002(result); - } - if (vmessItem == null) - { - return null; - } - if (vmessItem.address.Length == 0 || vmessItem.port == 0 || vmessItem.security.Length == 0 || vmessItem.id.Length == 0) - { - return null; - } - - vmessItem.configType = (int)EConfigType.Shadowsocks; - } - else if (result.StartsWith(Global.socksProtocol)) - { - msg = UIRes.I18N("ConfigurationFormatIncorrect"); - - vmessItem.configType = (int)EConfigType.Socks; - result = result.Substring(Global.socksProtocol.Length); - //remark - int indexRemark = result.IndexOf("#"); - if (indexRemark > 0) - { - try - { - vmessItem.remarks = WebUtility.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); - } - catch { } - result = result.Substring(0, indexRemark); - } - //part decode - int indexS = result.IndexOf("@"); - if (indexS > 0) - { - } - else - { - result = Utils.Base64Decode(result); - } - - string[] arr1 = result.Split('@'); - if (arr1.Length != 2) - { - return null; - } - string[] arr21 = arr1[0].Split(':'); - //string[] arr22 = arr1[1].Split(':'); - int indexPort = arr1[1].LastIndexOf(":"); - if (arr21.Length != 2 || indexPort < 0) - { - return null; - } - vmessItem.address = arr1[1].Substring(0, indexPort); - vmessItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1))); - vmessItem.security = arr21[0]; - vmessItem.id = arr21[1]; - } - else if (result.StartsWith(Global.trojanProtocol)) - { - msg = UIRes.I18N("ConfigurationFormatIncorrect"); - - vmessItem.configType = (int)EConfigType.Trojan; - - Uri uri = new Uri(result); - vmessItem.address = uri.IdnHost; - vmessItem.port = uri.Port; - vmessItem.id = uri.UserInfo; - - var qurery = HttpUtility.ParseQueryString(uri.Query); - vmessItem.requestHost = qurery["sni"] ?? ""; - - var remarks = uri.Fragment.Replace("#", ""); - if (Utils.IsNullOrEmpty(remarks)) - { - vmessItem.remarks = "NONE"; - } - else - { - vmessItem.remarks = WebUtility.UrlDecode(remarks); - } - } - else - { - msg = UIRes.I18N("NonvmessOrssProtocol"); - return null; - } - } - catch - { - msg = UIRes.I18N("Incorrectconfiguration"); - return null; - } - - return vmessItem; - } - - /// /// 导出为客户端配置 /// - /// + /// /// /// /// - public static int Export2ClientConfig(Config config, string fileName, out string msg) + public static int Export2ClientConfig(VmessItem node, string fileName, out string msg) { - return GenerateClientConfig(config, fileName, true, out msg); + return GenerateClientConfig(node, fileName, true, out msg); } /// /// 导出为服务端配置 /// - /// + /// /// /// /// - public static int Export2ServerConfig(Config config, string fileName, out string msg) + public static int Export2ServerConfig(VmessItem node, string fileName, out string msg) { - return GenerateServerConfig(config, fileName, out msg); + return GenerateServerConfig(node, fileName, out msg); } - private static VmessItem ResolveVmess4Kitsunebi(string result) - { - VmessItem vmessItem = new VmessItem - { - configType = (int)EConfigType.Vmess - }; - result = result.Substring(Global.vmessProtocol.Length); - int indexSplit = result.IndexOf("?"); - if (indexSplit > 0) - { - result = result.Substring(0, indexSplit); - } - result = Utils.Base64Decode(result); - - string[] arr1 = result.Split('@'); - if (arr1.Length != 2) - { - return null; - } - string[] arr21 = arr1[0].Split(':'); - string[] arr22 = arr1[1].Split(':'); - if (arr21.Length != 2 || arr21.Length != 2) - { - return null; - } - - vmessItem.address = arr22[0]; - vmessItem.port = Utils.ToInt(arr22[1]); - vmessItem.security = arr21[0]; - vmessItem.id = arr21[1]; - - vmessItem.network = Global.DefaultNetwork; - vmessItem.headerType = Global.None; - vmessItem.remarks = "Alien"; - vmessItem.alterId = 0; - - return vmessItem; - } - - private static VmessItem ResolveSip002(string result) - { - Uri parsedUrl; - try - { - parsedUrl = new Uri(result); - } - catch (UriFormatException) - { - return null; - } - VmessItem server = new VmessItem - { - remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), - address = parsedUrl.IdnHost, - port = parsedUrl.Port, - }; - - // parse base64 UserInfo - string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.Unescaped); - string base64 = rawUserInfo.Replace('-', '+').Replace('_', '/'); // Web-safe base64 to normal base64 - string userInfo; - try - { - userInfo = Encoding.UTF8.GetString(Convert.FromBase64String( - base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '='))); - } - catch (FormatException) - { - return null; - } - string[] userInfoParts = userInfo.Split(new char[] { ':' }, 2); - if (userInfoParts.Length != 2) - { - return null; - } - server.security = userInfoParts[0]; - server.id = userInfoParts[1]; - - NameValueCollection queryParameters = HttpUtility.ParseQueryString(parsedUrl.Query); - if (queryParameters["plugin"] != null) - { - return null; - } - - return server; - } - - private static readonly Regex UrlFinder = new Regex(@"ss://(?[A-Za-z0-9+-/=_]+)(?:#(?\S+))?", RegexOptions.IgnoreCase); - private static readonly Regex DetailsParser = new Regex(@"^((?.+?):(?.*)@(?.+?):(?\d+?))$", RegexOptions.IgnoreCase); - - private static VmessItem ResolveSSLegacy(string result) - { - var match = UrlFinder.Match(result); - if (!match.Success) - return null; - - VmessItem server = new VmessItem(); - var base64 = match.Groups["base64"].Value.TrimEnd('/'); - var tag = match.Groups["tag"].Value; - if (!tag.IsNullOrEmpty()) - { - server.remarks = HttpUtility.UrlDecode(tag, Encoding.UTF8); - } - Match details; - try - { - details = DetailsParser.Match(Encoding.UTF8.GetString(Convert.FromBase64String( - base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=')))); - } - catch (FormatException) - { - return null; - } - if (!details.Success) - return null; - server.security = details.Groups["method"].Value; - server.id = details.Groups["password"].Value; - server.address = details.Groups["hostname"].Value; - server.port = int.Parse(details.Groups["port"].Value); - return server; - } - - - private static readonly Regex StdVmessUserInfo = new Regex( - @"^(?[a-z]+)(\+(?[a-z]+))?:(?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})-(?[0-9]+)$"); - - private static VmessItem ResolveStdVmess(string result) - { - VmessItem i = new VmessItem - { - configType = (int)EConfigType.Vmess, - security = "auto" - }; - - Uri u = new Uri(result); - - i.address = u.IdnHost; - i.port = u.Port; - i.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - var q = HttpUtility.ParseQueryString(u.Query); - - var m = StdVmessUserInfo.Match(u.UserInfo); - if (!m.Success) return null; - - i.id = m.Groups["id"].Value; - if (!int.TryParse(m.Groups["alterId"].Value, out int aid)) - { - return null; - } - i.alterId = aid; - - if (m.Groups["streamSecurity"].Success) - { - i.streamSecurity = m.Groups["streamSecurity"].Value; - } - switch (i.streamSecurity) - { - case "tls": - // TODO tls config - break; - default: - if (!string.IsNullOrWhiteSpace(i.streamSecurity)) - return null; - break; - } - - i.network = m.Groups["network"].Value; - switch (i.network) - { - case "tcp": - string t1 = q["type"] ?? "none"; - i.headerType = t1; - // TODO http option - - break; - case "kcp": - i.headerType = q["type"] ?? "none"; - // TODO kcp seed - break; - - case "ws": - string p1 = q["path"] ?? "/"; - string h1 = q["host"] ?? ""; - i.requestHost = h1; - i.path = p1; - break; - - case "http": - i.network = "h2"; - string p2 = q["path"] ?? "/"; - string h2 = q["host"] ?? ""; - i.requestHost = h2; - i.path = p2; - break; - - case "quic": - string s = q["security"] ?? "none"; - string k = q["key"] ?? ""; - string t3 = q["type"] ?? "none"; - i.headerType = t3; - i.requestHost = s; - i.path = k; - break; - - default: - return null; - } - - return i; - } #endregion #region Gen speedtest config - public static string GenerateClientSpeedtestConfigString(Config config, List selecteds, out string msg) + public static string GenerateClientSpeedtestConfigString(Config config, List selecteds, out string msg) { try { - if (config == null - || config.index < 0 - || config.vmess.Count <= 0 - || config.index > config.vmess.Count - 1 - ) + if (config == null) { - msg = UIRes.I18N("CheckServerSettings"); + msg = ResUI.CheckServerSettings; return ""; } - msg = UIRes.I18N("InitialConfiguration"); + msg = ResUI.InitialConfiguration; Config configCopy = Utils.DeepCopy(config); string result = Utils.GetEmbedText(SampleClient); if (Utils.IsNullOrEmpty(result)) { - msg = UIRes.I18N("FailedGetDefaultConfiguration"); + msg = ResUI.FailedGetDefaultConfiguration; return ""; } V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + msg = ResUI.FailedGenDefaultConfiguration; return ""; } + List lstIpEndPoints = null; + try + { + lstIpEndPoints = new List(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } log(configCopy, ref v2rayConfig, false); //routing(config, ref v2rayConfig); dns(configCopy, ref v2rayConfig); - v2rayConfig.inbounds.RemoveAt(0); // Remove "proxy" service for speedtest, avoiding port conflicts. + v2rayConfig.inbounds.Clear(); // Remove "proxy" service for speedtest, avoiding port conflicts. int httpPort = configCopy.GetLocalPort("speedtest"); - foreach (int index in selecteds) + + foreach (var it in selecteds) { - if (configCopy.vmess[index].configType == (int)EConfigType.Custom) + if (it.configType == EConfigType.Custom) { continue; } + if (it.port <= 0) + { + continue; + } + if (it.configType == EConfigType.VMess || it.configType == EConfigType.VLESS) + { + if (!Utils.IsGuidByParse(configCopy.GetVmessItem(it.indexId).id)) + { + continue; + } + } - configCopy.index = index; + //find unuse port + var port = httpPort; + for (int k = httpPort; k < 65536; k++) + { + if (lstIpEndPoints != null && lstIpEndPoints.FindIndex(_it => _it.Port == k) >= 0) + { + continue; + } + //found + port = k; + httpPort = port + 1; + break; + } + + //Port In Used + if (lstIpEndPoints != null && lstIpEndPoints.FindIndex(_it => _it.Port == port) >= 0) + { + continue; + } + it.port = port; + it.allowTest = true; Inbounds inbound = new Inbounds { listen = Global.Loopback, - port = httpPort + index, + port = port, protocol = Global.InboundHttp }; inbound.tag = Global.InboundHttp + inbound.port.ToString(); v2rayConfig.inbounds.Add(inbound); - V2rayConfig v2rayConfigCopy = Utils.FromJson(result); - outbound(configCopy, ref v2rayConfigCopy); + outbound(configCopy.GetVmessItem(it.indexId), ref v2rayConfigCopy); v2rayConfigCopy.outbounds[0].tag = Global.agentTag + inbound.port.ToString(); v2rayConfig.outbounds.Add(v2rayConfigCopy.outbounds[0]); @@ -1779,12 +1561,13 @@ namespace v2rayN.Handler v2rayConfig.routing.rules.Add(rule); } - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), configCopy.getSummary()); + //msg = string.Format(ResUI.SuccessfulConfiguration"), node.getSummary()); return Utils.ToJson(v2rayConfig); } - catch + catch (Exception ex) { - msg = UIRes.I18N("FailedGenDefaultConfiguration"); + Utils.SaveLog(ex.Message, ex); + msg = ResUI.FailedGenDefaultConfiguration; return ""; } } diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index e4d13371..6e5887f6 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.IO; using System.Text; using v2rayN.Mode; +using v2rayN.Resx; namespace v2rayN.Handler { @@ -21,19 +22,13 @@ namespace v2rayN.Handler class V2rayHandler { private static string v2rayConfigRes = Global.v2rayConfigFileName; - private List lstV2ray; + private CoreInfo coreInfo; public event ProcessDelegate ProcessEvent; //private int processId = 0; private Process _process; public V2rayHandler() { - lstV2ray = new List - { - "xray", - "wv2ray", - "v2ray" - }; } /// @@ -43,8 +38,20 @@ namespace v2rayN.Handler { if (Global.reloadV2ray) { + var item = ConfigHandler.GetDefaultServer(ref config); + if (item == null) + { + ShowMsg(false, ResUI.CheckServerSettings); + return; + } + + if (SetCore(config, item) != 0) + { + ShowMsg(false, ResUI.CheckServerSettings); + return; + } string fileName = Utils.GetPath(v2rayConfigRes); - if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out string msg) != 0) + if (V2rayConfigHandler.GenerateClientConfig(item, fileName, false, out string msg) != 0) { ShowMsg(false, msg); } @@ -60,7 +67,7 @@ namespace v2rayN.Handler /// 新建进程,载入V2ray配置文件字符串 /// 返回新进程pid。 /// - public int LoadV2rayConfigString(Config config, List _selecteds) + public int LoadV2rayConfigString(Config config, List _selecteds) { int pid = -1; string configStr = V2rayConfigHandler.GenerateClientSpeedtestConfigString(config, _selecteds, out string msg); @@ -102,7 +109,11 @@ namespace v2rayN.Handler } else { - foreach (string vName in lstV2ray) + if (coreInfo == null || coreInfo.coreExes == null) + { + return; + } + foreach (string vName in coreInfo.coreExes) { Process[] existing = Process.GetProcessesByName(vName); foreach (Process p in existing) @@ -159,13 +170,12 @@ namespace v2rayN.Handler } } - private string V2rayFindexe() { - //查找v2ray文件是否存在 + private string V2rayFindexe(List lstCoreTemp) + { string fileName = string.Empty; - //lstV2ray.Reverse(); - foreach (string name in lstV2ray) + foreach (string name in lstCoreTemp) { - string vName = string.Format("{0}.exe", name); + string vName = $"{name}.exe"; vName = Utils.GetPath(vName); if (File.Exists(vName)) { @@ -175,7 +185,7 @@ namespace v2rayN.Handler } if (Utils.IsNullOrEmpty(fileName)) { - string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2fly/v2ray-core/releases"); + string msg = string.Format(ResUI.NotFoundCore, coreInfo.coreUrl); ShowMsg(false, msg); } return fileName; @@ -186,11 +196,11 @@ namespace v2rayN.Handler /// private void V2rayStart() { - ShowMsg(false, string.Format(UIRes.I18N("StartService"), DateTime.Now.ToString())); + ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString())); try { - string fileName = V2rayFindexe(); + string fileName = V2rayFindexe(coreInfo.coreExes); if (fileName == "") return; Process p = new Process @@ -198,6 +208,7 @@ namespace v2rayN.Handler StartInfo = new ProcessStartInfo { FileName = fileName, + Arguments = coreInfo.arguments, WorkingDirectory = Utils.StartupPath(), UseShellExecute = false, RedirectStandardOutput = true, @@ -206,14 +217,14 @@ namespace v2rayN.Handler StandardOutputEncoding = Encoding.UTF8 } }; - p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => + p.OutputDataReceived += (sender, e) => { if (!String.IsNullOrEmpty(e.Data)) { string msg = e.Data + Environment.NewLine; ShowMsg(false, msg); } - }); + }; p.Start(); p.PriorityClass = ProcessPriorityClass.High; p.BeginOutputReadLine(); @@ -239,11 +250,11 @@ namespace v2rayN.Handler /// private int V2rayStartNew(string configStr) { - ShowMsg(false, string.Format(UIRes.I18N("StartService"), DateTime.Now.ToString())); + ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString())); try { - string fileName = V2rayFindexe(); + string fileName = V2rayFindexe(new List { "xray", "wv2ray", "v2ray" }); if (fileName == "") return -1; Process p = new Process @@ -261,14 +272,14 @@ namespace v2rayN.Handler StandardOutputEncoding = Encoding.UTF8 } }; - p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => + p.OutputDataReceived += (sender, e) => { if (!String.IsNullOrEmpty(e.Data)) { string msg = e.Data + Environment.NewLine; ShowMsg(false, msg); } - }); + }; p.Start(); p.BeginOutputReadLine(); @@ -318,6 +329,23 @@ namespace v2rayN.Handler { Utils.SaveLog(ex.Message, ex); } - } + } + + private int SetCore(Config config, VmessItem item) + { + if (item == null) + { + return -1; + } + var coreType = LazyConfig.Instance.GetCoreType(item, item.configType); + + coreInfo = LazyConfig.Instance.GetCoreInfo(coreType); + + if (coreInfo == null) + { + return -1; + } + return 0; + } } } diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs deleted file mode 100644 index 0236c5a8..00000000 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ /dev/null @@ -1,186 +0,0 @@ -using System; -using v2rayN.Mode; - -namespace v2rayN.HttpProxyHandler -{ - /// - /// 系统代理(http)模式 - /// - public enum ListenerType - { - noHttpProxy = 0, - GlobalHttp = 1, - GlobalPac = 2, - HttpOpenAndClear = 3, - PacOpenAndClear = 4, - HttpOpenOnly = 5, - PacOpenOnly = 6 - } - /// - /// 系统代理(http)总处理 - /// 启动privoxy提供http协议 - /// 设置IE系统代理或者PAC模式 - /// - class HttpProxyHandle - { - private static bool Update(Config config, bool forceDisable) - { - ListenerType type = config.listenerType; - - if (forceDisable) - { - type = ListenerType.noHttpProxy; - } - - try - { - if (type != ListenerType.noHttpProxy) - { - int port = Global.httpPort; - if (port <= 0) - { - return false; - } - if (type == ListenerType.GlobalHttp) - { - //PACServerHandle.Stop(); - //ProxySetting.SetProxy($"{Global.Loopback}:{port}", Global.IEProxyExceptions, 2); - SysProxyHandle.SetIEProxy(true, true, $"{Global.Loopback}:{port}"); - } - else if (type == ListenerType.GlobalPac) - { - string pacUrl = GetPacUrl(); - //ProxySetting.SetProxy(pacUrl, "", 4); - SysProxyHandle.SetIEProxy(true, false, pacUrl); - //PACServerHandle.Stop(); - PACServerHandle.Init(config); - } - else if (type == ListenerType.HttpOpenAndClear) - { - //PACServerHandle.Stop(); - SysProxyHandle.ResetIEProxy(); - } - else if (type == ListenerType.PacOpenAndClear) - { - string pacUrl = GetPacUrl(); - SysProxyHandle.ResetIEProxy(); - //PACServerHandle.Stop(); - PACServerHandle.Init(config); - } - else if (type == ListenerType.HttpOpenOnly) - { - //PACServerHandle.Stop(); - //SysProxyHandle.ResetIEProxy(); - } - else if (type == ListenerType.PacOpenOnly) - { - string pacUrl = GetPacUrl(); - //SysProxyHandle.ResetIEProxy(); - //PACServerHandle.Stop(); - PACServerHandle.Init(config); - } - } - else - { - SysProxyHandle.ResetIEProxy(); - //PACServerHandle.Stop(); - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - return true; - } - - /// - /// 启用系统代理(http) - /// - /// - private static void StartHttpAgent(Config config) - { - try - { - int localPort = config.GetLocalPort(Global.InboundSocks); - if (localPort > 0) - { - PrivoxyHandler.Instance.Restart(localPort, config); - if (PrivoxyHandler.Instance.RunningPort > 0) - { - Global.sysAgent = true; - Global.socksPort = localPort; - Global.httpPort = PrivoxyHandler.Instance.RunningPort; - Global.pacPort = config.GetLocalPort("pac"); - } - } - } - catch - { - } - } - - /// - /// 关闭系统代理 - /// - /// - public static void CloseHttpAgent(Config config) - { - try - { - if (config.listenerType != ListenerType.HttpOpenOnly && config.listenerType != ListenerType.PacOpenOnly) - { - Update(config, true); - } - - PrivoxyHandler.Instance.Stop(); - - Global.sysAgent = false; - Global.socksPort = 0; - Global.httpPort = 0; - } - catch - { - } - } - - /// - /// 重启系统代理(http) - /// - /// - /// - public static void RestartHttpAgent(Config config, bool forced) - { - bool isRestart = false; - if (config.listenerType == ListenerType.noHttpProxy) - { - // 关闭http proxy时,直接返回 - return; - } - //强制重启或者socks端口变化 - if (forced) - { - isRestart = true; - } - else - { - int localPort = config.GetLocalPort(Global.InboundSocks); - if (localPort != Global.socksPort) - { - isRestart = true; - } - } - if (isRestart) - { - CloseHttpAgent(config); - StartHttpAgent(config); - } - Update(config, false); - } - - public static string GetPacUrl() - { - string pacUrl = $"http://{Global.Loopback}:{Global.pacPort}/pac/?t={ DateTime.Now.ToString("HHmmss")}"; - return pacUrl; - } - } -} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs deleted file mode 100644 index 23bf8087..00000000 --- a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs +++ /dev/null @@ -1,209 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using v2rayN.Mode; -using v2rayN.Properties; -using v2rayN.Tool; -using v2rayN.Base; - -namespace v2rayN.HttpProxyHandler -{ - /// - /// 提供PAC功能支持 - /// - class PACServerHandle - { - private static int pacPort = 0; - private static HttpWebServer server; - private static HttpWebServerB serverB; - private static Config _config; - - public static bool IsRunning - { - get - { - return (pacPort > 0); - } - } - - public static void Init(Config config) - { - _config = config; - Global.pacPort = config.GetLocalPort("pac"); - - if (InitServer("*")) - { - pacPort = Global.pacPort; - } - //else if (InitServer(Global.Loopback)) - //{ - // pacPort = Global.pacPort; - //} - else if (InitServerB(Global.Loopback)) - { - pacPort = Global.pacPort; - } - else - { - Utils.SaveLog("Webserver init failed "); - pacPort = 0; - } - } - - private static bool InitServer(string address) - { - try - { - if (pacPort != Global.pacPort) - { - if (server != null) - { - server.Stop(); - server = null; - } - - if (server == null) - { - string prefixes = string.Format("http://{0}:{1}/pac/", address, Global.pacPort); - Utils.SaveLog("Webserver prefixes " + prefixes); - - server = new HttpWebServer(SendResponse, prefixes); - server.Run(); - - } - } - Utils.SaveLog("Webserver at " + address); - } - catch (Exception ex) - { - Utils.SaveLog("Webserver InitServer " + ex.Message); - return false; - } - return true; - } - - public static bool InitServerB(string address) - { - try - { - if (pacPort != Global.pacPort) - { - if (serverB != null) - { - serverB.Stop(); - serverB = null; - } - - if (serverB == null) - { - serverB = new HttpWebServerB(Global.pacPort, SendResponse); - } - } - Utils.SaveLog("WebserverB at " + address); - } - catch (Exception ex) - { - Utils.SaveLog("WebserverB InitServer " + ex.Message); - return false; - } - return true; - } - - public static string SendResponse(string address) - { - try - { - string pac = GetPacList(address); - return pac; - } - catch (Exception ex) - { - Utils.SaveLog("Webserver SendResponse " + ex.Message); - return ex.Message; - } - } - - public static void Stop() - { - try - { - if (server != null) - { - server.Stop(); - server = null; - } - if (serverB != null) - { - serverB.Stop(); - serverB = null; - } - } - catch (Exception ex) - { - Utils.SaveLog("Webserver Stop " + ex.Message); - } - - //try - //{ - // if (httpWebServer == null) - // { - // return; - // } - // foreach (var key in httpWebServer.Keys) - // { - // Utils.SaveLog("Webserver Stop " + key.ToString()); - // ((HttpWebServer)httpWebServer[key]).Stop(); - // } - // httpWebServer.Clear(); - //} - //catch (Exception ex) - //{ - // Utils.SaveLog("Webserver Stop " + ex.Message); - //} - } - - private static string GetPacList(string address) - { - int port = Global.httpPort; - if (port <= 0) - { - return "No port"; - } - try - { - List lstProxy = new List - { - string.Format("PROXY {0}:{1};", address, port) - }; - string proxy = string.Join("", lstProxy.ToArray()); - - string strPacfile = Utils.GetPath(Global.pacFILE); - if (!File.Exists(strPacfile)) - { - FileManager.UncompressFile(strPacfile, Resources.pac_txt); - } - string pac = File.ReadAllText(strPacfile, Encoding.UTF8); - pac = pac.Replace("__PROXY__", proxy); - - if (_config.userPacRule.Count > 0) - { - string keyWords = "var rules = ["; - if (pac.IndexOf(keyWords) >= 0) - { - string userPac = string.Join($"\",{Environment.NewLine}\"", _config.userPacRule.ToArray()); - userPac = string.Format("\"{0}\",", userPac); - pac = pac.Replace(keyWords, keyWords + userPac); - } - } - - return pac; - } - catch - { - } - return "No pac content"; - } - - } -} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs deleted file mode 100644 index f738a318..00000000 --- a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs +++ /dev/null @@ -1,194 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using v2rayN.Mode; -using v2rayN.Properties; -using v2rayN.Tool; - -namespace v2rayN.HttpProxyHandler -{ - /// - /// Privoxy处理类,提供http协议代理 - /// - class PrivoxyHandler - { - /// - /// 单例 - /// - private static PrivoxyHandler instance; - - private static int _uid; - private static string _uniqueConfigFile; - private Process _process; - private static string _privoxyName = "v2ray_privoxy"; - - static PrivoxyHandler() - { - try - { - _uid = Application.StartupPath.GetHashCode(); - _uniqueConfigFile = string.Format("privoxy_{0}.conf", _uid); - - FileManager.UncompressFile(Utils.GetTempPath($"{_privoxyName}.exe"), Resources.privoxy_exe); - } - catch (IOException ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - /// - /// 单例 - /// - public static PrivoxyHandler Instance - { - get - { - if (instance == null) - { - instance = new PrivoxyHandler(); - } - return instance; - } - } - - public int RunningPort - { - get; set; - } - - public void Restart(int localPort, Config config) - { - Stop(); - Start(localPort, config); - } - - - public void Start(int localPort, Config config) - { - try - { - if (_process == null) - { - - string privoxyConfig = Resources.privoxy_conf; - RunningPort = config.GetLocalPort(Global.InboundHttp); - privoxyConfig = privoxyConfig.Replace("__SOCKS_PORT__", localPort.ToString()); - privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_PORT__", RunningPort.ToString()); - if (config.allowLANConn) - { - privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_IP__", "0.0.0.0"); - } - else - { - privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_IP__", Global.Loopback); - } - FileManager.ByteArrayToFile(Utils.GetTempPath(_uniqueConfigFile), Encoding.UTF8.GetBytes(privoxyConfig)); - - _process = new Process - { - // Configure the process using the StartInfo properties. - StartInfo = - { - FileName = $"{_privoxyName}.exe", - Arguments = _uniqueConfigFile, - WorkingDirectory = Utils.GetTempPath(), - WindowStyle = ProcessWindowStyle.Hidden, - UseShellExecute = true, - CreateNoWindow = true - } - }; - _process.Start(); - - /* - * Add this process to job obj associated with this ss process, so that - * when ss exit unexpectedly, this process will be forced killed by system. - */ - - Global.processJob.AddProcess(_process.Handle); - } - } - catch (Exception ex) - { - RunningPort = 0; - Utils.SaveLog(ex.Message, ex); - } - } - - public void Stop() - { - if (_process != null) - { - KillProcess(_process); - _process.Dispose(); - _process = null; - RunningPort = 0; - } - else - { - Process[] existingPrivoxy = Process.GetProcessesByName(_privoxyName); - foreach (Process p in existingPrivoxy.Where(IsChildProcess)) - { - KillProcess(p); - } - } - } - - private static void KillProcess(Process p) - { - try - { - p.CloseMainWindow(); - p.WaitForExit(100); - if (!p.HasExited) - { - p.Kill(); - p.WaitForExit(100); - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - /* - * We won't like to kill other ss instances' v2ray_privoxy.exe. - * This function will check whether the given process is created - * by this process by checking the module path or command line. - * - * Since it's required to put ss in different dirs to run muti instances, - * different instance will create their unique "privoxy_UID.conf" where - * UID is hash of ss's location. - */ - - private static bool IsChildProcess(Process process) - { - try - { - /* - * Under PortableMode, we could identify it by the path of v2ray_privoxy.exe. - */ - string path = process.MainModule.FileName; - - return Utils.GetTempPath($"{_privoxyName}.exe").Equals(path); - - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - /* - * Sometimes Process.GetProcessesByName will return some processes that - * are already dead, and that will cause exceptions here. - * We could simply ignore those exceptions. - */ - //Logging.LogUsefulException(ex); - return false; - } - } - - } -} diff --git a/v2rayN/v2rayN/Mode/ComboItem.cs b/v2rayN/v2rayN/Mode/ComboItem.cs new file mode 100644 index 00000000..e69373ef --- /dev/null +++ b/v2rayN/v2rayN/Mode/ComboItem.cs @@ -0,0 +1,14 @@ +namespace v2rayN.Mode +{ + class ComboItem + { + public int ID + { + get; set; + } + public string Text + { + get; set; + } + } +} diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index fb737942..8dab69c6 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; +using System.Windows.Forms; using v2rayN.Base; -using v2rayN.HttpProxyHandler; - +using System.Linq; +using System.Drawing; namespace v2rayN.Mode { @@ -12,13 +13,7 @@ namespace v2rayN.Mode [Serializable] public class Config { - /// - /// 本地监听 - /// - public List inbound - { - get; set; - } + #region property /// /// 允许日志 @@ -36,18 +31,7 @@ namespace v2rayN.Mode get; set; } - /// - /// 活动配置序号 - /// - public int index - { - get; set; - } - - /// - /// vmess服务器信息 - /// - public List vmess + public string indexId { get; set; } @@ -61,87 +45,9 @@ namespace v2rayN.Mode } /// - /// 域名解析策略 + /// /// - public string domainStrategy - { - get; set; - } - - /// - /// 路由模式 - /// - public string routingMode - { - get; set; - } - - /// - /// 用户自定义需代理的网址或ip - /// - public List useragent - { - get; set; - } - - /// - /// 用户自定义直连的网址或ip - /// - public List userdirect - { - get; set; - } - - /// - /// 用户自定义阻止的网址或ip - /// - public List userblock - { - get; set; - } - - /// - /// KcpItem - /// - public KcpItem kcpItem - { - get; set; - } - - /// - /// 监听状态 - /// - public ListenerType listenerType - { - get; set; - } - - /// - /// 自定义服务器下载测速url - /// - public string speedTestUrl - { - get; set; - } - /// - /// 自定义“服务器真连接延迟”测试url - /// - public string speedPingTestUrl - { - get; set; - } - /// - /// 自定义GFWList url - /// - public string urlGFWList - { - get; set; - } - - /// - /// 允许来自局域网的连接 - /// - public bool allowLANConn + public ESysProxyType sysProxyType { get; set; } @@ -170,7 +76,6 @@ namespace v2rayN.Mode get; set; } - /// /// 自定义远程DNS /// @@ -187,6 +92,79 @@ namespace v2rayN.Mode get; set; } + /// + /// 域名解析策略 + /// + public string domainStrategy + { + get; set; + } + public string domainMatcher + { + get; set; + } + public int routingIndex + { + get; set; + } + public bool enableRoutingAdvanced + { + get; set; + } + + public bool ignoreGeoUpdateCore + { + get; set; + } + + /// + /// systemProxyExceptions + /// + public string systemProxyExceptions + { + get; set; + } + public string systemProxyAdvancedProtocol { get; set; } + + public int autoUpdateInterval { get; set; } = 0; + + public int autoUpdateSubInterval { get; set; } = 0; + + public bool enableSecurityProtocolTls13 + { + get; set; + } + + public int trayMenuServersLimit { get; set; } + + #endregion + + #region other entities + + /// + /// 本地监听 + /// + public List inbound + { + get; set; + } + + /// + /// vmess服务器信息 + /// + public List vmess + { + get; set; + } + + /// + /// KcpItem + /// + public KcpItem kcpItem + { + get; set; + } + /// /// 订阅 /// @@ -201,178 +179,99 @@ namespace v2rayN.Mode { get; set; } - - public List userPacRule + public List routings { get; set; } - #region 函数 - - public string address() + public ConstItem constItem { - if (index < 0) - { - return string.Empty; - } - return vmess[index].address.TrimEx(); + get; set; } - public int port() + public List globalHotkeys { - if (index < 0) - { - return 10808; - } - return vmess[index].port; + get; set; } - public string id() + public List groupItem { - if (index < 0) - { - return string.Empty; - } - return vmess[index].id.TrimEx(); + get; set; } - public int alterId() + public List coreTypeItem { - if (index < 0) - { - return 0; - } - return vmess[index].alterId; + get; set; } - public string security() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].security.TrimEx(); - } + #endregion - public string remarks() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].remarks.TrimEx(); - } - public string network() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].network)) - { - return Global.DefaultNetwork; - } - return vmess[index].network.TrimEx(); - } - public string headerType() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].headerType)) - { - return Global.None; - } - return vmess[index].headerType.Replace(" ", "").TrimEx(); - } - public string requestHost() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].requestHost)) - { - return string.Empty; - } - return vmess[index].requestHost.Replace(" ", "").TrimEx(); - } - public string path() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].path)) - { - return string.Empty; - } - return vmess[index].path.Replace(" ", "").TrimEx(); - } - public string streamSecurity() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].streamSecurity)) - { - return string.Empty; - } - return vmess[index].streamSecurity; - } - public bool allowInsecure() - { - if (index < 0 || Utils.IsNullOrEmpty(vmess[index].allowInsecure)) - { - return defAllowInsecure; - } - return Convert.ToBoolean(vmess[index].allowInsecure); - } + #region function public int GetLocalPort(string protocol) { - if (protocol == Global.InboundHttp) + int localPort = inbound.FirstOrDefault(t => t.protocol == Global.InboundSocks).localPort; + + if (protocol == Global.InboundSocks) { - return GetLocalPort(Global.InboundSocks) + 1; + return localPort; } - else if (protocol == "pac") + else if (protocol == Global.InboundHttp) { - return GetLocalPort(Global.InboundSocks) + 2; + return localPort + 1; + } + else if (protocol == Global.InboundSocks2) + { + return localPort + 2; + } + else if (protocol == Global.InboundHttp2) + { + return localPort + 3; } else if (protocol == "speedtest") { - return GetLocalPort(Global.InboundSocks) + 103; - } - - int localPort = 0; - foreach (InItem inItem in inbound) - { - if (inItem.protocol.Equals(protocol)) - { - localPort = inItem.localPort; - break; - } + return localPort + 103; } return localPort; } - public int configType() + public int FindIndexId(string id) { - if (index < 0) + if (string.IsNullOrEmpty(id)) { - return 0; + return -1; } - return vmess[index].configType; + return vmess.FindIndex(it => it.indexId == id); } - public string getSummary() + public VmessItem GetVmessItem(string id) { - if (index < 0) + if (string.IsNullOrEmpty(id)) + { + return null; + } + return vmess.FirstOrDefault(it => it.indexId == id); + } + + public bool IsActiveNode(VmessItem item) + { + if (!Utils.IsNullOrEmpty(item.indexId) && item.indexId == indexId) + { + return true; + } + + return false; + } + + public string GetGroupRemarks(string groupId) + { + if (string.IsNullOrEmpty(groupId)) { return string.Empty; } - return vmess[index].getSummary(); + return groupItem.Where(it => it.id == groupId).FirstOrDefault()?.remarks; } - public string getItemId() - { - if (index < 0) - { - return string.Empty; - } - - return vmess[index].getItemId(); - } - public string flow() - { - if (index < 0) - { - return string.Empty; - } - return vmess[index].flow.TrimEx(); - } #endregion } @@ -382,7 +281,10 @@ namespace v2rayN.Mode { public VmessItem() { - configVersion = 1; + indexId = string.Empty; + configType = EConfigType.VMess; + configVersion = 2; + sort = 0; address = string.Empty; port = 0; id = string.Empty; @@ -395,15 +297,16 @@ namespace v2rayN.Mode path = string.Empty; streamSecurity = string.Empty; allowInsecure = string.Empty; - configType = (int)EConfigType.Vmess; testResult = string.Empty; subid = string.Empty; flow = string.Empty; + groupId = string.Empty; } - public string getSummary() + #region function + public string GetSummary() { - string summary = string.Format("[{0}] ", ((EConfigType)configType).ToString()); + string summary = string.Format("[{0}] ", (configType).ToString()); string[] arrAddr = address.Split('.'); string addr; if (arrAddr.Length > 2) @@ -420,19 +323,11 @@ namespace v2rayN.Mode } switch (configType) { - case (int)EConfigType.Vmess: - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - break; - case (int)EConfigType.Shadowsocks: - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - break; - case (int)EConfigType.Socks: - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - break; - case (int)EConfigType.VLESS: - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - break; - case (int)EConfigType.Trojan: + case EConfigType.VMess: + case EConfigType.Shadowsocks: + case EConfigType.Socks: + case EConfigType.VLESS: + case EConfigType.Trojan: summary += string.Format("{0}({1}:{2})", remarks, addr, port); break; default: @@ -441,32 +336,76 @@ namespace v2rayN.Mode } return summary; } - public string getSubRemarks(Config config) + public string GetSubRemarks(Config config) { string subRemarks = string.Empty; if (Utils.IsNullOrEmpty(subid)) { return subRemarks; } - foreach (SubItem sub in config.subItem) - { - if (sub.id.EndsWith(subid)) - { - return sub.remarks; - } - } if (subid.Length <= 4) { return subid; } + var sub = config.subItem.FirstOrDefault(t => t.id == subid); + if (sub != null) + { + return sub.remarks; + } return subid.Substring(0, 4); } - - public string getItemId() + public string GetGroupRemarks(Config config) { - string itemId = $"{address}{port}{requestHost}{path}"; - itemId = Utils.Base64Encode(itemId); - return itemId; + string subRemarks = string.Empty; + if (Utils.IsNullOrEmpty(groupId)) + { + return subRemarks; + } + var group = config.groupItem.FirstOrDefault(t => t.id == groupId); + if (group != null) + { + return group.remarks; + } + return groupId.Substring(0, 4); + } + + public List GetAlpn() + { + if (alpn != null && alpn.Count > 0) + { + return alpn; + } + else + { + return null; + } + } + public string GetNetwork() + { + if (Utils.IsNullOrEmpty(network) || !Global.networks.Contains(network)) + { + return Global.DefaultNetwork; + } + return network.TrimEx(); + } + + public void SetTestResult(string value) + { + testResult = value; + } + #endregion + + public string indexId + { + get; set; + } + + /// + /// config type(1=normal,2=custom) + /// + public EConfigType configType + { + get; set; } /// @@ -477,6 +416,11 @@ namespace v2rayN.Mode get; set; } + public int sort + { + get; set; + } + /// /// 远程服务器地址 /// @@ -552,7 +496,7 @@ namespace v2rayN.Mode } /// - /// 底层传输安全 + /// 传输层安全 /// public string streamSecurity { @@ -567,15 +511,6 @@ namespace v2rayN.Mode get; set; } - - /// - /// config type(1=normal,2=custom) - /// - public int configType - { - get; set; - } - /// /// /// @@ -599,6 +534,29 @@ namespace v2rayN.Mode { get; set; } + /// + /// tls sni + /// + public string sni + { + get; set; + } + /// + /// tls alpn + /// + public List alpn + { + get; set; + } + + public string groupId + { + get; set; + } = string.Empty; + public ECoreType? coreType + { + get; set; + } } [Serializable] @@ -632,6 +590,13 @@ namespace v2rayN.Mode /// 开启流量探测 /// public bool sniffingEnabled { get; set; } = true; + + public bool allowLANConn { get; set; } + + public string user { get; set; } + + public string pass { get; set; } + } [Serializable] @@ -720,14 +685,32 @@ namespace v2rayN.Mode /// enable /// public bool enabled { get; set; } = true; + + /// + /// + /// + public string userAgent + { + get; set; + } = string.Empty; + + public string groupId + { + get; set; + } = string.Empty; } [Serializable] public class UIItem { + public bool enableAutoAdjustMainLvColWidth + { + get; set; + } + public Point mainLocation { get; set; } - public System.Drawing.Size mainSize + public Size mainSize { get; set; } @@ -737,4 +720,81 @@ namespace v2rayN.Mode get; set; } } + + [Serializable] + public class ConstItem + { + /// + /// 自定义服务器下载测速url + /// + public string speedTestUrl + { + get; set; + } + /// + /// 自定义“服务器真连接延迟”测试url + /// + public string speedPingTestUrl + { + get; set; + } + public string defIEProxyExceptions + { + get; set; + } + } + + [Serializable] + public class KeyEventItem + { + public EGlobalHotkey eGlobalHotkey { get; set; } + + public bool Alt { get; set; } + + public bool Control { get; set; } + + public bool Shift { get; set; } + + public Keys? KeyCode { get; set; } + + } + + [Serializable] + public class GroupItem + { + /// + /// + /// + public string id + { + get; set; + } + + /// + /// + /// + public string remarks + { + get; set; + } + public int sort + { + get; set; + } + } + + + [Serializable] + public class CoreTypeItem + { + public EConfigType configType + { + get; set; + } + + public ECoreType coreType + { + get; set; + } + } } diff --git a/v2rayN/v2rayN/Mode/CoreInfo.cs b/v2rayN/v2rayN/Mode/CoreInfo.cs new file mode 100644 index 00000000..4afc1c22 --- /dev/null +++ b/v2rayN/v2rayN/Mode/CoreInfo.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace v2rayN.Mode +{ + [Serializable] + public class CoreInfo + { + public ECoreType coreType { get; set; } + + public List coreExes { get; set; } + + public string arguments { get; set; } + + public string coreUrl { get; set; } + + public string coreLatestUrl { get; set; } + + public string coreDownloadUrl32 { get; set; } + + public string coreDownloadUrl64 { get; set; } + + public string match { get; set; } + } +} diff --git a/v2rayN/v2rayN/Mode/EConfigType.cs b/v2rayN/v2rayN/Mode/EConfigType.cs index e1adc53c..7aa329ed 100644 --- a/v2rayN/v2rayN/Mode/EConfigType.cs +++ b/v2rayN/v2rayN/Mode/EConfigType.cs @@ -3,7 +3,7 @@ namespace v2rayN.Mode { public enum EConfigType { - Vmess = 1, + VMess = 1, Custom = 2, Shadowsocks = 3, Socks = 4, diff --git a/v2rayN/v2rayN/Mode/ECoreType.cs b/v2rayN/v2rayN/Mode/ECoreType.cs new file mode 100644 index 00000000..511663f3 --- /dev/null +++ b/v2rayN/v2rayN/Mode/ECoreType.cs @@ -0,0 +1,14 @@ + +namespace v2rayN.Mode +{ + public enum ECoreType + { + v2fly = 1, + Xray = 2, + clash = 11, + clash_meta = 12, + hysteria = 21, + naiveproxy = 22, + v2rayN = 99 + } +} diff --git a/v2rayN/v2rayN/Mode/EGlobalHotkey.cs b/v2rayN/v2rayN/Mode/EGlobalHotkey.cs new file mode 100644 index 00000000..de7cd336 --- /dev/null +++ b/v2rayN/v2rayN/Mode/EGlobalHotkey.cs @@ -0,0 +1,11 @@ + +namespace v2rayN.Mode +{ + public enum EGlobalHotkey + { + ShowForm = 0, + SystemProxyClear = 1, + SystemProxySet = 2, + SystemProxyUnchanged = 3, + } +} diff --git a/v2rayN/v2rayN/Mode/EMove.cs b/v2rayN/v2rayN/Mode/EMove.cs index 7f67d5b1..892a6ab3 100644 --- a/v2rayN/v2rayN/Mode/EMove.cs +++ b/v2rayN/v2rayN/Mode/EMove.cs @@ -6,6 +6,7 @@ namespace v2rayN.Mode Top = 1, Up = 2, Down = 3, - Bottom = 4 + Bottom = 4, + Position = 5 } } diff --git a/v2rayN/v2rayN/Mode/EServerColName.cs b/v2rayN/v2rayN/Mode/EServerColName.cs index 0704e47e..554a520e 100644 --- a/v2rayN/v2rayN/Mode/EServerColName.cs +++ b/v2rayN/v2rayN/Mode/EServerColName.cs @@ -10,6 +10,7 @@ namespace v2rayN.Mode port, security, network, + streamSecurity, subRemarks, testResult, diff --git a/v2rayN/v2rayN/Mode/ESpeedActionType.cs b/v2rayN/v2rayN/Mode/ESpeedActionType.cs new file mode 100644 index 00000000..3e9bc3b6 --- /dev/null +++ b/v2rayN/v2rayN/Mode/ESpeedActionType.cs @@ -0,0 +1,11 @@ + +namespace v2rayN.Mode +{ + public enum ESpeedActionType + { + Ping, + Tcping, + Realping, + Speedtest + } +} diff --git a/v2rayN/v2rayN/Mode/ESysProxyType.cs b/v2rayN/v2rayN/Mode/ESysProxyType.cs new file mode 100644 index 00000000..7e33357e --- /dev/null +++ b/v2rayN/v2rayN/Mode/ESysProxyType.cs @@ -0,0 +1,10 @@ + +namespace v2rayN.Mode +{ + public enum ESysProxyType + { + ForcedClear = 0, + ForcedChange = 1, + Unchanged = 2 + } +} diff --git a/v2rayN/v2rayN/Mode/RoutingItem.cs b/v2rayN/v2rayN/Mode/RoutingItem.cs new file mode 100644 index 00000000..02a93edf --- /dev/null +++ b/v2rayN/v2rayN/Mode/RoutingItem.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace v2rayN.Mode +{ + [Serializable] + public class RoutingItem + { + public string remarks + { + get; set; + } + public string url + { + get; set; + } + public List rules + { + get; set; + } + public bool enabled { get; set; } = true; + + public bool locked + { + get; set; + } + public string customIcon + { + get; set; + } + } +} diff --git a/v2rayN/v2rayN/Mode/RulesItem.cs b/v2rayN/v2rayN/Mode/RulesItem.cs new file mode 100644 index 00000000..823e970b --- /dev/null +++ b/v2rayN/v2rayN/Mode/RulesItem.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace v2rayN.Mode +{ + [Serializable] + public class RulesItem + { + public string type { get; set; } + + public string port { get; set; } + + public List inboundTag { get; set; } + + public string outboundTag { get; set; } + + public List ip { get; set; } + + public List domain { get; set; } + + public List protocol { get; set; } + + public bool enabled { get; set; } = true; + + } + +} diff --git a/v2rayN/v2rayN/Mode/ServerTestItem.cs b/v2rayN/v2rayN/Mode/ServerTestItem.cs new file mode 100644 index 00000000..45d6b5f9 --- /dev/null +++ b/v2rayN/v2rayN/Mode/ServerTestItem.cs @@ -0,0 +1,29 @@ +using System; + +namespace v2rayN.Mode +{ + [Serializable] + class ServerTestItem + { + public string indexId + { + get; set; + } + public string address + { + get; set; + } + public int port + { + get; set; + } + public EConfigType configType + { + get; set; + } + public bool allowTest + { + get; set; + } + } +} diff --git a/v2rayN/v2rayN/Mode/SsSIP008.cs b/v2rayN/v2rayN/Mode/SsSIP008.cs new file mode 100644 index 00000000..6b3bbc24 --- /dev/null +++ b/v2rayN/v2rayN/Mode/SsSIP008.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace v2rayN.Mode +{ + public class SsSIP008 + { + public List servers { get; set; } + } + + [Serializable] + public class SsServer + { + public string remarks { get; set; } + public string server { get; set; } + public string server_port { get; set; } + public string method { get; set; } + public string password { get; set; } + public string plugin { get; set; } + } + +} diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index bc85c18f..1ce64c3c 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -25,7 +25,7 @@ namespace v2rayN.Mode /// 统计需要, 空对象 /// public Stats stats { get; set; } - + /// public API api { get; set; } @@ -35,7 +35,7 @@ namespace v2rayN.Mode /// /// DNS 配置 /// - public Dns dns { get; set; } + public object dns { get; set; } /// /// 路由配置 /// @@ -57,8 +57,8 @@ namespace v2rayN.Mode public class SystemPolicy { - public bool statsInboundUplink; - public bool statsInboundDownlink; + public bool statsOutboundUplink; + public bool statsOutboundDownlink; } public class Log @@ -133,12 +133,15 @@ namespace v2rayN.Mode /// public List clients { get; set; } - + /// /// VLESS /// public string decryption { get; set; } - + + public bool allowTransparent { get; set; } + + public List accounts { get; set; } } public class UsersItem @@ -168,7 +171,7 @@ namespace v2rayN.Mode /// /// VLESS /// - public string flow { get; set; } + public string flow { get; set; } } public class Sniffing { @@ -269,6 +272,11 @@ namespace v2rayN.Mode /// public int level { get; set; } + /// + /// trojan + /// + public string flow { get; set; } + /// /// /// @@ -321,34 +329,6 @@ namespace v2rayN.Mode public List servers { get; set; } } - public class RulesItem - { - /// - /// - /// - public string type { get; set; } - /// - /// - /// - public string port { get; set; } - - public List inboundTag { get; set; } - /// - /// - /// - public string outboundTag { get; set; } - - /// - /// - /// - public List ip { get; set; } - - /// - /// - /// - public List domain { get; set; } - } - public class Routing { /// @@ -358,6 +338,10 @@ namespace v2rayN.Mode /// /// /// + public string domainMatcher { get; set; } + /// + /// + /// public List rules { get; set; } } @@ -403,6 +387,10 @@ namespace v2rayN.Mode /// VLESS xtls /// public TlsSettings xtlsSettings { get; set; } + /// + /// grpc + /// + public GrpcSettings grpcSettings { get; set; } } @@ -417,10 +405,17 @@ namespace v2rayN.Mode /// /// public string serverName { get; set; } + /// + /// + /// + public List alpn + { + get; set; + } } public class TcpSettings - { + { /// /// 数据包头部伪装设置 /// @@ -484,7 +479,7 @@ namespace v2rayN.Mode } public class WsSettings - { + { /// /// /// @@ -534,4 +529,27 @@ namespace v2rayN.Mode public Header header { get; set; } } + public class GrpcSettings + { + /// + /// + /// + public string serviceName { get; set; } + /// + /// + /// + public bool multiMode { get; set; } + } + + public class AccountsItem + { + /// + /// + /// + public string user { get; set; } + /// + /// + /// + public string pass { get; set; } + } } diff --git a/v2rayN/v2rayN/Mode/VmessQRCode.cs b/v2rayN/v2rayN/Mode/VmessQRCode.cs index 0a9cc8ab..c4db42b4 100644 --- a/v2rayN/v2rayN/Mode/VmessQRCode.cs +++ b/v2rayN/v2rayN/Mode/VmessQRCode.cs @@ -2,52 +2,68 @@ namespace v2rayN.Mode { + /// + /// https://github.com/2dust/v2rayN/wiki/ + /// [Serializable] class VmessQRCode { /// - /// 版本 + /// /// public string v { get; set; } = string.Empty; /// - /// 备注 + /// /// public string ps { get; set; } = string.Empty; /// - /// 远程服务器地址 + /// /// public string add { get; set; } = string.Empty; /// - /// 远程服务器端口 + /// /// public string port { get; set; } = string.Empty; /// - /// 远程服务器ID + /// /// public string id { get; set; } = string.Empty; /// - /// 远程服务器额外ID + /// /// public string aid { get; set; } = string.Empty; /// - /// 传输协议tcp,kcp,ws + /// + /// + public string scy { get; set; } = string.Empty; + + /// + /// /// public string net { get; set; } = string.Empty; /// - /// 伪装类型 + /// /// public string type { get; set; } = string.Empty; /// - /// 伪装的域名 + /// /// public string host { get; set; } = string.Empty; /// - /// path + /// /// public string path { get; set; } = string.Empty; /// - /// 底层传输安全 + /// TLS /// public string tls { get; set; } = string.Empty; - } + /// + /// TLS SNI + /// + public string sni { get; set; } = string.Empty; + /// + /// TLS alpn + /// + public string alpn { get; set; } = string.Empty; + } } diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs index cd3e1559..a8154406 100644 --- a/v2rayN/v2rayN/Program.cs +++ b/v2rayN/v2rayN/Program.cs @@ -1,18 +1,13 @@ using System; -using System.Diagnostics; using System.Threading; using System.Windows.Forms; using v2rayN.Forms; -using v2rayN.Properties; using v2rayN.Tool; namespace v2rayN { static class Program { - [System.Runtime.InteropServices.DllImport("user32.dll")] - private static extern bool SetProcessDPIAware(); - /// /// 应用程序的主入口点。 /// @@ -21,20 +16,21 @@ namespace v2rayN { if (Environment.OSVersion.Version.Major >= 6) { - SetProcessDPIAware(); + Utils.SetProcessDPIAware(); } Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); - Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); - AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); + Application.ThreadException += Application_ThreadException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; //AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; if (!IsDuplicateInstance()) { - - Utils.SaveLog("v2rayN start up " + Utils.GetVersion()); + Logging.Setup(); + Utils.SaveLog($"v2rayN start up | {Utils.GetVersion()} | {Utils.GetExePath()}"); + Logging.ClearLogs(); //设置语言环境 string lang = Utils.RegReadValue(Global.MyRegPath, Global.MyRegKeyLanguage, "zh-Hans"); @@ -42,10 +38,26 @@ namespace v2rayN Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new MainForm()); + Application.Run(new MainForm()); } else { + try + { + //read handle from reg and show the window + long.TryParse(Utils.RegReadValue(Global.MyRegPath, Utils.WindowHwndKey, ""), out long llong); + if (llong > 0) + { + var hwnd = (IntPtr)llong; + if (Utils.IsWindow(hwnd)) + { + Utils.ShowWindow(hwnd, 4); + Utils.SwitchToThisWindow(hwnd, true); + return; + } + } + } + catch { } UI.ShowWarning($"v2rayN is already running(v2rayN已经运行)"); } } @@ -81,7 +93,7 @@ namespace v2rayN string name = Utils.GetExePath(); // Allow different locations to run name = name.Replace("\\", "/"); // https://stackoverflow.com/questions/20714120/could-not-find-a-part-of-the-path-error-while-creating-mutex - + Global.mutexObj = new Mutex(false, name, out bool bCreatedNew); return !bCreatedNew; } diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 8c214e64..b8cc2c34 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -9,7 +9,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("v2rayN")] -[assembly: AssemblyCopyright("Copyright © 2019-2020 (GPLv3)")] +[assembly: AssemblyCopyright("Copyright © 2019-2022 (GPLv3)")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("3.29")] +[assembly: AssemblyFileVersion("5.29")] diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs index f21638d7..aa68f66d 100644 --- a/v2rayN/v2rayN/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace v2rayN.Properties { // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -47,8 +47,8 @@ namespace v2rayN.Properties { } /// - /// 重写当前线程的 CurrentUICulture 属性 - /// 重写当前线程的 CurrentUICulture 属性。 + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -70,16 +70,6 @@ namespace v2rayN.Properties { } } - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// - internal static byte[] abp_js { - get { - object obj = ResourceManager.GetObject("abp_js", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// @@ -120,6 +110,36 @@ namespace v2rayN.Properties { } } + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon NotifyIcon1 { + get { + object obj = ResourceManager.GetObject("NotifyIcon1", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon NotifyIcon2 { + get { + object obj = ResourceManager.GetObject("NotifyIcon2", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon NotifyIcon3 { + get { + object obj = ResourceManager.GetObject("NotifyIcon3", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// @@ -130,43 +150,6 @@ namespace v2rayN.Properties { } } - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// - internal static byte[] pac_txt { - get { - object obj = ResourceManager.GetObject("pac_txt", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// 查找类似 listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ - ///toggle 0 - ///logfile v2ray_privoxy.log - ///show-on-task-bar 0 - ///activity-animation 0 - ///forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . - ///max-client-connections 2048 - ///hide-console - /// 的本地化字符串。 - /// - internal static string privoxy_conf { - get { - return ResourceManager.GetString("privoxy_conf", resourceCulture); - } - } - - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// - internal static byte[] privoxy_exe { - get { - object obj = ResourceManager.GetObject("privoxy_exe", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx index 706454a0..20e420b5 100644 --- a/v2rayN/v2rayN/Properties/Resources.resx +++ b/v2rayN/v2rayN/Properties/Resources.resx @@ -118,9 +118,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\resources\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ..\Resources\about.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -151,22 +148,22 @@ ..\resources\sysproxy64.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\resources\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312 - ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\pac.txt.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\abp.js.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - ..\resources\share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\NotifyIcon1.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\NotifyIcon2.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\NotifyIcon3.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/v2rayN/v2rayN/Properties/Settings.Designer.cs b/v2rayN/v2rayN/Properties/Settings.Designer.cs index 62dd9b42..dea73b7b 100644 --- a/v2rayN/v2rayN/Properties/Settings.Designer.cs +++ b/v2rayN/v2rayN/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace v2rayN.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.3.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/v2rayN/v2rayN/Resources/NotifyIcon1.ico b/v2rayN/v2rayN/Resources/NotifyIcon1.ico new file mode 100644 index 00000000..a978e0a8 Binary files /dev/null and b/v2rayN/v2rayN/Resources/NotifyIcon1.ico differ diff --git a/v2rayN/v2rayN/Resources/NotifyIcon2.ico b/v2rayN/v2rayN/Resources/NotifyIcon2.ico new file mode 100644 index 00000000..b625aa8e Binary files /dev/null and b/v2rayN/v2rayN/Resources/NotifyIcon2.ico differ diff --git a/v2rayN/v2rayN/Resources/NotifyIcon3.ico b/v2rayN/v2rayN/Resources/NotifyIcon3.ico new file mode 100644 index 00000000..6b6db8e6 Binary files /dev/null and b/v2rayN/v2rayN/Resources/NotifyIcon3.ico differ diff --git a/v2rayN/v2rayN/Resources/abp.js.gz b/v2rayN/v2rayN/Resources/abp.js.gz deleted file mode 100644 index 0577c7f5..00000000 Binary files a/v2rayN/v2rayN/Resources/abp.js.gz and /dev/null differ diff --git a/v2rayN/v2rayN/Resources/pac.txt b/v2rayN/v2rayN/Resources/pac.txt deleted file mode 100644 index 6695b760..00000000 --- a/v2rayN/v2rayN/Resources/pac.txt +++ /dev/null @@ -1,7614 +0,0 @@ -// Generated by gfwlist2pac in precise mode -// https://github.com/clowwindy/gfwlist2pac - -var proxy = "__PROXY__"; - -var rules = [ - "|http://85.17.73.31/", - "||agnesb.fr", - "||akiba-web.com", - "||altrec.com", - "||angela-merkel.de", - "||angola.org", - "||apartmentratings.com", - "||apartments.com", - "||arena.taipei", - "||asianspiss.com", - "||assimp.org", - "||athenaeizou.com", - "||azubu.tv", - "||bankmobilevibe.com", - "||banorte.com", - "||bash-hackers.org", - "||beeg.com", - "||global.bing.com", - "||bloombergview.com", - "||booktopia.com.au", - "||boysmaster.com", - "||bynet.co.il", - "||carfax.com", - ".casinobellini.com", - "||casinobellini.com", - "||centauro.com.br", - "||chobit.cc", - "||clearsurance.com", - "||images.comico.tw", - "||static.comico.tw", - "||counter.social", - "||costco.com", - "||crossfire.co.kr", - "||d2pass.com", - "||darpa.mil", - "||dawangidc.com", - "||deezer.com", - "||desipro.de", - "||dingchin.com.tw", - "||discordapp.com", - "||discordapp.net", - "||dish.com", - "|http://img.dlsite.jp/", - "||dm530.net", - "share.dmhy.org", - "||dmhy.org", - "||dmm.co.jp", - "|http://www.dmm.com/netgame", - "||dnvod.tv", - "||dvdpac.com", - "||eesti.ee", - "||esurance.com", - ".expekt.com", - "||expekt.com", - ".extmatrix.com", - "||extmatrix.com", - "||fakku.net", - "||fastpic.ru", - "||filesor.com", - "||financetwitter.com", - "||flipboard.com", - "||flitto.com", - "||fnac.be", - "||fnac.com", - "||funkyimg.com", - "||fxnetworks.com", - "||g-area.org", - "||gettyimages.com", - "||getuploader.com", - "|https://raw.githubusercontent.com/programthink/zhao", - "||glass8.eu", - "||glype.com", - "||go141.com", - "||guo.media", - "||hautelook.com", - "||hautelookcdn.com", - "||wego.here.com", - "||gamer-cds.cdn.hinet.net", - "||gamer2-cds.cdn.hinet.net", - "||hmvdigital.ca", - "||hmvdigital.com", - "||homedepot.com", - "||hoovers.com", - "||hulu.com", - "||huluim.com", - "|http://secure.hustler.com", - "|http://hustlercash.com", - "|http://www.hustlercash.com", - "||hybrid-analysis.com", - "||cdn*.i-scmp.com", - "||ilovelongtoes.com", - "|http://imgmega.com/*.gif.html", - "|http://imgmega.com/*.jpg.html", - "|http://imgmega.com/*.jpeg.html", - "|http://imgmega.com/*.png.html", - "||imlive.com", - "||tw.iqiyi.com", - "||javhub.net", - "||javhuge.com", - ".javlibrary.com", - "||javlibrary.com", - "||jcpenney.com", - "||jims.net", - "||jukujo-club.com", - "||juliepost.com", - "||kawaiikawaii.jp", - "||kendatire.com", - "||khatrimaza.org", - "||kkbox.com", - "||leisurepro.com", - "||lifemiles.com", - "||longtoes.com", - "||lovetvshow.com", - "|http://www.m-sport.co.uk", - "||macgamestore.com", - "||madonna-av.com", - "||mangafox.com", - "||mangafox.me", - "||manta.com", - "||matome-plus.com", - "||matome-plus.net", - "||mattwilcox.net", - "||metarthunter.com", - "||mfxmedia.com", - "||mojim.com", - "||kb.monitorware.com", - "||monster.com", - "||moodyz.com", - "||moonbingo.com", - "||mos.ru", - "||msha.gov", - "||muzu.tv", - "||mvg.jp", - ".mybet.com", - "||mybet.com", - "||nationwide.com", - "|http://www.nbc.com/live", - "||neo-miracle.com", - "||netflix.com", - "||nflximg.com", - "||nflximg.net", - "||nflxext.com", - "||nflxso.net", - "||nflxvideo.net", - "||nic.gov", - "|http://mo.nightlife141.com", - "||nordstrom.com", - "||nordstromimage.com", - "||nordstromrack.com", - "||nottinghampost.com", - "||npsboost.com", - "||ntdtv.cz", - "||s1.nudezz.com", - "||nusatrip.com", - "||nuuvem.com", - "||omni7.jp", - "||onapp.com", - "||ontrac.com", - "@@|http://blog.ontrac.com", - "||pandora.com", - ".pandora.tv", - "||parkansky.com", - "||phmsociety.org", - "|http://*.pimg.tw/", - "||pure18.com", - "||pytorch.org", - "||qq.co.za", - "||r18.com", - "|http://radiko.jp", - "||ramcity.com.au", - "||rd.com", - "||rdio.com", - "|https://riseup.net", - "||sadistic-v.com", - "||isc.sans.edu", - "|http://cdn*.search.xxx/", - "||shiksha.com", - "||slacker.com", - "||sm-miracle.com", - "||soylentnews.org", - "||spotify.com", - "||spreadshirt.es", - "||springboardplatform.com", - "||sprite.org", - "@@|http://store.sprite.org", - "||superokayama.com", - "||superpages.com", - "||swagbucks.com", - "||switch1.jp", - "||tapanwap.com", - "||gsp.target.com", - "||login.target.com", - "||rcam.target.com", - "||thinkgeek.com", - "||thebodyshop-usa.com", - "||tma.co.jp", - "||tracfone.com", - "||tryheart.jp", - "||turntable.fm", - "||twerkingbutt.com", - "||ulop.net", - "||uukanshu.com", - "||vegasred.com", - "||vevo.com", - "||vip-enterprise.com", - "|http://viu.tv/ch/", - "|http://viu.tv/encore/", - "||vmpsoft.com", - "|http://ecsm.vs.com/", - "||wanz-factory.com", - "||ssl.webpack.de", - "||wheretowatch.com", - "||wingamestore.com", - "||wizcrafts.net", - "||vod.wwe.com", - "||xfinity.com", - "||youwin.com", - "||ytn.co.kr", - "||zattoo.com", - "||zim.vn", - "||zozotown.com", - "14.102.250.18", - "14.102.250.19", - "50.7.31.230:8898", - "174.142.105.153", - "69.65.19.160", - "||xn--4gq171p.com", - "||xn--czq75pvv1aj5c.org", - "||xn--i2ru8q2qg.com", - "||xn--oiq.cc", - "||xn--p8j9a0d9c9a.xn--q9jyb4c", - "||abebooks.com", - "|https://*.s3.amazonaws.com", - "||s3-ap-southeast-2.amazonaws.com", - "||43110.cf", - "||9gag.com", - "||agro.hk", - "||share.america.gov", - "||apkmirror.com", - "||arte.tv", - "||artstation.com", - "||bangdream.space", - "||behance.net", - "||bird.so", - "||zh.bitterwinter.org", - "||bnn.co", - "||businessinsider.com", - "||boomssr.com", - "||bwgyhw.com", - "||castbox.fm", - "||chinatimes.com", - "||clyp.it", - "||cmcn.org", - "||cmx.im", - "||dailyview.tw", - "||daum.net", - "||depositphotos.com", - "||disconnect.me", - "||documentingreality.com", - "||doubibackup.com", - "||doubmirror.cf", - "||encyclopedia.com", - "||fangeqiang.com", - "||fanqiangdang.com", - "||cloud.feedly.com", - "||feedx.net", - "||flyzy2005.com", - "||foreignpolicy.com", - "||free-ss.site", - "||freehongkong.org", - "||blog.fuckgfw233.org", - "||g0v.social", - "||globalvoices.org", - "||glorystar.me", - "||goregrish.com", - "||guangnianvpn.com", - "||hanime.tv", - "||hbo.com", - "||spaces.hightail.com", - "||hkgalden.com", - "||hkgolden.com", - "||hudson.org", - "||ipfs.io", - "||japantimes.co.jp", - "||jiji.com", - "||jintian.net", - "||jinx.com", - "||joinmastodon.org", - "||liangzhichuanmei.com", - "||lighti.me", - "||lightyearvpn.com", - "||lihkg.com", - "||line-scdn.net", - "||i.lithium.com", - "||cloud.mail.ru", - "||cdn-images.mailchimp.com", - "||mastodon.cloud", - "||mastodon.host", - "||mastodon.social", - "||matters.news", - "||me.me", - "||metart.com", - "||mohu.club", - "||mohu.ml", - "||motiyun.com", - "||msa-it.org", - "||dictionary.goo.ne.jp", - "||go.nesnode.com", - "||international-news.newsmagazine.asia", - "||nikkei.com", - "||niu.moe", - "||nofile.io", - "||now.com", - "||sukebei.nyaa.si", - "||openvpn.org", - "||onejav.com", - "||paste.ee", - "||my.pcloud.com", - "||picacomic.com", - "||pincong.rocks", - "||pixiv.net", - "||potato.im", - "||premproxy.com", - "||prism-break.org", - "||protonvpn.com", - "||api.pureapk.com", - "||quora.com", - "||quoracdn.net", - "||qz.com", - "||cdn.seatguru.com", - "||secure.raxcdn.com", - "||redd.it", - "||reddit.com", - ".redditlist.com", - "|http://redditlist.com", - "||redditmedia.com", - "||redditstatic.com", - "||rixcloud.com", - "||rixcloud.us", - "||rsdlmonitor.com", - "||shadowsocks.be", - "||shadowsocks9.com", - "||tn1.shemalez.com", - "||tn2.shemalez.com", - "||tn3.shemalez.com", - "||static.shemalez.com", - "||six-degrees.io", - "||softfamous.com", - "||softsmirror.cf", - "||sosreader.com", - "||sspanel.net", - "||sulian.me", - "||supchina.com", - "||teddysun.com", - "||textnow.me", - "||tineye.com", - "||top10vpn.com", - "||tubepornclassic.com", - "||uku.im", - "||unseen.is", - "||cn.uptodown.com", - "||uraban.me", - "||vrsmash.com", - "||vultryhw.com", - "||scache.vzw.com", - "||scache1.vzw.com", - "||scache2.vzw.com", - "||ss7.vzw.com", - "||ssr.tools", - "||steemit.com", - "||taiwanjustice.net", - "||tinc-vpn.org", - "||u15.info", - "||washingtonpost.com", - "||wenzhao.ca", - "||whatsonweibo.com", - "||wire.com", - "||blog.workflow.is", - "||xm.com", - "||xuehua.us", - "||yes-news.com", - "||yigeni.com", - "||you-get.org", - "||zzcloud.me", - "||aex.com", - "||allcoin.com", - "||adcex.com", - "||bcex.ca", - "||bibox.com", - "||big.one", - "||binance.com", - "||bit-z.com", - "||bitcoinworld.com", - "||bitfinex.com", - "||bithumb.com", - "||bitinka.com.ar", - "||bitmex.com", - "||btc98.com", - "||btcbank.bank", - "||btctrade.im", - "||c2cx.com", - "||chaoex.com", - "||cobinhood.com", - "||coin2co.in", - "||coinbene.com", - ".coinegg.com", - "||coinegg.com", - "||coinex.com", - "||coingi.com", - "||coinrail.co.kr", - "||cointiger.com", - "||cointobe.com", - "||coinut.com", - "||discoins.com", - "||dragonex.io", - "||ebtcbank.com", - "||etherdelta.com", - "||exmo.com", - "||exrates.me", - "||exx.com", - "||fatbtc.com", - "||gate.io", - "||gatecoin.com", - "||hbg.com", - "||hitbtc.com", - "||huobi.com", - "||huobi.pro", - "||huobipro.com", - "||bx.in.th", - "||jex.com", - "||kex.com", - "||kspcoin.com", - "||kucoin.com", - "||lbank.info", - "||livecoin.net", - "||localbitcoins.com", - "||mercatox.com", - "||oex.com", - "||okex.com", - "||otcbtc.com", - "||rightbtc.com", - "||topbtc.com", - "||xbtce.com", - "||yobit.net", - "||zb.com", - "||read01.com", - "||kknews.cc", - "china-mmm.jp.net", - ".lsxszzg.com", - ".china-mmm.net", - "||china-mmm.net", - "china-mmm.sa.com", - ".allowed.org", - ".now.im", - "||amazon.co.jp", - ".amazon.com/Dalai-Lama", - "amazon.com/Prisoner-State-Secret-Journal-Premier", - "s3-ap-northeast-1.amazonaws.com", - "||aolchannels.aol.com", - "video.aol.ca/video-detail", - "video.aol.co.uk/video-detail", - "video.aol.com", - "||video.aol.com", - "||search.aol.com", - "www.aolnews.com", - ".avmo.pw", - ".avmoo.com", - "|http://avmoo.com", - ".avmoo.net", - "|http://avmoo.net", - "||avmoo.pw", - ".javmoo.xyz", - "|http://javmoo.xyz", - ".javtag.com", - "|http://javtag.com", - ".javzoo.com", - "|http://javzoo.com", - ".tellme.pw", - ".bbc.com", - "||bbc.com", - ".bbc.co.uk", - "||bbc.co.uk", - "||bbci.co.uk", - ".bbcchinese.com", - "||bbcchinese.com", - "|http://bbc.in", - ".1dumb.com", - ".25u.com", - ".2waky.com", - ".3-a.net", - ".4dq.com", - ".4mydomain.com", - ".4pu.com", - ".acmetoy.com", - ".almostmy.com", - ".americanunfinished.com", - ".authorizeddns.net", - ".authorizeddns.org", - ".authorizeddns.us", - ".bigmoney.biz", - ".changeip.name", - ".changeip.net", - ".changeip.org", - ".cleansite.biz", - ".cleansite.info", - ".cleansite.us", - ".compress.to", - ".ddns.info", - ".ddns.me.uk", - ".ddns.mobi", - ".ddns.ms", - ".ddns.name", - ".ddns.us", - ".dhcp.biz", - ".dns-dns.com", - ".dns-stuff.com", - ".dns04.com", - ".dns05.com", - ".dns1.us", - ".dns2.us", - ".dnset.com", - ".dnsrd.com", - ".dsmtp.com", - ".dumb1.com", - ".dynamic-dns.net", - ".dynamicdns.biz", - ".dynamicdns.co.uk", - ".dynamicdns.me.uk", - ".dynamicdns.org.uk", - ".dyndns.pro", - ".dynssl.com", - ".edns.biz", - ".epac.to", - ".esmtp.biz", - ".ezua.com", - ".faqserv.com", - ".fartit.com", - ".freeddns.com", - ".freetcp.com", - ".freewww.biz", - ".freewww.info", - ".ftp1.biz", - ".ftpserver.biz", - ".gettrials.com", - ".got-game.org", - ".gr8domain.biz", - ".gr8name.biz", - ".https443.net", - ".https443.org", - ".ikwb.com", - ".instanthq.com", - ".iownyour.biz", - ".iownyour.org", - ".isasecret.com", - ".itemdb.com", - ".itsaol.com", - ".jetos.com", - ".jkub.com", - ".jungleheart.com", - ".justdied.com", - ".lflink.com", - ".lflinkup.com", - ".lflinkup.net", - ".lflinkup.org", - ".longmusic.com", - ".mefound.com", - ".moneyhome.biz", - ".mrbasic.com", - ".mrbonus.com", - ".mrface.com", - ".mrslove.com", - ".my03.com", - ".mydad.info", - ".myddns.com", - ".myftp.info", - ".myftp.name", - ".mylftv.com", - ".mymom.info", - ".mynetav.net", - ".mynetav.org", - ".mynumber.org", - ".mypicture.info", - ".mypop3.net", - ".mypop3.org", - ".mysecondarydns.com", - ".mywww.biz", - ".myz.info", - ".ninth.biz", - ".ns01.biz", - ".ns01.info", - ".ns01.us", - ".ns02.biz", - ".ns02.info", - ".ns02.us", - ".ns1.name", - ".ns2.name", - ".ns3.name", - ".ocry.com", - ".onedumb.com", - ".onmypc.biz", - ".onmypc.info", - ".onmypc.net", - ".onmypc.org", - ".onmypc.us", - ".organiccrap.com", - ".otzo.com", - ".ourhobby.com", - ".pcanywhere.net", - ".port25.biz", - ".proxydns.com", - ".qhigh.com", - ".qpoe.com", - ".rebatesrule.net", - ".sellclassics.com", - ".sendsmtp.com", - ".serveuser.com", - ".serveusers.com", - ".sexidude.com", - ".sexxxy.biz", - ".sixth.biz", - ".squirly.info", - ".ssl443.org", - ".toh.info", - ".toythieves.com", - ".trickip.net", - ".trickip.org", - ".vizvaz.com", - ".wha.la", - ".wikaba.com", - ".www1.biz", - ".wwwhost.biz", - "@@|http://xx.wwwhost.biz", - ".x24hr.com", - ".xxuz.com", - ".xxxy.biz", - ".xxxy.info", - ".ygto.com", - ".youdontcare.com", - ".yourtrap.com", - ".zyns.com", - ".zzux.com", - "d1b183sg0nvnuh.cloudfront.net", - "|https://d1b183sg0nvnuh.cloudfront.net", - "d1c37gjwa26taa.cloudfront.net", - "|https://d1c37gjwa26taa.cloudfront.net", - "d3c33hcgiwev3.cloudfront.net", - "|https://d3c33hcgiwev3.cloudfront.net", - "||d3rhr7kgmtrq1v.cloudfront.net", - ".3d-game.com", - ".4irc.com", - ".b0ne.com", - ".chatnook.com", - ".darktech.org", - ".deaftone.com", - ".dtdns.net", - ".effers.com", - ".etowns.net", - ".etowns.org", - ".flnet.org", - ".gotgeeks.com", - ".scieron.com", - ".slyip.com", - ".slyip.net", - ".suroot.com", - ".blogdns.org", - ".dyndns.org", - ".dyndns-ip.com", - ".dyndns-pics.com", - ".from-sd.com", - ".from-pr.com", - ".is-a-hunter.com", - ".dynu.com", - ".dynu.net", - ".freeddns.org", - "cdninstagram.com", - "||cdninstagram.com", - "||facebook.br", - ".facebook.com", - "||facebook.com", - "@@||v6.facebook.com", - "||facebook.design", - "||connect.facebook.net", - "||facebook.hu", - "||facebook.in", - "||facebook.nl", - "||facebook.se", - "||facebookmail.com", - "||fb.com", - "||fb.me", - "||fbcdn.net", - "||fbsbx.com", - "||fbaddins.com", - "||fbworkmail.com", - ".instagram.com", - "||instagram.com", - "||m.me", - "||messenger.com", - "||oculus.com", - "||oculuscdn.com", - "||rocksdb.org", - "@@||ip6.static.sl-reverse.com", - "||thefacebook.com", - "||whatsapp.com", - "||whatsapp.net", - ".ftchinese.com", - "||ftchinese.com", - "||1e100.net", - "||466453.com", - "||abc.xyz", - "||about.google", - "||admob.com", - "||adsense.com", - "||agoogleaday.com", - "||ai.google", - "||ampproject.org", - "@@|https://www.ampproject.org", - "@@|https://cdn.ampproject.org", - "||android.com", - "||androidify.com", - "||androidtv.com", - "||api.ai", - ".appspot.com", - "||appspot.com", - "||autodraw.com", - "||blog.google", - "||blogblog.com", - "blogspot.com", - "/^https?:\\/\\/[^\\/]+blogspot\\.(.*)/", - ".blogspot.hk", - ".blogspot.jp", - ".blogspot.tw", - "||certificate-transparency.org", - "||chrome.com", - "||chromecast.com", - "||chromeexperiments.com", - "||chromercise.com", - "||chromestatus.com", - "||chromium.org", - "||com.google", - "||crbug.com", - "||creativelab5.com", - "||crisisresponse.google", - "||crrev.com", - "||data-vocabulary.org", - "||debug.com", - "||deepmind.com", - "||deja.com", - "||design.google", - "||digisfera.com", - "||dns.google", - "||domains.google", - "||duck.com", - "||environment.google", - "||feedburner.com", - "||firebaseio.com", - "||g.co", - "||gcr.io", - "||get.app", - "||get.dev", - "||get.how", - "||get.page", - "||getmdl.io", - "||getoutline.org", - "||ggpht.com", - "||gmail.com", - "||gmodules.com", - "||godoc.org", - "||golang.org", - "||goo.gl", - ".google.ae", - ".google.as", - ".google.am", - ".google.at", - ".google.az", - ".google.ba", - ".google.be", - ".google.bg", - ".google.ca", - ".google.cd", - ".google.ci", - ".google.co.id", - ".google.co.jp", - ".google.co.kr", - ".google.co.ma", - ".google.co.uk", - ".google.com", - ".google.de", - "||google.dev", - ".google.dj", - ".google.dk", - ".google.es", - ".google.fi", - ".google.fm", - ".google.fr", - ".google.gg", - ".google.gl", - ".google.gr", - ".google.ie", - ".google.is", - ".google.it", - ".google.jo", - ".google.kz", - ".google.lv", - ".google.mn", - ".google.ms", - ".google.nl", - ".google.nu", - ".google.no", - ".google.ro", - ".google.ru", - ".google.rw", - ".google.sc", - ".google.sh", - ".google.sk", - ".google.sm", - ".google.sn", - ".google.tk", - ".google.tm", - ".google.to", - ".google.tt", - ".google.vu", - ".google.ws", - "/^https?:\\/\\/([^\\/]+\\.)*google\\.(ac|ad|ae|af|al|am|as|at|az|ba|be|bf|bg|bi|bj|bs|bt|by|ca|cat|cd|cf|cg|ch|ci|cl|cm|co.ao|co.bw|co.ck|co.cr|co.id|co.il|co.in|co.jp|co.ke|co.kr|co.ls|co.ma|com|com.af|com.ag|com.ai|com.ar|com.au|com.bd|com.bh|com.bn|com.bo|com.br|com.bz|com.co|com.cu|com.cy|com.do|com.ec|com.eg|com.et|com.fj|com.gh|com.gi|com.gt|com.hk|com.jm|com.kh|com.kw|com.lb|com.ly|com.mm|com.mt|com.mx|com.my|com.na|com.nf|com.ng|com.ni|com.np|com.om|com.pa|com.pe|com.pg|com.ph|com.pk|com.pr|com.py|com.qa|com.sa|com.sb|com.sg|com.sl|com.sv|com.tj|com.tr|com.tw|com.ua|com.uy|com.vc|com.vn|co.mz|co.nz|co.th|co.tz|co.ug|co.uk|co.uz|co.ve|co.vi|co.za|co.zm|co.zw|cv|cz|de|dj|dk|dm|dz|ee|es|eu|fi|fm|fr|ga|ge|gg|gl|gm|gp|gr|gy|hk|hn|hr|ht|hu|ie|im|iq|is|it|it.ao|je|jo|kg|ki|kz|la|li|lk|lt|lu|lv|md|me|mg|mk|ml|mn|ms|mu|mv|mw|mx|ne|nl|no|nr|nu|org|pl|pn|ps|pt|ro|rs|ru|rw|sc|se|sh|si|sk|sm|sn|so|sr|st|td|tg|tk|tl|tm|tn|to|tt|us|vg|vn|vu|ws)\\/.*/", - "||googleapis.cn", - "||googleapis.com", - "||googleapps.com", - "||googleartproject.com", - "||googleblog.com", - "||googlebot.com", - "||googlechinawebmaster.com", - "||googlecode.com", - "||googlecommerce.com", - "||googledomains.com", - "||googlearth.com", - "||googleearth.com", - "||googledrive.com", - "||googlegroups.com", - "||googlehosted.com", - "||googleideas.com", - "||googleinsidesearch.com", - "||googlelabs.com", - "||googlemail.com", - "||googlemashups.com", - "||googlepagecreator.com", - "||googleplay.com", - "||googleplus.com", - "||googlescholar.com", - "||googlesource.com", - "||googleusercontent.com", - ".googlevideo.com", - "||googlevideo.com", - "||googleweblight.com", - "||googlezip.net", - "||groups.google.cn", - "||grow.google", - "||gstatic.com", - "||gvt0.com", - "||gvt1.com", - "@@||redirector.gvt1.com", - "||gvt3.com", - "||gwtproject.org", - "||html5rocks.com", - "||iam.soy", - "||igoogle.com", - "||itasoftware.com", - "||lers.google", - "||like.com", - "||madewithcode.com", - "||material.io", - "||nic.google", - "||on2.com", - "||panoramio.com", - "||picasaweb.com", - "||pki.goog", - "||plus.codes", - "||polymer-project.org", - "||pride.google", - "||questvisual.com", - "||admin.recaptcha.net", - "||api.recaptcha.net", - "||api-secure.recaptcha.net", - "||api-verify.recaptcha.net", - "||redhotlabs.com", - "||registry.google", - "||safety.google", - "||savethedate.foo", - "||schema.org", - "||shattered.io", - "|http://sipml5.org/", - "||stories.google", - "||sustainability.google", - "||synergyse.com", - "||teachparentstech.org", - "||tensorflow.org", - "||tfhub.dev", - "||thinkwithgoogle.com", - "||tiltbrush.com", - "||urchin.com", - "||waveprotocol.org", - "||waymo.com", - "||web.dev", - "||webmproject.org", - "||webrtc.org", - "||whatbrowser.org", - "||widevine.com", - "||withgoogle.com", - "||withyoutube.com", - "||x.company", - "||xn--ngstr-lra8j.com", - "||youtu.be", - ".youtube.com", - "||youtube.com", - "||youtube-nocookie.com", - "||youtubeeducation.com", - "||youtubegaming.com", - "||yt.be", - "||ytimg.com", - "||zynamics.com", - "||naughtyamerica.com", - "static01.nyt.com", - "||nyt.com", - "nytchina.com", - "nytcn.me", - "||nytcn.me", - "||nytco.com", - "|http://nyti.ms/", - ".nytimes.com", - "||nytimes.com", - "||nytimg.com", - "userapi.nytlog.com", - "cn.nytstyle.com", - "||nytstyle.com", - ".steamcommunity.com", - "||steamcommunity.com", - "|http://store.steampowered.com/app/333600", - "||t.me", - "||updates.tdesktop.com", - "||telegram.dog", - "||telegram.me", - "||telegram.org", - ".telegramdownload.com", - "||telesco.pe", - "||jtvnw.net", - "||ttvnw.net", - "||twitch.tv", - "||twitchcdn.net", - "||periscope.tv", - ".pscp.tv", - "||pscp.tv", - ".t.co", - "||t.co", - ".tweetdeck.com", - "||tweetdeck.com", - "||twimg.com", - ".twitpic.com", - "||twitpic.com", - ".twitter.com", - "||twitter.com", - "||twitter.jp", - "||vine.co", - "||gov.taipei", - ".gov.tw", - "|https://aiss.anws.gov.tw", - "||archives.gov.tw", - "||tacc.cwb.gov.tw", - "||data.gov.tw", - "||epa.gov.tw", - "||fa.gov.tw", - "||fda.gov.tw", - "||hpa.gov.tw", - "||immigration.gov.tw", - "||itaiwan.gov.tw", - "||mjib.gov.tw", - "||moeaic.gov.tw", - "||mofa.gov.tw", - "||mol.gov.tw", - "||mvdis.gov.tw", - "||nat.gov.tw", - "||nhi.gov.tw", - "||npa.gov.tw", - "||nsc.gov.tw", - "||ntbk.gov.tw", - "||ntbna.gov.tw", - "||ntbt.gov.tw", - "||ntsna.gov.tw", - "||pcc.gov.tw", - "||stat.gov.tw", - "||taipei.gov.tw", - "||taiwanjobs.gov.tw", - "||thb.gov.tw", - "||tipo.gov.tw", - "||wda.gov.tw", - "||teco-hk.org", - "||teco-mo.org", - "@@||aftygh.gov.tw", - "@@||aide.gov.tw", - "@@||tpde.aide.gov.tw", - "@@||arte.gov.tw", - "@@||chukuang.gov.tw", - "@@||cwb.gov.tw", - "@@||cycab.gov.tw", - "@@||dbnsa.gov.tw", - "@@||df.gov.tw", - "@@||eastcoast-nsa.gov.tw", - "@@||erv-nsa.gov.tw", - "@@||grb.gov.tw", - "@@||gysd.nyc.gov.tw", - "@@||hchcc.gov.tw", - "@@||hsinchu-cc.gov.tw", - "@@||iner.gov.tw", - "@@||klsio.gov.tw", - "@@||kmseh.gov.tw", - "@@||lungtanhr.gov.tw", - "@@||maolin-nsa.gov.tw", - "@@||matsu-news.gov.tw", - "@@||matsu-nsa.gov.tw", - "@@||matsucc.gov.tw", - "@@||moe.gov.tw", - "@@||mvdis.gov.tw", - "@@||nankan.gov.tw", - "@@||ncree.gov.tw", - "@@||necoast-nsa.gov.tw", - "@@||siraya-nsa.gov.tw", - "@@||cromotc.nat.gov.tw", - "@@||tax.nat.gov.tw", - "@@||necoast-nsa.gov.tw", - "@@||ner.gov.tw", - "@@||nmmba.gov.tw", - "@@||nmp.gov.tw", - "@@||nmvttc.gov.tw", - "@@||northguan-nsa.gov.tw", - "@@||npm.gov.tw", - "@@||nstm.gov.tw", - "@@||ntdmh.gov.tw", - "@@||ntl.gov.tw", - "@@||ntsec.gov.tw", - "@@||ntuh.gov.tw", - "@@||nvri.gov.tw", - "@@||penghu-nsa.gov.tw", - "@@||post.gov.tw", - "@@||siraya-nsa.gov.tw", - "@@||stdtime.gov.tw", - "@@||sunmoonlake.gov.tw", - "@@||taitung-house.gov.tw", - "@@||taoyuan.gov.tw", - "@@||tphcc.gov.tw", - "@@||trimt-nsa.gov.tw", - "@@||vghtpe.gov.tw", - "@@||vghks.gov.tw", - "@@||vghtc.gov.tw", - "@@||wanfang.gov.tw", - "@@||yatsen.gov.tw", - "@@||yda.gov.tw", - "||kinmen.org.tw", - ".v2ex.com", - "@@|http://v2ex.com", - "@@|http://cdn.v2ex.com", - "@@|http://cn.v2ex.com", - "@@|http://hk.v2ex.com", - "@@|http://i.v2ex.com", - "@@|http://lax.v2ex.com", - "@@|http://neue.v2ex.com", - "@@|http://pagespeed.v2ex.com", - "@@|http://static.v2ex.com", - "@@|http://workspace.v2ex.com", - "@@|http://www.v2ex.com", - "||data.flurry.com", - "page.bid.yahoo.com", - "tw.bid.yahoo.com", - "|https://tw.bid.yahoo.com", - "blogs.yahoo.co.jp", - "||search.yahoo.co.jp", - "buy.yahoo.com.tw/gdsale", - "hk.yahoo.com", - "hk.knowledge.yahoo.com", - "tw.money.yahoo.com", - "hk.myblog.yahoo.com", - "news.yahoo.com/china-blocks-bbc", - "||hk.news.yahoo.com", - "hk.rd.yahoo.com", - "hk.search.yahoo.com/search", - "hk.video.news.yahoo.com/video", - "meme.yahoo.com", - "tw.answers.yahoo.com", - "|https://tw.answers.yahoo.com", - "||tw.knowledge.yahoo.com", - "||tw.mall.yahoo.com", - "tw.yahoo.com", - "||tw.mobi.yahoo.com", - "tw.myblog.yahoo.com", - "||tw.news.yahoo.com", - "pulse.yahoo.com", - "||search.yahoo.com", - "upcoming.yahoo.com", - "video.yahoo.com", - "||yahoo.com.hk", - "||duckduckgo-owned-server.yahoo.net", - ".030buy.com", - ".0rz.tw", - "|http://0rz.tw", - "1-apple.com.tw", - "||1-apple.com.tw", - ".10.tt", - ".100ke.org", - ".1000giri.net", - "||1000giri.net", - ".10conditionsoflove.com", - "||10musume.com", - "123rf.com", - ".12bet.com", - "||12bet.com", - ".12vpn.com", - ".12vpn.net", - "||12vpn.com", - "||12vpn.net", - ".138.com", - "141hongkong.com/forum", - "||141jj.com", - ".141tube.com", - ".1688.com.au", - ".173ng.com", - "||173ng.com", - ".177pic.info", - ".17t17p.com", - "||18board.com", - "||18board.info", - "18onlygirls.com", - ".18p2p.com", - ".18virginsex.com", - ".1949er.org", - "zhao.1984.city", - "||zhao.1984.city", - "1984bbs.com", - "||1984bbs.com", - ".1984bbs.org", - "||1984bbs.org", - ".1991way.com", - "||1991way.com", - ".1998cdp.org", - ".1bao.org", - "|http://1bao.org", - ".1eew.com", - ".1mobile.com", - "|http://*.1mobile.tw", - "||1pondo.tv", - ".2-hand.info", - ".2000fun.com/bbs", - ".2008xianzhang.info", - "||2008xianzhang.info", - "||2017.hk", - "21andy.com/blog", - ".21join.com", - ".21pron.com", - "21sextury.com", - ".228.net.tw", - "||233abc.com", - "||24hrs.ca", - "24smile.org", - "2lipstube.com", - ".2shared.com", - "30boxes.com", - ".315lz.com", - "||32red.com", - "||36rain.com", - ".3a5a.com", - "3arabtv.com", - ".3boys2girls.com", - ".3proxy.ru", - ".3ren.ca", - ".3tui.net", - "||4bluestones.biz", - ".4chan.com", - ".4everproxy.com", - "||4everproxy.com", - "||4rbtv.com", - "||4shared.com", - "taiwannation.50webs.com", - "||51.ca", - "||51jav.org", - ".51luoben.com", - "||51luoben.com", - ".5278.cc", - ".5299.tv", - "5aimiku.com", - "5i01.com", - ".5isotoi5.org", - ".5maodang.com", - "||63i.com", - ".64museum.org", - "64tianwang.com", - "64wiki.com", - ".66.ca", - "666kb.com", - ".6park.com", - "||6park.com", - "||6parker.com", - "||6parknews.com", - "||7capture.com", - ".7cow.com", - ".8-d.com", - "|http://8-d.com", - "85cc.net", - ".85cc.us", - "|http://85cc.us", - "|http://85st.com", - ".881903.com/page/zh-tw/", - "||881903.com", - ".888.com", - ".888poker.com", - "89.64.charter.constitutionalism.solutions", - "89-64.org", - "||89-64.org", - ".8news.com.tw", - ".8z1.net", - "||8z1.net", - ".9001700.com", - "|http://908taiwan.org/", - "||91porn.com", - "||91vps.club", - ".92ccav.com", - ".991.com", - "|http://991.com", - ".99btgc01.com", - "||99btgc01.com", - ".99cn.info", - "|http://99cn.info", - "||9bis.com", - "||9bis.net", - ".tibet.a.se", - "|http://tibet.a.se", - "||a-normal-day.com", - "a5.com.ru", - "|http://aamacau.com", - ".abc.com", - ".abc.net.au", - "||abc.net.au", - ".abchinese.com", - "abclite.net", - "|https://www.abclite.net", - ".ablwang.com", - ".aboluowang.com", - "||aboluowang.com", - ".aboutgfw.com", - ".abs.edu", - ".accim.org", - ".aceros-de-hispania.com", - ".acevpn.com", - "||acevpn.com", - ".acg18.me", - "|http://acg18.me", - "||acgkj.com", - ".acmedia365.com", - ".acnw.com.au", - "actfortibet.org", - "actimes.com.au", - "activpn.com", - "||activpn.com", - "||aculo.us", - "||addictedtocoffee.de", - ".adelaidebbs.com/bbs", - ".adpl.org.hk", - "|http://adpl.org.hk", - ".adult-sex-games.com", - "||adult-sex-games.com", - "adultfriendfinder.com", - "adultkeep.net/peepshow/members/main.htm", - "||advanscene.com", - "||advertfan.com", - ".ae.org", - "||aenhancers.com", - "||af.mil", - ".afantibbs.com", - "|http://afantibbs.com", - ".ai-kan.net", - "||ai-kan.net", - "ai-wen.net", - ".aiph.net", - "||aiph.net", - ".airasia.com", - "||airconsole.com", - "|http://download.aircrack-ng.org", - ".airvpn.org", - "||airvpn.org", - ".aisex.com", - "||ait.org.tw", - "aiweiwei.com", - ".aiweiweiblog.com", - "||aiweiweiblog.com", - "||www.ajsands.com", - "a248.e.akamai.net", - "||a248.e.akamai.net", - "rfalive1.akacast.akamaistream.net", - "voa-11.akacast.akamaistream.net", - "||abematv.akamaized.net", - "||linear-abematv.akamaized.net", - "||vod-abematv.akamaized.net", - "|https://fbcdn*.akamaihd.net/", - "rthklive2-lh.akamaihd.net", - ".akademiye.org/ug", - "|http://akademiye.org/ug", - "||akiba-online.com", - "||akow.org", - ".al-islam.com", - "||al-qimmah.net", - "||alabout.com", - ".alanhou.com", - "|http://alanhou.com", - ".alarab.qa", - "||alasbarricadas.org", - "alexlur.org", - "||alforattv.net", - ".alhayat.com", - ".alicejapan.co.jp", - "aliengu.com", - "||alkasir.com", - "||allconnected.co", - ".alldrawnsex.com", - "||alldrawnsex.com", - ".allervpn.com", - "||allfinegirls.com", - ".allgirlmassage.com", - "allgirlsallowed.org", - ".allgravure.com", - "alliance.org.hk", - ".allinfa.com", - "||allinfa.com", - ".alljackpotscasino.com", - "||allmovie.com", - "||almasdarnews.com", - ".alphaporno.com", - "||alternate-tools.com", - "alternativeto.net/software", - "alvinalexander.com", - "alwaysdata.com", - "||alwaysdata.com", - "||alwaysdata.net", - ".alwaysvpn.com", - "||alwaysvpn.com", - "||am730.com.hk", - "ameblo.jp", - "||ameblo.jp", - "www1.american.edu/ted/ice/tibet", - "||americangreencard.com", - "|http://www.americorps.gov", - "||amiblockedornot.com", - ".amigobbs.net", - ".amitabhafoundation.us", - "|http://amitabhafoundation.us", - ".amnesty.org", - "||amnesty.org", - "||amnesty.org.hk", - ".amnesty.tw", - ".amnestyusa.org", - "||amnestyusa.org", - ".amnyemachen.org", - ".amoiist.com", - ".amtb-taipei.org", - "androidplus.co/apk", - ".andygod.com", - "|http://andygod.com", - "annatam.com/chinese", - "||anchorfree.com", - "||ancsconf.org", - "||andfaraway.net", - "||android-x86.org", - "angelfire.com/hi/hayashi", - "||angularjs.org", - "animecrazy.net", - ".animeshippuuden.com", - "aniscartujo.com", - "||aniscartujo.com", - "||anobii.com", - "anonymise.us", - ".anonymitynetwork.com", - ".anonymizer.com", - ".anonymouse.org", - "||anonymouse.org", - "anontext.com", - ".anpopo.com", - ".answering-islam.org", - "|http://www.antd.org", - "||anthonycalzadilla.com", - ".anti1984.com", - "antichristendom.com", - ".antiwave.net", - "|http://antiwave.net", - ".anyporn.com", - ".anysex.com", - "|http://anysex.com", - "||aobo.com.au", - ".aofriend.com", - "|http://aofriend.com", - ".aofriend.com.au", - ".aojiao.org", - "||aomiwang.com", - "video.ap.org", - ".apetube.com", - "||apiary.io", - ".apigee.com", - "||apigee.com", - "apk-dl.com", - "apkdler.com/apk/view", - ".apkmonk.com/app", - "||apkplz.com", - "apkpure.com", - "||apkpure.com", - ".aplusvpn.com", - ".appdownloader.net/Android", - ".appledaily.com", - "||appledaily.com", - "appledaily.com.hk", - "||appledaily.com.hk", - "appledaily.com.tw", - "||appledaily.com.tw", - ".appshopper.com", - "|http://appshopper.com", - "||appsocks.net", - "||appsto.re", - ".aptoide.com", - "||aptoide.com", - "||archives.gov", - ".archive.fo", - "||archive.fo", - ".archive.is", - "||archive.is", - ".archive.li", - "||archive.li", - "||archive.org", - "archive.today", - "|https://archive.today", - ".arctosia.com", - "|http://arctosia.com", - "||areca-backup.org", - ".arethusa.su", - "||arethusa.su", - "||arlingtoncemetery.mil", - "||army.mil", - ".art4tibet1998.org", - "artofpeacefoundation.org", - "artsy.net", - "||asacp.org", - "asdfg.jp/dabr", - "asg.to", - ".asia-gaming.com", - ".asiaharvest.org", - "||asiaharvest.org", - "asianews.it", - "|http://japanfirst.asianfreeforum.com/", - "||asiansexdiary.com", - "||asianwomensfilm.de", - ".asiatgp.com", - ".asiatoday.us", - "||askstudent.com", - ".askynz.net", - "||askynz.net", - "||assembla.com", - "||astrill.com", - "||atc.org.au", - ".atchinese.com", - "|http://atchinese.com", - "atgfw.org", - ".atlaspost.com", - "||atlaspost.com", - "||atdmt.com", - ".atlanta168.com/forum", - ".atnext.com", - "||atnext.com", - "ice.audionow.com", - ".av.com", - "||av.movie", - ".av-e-body.com", - "avaaz.org", - "||avaaz.org", - ".avbody.tv", - ".avcity.tv", - ".avcool.com", - ".avdb.in", - "||avdb.in", - ".avdb.tv", - "||avdb.tv", - ".avfantasy.com", - "||avg.com", - ".avgle.com", - "||avgle.com", - "||avidemux.org", - "||avoision.com", - ".avyahoo.com", - "||axureformac.com", - ".azerbaycan.tv", - "azerimix.com", - "boxun*.azurewebsites.net", - "||boxun*.azurewebsites.net", - "forum.baby-kingdom.com", - "babynet.com.hk", - "backchina.com", - "||backchina.com", - ".backpackers.com.tw/forum", - "backtotiananmen.com", - ".badiucao.com", - "||badiucao.com", - ".badjojo.com", - "badoo.com", - "|http://*2.bahamut.com.tw", - "||baidu.jp", - ".baijie.org", - "|http://baijie.org", - "||bailandaily.com", - "||baixing.me", - "||bakgeekhome.tk", - ".banana-vpn.com", - "||banana-vpn.com", - ".band.us", - ".bandwagonhost.com", - "||bandwagonhost.com", - ".bangbrosnetwork.com", - ".bangchen.net", - "|http://bangchen.net", - "||bangyoulater.com", - "bannedbook.org", - "||bannedbook.org", - ".bannednews.org", - ".baramangaonline.com", - "|http://baramangaonline.com", - ".barenakedislam.com", - "||barnabu.co.uk", - "||barton.de", - "bartvpn.com", - ".bastillepost.com", - "bayvoice.net", - "||bayvoice.net", - "dajusha.baywords.com", - "||bbchat.tv", - "||bb-chat.tv", - ".bbg.gov", - ".bbkz.com/forum", - ".bbnradio.org", - "bbs-tw.com", - ".bbsdigest.com/thread", - "||bbsfeed.com", - "bbsland.com", - ".bbsmo.com", - ".bbsone.com", - "bbtoystore.com", - ".bcast.co.nz", - ".bcc.com.tw/board", - ".bcchinese.net", - ".bcmorning.com", - "bdsmvideos.net", - ".beaconevents.com", - ".bebo.com", - "||bebo.com", - ".beevpn.com", - "||beevpn.com", - ".behindkink.com", - "||beijing1989.com", - "beijingspring.com", - "||beijingspring.com", - ".beijingzx.org", - "|http://beijingzx.org", - ".belamionline.com", - ".bell.wiki", - "|http://bell.wiki", - "bemywife.cc", - "beric.me", - ".berlintwitterwall.com", - "||berlintwitterwall.com", - ".berm.co.nz", - ".bestforchina.org", - "||bestforchina.org", - ".bestgore.com", - ".bestpornstardb.com", - "||bestvpn.com", - ".bestvpnanalysis.com", - ".bestvpnserver.com", - ".bestvpnservice.com", - ".bestvpnusa.com", - "||bet365.com", - ".betfair.com", - "||betternet.co", - ".bettervpn.com", - "||bettervpn.com", - ".bettween.com", - "||bettween.com", - "||betvictor.com", - ".bewww.net", - ".beyondfirewall.com", - "||bfnn.org", - "||bfsh.hk", - ".bgvpn.com", - "||bgvpn.com", - ".bianlei.com", - "@@||bianlei.com", - "biantailajiao.com", - "biantailajiao.in", - ".biblesforamerica.org", - "|http://biblesforamerica.org", - ".bic2011.org", - "bigfools.com", - "||bigjapanesesex.com", - ".bignews.org", - "||bignews.org", - ".bigsound.org", - ".biliworld.com", - "|http://biliworld.com", - "|http://billypan.com/wiki", - ".binux.me", - "ai.binwang.me/couplet", - "bipic.net", - ".bit.do", - "|http://bit.do", - ".bit.ly", - "|http://bit.ly", - "||bitcointalk.org", - ".bitshare.com", - "||bitshare.com", - "bitsnoop.com", - ".bitvise.com", - "||bitvise.com", - "bizhat.com", - "||bl-doujinsouko.com", - ".bjnewlife.org", - ".bjs.org", - "bjzc.org", - "||bjzc.org", - ".blacklogic.com", - ".blackvpn.com", - "||blackvpn.com", - "blewpass.com", - "tor.blingblingsquad.net", - ".blinkx.com", - "||blinkx.com", - "blinw.com", - ".blip.tv", - "||blip.tv/", - ".blockcn.com", - "||blockcn.com", - "||blockless.com", - "||blog.de", - ".blog.jp", - "|http://blog.jp", - "@@||jpush.cn", - ".blogcatalog.com", - "||blogcatalog.com", - "||blogcity.me", - ".blogger.com", - "||blogger.com", - "blogimg.jp", - "||blog.kangye.org", - ".bloglines.com", - "||bloglines.com", - "||bloglovin.com", - "rconversation.blogs.com", - "blogtd.net", - ".blogtd.org", - "|http://blogtd.org", - "||bloodshed.net", - ".bloomberg.cn", - "||bloomberg.cn", - ".bloomberg.com", - "||bloomberg.com", - "bloomberg.de", - "||bloomberg.de", - "||assets.bwbx.io", - "||bloomfortune.com", - "blueangellive.com", - ".bmfinn.com", - ".bnews.co", - "||bnews.co", - "||bnrmetal.com", - "boardreader.com/thread", - "||boardreader.com", - ".bod.asia", - "|http://bod.asia", - ".bodog88.com", - ".bolehvpn.net", - "||bolehvpn.net", - "bonbonme.com", - ".bonbonsex.com", - ".bonfoundation.org", - ".bongacams.com", - "||boobstagram.com", - "||book.com.tw", - "bookepub.com", - "||books.com.tw", - "||botanwang.com", - ".bot.nu", - ".bowenpress.com", - "||bowenpress.com", - "||app.box.com", - "dl.box.net", - "||dl.box.net", - ".boxpn.com", - "||boxpn.com", - "boxun.com", - "||boxun.com", - ".boxun.tv", - "||boxun.tv", - "boxunblog.com", - "||boxunblog.com", - ".boxunclub.com", - "boyangu.com", - ".boyfriendtv.com", - ".boysfood.com", - "||br.st", - ".brainyquote.com/quotes/authors/d/dalai_lama", - "||brandonhutchinson.com", - "||braumeister.org", - ".bravotube.net", - "||bravotube.net", - ".brazzers.com", - "||brazzers.com", - ".break.com", - "||break.com", - "breakgfw.com", - "||breakgfw.com", - "breaking911.com", - ".breakingtweets.com", - "||breakingtweets.com", - "||breakwall.net", - "briian.com/6511/freegate", - ".briefdream.com/%E7%B4%A0%E6%A3%BA", - "brizzly.com", - "||brizzly.com", - "||brkmd.com", - "broadbook.com", - ".broadpressinc.com", - "||broadpressinc.com", - "bbs.brockbbs.com", - "brucewang.net", - ".brutaltgp.com", - "||brutaltgp.com", - ".bt2mag.com", - "||bt95.com", - ".btaia.com", - ".btbtav.com", - "|http://btdigg.org", - ".btku.me", - "||btku.me", - "||btku.org", - ".btspread.com", - ".btsynckeys.com", - ".budaedu.org", - "||budaedu.org", - ".buddhanet.com.tw/zfrop/tibet", - ".buddhistchannel.tv", - ".buffered.com", - "|http://buffered.com", - ".bullog.org", - "||bullog.org", - ".bullogger.com", - "||bullogger.com", - "bunbunhk.com", - ".busayari.com", - "|http://busayari.com", - ".businessinsider.com/bing-could-be-censoring-search-results-2014", - ".businessinsider.com/china-banks-preparing-for-debt-implosion-2014", - ".businessinsider.com/hong-kong-activists-defy-police-tear-gas-as-protests-continue-overnight-2014", - ".businessinsider.com/internet-outages-reported-in-north-korea-2014", - ".businessinsider.com/iphone-6-is-approved-for-sale-in-china-2014", - ".businessinsider.com/nfl-announcers-surface-tablets-2014", - ".businessinsider.com/panama-papers", - ".businessinsider.com/umbrella-man-hong-kong-2014", - "|http://www.businessinsider.com.au/*", - ".businesstoday.com.tw", - "||businesstoday.com.tw", - ".businessweek.com", - ".busu.org/news", - "|http://busu.org/news", - "busytrade.com", - ".buugaa.com", - ".buzzhand.com", - ".buzzhand.net", - ".buzzorange.com", - "||buzzorange.com", - "||bvpn.com", - "||bwh1.net", - "bwsj.hk", - "||bx.tl", - ".c-spanvideo.org", - "||c-spanvideo.org", - "||c-est-simple.com", - ".c100tibet.org", - "||cablegatesearch.net", - ".cachinese.com", - ".cacnw.com", - "|http://cacnw.com", - ".cactusvpn.com", - "||cactusvpn.com", - ".cafepress.com", - ".cahr.org.tw", - ".calameo.com/books", - "cn.calameo.com", - "|http://cn.calameo.com", - ".calgarychinese.ca", - ".calgarychinese.com", - ".calgarychinese.net", - "|http://blog.calibre-ebook.com", - "|http://google.calstate.edu", - "falun.caltech.edu", - ".its.caltech.edu/~falun/", - ".cam4.com", - ".cam4.jp", - ".cam4.sg", - ".camfrog.com", - "||camfrog.com", - "||cams.com", - ".cams.org.sg", - "canadameet.com", - ".canalporno.com", - "|http://bbs.cantonese.asia/", - ".canyu.org", - "||canyu.org", - ".cao.im", - ".caobian.info", - "||caobian.info", - "caochangqing.com", - "||caochangqing.com", - ".cap.org.hk", - "||cap.org.hk", - ".carabinasypistolas.com", - "cardinalkungfoundation.org", - "carmotorshow.com", - "ss.carryzhou.com", - ".cartoonmovement.com", - "||cartoonmovement.com", - ".casadeltibetbcn.org", - ".casatibet.org.mx", - "|http://casatibet.org.mx", - "cari.com.my", - "||caribbeancom.com", - ".casinoking.com", - ".casinoriva.com", - "||catch22.net", - ".catchgod.com", - "|http://catchgod.com", - "||catfightpayperview.xxx", - ".catholic.org.hk", - "||catholic.org.hk", - "catholic.org.tw", - "||catholic.org.tw", - ".cathvoice.org.tw", - "||cattt.com", - ".cbc.ca", - "||cbc.ca", - ".cbsnews.com/video", - ".cbtc.org.hk", - "||cccat.cc", - "||cccat.co", - ".ccdtr.org", - "||ccdtr.org", - ".cchere.com", - "||cchere.com", - ".ccim.org", - ".cclife.ca", - "cclife.org", - "cclifefl.org", - ".ccthere.com", - "||ccthere.com", - "||ccthere.net", - ".cctmweb.net", - ".cctongbao.com/article/2078732", - "ccue.ca", - "ccue.com", - ".ccvoice.ca", - ".ccw.org.tw", - ".cgdepot.org", - "|http://cgdepot.org", - "||cdbook.org", - ".cdcparty.com", - ".cdef.org", - "||cdef.org", - "||cdig.info", - "cdjp.org", - "||cdjp.org", - ".cdn-apple.com", - "||cdn-apple.com", - ".cdnews.com.tw", - "cdp1989.org", - "cdp1998.org", - "||cdp1998.org", - "cdp2006.org", - "||cdp2006.org", - ".cdpa.url.tw", - "cdpeu.org", - "cdpusa.org", - "cdpweb.org", - "||cdpweb.org", - "cdpwu.org", - "||cdpwu.org", - "||cdw.com", - ".cecc.gov", - "||cecc.gov", - "||cellulo.info", - "||cenews.eu", - "||centerforhumanreprod.com", - "||centralnation.com", - ".centurys.net", - "|http://centurys.net", - ".cfhks.org.hk", - ".cfos.de", - ".cftfc.com", - ".cgst.edu", - ".change.org", - "||change.org", - ".changp.com", - "||changp.com", - ".changsa.net", - "|http://changsa.net", - ".channel8news.sg/news8", - ".chapm25.com", - ".chaturbate.com", - ".chuang-yen.org", - "chengmingmag.com", - ".chenguangcheng.com", - "||chenguangcheng.com", - ".chenpokong.com", - ".chenpokong.net", - "|http://chenpokong.net", - "||cherrysave.com", - ".chhongbi.org", - "chicagoncmtv.com", - "|http://chicagoncmtv.com", - ".china-week.com", - "china101.com", - "||china101.com", - "||china18.org", - "||china21.com", - "china21.org", - "||china21.org", - ".china5000.us", - "chinaaffairs.org", - "||chinaaffairs.org", - "||chinaaid.me", - "chinaaid.us", - "chinaaid.org", - "chinaaid.net", - "chinacomments.org", - "||chinacomments.org", - ".chinachange.org", - "||chinachange.org", - "chinachannel.hk", - "||chinachannel.hk", - ".chinacitynews.be", - ".chinadialogue.net", - ".chinadigitaltimes.net", - "||chinadigitaltimes.net", - ".chinaelections.org", - "||chinaelections.org", - ".chinaeweekly.com", - "||chinaeweekly.com", - "||chinafreepress.org", - ".chinagate.com", - "chinageeks.org", - "chinagfw.org", - "||chinagfw.org", - ".chinagonet.com", - ".chinagreenparty.org", - "||chinagreenparty.org", - ".chinahorizon.org", - "||chinahorizon.org", - ".chinahush.com", - ".chinainperspective.com", - "||chinainterimgov.org", - "chinalaborwatch.org", - "chinalawtranslate.com", - ".chinapost.com.tw/taiwan/national/national-news", - "chinaxchina.com/howto", - "chinalawandpolicy.com", - ".chinamule.com", - "||chinamule.com", - "chinamz.org", - ".chinanewscenter.com", - "|https://chinanewscenter.com", - ".chinapress.com.my", - "||chinapress.com.my", - ".china-review.com.ua", - "|http://china-review.com.ua", - ".chinarightsia.org", - "chinasmile.net/forums", - "chinasocialdemocraticparty.com", - "||chinasocialdemocraticparty.com", - "chinasoul.org", - "||chinasoul.org", - ".chinasucks.net", - "||chinatopsex.com", - ".chinatown.com.au", - "chinatweeps.com", - "chinaway.org", - ".chinaworker.info", - "||chinaworker.info", - "chinayouth.org.hk", - "chinayuanmin.org", - "||chinayuanmin.org", - ".chinese-hermit.net", - "chinese-leaders.org", - "chinese-memorial.org", - ".chinesedaily.com", - "||chinesedailynews.com", - ".chinesedemocracy.com", - "||chinesedemocracy.com", - "||chinesegay.org", - ".chinesen.de", - "||chinesen.de", - ".chinesenews.net.au/", - ".chinesepen.org", - ".chinesetalks.net/ch", - "||chineseupress.com", - ".chingcheong.com", - "||chingcheong.com", - ".chinman.net", - "|http://chinman.net", - "chithu.org", - "|http://chn.chosun.com", - "cnnews.chosun.com/client/news/viw.asp?cate=C01&mcate", - ".chrdnet.com", - "|http://chrdnet.com", - ".christianfreedom.org", - "|http://christianfreedom.org", - "christianstudy.com", - "||christianstudy.com", - "christusrex.org/www1/sdc", - ".chubold.com", - "chubun.com", - "chuizi.net", - "christiantimes.org.hk", - ".chrlawyers.hk", - "|http://chrlawyers.hk", - ".churchinhongkong.org/b5/index.php", - "|http://churchinhongkong.org/b5/index.php", - ".chushigangdrug.ch", - ".cienen.com", - ".cineastentreff.de", - ".cipfg.org", - "||circlethebayfortibet.org", - "||cirosantilli.com", - ".citizencn.com", - "||citizencn.com", - "|http://citizenlab.org", - "|http://www.citizenlab.org", - "||citizenscommission.hk", - ".citizenlab.org", - "citizensradio.org", - ".city365.ca", - "|http://city365.ca", - "city9x.com", - "||citypopulation.de", - ".citytalk.tw/event", - ".civicparty.hk", - "||civicparty.hk", - ".civildisobediencemovement.org", - "civilhrfront.org", - "||civilhrfront.org", - ".civiliangunner.com", - ".civilmedia.tw", - "||civilmedia.tw", - "psiphon.civisec.org", - "||vpn.cjb.net", - ".ck101.com", - "||ck101.com", - ".clarionproject.org/news/islamic-state-isis-isil-propaganda", - "||classicalguitarblog.net", - ".clb.org.hk", - "clearharmony.net", - "clearwisdom.net", - "clinica-tibet.ru", - ".clipfish.de", - "cloakpoint.com", - "||club1069.com", - "cmi.org.tw", - "|http://www.cmoinc.org", - "cmp.hku.hk", - "hkupop.hku.hk", - "||cmule.com", - "||cmule.org", - "||cms.gov", - "|http://vpn.cmu.edu", - "|http://vpn.sv.cmu.edu", - ".cn6.eu", - ".cna.com.tw", - "||cna.com.tw", - ".cnabc.com", - ".cnd.org", - "||cnd.org", - "download.cnet.com", - ".cnex.org.cn", - ".cnineu.com", - "wiki.cnitter.com", - ".cnn.com/video", - ".cnpolitics.org", - "||cnpolitics.org", - ".cn-proxy.com", - "|http://cn-proxy.com", - ".cnproxy.com", - "blog.cnyes.com", - "news.cnyes.com", - "||coat.co.jp", - ".cochina.co", - "||cochina.co", - "||cochina.org", - ".code1984.com/64", - "|http://goagent.codeplex.com", - "||codeshare.io", - "||codeskulptor.org", - "|http://tosh.comedycentral.com", - "comefromchina.com", - "||comefromchina.com", - ".comic-mega.me", - "commandarms.com", - "||commentshk.com", - ".communistcrimes.org", - "||communistcrimes.org", - "||communitychoicecu.com", - "||compileheart.com", - "||conoha.jp", - ".contactmagazine.net", - ".convio.net", - ".coobay.com", - "|http://www.cool18.com/bbs*/", - ".coolaler.com", - "||coolaler.com", - "coolder.com", - "||coolder.com", - "||coolloud.org.tw", - ".coolncute.com", - "||coolstuffinc.com", - "corumcollege.com", - ".cos-moe.com", - "|http://cos-moe.com", - ".cosplayjav.pl", - "|http://cosplayjav.pl", - ".cotweet.com", - "||cotweet.com", - ".coursehero.com", - "||coursehero.com", - "cpj.org", - "||cpj.org", - ".cq99.us", - "|http://cq99.us", - "crackle.com", - "||crackle.com", - ".crazys.cc", - ".crazyshit.com", - "||crchina.org", - "crd-net.org", - "creaders.net", - "||creaders.net", - ".creadersnet.com", - "||cristyli.com", - ".crocotube.com", - "|http://crocotube.com", - ".crossthewall.net", - "||crossthewall.net", - ".crossvpn.net", - "||crossvpn.net", - "||crucial.com", - "csdparty.com", - "||csdparty.com", - "||csuchen.de", - ".csw.org.uk", - ".ct.org.tw", - "||ct.org.tw", - ".ctao.org", - ".ctfriend.net", - ".ctitv.com.tw", - "cts.com.tw", - "|http://library.usc.cuhk.edu.hk/", - "|http://mjlsh.usc.cuhk.edu.hk/", - ".cuhkacs.org/~benng", - ".cuihua.org", - "||cuihua.org", - ".cuiweiping.net", - "||cuiweiping.net", - "||culture.tw", - ".cumlouder.com", - "||cumlouder.com", - "||curvefish.com", - ".cusu.hk", - "||cusu.hk", - ".cutscenes.net", - ".cw.com.tw", - "||cw.com.tw", - "|http://forum.cyberctm.com", - "cyberghostvpn.com", - "||cyberghostvpn.com", - "||cynscribe.com", - "cytode.us", - "||ifan.cz.cc", - "||mike.cz.cc", - "||nic.cz.cc", - ".d-fukyu.com", - "|http://d-fukyu.com", - "cl.d0z.net", - ".d100.net", - "||d100.net", - ".d2bay.com", - "|http://d2bay.com", - ".dabr.co.uk", - "||dabr.co.uk", - "dabr.eu", - "dabr.mobi", - "||dabr.mobi", - "||dabr.me", - "dadazim.com", - "||dadazim.com", - ".dadi360.com", - ".dafabet.com", - "dafagood.com", - "dafahao.com", - ".dafoh.org", - ".daftporn.com", - ".dagelijksestandaard.nl", - ".daidostup.ru", - "|http://daidostup.ru", - ".dailidaili.com", - "||dailidaili.com", - ".dailymotion.com", - "||dailymotion.com", - "daiphapinfo.net", - ".dajiyuan.com", - "||dajiyuan.de", - "dajiyuan.eu", - "dalailama.com", - ".dalailama.mn", - "|http://dalailama.mn", - ".dalailama.ru", - "||dalailama.ru", - "dalailama80.org", - ".dalailama-archives.org", - ".dalailamacenter.org", - "|http://dalailamacenter.org", - "dalailamafellows.org", - ".dalailamafilm.com", - ".dalailamafoundation.org", - ".dalailamahindi.com", - ".dalailamainaustralia.org", - ".dalailamajapanese.com", - ".dalailamaprotesters.info", - ".dalailamaquotes.org", - ".dalailamatrust.org", - ".dalailamavisit.org.nz", - ".dalailamaworld.com", - "||dalailamaworld.com", - "dalianmeng.org", - "||dalianmeng.org", - ".daliulian.org", - "||daliulian.org", - ".danke4china.net", - "||danke4china.net", - ".danwei.org", - "daolan.net", - ".daozhongxing.org", - "darktoy.net", - "||dastrassi.org", - "blog.daum.net/_blog", - ".david-kilgour.com", - "|http://david-kilgour.com", - "daxa.cn", - "||daxa.cn", - "cn.dayabook.com", - ".daylife.com/topic/dalai_lama", - "||db.tt", - ".dbc.hk/main", - "||dcard.tw", - "dcmilitary.com", - ".ddc.com.tw", - ".ddhw.info", - "||de-sci.org", - ".de-sci.org", - "packages.debian.org/zh-cn/lenny/gpass", - "||decodet.co", - ".definebabe.com", - "||delcamp.net", - "delicious.com/GFWbookmark", - ".democrats.org", - "||democrats.org", - ".demosisto.hk", - "||demosisto.hk", - "||desc.se", - "||dessci.com", - ".destroy-china.jp", - "||deutsche-welle.de", - "||devio.us", - "||devpn.com", - "||dfas.mil", - "dfn.org", - "dharmakara.net", - ".dharamsalanet.com", - ".diaoyuislands.org", - "||diaoyuislands.org", - ".difangwenge.org", - "|http://digiland.tw/", - "||digitalnomadsproject.org", - ".diigo.com", - "||diigo.com", - "||dilber.se", - "||furl.net", - ".dipity.com", - "||directcreative.com", - ".discuss.com.hk", - "||discuss.com.hk", - ".discuss4u.com", - "disp.cc", - ".disqus.com", - "||disqus.com", - ".dit-inc.us", - "||dit-inc.us", - ".dizhidizhi.com", - "||dizhuzhishang.com", - "djangosnippets.org", - ".djorz.com", - "||djorz.com", - "||dl-laby.jp", - "||dlsite.com", - "||dlyoutube.com", - "||dmcdn.net", - ".dnscrypt.org", - "||dnscrypt.org", - "||dns2go.com", - "||dnssec.net", - "doctorvoice.org", - ".dogfartnetwork.com/tour", - "gloryhole.com", - ".dojin.com", - ".dok-forum.net", - "||dolc.de", - "||dolf.org.hk", - "||dollf.com", - ".domain.club.tw", - ".domaintoday.com.au", - "chinese.donga.com", - "dongtaiwang.com", - "||dongtaiwang.com", - ".dongtaiwang.net", - "||dongtaiwang.net", - ".dongyangjing.com", - "|http://danbooru.donmai.us", - ".dontfilter.us", - "||dontmovetochina.com", - ".dorjeshugden.com", - ".dotplane.com", - "||dotplane.com", - "||dotsub.com", - ".dotvpn.com", - "||dotvpn.com", - ".doub.io", - "||doub.io", - "||dougscripts.com", - "||douhokanko.net", - "||doujincafe.com", - "dowei.org", - "dphk.org", - "dpp.org.tw", - "||dpp.org.tw", - "||dpr.info", - "||dragonsprings.org", - ".dreamamateurs.com", - ".drepung.org", - "||drgan.net", - ".drmingxia.org", - "|http://drmingxia.org", - "||dropbooks.tv", - "||dropbox.com", - "||api.dropboxapi.com", - "||notify.dropboxapi.com", - "||dropboxusercontent.com", - "drsunacademy.com", - ".drtuber.com", - ".dscn.info", - "|http://dscn.info", - ".dstk.dk", - "|http://dstk.dk", - "||dtiblog.com", - "||dtic.mil", - ".dtwang.org", - ".duanzhihu.com", - ".duckdns.org", - "|http://duckdns.org", - ".duckduckgo.com", - "||duckduckgo.com", - ".duckload.com/download", - "||duckmylife.com", - ".duga.jp", - "|http://duga.jp", - ".duihua.org", - "||duihua.org", - "||duihuahrjournal.org", - ".dunyabulteni.net", - ".duoweitimes.com", - "||duoweitimes.com", - "duping.net", - "||duplicati.com", - "dupola.com", - "dupola.net", - ".dushi.ca", - "||dvorak.org", - ".dw.com", - "||dw.com", - "||dw.de", - ".dw-world.com", - "||dw-world.com", - ".dw-world.de", - "|http://dw-world.de", - "www.dwheeler.com", - "dwnews.com", - "||dwnews.com", - "dwnews.net", - "||dwnews.net", - "xys.dxiong.com", - "||dynawebinc.com", - "||dysfz.cc", - ".dzze.com", - "||e-classical.com.tw", - "||e-gold.com", - ".e-gold.com", - ".e-hentai.org", - "||e-hentai.org", - ".e-hentaidb.com", - "|http://e-hentaidb.com", - "e-info.org.tw", - ".e-traderland.net/board", - ".e-zone.com.hk/discuz", - "|http://e-zone.com.hk/discuz", - ".e123.hk", - "||e123.hk", - ".earlytibet.com", - "|http://earlytibet.com", - ".earthcam.com", - ".earthvpn.com", - "||earthvpn.com", - "eastern-ark.com", - ".easternlightning.org", - ".eastturkestan.com", - "|http://www.eastturkistan.net/", - ".eastturkistan-gov.org", - ".eastturkistancc.org", - ".eastturkistangovernmentinexile.us", - "||eastturkistangovernmentinexile.us", - ".easyca.ca", - ".easypic.com", - ".ebony-beauty.com", - "ebookbrowse.com", - "ebookee.com", - "||ecfa.org.tw", - "ushuarencity.echainhost.com", - "||ecimg.tw", - "ecministry.net", - ".economist.com", - "bbs.ecstart.com", - "edgecastcdn.net", - "||edgecastcdn.net", - "/twimg\\.edgesuite\\.net\\/\\/?appledaily/", - "edicypages.com", - ".edmontonchina.cn", - ".edmontonservice.com", - "edoors.com", - ".edubridge.com", - "||edubridge.com", - ".edupro.org", - "||eevpn.com", - "efcc.org.hk", - ".efukt.com", - "|http://efukt.com", - "||eic-av.com", - "||eireinikotaerukai.com", - ".eisbb.com", - ".eksisozluk.com", - "||eksisozluk.com", - "electionsmeter.com", - "||elgoog.im", - ".ellawine.org", - ".elpais.com", - "||elpais.com", - ".eltondisney.com", - ".emaga.com/info/3407", - "emilylau.org.hk", - ".emanna.com/chineseTraditional", - "bitc.bme.emory.edu/~lzhou/blogs", - ".empfil.com", - ".emule-ed2k.com", - "|http://emule-ed2k.com", - ".emulefans.com", - "|http://emulefans.com", - ".emuparadise.me", - ".enanyang.my", - "||enewstree.com", - ".enfal.de", - "chinese.engadget.com", - "||engagedaily.org", - "englishforeveryone.org", - "||englishfromengland.co.uk", - "englishpen.org", - ".enlighten.org.tw", - "||entermap.com", - ".entnt.com", - "|http://entnt.com", - ".episcopalchurch.org", - ".epochhk.com", - "|http://epochhk.com", - "epochtimes-bg.com", - "||epochtimes-bg.com", - "epochtimes-romania.com", - "||epochtimes-romania.com", - "epochtimes.co.il", - "||epochtimes.co.il", - "epochtimes.co.kr", - "||epochtimes.co.kr", - "epochtimes.com", - "||epochtimes.com", - ".epochtimes.cz", - "epochtimes.de", - "epochtimes.fr", - ".epochtimes.ie", - ".epochtimes.it", - "epochtimes.jp", - "epochtimes.ru", - "epochtimes.se", - "epochtimestr.com", - ".epochweek.com", - "||epochweek.com", - "||epochweekly.com", - ".eporner.com", - ".equinenow.com", - "erabaru.net", - ".eracom.com.tw", - ".eraysoft.com.tr", - ".erepublik.com", - ".erights.net", - "||erights.net", - ".erktv.com", - "|http://erktv.com", - "||ernestmandel.org", - "||erodaizensyu.com", - "||erodoujinlog.com", - "||erodoujinworld.com", - "||eromanga-kingdom.com", - "||eromangadouzin.com", - ".eromon.net", - "|http://eromon.net", - ".eroprofile.com", - ".eroticsaloon.net", - ".eslite.com", - "||eslite.com", - "wiki.esu.im/%E8%9B%A4%E8%9B%A4%E8%AF%AD%E5%BD%95", - ".etaa.org.au", - ".etadult.com", - "etaiwannews.com", - "||etizer.org", - "||etokki.com", - ".ettoday.net/news/20151216/614081", - "etvonline.hk", - ".eu.org", - "||eu.org", - ".eucasino.com", - ".eulam.com", - ".eurekavpt.com", - "||eurekavpt.com", - ".euronews.com", - "||euronews.com", - "eeas.europa.eu/delegations/china/press_corner/all_news/news/2015/20150716_zh", - "eeas.europa.eu/statements-eeas/2015/151022", - ".evschool.net", - "|http://evschool.net", - "||exblog.jp", - "||blog.exblog.co.jp", - "@@||www.exblog.jp", - ".exchristian.hk", - "||exchristian.hk", - "|http://blog.excite.co.jp", - "||exmormon.org", - "||expatshield.com", - ".expecthim.com", - "||expecthim.com", - "experts-univers.com", - "||exploader.net", - ".expressvpn.com", - "||expressvpn.com", - ".extremetube.com", - "eyevio.jp", - "||eyevio.jp", - ".eyny.com", - "||eyny.com", - ".ezpc.tk/category/soft", - ".ezpeer.com", - "||facebookquotes4u.com", - ".faceless.me", - "||faceless.me", - "|http://facesoftibetanselfimmolators.info", - "||facesofnyfw.com", - ".faith100.org", - "|http://faith100.org", - ".faithfuleye.com", - "||faiththedog.info", - ".fakku.net", - ".falsefire.com", - "||falsefire.com", - "falun-co.org", - "falunart.org", - "||falunasia.info", - "|http://falunau.org", - ".falunaz.net", - "falundafa.org", - "falundafa-dc.org", - "||falundafa-florida.org", - "||falundafa-nc.org", - "||falundafa-pa.net", - "||falundafa-sacramento.org", - "falun-ny.net", - "||falundafaindia.org", - "falundafamuseum.org", - ".falungong.club", - ".falungong.de", - "falungong.org.uk", - "||falunhr.org", - "faluninfo.de", - "faluninfo.net", - ".falunpilipinas.net", - "||falunworld.net", - "familyfed.org", - ".fangeming.com", - "||fanglizhi.info", - "||fangong.org", - "fangongheike.com", - ".fanqiang.tk", - "fanqianghou.com", - "||fanqianghou.com", - ".fanqiangzhe.com", - "||fanqiangzhe.com", - "fapdu.com", - "faproxy.com", - ".fawanghuihui.org", - "fanqiangyakexi.net", - "fail.hk", - "||famunion.com", - ".fan-qiang.com", - ".fangbinxing.com", - "||fangbinxing.com", - "fangeming.com", - ".fangmincn.org", - "||fangmincn.org", - ".fanhaodang.com", - "||fanswong.com", - ".fanyue.info", - ".farwestchina.com", - "en.favotter.net", - "nytimes.map.fastly.net", - "||nytimes.map.fastly.net", - "||fast.wistia.com", - "||fastssh.com", - "||faststone.org", - "favstar.fm", - "||favstar.fm", - "faydao.com/weblog", - ".fc2.com", - ".fc2china.com", - ".fc2cn.com", - "||fc2cn.com", - "fc2blog.net", - "|http://uygur.fc2web.com/", - "video.fdbox.com", - ".fdc64.de", - ".fdc64.org", - ".fdc89.jp", - "||fourface.nodesnoop.com", - "||feelssh.com", - "feer.com", - ".feifeiss.com", - "|http://feitianacademy.org", - ".feitian-california.org", - "||feministteacher.com", - ".fengzhenghu.com", - "||fengzhenghu.com", - ".fengzhenghu.net", - "||fengzhenghu.net", - ".fevernet.com", - "|http://ff.im", - "fffff.at", - "fflick.com", - ".ffvpn.com", - "fgmtv.net", - ".fgmtv.org", - ".fhreports.net", - "|http://fhreports.net", - ".figprayer.com", - "||figprayer.com", - ".fileflyer.com", - "||fileflyer.com", - "|http://feeds.fileforum.com", - ".files2me.com", - ".fileserve.com/file", - "fillthesquare.org", - "filmingfortibet.org", - ".filthdump.com", - ".finchvpn.com", - "||finchvpn.com", - "findmespot.com", - "||findyoutube.com", - "||findyoutube.net", - ".fingerdaily.com", - "finler.net", - ".firearmsworld.net", - "|http://firearmsworld.net", - ".fireofliberty.org", - "||fireofliberty.org", - ".firetweet.io", - "||firetweet.io", - ".flagsonline.it", - "fleshbot.com", - ".fleursdeslettres.com", - "|http://fleursdeslettres.com", - "||flgg.us", - "||flgjustice.org", - "||flickr.com", - "||staticflickr.com", - "flickrhivemind.net", - ".flickriver.com", - ".fling.com", - "||flipkart.com", - "||flog.tw", - ".flyvpn.com", - "||flyvpn.com", - "|http://cn.fmnnow.com", - "fofldfradio.org", - "blog.foolsmountain.com", - ".forum4hk.com", - "fangong.forums-free.com", - "pioneer-worker.forums-free.com", - "|https://ss*.4sqi.net", - "video.foxbusiness.com", - "|http://foxgay.com", - "||fringenetwork.com", - "||flecheinthepeche.fr", - ".fochk.org", - "|http://fochk.org", - "||focustaiwan.tw", - ".focusvpn.com", - "||fofg.org", - ".fofg-europe.net", - ".fooooo.com", - "||fooooo.com", - "footwiball.com", - ".fotile.me", - "||fourthinternational.org", - "||foxdie.us", - "||foxsub.com", - "foxtang.com", - ".fpmt.org", - "|http://fpmt.org", - ".fpmt.tw", - ".fpmt-osel.org", - "||fpmtmexico.org", - "fqok.org", - "||fqrouter.com", - "||franklc.com", - ".freakshare.com", - "|http://freakshare.com", - "||free4u.com.ar", - "free-gate.org", - ".free-hada-now.org", - "free-proxy.cz", - ".free.fr/adsl", - "kineox.free.fr", - "tibetlibre.free.fr", - "||freealim.com", - "whitebear.freebearblog.org", - "||freebrowser.org", - ".freechal.com", - ".freedomchina.info", - "||freedomchina.info", - ".freedomhouse.org", - "||freedomhouse.org", - ".freedomsherald.org", - "||freedomsherald.org", - ".freefq.com", - ".freefuckvids.com", - ".freegao.com", - "||freegao.com", - "freeilhamtohti.org", - ".freekwonpyong.org", - "||saveliuxiaobo.com", - ".freelotto.com", - "||freelotto.com", - "freeman2.com", - ".freeopenvpn.com", - "freemoren.com", - "freemorenews.com", - "freemuse.org/archives/789", - "freenet-china.org", - "freenewscn.com", - "cn.freeones.com", - ".freeoz.org/bbs", - "||freeoz.org", - "||freessh.us", - "free4u.com.ar", - ".free-ssh.com", - "||free-ssh.com", - ".freechina.news/", - "||freechinaforum.org", - "||freechinaweibo.com", - ".freedomcollection.org/interviews/rebiya_kadeer", - ".freeforums.org", - "||freenetproject.org", - ".freeoz.org", - ".freetibet.net", - "||freetibet.org", - ".freetibetanheroes.org", - "|http://freetibetanheroes.org", - ".freeviewmovies.com", - ".freevpn.me", - "|http://freevpn.me", - "||freewallpaper4.me", - ".freewebs.com", - ".freewechat.com", - "||freewechat.com", - "freeweibo.com", - "||freeweibo.com", - ".freexinwen.com", - ".freeyoutubeproxy.net", - "||freeyoutubeproxy.net", - "friendfeed.com", - "friendfeed-media.com/e99a4ebe2fb4c1985c2a58775eb4422961aa5a2e", - "friends-of-tibet.org", - ".friendsoftibet.org", - "freechina.net", - "|http://www.zensur.freerk.com/", - "freevpn.nl", - "freeyellow.com", - "hk.frienddy.com/hk", - "|http://adult.friendfinder.com/", - ".fring.com", - "||fring.com", - ".fromchinatousa.net", - "||frommel.net", - ".frontlinedefenders.org", - ".frootvpn.com", - "||frootvpn.com", - "||fscked.org", - ".fsurf.com", - ".ftv.com.tw", - "fucd.com", - ".fuckcnnic.net", - "||fuckcnnic.net", - "fuckgfw.org", - ".fulione.com", - "|https://fulione.com", - "||fullerconsideration.com", - "fulue.com", - ".funf.tw", - "funp.com", - ".fuq.com", - ".furhhdl.org", - "||furinkan.com", - ".futurechinaforum.org", - "||futuremessage.org", - ".fux.com", - ".fuyin.net", - ".fuyindiantai.org", - ".fuyu.org.tw", - "||fw.cm", - ".fxcm-chinese.com", - "||fxcm-chinese.com", - "fzh999.com", - "fzh999.net", - "fzlm.com", - ".g6hentai.com", - "|http://g6hentai.com", - "||g-queen.com", - "||gabocorp.com", - ".gaeproxy.com", - ".gaforum.org", - ".galaxymacau.com", - "||galenwu.com", - ".galstars.net", - "||game735.com", - "gamebase.com.tw", - "gamejolt.com", - "|http://wiki.gamerp.jp", - "||gamer.com.tw", - ".gamer.com.tw", - ".gamez.com.tw", - "||gamez.com.tw", - ".gamousa.com", - ".gaoming.net", - "||gaoming.net", - "ganges.com", - ".gaopi.net", - "|http://gaopi.net", - ".gaozhisheng.org", - ".gaozhisheng.net", - "gardennetworks.com", - "||gardennetworks.org", - "72.52.81.22", - "||gartlive.com", - "||gate-project.com", - "||gather.com", - ".gatherproxy.com", - "gati.org.tw", - ".gaybubble.com", - ".gaycn.net", - ".gayhub.com", - "||gaymap.cc", - ".gaymenring.com", - ".gaytube.com", - "||images-gaytube.com", - ".gaywatch.com", - "|http://gaywatch.com", - ".gazotube.com", - "||gazotube.com", - "||gcc.org.hk", - "||gclooney.com", - "||gcmasia.com", - ".gcpnews.com", - "|http://gcpnews.com", - ".gdbt.net/forum", - "gdzf.org", - "||geek-art.net", - "geekerhome.com/2010/03/xixiang-project-cross-gfw", - "||geekheart.info", - ".gekikame.com", - "|http://gekikame.com", - ".gelbooru.com", - "|http://gelbooru.com", - ".geocities.co.jp", - ".geocities.com/SiliconValley/Circuit/5683/download.html", - "hk.geocities.com", - "geocities.jp", - ".gerefoundation.org", - "||getastrill.com", - ".getchu.com", - ".getcloak.com", - "||getcloak.com", - "||getfoxyproxy.org", - ".getfreedur.com", - "||getgom.com", - ".geti2p.net", - "||geti2p.net", - ".getlantern.org", - "||getlantern.org", - ".getjetso.com/forum", - "getiton.com", - ".getsocialscope.com", - "||getsync.com", - "gfbv.de", - ".gfgold.com.hk", - ".gfsale.com", - "||gfsale.com", - "gfw.org.ua", - ".gfw.press", - "||gfw.press", - ".ggssl.com", - "||ggssl.com", - ".ghostpath.com", - "||ghostpath.com", - "||ghut.org", - ".giantessnight.com", - "|http://giantessnight.com", - ".gifree.com", - "||giga-web.jp", - "tw.gigacircle.com", - "|http://cn.giganews.com/", - "gigporno.ru", - "||girlbanker.com", - ".git.io", - "||git.io", - "|http://softwaredownload.gitbooks.io", - "github.com/getlantern", - "|https://gist.github.com", - "http://cthlo.github.io/hktv", - "hahaxixi.github.io", - "|https://hahaxixi.github.io", - "||haoel.github.io", - "||rg3.github.io", - "||sikaozhe1997.github.io", - "||sodatea.github.io", - "||terminus2049.github.io", - "||toutyrater.github.io", - "wsgzao.github.io", - "|https://wsgzao.github.io", - "||raw.githubusercontent.com", - ".gizlen.net", - "||gizlen.net", - ".gjczz.com", - "||gjczz.com", - "globaljihad.net", - "globalmediaoutreach.com", - "globalmuseumoncommunism.org", - "||globalrescue.net", - ".globaltm.org", - ".globalvoicesonline.org", - "||globalvoicesonline.org", - "||globalvpn.net", - ".glock.com", - "gluckman.com/DalaiLama", - "gmbd.cn", - "||gmhz.org", - "|http://www.gmiddle.com", - "|http://www.gmiddle.net", - ".gmll.org", - "||gnci.org.hk", - "go-pki.com", - "||goagent.biz", - "||goagentplus.com", - "gobet.cc", - "godfootsteps.org", - "||godfootsteps.org", - "godns.work", - "godsdirectcontact.co.uk", - ".godsdirectcontact.org", - "godsdirectcontact.org.tw", - ".godsimmediatecontact.com", - ".gogotunnel.com", - "||gohappy.com.tw", - ".gokbayrak.com", - ".goldbet.com", - "||goldbetsports.com", - "||goldeneyevault.com", - ".goldenfrog.com", - "||goldenfrog.com", - ".goldjizz.com", - "|http://goldjizz.com", - ".goldstep.net", - "||goldwave.com", - "gongmeng.info", - "gongm.in", - "gongminliliang.com", - ".gongwt.com", - "|http://gongwt.com", - "blog.goo.ne.jp/duck-tail_2009", - ".gooday.xyz", - "|http://gooday.xyz", - ".goodreads.com", - "||goodreads.com", - ".goodreaders.com", - "||goodreaders.com", - ".goodtv.com.tw", - ".goodtv.tv", - "||goofind.com", - ".googlesile.com", - ".gopetition.com", - "||gopetition.com", - ".goproxing.net", - ".gotrusted.com", - "||gotrusted.com", - "||gotw.ca", - "||grammaly.com", - "grandtrial.org", - ".graphis.ne.jp", - "||graphis.ne.jp", - "||graphql.org", - "greatfirewall.biz", - "||greatfirewallofchina.net", - ".greatfirewallofchina.org", - "||greatfirewallofchina.org", - "||greenfieldbookstore.com.hk", - ".greenparty.org.tw", - "||greenpeace.org", - ".greenreadings.com/forum", - "great-firewall.com", - "great-roc.org", - "greatroc.org", - "greatzhonghua.org", - ".greenpeace.com.tw", - ".greenvpn.net", - "||greenvpn.net", - ".greenvpn.org", - "||grotty-monday.com", - "gs-discuss.com", - "||gtricks.com", - "guancha.org", - "guaneryu.com", - ".guardster.com", - ".gun-world.net", - "gunsandammo.com", - "||gutteruncensored.com", - "||gvm.com.tw", - ".gzm.tv", - "||gzone-anime.info", - "||clementine-player.org", - "echofon.com", - "||greasespot.net", - "||www.klip.me", - "@@||site.locql.com", - "||stephaniered.com", - "@@||download.syniumsoftware.com", - "|http://ub0.cc", - "wozy.in", - "gospelherald.com", - "||gospelherald.com", - "|http://hk.gradconnection.com/", - "||grangorz.org", - "greatfire.org", - "||greatfire.org", - "greatfirewallofchina.org", - "||greatroc.tw", - ".gts-vpn.com", - "|http://gts-vpn.com", - ".gu-chu-sum.org", - "|http://gu-chu-sum.org", - ".guaguass.com", - "|http://guaguass.com", - ".guaguass.org", - "|http://guaguass.org", - ".guangming.com.my", - "guishan.org", - "||guishan.org", - ".gumroad.com", - "||gumroad.com", - "||gunsamerica.com", - "guruonline.hk", - "|http://gvlib.com", - ".gyalwarinpoche.com", - ".gyatsostudio.com", - ".h528.com", - ".h5dm.com", - ".h5galgame.me", - "||h-china.org", - ".h-moe.com", - "|http://h-moe.com", - "h1n1china.org", - ".hacg.club", - "||hacg.club", - ".hacg.in", - "|http://hacg.in", - ".hacg.li", - "|http://hacg.li", - ".hacg.me", - "|http://hacg.me", - ".hacg.red", - "|http://hacg.red", - ".hacken.cc/bbs", - ".hacker.org", - "||hackthatphone.net", - "hahlo.com", - "||hakkatv.org.tw", - ".handcraftedsoftware.org", - "|http://bbs.hanminzu.org/", - ".hanunyi.com", - ".hao.news/news", - "|http://ae.hao123.com", - "|http://ar.hao123.com", - "|http://br.hao123.com", - "|http://en.hao123.com", - "|http://id.hao123.com", - "|http://jp.hao123.com", - "|http://ma.hao123.com", - "|http://mx.hao123.com", - "|http://sa.hao123.com", - "|http://th.hao123.com", - "|http://tw.hao123.com", - "|http://vn.hao123.com", - "|http://hk.hao123img.com", - "|http://ld.hao123img.com", - "||happy-vpn.com", - ".haproxy.org", - "||hardsextube.com", - ".harunyahya.com", - "|http://harunyahya.com", - "bbs.hasi.wang", - "have8.com", - "@@||haygo.com", - ".hclips.com", - "||hdlt.me", - "||hdtvb.net", - ".hdzog.com", - "|http://hdzog.com", - "||heartyit.com", - ".heavy-r.com", - ".hec.su", - "|http://hec.su", - ".hecaitou.net", - "||hecaitou.net", - ".hechaji.com", - "||hechaji.com", - "||heeact.edu.tw", - ".hegre-art.com", - "|http://hegre-art.com", - "||cdn.helixstudios.net", - "||helplinfen.com", - "||helloandroid.com", - "||helloqueer.com", - ".helloss.pw", - "hellotxt.com", - "||hellotxt.com", - ".hentai.to", - ".hellouk.org/forum/lofiversion", - ".helpeachpeople.com", - "||helpeachpeople.com", - "||helpster.de", - ".helpzhuling.org", - "hentaitube.tv", - ".hentaivideoworld.com", - "||id.heroku.com", - "heqinglian.net", - "||heungkongdiscuss.com", - ".hexieshe.com", - "||hexieshe.com", - "||hexieshe.xyz", - "||hexxeh.net", - "app.heywire.com", - ".heyzo.com", - ".hgseav.com", - ".hhdcb3office.org", - ".hhthesakyatrizin.org", - "hi-on.org.tw", - "hidden-advent.org", - "||hidden-advent.org", - "hidecloud.com/blog/2008/07/29/fuck-beijing-olympics.html", - "||hide.me", - ".hidein.net", - ".hideipvpn.com", - "||hideipvpn.com", - ".hideman.net", - "||hideman.net", - "hideme.nl", - "||hidemy.name", - ".hidemyass.com", - "||hidemyass.com", - "hidemycomp.com", - "||hidemycomp.com", - ".hihiforum.com", - ".hihistory.net", - "||hihistory.net", - ".higfw.com", - "highpeakspureearth.com", - "||highrockmedia.com", - "||hiitch.com", - "||hikinggfw.org", - ".hilive.tv", - ".himalayan-foundation.org", - "himalayanglacier.com", - ".himemix.com", - "||himemix.com", - ".himemix.net", - "times.hinet.net", - ".hitomi.la", - "|http://hitomi.la", - ".hiwifi.com", - "@@||hiwifi.com", - "hizbuttahrir.org", - "hizb-ut-tahrir.info", - "hizb-ut-tahrir.org", - ".hjclub.info", - ".hk-pub.com/forum", - "|http://hk-pub.com", - ".hk01.com", - "||hk01.com", - ".hk32168.com", - "||hk32168.com", - "||hkacg.com", - "||hkacg.net", - ".hkatvnews.com", - "hkbc.net", - ".hkbf.org", - ".hkbookcity.com", - "||hkbookcity.com", - ".hkchurch.org", - "hkci.org.hk", - ".hkcmi.edu", - "||hkcnews.com", - "||hkcoc.com", - "hkday.net", - ".hkdailynews.com.hk/china.php", - "hkdf.org", - ".hkej.com", - ".hkepc.com/forum/viewthread.php?tid=1153322", - "china.hket.com", - "||hkfaa.com", - "hkfreezone.com", - "hkfront.org", - "m.hkgalden.com", - "|https://m.hkgalden.com", - ".hkgreenradio.org/home", - ".hkheadline.com*blog", - ".hkheadline.com/instantnews", - "hkhkhk.com", - "hkhrc.org.hk", - "hkhrm.org.hk", - "||hkip.org.uk", - "1989report.hkja.org.hk", - "hkjc.com", - ".hkjp.org", - ".hklft.com", - ".hklts.org.hk", - "||hklts.org.hk", - "news.hkpeanut.com", - "hkptu.org", - ".hkreporter.com", - "||hkreporter.com", - "|http://hkupop.hku.hk/", - ".hkusu.net", - "||hkusu.net", - ".hkvwet.com", - ".hkwcc.org.hk", - "||hkzone.org", - ".hmonghot.com", - "|http://hmonghot.com", - ".hmv.co.jp/", - "hnjhj.com", - "||hnjhj.com", - ".hnntube.com", - "||hola.com", - "||hola.org", - "holymountaincn.com", - "holyspiritspeaks.org", - "||holyspiritspeaks.org", - "||derekhsu.homeip.net", - ".homeperversion.com", - "|http://homeservershow.com", - "|http://old.honeynet.org/scans/scan31/sub/doug_eric/spam_translation.html", - ".hongkongfp.com", - "||hongkongfp.com", - "hongmeimei.com", - "||hongzhi.li", - ".hootsuite.com", - "||hootsuite.com", - ".hopedialogue.org", - "|http://hopedialogue.org", - ".hopto.org", - ".hornygamer.com", - ".hornytrip.com", - "|http://hornytrip.com", - ".hotav.tv", - ".hotels.cn", - "hotfrog.com.tw", - "hotgoo.com", - ".hotpornshow.com", - "hotpot.hk", - ".hotshame.com", - "||hotspotshield.com", - ".hotvpn.com", - "||hotvpn.com", - "||hougaige.com", - "||howtoforge.com", - "||hoxx.com", - ".hqcdp.org", - "||hqcdp.org", - "||hqjapanesesex.com", - "hqmovies.com", - ".hrcir.com", - ".hrcchina.org", - ".hrea.org", - ".hrichina.org", - "||hrichina.org", - ".hrtsea.com", - ".hrw.org", - "||hrw.org", - "hrweb.org", - "||hsjp.net", - "||hsselite.com", - "|http://hst.net.tw", - ".hstern.net", - ".hstt.net", - ".htkou.net", - "||htkou.net", - ".hua-yue.net", - ".huaglad.com", - "||huaglad.com", - ".huanghuagang.org", - "||huanghuagang.org", - ".huangyiyu.com", - ".huaren.us", - "||huaren.us", - ".huaren4us.com", - ".huashangnews.com", - "|http://huashangnews.com", - "bbs.huasing.org", - "huaxia-news.com", - "huaxiabao.org", - "huaxin.ph", - "||huayuworld.org", - ".huffingtonpost.com/rebiya-kadeer", - "||hugoroy.eu", - "||huhaitai.com", - "||huhamhire.com", - "huiyi.in", - ".hulkshare.com", - "humanrightsbriefing.org", - "||hung-ya.com", - "||hungerstrikeforaids.org", - "||huping.net", - "hurgokbayrak.com", - ".hurriyet.com.tr", - ".hut2.ru", - "||hutianyi.net", - "hutong9.net", - "huyandex.com", - ".hwadzan.tw", - "||hwayue.org.tw", - "||hwinfo.com", - "||hxwk.org", - "hxwq.org", - "||hyperrate.com", - "ebook.hyread.com.tw", - "||ebook.hyread.com.tw", - "||i1.hk", - "||i2p2.de", - "||i2runner.com", - "||i818hk.com", - ".i-cable.com", - ".i-part.com.tw", - ".iamtopone.com", - "iask.ca", - "||iask.ca", - "iask.bz", - "||iask.bz", - ".iav19.com", - "ibiblio.org/pub/packages/ccic", - ".iblist.com", - "||iblogserv-f.net", - "ibros.org", - "|http://cn.ibtimes.com", - ".ibvpn.com", - "||ibvpn.com", - "icams.com", - "blogs.icerocket.com/tag", - ".icij.org", - "||icij.org", - "||icl-fi.org", - ".icoco.com", - "||icoco.com", - "||furbo.org", - "||warbler.iconfactory.net", - "||iconpaper.org", - "||icu-project.org", - "w.idaiwan.com/forum", - "||iddddg.com", - "idemocracy.asia", - ".identi.ca", - "||identi.ca", - "||idiomconnection.com", - "|http://www.idlcoyote.com", - ".idouga.com", - ".idreamx.com", - "forum.idsam.com", - ".idv.tw", - ".ieasy5.com", - "|http://ieasy5.com", - ".ied2k.net", - ".ienergy1.com", - "|http://if.ttt/", - "ifanqiang.com", - ".ifcss.org", - "||ifcss.org", - "ifjc.org", - ".ift.tt", - "|http://ift.tt", - "||ifreewares.com", - "||igcd.net", - ".igfw.net", - "||igfw.net", - ".igfw.tech", - "||igfw.tech", - ".igmg.de", - "||ignitedetroit.net", - ".igotmail.com.tw", - "||igvita.com", - "||ihakka.net", - ".ihao.org/dz5", - "||iicns.com", - ".ikstar.com", - "||illusionfactory.com", - "||ilove80.be", - "||im.tv", - "@@||myvlog.im.tv", - "||im88.tw", - ".imgchili.net", - "|http://imgchili.net", - ".imageab.com", - ".imagefap.com", - "||imagefap.com", - "||imageflea.com", - "imageshack.us", - "||imagevenue.com", - "||imagezilla.net", - ".imb.org", - "|http://imb.org", - "|http://www.imdb.com/name/nm0482730", - ".imdb.com/title/tt0819354", - ".imdb.com/title/tt1540068", - ".imdb.com/title/tt4908644", - ".img.ly", - "||img.ly", - ".imgur.com", - "||imgur.com", - ".imkev.com", - "||imkev.com", - ".imlive.com", - ".immoral.jp", - "impact.org.au", - "impp.mn", - "|http://tech2.in.com/video/", - "in99.org", - "in-disguise.com", - ".incapdns.net", - ".incloak.com", - "||incloak.com", - "||incredibox.fr", - "||indiandefensenews.in", - "timesofindia.indiatimes.com/dalai", - "timesofindia.indiatimes.com/defaultinterstitial.cms", - ".indiemerch.com", - "||indiemerch.com", - "info-graf.fr", - "website.informer.com", - ".initiativesforchina.org", - ".inkui.com", - ".inmediahk.net", - "||inmediahk.net", - "||innermongolia.org", - "|http://blog.inoreader.com", - ".inote.tw", - ".insecam.org", - "|http://insecam.org", - "||insidevoa.com", - ".institut-tibetain.org", - "|http://internet.org/", - "internetdefenseleague.org", - "internetfreedom.org", - "||internetpopculture.com", - ".inthenameofconfuciusmovie.com", - "||inthenameofconfuciusmovie.com", - "inxian.com", - "||inxian.com", - "ipalter.com", - ".ipfire.org", - "||iphone4hongkong.com", - "||iphonehacks.com", - "||iphonetaiwan.org", - "||iphonix.fr", - "||ipicture.ru", - ".ipjetable.net", - "||ipjetable.net", - ".ipobar.com/read.php?", - "ipoock.com/img", - ".iportal.me", - "|http://iportal.me", - "||ippotv.com", - ".ipredator.se", - "||ipredator.se", - ".iptv.com.tw", - "||iptvbin.com", - "||ipvanish.com", - "iredmail.org", - "chinese.irib.ir", - "||ironbigfools.compython.net", - "||ironpython.net", - ".ironsocket.com", - "||ironsocket.com", - ".is.gd", - ".islahhaber.net", - ".islam.org.hk", - "|http://islam.org.hk", - ".islamawareness.net/Asia/China", - ".islamhouse.com", - "||islamhouse.com", - ".islamicity.com", - ".islamicpluralism.org", - ".islamtoday.net", - ".isaacmao.com", - "||isaacmao.com", - "||isgreat.org", - "||ismaelan.com", - ".ismalltits.com", - "||ismprofessional.net", - "isohunt.com", - "||israbox.com", - ".issuu.com", - "||issuu.com", - ".istars.co.nz", - "oversea.istarshine.com", - "||oversea.istarshine.com", - "blog.istef.info/2007/10/21/myentunnel", - ".istiqlalhewer.com", - ".istockphoto.com", - "isunaffairs.com", - "isuntv.com", - "itaboo.info", - "||itaboo.info", - ".italiatibet.org", - "download.ithome.com.tw", - "ithelp.ithome.com.tw", - "||itshidden.com", - ".itsky.it", - ".itweet.net", - "|http://itweet.net", - ".iu45.com", - ".iuhrdf.org", - "||iuhrdf.org", - ".iuksky.com", - ".ivacy.com", - "||ivacy.com", - ".iverycd.com", - ".ivpn.net", - "||ixquick.com", - ".ixxx.com", - "iyouport.com", - "||iyouport.com", - ".izaobao.us", - "||gmozomg.izihost.org", - ".izles.net", - ".izlesem.org", - "||j.mp", - "blog.jackjia.com", - "jamaat.org", - ".jamyangnorbu.com", - "|http://jamyangnorbu.com", - ".jandyx.com", - "||janwongphoto.com", - "||japan-whores.com", - ".jav.com", - ".jav101.com", - ".jav2be.com", - "||jav2be.com", - ".jav68.tv", - ".javakiba.org", - "|http://javakiba.org", - ".javbus.com", - "||javbus.com", - "||javfor.me", - ".javhd.com", - ".javhip.com", - ".javmobile.net", - "|http://javmobile.net", - ".javmoo.com", - ".javseen.com", - "|http://javseen.com", - "jbtalks.cc", - "jbtalks.com", - "jbtalks.my", - ".jdwsy.com", - "jeanyim.com", - "||jfqu36.club", - "||jfqu37.xyz", - "||jgoodies.com", - ".jiangweiping.com", - "||jiangweiping.com", - "||jiaoyou8.com", - ".jiehua.cz", - "||hk.jiepang.com", - "||tw.jiepang.com", - "jieshibaobao.com", - ".jigglegifs.com", - "56cun04.jigsy.com", - "jigong1024.com", - "daodu14.jigsy.com", - "specxinzl.jigsy.com", - "wlcnew.jigsy.com", - ".jihadology.net", - "|http://jihadology.net", - "jinbushe.org", - "||jinbushe.org", - ".jingsim.org", - "zhao.jinhai.de", - "jingpin.org", - "||jingpin.org", - "jinpianwang.com", - ".jinroukong.com", - "ac.jiruan.net", - "||jitouch.com", - ".jizzthis.com", - "jjgirls.com", - ".jkb.cc", - "|http://jkb.cc", - "jkforum.net", - "||jma.go.jp", - "research.jmsc.hku.hk/social", - "weiboscope.jmsc.hku.hk", - ".jmscult.com", - "|http://jmscult.com", - "||joachims.org", - "||jobso.tv", - ".sunwinism.joinbbs.net", - ".journalchretien.net", - "||journalofdemocracy.org", - ".joymiihub.com", - ".joyourself.com", - "jpopforum.net", - "||fiddle.jshell.net", - ".jubushoushen.com", - "||jubushoushen.com", - ".juhuaren.com", - "||juliereyc.com", - "||junauza.com", - ".june4commemoration.org", - ".junefourth-20.net", - "||junefourth-20.net", - "||bbs.junglobal.net", - ".juoaa.com", - "|http://juoaa.com", - "justfreevpn.com", - ".justicefortenzin.org", - "justpaste.it", - "justtristan.com", - "juyuange.org", - "juziyue.com", - "||juziyue.com", - "||jwmusic.org", - "@@||music.jwmusic.org", - ".jyxf.net", - "||k-doujin.net", - "||ka-wai.com", - ".kagyu.org", - "||kagyu.org.za", - ".kagyumonlam.org", - ".kagyunews.com.hk", - ".kagyuoffice.org", - "||kagyuoffice.org", - "||kagyuoffice.org.tw", - ".kaiyuan.de", - ".kakao.com", - "||kakao.com", - ".kalachakralugano.org", - ".kankan.today", - ".kannewyork.com", - "||kannewyork.com", - ".kanshifang.com", - "||kanshifang.com", - "||kantie.org", - "kanzhongguo.com", - "kanzhongguo.eu", - ".kaotic.com", - "||karayou.com", - "karkhung.com", - ".karmapa.org", - ".karmapa-teachings.org", - "||kawase.com", - ".kba-tx.org", - ".kcoolonline.com", - ".kebrum.com", - "||kebrum.com", - ".kechara.com", - ".keepandshare.com/visit/visit_page.php?i=688154", - ".keezmovies.com", - ".kendincos.net", - ".kenengba.com", - "||kenengba.com", - "||keontech.net", - ".kepard.com", - "||kepard.com", - "wiki.keso.cn/Home", - "||keycdn.com", - ".khabdha.org", - ".khmusic.com.tw", - "||kichiku-doujinko.com", - ".kik.com", - "||kik.com", - "bbs.kimy.com.tw", - ".kindleren.com", - "|http://kindleren.com", - "|http://www.kindleren.com", - ".kingdomsalvation.org", - "||kingdomsalvation.org", - "kinghost.com", - "||kingstone.com.tw", - ".kink.com", - ".kinokuniya.com", - "||kinokuniya.com", - "killwall.com", - "||killwall.com", - "||kinmen.travel", - ".kir.jp", - ".kissbbao.cn", - "|http://kiwi.kz", - "||kk-whys.co.jp", - ".kmuh.org.tw", - ".knowledgerush.com/kr/encyclopedia", - ".kobo.com", - "||kobo.com", - ".kobobooks.com", - "||kobobooks.com", - "||kodingen.com", - "@@||www.kodingen.com", - "||kompozer.net", - ".konachan.com", - "|http://konachan.com", - ".kone.com", - "||koolsolutions.com", - ".koornk.com", - "||koornk.com", - "||koranmandarin.com", - ".korenan2.com", - "|http://gojet.krtco.com.tw", - ".ksdl.org", - ".ksnews.com.tw", - "||ktzhk.com", - ".kui.name/event", - "kun.im", - ".kurashsultan.com", - "||kurtmunger.com", - "kusocity.com", - "||kwcg.ca", - "kwongwah.com.my", - ".kxsw.life", - "||kxsw.life", - ".kyofun.com", - "kyohk.net", - "||kyoyue.com", - ".kyzyhello.com", - "||kyzyhello.com", - ".kzeng.info", - "||kzeng.info", - "la-forum.org", - "ladbrokes.com", - "||labiennale.org", - ".lagranepoca.com", - "||lagranepoca.com", - ".lalulalu.com", - ".lama.com.tw", - "||lama.com.tw", - ".lamayeshe.com", - "|http://lamayeshe.com", - "|http://www.lamenhu.com", - ".lamnia.co.uk", - "||lamnia.co.uk", - "lamrim.com", - ".lanterncn.cn", - "|http://lanterncn.cn", - ".lantosfoundation.org", - ".laod.cn", - "|http://laod.cn", - "laogai.org", - "||laogai.org", - "laomiu.com", - ".laoyang.info", - "|http://laoyang.info", - "||laptoplockdown.com", - ".laqingdan.net", - "||laqingdan.net", - "||larsgeorge.com", - ".lastcombat.com", - "|http://lastcombat.com", - "||lastfm.es", - "latelinenews.com", - ".latibet.org", - "||le-vpn.com", - ".leafyvpn.net", - "||leafyvpn.net", - "leeao.com.cn/bbs/forum.php", - "lefora.com", - "||left21.hk", - ".legalporno.com", - ".legsjapan.com", - "|http://leirentv.ca", - "leisurecafe.ca", - "||lematin.ch", - ".lemonde.fr", - "||lenwhite.com", - "lerosua.org", - "||lerosua.org", - "blog.lester850.info", - "||lesoir.be", - ".letou.com", - "letscorp.net", - "||letscorp.net", - "||ss.levyhsu.com", - "||cdn.assets.lfpcontent.com", - ".lhakar.org", - "|http://lhakar.org", - ".lhasocialwork.org", - ".liangyou.net", - "||liangyou.net", - ".lianyue.net", - "||liaowangxizang.net", - ".liaowangxizang.net", - "||liberal.org.hk", - ".libertytimes.com.tw", - "blogs.libraryinformationtechnology.com/jxyz", - ".lidecheng.com/blog/fucking-gfw", - ".lighten.org.tw", - ".lightnovel.cn", - "@@|https://www.lightnovel.cn", - "limiao.net", - "linkuswell.com", - "abitno.linpie.com/use-ipv6-to-fuck-gfw", - "||line.me", - "||line-apps.com", - ".linglingfa.com", - "||lingvodics.com", - ".link-o-rama.com", - "|http://link-o-rama.com", - ".linkideo.com", - "||api.linksalpha.com", - "||apidocs.linksalpha.com", - "||www.linksalpha.com", - "||help.linksalpha.com", - "||linux.org.hk", - "linuxtoy.org/archives/installing-west-chamber-on-ubuntu", - ".lionsroar.com", - ".lipuman.com", - "||liquidvpn.com", - "||greatfire.us7.list-manage.com", - "||listentoyoutube.com", - "listorious.com", - ".liu-xiaobo.org", - "||liudejun.com", - ".liuhanyu.com", - ".liujianshu.com", - "||liujianshu.com", - ".liuxiaobo.net", - "|http://liuxiaobo.net", - "liuxiaotong.com", - "||liuxiaotong.com", - ".livedoor.jp", - ".liveleak.com", - "||liveleak.com", - ".livestation.com", - "livestream.com", - "||livestream.com", - "||livingonline.us", - "||livingstream.com", - "||livevideo.com", - ".livevideo.com", - ".liwangyang.com", - "lizhizhuangbi.com", - "lkcn.net", - ".llss.me/", - ".load.to", - ".lobsangwangyal.com", - ".localdomain.ws", - "||localdomain.ws", - "localpresshk.com", - "||lockestek.com", - "logbot.net", - "||logiqx.com", - "secure.logmein.com", - "||secure.logmein.com", - ".londonchinese.ca", - ".longhair.hk", - "longmusic.com", - "||longtermly.net", - "||lookpic.com", - ".looktoronto.com", - "|http://looktoronto.com", - ".lotsawahouse.org/tibetan-masters/fourteenth-dalai-lama", - ".lotuslight.org.hk", - ".lotuslight.org.tw", - "hkreporter.loved.hk", - "||lpsg.com", - "||lrfz.com", - ".lrip.org", - "||lrip.org", - ".lsd.org.hk", - "||lsd.org.hk", - "lsforum.net", - ".lsm.org", - "||lsm.org", - ".lsmchinese.org", - "||lsmchinese.org", - ".lsmkorean.org", - "||lsmkorean.org", - ".lsmradio.com/rad_archives", - ".lsmwebcast.com", - ".ltn.com.tw", - "||ltn.com.tw", - ".luke54.com", - ".luke54.org", - ".lupm.org", - "||lupm.org", - "||lushstories.com", - "luxebc.com", - "lvhai.org", - "||lvhai.org", - "||lvv2.com", - ".lyfhk.net", - "|http://lyfhk.net", - ".lzmtnews.org", - "||lzmtnews.org", - "http://*.m-team.cc", - ".macrovpn.com", - "macts.com.tw", - "||mad-ar.ch", - "||madrau.com", - "||madthumbs.com", - "||magic-net.info", - "mahabodhi.org", - "my.mail.ru", - ".maiplus.com", - "|http://maiplus.com", - ".maizhong.org", - "makkahnewspaper.com", - ".mamingzhe.com", - "manicur4ik.ru", - ".maplew.com", - "|http://maplew.com", - "||marc.info", - "marguerite.su", - "||martincartoons.com", - "maskedip.com", - ".maiio.net", - ".mail-archive.com", - ".malaysiakini.com", - "||makemymood.com", - ".manchukuo.net", - ".maniash.com", - "|http://maniash.com", - ".mansion.com", - ".mansionpoker.com", - "||martau.com", - "|http://blog.martinoei.com", - ".martsangkagyuofficial.org", - "|http://martsangkagyuofficial.org", - "maruta.be/forget", - ".marxist.com", - "||marxist.net", - ".marxists.org/chinese", - "||matainja.com", - "||mathable.io", - "||mathiew-badimon.com", - "||matsushimakaede.com", - "|http://maturejp.com", - "mayimayi.com", - ".maxing.jp", - ".mcaf.ee", - "|http://mcaf.ee", - "||mcadforums.com", - "mcfog.com", - "mcreasite.com", - ".md-t.org", - "||md-t.org", - "||meansys.com", - ".media.org.hk", - ".mediachinese.com", - "||mediachinese.com", - ".mediafire.com/?", - ".mediafire.com/download", - ".mediafreakcity.com", - "||mediafreakcity.com", - ".medium.com", - "||medium.com", - ".meetav.com", - "||meetup.com", - "mefeedia.com", - "jihadintel.meforum.org", - "||mega.nz", - "||megaproxy.com", - "||megarotic.com", - "megavideo.com", - "||megurineluka.com", - "meirixiaochao.com", - ".meltoday.com", - ".memehk.com", - "||memehk.com", - "memorybbs.com", - ".memri.org", - ".memrijttm.org", - ".mercyprophet.org", - "|http://mercyprophet.org", - "||mergersandinquisitions.org", - ".meridian-trust.org", - "|http://meridian-trust.org", - ".meripet.biz", - "|http://meripet.biz", - ".meripet.com", - "|http://meripet.com", - "merit-times.com.tw", - "meshrep.com", - ".mesotw.com/bbs", - "metacafe.com/watch", - "||meteorshowersonline.com", - "|http://www.metro.taipei/", - ".metrohk.com.hk/?cmd=detail&categoryID=2", - "||metrolife.ca", - ".metroradio.com.hk", - "|http://metroradio.com.hk", - "meyou.jp", - ".meyul.com", - "||mgoon.com", - "||mgstage.com", - "||mh4u.org", - "mhradio.org", - "|http://michaelanti.com", - "||michaelmarketl.com", - "|http://bbs.mikocon.com", - ".microvpn.com", - "|http://microvpn.com", - "middle-way.net", - ".mihk.hk/forum", - ".mihr.com", - "mihua.org", - "||mikesoltys.com", - ".milph.net", - "|http://milph.net", - ".milsurps.com", - "mimiai.net", - ".mimivip.com", - ".mimivv.com", - ".mindrolling.org", - "|http://mindrolling.org", - ".minghui.or.kr", - "|http://minghui.or.kr", - "minghui.org", - "||minghui.org", - "minghui-a.org", - "minghui-b.org", - "minghui-school.org", - ".mingjinglishi.com", - "||mingjinglishi.com", - "mingjingnews.com", - "||mingjingtimes.com", - ".mingpao.com", - "||mingpao.com", - ".mingpaocanada.com", - ".mingpaomonthly.com", - "|http://mingpaomonthly.com", - "mingpaonews.com", - ".mingpaony.com", - ".mingpaosf.com", - ".mingpaotor.com", - ".mingpaovan.com", - ".mingshengbao.com", - ".minhhue.net", - ".miniforum.org", - ".ministrybooks.org", - ".minzhuhua.net", - "||minzhuhua.net", - "minzhuzhanxian.com", - "minzhuzhongguo.org", - "||miroguide.com", - "mirrorbooks.com", - ".mist.vip", - "thecenter.mit.edu", - ".mitao.com.tw", - ".mitbbs.com", - "||mitbbs.com", - "mitbbsau.com", - ".mixero.com", - "||mixero.com", - "mixpod.com", - ".mixx.com", - "||mixx.com", - "||mizzmona.com", - ".mk5000.com", - ".mlcool.com", - "||mlzs.work", - ".mm-cg.com", - "||mmaaxx.com", - ".mmmca.com", - "mnewstv.com", - "||mobatek.net", - ".mobile01.com", - "||mobile01.com", - "||mobileways.de", - ".mobypicture.com", - "|http://moby.to", - "||moeerolibrary.com", - "wiki.moegirl.org", - ".mofaxiehui.com", - ".mofos.com", - "||mog.com", - "molihua.org", - "||mondex.org", - ".money-link.com.tw", - "|http://money-link.com.tw", - "|http://www.monlamit.org", - ".moonbbs.com", - "||moonbbs.com", - "c1522.mooo.com", - "||monitorchina.org", - "bbs.morbell.com", - "||morningsun.org", - "||moroneta.com", - ".motherless.com", - "|http://motherless.com", - "motor4ik.ru", - ".mousebreaker.com", - ".movements.org", - "||movements.org", - "||moviefap.com", - "||www.moztw.org", - ".mp3buscador.com", - "mp3ye.eu", - "||mpettis.com", - "mpfinance.com", - "mpinews.com", - "mponline.hk", - ".mqxd.org", - "|http://mqxd.org", - "mrtweet.com", - "||mrtweet.com", - "news.hk.msn.com", - "news.msn.com.tw", - "msguancha.com", - ".mswe1.org", - "|http://mswe1.org", - "||mthruf.com", - "muchosucko.com", - "||multiply.com", - "multiproxy.org", - "multiupload.com", - ".mullvad.net", - "||mullvad.net", - ".mummysgold.com", - ".murmur.tw", - "|http://murmur.tw", - ".musicade.net", - ".muslimvideo.com", - "||muzi.com", - "||muzi.net", - "||mx981.com", - ".my-formosa.com", - ".my-proxy.com", - ".my-private-network.co.uk", - "||my-private-network.co.uk", - "forum.my903.com", - ".myactimes.com/actimes", - "||myanniu.com", - ".myaudiocast.com", - "||myaudiocast.com", - ".myav.com.tw/bbs", - ".mybbs.us", - ".myca168.com", - ".mycanadanow.com", - "||bbs.mychat.to", - "||mychinamyhome.com", - ".mychinamyhome.com", - ".mychinanet.com", - ".mychinanews.com", - "||mychinanews.com", - ".mychinese.news", - "||mycnnews.com", - "||mykomica.org", - "mycould.com/discuz", - ".myeasytv.com", - "||myeclipseide.com", - ".myforum.com.hk", - "||myforum.com.hk", - "||myforum.com.uk", - ".myfreecams.com", - ".myfreepaysite.com", - ".myfreshnet.com", - ".myiphide.com", - "||myiphide.com", - "forum.mymaji.com", - "mymediarom.com/files/box", - "||mymoe.moe", - "||mymusic.net.tw", - "||myparagliding.com", - "||mypopescu.com", - "myradio.hk/podcast", - ".myreadingmanga.info", - "mysinablog.com", - ".myspace.com", - "||myspacecdn.com", - ".mytalkbox.com", - ".mytizi.com", - "||naacoalition.org", - "old.nabble.com", - "||naitik.net", - ".nakuz.com/bbs", - "||nalandabodhi.org", - "||nalandawest.org", - ".namgyal.org", - "namgyalmonastery.org", - "||namsisi.com", - ".nanyang.com", - "||nanyang.com", - ".nanyangpost.com", - "||nanyangpost.com", - ".nanzao.com", - "||jpl.nasa.gov", - "||pds.nasa.gov", - "||solarsystem.nasa.gov", - ".nakido.com", - "||nakido.com", - ".naol.ca", - ".naol.cc", - "uighur.narod.ru", - ".nat.moe", - "||nat.moe", - "cyberghost.natado.com", - "||national-lottery.co.uk", - "news.nationalgeographic.com/news/2014/06/140603-tiananmen-square", - ".nationsonline.org/oneworld/tibet", - "||line.naver.jp", - "||navyfamily.navy.mil", - "||navyreserve.navy.mil", - "||nko.navy.mil", - "||usno.navy.mil", - "naweeklytimes.com", - ".nbtvpn.com", - "|http://nbtvpn.com", - "nccwatch.org.tw", - ".nch.com.tw", - ".ncn.org", - "||ncn.org", - "||etools.ncol.com", - ".nde.de", - ".ndr.de", - ".ned.org", - "||nekoslovakia.net", - "||nepusoku.com", - "||net-fits.pro", - "bbs.netbig.com", - ".netbirds.com", - "netcolony.com", - "bolin.netfirms.com", - "||netme.cc", - "netsneak.com", - ".network54.com", - "networkedblogs.com", - ".networktunnel.net", - "neverforget8964.org", - "new-3lunch.net", - ".new-akiba.com", - ".new96.ca", - ".newcenturymc.com", - "|http://newcenturymc.com", - "newcenturynews.com", - "||newchen.com", - ".newchen.com", - ".newgrounds.com", - "newipnow.com", - ".newlandmagazine.com.au", - ".newnews.ca", - "news100.com.tw", - "newschinacomment.org", - ".newscn.org", - "||newscn.org", - "newspeak.cc/story", - ".newsancai.com", - "||newsancai.com", - ".newsdetox.ca", - ".newsdh.com", - "||newstamago.com", - "||newstapa.org", - "newstarnet.com", - ".newtaiwan.com.tw", - "newtalk.tw", - "||newtalk.tw", - "newyorktimes.com", - "||nexon.com", - ".next11.co.jp", - ".nextmag.com.tw", - ".nextmedia.com", - "||nexton-net.jp", - "nexttv.com.tw", - ".nfjtyd.com", - "||co.ng.mil", - "||nga.mil", - "ngensis.com", - ".nhentai.net", - "|http://nhentai.net", - ".nhk-ondemand.jp", - ".nicovideo.jp/watch", - "||nicovideo.jp", - "||nighost.org", - "av.nightlife141.com", - "ninecommentaries.com", - ".ninjacloak.com", - "||ninjaproxy.ninja", - "nintendium.com", - "taiwanyes.ning.com", - "usmgtcg.ning.com/forum", - "||niusnews.com", - "||njactb.org", - "njuice.com", - "||njuice.com", - "nlfreevpn.com", - ".ddns.net/", - ".gooddns.info", - "||gotdns.ch", - ".maildns.xyz", - ".no-ip.org", - ".opendn.xyz", - ".servehttp.com", - "sytes.net", - ".whodns.xyz", - ".zapto.org", - "|http://dynupdate.no-ip.com/", - "||nobel.se", - "nobelprize.org/nobel_prizes/peace/laureates/1989", - "nobelprize.org/nobel_prizes/peace/laureates/2010", - "nobodycanstop.us", - "||nobodycanstop.us", - "||nokogiri.org", - "||nokola.com", - "noodlevpn.com", - ".norbulingka.org", - "nordvpn.com", - "||nordvpn.com", - "||novelasia.com", - ".news.now.com", - "|http://news.now.com", - "news.now.com%2Fhome", - "||nownews.com", - ".nowtorrents.com", - ".noypf.com", - "||noypf.com", - "||npa.go.jp", - ".npnt.me", - "|http://npnt.me", - ".nps.gov", - ".nradio.me", - "|http://nradio.me", - ".nrk.no", - "||nrk.no", - ".ntd.tv", - "||ntd.tv", - ".ntdtv.com", - "||ntdtv.com", - ".ntdtv.co.kr", - "ntdtv.ca", - "ntdtv.org", - "ntdtv.ru", - "ntdtvla.com", - ".ntrfun.com", - "||cbs.ntu.edu.tw", - "||media.nu.nl", - ".nubiles.net", - "||nuexpo.com", - ".nukistream.com", - "||nurgo-software.com", - "||nutaku.net", - ".nuvid.com", - "||nvdst.com", - "nuzcom.com", - ".nvquan.org", - ".nvtongzhisheng.org", - "|http://nvtongzhisheng.org", - ".nwtca.org", - "|http://nyaa.eu", - "||nyaa.si", - ".nydus.ca", - "nylon-angel.com", - "nylonstockingsonline.com", - ".nzchinese.com", - "||nzchinese.net.nz", - "observechina.net", - ".obutu.com", - "ocaspro.com", - "occupytiananmen.com", - "oclp.hk", - ".ocreampies.com", - "||october-review.org", - "offbeatchina.com", - "officeoftibet.com", - "|http://ofile.org", - "||ogaoga.org", - "twtr2src.ogaoga.org", - ".ogate.org", - "||ogate.org", - "www2.ohchr.org/english/bodies/cat/docs/ngos/II_China_41.pdf", - ".oikos.com.tw/v4", - ".oiktv.com", - "oizoblog.com", - ".ok.ru", - "||ok.ru", - ".okayfreedom.com", - "||okayfreedom.com", - "okk.tw", - "|http://filmy.olabloga.pl/player", - "old-cat.net", - "||olumpo.com", - ".olympicwatch.org", - "omgili.com", - "||omnitalk.com", - "||omnitalk.org", - "cling.omy.sg", - "forum.omy.sg", - "news.omy.sg", - "showbiz.omy.sg", - "||on.cc", - "||onedrive.live.com", - "||onion.city", - ".onlinecha.com", - "||onlineyoutube.com", - ".onlytweets.com", - "|http://onlytweets.com", - "onmoon.net", - "onmoon.com", - ".onthehunt.com", - "|http://onthehunt.com", - ".oopsforum.com", - "open.com.hk", - "openallweb.com", - "opendemocracy.net", - "||opendemocracy.net", - ".openervpn.in", - "openid.net", - "||openid.net", - ".openleaks.org", - "||openleaks.org", - "openvpn.net", - "||openvpn.net", - "||openwebster.com", - ".openwrt.org.cn", - "@@||openwrt.org.cn", - "my.opera.com/dahema", - "||demo.opera-mini.net", - ".opus-gaming.com", - "|http://opus-gaming.com", - "www.orchidbbs.com", - ".organcare.org.tw", - "organharvestinvestigation.net", - ".orgasm.com", - ".orgfree.com", - "||orient-doll.com", - "orientaldaily.com.my", - "||orientaldaily.com.my", - "||orn.jp", - "t.orzdream.com", - "||t.orzdream.com", - "tui.orzdream.com", - "||orzistic.org", - "||osfoora.com", - ".otnd.org", - "||otnd.org", - "||otto.de", - "||ourdearamy.com", - "oursogo.com", - ".oursteps.com.au", - "||oursteps.com.au", - ".oursweb.net", - "||ourtv.hk", - "xinqimeng.over-blog.com", - "||overplay.net", - "share.ovi.com/media", - "|http://owl.li", - "|http://ht.ly", - "|http://htl.li", - "|http://mash.to", - "www.owind.com", - "|http://www.oxid.it", - "oyax.com", - "oyghan.com/wps", - ".ozchinese.com/bbs", - "||ow.ly", - "bbs.ozchinese.com", - ".ozvoice.org", - "||ozvoice.org", - ".ozxw.com", - ".ozyoyo.com", - "||pachosting.com", - ".pacificpoker.com", - ".packetix.net", - "||pacopacomama.com", - ".padmanet.com", - "page2rss.com", - "||pagodabox.com", - ".palacemoon.com", - "forum.palmislife.com", - "||eriversoft.com", - ".paldengyal.com", - "paljorpublications.com", - ".paltalk.com", - "||pandapow.co", - ".pandapow.net", - ".pandavpn-jp.com", - ".panluan.net", - "||panluan.net", - "||pao-pao.net", - "paper.li", - "paperb.us", - ".paradisehill.cc", - ".paradisepoker.com", - ".partycasino.com", - ".partypoker.com", - ".passion.com", - "||passion.com", - ".passiontimes.hk", - "pastebin.com", - ".pastie.org", - "||pastie.org", - "||blog.pathtosharepoint.com", - "pbs.org/wgbh/pages/frontline/gate", - "pbs.org/wgbh/pages/frontline/tankman", - "pbs.org/wgbh/pages/frontline/tibet", - "video.pbs.org", - "pbwiki.com", - "||pbworks.com", - "||developers.box.net", - "||wiki.oauth.net", - "||wiki.phonegap.com", - "||wiki.jqueryui.com", - "||pbxes.com", - "||pbxes.org", - "pcdvd.com.tw", - ".pchome.com.tw", - "|http://pcij.org", - ".pcstore.com.tw", - "||pct.org.tw", - "pdetails.com", - "||pdproxy.com", - "||peace.ca", - "peacefire.org", - "peacehall.com", - "||peacehall.com", - "|http://pearlher.org", - ".peeasian.com", - ".pekingduck.org", - "||pekingduck.org", - ".pemulihan.or.id", - "|http://pemulihan.or.id", - "||pen.io", - "penchinese.com", - "||penchinese.net", - ".penchinese.net", - "pengyulong.com", - "penisbot.com", - "||blog.pentalogic.net", - ".penthouse.com", - ".pentoy.hk/%E4%B8%AD%E5%9C%8B", - ".pentoy.hk/%E6%99%82%E4%BA%8B", - ".peoplebookcafe.com", - ".peoplenews.tw", - "||peoplenews.tw", - ".peopo.org", - "||peopo.org", - ".percy.in", - ".perfectgirls.net", - "perfectvpn.net", - ".persecutionblog.com", - ".persiankitty.com", - "pfd.org.hk", - "phapluan.org", - "phayul.com", - "philborges.com", - "philly.com", - "||phncdn.com", - "||photodharma.net", - "||photofocus.com", - "||phuquocservices.com", - "||picacomiccn.com", - ".picidae.net", - "||img*.picturedip.com", - "picturesocial.com", - "||pin-cong.com", - ".pin6.com", - "||pin6.com", - ".ping.fm", - "||ping.fm", - "||pinimg.com", - ".pinkrod.com", - "||pinoy-n.com", - "||pinterest.at", - "||pinterest.ca", - "||pinterest.co.kr", - "||pinterest.co.uk", - ".pinterest.com", - "||pinterest.com", - "||pinterest.de", - "||pinterest.dk", - "||pinterest.fr", - "||pinterest.jp", - "||pinterest.nl", - "||pinterest.se", - ".pipii.tv", - ".piposay.com", - "piraattilahti.org", - ".piring.com", - "||pixelqi.com", - "||css.pixnet.in", - "||pixnet.net", - ".pixnet.net", - ".pk.com", - "||placemix.com", - "|http://pictures.playboy.com", - "||playboy.com", - ".playboyplus.com", - "||playboyplus.com", - "||player.fm", - ".playno1.com", - "||playno1.com", - "||playpcesor.com", - "plays.com.tw", - "||m.plixi.com", - "plm.org.hk", - "plunder.com", - ".plurk.com", - "||plurk.com", - ".plus28.com", - ".plusbb.com", - ".pmatehunter.com", - "|http://pmatehunter.com", - ".pmates.com", - "||po2b.com", - "pobieramy.top", - "||podictionary.com", - ".pokerstars.com", - "||pokerstars.com", - ".pokerstars.net", - "zh.pokerstrategy.com", - "politicalchina.org", - "politicalconsultation.org", - ".politiscales.net", - "||poloniex.com", - ".polymerhk.com", - "|http://polymerhk.com", - ".popo.tw", - "||popvote.hk", - ".popyard.com", - "||popyard.org", - ".porn.com", - ".porn2.com", - ".porn5.com", - ".pornbase.org", - ".pornerbros.com", - "||pornhd.com", - ".pornhost.com", - ".pornhub.com", - "||pornhub.com", - ".pornhubdeutsch.net", - "|http://pornhubdeutsch.net", - "||pornmm.net", - ".pornoxo.com", - ".pornrapidshare.com", - "||pornrapidshare.com", - ".pornsharing.com", - "|http://pornsharing.com", - ".pornsocket.com", - ".pornstarclub.com", - "||pornstarclub.com", - ".porntube.com", - ".porntubenews.com", - ".porntvblog.com", - "||porntvblog.com", - ".pornvisit.com", - ".portablevpn.nl", - "||poskotanews.com", - ".post01.com", - ".post76.com", - "||post76.com", - ".post852.com", - "postadult.com", - ".postimg.org", - "||potvpn.com", - "||powercx.com", - ".powerphoto.org", - "||www.powerpointninja.com", - "||presidentlee.tw", - "||cdn.printfriendly.com", - ".pritunl.com", - "provpnaccounts.com", - "||provpnaccounts.com", - ".proxfree.com", - "||proxfree.com", - "proxyanonimo.es", - ".proxynetwork.org.uk", - "||proxynetwork.org.uk", - "||pts.org.tw", - ".pttvan.org", - "pubu.com.tw", - "puffinbrowser.com", - "pureinsight.org", - ".pushchinawall.com", - ".putty.org", - "||putty.org", - "||calebelston.com", - "||blog.fizzik.com", - "||nf.id.au", - "||sogrady.me", - "||vatn.org", - "||ventureswell.com", - "||whereiswerner.com", - ".power.com", - "||power.com", - "powerapple.com", - "||powerapple.com", - "||abc.pp.ru", - "heix.pp.ru", - "||prayforchina.net", - "||premeforwindows7.com", - "||presentationzen.com", - "||prestige-av.com", - "prisoner-state-secret-journal-premier", - ".prisoneralert.com", - "||pritunl.com", - "||privacybox.de", - ".private.com/home", - "||privateinternetaccess.com", - "privatepaste.com", - "||privatepaste.com", - "privatetunnel.com", - "||privatetunnel.com", - "||privatevpn.com", - "||procopytips.com", - "provideocoalition.com", - "||prosiben.de", - "proxifier.com", - "api.proxlet.com", - "||proxomitron.info", - ".proxpn.com", - "||proxpn.com", - ".proxylist.org.uk", - "||proxylist.org.uk", - ".proxypy.net", - "||proxypy.net", - "proxyroad.com", - ".proxytunnel.net", - "||proyectoclubes.com", - "prozz.net", - "psblog.name", - "||psblog.name", - "||psiphon.ca", - ".psiphon3.com", - "||psiphon3.com", - ".psiphontoday.com", - ".ptt.cc", - "||ptt.cc", - ".puffstore.com", - ".puuko.com", - "||pullfolio.com", - ".punyu.com/puny", - "||pureconcepts.net", - "||pureinsight.org", - "||purepdf.com", - "||purevpn.com", - ".purplelotus.org", - ".pursuestar.com", - "||pursuestar.com", - ".pussyspace.com", - ".putihome.org", - ".putlocker.com/file", - "pwned.com", - "python.com", - ".python.com.tw", - "|http://python.com.tw", - "pythonhackers.com/p", - "ss.pythonic.life/", - ".qanote.com", - "||qanote.com", - ".qgirl.com.tw", - "||qiandao.today", - ".qi-gong.me", - "||qi-gong.me", - "||qiangyou.org", - ".qidian.ca", - ".qienkuen.org", - "||qienkuen.org", - "||qiwen.lu", - "qixianglu.cn", - "bbs.qmzdd.com", - ".qkshare.com", - "qoos.com", - "||qoos.com", - "blog.qooza.hk/dafengqixi", - "||efksoft.com", - "||qstatus.com", - "||qtweeter.com", - "||qtrac.eu", - ".quannengshen.org", - "|http://quannengshen.org", - "quantumbooter.net", - "||quitccp.net", - ".quitccp.net", - "||quitccp.org", - ".quitccp.org", - ".quora.com/Chinas-Future", - ".quran.com", - "|http://quran.com", - ".quranexplorer.com", - "qusi8.net", - ".qvodzy.org", - "nemesis2.qx.net/pages/MyEnTunnel", - "qxbbs.org", - ".ra.gg", - "|http://ra.gg/", - ".radicalparty.org", - "||rael.org", - "radicalparty.org", - "radioaustralia.net.au", - ".radiohilight.net", - "||radiohilight.net", - "opml.radiotime.com", - "||radiovaticana.org", - "||radiovncr.com", - "||raggedbanner.com", - "||raidcall.com.tw", - ".raidtalk.com.tw", - ".rainbowplan.org/bbs", - "|https://raindrop.io/", - ".raizoji.or.jp", - "|http://raizoji.or.jp", - "rangwang.biz", - "rangzen.com", - "rangzen.net", - "rangzen.org", - "|http://blog.ranxiang.com/", - "ranyunfei.com", - "||ranyunfei.com", - ".rapbull.net", - "|http://rapidgator.net/", - "||rapidmoviez.com", - "rapidvpn.com", - "||rapidvpn.com", - "||rarbgprx.org", - ".raremovie.cc", - "|http://raremovie.cc", - ".raremovie.net", - "|http://raremovie.net", - "||rawgit.com", - "||rawgithub.com", - "||razyboard.com", - "rcinet.ca", - ".read100.com", - ".readingtimes.com.tw", - "||readingtimes.com.tw", - "||readmoo.com", - ".readydown.com", - "|http://readydown.com", - ".realcourage.org", - ".realitykings.com", - "||realitykings.com", - ".realraptalk.com", - ".realsexpass.com", - ".recordhistory.org", - ".recovery.org.tw", - "|http://online.recoveryversion.org", - "||recoveryversion.com.tw", - "||red-lang.org", - "redballoonsolidarity.org", - ".redchinacn.net", - "|http://redchinacn.net", - "redchinacn.org", - "redtube.com", - "referer.us", - "||referer.us", - "||reflectivecode.com", - "relaxbbs.com", - ".relay.com.tw", - ".releaseinternational.org", - "religioustolerance.org", - "renminbao.com", - "||renminbao.com", - ".renyurenquan.org", - "||renyurenquan.org", - "|http://certificate.revocationcheck.com", - "subacme.rerouted.org", - "||resilio.com", - ".reuters.com", - "||reuters.com", - "||reutersmedia.net", - ".revleft.com", - "retweetist.com", - "||retweetrank.com", - "revver.com", - ".rfa.org", - "||rfa.org", - ".rfachina.com", - ".rfamobile.org", - "rfaweb.org", - "||rferl.org", - ".rfi.fr", - "||rfi.fr", - "|http://rfi.my/", - "|http://vds.rightster.com/", - ".rigpa.org", - ".rileyguide.com", - "riku.me/", - ".ritouki.jp", - "||ritter.vg", - ".rlwlw.com", - "||rlwlw.com", - ".rmjdw.com", - ".rmjdw132.info", - ".roadshow.hk", - ".roboforex.com", - "||robustnessiskey.com", - "||rocket-inc.net", - "|http://www2.rocketbbs.com/11/bbs.cgi?id=5mus", - "|http://www2.rocketbbs.com/11/bbs.cgi?id=freemgl", - "||rojo.com", - "||ronjoneswriter.com", - "||rolia.net", - ".roodo.com", - ".rosechina.net", - ".rotten.com", - ".rsf.org", - "||rsf.org", - ".rsf-chinese.org", - "||rsf-chinese.org", - ".rsgamen.org", - "||phosphation13.rssing.com", - ".rssmeme.com", - "||rssmeme.com", - "||rtalabel.org", - ".rthk.hk", - "|http://rthk.hk", - ".rthk.org.hk", - "|http://rthk.org.hk", - ".rti.org.tw", - "||rti.org.tw", - ".rtycminnesota.org", - ".ruanyifeng.com/blog*some_ways_to_break_the_great_firewall", - "rukor.org", - ".runbtx.com", - ".rushbee.com", - ".ruten.com.tw", - "rutube.ru", - ".ruyiseek.com", - ".rxhj.net", - "|http://rxhj.net", - ".s1s1s1.com", - "||s-cute.com", - ".s-dragon.org", - "||s1heng.com", - "|http://www.s4miniarchive.com", - "||s8forum.com", - "cdn1.lp.saboom.com", - "||sacks.com", - "sacom.hk", - "||sacom.hk", - "||sadpanda.us", - ".safervpn.com", - "||safervpn.com", - ".saintyculture.com", - "|http://saintyculture.com", - ".saiq.me", - "||saiq.me", - "||sakuralive.com", - ".sakya.org", - ".salvation.org.hk", - "||salvation.org.hk", - ".samair.ru/proxy/type-01", - ".sambhota.org", - ".cn.sandscotaicentral.com", - "|http://cn.sandscotaicentral.com", - ".sanmin.com.tw", - "sapikachu.net", - "savemedia.com", - "||savethesounds.info", - ".savetibet.de", - "||savetibet.de", - "savetibet.fr", - "savetibet.nl", - ".savetibet.org", - "||savetibet.org", - "savetibet.ru", - ".savetibetstore.org", - "||savetibetstore.org", - "savevid.com", - "||say2.info", - ".sbme.me", - "|http://sbme.me", - ".sbs.com.au/yourlanguage", - ".scasino.com", - "|http://www.sciencemag.org/content/344/6187/953", - ".sciencenets.com", - ".scmp.com", - "||scmp.com", - ".scmpchinese.com", - "||scramble.io", - ".scribd.com", - "||scribd.com", - "||scriptspot.com", - "seapuff.com", - "domainhelp.search.com", - ".searchtruth.com", - "secretchina.com", - "||secretchina.com", - "||secretgarden.no", - ".secretsline.biz", - "||secretsline.biz", - "||securetunnel.com", - "securityinabox.org", - "|https://securityinabox.org", - ".securitykiss.com", - "||securitykiss.com", - "||seed4.me", - "news.seehua.com", - "seesmic.com", - "||seevpn.com", - "||seezone.net", - "sejie.com", - ".sendspace.com", - "|http://tweets.seraph.me/", - "sesawe.net", - "||sesawe.net", - ".sesawe.org", - "||sethwklein.net", - ".setn.com", - ".settv.com.tw", - "forum.setty.com.tw", - ".sevenload.com", - "||sevenload.com", - ".sex.com", - ".sex-11.com", - "||sex3.com", - "||sex8.cc", - ".sexandsubmission.com", - ".sexbot.com", - ".sexhu.com", - ".sexhuang.com", - "sexinsex.net", - "||sexinsex.net", - ".sextvx.com", - "67.220.91.15", - "67.220.91.18", - "67.220.91.23", - "|http://*.sf.net", - ".sfileydy.com", - "||sfshibao.com", - ".sftindia.org", - ".sftuk.org", - "||sftuk.org", - "||shadeyouvpn.com", - "shadow.ma", - ".shadowsky.xyz", - ".shadowsocks.asia", - "||www.shadowsocks.com", - ".shadowsocks.com", - "||shadowsocks.com.hk", - ".shadowsocks.org", - "||shadowsocks.org", - "||shadowsocks-r.com", - "|http://cn.shafaqna.com", - ".shambalapost.com", - ".shambhalasun.com", - ".shangfang.org", - "||shangfang.org", - "shapeservices.com", - ".sharebee.com", - "||sharecool.org", - "sharpdaily.com.hk", - "||sharpdaily.com.hk", - ".sharpdaily.hk", - ".sharpdaily.tw", - ".shat-tibet.com", - "sheikyermami.com", - ".shellfire.de", - "||shellfire.de", - ".shenshou.org", - "shenyun.com", - "shenyunperformingarts.org", - "||shenyunperformingarts.org", - "shenzhoufilm.com", - "||shenzhoufilm.com", - "||sherabgyaltsen.com", - ".shiatv.net", - ".shicheng.org", - "shinychan.com", - "shipcamouflage.com", - ".shireyishunjian.com", - ".shitaotv.org", - "||shixiao.org", - "||shizhao.org", - "shizhao.org", - "shkspr.mobi/dabr", - "||shodanhq.com", - "||shooshtime.com", - ".shop2000.com.tw", - ".shopping.com", - ".showhaotu.com", - ".showtime.jp", - ".shutterstock.com", - "||shutterstock.com", - "ch.shvoong.com", - ".shwchurch.org", - "||www.shwchurch.org", - ".shwchurch3.com", - "|http://shwchurch3.com", - ".siddharthasintent.org", - "||sidelinesnews.com", - ".sidelinessportseatery.com", - ".sijihuisuo.club", - ".sijihuisuo.com", - ".silkbook.com", - "||simbolostwitter.com", - "simplecd.org", - "||simplecd.org", - "@@||simplecd.me", - "simpleproductivityblog.com", - "bbs.sina.com/", - "bbs.sina.com%2F", - "blog.sina.com.tw", - "dailynews.sina.com/", - "dailynews.sina.com%2F", - "forum.sina.com.hk", - "home.sina.com", - "||magazines.sina.com.tw", - "news.sina.com.hk", - "news.sina.com.tw", - "news.sinchew.com.my", - ".sinchew.com.my/node/", - ".sinchew.com.my/taxonomy/term", - ".singaporepools.com.sg", - "||singaporepools.com.sg", - ".singfortibet.com", - ".singpao.com.hk", - "singtao.com", - "||singtao.com", - "news.singtao.ca", - ".singtaousa.com", - "||singtaousa.com", - "sino-monthly.com", - "||sinocast.com", - "sinocism.com", - "sinomontreal.ca", - ".sinonet.ca", - ".sinopitt.info", - ".sinoants.com", - "||sinoants.com", - ".sinoquebec.com", - ".sierrafriendsoftibet.org", - "sis.xxx", - "||sis001.com", - "sis001.us", - ".site2unblock.com", - "||site90.net", - ".sitebro.tw", - "||sitekreator.com", - "||siteks.uk.to", - "||sitemaps.org", - ".sjrt.org", - "|http://sjrt.org", - "||sjum.cn", - "||sketchappsources.com", - "||skimtube.com", - "||skybet.com", - "|http://users.skynet.be/reves/tibethome.html", - ".skyking.com.tw", - "bbs.skykiwi.com", - "|http://www.skype.com/intl/", - "|http://www.skype.com/zh-Hant", - "||skyvegas.com", - ".xskywalker.com", - "||xskywalker.com", - "||skyxvpn.com", - "m.slandr.net", - ".slaytizle.com", - ".sleazydream.com", - "||slheng.com", - "||slideshare.net", - "forum.slime.com.tw", - ".slinkset.com", - "||slickvpn.com", - ".slutload.com", - "||smartdnsproxy.com", - ".smarthide.com", - "||app.smartmailcloud.com", - "smchbooks.com", - ".smh.com.au/world/death-of-chinese-playboy-leaves-fresh-scratches-in-party-paintwork-20120903-25a8v", - "smhric.org", - ".smith.edu/dalailama", - ".smyxy.org", - "||snapchat.com", - ".snaptu.com", - "||snaptu.com", - "||sndcdn.com", - "sneakme.net", - "snowlionpub.com", - "home.so-net.net.tw/yisa_tsai", - "||soc.mil", - ".socks-proxy.net", - "||socks-proxy.net", - ".sockscap64.com", - "||sockslist.net", - ".socrec.org", - "|http://socrec.org", - ".sod.co.jp", - ".softether.org", - "||softether.org", - ".softether-download.com", - "||softether-download.com", - "||cdn.softlayer.net", - "||sogclub.com", - "sohcradio.com", - "||sohcradio.com", - ".sokmil.com", - "||sorting-algorithms.com", - ".sostibet.org", - ".soumo.info", - "||soup.io", - "@@||static.soup.io", - ".sobees.com", - "||sobees.com", - "socialwhale.com", - ".softether.co.jp", - "||softwarebychuck.com", - "blog.sogoo.org", - "soh.tw", - "||soh.tw", - "sohfrance.org", - "||sohfrance.org", - "chinese.soifind.com", - "sokamonline.com", - ".solidaritetibet.org", - ".solidfiles.com", - "||somee.com", - ".songjianjun.com", - "||songjianjun.com", - ".sonicbbs.cc", - ".sonidodelaesperanza.org", - ".sopcast.com", - ".sopcast.org", - ".sorazone.net", - "||sos.org", - "bbs.sou-tong.org", - ".soubory.com", - "|http://soubory.com", - ".soul-plus.net", - ".soulcaliburhentai.net", - "||soulcaliburhentai.net", - "||soundcloud.com", - ".soundofhope.kr", - "soundofhope.org", - "||soundofhope.org", - "||soupofmedia.com", - "|http://sourceforge.net/p*/shadowsocksgui/", - ".sourcewadio.com", - "southnews.com.tw", - "sowers.org.hk", - "||wlx.sowiki.net", - "||spankbang.com", - ".spankingtube.com", - ".spankwire.com", - "||spb.com", - "||speakerdeck.com", - "||speedify.com", - "spem.at", - "||spencertipping.com", - "||spendee.com", - "||spicevpn.com", - ".spideroak.com", - "||spideroak.com", - ".spike.com", - ".spotflux.com", - "||spotflux.com", - ".spring4u.info", - "|http://spring4u.info", - "||sproutcore.com", - "||sproxy.info", - "||srocket.us", - ".ss-link.com", - "||ss-link.com", - ".ssglobal.co/wp", - "|http://ssglobal.co", - ".ssglobal.me", - "||ssh91.com", - ".sspro.ml", - "|http://sspro.ml", - ".ssrshare.com", - "||ssrshare.com", - "||sss.camp", - "||sstmlt.moe", - "sstmlt.net", - "||sstmlt.net", - "|http://stackoverflow.com/users/895245", - ".stage64.hk", - "||stage64.hk", - "||standupfortibet.org", - "stanford.edu/group/falun", - "usinfo.state.gov", - "||statueofdemocracy.org", - ".starfishfx.com", - ".starp2p.com", - "||starp2p.com", - ".startpage.com", - "||startpage.com", - ".startuplivingchina.com", - "|http://startuplivingchina.com", - "||static-economist.com", - "||stc.com.sa", - "||steel-storm.com", - ".steganos.com", - "||steganos.com", - ".steganos.net", - ".stepchina.com", - "ny.stgloballink.com", - "hd.stheadline.com/news/realtime", - "sthoo.com", - "||sthoo.com", - ".stickam.com", - "stickeraction.com/sesawe", - ".stileproject.com", - ".sto.cc", - ".stoporganharvesting.org", - "||storagenewsletter.com", - ".storm.mg", - "||storm.mg", - ".stoptibetcrisis.net", - "||stoptibetcrisis.net", - "||storify.com", - ".stormmediagroup.com", - "||stoweboyd.com", - "stranabg.com", - "||straplessdildo.com", - "||streamingthe.net", - "streema.com/tv/NTDTV_Chinese", - "cn.streetvoice.com/article", - "cn.streetvoice.com/diary", - "cn2.streetvoice.com", - "tw.streetvoice.com", - ".strikingly.com", - "||strongvpn.com", - ".strongwindpress.com", - ".student.tw/db", - "||studentsforafreetibet.org", - "||stumbleupon.com", - "stupidvideos.com", - ".successfn.com", - "panamapapers.sueddeutsche.de", - ".sugarsync.com", - "||sugarsync.com", - ".sugobbs.com", - "||sugumiru18.com", - "||suissl.com", - "summify.com", - ".sumrando.com", - "||sumrando.com", - "sun1911.com", - ".sunporno.com", - "||sunmedia.ca", - "||sunporno.com", - ".sunskyforum.com", - ".sunta.com.tw", - ".sunvpn.net", - ".suoluo.org", - ".superfreevpn.com", - ".supervpn.net", - "||supervpn.net", - ".superzooi.com", - "|http://superzooi.com", - ".suppig.net", - ".suprememastertv.com", - "|http://suprememastertv.com", - ".surfeasy.com", - "||surfeasy.com", - ".surfeasy.com.au", - "|http://surfeasy.com.au", - "||surrenderat20.net", - ".suyangg.com", - "|http://suyangg.com", - ".svsfx.com", - ".swissinfo.ch", - "||swissinfo.ch", - ".swissvpn.net", - "||swissvpn.net", - "switchvpn.net", - "||switchvpn.net", - ".sydneytoday.com", - "||sydneytoday.com", - ".sylfoundation.org", - "||syncback.com", - "sysresccd.org", - ".sytes.net", - "blog.syx86.com/2009/09/puff", - "blog.syx86.cn/2009/09/puff", - ".szbbs.net", - ".szetowah.org.hk", - "||t-g.com", - ".t35.com", - ".t66y.com", - "||t66y.com", - ".taa-usa.org", - "|http://taa-usa.org", - ".taaze.tw", - "||taaze.tw", - "|http://www.tablesgenerator.com/", - "tabtter.jp", - ".tacem.org", - ".taconet.com.tw", - "||taedp.org.tw", - ".tafm.org", - ".tagwa.org.au", - "tagwalk.com", - "||tagwalk.com", - "tahr.org.tw", - ".taipeisociety.org", - "||taipeisociety.org", - ".taiwanbible.com", - ".taiwancon.com", - ".taiwandaily.net", - "||taiwandaily.net", - ".taiwandc.org", - ".taiwanjustice.com", - "taiwankiss.com", - "taiwannation.com", - "taiwannation.com.tw", - "||taiwanncf.org.tw", - "||taiwannews.com.tw", - "|http://www.taiwanonline.cc/", - "taiwantp.net", - "||taiwantt.org.tw", - "taiwanus.net", - "taiwanyes.com", - "taiwan-sex.com", - ".talk853.com", - ".talkboxapp.com", - "||talkboxapp.com", - ".talkcc.com", - "||talkcc.com", - ".talkonly.net", - "||talkonly.net", - "||tamiaode.tk", - "||tanc.org", - "tangben.com", - ".tangren.us", - ".taoism.net", - "|http://taoism.net", - ".taolun.info", - "||taolun.info", - ".tapatalk.com", - "||tapatalk.com", - "blog.taragana.com", - ".tascn.com.au", - "||taup.net", - "|http://www.taup.org.tw", - ".taweet.com", - "||taweet.com", - ".tbcollege.org", - "||tbcollege.org", - ".tbi.org.hk", - ".tbicn.org", - ".tbjyt.org", - "||tbpic.info", - ".tbrc.org", - "tbs-rainbow.org", - ".tbsec.org", - "||tbsec.org", - "tbskkinabalu.page.tl", - ".tbsmalaysia.org", - ".tbsn.org", - "||tbsn.org", - ".tbsseattle.org", - ".tbssqh.org", - "|http://tbssqh.org", - "tbswd.org", - ".tbtemple.org.uk", - ".tbthouston.org", - ".tccwonline.org", - ".tcewf.org", - "tchrd.org", - "tcnynj.org", - "||tcpspeed.co", - ".tcpspeed.com", - "||tcpspeed.com", - ".tcsofbc.org", - ".tcsovi.org", - ".tdm.com.mo", - "teamamericany.com", - "||techviz.net", - "||teck.in", - ".teeniefuck.net", - "teensinasia.com", - ".telecomspace.com", - "||telegraph.co.uk", - ".tenacy.com", - "||tenzinpalmo.com", - ".tew.org", - ".thaicn.com", - "||theatrum-belli.com", - "theblemish.com", - "||thebcomplex.com", - ".thebobs.com", - "||thebobs.com", - ".thechinabeat.org", - "|http://www.thechinastory.org/yearbooks/yearbook-2012/", - ".thedalailamamovie.com", - "|http://thedalailamamovie.com", - "||thedw.us", - "thefrontier.hk/tf", - "cn.thegay.com", - "|http://thegioitinhoc.vn/", - ".thegly.com", - ".thehots.info", - "thehousenews.com", - "||thehun.net", - ".theinitium.com", - "||theinitium.com", - ".thenewslens.com", - "||thenewslens.com", - ".thepiratebay.org", - "||thepiratebay.org", - ".theporndude.com", - "||theporndude.com", - "||theportalwiki.com", - "thereallove.kr", - "therock.net.nz", - "thespeeder.com", - "||thestandnews.com", - "thetibetcenter.org", - "thetibetconnection.org", - ".thetibetmuseum.org", - ".thetibetpost.com", - "||thetibetpost.com", - "||thetinhat.com", - "thetrotskymovie.com", - "thevivekspot.com", - "||thewgo.org", - ".theync.com", - "|http://theync.com", - ".thinkingtaiwan.com", - ".thisav.com", - "|http://thisav.com", - ".thlib.org", - "||thomasbernhard.org", - ".thongdreams.com", - "threatchaos.com", - "||throughnightsfire.com", - ".thumbzilla.com", - "||thywords.com", - ".thywords.com.tw", - "tiananmenmother.org", - ".tiananmenduizhi.com", - "||tiananmenduizhi.com", - "||tiananmenuniv.com", - "||tiananmenuniv.net", - "||tiandixing.org", - ".tianhuayuan.com", - ".tianlawoffice.com", - "||tianti.io", - "tiantibooks.org", - "||tiantibooks.org", - "tianyantong.org.cn", - ".tianzhu.org", - ".tibet.at", - "tibet.ca", - ".tibet.com", - "||tibet.com", - "tibet.fr", - ".tibet.net", - "||tibet.net", - "tibet.nu", - ".tibet.org", - "||tibet.org", - ".tibet.sk", - "tibet.org.tw", - ".tibet.to", - ".tibet-envoy.eu", - "||tibet-envoy.eu", - ".tibet-foundation.org", - ".tibet-house-trust.co.uk", - "tibet-info.net", - "tibet-initiative.de", - "||tibet-initiative.de", - ".tibet-munich.de", - ".tibet3rdpole.org", - "|http://tibet3rdpole.org", - "tibetaction.net", - "||tibetaction.net", - ".tibetaid.org", - "tibetalk.com", - ".tibetan.fr", - "tibetan-alliance.org", - ".tibetanarts.org", - ".tibetanbuddhistinstitute.org", - "|http://tibetanbuddhistinstitute.org", - "tibetancommunity.org", - ".tibetanjournal.com", - ".tibetanlanguage.org", - ".tibetanliberation.org", - "||tibetanliberation.org", - ".tibetcollection.com", - ".tibetanaidproject.org", - ".tibetancommunityuk.net", - "|http://tibetancommunityuk.net", - "tibetanculture.org", - "tibetanfeministcollective.org", - ".tibetanpaintings.com", - ".tibetanphotoproject.com", - ".tibetanpoliticalreview.org", - ".tibetanreview.net", - "|http://tibetansports.org", - ".tibetanwomen.org", - "|http://tibetanwomen.org", - ".tibetanyouth.org", - ".tibetanyouthcongress.org", - "||tibetanyouthcongress.org", - ".tibetcharity.dk", - "tibetcharity.in", - ".tibetchild.org", - ".tibetcity.com", - ".tibetcorps.org", - ".tibetexpress.net", - "|http://tibetexpress.net", - "tibetfocus.com", - "tibetfund.org", - ".tibetgermany.com", - "||tibetgermany.de", - ".tibethaus.com", - ".tibetheritagefund.org", - "tibethouse.jp", - "tibethouse.org", - "||tibethouse.us", - ".tibetinfonet.net", - ".tibetjustice.org", - ".tibetkomite.dk", - "|http://tibetmuseum.org", - "tibetnetwork.org", - "||tibetnetwork.org", - ".tibetoffice.ch", - "|http://tibetoffice.ch", - "tibetoffice.eu", - "tibetoffice.org", - "tibetonline.com", - "||tibetonline.com", - ".tibetoffice.com.au", - "|http://tibetoffice.com.au", - "||tibetonline.tv", - ".tibetonline.tv", - ".tibetoralhistory.org", - "|http://tibetoralhistory.org", - ".tibetpolicy.eu", - ".tibetrelieffund.co.uk", - "tibetsites.com", - ".tibetsociety.com", - "||tibetsociety.com", - ".tibetsun.com", - ".tibetsupportgroup.org", - "|http://tibetsupportgroup.org", - ".tibetswiss.ch", - ".tibettelegraph.com", - "tibettimes.net", - "||tibetwrites.org", - ".ticket.com.tw", - ".tigervpn.com", - "||tigervpn.com", - ".timdir.com", - "|http://timdir.com", - ".time.com", - "|http://time.com", - ".timsah.com", - "||blog.tiney.com", - "tintuc101.com", - ".tiny.cc", - "|http://tiny.cc", - "tinychat.com", - "||tinypaste.com", - ".tistory.com", - "||tkcs-collins.com", - ".tmagazine.com", - "||tmagazine.com", - ".tmdfish.com", - "|http://tmi.me", - ".tmpp.org", - "|http://tmpp.org", - ".tnaflix.com", - "||tnaflix.com", - ".tngrnow.com", - ".tngrnow.net", - ".tnp.org", - "|http://tnp.org", - ".to-porno.com", - "||to-porno.com", - "togetter.com", - ".tokyo-247.com", - ".tokyo-hot.com", - "||tokyo-porn-tube.com", - "||tokyocn.com", - "tw.tomonews.net", - ".tongil.or.kr", - ".tono-oka.jp", - "tonyyan.net", - ".toodoc.com", - "toonel.net", - "top81.ws", - ".topnews.in", - ".toppornsites.com", - "|http://toppornsites.com", - ".torguard.net", - "||torguard.net", - "||top.tv", - ".topshareware.com", - ".topsy.com", - "||topsy.com", - "||toptip.ca", - "tora.to", - ".torcn.com", - ".torproject.org", - "||torproject.org", - "torrentprivacy.com", - "||torrentprivacy.com", - "|http://torrentproject.se", - "||torrenty.org", - "||torrentz.eu", - "||torvpn.com", - "||totalvpn.com", - ".toutiaoabc.com", - "towngain.com", - "toypark.in", - "toytractorshow.com", - ".tparents.org", - ".tpi.org.tw", - "||tpi.org.tw", - "traffichaus.com", - "||transparency.org", - "||treemall.com.tw", - "trendsmap.com", - "||trendsmap.com", - ".trialofccp.org", - "||trialofccp.org", - ".trimondi.de/SDLE", - ".trouw.nl", - "|http://trouw.nl", - ".trt.net.tr", - "trtc.com.tw", - ".truebuddha-md.org", - "|http://truebuddha-md.org", - "trulyergonomic.com", - ".truth101.co.tv", - "|http://truth101.co.tv", - ".truthontour.org", - "|http://truthontour.org", - ".truveo.com", - ".tsctv.net", - ".tsemtulku.com", - "tsquare.tv", - ".tsu.org.tw", - "tsunagarumon.com", - ".tsctv.net", - "||tt1069.com", - ".tttan.com", - "||tttan.com", - "bb.ttv.com.tw/bb", - "tu8964.com", - ".tubaholic.com", - ".tube.com", - "tube8.com", - "||tube8.com", - ".tube911.com", - "||tube911.com", - ".tubecup.com", - ".tubegals.com", - ".tubeislam.com", - "|http://tubeislam.com", - ".tubestack.com", - "||tubewolf.com", - ".tuibeitu.net", - "tuidang.net", - ".tuidang.org", - "||tuidang.org", - ".tuidang.se", - "bbs.tuitui.info", - ".tumutanzi.com", - "|http://tumutanzi.com", - "||tumview.com", - ".tunein.com", - "|http://tunein.com", - "||tunnelbear.com", - ".tunnelr.com", - "||tunnelr.com", - ".tuo8.blue", - "||tuo8.blue", - ".tuo8.cc", - ".tuo8.club", - "||tuo8.club", - ".tuo8.fit", - ".tuo8.hk", - ".tuo8.in", - ".tuo8.ninja", - ".tuo8.org", - "||tuo8.fit", - "||tuo8.org", - ".tuo8.pw", - "|http://tuo8.pw", - "||tuo8.red", - ".tuo8.space", - "tuitwit.com", - ".turansam.org", - ".turbobit.net", - "|http://turbobit.net", - ".turbohide.com", - "||turbohide.com", - ".tushycash.com", - "|http://tushycash.com", - "||app.tutanota.com", - ".tuvpn.com", - "||tuvpn.com", - "|http://tuzaijidi.com", - "|http://*.tuzaijidi.com", - ".tw01.org", - "|http://tw01.org", - ".tumblr.com", - "||tumblr.com", - "||lecloud.net", - "|http://cosmic.monar.ch", - "||slutmoonbeam.com", - "|http://blog.soylent.com", - ".tv.com", - "|http://tv.com", - "tvants.com", - "forum.tvb.com", - "news.tvb.com/list/world", - "news.tvb.com/local", - "news.tvbs.com.tw", - ".tvboxnow.com", - "|http://tvboxnow.com/", - "tvider.com", - ".tvmost.com.hk", - ".tvplayvideos.com", - "||tvunetworks.com", - ".tw-blog.com", - "|https://tw-blog.com", - ".tw-npo.org", - ".twaitter.com", - "twapperkeeper.com", - "||twapperkeeper.com", - "||twaud.io", - ".twaud.io", - ".twavi.com", - ".twbbs.net.tw", - "twbbs.org", - "twbbs.tw", - "||twblogger.com", - "tweepmag.com", - ".tweepml.org", - "||tweepml.org", - ".tweetbackup.com", - "||tweetbackup.com", - "tweetboard.com", - "||tweetboard.com", - ".tweetboner.biz", - "||tweetboner.biz", - ".tweetcs.com", - "|http://tweetcs.com", - "|http://deck.ly", - "||mtw.tl", - "||tweetedtimes.com", - "||tweetmylast.fm", - "tweetphoto.com", - "||tweetphoto.com", - "||tweetrans.com", - "tweetree.com", - "||tweetree.com", - ".tweettunnel.com", - "||tweettunnel.com", - "||tweetwally.com", - "tweetymail.com", - "||twelve.today", - ".tweez.net", - "|http://tweez.net", - "||twftp.org", - "||twgreatdaily.com", - "twibase.com", - ".twibble.de", - "||twibble.de", - "twibbon.com", - "||twibs.com", - ".twicountry.org", - "|http://twicountry.org", - "twicsy.com", - ".twiends.com", - "|http://twiends.com", - ".twifan.com", - "|http://twifan.com", - "twiffo.com", - "||twiffo.com", - ".twilightsex.com", - "twilog.org", - "twimbow.com", - "||twindexx.com", - "twipple.jp", - "||twipple.jp", - "||twip.me", - "twishort.com", - "||twishort.com", - "twistar.cc", - "||twister.net.co", - "||twisterio.com", - "twisternow.com", - "twistory.net", - "twitbrowser.net", - "||twitcause.com", - "||twitgether.com", - "||twiggit.org", - "twitgoo.com", - "twitiq.com", - "||twitiq.com", - ".twitlonger.com", - "||twitlonger.com", - "|http://tl.gd/", - "twitmania.com", - "twitoaster.com", - "||twitoaster.com", - "||twitonmsn.com", - ".twit2d.com", - "||twit2d.com", - ".twitstat.com", - "||twitstat.com", - "||firstfivefollowers.com", - "||retweeteffect.com", - "||tweeplike.me", - "||tweepguide.com", - "||turbotwitter.com", - ".twitvid.com", - "||twitvid.com", - "|http://twt.tl", - "twittbot.net", - "||ads-twitter.com", - "||twttr.com", - "||twitter4j.org", - ".twittercounter.com", - "||twittercounter.com", - "twitterfeed.com", - ".twittergadget.com", - "||twittergadget.com", - ".twitterkr.com", - "||twitterkr.com", - "||twittermail.com", - "||twitterrific.com", - "twittertim.es", - "||twittertim.es", - "twitthat.com", - "||twitturk.com", - ".twitturly.com", - "||twitturly.com", - ".twitzap.com", - "twiyia.com", - "||twstar.net", - ".twtkr.com", - "|http://twtkr.com", - ".twnorth.org.tw", - "twskype.com", - "twtrland.com", - "twurl.nl", - ".twyac.org", - "||twyac.org", - ".txxx.com", - ".tycool.com", - "||tycool.com", - "||typepad.com", - "@@||www.typepad.com", - "@@||static.typepad.com", - "||blog.expofutures.com", - "||legaltech.law.com", - "||blogs.tampabay.com", - "||contests.twilio.com", - ".embr.in", - "||embr.in", - ".u9un.com", - "||u9un.com", - ".ubddns.org", - "|http://ubddns.org", - "||uberproxy.net", - ".uc-japan.org", - "||uc-japan.org", - ".srcf.ucam.org/salon/", - "|http://china.ucanews.com/", - "||ucdc1998.org", - "|http://hum*.uchicago.edu/faculty/ywang/history", - "||uderzo.it", - ".udn.com", - "||udn.com", - "||udn.com.tw", - "udnbkk.com/bbs", - "||uforadio.com.tw", - "ufreevpn.com", - ".ugo.com", - "||uhdwallpapers.org", - "||uhrp.org", - ".uighur.nl", - "||uighur.nl", - "uighurbiz.net", - ".ulike.net", - "ukcdp.co.uk", - "ukliferadio.co.uk", - "||ukliferadio.co.uk", - "ultravpn.fr", - "||ultravpn.fr", - "ultraxs.com", - "umich.edu/~falun", - "||unblock.cn.com", - ".unblocker.yt", - "unblock-us.com", - "||unblock-us.com", - ".unblockdmm.com", - "|http://unblockdmm.com", - "||unblocksit.es", - "uncyclomedia.org", - ".uncyclopedia.hk/wiki", - "|http://uncyclopedia.hk", - "|http://uncyclopedia.tw", - "underwoodammo.com", - "||underwoodammo.com", - "||unholyknight.com", - ".uni.cc", - "||cldr.unicode.org", - ".unification.net", - ".unification.org.tw", - "||unirule.cloud", - ".unitedsocialpress.com", - ".unix100.com", - "||unknownspace.org", - ".unodedos.com", - "unpo.org", - ".untraceable.us", - "|http://untraceable.us", - "||uocn.org", - "tor.updatestar.com", - ".upholdjustice.org", - ".upload4u.info", - "uploaded.net/file", - "|http://uploaded.net/file", - "|http://uploaded.to/file", - ".uploadstation.com/file", - ".upmedia.mg", - "||upmedia.mg", - ".upornia.com", - "|http://upornia.com", - "||uproxy.org", - "|http://tor.cn.uptodown.com/", - ".upwill.org", - "ur7s.com", - "||urbansurvival.com", - "myshare.url.com.tw/", - "||urlborg.com", - "||urlparser.com", - "us.to", - "||usacn.com", - ".usaip.eu", - "||usaip.eu", - "dalailama.usc.edu", - "iipdigital.usembassy.gov", - "||usfk.mil", - "||usma.edu", - "||usmc.mil", - ".usocctn.com", - "|http://tarr.uspto.gov/", - "||tsdr.uspto.gov", - ".ustream.tv", - "||ustream.tv", - ".usunitednews.com", - "|http://usunitednews.com", - "usus.cc", - ".utopianpal.com", - "||utopianpal.com", - ".uu-gg.com", - ".uvwxyz.xyz", - "||uvwxyz.xyz", - ".uwants.com", - ".uwants.net", - "uyghur.co.uk", - "|http://uyghur-j.org", - "||uyghuramerican.org", - ".uyghurcanadiansociety.org", - ".uyghurensemble.co.uk", - "||uyghurcongress.org", - ".uyghurpen.org", - ".uyghurpress.com", - "|https://uyghurpress.com", - ".uyghurstudies.org", - "|http://uyghurstudies.org", - "uygur.org", - "|http://uymaarip.com/", - ".v2ray.com", - "||v2ray.com", - ".van001.com", - ".van698.com", - ".vanemu.cn", - ".vanilla-jp.com", - ".vanpeople.com", - "vansky.com", - "||vaticannews.va", - "||vcf-online.org", - "||vcfbuilder.org", - ".vegasred.com", - ".velkaepocha.sk", - ".venbbs.com", - ".venchina.com", - ".venetianmacao.com", - "||venetianmacao.com", - "veoh.com", - "mysite.verizon.net", - "vermonttibet.org", - ".versavpn.com", - "||versavpn.com", - "||verybs.com", - ".vft.com.tw", - ".viber.com", - "||viber.com", - ".vica.info", - ".victimsofcommunism.org", - "|http://victimsofcommunism.org", - "||vid.me", - "||vidble.com", - "videobam.com", - "||videobam.com", - ".videodetective.com", - ".videomega.tv", - "||videomega.tv", - ".videomo.com", - "videopediaworld.com", - ".videopress.com", - ".vidinfo.org/video", - "vietdaikynguyen.com", - ".vijayatemple.org", - "vimeo.com", - "||vimeo.com", - "||vimperator.org", - "||vincnd.com", - "||vinniev.com", - "|http://www.lib.virginia.edu/area-studies/Tibet/tibet.html", - ".virtualrealporn.com", - "||virtualrealporn.com", - "visibletweets.com", - "|http://ny.visiontimes.com", - ".vital247.org", - "||viu.com", - ".vivahentai4u.net", - ".vivatube.com", - ".vivthomas.com", - "||vivthomas.com", - ".vjav.com", - "||vjav.com", - ".vjmedia.com.hk", - ".vllcs.org", - "|http://vllcs.org", - "||vmixcore.com", - "||vnet.link", - "cn.voa.mobi", - "tw.voa.mobi", - ".voachineseblog.com", - "||voachineseblog.com", - "voagd.com", - ".voacantonese.com", - "||voacantonese.com", - "voachinese.com", - "||voachinese.com", - ".voanews.com", - "||voanews.com", - "voatibetan.com", - "||voatibetan.com", - ".voatibetanenglish.com", - "||voatibetanenglish.com", - ".vocativ.com", - "vocn.tv", - ".vot.org", - "||vot.org", - ".vovo2000.com", - "|http://vovo2000.com", - ".voxer.com", - "||voxer.com", - ".voy.com", - "||vpn.ac", - ".vpn4all.com", - "||vpn4all.com", - ".vpnaccount.org", - "|http://vpnaccount.org", - ".vpnaccounts.com", - "||vpnaccounts.com", - ".vpncomparison.org", - ".vpncup.com", - "||vpncup.com", - "vpnbook.com", - ".vpncoupons.com", - "|http://vpncoupons.com", - ".vpndada.com", - "||vpndada.com", - ".vpnfan.com", - "vpnfire.com", - ".vpnfires.biz", - ".vpnforgame.net", - "||vpnforgame.net", - "||vpngate.jp", - ".vpngate.net", - "||vpngate.net", - ".vpngratis.net", - "vpnhq.com", - ".vpnmaster.com", - "||vpnmaster.com", - ".vpnmentor.com", - "||vpnmentor.com", - ".vpninja.net", - "||vpninja.net", - ".vpnintouch.com", - "||vpnintouch.net", - "vpnjack.com", - "||vpnjack.com", - ".vpnpick.com", - "||vpnpick.com", - "||vpnpop.com", - "||vpnpronet.com", - ".vpnreactor.com", - "||vpnreactor.com", - "||vpnreviewz.com", - ".vpnsecure.me", - "||vpnsecure.me", - ".vpnshazam.com", - "||vpnshazam.com", - ".vpnshieldapp.com", - "||vpnshieldapp.com", - ".vpnsp.com", - ".vpntraffic.com", - ".vpntunnel.com", - "||vpntunnel.com", - ".vpnuk.info", - "||vpnuk.info", - "||vpnunlimitedapp.com", - ".vpnvip.com", - "||vpnvip.com", - ".vpnworldwide.com", - ".vporn.com", - "||vporn.com", - ".vpser.net", - "@@||vpser.net", - "vraiesagesse.net", - ".vrmtr.com", - "||vtunnel.com", - "||vuku.cc", - "lists.w3.org/archives/public", - "||w3schools.com", - "||waffle1999.com", - ".wahas.com", - ".waigaobu.com", - "waikeung.org/php_wind", - ".wailaike.net", - ".waiwaier.com", - "|http://waiwaier.com", - "||wallmama.com", - "wallornot.org", - "||wallpapercasa.com", - ".wallproxy.com", - "@@||wallproxy.com.cn", - "||waltermartin.com", - "||waltermartin.org", - "||www.wan-press.org", - "||wanderinghorse.net", - "||wangafu.net", - "||wangjinbo.org", - ".wangjinbo.org", - "wanglixiong.com", - ".wango.org", - "||wango.org", - "wangruoshui.net", - "www.wangruowang.org", - "want-daily.com", - "wapedia.mobi/zhsimp", - "||waselpro.com", - ".watchinese.com", - ".wattpad.com", - "||wattpad.com", - ".makzhou.warehouse333.com", - "washeng.net", - ".watch8x.com", - "||watchmygf.net", - "||wav.tv", - ".wdf5.com", - ".wearehairy.com", - ".wearn.com", - "||wearn.com", - "|http://hkcoc.weather.com.hk", - "||hudatoriq.web.id", - "||web2project.net", - "webbang.net", - ".webevader.org", - ".webfreer.com", - "weblagu.com", - ".webjb.org", - ".webrush.net", - "webs-tv.net", - ".websitepulse.com/help/testtools.china-test", - "|http://www.websnapr.com", - ".webwarper.net", - "|http://webwarper.net", - "webworkerdaily.com", - ".weekmag.info", - "||wefightcensorship.org", - ".wefong.com", - "weiboleak.com", - ".weihuo.org", - "weijingsheng.org", - ".weiming.info", - "||weiming.info", - "weiquanwang.org", - "|http://weisuo.ws", - ".welovecock.com", - ".wemigrate.org", - "|http://wemigrate.org", - "wengewang.com", - "||wengewang.org", - ".wenhui.ch", - "|http://trans.wenweipo.com/gb/", - ".wenxuecity.com", - "||wenxuecity.com", - ".wenyunchao.com", - "||wenyunchao.com", - ".westca.com", - "||westca.com", - "||westernwolves.com", - ".westkit.net", - "||westpoint.edu", - ".westernshugdensociety.org", - "wetpussygames.com", - ".wetplace.com", - "wexiaobo.org", - "||wexiaobo.org", - "wezhiyong.org", - "||wezone.net", - ".wforum.com", - "||wforum.com/", - ".whatblocked.com", - "||whatblocked.com", - ".wheatseeds.org", - "||wheelockslatin.com", - ".whippedass.com", - ".whoer.net", - "||whoer.net", - "whotalking.com", - "whylover.com", - "||whyx.org", - "|http://zh.ecdm.wikia.com", - "|http://evchk.wikia.com", - "fq.wikia.com", - "zh.pttpedia.wikia.com/wiki/%E7%BF%92%E5%8C%85%E5%AD%90%E4%B9%8B%E4%BA%82", - "cn.uncyclopedia.wikia.com", - "zh.uncyclopedia.wikia.com", - "||wikileaks.ch", - "||wikileaks.com", - "||wikileaks.de", - "||wikileaks.eu", - "||wikileaks.lu", - ".wikileaks.org", - "||wikileaks.org", - "||wikileaks.pl", - ".wikileaks-forum.com", - "wildammo.com", - ".williamhill.com", - "||collateralmurder.com", - "||collateralmurder.org", - "wikilivres.info/wiki/%E9%9B%B6%E5%85%AB%E5%AE%AA%E7%AB%A0", - "||wikimapia.org", - "|http://zh.wikisource.org", - "||zh.wikinews.org", - "||ja.wikipedia.org", - "||wikipedia.org", - "||wikiwiki.jp", - "||casino.williamhill.com", - "||sports.williamhill.com", - "||vegas.williamhill.com", - "||willw.net", - "||windowsphoneme.com", - ".windscribe.com", - "||windscribe.com", - "||community.windy.com", - "||wingy.site", - ".winning11.com", - "winwhispers.info", - "||wiredbytes.com", - "||wiredpen.com", - ".wisdompubs.org", - ".wisevid.com", - "||wisevid.com", - ".witnessleeteaching.com", - ".witopia.net", - ".wjbk.org", - "||wjbk.org", - "|http://wn.com", - ".wnacg.com", - ".wnacg.org", - ".wo.tc", - "||woeser.com", - "|http://woesermiddle-way.net/", - ".wokar.org", - "|http://wokar.org", - "wolfax.com", - "||wolfax.com", - "||woolyss.com", - "woopie.jp", - "||woopie.jp", - "woopie.tv", - "||woopie.tv", - "||workatruna.com", - ".workerdemo.org.hk", - ".workerempowerment.org", - "||workersthebig.net", - ".worldcat.org", - "worldjournal.com", - ".worldvpn.net", - "||worldvpn.net", - "||videopress.com", - ".wordpress.com", - "|http://*.wordpress.com", - "||chenshan20042005.wordpress.com", - "||chinaview.wordpress.com", - "||cnbbnews.wordpress.com", - "||freedominfonetweb.wordpress.com", - "||hka8964.wordpress.com", - "||hkanews.wordpress.com", - "||hqsbnet.wordpress.com", - "||hqsbonline.wordpress.com", - "||investigating.wordpress.com", - "||jobnewera.wordpress.com", - "||minghuiyw.wordpress.com", - "||wo3ttt.wordpress.com", - "||sujiatun.wordpress.com", - "||xijie.wordpress.com", - "||wp.com", - ".wow.com", - ".wow-life.net", - "||wowlegacy.ml", - "||wowporn.com", - "||wowgirls.com", - ".wowrk.com", - "woxinghuiguo.com", - ".woyaolian.org", - "|http://woyaolian.org", - ".wpoforum.com", - "||wpoforum.com", - ".wqyd.org", - "||wqyd.org", - "wrchina.org", - "wretch.cc", - ".wsj.com", - "||wsj.com", - ".wsj.net", - "||wsj.net", - ".wsjhk.com", - ".wtbn.org", - ".wtfpeople.com", - "wuerkaixi.com", - "||wufafangwen.com", - "wufi.org.tw", - "||wuguoguang.com", - "wujie.net", - "wujieliulan.com", - "||wujieliulan.com", - "wukangrui.net", - "||wuw.red", - "||wuyanblog.com", - ".wwitv.com", - "||wwitv.com", - "wzyboy.im/post/160", - ".x-berry.com", - "||x-berry.com", - "||x-art.com", - "||x-wall.org", - "x1949x.com", - "x365x.com", - "xanga.com", - "||xbabe.com", - ".xbookcn.com", - "||xbookcn.com", - "||xcafe.in", - "||xcity.jp", - ".xcritic.com", - "|http://cdn*.xda-developers.com", - ".xerotica.com", - "destiny.xfiles.to/ubbthreads", - ".xfm.pp.ru", - ".xgmyd.com", - "||xgmyd.com", - "xhamster.com", - "||xhamster.com", - ".xianba.net", - ".xianchawang.net", - ".xianjian.tw", - "|http://xianjian.tw", - ".xianqiao.net", - ".xiaobaiwu.com", - ".xiaochuncnjp.com", - ".xiaod.in", - ".xiaohexie.com", - "||xiaolan.me", - "||xiaoma.org", - "||xiaohexie.com", - "xiezhua.com", - ".xihua.es", - "forum.xinbao.de/forum", - ".xing.com", - "|http://xing.com", - ".xinmiao.com.hk", - "||xinmiao.com.hk", - "xinsheng.net", - "xinshijue.com", - "xinhuanet.org", - "|http://xinyubbs.net", - ".xiongpian.com", - ".xiuren.org", - "xizang-zhiye.org", - "xjp.cc", - "||xjp.cc", - "||xjtravelguide.com", - "xlfmtalk.com", - "||xlfmwz.info", - "||xml-training-guide.com", - "xmovies.com", - "||xnxx.com", - "xpdo.net", - "||xpud.org", - ".xrentdvd.com", - ".xskywalker.net", - "||xtube.com", - "blog.xuite.net", - "vlog.xuite.net", - "xuzhiyong.net", - "||xuchao.org", - "xuchao.net", - "||xuchao.net", - "xvideo.cc", - ".xvideos.com", - "||xvideos.com", - "||xvideos.es", - ".xkiwi.tk/", - ".xxbbx.com", - ".xxlmovies.com", - "||xxx.com", - ".xxx.xxx", - "|http://xxx.xxx", - ".xxxfuckmom.com", - "||xxxx.com.au", - ".xxxymovies.com", - "|http://xxxymovies.com", - "xys.org", - "xysblogs.org", - "xyy69.com", - "xyy69.info", - "||yakbutterblues.com", - "||yam.com", - "||yam.org.tw", - ".yanghengjun.com", - "yangjianli.com", - ".yasni.co.uk", - "||yasni.co.uk", - ".yayabay.com/forum", - ".ydy.com", - ".yeahteentube.com", - "||yeahteentube.com", - "||yecl.net", - "||yeelou.com", - "yeeyi.com", - "yegle.net", - "||yegle.net", - ".yes.xxx", - "||yes123.com.tw", - "||yesasia.com", - "||yesasia.com.hk", - ".yes-news.com", - "|http://yes-news.com", - ".yespornplease.com", - "||yespornplease.com", - "|http://yeyeclub.com", - "||yhcw.net", - ".yibada.com", - ".yibaochina.com", - ".yidio.com", - "||yidio.com", - "yilubbs.com", - "xa.yimg.com", - ".yingsuoss.com", - ".yipub.com", - "||yipub.com", - "yinlei.org/mt", - ".yizhihongxing.com", - ".yobt.com", - ".yobt.tv", - "||yobt.tv", - ".yogichen.org", - "||yogichen.org", - ".yolasite.com", - ".yomiuri.co.jp", - "yong.hu", - ".yorkbbs.ca", - "||youxu.info", - ".youjizz.com", - "||youjizz.com", - ".youmaker.com", - "||youmaker.com", - ".youngpornvideos.com", - "youngspiration.hk", - ".youpai.org", - "||youpai.org", - ".your-freedom.net", - "||yourepeat.com", - ".yourprivatevpn.com", - "||yourprivatevpn.com", - ".yousendit.com", - "||yousendit.com", - ".youthnetradio.org/tmit/forum", - "blog.youthwant.com.tw", - "me.youthwant.com.tw", - "share.youthwant.com.tw", - "topic.youthwant.com.tw", - ".youporn.com", - "||youporn.com", - ".youporngay.com", - "||youporngay.com", - ".yourlisten.com", - "|http://yourlisten.com", - ".yourlust.com", - "|http://yourlust.com", - "youshun12.com", - ".youtubecn.com", - "youversion.com", - "||youversion.com", - "blog.youxu.info/2010/03/14/west-chamber", - "ytht.net", - "yuanming.net", - ".yuanzhengtang.org", - ".yulghun.com", - "||yunchao.net", - "||yuntipub.com", - ".yuvutu.com", - "||yvesgeleyn.com", - ".ywpw.com/forums/history/post/A0/p0/html/227", - "yx51.net", - ".yyii.org", - "||yyii.org", - ".yzzk.com", - "|http://yzzk.com", - "zacebook.com", - ".zalmos.com", - "||zalmos.com", - "||zannel.com", - ".zaobao.com", - "||zaobao.com", - "|http://zaobao.com.sg", - "||zaobao.com.sg", - ".zaozon.com", - "||zdnet.com.tw", - ".zello.com", - "||zello.com", - ".zengjinyan.org", - ".zenmate.com", - "||zenmate.com", - "||zenmate.com.ru", - "||zeronet.io", - "||zeutch.com", - ".zfreet.com", - ".zgsddh.com", - "zgzcjj.net", - ".zhanbin.net", - "||zhanbin.net", - ".zhangboli.net", - "||zhangtianliang.com", - "||zhanlve.org", - "zhenghui.org", - ".zhengjian.org", - "||zhengjian.org", - "zhengwunet.org", - "zhenlibu.info", - "||zhenlibu.info", - ".zhenlibu1984.com", - "||zhenlibu1984.com", - "|http://zhenxiang.biz", - ".zhinengluyou.com", - "zhongguo.ca", - "|http://zhongguorenquan.org", - "zhongguotese.net", - "||zhongguotese.net", - "||zhongmeng.org", - ".zhoushuguang.com", - "||zhreader.com", - ".zhuangbi.me", - "||zhuangbi.me", - ".zhuanxing.cn", - "||zhuatieba.com", - "zhuichaguoji.org", - "||zhuichaguoji.org", - "|http://book.zi5.me", - ".ziddu.com/download", - "||zillionk.com", - ".zinio.com", - "||zinio.com", - ".ziporn.com", - ".zippyshare.com", - ".zkaip.com", - "||zkaip.com", - "realforum.zkiz.com", - "||zmw.cn", - ".zodgame.us", - "zomobo.net", - ".zonaeuropa.com", - "||zonaeuropa.com", - "||zonghexinwen.com", - ".zonghexinwen.net", - "||zoogvpn.com", - "||zootool.com", - ".zoozle.net", - "writer.zoho.com", - "||zorrovpn.com", - "||zpn.im", - "||zspeeder.me", - ".zsrhao.com", - ".zuo.la", - "||zuo.la", - "||zuobiao.me", - ".zuola.com", - "||zuola.com", - "||zvereff.com", - ".zynaima.com", - "zyzc9.com", - ".zzcartoon.com", - "64memo", - "aHR0cHM6Ly95ZWNsLm5ldA", - "freenet", - ".google.*/falun", - "phobos.apple.com*/video", - "q=freedom", - "q%3Dfreedom", - "remembering_tiananmen_20_years", - "search*safeweb", - "q=triangle", - "q%3DTriangle", - "ultrareach", - "ultrasurf", - "@@||aliyun.com", - "@@||baidu.com", - "@@||chinaso.com", - "@@||chinaz.com", - "@@|http://nrch.culture.tw/", - "@@||adservice.google.com", - "@@||dl.google.com", - "@@||kh.google.com", - "@@||khm.google.com", - "@@||khm0.google.com", - "@@||khm1.google.com", - "@@||khm2.google.com", - "@@||khm3.google.com", - "@@||khmdb.google.com", - "@@||tools.google.com", - "@@||clientservices.googleapis.com", - "@@||fonts.googleapis.com", - "@@||khm.googleapis.com", - "@@||khm0.googleapis.com", - "@@||khm1.googleapis.com", - "@@||khm2.googleapis.com", - "@@||khm3.googleapis.com", - "@@||khmdb.googleapis.com", - "@@||storage.googleapis.com", - "@@||translate.googleapis.com", - "@@||update.googleapis.com", - "@@||safebrowsing.googleapis.com", - "@@||cn.gravatar.com", - "@@||connectivitycheck.gstatic.com", - "@@||csi.gstatic.com", - "@@||fonts.gstatic.com", - "@@||ssl.gstatic.com", - "@@||haosou.com", - "@@||ip.cn", - "@@||jike.com", - "@@|http://translate.google.cn", - "@@|http://www.google.cn/maps", - "@@||http2.golang.org", - "@@||gov.cn", - "@@||qq.com", - "@@||sina.cn", - "@@||sina.com.cn", - "@@||sogou.com", - "@@||so.com", - "@@||soso.com", - "@@||uluai.com.cn", - "@@||weibo.com", - "@@||yahoo.cn", - "@@||youdao.com", - "@@||zhongsou.com", - "@@|http://ime.baidu.jp" -]; - -/* -* This file is part of Adblock Plus , -* Copyright (C) 2006-2014 Eyeo GmbH -* -* Adblock Plus is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 3 as -* published by the Free Software Foundation. -* -* Adblock Plus 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 Adblock Plus. If not, see . -*/ - -function createDict() -{ - var result = {}; - result.__proto__ = null; - return result; -} - -function getOwnPropertyDescriptor(obj, key) -{ - if (obj.hasOwnProperty(key)) - { - return obj[key]; - } - return null; -} - -function extend(subclass, superclass, definition) -{ - if (Object.__proto__) - { - definition.__proto__ = superclass.prototype; - subclass.prototype = definition; - } - else - { - var tmpclass = function(){}, ret; - tmpclass.prototype = superclass.prototype; - subclass.prototype = new tmpclass(); - subclass.prototype.constructor = superclass; - for (var i in definition) - { - if (definition.hasOwnProperty(i)) - { - subclass.prototype[i] = definition[i]; - } - } - } -} - -function Filter(text) -{ - this.text = text; - this.subscriptions = []; -} -Filter.prototype = { - text: null, - subscriptions: null, - toString: function() - { - return this.text; - } -}; -Filter.knownFilters = createDict(); -Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/; -Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/; -Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/; -Filter.fromText = function(text) -{ - if (text in Filter.knownFilters) - { - return Filter.knownFilters[text]; - } - var ret; - if (text.charAt(0) == "!") - { - ret = new CommentFilter(text); - } - else - { - ret = RegExpFilter.fromText(text); - } - Filter.knownFilters[ret.text] = ret; - return ret; -}; - -function InvalidFilter(text, reason) -{ - Filter.call(this, text); - this.reason = reason; -} -extend(InvalidFilter, Filter, { - reason: null -}); - -function CommentFilter(text) -{ - Filter.call(this, text); -} -extend(CommentFilter, Filter, { -}); - -function ActiveFilter(text, domains) -{ - Filter.call(this, text); - this.domainSource = domains; -} -extend(ActiveFilter, Filter, { - domainSource: null, - domainSeparator: null, - ignoreTrailingDot: true, - domainSourceIsUpperCase: false, - getDomains: function() - { - var prop = getOwnPropertyDescriptor(this, "domains"); - if (prop) - { - return prop; - } - var domains = null; - if (this.domainSource) - { - var source = this.domainSource; - if (!this.domainSourceIsUpperCase) - { - source = source.toUpperCase(); - } - var list = source.split(this.domainSeparator); - if (list.length == 1 && (list[0]).charAt(0) != "~") - { - domains = createDict(); - domains[""] = false; - if (this.ignoreTrailingDot) - { - list[0] = list[0].replace(/\.+$/, ""); - } - domains[list[0]] = true; - } - else - { - var hasIncludes = false; - for (var i = 0; i < list.length; i++) - { - var domain = list[i]; - if (this.ignoreTrailingDot) - { - domain = domain.replace(/\.+$/, ""); - } - if (domain == "") - { - continue; - } - var include; - if (domain.charAt(0) == "~") - { - include = false; - domain = domain.substr(1); - } - else - { - include = true; - hasIncludes = true; - } - if (!domains) - { - domains = createDict(); - } - domains[domain] = include; - } - domains[""] = !hasIncludes; - } - this.domainSource = null; - } - return this.domains; - }, - sitekeys: null, - isActiveOnDomain: function(docDomain, sitekey) - { - if (this.getSitekeys() && (!sitekey || this.getSitekeys().indexOf(sitekey.toUpperCase()) < 0)) - { - return false; - } - if (!this.getDomains()) - { - return true; - } - if (!docDomain) - { - return this.getDomains()[""]; - } - if (this.ignoreTrailingDot) - { - docDomain = docDomain.replace(/\.+$/, ""); - } - docDomain = docDomain.toUpperCase(); - while (true) - { - if (docDomain in this.getDomains()) - { - return this.domains[docDomain]; - } - var nextDot = docDomain.indexOf("."); - if (nextDot < 0) - { - break; - } - docDomain = docDomain.substr(nextDot + 1); - } - return this.domains[""]; - }, - isActiveOnlyOnDomain: function(docDomain) - { - if (!docDomain || !this.getDomains() || this.getDomains()[""]) - { - return false; - } - if (this.ignoreTrailingDot) - { - docDomain = docDomain.replace(/\.+$/, ""); - } - docDomain = docDomain.toUpperCase(); - for (var domain in this.getDomains()) - { - if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1)) - { - return false; - } - } - return true; - } -}); - -function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) -{ - ActiveFilter.call(this, text, domains, sitekeys); - if (contentType != null) - { - this.contentType = contentType; - } - if (matchCase) - { - this.matchCase = matchCase; - } - if (thirdParty != null) - { - this.thirdParty = thirdParty; - } - if (sitekeys != null) - { - this.sitekeySource = sitekeys; - } - if (regexpSource.length >= 2 && regexpSource.charAt(0) == "/" && regexpSource.charAt(regexpSource.length - 1) == "/") - { - var regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i"); - this.regexp = regexp; - } - else - { - this.regexpSource = regexpSource; - } -} -extend(RegExpFilter, ActiveFilter, { - domainSourceIsUpperCase: true, - length: 1, - domainSeparator: "|", - regexpSource: null, - getRegexp: function() - { - var prop = getOwnPropertyDescriptor(this, "regexp"); - if (prop) - { - return prop; - } - var source = this.regexpSource.replace(/\*+/g, "*").replace(/\^\|$/, "^").replace(/\W/g, "\\$&").replace(/\\\*/g, ".*").replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)").replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?").replace(/^\\\|/, "^").replace(/\\\|$/, "$").replace(/^(\.\*)/, "").replace(/(\.\*)$/, ""); - var regexp = new RegExp(source, this.matchCase ? "" : "i"); - this.regexp = regexp; - return regexp; - }, - contentType: 2147483647, - matchCase: false, - thirdParty: null, - sitekeySource: null, - getSitekeys: function() - { - var prop = getOwnPropertyDescriptor(this, "sitekeys"); - if (prop) - { - return prop; - } - var sitekeys = null; - if (this.sitekeySource) - { - sitekeys = this.sitekeySource.split("|"); - this.sitekeySource = null; - } - this.sitekeys = sitekeys; - return this.sitekeys; - }, - matches: function(location, contentType, docDomain, thirdParty, sitekey) - { - if (this.getRegexp().test(location) && this.isActiveOnDomain(docDomain, sitekey)) - { - return true; - } - return false; - } -}); -RegExpFilter.prototype["0"] = "#this"; -RegExpFilter.fromText = function(text) -{ - var blocking = true; - var origText = text; - if (text.indexOf("@@") == 0) - { - blocking = false; - text = text.substr(2); - } - var contentType = null; - var matchCase = null; - var domains = null; - var sitekeys = null; - var thirdParty = null; - var collapse = null; - var options; - var match = text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null; - if (match) - { - options = match[1].toUpperCase().split(","); - text = match.input.substr(0, match.index); - for (var _loopIndex6 = 0; _loopIndex6 < options.length; ++_loopIndex6) - { - var option = options[_loopIndex6]; - var value = null; - var separatorIndex = option.indexOf("="); - if (separatorIndex >= 0) - { - value = option.substr(separatorIndex + 1); - option = option.substr(0, separatorIndex); - } - option = option.replace(/-/, "_"); - if (option in RegExpFilter.typeMap) - { - if (contentType == null) - { - contentType = 0; - } - contentType |= RegExpFilter.typeMap[option]; - } - else if (option.charAt(0) == "~" && option.substr(1) in RegExpFilter.typeMap) - { - if (contentType == null) - { - contentType = RegExpFilter.prototype.contentType; - } - contentType &= ~RegExpFilter.typeMap[option.substr(1)]; - } - else if (option == "MATCH_CASE") - { - matchCase = true; - } - else if (option == "~MATCH_CASE") - { - matchCase = false; - } - else if (option == "DOMAIN" && typeof value != "undefined") - { - domains = value; - } - else if (option == "THIRD_PARTY") - { - thirdParty = true; - } - else if (option == "~THIRD_PARTY") - { - thirdParty = false; - } - else if (option == "COLLAPSE") - { - collapse = true; - } - else if (option == "~COLLAPSE") - { - collapse = false; - } - else if (option == "SITEKEY" && typeof value != "undefined") - { - sitekeys = value; - } - else - { - return new InvalidFilter(origText, "Unknown option " + option.toLowerCase()); - } - } - } - if (!blocking && (contentType == null || contentType & RegExpFilter.typeMap.DOCUMENT) && (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text)) - { - if (contentType == null) - { - contentType = RegExpFilter.prototype.contentType; - } - contentType &= ~RegExpFilter.typeMap.DOCUMENT; - } - try - { - if (blocking) - { - return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse); - } - else - { - return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys); - } - } - catch (e) - { - return new InvalidFilter(origText, e); - } -}; -RegExpFilter.typeMap = { - OTHER: 1, - SCRIPT: 2, - IMAGE: 4, - STYLESHEET: 8, - OBJECT: 16, - SUBDOCUMENT: 32, - DOCUMENT: 64, - XBL: 1, - PING: 1, - XMLHTTPREQUEST: 2048, - OBJECT_SUBREQUEST: 4096, - DTD: 1, - MEDIA: 16384, - FONT: 32768, - BACKGROUND: 4, - POPUP: 268435456, - ELEMHIDE: 1073741824 -}; -RegExpFilter.prototype.contentType &= ~ (RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP); - -function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys, collapse) -{ - RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); - this.collapse = collapse; -} -extend(BlockingFilter, RegExpFilter, { - collapse: null -}); - -function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) -{ - RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); -} -extend(WhitelistFilter, RegExpFilter, { -}); - -function Matcher() -{ - this.clear(); -} -Matcher.prototype = { - filterByKeyword: null, - keywordByFilter: null, - clear: function() - { - this.filterByKeyword = createDict(); - this.keywordByFilter = createDict(); - }, - add: function(filter) - { - if (filter.text in this.keywordByFilter) - { - return; - } - var keyword = this.findKeyword(filter); - var oldEntry = this.filterByKeyword[keyword]; - if (typeof oldEntry == "undefined") - { - this.filterByKeyword[keyword] = filter; - } - else if (oldEntry.length == 1) - { - this.filterByKeyword[keyword] = [oldEntry, filter]; - } - else - { - oldEntry.push(filter); - } - this.keywordByFilter[filter.text] = keyword; - }, - remove: function(filter) - { - if (!(filter.text in this.keywordByFilter)) - { - return; - } - var keyword = this.keywordByFilter[filter.text]; - var list = this.filterByKeyword[keyword]; - if (list.length <= 1) - { - delete this.filterByKeyword[keyword]; - } - else - { - var index = list.indexOf(filter); - if (index >= 0) - { - list.splice(index, 1); - if (list.length == 1) - { - this.filterByKeyword[keyword] = list[0]; - } - } - } - delete this.keywordByFilter[filter.text]; - }, - findKeyword: function(filter) - { - var result = ""; - var text = filter.text; - if (Filter.regexpRegExp.test(text)) - { - return result; - } - var match = Filter.optionsRegExp.exec(text); - if (match) - { - text = match.input.substr(0, match.index); - } - if (text.substr(0, 2) == "@@") - { - text = text.substr(2); - } - var candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g); - if (!candidates) - { - return result; - } - var hash = this.filterByKeyword; - var resultCount = 16777215; - var resultLength = 0; - for (var i = 0, l = candidates.length; i < l; i++) - { - var candidate = candidates[i].substr(1); - var count = candidate in hash ? hash[candidate].length : 0; - if (count < resultCount || count == resultCount && candidate.length > resultLength) - { - result = candidate; - resultCount = count; - resultLength = candidate.length; - } - } - return result; - }, - hasFilter: function(filter) - { - return filter.text in this.keywordByFilter; - }, - getKeywordForFilter: function(filter) - { - if (filter.text in this.keywordByFilter) - { - return this.keywordByFilter[filter.text]; - } - else - { - return null; - } - }, - _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty, sitekey) - { - var list = this.filterByKeyword[keyword]; - for (var i = 0; i < list.length; i++) - { - var filter = list[i]; - if (filter == "#this") - { - filter = list; - } - if (filter.matches(location, contentType, docDomain, thirdParty, sitekey)) - { - return filter; - } - } - return null; - }, - matchesAny: function(location, contentType, docDomain, thirdParty, sitekey) - { - var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); - if (candidates === null) - { - candidates = []; - } - candidates.push(""); - for (var i = 0, l = candidates.length; i < l; i++) - { - var substr = candidates[i]; - if (substr in this.filterByKeyword) - { - var result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); - if (result) - { - return result; - } - } - } - return null; - } -}; - -function CombinedMatcher() -{ - this.blacklist = new Matcher(); - this.whitelist = new Matcher(); - this.resultCache = createDict(); -} -CombinedMatcher.maxCacheEntries = 1000; -CombinedMatcher.prototype = { - blacklist: null, - whitelist: null, - resultCache: null, - cacheEntries: 0, - clear: function() - { - this.blacklist.clear(); - this.whitelist.clear(); - this.resultCache = createDict(); - this.cacheEntries = 0; - }, - add: function(filter) - { - if (filter instanceof WhitelistFilter) - { - this.whitelist.add(filter); - } - else - { - this.blacklist.add(filter); - } - if (this.cacheEntries > 0) - { - this.resultCache = createDict(); - this.cacheEntries = 0; - } - }, - remove: function(filter) - { - if (filter instanceof WhitelistFilter) - { - this.whitelist.remove(filter); - } - else - { - this.blacklist.remove(filter); - } - if (this.cacheEntries > 0) - { - this.resultCache = createDict(); - this.cacheEntries = 0; - } - }, - findKeyword: function(filter) - { - if (filter instanceof WhitelistFilter) - { - return this.whitelist.findKeyword(filter); - } - else - { - return this.blacklist.findKeyword(filter); - } - }, - hasFilter: function(filter) - { - if (filter instanceof WhitelistFilter) - { - return this.whitelist.hasFilter(filter); - } - else - { - return this.blacklist.hasFilter(filter); - } - }, - getKeywordForFilter: function(filter) - { - if (filter instanceof WhitelistFilter) - { - return this.whitelist.getKeywordForFilter(filter); - } - else - { - return this.blacklist.getKeywordForFilter(filter); - } - }, - isSlowFilter: function(filter) - { - var matcher = filter instanceof WhitelistFilter ? this.whitelist : this.blacklist; - if (matcher.hasFilter(filter)) - { - return !matcher.getKeywordForFilter(filter); - } - else - { - return !matcher.findKeyword(filter); - } - }, - matchesAnyInternal: function(location, contentType, docDomain, thirdParty, sitekey) - { - var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); - if (candidates === null) - { - candidates = []; - } - candidates.push(""); - var blacklistHit = null; - for (var i = 0, l = candidates.length; i < l; i++) - { - var substr = candidates[i]; - if (substr in this.whitelist.filterByKeyword) - { - var result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); - if (result) - { - return result; - } - } - if (substr in this.blacklist.filterByKeyword && blacklistHit === null) - { - blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); - } - } - return blacklistHit; - }, - matchesAny: function(location, docDomain) - { - var key = location + " " + docDomain + " "; - if (key in this.resultCache) - { - return this.resultCache[key]; - } - var result = this.matchesAnyInternal(location, 0, docDomain, null, null); - if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) - { - this.resultCache = createDict(); - this.cacheEntries = 0; - } - this.resultCache[key] = result; - this.cacheEntries++; - return result; - } -}; -var defaultMatcher = new CombinedMatcher(); - -var direct = 'DIRECT;'; - -for (var i = 0; i < rules.length; i++) { - defaultMatcher.add(Filter.fromText(rules[i])); -} - -function FindProxyForURL(url, host) { - if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) { - return proxy; - } - return direct; -} diff --git a/v2rayN/v2rayN/Resources/pac.txt.gz b/v2rayN/v2rayN/Resources/pac.txt.gz deleted file mode 100644 index 7f621cb7..00000000 Binary files a/v2rayN/v2rayN/Resources/pac.txt.gz and /dev/null differ diff --git a/v2rayN/v2rayN/Resources/privoxy.exe.gz b/v2rayN/v2rayN/Resources/privoxy.exe.gz deleted file mode 100644 index bf58503c..00000000 Binary files a/v2rayN/v2rayN/Resources/privoxy.exe.gz and /dev/null differ diff --git a/v2rayN/v2rayN/Resources/privoxy_conf.txt b/v2rayN/v2rayN/Resources/privoxy_conf.txt deleted file mode 100644 index 6a265b25..00000000 --- a/v2rayN/v2rayN/Resources/privoxy_conf.txt +++ /dev/null @@ -1,8 +0,0 @@ -listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ -toggle 0 -logfile v2ray_privoxy.log -show-on-task-bar 0 -activity-animation 0 -forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . -max-client-connections 2048 -hide-console diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index b5b956d6..789e013c 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -47,8 +47,8 @@ namespace v2rayN.Resx { } /// - /// 重写当前线程的 CurrentUICulture 属性 - /// 重写当前线程的 CurrentUICulture 属性。 + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -60,6 +60,24 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Do you want to append rules? Choose yes to append, choose otherwise to replace 的本地化字符串。 + /// + internal static string AddBatchRoutingRulesYesNo { + get { + return ResourceManager.GetString("AddBatchRoutingRulesYesNo", resourceCulture); + } + } + + /// + /// 查找类似 All servers 的本地化字符串。 + /// + internal static string AllGroupServers { + get { + return ResourceManager.GetString("AllGroupServers", resourceCulture); + } + } + /// /// 查找类似 Batch export subscription to clipboard successfully 的本地化字符串。 /// @@ -88,7 +106,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 configuration format is incorrect 的本地化字符串。 + /// 查找类似 Invalid configuration format 的本地化字符串。 /// internal static string ConfigurationFormatIncorrect { get { @@ -97,7 +115,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. The system agent is available when the socks port is equal to the port in the settings in the custom configuration inbound. 的本地化字符串。 + /// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。 /// internal static string CustomServerTips { get { @@ -115,7 +133,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 DOWN 的本地化字符串。 + /// 查找类似 Download 的本地化字符串。 /// internal static string downloadSpeed { get { @@ -178,11 +196,11 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please fill in the correct format extra ID 的本地化字符串。 + /// 查找类似 Please fill in the correct custom DNS 的本地化字符串。 /// - internal static string FillCorrectAlterId { + internal static string FillCorrectDNSText { get { - return ResourceManager.GetString("FillCorrectAlterId", resourceCulture); + return ResourceManager.GetString("FillCorrectDNSText", resourceCulture); } } @@ -231,6 +249,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Please browse to import server configuration 的本地化字符串。 + /// + internal static string FillServerAddressCustom { + get { + return ResourceManager.GetString("FillServerAddressCustom", resourceCulture); + } + } + /// /// 查找类似 Please fill in the user ID 的本地化字符串。 /// @@ -294,6 +321,24 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 LAN 的本地化字符串。 + /// + internal static string LabLAN { + get { + return ResourceManager.GetString("LabLAN", resourceCulture); + } + } + + /// + /// 查找类似 Local 的本地化字符串。 + /// + internal static string LabLocal { + get { + return ResourceManager.GetString("LabLocal", resourceCulture); + } + } + /// /// 查找类似 Address 的本地化字符串。 /// @@ -312,6 +357,24 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Count 的本地化字符串。 + /// + internal static string LvCount { + get { + return ResourceManager.GetString("LvCount", resourceCulture); + } + } + + /// + /// 查找类似 Custom Icon 的本地化字符串。 + /// + internal static string LvCustomIcon { + get { + return ResourceManager.GetString("LvCustomIcon", resourceCulture); + } + } + /// /// 查找类似 Security 的本地化字符串。 /// @@ -330,6 +393,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 remarks 的本地化字符串。 + /// + internal static string LvRemarks { + get { + return ResourceManager.GetString("LvRemarks", resourceCulture); + } + } + /// /// 查找类似 Type 的本地化字符串。 /// @@ -358,7 +430,16 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Today download traffic 的本地化字符串。 + /// 查找类似 TLS 的本地化字符串。 + /// + internal static string LvTLS { + get { + return ResourceManager.GetString("LvTLS", resourceCulture); + } + } + + /// + /// 查找类似 Download traffic today 的本地化字符串。 /// internal static string LvTodayDownloadDataAmount { get { @@ -367,7 +448,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Today upload traffic 的本地化字符串。 + /// 查找类似 Upload traffic today 的本地化字符串。 /// internal static string LvTodayUploadDataAmount { get { @@ -403,7 +484,16 @@ namespace v2rayN.Resx { } /// - /// 查找类似 MediumFresh 的本地化字符串。 + /// 查找类似 Url 的本地化字符串。 + /// + internal static string LvUrl { + get { + return ResourceManager.GetString("LvUrl", resourceCulture); + } + } + + /// + /// 查找类似 Medium 的本地化字符串。 /// internal static string MediumFresh { get { @@ -421,7 +511,16 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Download V2ray successfully 的本地化字符串。 + /// 查找类似 Download GeoFile: {0} successfully 的本地化字符串。 + /// + internal static string MsgDownloadGeoFileSuccessfully { + get { + return ResourceManager.GetString("MsgDownloadGeoFileSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Download Core successfully 的本地化字符串。 /// internal static string MsgDownloadV2rayCoreSuccessfully { get { @@ -439,7 +538,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Get the subscription content successfully 的本地化字符串。 + /// 查找类似 Get subscription content successfully 的本地化字符串。 /// internal static string MsgGetSubscriptionSuccessfully { get { @@ -447,6 +546,24 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Information (Filter : {0}) 的本地化字符串。 + /// + internal static string MsgInformationTitle { + get { + return ResourceManager.GetString("MsgInformationTitle", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the address (Url) 的本地化字符串。 + /// + internal static string MsgNeedUrl { + get { + return ResourceManager.GetString("MsgNeedUrl", resourceCulture); + } + } + /// /// 查找类似 No valid subscriptions set 的本地化字符串。 /// @@ -483,6 +600,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Servers (Filter : {0}) 的本地化字符串。 + /// + internal static string MsgServerTitle { + get { + return ResourceManager.GetString("MsgServerTitle", resourceCulture); + } + } + /// /// 查找类似 Simplify PAC Success 的本地化字符串。 /// @@ -520,7 +646,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Subscription content decoding failed (non-BASE64 code) 的本地化字符串。 + /// 查找类似 Invalid subscription content 的本地化字符串。 /// internal static string MsgSubscriptionDecodingFailed { get { @@ -556,7 +682,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Update V2rayCore successfully 的本地化字符串。 + /// 查找类似 Update Core successfully 的本地化字符串。 /// internal static string MsgUpdateV2rayCoreSuccessfully { get { @@ -565,7 +691,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Update V2rayCore successfully! Restarting service... 的本地化字符串。 + /// 查找类似 Update Core successfully! Restarting service... 的本地化字符串。 /// internal static string MsgUpdateV2rayCoreSuccessfullyMore { get { @@ -583,7 +709,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Non-vmess or ss protocol 的本地化字符串。 + /// 查找类似 Non-VMess or ss protocol 的本地化字符串。 /// internal static string NonvmessOrssProtocol { get { @@ -592,7 +718,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 non-Vmess service, this feature is invalid 的本地化字符串。 + /// 查找类似 non-standard service, this feature is invalid 的本地化字符串。 /// internal static string NonVmessService { get { @@ -601,7 +727,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 V2ray-core not found, please download: {0} 的本地化字符串。 + /// 查找类似 Core not found, please download: {0} 的本地化字符串。 /// internal static string NotFoundCore { get { @@ -619,7 +745,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 operation failed, please check retry 的本地化字符串。 + /// 查找类似 operation failed, please check and retry 的本地化字符串。 /// internal static string OperationFailed { get { @@ -627,6 +753,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Operation success 的本地化字符串。 + /// + internal static string OperationSuccess { + get { + return ResourceManager.GetString("OperationSuccess", resourceCulture); + } + } + /// /// 查找类似 Please Fill Remarks 的本地化字符串。 /// @@ -646,7 +781,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Please select an agreement 的本地化字符串。 + /// 查找类似 Please select a protocol 的本地化字符串。 /// internal static string PleaseSelectProtocol { get { @@ -654,6 +789,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Please select rules 的本地化字符串。 + /// + internal static string PleaseSelectRules { + get { + return ResourceManager.GetString("PleaseSelectRules", resourceCulture); + } + } + /// /// 查找类似 Please select the server first 的本地化字符串。 /// @@ -664,7 +808,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 QuickFresh 的本地化字符串。 + /// 查找类似 Fast 的本地化字符串。 /// internal static string QuickFresh { get { @@ -672,6 +816,24 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Global hotkey {0} registered failed, reason {1} 的本地化字符串。 + /// + internal static string RegisterGlobalHotkeyFailed { + get { + return ResourceManager.GetString("RegisterGlobalHotkeyFailed", resourceCulture); + } + } + + /// + /// 查找类似 Global hotkey {0} registered successfully 的本地化字符串。 + /// + internal static string RegisterGlobalHotkeySuccessfully { + get { + return ResourceManager.GetString("RegisterGlobalHotkeySuccessfully", resourceCulture); + } + } + /// /// 查找类似 Servers deduplication completed. Old: {0}, New: {1}. 的本地化字符串。 /// @@ -681,6 +843,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Are you sure to remove the rules? 的本地化字符串。 + /// + internal static string RemoveRules { + get { + return ResourceManager.GetString("RemoveRules", resourceCulture); + } + } + /// /// 查找类似 Are you sure to remove the server? 的本地化字符串。 /// @@ -690,6 +861,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 {0},One of the required. 的本地化字符串。 + /// + internal static string RoutingRuleDetailRequiredTips { + get { + return ResourceManager.GetString("RoutingRuleDetailRequiredTips", resourceCulture); + } + } + /// /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 /// @@ -709,7 +889,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 SlowFresh 的本地化字符串。 + /// 查找类似 Slow 的本地化字符串。 /// internal static string SlowFresh { get { @@ -718,7 +898,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Note: After this function relies on the Http global proxy test, please manually adjust the Http global proxy and active node! 的本地化字符串。 + /// 查找类似 Note: This feature relies on the Http global proxy. Please manually adjust the Http global proxy and active node after testing. 的本地化字符串。 /// internal static string SpeedServerTips { get { @@ -727,7 +907,16 @@ namespace v2rayN.Resx { } /// - /// 查找类似 PAC failed to start. Run it with Admin right. 的本地化字符串。 + /// 查找类似 Speed Test... 的本地化字符串。 + /// + internal static string Speedtesting { + get { + return ResourceManager.GetString("Speedtesting", resourceCulture); + } + } + + /// + /// 查找类似 PAC failed to start. Please run this program as Administrator. 的本地化字符串。 /// internal static string StartPacFailed { get { @@ -745,7 +934,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Successful configuration + /// 查找类似 Configuration successful ///{0} 的本地化字符串。 /// internal static string SuccessfulConfiguration { @@ -755,7 +944,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Successfully imported custom configuration server 的本地化字符串。 + /// 查找类似 Custom configuration server imported successfully. 的本地化字符串。 /// internal static string SuccessfullyImportedCustomServer { get { @@ -782,12 +971,156 @@ namespace v2rayN.Resx { } /// - /// 查找类似 The ping of current service: {0} 的本地化字符串。 + /// 查找类似 System proxy 的本地化字符串。 + /// + internal static string SystemProxy { + get { + return ResourceManager.GetString("SystemProxy", resourceCulture); + } + } + + /// + /// 查找类似 The ping of current service: {0} ms 的本地化字符串。 /// internal static string TestMeOutput { get { return ResourceManager.GetString("TestMeOutput", resourceCulture); } } + + /// + /// 查找类似 Too many servers, please open the main interface 的本地化字符串。 + /// + internal static string TooManyServersTip { + get { + return ResourceManager.GetString("TooManyServersTip", resourceCulture); + } + } + + /// + /// 查找类似 *tcp camouflage type 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip1 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip1", resourceCulture); + } + } + + /// + /// 查找类似 *kcp camouflage type 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip2 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip2", resourceCulture); + } + } + + /// + /// 查找类似 *QUIC camouflage type 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip3 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip3", resourceCulture); + } + } + + /// + /// 查找类似 *grpc mode 的本地化字符串。 + /// + internal static string TransportHeaderTypeTip4 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip4", resourceCulture); + } + } + + /// + /// 查找类似 *ws path 的本地化字符串。 + /// + internal static string TransportPathTip1 { + get { + return ResourceManager.GetString("TransportPathTip1", resourceCulture); + } + } + + /// + /// 查找类似 *h2 path 的本地化字符串。 + /// + internal static string TransportPathTip2 { + get { + return ResourceManager.GetString("TransportPathTip2", resourceCulture); + } + } + + /// + /// 查找类似 *QUIC key/Kcp seed 的本地化字符串。 + /// + internal static string TransportPathTip3 { + get { + return ResourceManager.GetString("TransportPathTip3", resourceCulture); + } + } + + /// + /// 查找类似 *grpc serviceName 的本地化字符串。 + /// + internal static string TransportPathTip4 { + get { + return ResourceManager.GetString("TransportPathTip4", resourceCulture); + } + } + + /// + /// 查找类似 *Kcp seed 的本地化字符串。 + /// + internal static string TransportPathTip5 { + get { + return ResourceManager.GetString("TransportPathTip5", resourceCulture); + } + } + + /// + /// 查找类似 *http host Separated by commas (,) 的本地化字符串。 + /// + internal static string TransportRequestHostTip1 { + get { + return ResourceManager.GetString("TransportRequestHostTip1", resourceCulture); + } + } + + /// + /// 查找类似 *ws host 的本地化字符串。 + /// + internal static string TransportRequestHostTip2 { + get { + return ResourceManager.GetString("TransportRequestHostTip2", resourceCulture); + } + } + + /// + /// 查找类似 *h2 host Separated by commas (,) 的本地化字符串。 + /// + internal static string TransportRequestHostTip3 { + get { + return ResourceManager.GetString("TransportRequestHostTip3", resourceCulture); + } + } + + /// + /// 查找类似 *QUIC securty 的本地化字符串。 + /// + internal static string TransportRequestHostTip4 { + get { + return ResourceManager.GetString("TransportRequestHostTip4", resourceCulture); + } + } + + /// + /// 查找类似 Ungrouped 的本地化字符串。 + /// + internal static string UngroupedServers { + get { + return ResourceManager.GetString("UngroupedServers", resourceCulture); + } + } } } diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 50d37abe..0aa08ec9 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -127,16 +127,16 @@ Please check the server settings first - configuration format is incorrect + Invalid configuration format - Note that custom configuration relies entirely on your own configuration and does not work with all settings. The system agent is available when the socks port is equal to the port in the settings in the custom configuration inbound. + Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. Downloading... - DOWN + Download Whether to download? {0} @@ -156,9 +156,6 @@ Failed to read configuration file - - Please fill in the correct format extra ID - Please fill in the correct format server port @@ -217,10 +214,10 @@ Test Results - Today download traffic + Download traffic today - Today upload traffic + Upload traffic today Total download traffic @@ -232,19 +229,19 @@ Transport - MediumFresh + Medium Clear original subscription content - Download V2ray successfully + Download Core successfully Failed to import subscription content - Get the subscription content successfully + Get subscription content successfully No valid subscriptions set @@ -271,7 +268,7 @@ Start updating PAC... - Subscription content decoding failed (non-BASE64 code) + Invalid subscription content is unpacking... @@ -283,28 +280,28 @@ Update subscription starts - Update V2rayCore successfully + Update Core successfully - Update V2rayCore successfully! Restarting service... + Update Core successfully! Restarting service... This feature relies on the Http global proxy, please set it correctly first. - Non-vmess or ss protocol + Non-VMess or ss protocol - non-Vmess service, this feature is invalid + non-standard service, this feature is invalid - V2ray-core not found, please download: {0} + Core not found, please download: {0} Scan completed, no valid QR code found - operation failed, please check retry + operation failed, please check and retry Please Fill Remarks @@ -313,13 +310,13 @@ Please select the encryption method - Please select an agreement + Please select a protocol Please select the server first - QuickFresh + Fast Servers deduplication completed. Old: {0}, New: {1}. @@ -334,23 +331,23 @@ The server configuration file is saved at: {0} - SlowFresh + Slow - Note: After this function relies on the Http global proxy test, please manually adjust the Http global proxy and active node! + Note: This feature relies on the Http global proxy. Please manually adjust the Http global proxy and active node after testing. - PAC failed to start. Run it with Admin right. + PAC failed to start. Please run this program as Administrator. Start service ({0})... - Successful configuration + Configuration successful {0} - Successfully imported custom configuration server + Custom configuration server imported successfully. {0} servers have been imported from clipboard. @@ -359,6 +356,120 @@ Scan import URL successfully - The ping of current service: {0} + The ping of current service: {0} ms + + + Operation success + + + Please select rules + + + Are you sure to remove the rules? + + + {0},One of the required. + + + remarks + + + Url + + + Count + + + Please fill in the address (Url) + + + Do you want to append rules? Choose yes to append, choose otherwise to replace + + + Download GeoFile: {0} successfully + + + Information (Filter : {0}) + + + Custom Icon + + + Please fill in the correct custom DNS + + + *ws path + + + *h2 path + + + *QUIC key/Kcp seed + + + *grpc serviceName + + + *http host Separated by commas (,) + + + *ws host + + + *h2 host Separated by commas (,) + + + *QUIC securty + + + *tcp camouflage type + + + *kcp camouflage type + + + *QUIC camouflage type + + + *grpc mode + + + TLS + + + *Kcp seed + + + Global hotkey {0} registered failed, reason {1} + + + Global hotkey {0} registered successfully + + + Ungrouped + + + All servers + + + Please browse to import server configuration + + + System proxy + + + Speed Test... + + + Too many servers, please open the main interface + + + LAN + + + Local + + + Servers (Filter : {0}) \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 4b312497..f4c8cc69 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -130,7 +130,7 @@ 配置格式不正确 - 注意,自定义配置完全依赖您自己的配置,不能使用所有设置功能。在自定义配置inbound中有socks port等于设置中的port时,系统代理才可用 + 注意,自定义配置完全依赖您自己的配置,不能使用所有设置功能。如需使用系统代理请手工修改监听端口。 下载开始... @@ -156,9 +156,6 @@ 读取配置文件失败 - - 请填写正确格式额外ID - 请填写正确格式服务器端口 @@ -238,7 +235,7 @@ 清除原订阅内容 - 下载V2ray成功 + 下载Core成功 导入订阅内容失败 @@ -271,7 +268,7 @@ 开始更新 PAC... - 订阅内容解码失败(非BASE64码) + 无效的订阅内容 正在解压...... @@ -283,22 +280,22 @@ 更新订阅开始 - 更新V2rayCore成功 + 更新Core成功 - 更新V2rayCore成功!正在重启服务... + 更新Core成功!正在重启服务... 此功能依赖Http全局代理,请先设置正确。 - 非vmess或ss协议 + 非VMess或ss协议 - 非Vmess服务,此功能无效 + 非标准服务,此功能无效 - 找不到 v2ray-core,下载地址: {0} + 找不到Core,下载地址: {0} 扫描完成,未发现有效二维码 @@ -359,6 +356,120 @@ 扫描导入URL成功 - 当前服务的真连接延迟: {0} + 当前服务的真连接延迟: {0} ms + + + 操作成功 + + + 请先选择规则 + + + 是否确定移除规则? + + + {0},必填其中一项. + + + 别名 + + + 地址(Url) + + + 数量 + + + 请填写地址(Url) + + + 是否追加规则?选择是则追加,选择否则替换 + + + 下载 GeoFile: {0} 成功 + + + 信息 (过滤器 : {0}) + + + 自定义图标 + + + 请填写正确的自定义DNS + + + *ws path + + + *h2 path + + + *QUIC 加密密钥 + + + *grpc serviceName + + + *http host中间逗号(,)隔开 + + + *ws host + + + *h2 host中间逗号(,)隔开 + + + *QUIC 加密方式 + + + *tcp伪装类型 + + + *kcp伪装类型 + + + *QUIC伪装类型 + + + *grpc 模式 + + + 传输层安全 + + + *Kcp seed + + + 注册全局热键 {0} 失败,原因 {1} + + + 注册全局热键 {0} 成功 + + + 未分组服务器 + + + 所有服务器 + + + 请浏览导入服务器配置 + + + 系统代理 + + + 测速中... + + + 服务器太多,请打开主界面操作 + + + 局域网 + + + 本地 + + + 服务器 (过滤器 : {0}) \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/Resx.zip b/v2rayN/v2rayN/Resx/Resx.zip deleted file mode 100644 index 0cb38db9..00000000 Binary files a/v2rayN/v2rayN/Resx/Resx.zip and /dev/null differ diff --git a/v2rayN/v2rayN/Sample/BlankPac.txt b/v2rayN/v2rayN/Sample/BlankPac.txt deleted file mode 100644 index 906a14cb..00000000 --- a/v2rayN/v2rayN/Sample/BlankPac.txt +++ /dev/null @@ -1,5 +0,0 @@ -var proxy = "__PROXY__"; - -function FindProxyForURL(url, host) { - return proxy; -} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleClientConfig.txt b/v2rayN/v2rayN/Sample/SampleClientConfig.txt index a582c6ea..a33d9bd6 100644 --- a/v2rayN/v2rayN/Sample/SampleClientConfig.txt +++ b/v2rayN/v2rayN/Sample/SampleClientConfig.txt @@ -1,17 +1,11 @@ -{ - "log": { - "access": "", - "error": "", - "loglevel": "error" - }, +{ "log": { "access": "Vaccess.log", "error": "Verror.log", "loglevel": "warning" }, - "inbounds": [ - { - "tag": "proxy", + "inbounds": [{ + "tag": "tag1", "port": 10808, "protocol": "socks", "listen": "127.0.0.1", @@ -26,6 +20,38 @@ "tls" ] } + }, + { + "tag": "tag2", + "port": 10809, + "protocol": "http", + "listen": "127.0.0.1", + "settings": { + "allowTransparent": false + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } + }, + { + "tag": "tag3", + "port": 10809, + "protocol": "http", + "listen": "127.0.0.1", + "settings": { + "allowTransparent": false + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } } ], "outbounds": [{ @@ -37,7 +63,6 @@ "port": 10086, "users": [{ "id": "a3482e88-686a-4a58-8126-99c9df64b7bf", - "alterId": 64, "security": "auto" }] }], diff --git a/v2rayN/v2rayN/Sample/SampleInbound.txt b/v2rayN/v2rayN/Sample/SampleInbound.txt new file mode 100644 index 00000000..a21452dd --- /dev/null +++ b/v2rayN/v2rayN/Sample/SampleInbound.txt @@ -0,0 +1,18 @@ +{ + "tag": "tag1", + "port": 10808, + "protocol": "socks", + "listen": "127.0.0.1", + "settings": { + "auth": "noauth", + "udp": true, + "allowTransparent": false + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleServerConfig.txt b/v2rayN/v2rayN/Sample/SampleServerConfig.txt index bd773f43..3aa0bb76 100644 --- a/v2rayN/v2rayN/Sample/SampleServerConfig.txt +++ b/v2rayN/v2rayN/Sample/SampleServerConfig.txt @@ -11,7 +11,6 @@ "clients": [{ "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297", "level": 1, - "alterId": 64, "email": "t@t.tt" }] }, @@ -19,7 +18,7 @@ "network": "tcp" } }], - "outbound": [{ + "outbounds": [{ "protocol": "freedom", "settings": {} }, { diff --git a/v2rayN/v2rayN/Sample/custom_routing_black b/v2rayN/v2rayN/Sample/custom_routing_black new file mode 100644 index 00000000..9005c944 --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_black @@ -0,0 +1,29 @@ +[ + { + "outboundTag": "direct", + "protocol": [ + "bittorrent" + ] + }, + { + "outboundTag": "block", + "domain": [ + "geosite:category-ads-all" + ] + }, + { + "outboundTag": "proxy", + "ip": [ + "geoip:telegram" + ], + "domain": [ + "geosite:gfw", + "geosite:greatfire", + "geosite:tld-!cn" + ] + }, + { + "port": "0-65535", + "outboundTag": "direct" + } +] \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/custom_routing_block b/v2rayN/v2rayN/Sample/custom_routing_block deleted file mode 100644 index 0cd55ac3..00000000 --- a/v2rayN/v2rayN/Sample/custom_routing_block +++ /dev/null @@ -1 +0,0 @@ -geosite:category-ads-all, diff --git a/v2rayN/v2rayN/Sample/custom_routing_direct b/v2rayN/v2rayN/Sample/custom_routing_direct deleted file mode 100644 index 5408992c..00000000 --- a/v2rayN/v2rayN/Sample/custom_routing_direct +++ /dev/null @@ -1,132 +0,0 @@ -domain:12306.com, -domain:51ym.me, -domain:52pojie.cn, -domain:8686c.com, -domain:abercrombie.com, -domain:adobesc.com, -domain:air-matters.com, -domain:air-matters.io, -domain:airtable.com, -domain:akadns.net, -domain:apache.org, -domain:api.crisp.chat, -domain:api.termius.com, -domain:appshike.com, -domain:appstore.com, -domain:aweme.snssdk.com, -domain:bababian.com, -domain:battle.net, -domain:beatsbydre.com, -domain:bet365.com, -domain:bilibili.cn, -domain:ccgslb.com, -domain:ccgslb.net, -domain:chunbo.com, -domain:chunboimg.com, -domain:clashroyaleapp.com, -domain:cloudsigma.com, -domain:cloudxns.net, -domain:cmfu.com, -domain:culturedcode.com, -domain:dct-cloud.com, -domain:didialift.com, -domain:douyutv.com, -domain:duokan.com, -domain:dytt8.net, -domain:easou.com, -domain:ecitic.net, -domain:eclipse.org, -domain:eudic.net, -domain:ewqcxz.com, -domain:fir.im, -domain:frdic.com, -domain:fresh-ideas.cc, -domain:godic.net, -domain:goodread.com, -domain:haibian.com, -domain:hdslb.net, -domain:hollisterco.com, -domain:hongxiu.com, -domain:hxcdn.net, -domain:images.unsplash.com, -domain:img4me.com, -domain:ipify.org, -domain:ixdzs.com, -domain:jd.hk, -domain:jianshuapi.com, -domain:jomodns.com, -domain:jsboxbbs.com, -domain:knewone.com, -domain:kuaidi100.com, -domain:lemicp.com, -domain:letvcloud.com, -domain:lizhi.io, -domain:localizecdn.com, -domain:lucifr.com, -domain:luoo.net, -domain:mai.tn, -domain:maven.org, -domain:miwifi.com, -domain:moji.com, -domain:moke.com, -domain:mtalk.google.com, -domain:mxhichina.com, -domain:myqcloud.com, -domain:myunlu.com, -domain:netease.com, -domain:nfoservers.com, -domain:nssurge.com, -domain:nuomi.com, -domain:ourdvs.com, -domain:overcast.fm, -domain:paypal.com, -domain:paypalobjects.com, -domain:pgyer.com, -domain:qdaily.com, -domain:qdmm.com, -domain:qin.io, -domain:qingmang.me, -domain:qingmang.mobi, -domain:qqurl.com, -domain:rarbg.to, -domain:rrmj.tv, -domain:ruguoapp.com, -domain:sm.ms, -domain:snwx.com, -domain:soku.com, -domain:startssl.com, -domain:store.steampowered.com, -domain:symcd.com, -domain:teamviewer.com, -domain:tmzvps.com, -domain:trello.com, -domain:trellocdn.com, -domain:ttmeiju.com, -domain:udache.com, -domain:uxengine.net, -domain:weather.bjango.com, -domain:weather.com, -domain:webqxs.com, -domain:weico.cc, -domain:wenku8.net, -domain:werewolf.53site.com, -domain:windowsupdate.com, -domain:wkcdn.com, -domain:workflowy.com, -domain:xdrig.com, -domain:xiaojukeji.com, -domain:xiaomi.net, -domain:xiaomicp.com, -domain:ximalaya.com, -domain:xitek.com, -domain:xmcdn.com, -domain:xslb.net, -domain:xteko.com, -domain:yach.me, -domain:yixia.com, -domain:yunjiasu-cdn.net, -domain:zealer.com, -domain:zgslb.net, -domain:zimuzu.tv, -domain:zmz002.com, -domain:samsungdm.com, \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/custom_routing_global b/v2rayN/v2rayN/Sample/custom_routing_global new file mode 100644 index 00000000..169d8156 --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_global @@ -0,0 +1,6 @@ +[ + { + "port": "0-65535", + "outboundTag": "proxy" + } +] \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/custom_routing_locked b/v2rayN/v2rayN/Sample/custom_routing_locked new file mode 100644 index 00000000..018ee608 --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_locked @@ -0,0 +1,21 @@ +[ + { + "domain": [ + "geosite:google" + ], + "outboundTag": "proxy" + }, + { + "outboundTag": "direct", + "domain": [ + "domain:example-example.com", + "domain:example-example2.com" + ] + }, + { + "outboundTag": "block", + "domain": [ + "geosite:category-ads-all" + ] + } +] \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/custom_routing_proxy b/v2rayN/v2rayN/Sample/custom_routing_proxy deleted file mode 100644 index d67a6237..00000000 --- a/v2rayN/v2rayN/Sample/custom_routing_proxy +++ /dev/null @@ -1,33 +0,0 @@ -geosite:google, -geosite:github, -geosite:netflix, -geosite:steam, -geosite:telegram, -geosite:tumblr, -geosite:speedtest, -geosite:bbc, -domain:gvt1.com, -domain:textnow.com, -domain:twitch.tv, -domain:wikileaks.org, -domain:naver.com, -91.108.4.0/22, -91.108.8.0/22, -91.108.12.0/22, -91.108.20.0/22, -91.108.36.0/23, -91.108.38.0/23, -91.108.56.0/22, -149.154.160.0/20, -149.154.164.0/22, -149.154.172.0/22, -74.125.0.0/16, -173.194.0.0/16, -172.217.0.0/16, -216.58.200.0/24, -216.58.220.0/24, -91.108.56.116, -91.108.56.0/24, -109.239.140.0/24, -149.154.167.0/24, -149.154.175.0/24, \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/custom_routing_rules b/v2rayN/v2rayN/Sample/custom_routing_rules new file mode 100644 index 00000000..94b28108 --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_rules @@ -0,0 +1,28 @@ +[{ + "remarks": "block", + "outboundTag": "block", + "domain": [ + "geosite:category-ads-all" + ] + }, + { + "remarks": "direct", + "outboundTag": "direct", + "domain": [ + "geosite:cn" + ] + }, + { + "remarks": "direct", + "outboundTag": "direct", + "ip": [ + "geoip:private", + "geoip:cn" + ] + }, + { + "remarks": "proxy", + "port": "0-65535", + "outboundTag": "proxy" + } +] \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/custom_routing_white b/v2rayN/v2rayN/Sample/custom_routing_white new file mode 100644 index 00000000..a708ae0d --- /dev/null +++ b/v2rayN/v2rayN/Sample/custom_routing_white @@ -0,0 +1,32 @@ +[ + { + "outboundTag": "direct", + "domain": [ + "domain:example-example.com", + "domain:example-example2.com" + ] + }, + { + "outboundTag": "block", + "domain": [ + "geosite:category-ads-all" + ] + }, + { + "outboundTag": "direct", + "domain": [ + "geosite:cn" + ] + }, + { + "outboundTag": "direct", + "ip": [ + "geoip:private", + "geoip:cn" + ] + }, + { + "port": "0-65535", + "outboundTag": "proxy" + } +] \ No newline at end of file diff --git a/v2rayN/v2rayN/Tool/CDateTime.cs b/v2rayN/v2rayN/Tool/CDateTime.cs deleted file mode 100644 index fb7a2e25..00000000 --- a/v2rayN/v2rayN/Tool/CDateTime.cs +++ /dev/null @@ -1,156 +0,0 @@ -using System; -using System.Net; -using System.Runtime.InteropServices; -using System.Text; - -namespace v2rayN -{ - class CDateTime - { - /// - /// 设置本地系统时间 - /// - public static void SetLocalTime() - { - using (WebClient wc = new WebClient()) - { - string url = ""; - string result = string.Empty; - - try - { - wc.Encoding = Encoding.UTF8; - wc.DownloadStringCompleted += wc_DownloadStringCompleted; - wc.DownloadStringAsync(new Uri(url)); - } - catch - { - } - } - } - - static void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) - { - try - { - string result = e.Result; - if (Utils.IsNullOrEmpty(result)) - { - return; - } - EWebTime webTime = Utils.FromJson(result); - if (webTime != null - && webTime.result != null - && webTime.result.stime != null - && !Utils.IsNullOrEmpty(webTime.result.stime)) - { - DateTime dtWeb = GetTimeFromLinux(webTime.result.stime); - - SYSTEMTIME st = new SYSTEMTIME(); - st.FromDateTime(dtWeb); - - //调用Win32 API设置系统时间 - Win32API.SetLocalTime(ref st); - } - } - catch - { - } - } - - /// - /// 时间戳转为C#格式时间 - /// - /// - /// - private static DateTime GetTimeFromLinux(string timeStamp) - { - DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); - long lTime = long.Parse(timeStamp + "0000000"); - TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); - } - } - - /// - /// - /// - public struct SYSTEMTIME - { - public ushort wYear; - public ushort wMonth; - public ushort wDayOfWeek; - public ushort wDay; - public ushort wHour; - public ushort wMinute; - public ushort wSecond; - public ushort wMilliseconds; - - /// - /// 从System.DateTime转换。 - /// - /// System.DateTime类型的时间。 - public void FromDateTime(DateTime time) - { - wYear = (ushort)time.Year; - wMonth = (ushort)time.Month; - wDayOfWeek = (ushort)time.DayOfWeek; - wDay = (ushort)time.Day; - wHour = (ushort)time.Hour; - wMinute = (ushort)time.Minute; - wSecond = (ushort)time.Second; - wMilliseconds = (ushort)time.Millisecond; - } - - /// - /// 转换为System.DateTime类型。 - /// - /// - public DateTime ToDateTime() - { - return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds); - } - - /// - /// 静态方法。转换为System.DateTime类型。 - /// - /// SYSTEMTIME类型的时间。 - /// - public static DateTime ToDateTime(SYSTEMTIME time) - { - return time.ToDateTime(); - } - } - - public class Win32API - { - [DllImport("Kernel32.dll")] - public static extern bool SetLocalTime(ref SYSTEMTIME Time); - [DllImport("Kernel32.dll")] - public static extern void GetLocalTime(ref SYSTEMTIME Time); - } - - public class WTResult - { - /// - /// - /// - public string stime { get; set; } - } - - public class EWebTime - { - /// - /// - /// - public WTResult result { get; set; } - /// - /// - /// - public int error_code { get; set; } - /// - /// - /// - public string reason { get; set; } - } -} - diff --git a/v2rayN/v2rayN/Tool/FileManager.cs b/v2rayN/v2rayN/Tool/FileManager.cs index bd5ebf93..d668b599 100644 --- a/v2rayN/v2rayN/Tool/FileManager.cs +++ b/v2rayN/v2rayN/Tool/FileManager.cs @@ -68,7 +68,7 @@ namespace v2rayN.Tool throw ex; } } - public static bool ZipExtractToFile(string fileName) + public static bool ZipExtractToFile(string fileName, string ignoredName) { try { @@ -82,6 +82,10 @@ namespace v2rayN.Tool } try { + if (!Utils.IsNullOrEmpty(ignoredName) && entry.Name.Contains(ignoredName)) + { + continue; + } entry.ExtractToFile(Utils.GetPath(entry.Name), true); } catch (IOException ex) diff --git a/v2rayN/v2rayN/Tool/Logging.cs b/v2rayN/v2rayN/Tool/Logging.cs new file mode 100644 index 00000000..400e84a5 --- /dev/null +++ b/v2rayN/v2rayN/Tool/Logging.cs @@ -0,0 +1,70 @@ +using log4net; +using log4net.Appender; +using log4net.Core; +using log4net.Layout; +using log4net.Repository.Hierarchy; +using System; +using System.IO; +using System.Threading.Tasks; + +namespace v2rayN.Tool +{ + public class Logging + { + public static void Setup() + { + var hierarchy = (Hierarchy)LogManager.GetRepository(); + + var patternLayout = new PatternLayout + { + ConversionPattern = "%date [%thread] %-5level %logger - %message%newline" + }; + patternLayout.ActivateOptions(); + + var roller = new RollingFileAppender + { + AppendToFile = true, + RollingStyle = RollingFileAppender.RollingMode.Date, + DatePattern = "yyyy-MM-dd'.txt'", + File = Utils.GetPath(@"guiLogs\"), + Layout = patternLayout, + StaticLogFileName = false + }; + roller.ActivateOptions(); + hierarchy.Root.AddAppender(roller); + + var memory = new MemoryAppender(); + memory.ActivateOptions(); + hierarchy.Root.AddAppender(memory); + + hierarchy.Root.Level = Level.Debug; + hierarchy.Configured = true; + } + + public static void ClearLogs() + { + Task.Run(() => + { + try + { + var now = DateTime.Now.AddMonths(-1); + var dir = Utils.GetPath(@"guiLogs\"); + var files = Directory.GetFiles(dir, "*.txt"); + foreach (var filePath in files) + { + var file = new FileInfo(filePath); + if (file.CreationTime < now) + { + try + { + file.Delete(); + } + catch { } + } + } + } + catch { } + }); + } + } +} diff --git a/v2rayN/v2rayN/Tool/UIRes.cs b/v2rayN/v2rayN/Tool/UIRes.cs deleted file mode 100644 index f0660435..00000000 --- a/v2rayN/v2rayN/Tool/UIRes.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Collections.Generic; -using System.Reflection; -using System.Resources; - -namespace v2rayN -{ - public class UIRes - { - static ResourceManager res = new ResourceManager("v2rayN.Resx.ResUI", Assembly.GetExecutingAssembly()); - - static string LoadString(ResourceManager resMgr, string key) - { - string value = resMgr.GetString(key); - if (value == null) - { - throw new KeyNotFoundException($"key: {key}"); - } - return value; - } - - public static string I18N(string key) - { - return LoadString(res, key); - } - } -} diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 22c37976..54f65f35 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -19,13 +19,18 @@ using ZXing.Common; using ZXing.QrCode; using System.Security.Principal; using v2rayN.Base; +using Newtonsoft.Json.Linq; +using System.Web; +using log4net; +using System.Linq; +using System.Security.Cryptography; +using System.Runtime.InteropServices; namespace v2rayN { class Utils { - #region 资源Json操作 /// @@ -46,8 +51,9 @@ namespace v2rayN result = reader.ReadToEnd(); } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return result; } @@ -68,8 +74,9 @@ namespace v2rayN result = reader.ReadToEnd(); } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return result; } @@ -107,8 +114,9 @@ namespace v2rayN Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return result; } @@ -140,12 +148,28 @@ namespace v2rayN } result = 0; } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); result = -1; } return result; } + + public static JObject ParseJson(string strJson) + { + try + { + JObject obj = JObject.Parse(strJson); + return obj; + } + catch (Exception ex) + { + SaveLog(ex.Message, ex); + + return null; + } + } #endregion #region 转换函数 @@ -159,6 +183,10 @@ namespace v2rayN { try { + if (lst == null) + { + return string.Empty; + } if (wrap) { return string.Join("," + Environment.NewLine, lst.ToArray()); @@ -168,8 +196,9 @@ namespace v2rayN return string.Join(",", lst.ToArray()); } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return string.Empty; } } @@ -185,8 +214,29 @@ namespace v2rayN str = str.Replace(Environment.NewLine, ""); return new List(str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); + return new List(); + } + } + + /// + /// 逗号分隔的字符串,先排序后转List + /// + /// + /// + public static List String2ListSorted(string str) + { + try + { + str = str.Replace(Environment.NewLine, ""); + List list = new List(str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); + return list.OrderBy(x => x).ToList(); + } + catch (Exception ex) + { + SaveLog(ex.Message, ex); return new List(); } } @@ -251,11 +301,24 @@ namespace v2rayN { return Convert.ToInt32(obj); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return 0; } } + public static bool ToBool(object obj) + { + try + { + return Convert.ToBoolean(obj); + } + catch (Exception ex) + { + SaveLog(ex.Message, ex); + return false; + } + } public static string ToString(object obj) { @@ -263,8 +326,9 @@ namespace v2rayN { return (obj == null ? string.Empty : obj.ToString()); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return string.Empty; } } @@ -324,36 +388,29 @@ namespace v2rayN return $"{string.Format("{0:f1}", result)} {unit}"; } - public static void DedupServerList(List source, out List result, bool keepOlder) - { - List list = new List(); - if (!keepOlder) source.Reverse(); // Remove the early items first - bool _isAdded(Mode.VmessItem o, Mode.VmessItem n) + + public static string UrlEncode(string url) + { + return Uri.EscapeDataString(url); + //return HttpUtility.UrlEncode(url); + } + public static string UrlDecode(string url) + { + return HttpUtility.UrlDecode(url); + } + + public static string GetMD5(string str) + { + var md5 = MD5.Create(); + byte[] byteOld = Encoding.UTF8.GetBytes(str); + byte[] byteNew = md5.ComputeHash(byteOld); + StringBuilder sb = new StringBuilder(); + foreach (byte b in byteNew) { - return o.configVersion == n.configVersion && - o.configType == n.configType && - o.address == n.address && - o.port == n.port && - o.id == n.id && - o.alterId == n.alterId && - o.security == n.security && - o.network == n.network && - o.headerType == n.headerType && - o.requestHost == n.requestHost && - o.path == n.path && - o.streamSecurity == n.streamSecurity; - // skip (will remove) different remarks + sb.Append(b.ToString("x2")); } - foreach (Mode.VmessItem item in source) - { - if (!list.Exists(i => _isAdded(i, item))) - { - list.Add(item); - } - } - if (!keepOlder) list.Reverse(); - result = list; + return sb.ToString(); } #endregion @@ -373,8 +430,9 @@ namespace v2rayN int var1 = ToInt(oText); return true; } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return false; } } @@ -465,11 +523,35 @@ namespace v2rayN return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase); } + public static bool IsIpv6(string ip) + { + IPAddress address; + if (IPAddress.TryParse(ip, out address)) + { + switch (address.AddressFamily) + { + case AddressFamily.InterNetwork: + return false; + case AddressFamily.InterNetworkV6: + return true; + default: + return false; + } + } + return false; + } + #endregion #region 开机自动启动 - private static string autoRunName = "v2rayNAutoRun"; + private static string autoRunName + { + get + { + return $"v2rayNAutoRun_{GetMD5(StartupPath())}"; + } + } private static string autoRunRegPath { get @@ -496,10 +578,11 @@ namespace v2rayN try { string exePath = GetExePath(); - RegWriteValue(autoRunRegPath, autoRunName, run ? exePath : ""); + RegWriteValue(autoRunRegPath, autoRunName, run ? $"\"{exePath}\"" : ""); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } } @@ -513,13 +596,14 @@ namespace v2rayN { string value = RegReadValue(autoRunRegPath, autoRunName, ""); string exePath = GetExePath(); - if (value?.Equals(exePath) == true) + if (value?.Equals(exePath) == true || value?.Equals($"\"{exePath}\"") == true) { return true; } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return false; } @@ -568,8 +652,9 @@ namespace v2rayN return value; } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } finally { @@ -578,13 +663,13 @@ namespace v2rayN return def; } - public static void RegWriteValue(string path, string name, string value) + public static void RegWriteValue(string path, string name, object value) { RegistryKey regKey = null; try { regKey = Registry.CurrentUser.CreateSubKey(path); - if (IsNullOrEmpty(value)) + if (IsNullOrEmpty(value.ToString())) { regKey?.DeleteValue(name, false); } @@ -593,14 +678,35 @@ namespace v2rayN regKey?.SetValue(name, value); } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } finally { regKey?.Close(); } } + + /// + /// 判断.Net Framework的Release是否符合 + /// (.Net Framework 版本在4.0及以上) + /// + /// 需要的版本4.6.2=394802;4.8=528040 + /// + public static bool GetDotNetRelease(int release) + { + const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"; + using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)) + { + if (ndpKey != null && ndpKey.GetValue("Release") != null) + { + return (int)ndpKey.GetValue("Release") >= release ? true : false; + } + return false; + } + } + #endregion #region 测速 @@ -634,8 +740,9 @@ namespace v2rayN } } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return -1; } return roundtripTime; @@ -657,20 +764,51 @@ namespace v2rayN lstIPAddress.Add(ipa.ToString()); } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return lstIPAddress; } - public static void SetSecurityProtocol() + public static void SetSecurityProtocol(bool enableSecurityProtocolTls13) { - ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 - | SecurityProtocolType.Tls - | SecurityProtocolType.Tls11 - | SecurityProtocolType.Tls12; + if (enableSecurityProtocolTls13) + { + ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; + } + else + { + ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; + } ServicePointManager.DefaultConnectionLimit = 256; } + + public static bool PortInUse(int port) + { + bool inUse = false; + try + { + IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); + IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners(); + + var lstIpEndPoints = new List(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); + + foreach (IPEndPoint endPoint in ipEndPoints) + { + if (endPoint.Port == port) + { + inUse = true; + break; + } + } + } + catch (Exception ex) + { + SaveLog(ex.Message, ex); + } + return inUse; + } #endregion #region 杂项 @@ -679,17 +817,26 @@ namespace v2rayN /// 取得版本 /// /// - public static string GetVersion() + public static string GetVersion(bool blFull = true) { try { string location = GetExePath(); - return string.Format("v2rayN - V{0} - {1}", - FileVersionInfo.GetVersionInfo(location).FileVersion.ToString(), - File.GetLastWriteTime(location).ToString("yyyy/MM/dd")); + if (blFull) + { + return string.Format("v2rayN - V{0} - {1}", + FileVersionInfo.GetVersionInfo(location).FileVersion.ToString(), + File.GetLastWriteTime(location).ToString("yyyy/MM/dd")); + } + else + { + return string.Format("v2rayN/{0}", + FileVersionInfo.GetVersionInfo(location).FileVersion.ToString()); + } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return string.Empty; } } @@ -726,14 +873,15 @@ namespace v2rayN try { IDataObject data = Clipboard.GetDataObject(); - if (data.GetDataPresent(DataFormats.Text)) + if (data.GetDataPresent(DataFormats.UnicodeText)) { - strData = data.GetData(DataFormats.Text).ToString(); + strData = data.GetData(DataFormats.UnicodeText).ToString(); } return strData; } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return strData; } @@ -757,14 +905,22 @@ namespace v2rayN /// 取得GUID /// /// - public static string GetGUID() + public static string GetGUID(bool full = true) { try { - return Guid.NewGuid().ToString("D"); + if (full) + { + return Guid.NewGuid().ToString("D"); + } + else + { + return BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0).ToString(); + } } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); } return string.Empty; } @@ -782,30 +938,64 @@ namespace v2rayN //WindowsBuiltInRole可以枚举出很多权限,例如系统用户、User、Guest等等 return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator); } - catch + catch (Exception ex) { + SaveLog(ex.Message, ex); return false; } } + public static void AddSubItem(ListViewItem i, string name, string text) + { + i.SubItems.Add(new ListViewItem.ListViewSubItem() { Name = name, Text = text }); + } + + public static string GetDownloadFileName(string url) + { + var fileName = Path.GetFileName(url); + fileName += "_temp"; + + return fileName; + } + + public static IPAddress GetDefaultGateway() + { + return NetworkInterface + .GetAllNetworkInterfaces() + .Where(n => n.OperationalStatus == OperationalStatus.Up) + .Where(n => n.NetworkInterfaceType != NetworkInterfaceType.Loopback) + .SelectMany(n => n.GetIPProperties()?.GatewayAddresses) + .Select(g => g?.Address) + .Where(a => a != null) + // .Where(a => a.AddressFamily == AddressFamily.InterNetwork) + // .Where(a => Array.FindIndex(a.GetAddressBytes(), b => b != 0) >= 0) + .FirstOrDefault(); + } + + public static bool IsGuidByParse(string strSrc) + { + return Guid.TryParse(strSrc, out Guid g); + } #endregion #region TempPath // return path to store temporary files - public static string GetTempPath() + public static string GetTempPath(string filename = "") { - string _tempPath = Path.Combine(StartupPath(), "v2ray_win_temp"); + string _tempPath = Path.Combine(StartupPath(), "guiTemps"); if (!Directory.Exists(_tempPath)) { Directory.CreateDirectory(_tempPath); } - return _tempPath; - } - - public static string GetTempPath(string filename) - { - return Path.Combine(GetTempPath(), filename); + if (string.IsNullOrEmpty(filename)) + { + return _tempPath; + } + else + { + return Path.Combine(_tempPath, filename); + } } public static string UnGzip(byte[] buf) @@ -820,43 +1010,46 @@ namespace v2rayN return Encoding.UTF8.GetString(sb.ToArray()); } + public static string GetBackupPath(string filename) + { + string _tempPath = Path.Combine(StartupPath(), "guiBackups"); + if (!Directory.Exists(_tempPath)) + { + Directory.CreateDirectory(_tempPath); + } + return Path.Combine(_tempPath, filename); + } + public static string GetConfigPath(string filename = "") + { + string _tempPath = Path.Combine(StartupPath(), "guiConfigs"); + if (!Directory.Exists(_tempPath)) + { + Directory.CreateDirectory(_tempPath); + } + if (string.IsNullOrEmpty(filename)) + { + return _tempPath; + } + else + { + return Path.Combine(_tempPath, filename); + } + } + #endregion #region Log public static void SaveLog(string strContent) { - SaveLog("info", new Exception(strContent)); + var logger = LogManager.GetLogger("Log1"); + logger.Info(strContent); } public static void SaveLog(string strTitle, Exception ex) { - try - { - string path = Path.Combine(StartupPath(), "guiLogs"); - string FilePath = Path.Combine(path, DateTime.Now.ToString("yyyyMMdd") + ".txt"); - if (!Directory.Exists(path)) - { - Directory.CreateDirectory(path); - } - if (!File.Exists(FilePath)) - { - FileStream FsCreate = new FileStream(FilePath, FileMode.Create); - FsCreate.Close(); - FsCreate.Dispose(); - } - FileStream FsWrite = new FileStream(FilePath, FileMode.Append, FileAccess.Write); - StreamWriter SwWrite = new StreamWriter(FsWrite); - - string strContent = ex.ToString(); - - SwWrite.WriteLine(string.Format("{0}{1}[{2}]{3}", "--------------------------------", strTitle, DateTime.Now.ToString("HH:mm:ss"), "--------------------------------")); - SwWrite.Write(strContent); - SwWrite.WriteLine(Environment.NewLine); - SwWrite.WriteLine(" "); - SwWrite.Flush(); - SwWrite.Close(); - } - catch { } + var logger = LogManager.GetLogger("Log2"); + logger.Debug(strTitle); + logger.Debug(ex); } #endregion @@ -910,11 +1103,39 @@ namespace v2rayN } } } - catch { } + catch (Exception ex) + { + SaveLog(ex.Message, ex); + } return string.Empty; } #endregion + + #region Windows API + + public static string WindowHwndKey + { + get + { + return $"WindowHwnd_{GetMD5(StartupPath())}"; + } + } + + [DllImport("user32.dll")] + public static extern bool SetProcessDPIAware(); + + [DllImport("user32.dll")] + public static extern int ShowWindow(IntPtr hwnd, int nCmdShow); + + [DllImport("user32.dll")] + public static extern int SwitchToThisWindow(IntPtr hwnd, bool fUnknown); + + [DllImport("user32.dll")] + public static extern bool IsWindow(IntPtr hwnd); + + + #endregion } } diff --git a/v2rayN/v2rayN/app.config b/v2rayN/v2rayN/app.config index 620ddb42..df5f1904 100644 --- a/v2rayN/v2rayN/app.config +++ b/v2rayN/v2rayN/app.config @@ -1,7 +1,7 @@ - + diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index d1f912ba..10d89345 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -9,7 +9,7 @@ Properties v2rayN v2rayN - v4.6 + v4.8 512 false @@ -85,6 +85,7 @@ + @@ -98,39 +99,80 @@ - - Form - - - AddServer6Form.cs - - - Form - - - AddServer4Form.cs - + Component - - Form - - - AddServer5Form.cs - Form BaseServerForm.cs + + UserControl + + + MainMsgControl.cs + + + Form + + + MsgFilterSetForm.cs + + + Form + + + RoutingRuleSettingDetailsForm.cs + + + Form + + + GlobalHotkeySettingForm.cs + + + Form + + + RoutingRuleSettingForm.cs + + + UserControl + + + ServerTransportControl.cs + + + UserControl + + + GroupSettingControl.cs + + + Form + + + GroupSettingForm.cs + + + + + Form MainForm.cs + + Form + + + RoutingSettingForm.cs + Form @@ -143,12 +185,6 @@ AddServer2Form.cs - - Form - - - AddServer3Form.cs - UserControl @@ -165,21 +201,22 @@ - - - - - - - - Component - - + + + + + + + + + + + True True @@ -228,8 +265,8 @@ + - @@ -237,40 +274,16 @@ AddServer2Form.cs Designer - - AddServer6Form.cs - Designer - - - AddServer6Form.cs - Designer - - - AddServer4Form.cs - Designer - - - AddServer4Form.cs - Designer - - - AddServer3Form.cs - Designer - - - AddServer5Form.cs - Designer - - - AddServer5Form.cs - Designer - AddServerForm.cs Designer BaseServerForm.cs + Designer + + + GlobalHotkeySettingForm.cs MainForm.cs @@ -280,13 +293,59 @@ MainForm.cs Designer + + MainMsgControl.cs + + + MainMsgControl.cs + + + MsgFilterSetForm.cs + + + MsgFilterSetForm.cs + OptionSettingForm.cs + Designer QRCodeControl.cs Designer + + RoutingRuleSettingDetailsForm.cs + Designer + + + RoutingRuleSettingDetailsForm.cs + Designer + + + GlobalHotkeySettingForm.cs + Designer + + + RoutingRuleSettingForm.cs + Designer + + + RoutingRuleSettingForm.cs + + + ServerTransportControl.cs + + + ServerTransportControl.cs + + + GroupSettingControl.cs + Designer + + + GroupSettingControl.cs + Designer + SubSettingControl.cs Designer @@ -294,6 +353,20 @@ SubSettingControl.cs + + RoutingSettingForm.cs + Designer + + + RoutingSettingForm.cs + + + GroupSettingForm.cs + Designer + + + GroupSettingForm.cs + SubSettingForm.cs Designer @@ -317,10 +390,6 @@ AddServer2Form.cs Designer - - AddServer3Form.cs - Designer - SubSettingForm.cs @@ -341,14 +410,13 @@ Settings.settings True - - - + + + + - - @@ -396,7 +464,6 @@ - @@ -409,33 +476,44 @@ + + + + - - - 3.11.4 + 3.21.1 - 2.27.0 + 2.46.3 - 2.27.0 + 2.46.3 runtime; build; native; contentfiles; analyzers; buildtransitive all + + 2.0.14 + - 12.0.3 + 13.0.1 + + + 2.1.0 + + + 2.1.0 - 0.16.5 + 0.16.8 diff --git a/v2rayN/v2rayN/v2rayN.ico b/v2rayN/v2rayN/v2rayN.ico index 2a2f85a9..a978e0a8 100644 Binary files a/v2rayN/v2rayN/v2rayN.ico and b/v2rayN/v2rayN/v2rayN.ico differ diff --git a/v2rayN/v2rayUpgrade/App.config b/v2rayN/v2rayUpgrade/App.config index 2d2a12d8..4bfa0056 100644 --- a/v2rayN/v2rayUpgrade/App.config +++ b/v2rayN/v2rayUpgrade/App.config @@ -1,6 +1,6 @@ - + diff --git a/v2rayN/v2rayUpgrade/MainForm.cs b/v2rayN/v2rayUpgrade/MainForm.cs index 8b30a2cb..6b9ff16c 100644 --- a/v2rayN/v2rayUpgrade/MainForm.cs +++ b/v2rayN/v2rayUpgrade/MainForm.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Text; +using System.Web; using System.Windows.Forms; namespace v2rayUpgrade @@ -17,7 +18,8 @@ namespace v2rayUpgrade InitializeComponent(); if (args.Length > 0) { - fileName = args[0]; + fileName = string.Join(" ", args); + fileName = HttpUtility.UrlDecode(fileName); } } private void showWarn(string message) diff --git a/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs b/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs index 5ad1ac66..f766ed10 100644 --- a/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace v2rayUpgrade.Properties { // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { diff --git a/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs b/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs index 5656cdc6..ecf1927f 100644 --- a/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs +++ b/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace v2rayUpgrade.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.3.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj index b7d6307f..a619ae5e 100644 --- a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj +++ b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj @@ -8,7 +8,7 @@ WinExe v2rayUpgrade v2rayUpgrade - v4.6 + v4.8 512 true true @@ -39,6 +39,7 @@ + diff --git a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user index 60d6da27..4890b148 100644 --- a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user +++ b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user @@ -1,6 +1,6 @@  - D:\Github\v2rayN\v2rayN\v2rayUpgrade\bin\Debug\v2ray-windows.zip + C:\Githubb\v2rayN\v2rayN\v2rayUpgrade\bin\Debug\v2ray-windows.zip \ No newline at end of file