public void RefreshProxyList()
        {
            var proxies = CmdUtil.GetProxies();
            var rules   = Program.SqliteDbScope.Rules;

            foreach (var proxy in proxies)
            {
                var matchedRule = rules.FirstOrDefault(r => r.EqualsWithKeys(proxy));
                proxy.Id = matchedRule?.Id;
            }

            var pendingAdds    = proxies.Where(x => x.Id == null);
            var pendingUpdates = proxies.Where(x => x.Id != null && !x.Equals(rules.First(r => r.Id == x.Id)));

            Program.SqliteDbScope.AddRange(pendingAdds);
            Program.SqliteDbScope.UpdateRange(pendingUpdates);

            listViewProxies.Items.Clear();
            rules = Program.SqliteDbScope.Rules;
            foreach (var rule in rules)
            {
                var imageIndex = proxies.Any(p => p.EqualsWithKeys(rule)) ? 1 : 0;
                var item = new ListViewItem {
                    ImageIndex = imageIndex, Tag = rule.Id
                }.Then(vitem =>
                {
                    vitem.SubItems.AddRange(new[] { rule.Type, rule.ListenOn, rule.ListenPort.ToString(), rule.ConnectTo, rule.ConnectPort.ToString(), rule.Comment });
                });
                listViewProxies.Items.Add(item);
            }
        }
        private void button_submit_Click(object sender, EventArgs e)
        {
            var type        = comboBox_type.Text.Trim();
            var listenOn    = textBox_listenOn.Text.Trim().ToLower();
            var connectTo   = textBox_connectTo.Text.Trim().ToLower();
            var listenPort  = textBox_listenPort.Text.Trim();
            var connectPort = textBox_connectPort.Text.Trim();

            if (!int.TryParse(listenPort, out var _listenPort) || _listenPort < 0 || _listenPort > 65535)
            {
                MessageBox.Show($"The listen port is invalid.", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            if (!int.TryParse(connectPort, out var _connectPort) || _connectPort < 0 || _connectPort > 65535)
            {
                MessageBox.Show($"The connect port is invalid.", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            if (type == AutoTypeString)
            {
                type = GetPassType(listenOn, connectTo);
            }

            if (!new[] { "v4tov4", "v4tov6", "v6tov4", "v6tov6" }.Contains(type))
            {
                MessageBox.Show($"Unknow type for ({listenOn} -> {connectTo}).", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            if (_updateLiveViewItem != null)
            {
                var rule = Program.SqliteDbScope.GetRule(type, listenOn, _listenPort);
                rule.ConnectTo   = connectTo;
                rule.ConnectPort = _connectPort;
                Program.SqliteDbScope.Update(rule);
                CmdUtil.AddProxy("set", type, listenOn, _listenPort, connectTo, _connectPort);

                _updateLiveViewItem.ImageIndex = 1;
                var subItems = _updateLiveViewItem.SubItems;
                subItems[1].Text = type;
                subItems[2].Text = listenOn;
                subItems[3].Text = _listenPort.ToString();
                subItems[4].Text = connectTo;
                subItems[5].Text = _connectPort.ToString();
            }
            else
            {
                CmdUtil.AddProxy("add", type, listenOn, _listenPort, connectTo, _connectPort);
                PortProxyGUI.RefreshProxyList();
            }

            Close();
        }
        private void DisableSelectedProxies()
        {
            var items = listViewProxies.SelectedItems.OfType <ListViewItem>();

            foreach (var item in items)
            {
                item.ImageIndex = 0;
                var subItems = item.SubItems.OfType <ListViewSubItem>().ToArray();
                CmdUtil.DeleteProxy(subItems[1].Text, subItems[2].Text, int.Parse(subItems[3].Text));
            }
        }
        private void EnableSelectedProxies()
        {
            var items = listViewProxies.SelectedItems.OfType <ListViewItem>();

            foreach (var item in items)
            {
                item.ImageIndex = 1;
                var subItems = item.SubItems.OfType <ListViewSubItem>().ToArray();
                CmdUtil.AddProxy("add", subItems[1].Text, subItems[2].Text, int.Parse(subItems[3].Text), subItems[4].Text, int.Parse(subItems[5].Text));
            }
        }