Full Code of mm201/pkmn-classic-framework for AI

master b7759e7a6bd3 cached
314 files
2.5 MB
663.1k tokens
1206 symbols
1 requests
Download .txt
Showing preview only (2,651K chars total). Download the full file or copy to clipboard to get everything.
Repository: mm201/pkmn-classic-framework
Branch: master
Commit: b7759e7a6bd3
Files: 314
Total size: 2.5 MB

Directory structure:
gitextract_fpvand7g/

├── .gitignore
├── .gitmodules
├── GlobalTerminalService/
│   ├── GTServer4.cs
│   ├── GTServer5.cs
│   ├── GTServerBase.cs
│   ├── GlobalTerminalService.csproj
│   ├── Program.cs
│   ├── ProjectInstaller.Designer.cs
│   ├── ProjectInstaller.cs
│   ├── ProjectInstaller.resx
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Service1.Designer.cs
│   ├── Service1.cs
│   ├── Service1.resx
│   ├── app.config
│   └── cert.pfx
├── LICENSE.md
├── MakeBaseStatTables/
│   ├── MakeBaseStatTables.csproj
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── app.config
│   └── packages.config
├── README.md
├── RenameImages/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── RenameImages.csproj
├── Roadmap.md
├── VeekunImport/
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── VeekunImport.csproj
│   ├── app.config
│   ├── countries4.txt
│   ├── countries5.txt
│   ├── families.txt
│   ├── families_map.txt
│   ├── form_abilities3.txt
│   ├── form_abilities4.txt
│   ├── form_abilities5.txt
│   ├── form_abilities6.txt
│   ├── form_stats1.txt
│   ├── form_stats2.txt
│   ├── form_stats3.txt
│   ├── form_stats4.txt
│   ├── form_stats5.txt
│   ├── form_stats6.txt
│   ├── form_values.txt
│   ├── items3.txt
│   ├── items4.txt
│   ├── items5.txt
│   ├── items_balls.txt
│   ├── packages.config
│   ├── regions.txt
│   ├── ribbon_positions3.txt
│   ├── ribbon_positions4.txt
│   ├── ribbon_positions5.txt
│   └── ribbons.txt
├── bvCrawler4/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── bvCrawler4.csproj
│   └── packages.config
├── bvCrawler5/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── bvCrawler5.csproj
│   └── packages.config
├── bvRestorer4/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── bvRestorer4.csproj
├── bvRestorer5/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── bvRestorer5.csproj
├── gfx/
│   ├── 2014 design/
│   │   ├── fGTS colour blending.psd
│   │   ├── heading-backdrop.psd
│   │   ├── headinglogo.psd
│   │   ├── logo-colour.psd
│   │   └── logov3.psd
│   └── 2023 design/
│       ├── Discord Icon Pride.afdesign
│       ├── Discord Icon.afdesign
│       ├── Logo.afdesign
│       ├── Temp placeholder background.afdesign
│       └── Touch Icon.afdesign
├── gts/
│   ├── Global.asax
│   ├── Global.asax.cs
│   ├── Properties/
│   │   ├── AssemblyInfo.cs
│   │   └── PublishProfiles/
│   │       ├── Local IIS.pubxml
│   │       └── Public.pubxml
│   ├── Web.Public.config
│   ├── Web.config
│   ├── admin/
│   │   ├── Sessions.aspx
│   │   ├── Sessions.aspx.cs
│   │   ├── Sessions.aspx.designer.cs
│   │   ├── Web.Debug.config
│   │   ├── Web.Release.config
│   │   └── Web.config
│   ├── gts.csproj
│   ├── masters/
│   │   ├── MasterPage.master
│   │   ├── MasterPage.master.cs
│   │   └── MasterPage.master.designer.cs
│   ├── pgl.ashx
│   ├── pgl.ashx.cs
│   ├── pkvldtprod.ashx
│   ├── pkvldtprod.ashx.cs
│   ├── pokemondpds.ashx
│   ├── pokemondpds.ashx.cs
│   ├── pokemondpds_web.ashx
│   ├── pokemondpds_web.ashx.cs
│   ├── src/
│   │   ├── AppStateHelper.cs
│   │   ├── BanHelper.cs
│   │   ├── FakeOpponentGenerator.cs
│   │   └── IpAddressHelper.cs
│   ├── syachi2ds.ashx
│   └── syachi2ds.ashx.cs
├── library/
│   ├── Data/
│   │   ├── DataMysql.cs
│   │   ├── DataSqlite.cs
│   │   ├── Database.cs
│   │   ├── DatabaseExtender.cs
│   │   ├── MySqlDatabaseExtender.cs
│   │   └── SqlDatabaseExtender.cs
│   ├── Library.csproj
│   ├── Pokedex/
│   │   ├── Ability.cs
│   │   ├── Evolution.cs
│   │   ├── Family.cs
│   │   ├── Form.cs
│   │   ├── FormAbilities.cs
│   │   ├── FormStats.cs
│   │   ├── Item.cs
│   │   ├── Location.cs
│   │   ├── Move.cs
│   │   ├── Pokedex.cs
│   │   ├── PokedexRecordBase.cs
│   │   ├── Region.cs
│   │   ├── Ribbon.cs
│   │   ├── Species.cs
│   │   └── Type.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Structures/
│   │   ├── ByteStatValues.cs
│   │   ├── ContestStatValues.cs
│   │   ├── Enums.cs
│   │   ├── Format.cs
│   │   ├── IntStatValues.cs
│   │   ├── IvStatValues.cs
│   │   ├── MoveSlot.cs
│   │   ├── Pokemon4.cs
│   │   ├── Pokemon5.cs
│   │   ├── PokemonBase.cs
│   │   ├── PokemonParty4.cs
│   │   ├── PokemonParty5.cs
│   │   ├── PokemonPartyBase.cs
│   │   ├── StatValues.cs
│   │   ├── StatValuesBase.cs
│   │   └── TrainerMemo.cs
│   ├── Support/
│   │   ├── AliasTable.cs
│   │   ├── AssertHelper.cs
│   │   ├── BinarySerializableBase.cs
│   │   ├── EncodedString4.cs
│   │   ├── EncodedString5.cs
│   │   ├── EncodedStringBase.cs
│   │   ├── EnumerableExtender.cs
│   │   ├── GameSyncUtils.cs
│   │   ├── Indexer1d.cs
│   │   ├── LazyKeyValuePair.cs
│   │   ├── LocalizedString.cs
│   │   ├── LogHelper.cs
│   │   ├── StreamExtender.cs
│   │   ├── StringHelper.cs
│   │   ├── TrendyPhrase4.cs
│   │   ├── TrendyPhrase5.cs
│   │   ├── TrendyPhraseBase.cs
│   │   └── ValidationSummary.cs
│   ├── Wfc/
│   │   ├── BanStatus.cs
│   │   ├── BattleSubwayPokemon5.cs
│   │   ├── BattleSubwayProfile5.cs
│   │   ├── BattleSubwayRecord5.cs
│   │   ├── BattleTowerPokemon4.cs
│   │   ├── BattleTowerPokemonBase.cs
│   │   ├── BattleTowerProfile4.cs
│   │   ├── BattleTowerProfileBase.cs
│   │   ├── BattleTowerRecord4.cs
│   │   ├── BattleTowerRecordBase.cs
│   │   ├── BattleVideoHeader4.cs
│   │   ├── BattleVideoHeader5.cs
│   │   ├── BattleVideoRecord4.cs
│   │   ├── BattleVideoRecord5.cs
│   │   ├── BoxRecord4.cs
│   │   ├── DressupRecord4.cs
│   │   ├── GtsRecord4.cs
│   │   ├── GtsRecord5.cs
│   │   ├── GtsRecordBase.cs
│   │   ├── MusicalRecord5.cs
│   │   ├── PlazaQuestionnaire.cs
│   │   ├── PlazaSchedule.cs
│   │   ├── TrainerProfile4.cs
│   │   ├── TrainerProfile5.cs
│   │   ├── TrainerProfileBase.cs
│   │   ├── TrainerProfilePlaza.cs
│   │   ├── TrainerRankings.cs
│   │   └── VipRecord.cs
│   ├── app.config
│   ├── database.sql
│   ├── lib/
│   │   ├── SQLite.Designer.pdb
│   │   ├── SQLite.Designer.xml
│   │   ├── System.Data.SQLite.Linq.pdb
│   │   ├── System.Data.SQLite.Linq.xml
│   │   ├── System.Data.SQLite.dll.config
│   │   ├── System.Data.SQLite.pdb
│   │   └── System.Data.SQLite.xml
│   └── packages.config
├── pkmn-classic-framework.sln
├── pokedex/
│   └── Shiny lock generations.txt
├── towerRestorer4/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── towerRestorer.csproj
└── web/
    ├── Default.aspx
    ├── Default.aspx.cs
    ├── Default.aspx.designer.cs
    ├── Global.asax
    ├── Global.asax.cs
    ├── Properties/
    │   ├── AssemblyInfo.cs
    │   └── PublishProfiles/
    │       └── Public.pubxml
    ├── RoomLeaders.aspx
    ├── RoomLeaders.aspx.cs
    ├── RoomLeaders.aspx.designer.cs
    ├── Web.Public.config
    ├── Web.config
    ├── admin/
    │   ├── AddBoxes.aspx
    │   ├── AddBoxes.aspx.cs
    │   ├── AddBoxes.aspx.designer.cs
    │   ├── AddDressup.aspx
    │   ├── AddDressup.aspx.cs
    │   ├── AddDressup.aspx.designer.cs
    │   ├── AddMusical.aspx
    │   ├── AddMusical.aspx.cs
    │   ├── AddMusical.aspx.designer.cs
    │   ├── Web.Debug.config
    │   ├── Web.Release.config
    │   └── Web.config
    ├── battlevideo/
    │   ├── Default.aspx
    │   ├── Default.aspx.cs
    │   └── Default.aspx.designer.cs
    ├── controls/
    │   ├── DnsAddress.ascx
    │   ├── DnsAddress.ascx.cs
    │   ├── DnsAddress.ascx.designer.cs
    │   ├── ForeignLookup.ascx
    │   ├── ForeignLookup.ascx.cs
    │   ├── ForeignLookup.ascx.designer.cs
    │   ├── LabelTextBox.ascx
    │   ├── LabelTextBox.ascx.cs
    │   ├── LabelTextBox.ascx.designer.cs
    │   ├── PokemonPicker.ascx
    │   ├── PokemonPicker.ascx.cs
    │   ├── PokemonPicker.ascx.designer.cs
    │   ├── PokemonSource.ashx
    │   └── PokemonSource.ashx.cs
    ├── css/
    │   ├── form.css
    │   ├── login.css
    │   ├── main.css
    │   ├── pkmnstats.css
    │   └── types.css
    ├── gts/
    │   ├── Default.aspx
    │   ├── Default.aspx.cs
    │   ├── Default.aspx.designer.cs
    │   ├── Pokemon.aspx
    │   ├── Pokemon.aspx.cs
    │   └── Pokemon.aspx.designer.cs
    ├── masters/
    │   ├── LeftColumn.master
    │   ├── LeftColumn.master.cs
    │   ├── LeftColumn.master.designer.cs
    │   ├── MasterPage.master
    │   ├── MasterPage.master.cs
    │   ├── MasterPage.master.designer.cs
    │   ├── ThreeColumn.master
    │   ├── ThreeColumn.master.cs
    │   └── ThreeColumn.master.designer.cs
    ├── packages.config
    ├── scripts/
    │   ├── form.js
    │   └── retina.js
    ├── src/
    │   ├── AppStateHelper.cs
    │   ├── Common.cs
    │   ├── DependencyNode.cs
    │   ├── ForeignLookupSource.cs
    │   ├── HeaderColour.cs
    │   ├── OnceTemplate.cs
    │   ├── RequireCss.cs
    │   ├── RequireLinkBase.cs
    │   ├── RequireScript.cs
    │   ├── RetinaImage.cs
    │   ├── RetinaImageBase.cs
    │   ├── WebException.cs
    │   └── WebFormat.cs
    ├── test/
    │   ├── BoxUp.aspx
    │   ├── BoxUp.aspx.cs
    │   ├── BoxUp.aspx.designer.cs
    │   ├── Decode.aspx
    │   ├── Decode.aspx.cs
    │   ├── Decode.aspx.designer.cs
    │   ├── Gsid.aspx
    │   ├── Gsid.aspx.cs
    │   ├── Gsid.aspx.designer.cs
    │   ├── NameDecode.aspx
    │   ├── NameDecode.aspx.cs
    │   ├── NameDecode.aspx.designer.cs
    │   ├── NameEncode.aspx
    │   ├── NameEncode.aspx.cs
    │   ├── NameEncode.aspx.designer.cs
    │   ├── VideoId.aspx
    │   ├── VideoId.aspx.cs
    │   ├── VideoId.aspx.designer.cs
    │   └── Web.config
    └── web.csproj

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
[Tt]humbs.db
*.suo
*.csproj.user
*.pubxml.user
[Dd]ebug/
[Rr]elease/
[Bb]in/
[Pp]ackages/
.DS_Store
._.DS_Store
._*
.vs/


================================================
FILE: .gitmodules
================================================
[submodule "GamestatsBase"]
	path = GamestatsBase
	url = git@github.com:mm201/GamestatsBase.git
	branch = master


================================================
FILE: GlobalTerminalService/GTServer4.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using PkmnFoundations.Support;
using PkmnFoundations.Structures;
using PkmnFoundations.Data;
using System.Net.Sockets;
using System.Diagnostics;
using PkmnFoundations.Wfc;

namespace PkmnFoundations.GlobalTerminalService
{
    public class GTServer4 : GTServerBase
    {
        public GTServer4()
            : base(12400, false)
        {
            Initialize();
        }

        public GTServer4(int threads)
            : base(12400, false, threads)
        {
            Initialize();
        }

        public GTServer4(int threads, int timeout)
            : base(12400, false, threads, timeout)
        {
            Initialize();
        }

        private void Initialize()
        {

        }
        
        protected override byte[] ProcessRequest(byte[] data, TcpClient c)
        {
            int length = BitConverter.ToInt32(data, 0);
            AssertHelper.Equals(length, data.Length);

            RequestTypes4 requestType = (RequestTypes4)data[4];
            StringBuilder logEntry = new StringBuilder();
            logEntry.AppendFormat("Handling Generation IV {0} request.\nHost: {1}", requestType, c.Client.RemoteEndPoint);
            logEntry.AppendLine();
            EventLogEntryType type = EventLogEntryType.Information;

            CryptMessage(data);

            MemoryStream response = new MemoryStream();
            response.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4); // placeholder for length
            response.WriteByte((byte)requestType);
            response.WriteByte(data[5]);

            try
            {
                int pid = BitConverter.ToInt32(data, 8);
                byte version = data[0x0c];
                byte language = data[0x0d];
                logEntry.AppendFormat("pid: {0}", pid);
                logEntry.AppendLine();

                switch (requestType)
                {
                    #region Box upload
                    case RequestTypes4.BoxUpload:
                    {
                        if (data.Length != 0x360)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        BoxLabels4 label = (BoxLabels4)BitConverter.ToInt32(data, 0x140);
                        byte[] boxData = new byte[0x21c];
                        Array.Copy(data, 0x144, boxData, 0, 0x21c);
                        BoxRecord4 record = new BoxRecord4(pid, label, 0, boxData);
                        ulong serial = Database.Instance.BoxUpload4(record);

                        if (serial == 0)
                        {
                            logEntry.AppendLine("Uploaded box already in server.");
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        logEntry.AppendFormat("Box {0} uploaded successfully.", serial);
                        logEntry.AppendLine();
                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(serial), 0, 8);

                    } break;
                    case RequestTypes4.BoxSearch:
                    {
                        if (data.Length != 0x14c)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        // todo: validate or log some of this?
                        BoxLabels4 label = (BoxLabels4)BitConverter.ToInt32(data, 0x144);

                        logEntry.AppendFormat("Searching for {0} boxes.", label);
                        logEntry.AppendLine();

                        BoxRecord4[] results = Database.Instance.BoxSearch4(label, 20);
                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(results.Length), 0, 4);

                        foreach (BoxRecord4 result in results)
                        {
                            response.Write(BitConverter.GetBytes(result.PID), 0, 4);
                            response.Write(BitConverter.GetBytes((int)result.Label), 0, 4);
                            response.Write(BitConverter.GetBytes(result.SerialNumber), 0, 8);
                            // xxx: this may throw if there's database corruption
                            response.Write(result.Data, 0, 0x21c);
                        }
                        logEntry.AppendFormat("Retrieved {0} boxes.", results.Length);
                        logEntry.AppendLine();

                    } break;
                    #endregion

                    #region Dressup
                    case RequestTypes4.DressupUpload:
                    {
                        if (data.Length != 0x220)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        byte[] dressupData = new byte[0xe0];
                        Array.Copy(data, 0x140, dressupData, 0, 0xe0);
                        DressupRecord4 record = new DressupRecord4(pid, 0, dressupData);
                        ulong serial = Database.Instance.DressupUpload4(record);

                        if (serial == 0)
                        {
                            logEntry.AppendLine("Uploaded dressup already in server.");
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        logEntry.AppendFormat("Dressup {0} uploaded successfully.", serial);
                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(serial), 0, 8);

                    } break;
                    case RequestTypes4.DressupSearch:
                    {
                        if (data.Length != 0x14c)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        // todo: validate or log some of this?
                        ushort species = BitConverter.ToUInt16(data, 0x144);

                        logEntry.AppendFormat("Searching for dressups of species {0}.", species);
                        logEntry.AppendLine();

                        DressupRecord4[] results = Database.Instance.DressupSearch4(species, 10);
                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(results.Length), 0, 4);

                        foreach (DressupRecord4 result in results)
                        {
                            response.Write(BitConverter.GetBytes(result.PID), 0, 4);
                            response.Write(BitConverter.GetBytes(result.SerialNumber), 0, 8);
                            response.Write(result.Data, 0, 0xe0);
                        }
                        logEntry.AppendFormat("Retrieved {0} dressup results.", results.Length);
                        logEntry.AppendLine();

                    } break;
                    #endregion

                    #region Battle videos
                    case RequestTypes4.BattleVideoUpload:
                    {
                        if (data.Length != 0x1e8c)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        byte[] battlevidData = new byte[0x1d4c];
                        Array.Copy(data, 0x140, battlevidData, 0, 0x1d4c);
                        BattleVideoRecord4 record = new BattleVideoRecord4(pid, 0, battlevidData);
                        ulong serial = Database.Instance.BattleVideoUpload4(record);

                        if (serial == 0)
                        {
                            logEntry.AppendFormat("Uploaded battle video already in server.");
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        logEntry.AppendFormat("Battle video {0} uploaded successfully.", BattleVideoHeader4.FormatSerial(serial));
                        logEntry.AppendLine();
                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(serial), 0, 8);

                    } break;
                    case RequestTypes4.BattleVideoSearch:
                    {
                        if (data.Length != 0x15c)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        // todo: validate or log some of this?
                        BattleVideoRankings4 ranking = (BattleVideoRankings4)BitConverter.ToUInt32(data, 0x140);
                        ushort species = BitConverter.ToUInt16(data, 0x144);
                        BattleVideoMetagames4 meta = (BattleVideoMetagames4)data[0x146];
                        byte country = data[0x147];
                        byte region = data[0x148];

                        logEntry.Append("Searching for ");
                        if (ranking != BattleVideoRankings4.None)
                            logEntry.AppendFormat("{0}", ranking);
                        else
                        {
                            if (species != 0xffff)
                                logEntry.AppendFormat("species {0}, ", species);
                            logEntry.AppendFormat("{0}", meta);
                            if (country != 0xff)
                                logEntry.AppendFormat(", country {0}", country);
                            if (region != 0xff)
                                logEntry.AppendFormat(", region {0}", region);
                        }
                        logEntry.AppendLine(".");

                        BattleVideoHeader4[] results = Database.Instance.BattleVideoSearch4(species, ranking, meta, country, region, 30);
                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(results.Length), 0, 4);

                        foreach (BattleVideoHeader4 result in results)
                        {
                            response.Write(BitConverter.GetBytes(result.PID), 0, 4);
                            response.Write(BitConverter.GetBytes(result.SerialNumber), 0, 8);
                            response.Write(result.Data, 0, 0xe4);
                        }
                        logEntry.AppendFormat("Retrieved {0} battle video results.", results.Length);
                        logEntry.AppendLine();

                    } break;
                    case RequestTypes4.BattleVideoWatch:
                    {
                        if (data.Length != 0x14c)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        ulong serial = BitConverter.ToUInt64(data, 0x140);
                        BattleVideoRecord4 record = Database.Instance.BattleVideoGet4(serial, true);
                        if (record == null)
                        {
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            logEntry.AppendFormat("Requested battle video {0} was missing.", BattleVideoHeader4.FormatSerial(serial));
                            logEntry.AppendLine();
                            type = EventLogEntryType.FailureAudit;
                            break;
                        }

                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(record.PID), 0, 4);
                        response.Write(BitConverter.GetBytes(record.SerialNumber), 0, 8);
                        response.Write(record.Header.Data, 0, 0xe4);
                        response.Write(record.Data, 0, 0x1c68);
                        logEntry.AppendFormat("Retrieved battle video {0}.", BattleVideoHeader4.FormatSerial(serial));
                        logEntry.AppendLine();

                    } break;
                    case RequestTypes4.BattleVideoSaved:
                    {
                        if (data.Length != 0x148)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        ulong serial = BitConverter.ToUInt64(data, 0x140);

                        if (Database.Instance.BattleVideoFlagSaved4(serial))
                        {
                            response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                            logEntry.AppendFormat("Battle video {0} flagged saved.", BattleVideoHeader4.FormatSerial(serial));
                            logEntry.AppendLine();
                        }
                        else
                        {
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            logEntry.AppendFormat("Requested battle video {0} was missing.", BattleVideoHeader4.FormatSerial(serial));
                            logEntry.AppendLine();
                        }
                    } break;
                    #endregion

                    #region Trainer Rankings
                    case RequestTypes4.TrainerRankingsHead:
                    {
                        if (data.Length != 0x140)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        // AdmiralCurtiss's request: completely blank! (just the 0x140 byte header)

                        // AdmiralCurtiss's response: 
                        // 0000: 0c000000f0550000 0128431c

                        // Response format seems to be a list of the three record categories currently being collected.
                        // 0x01: Hall of fame entries
                        // 0x28: Completed GTS trades
                        // 0x43: Facilities challenged at battle frontier
                        // The purpose of 0x1c is unclear to me.

                        if (Database.Instance.TrainerRankingsPerformRollover())
                        {
                            logEntry.AppendLine("Leaderboard rollover.");
                        }
                        var recordTypes = Database.Instance.TrainerRankingsGetActiveRecordTypes();

                        // todo: If we can be sure the player has already sent us their up to date records,
                        // then we can lie here about the active records and collect more complete trainer
                        // stats for better trainer profiles

                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2);

                        // The game will give error 10609 if the response is longer than 4 bytes.
                        // The game will bluescreen if the response is shorter than 3 bytes.
                        // The 4th byte is optional and I don't know what, if anything, it does.
                        int i;
                        for (i = 0; i < 3 && i < recordTypes.Count; i++)
                        {
                            response.WriteByte((byte)recordTypes[i]);
                        }
                        for (; i < 3; i++)
                        {
                            // Must be valid RecordTypes. If we pad with 0x00, it causes a bluescreen.
                            response.WriteByte((byte)0x01);
                        }
                        response.WriteByte(0x1c); // todo: Find out the meaning of this 0x1c.

                    } break;

                    case RequestTypes4.TrainerRankingsSearch:
                    {
                        if (data.Length != 0x164)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        // The request is important. It contains the player's records for the above three chosen categories.
                        // It also (presumably) conveys which teams the player is a part of.
                        // (Trainer Class, Birth Month, Favourite Pokémon)

                        // AdmiralCurtiss's request:
                        // 0140: 0c02050900000000 1800303b01000000
                        // 0150: 0100000028000000 0000000043000000
                        // 0160: 00000000

                        // Hikari's request:
                        // Platinum EN July AceTrainerF Gallade
                        // 0140: 0c02070bdb010000 e200350f01000000
                        // 0150: 0300000028000000 0800000043000000
                        // 0160: 28000000

                        // 140: Version
                        // 141: Language
                        // 142: Birth Month
                        // 143: Trainer Class
                        // 144-145: Favourite Pokémon
                        // 146-14b: Unknown
                        // 14c-163: Three record records

                        // Record record contains 4 bytes of category and 4 bytes of my score in the category.

                        // Note: Although the game gives instructions that only
                        // your first submission will apply, I think it's more
                        // fun if we allow you to update your results by
                        // submitting again. In this way, you can race against
                        // competing teams to get the highest score.
                        var submission = new TrainerRankingsSubmission(pid, data, 0x140);
                        Database.Instance.TrainerRankingsSubmit(submission);

                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2);

                        // The response is biig and contains all the records for both this week and last week.
                        // This week lacks numbers because they're still growing and to make it a surprise.
                        // Including more than 3 RecordTypes in the response will give error 10609.

                        TrainerRankingsReport thisWeek = Database.Instance.TrainerRankingsGetPendingReport();
                        thisWeek.PadResults();
                        TrainerRankingsReport lastWeek = Database.Instance.TrainerRankingsGetReport(DateTime.MinValue, thisWeek.StartDate.AddDays(-1), 1).FirstOrDefault();
                        if (lastWeek == null) lastWeek = GenerateFakeReport(thisWeek.StartDate.AddDays(-7),
                            new TrainerRankingsRecordTypes[]
                            {
                                0, 0, 0
                            });
                        else
                        {
                            lastWeek.PadResults();
                        }

                        // Last week:
                        foreach (var lbg in lastWeek.Leaderboards)
                        {
                            response.Write(BitConverter.GetBytes((int)lbg.RecordType), 0, 4);

                            foreach (var lbe in lbg.LeaderboardTrainerClass.Entries)
                            {
                                response.WriteByte((byte)lbe.Team);
                            }
                            foreach (var lbe in lbg.LeaderboardTrainerClass.Entries)
                            {
                                response.Write(BitConverter.GetBytes(lbe.Score), 0, 8);
                            }

                            foreach (var lbe in lbg.LeaderboardBirthMonth.Entries)
                            {
                                response.WriteByte((byte)lbe.Team);
                            }
                            foreach (var lbe in lbg.LeaderboardBirthMonth.Entries)
                            {
                                response.Write(BitConverter.GetBytes(lbe.Score), 0, 8);
                            }

                            foreach (var lbe in lbg.LeaderboardFavouritePokemon.Entries)
                            {
                                response.Write(BitConverter.GetBytes((short)lbe.Team), 0, 2);
                            }
                            foreach (var lbe in lbg.LeaderboardFavouritePokemon.Entries)
                            {
                                response.Write(BitConverter.GetBytes(lbe.Score), 0, 8);
                            }
                        }

                        // This week:
                        foreach (var lbg in thisWeek.Leaderboards)
                        {
                            response.Write(BitConverter.GetBytes((int)lbg.RecordType), 0, 4);

                            foreach (var lbe in lbg.LeaderboardTrainerClass.Entries)
                            {
                                response.WriteByte((byte)lbe.Team);
                            }

                            foreach (var lbe in lbg.LeaderboardBirthMonth.Entries)
                            {
                                response.WriteByte((byte)lbe.Team);
                            }

                            foreach (var lbe in lbg.LeaderboardFavouritePokemon.Entries)
                            {
                                response.Write(BitConverter.GetBytes((short)lbe.Team), 0, 2);
                            }
                        }

                    } break;
#endregion

                    default:
                        logEntry.AppendLine("Unrecognized request type.");
                        response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                        break;
                }
            }
            catch (Exception ex)
            {
                logEntry.AppendFormat("Unhandled exception while handling request.\nException: {0}", ex.ToString());
                logEntry.AppendLine();
                type = EventLogEntryType.Error;
                response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
            }

            response.Flush();
            byte[] responseData = response.ToArray();
            WriteLength(responseData);
            CryptMessage(responseData);

            LogHelper.Write(logEntry.ToString(), type);
            return responseData;
        }

        private void CryptMessage(byte[] message)
        {
            if (message.Length < 5) return;
            byte padOffset = (byte)(message[0] + message[4]);

            // encrypt and decrypt are the same operation...
            for (int x = 5; x < message.Length; x++)
                message[x] ^= m_pad[(x + padOffset) & 0xff];
        }

        public override string Title
        {
            get
            {
                return "Generation IV Global Terminal";
            }
        }

        private static readonly byte[] m_pad = new byte[]
        {
            0x1F, 0x98, 0xA5, 0x46, 0x76, 0x5C, 0x3D, 0x0E,
            0x93, 0x18, 0x33, 0x28, 0x0B, 0x07, 0x03, 0x82,
            0x02, 0x43, 0x8A, 0x86, 0xDB, 0x38, 0x34, 0x19,
            0xD6, 0xF9, 0x59, 0xB2, 0xAD, 0x6A, 0x7D, 0xBC,
            0xEE, 0xE0, 0x3A, 0x3F, 0xCA, 0x4C, 0x25, 0x68,
            0xF4, 0xA9, 0x5B, 0xF7, 0x22, 0x60, 0x5A, 0x6F,
            0xFA, 0x1B, 0x79, 0xE9, 0x17, 0xB1, 0x00, 0x9C,
            0xAA, 0x5E, 0x9D, 0xFF, 0xEA, 0xA0, 0x0D, 0x4B,
            0x75, 0xF6, 0x61, 0x85, 0x5D, 0xBB, 0xDC, 0xFB,
            0x64, 0x2E, 0x7A, 0xAB, 0xF1, 0xE8, 0x44, 0x0C,
            0xB8, 0x8F, 0xA8, 0x0A, 0x8E, 0xBD, 0xE1, 0x3B,
            0xFC, 0x3C, 0x9F, 0x1A, 0x56, 0xC5, 0xE2, 0xF5,
            0x47, 0xD9, 0xD7, 0x8C, 0xCD, 0x97, 0xF0, 0x7B,
            0x8B, 0xC3, 0x4F, 0x45, 0x04, 0x90, 0x81, 0x1E,
            0x6B, 0xC9, 0xD3, 0x73, 0xC6, 0xE7, 0x24, 0xBA,
            0x32, 0xF3, 0xC0, 0xEC, 0x57, 0xCC, 0xC4, 0xB6,
            0xC1, 0xAE, 0xAF, 0x88, 0xF2, 0x84, 0xCE, 0x4A,
            0x0F, 0x94, 0x41, 0xB4, 0x74, 0x2A, 0xD1, 0x70,
            0x1C, 0xD4, 0xB0, 0xC2, 0x09, 0x08, 0x16, 0x9B,
            0xB5, 0x8D, 0x2B, 0xD2, 0x89, 0xB7, 0x99, 0xA1,
            0x30, 0x65, 0x54, 0x40, 0x96, 0x71, 0xFE, 0xBF,
            0x31, 0x06, 0xE5, 0x14, 0xE6, 0xDA, 0x48, 0x26,
            0xAC, 0x87, 0x9A, 0xD8, 0xA6, 0xEB, 0x92, 0xCF,
            0xFD, 0x77, 0x1D, 0x21, 0x9E, 0x36, 0x35, 0x53,
            0x3E, 0xD0, 0xD5, 0x62, 0x58, 0x5F, 0x63, 0x7C,
            0x7E, 0x52, 0x29, 0x12, 0x2C, 0x78, 0x05, 0x91,
            0x55, 0xE3, 0xA2, 0xB9, 0xF8, 0x50, 0x95, 0x13,
            0x80, 0x7F, 0x11, 0x27, 0xCB, 0x37, 0x4E, 0x51,
            0x15, 0xEF, 0xA7, 0x72, 0x4D, 0x83, 0x49, 0xA4,
            0x69, 0xDE, 0x20, 0xA3, 0x67, 0xDF, 0x10, 0x42,
            0x39, 0x6C, 0x2D, 0xC7, 0x23, 0xE4, 0xDD, 0xED,
            0xBE, 0x66, 0xB3, 0x2F, 0x01, 0x6E, 0x6D, 0xC8,
        };

        private static TrainerRankingsLeaderboardEntry[] GenerateFakeData(int entryCount, int minTeam, int teamCount, int maxScore)
        {
            Random scoreRandomizer = new Random();
            return Enumerable.Range(minTeam, teamCount).Select(i => new TrainerRankingsLeaderboardEntry(i, scoreRandomizer.Next(maxScore)))
                .OrderBy(e => -e.Score).Take(entryCount).ToArray();
        }

        private static TrainerRankingsReport GenerateFakeReport(DateTime startDate, TrainerRankingsRecordTypes[] recordTypes)
        {
            var leaderboards = recordTypes.Select(r => new TrainerRankingsLeaderboardGroup(r,
                new TrainerRankingsLeaderboard(TrainerRankingsTeamCategories.TrainerClass, GenerateFakeData(16, 0, 16, 100000)),
                new TrainerRankingsLeaderboard(TrainerRankingsTeamCategories.BirthMonth, GenerateFakeData(12, 1, 12, 100000)),
                new TrainerRankingsLeaderboard(TrainerRankingsTeamCategories.FavouritePokemon, GenerateFakeData(20, 1, 493, 100000)))).ToArray();

            return new TrainerRankingsReport(startDate, startDate.AddDays(7), leaderboards);
        }
    }

    internal enum RequestTypes4 : byte
    {
        BoxUpload = 0x08,
        BoxSearch = 0x09,

        DressupUpload = 0x20,
        DressupSearch = 0x21,

        BattleVideoUpload = 0xd8,
        BattleVideoSearch = 0xd9,
        BattleVideoWatch = 0xda,
        BattleVideoSaved = 0xdb,

        TrainerRankingsHead = 0xf0,
        TrainerRankingsSearch = 0xf1
    }
}


================================================
FILE: GlobalTerminalService/GTServer5.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PkmnFoundations.Support;
using System.IO;
using PkmnFoundations.Structures;
using PkmnFoundations.Data;
using System.Security.Cryptography.X509Certificates;
using System.Net.Sockets;
using System.Diagnostics;
using PkmnFoundations.Wfc;

namespace PkmnFoundations.GlobalTerminalService
{
    public class GTServer5 : GTServerBase
    {
        public GTServer5()
            : base(12401, true)
        {
            Initialize();
        }

        public GTServer5(int threads)
            : base(12401, true, threads)
        {
            Initialize();
        }

        public GTServer5(int threads, int timeout)
            : base(12401, true, threads, timeout)
        {
            Initialize();
        }

        public GTServer5(int threads, int timeout, X509Certificate2 certificate)
            : base(12401, true, threads, timeout, certificate)
        {
            Initialize();
        }

        private void Initialize()
        {

        }

        protected override byte[] ProcessRequest(byte[] data, TcpClient c)
        {
            int length = BitConverter.ToInt32(data, 0);
            AssertHelper.Equals(length, data.Length);

            RequestTypes5 requestType = (RequestTypes5)data[4];
            StringBuilder logEntry = new StringBuilder();
            logEntry.AppendFormat("Handling Generation V {0} request.\nHost: {1}", requestType, c.Client.RemoteEndPoint);
            logEntry.AppendLine();
            EventLogEntryType type = EventLogEntryType.Information;

            MemoryStream response = new MemoryStream();
            response.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4); // placeholder for length
            response.WriteByte((byte)requestType);
            response.WriteByte(data[5]);

            try
            {
                int pid = BitConverter.ToInt32(data, 8);
                byte version = data[0x0c];
                byte language = data[0x0d];
                logEntry.AppendFormat("pid: {0}", pid);
                logEntry.AppendLine();

                switch (requestType)
                {
                    #region Musicals
                    case RequestTypes5.MusicalUpload:
                    {
                        if (data.Length != 0x370)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        byte[] musicalData = new byte[0x230];
                        Array.Copy(data, 0x140, musicalData, 0, 0x230);
                        MusicalRecord5 record = new MusicalRecord5(pid, 0, musicalData);
                        ulong serial = Database.Instance.MusicalUpload5(record);

                        if (serial == 0)
                        {
                            logEntry.AppendLine("Uploaded musical already in server.");
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        logEntry.AppendFormat("Musical {0} uploaded successfully.", serial);
                        logEntry.AppendLine();
                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(serial), 0, 8);

                    } break;
                    case RequestTypes5.MusicalSearch:
                    {
                        if (data.Length != 0x14c)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        // todo: validate or log some of this?
                        ushort species = BitConverter.ToUInt16(data, 0x144);

                        logEntry.AppendFormat("Searching for musical photos of species {0}.", species);
                        logEntry.AppendLine();

                        MusicalRecord5[] results = Database.Instance.MusicalSearch5(species, 5);
                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(results.Length), 0, 4);

                        foreach (MusicalRecord5 result in results)
                        {
                            response.Write(BitConverter.GetBytes(result.PID), 0, 4);
                            response.Write(BitConverter.GetBytes(result.SerialNumber), 0, 8);
                            response.Write(result.Data, 0, 0x230);
                        }
                        logEntry.AppendFormat("Retrieved {0} musical results.", results.Length);
                        logEntry.AppendLine();

                    } break;
                    #endregion

                    #region Battle videos
                    case RequestTypes5.BattleVideoUpload:
                    {
                        if (data.Length != 0x1ae8)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }
                        int sigLength = BitConverter.ToInt32(data, 0x19e4);
                        if (sigLength > 0x100 || sigLength < 0x00)
                        {
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        byte[] battlevidData = new byte[0x18a4];

                        Array.Copy(data, 0x140, battlevidData, 0, 0x18a4);
                        BattleVideoRecord5 record = new BattleVideoRecord5(pid, 0, battlevidData);
                        byte[] vldtSignature = new byte[sigLength];
                        Array.Copy(data, 0x19e8, vldtSignature, 0, sigLength);
                        // todo: validate signature.

                        ulong serial = Database.Instance.BattleVideoUpload5(record);

                        if (serial == 0)
                        {
                            logEntry.AppendLine("Uploaded battle video already in server.");
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        logEntry.AppendFormat("Battle video {0} uploaded successfully.", BattleVideoHeader4.FormatSerial(serial));
                        logEntry.AppendLine();
                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(serial), 0, 8);

                    } break;
                    case RequestTypes5.BattleVideoSearch:
                    {
                        if (data.Length != 0x15c)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        // todo: validate or log some of this?
                        BattleVideoRankings5 ranking = (BattleVideoRankings5)BitConverter.ToUInt32(data, 0x140);
                        ushort species = BitConverter.ToUInt16(data, 0x144);
                        BattleVideoMetagames5 meta = (BattleVideoMetagames5)data[0x146];
                        
                        // Byte 148 contains a magic number related to the searched metagame.
                        // If 0, disable metagame search. Metagame being 00 is insufficient
                        // since that value could mean Battle Subway Single.
                        if (data[0x148] == 0x00) meta = BattleVideoMetagames5.SearchNone;

                        byte country = data[0x14a];
                        byte region = data[0x14b];

                        logEntry.Append("Searching for ");
                        if (ranking != BattleVideoRankings5.None)
                            logEntry.AppendFormat("{0}", ranking);
                        else
                        {
                            if (species != 0xffff)
                                logEntry.AppendFormat("species {0}, ", species);
                            logEntry.AppendFormat("{0}", meta);
                            if (country != 0xff)
                                logEntry.AppendFormat(", country {0}", country);
                            if (region != 0xff)
                                logEntry.AppendFormat(", region {0}", region);
                        }
                        logEntry.AppendLine(".");

                        BattleVideoHeader5[] results = Database.Instance.BattleVideoSearch5(species, ranking, meta, country, region, 30);
                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(results.Length), 0, 4);

                        foreach (BattleVideoHeader5 result in results)
                        {
                            response.Write(BitConverter.GetBytes(result.PID), 0, 4);
                            response.Write(BitConverter.GetBytes(result.SerialNumber), 0, 8);
                            response.Write(result.Data, 0, 0xc4);
                        }
                        logEntry.AppendFormat("Retrieved {0} battle video results.", results.Length);
                        logEntry.AppendLine();

                    } break;
                    case RequestTypes5.BattleVideoWatch:
                    {
                        if (data.Length != 0x14c)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        ulong serial = BitConverter.ToUInt64(data, 0x140);
                        BattleVideoRecord5 record = Database.Instance.BattleVideoGet5(serial, true);
                        if (record == null)
                        {
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            logEntry.AppendFormat("Requested battle video {0} was missing.", BattleVideoHeader4.FormatSerial(serial));
                            logEntry.AppendLine();
                            type = EventLogEntryType.FailureAudit;
                            break;
                        }

                        response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                        response.Write(BitConverter.GetBytes(record.PID), 0, 4);
                        response.Write(BitConverter.GetBytes(record.SerialNumber), 0, 8);
                        response.Write(record.Header.Data, 0, 0xc4);
                        response.Write(record.Data, 0, 0x17e0);
                        logEntry.AppendFormat("Retrieved battle video {0}.", BattleVideoHeader4.FormatSerial(serial));
                        logEntry.AppendLine();

                    } break;
                    case RequestTypes5.BattleVideoSaved:
                    {
                        if (data.Length != 0x148)
                        {
                            logEntry.AppendLine("Length did not validate.");
                            type = EventLogEntryType.FailureAudit;
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            break;
                        }

                        ulong serial = BitConverter.ToUInt64(data, 0x140);

                        if (Database.Instance.BattleVideoFlagSaved5(serial))
                        {
                            response.Write(new byte[] { 0x00, 0x00 }, 0, 2); // result code (0 for OK)
                            logEntry.AppendFormat("Battle video {0} flagged saved.", BattleVideoHeader4.FormatSerial(serial));
                            logEntry.AppendLine();
                        }
                        else
                        {
                            response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                            logEntry.AppendFormat("Requested battle video {0} was missing.", BattleVideoHeader4.FormatSerial(serial));
                            logEntry.AppendLine();
                        }
                    } break;
                    #endregion

                    default:
                        logEntry.AppendLine("Unrecognized request type.");
                        response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
                        break;
                }
            }
            catch (Exception ex)
            {
                logEntry.AppendFormat("Unhandled exception while handling request.\nException: {0}", ex.ToString());
                logEntry.AppendLine();
                response.Write(new byte[] { 0x02, 0x00 }, 0, 2);
            }

            response.Flush();
            byte[] responseData = response.ToArray();
            WriteLength(responseData);

            LogHelper.Write(logEntry.ToString(), type);
            return responseData;
        }

        private byte Byte6(RequestTypes5 type)
        {
            switch (type)
            {
                case RequestTypes5.MusicalUpload:
                case RequestTypes5.MusicalSearch:
                    return 0x52;
                case RequestTypes5.BattleVideoUpload:
                case RequestTypes5.BattleVideoSearch:
                case RequestTypes5.BattleVideoWatch:
                case RequestTypes5.BattleVideoSaved:
                    return 0x55;
                default:
                    return 0x00;
            }
        }

        public override string Title
        {
            get 
            {
                return "Generation V Global Terminal";
            }
        }
    }

    internal enum RequestTypes5 : byte
    {
        MusicalUpload = 0x08,
        MusicalSearch = 0x09,

        BattleVideoUpload = 0xf0,
        BattleVideoSearch = 0xf1,
        BattleVideoWatch = 0xf2,
        BattleVideoSaved = 0xf3
    }
}


================================================
FILE: GlobalTerminalService/GTServerBase.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Net;
using PkmnFoundations.Support;
using System.Diagnostics;

namespace PkmnFoundations.GlobalTerminalService
{
    public abstract class GTServerBase
    {
        public GTServerBase(int port) 
            : this(port, false, 16, 5000)
        {
        }

        public GTServerBase(int port, bool useSsl)
            : this(port, useSsl, 16, 5000)
        {
        }

        public GTServerBase(int port, bool useSsl, int threads)
            : this(port, useSsl, threads, 5000)
        {
        }

        // todo: It would probably be better to load a custom certificate from
        // app.config, but since the DS doesn't even validate it, there's no
        // real point in securing it.
        public GTServerBase(int port, bool useSsl, int threads, int timeout)
            : this(port, useSsl, threads, timeout,
            useSsl ? GetDefaultCertificate() : null)
        {
        }

        public GTServerBase(int port, bool useSsl, int threads, int timeout, X509Certificate2 certificate)
        {
            Threads = threads;
            Timeout = timeout;
            UseSsl = useSsl;
            Certificate = certificate;
            m_workers = new List<Thread>(threads);
            m_listener = new TcpListener(IPAddress.Any, port);
        }

        private static X509Certificate2 GetDefaultCertificate()
        {
            X509Store store = new X509Store(StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly);
            var cers = 
                store.Certificates.Find(X509FindType.FindBySubjectName, "pkgdsprod.nintendo.co.jp", false)
                .Cast<X509Certificate2>().Where(cer => cer.HasPrivateKey && cer.PrivateKey != null);

            // fixme: Screen any found certificates for errors like "The
            // credentials supplied to the package were not recognized" and use
            // the dummy if none are good.
            var cerFirst = cers.FirstOrDefault();
            if (cerFirst != null) return cerFirst;

            LogHelper.Write("X.509 certificate not found. Please add a certificate with subject \"pkgdsprod.nintendo.co.jp\" to the store. Using dummy certificate.");
            return new X509Certificate2(AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar + "cert.pfx", "letmein");
        }

        public int Threads
        {
            get;
            protected set;
        }

        public int Timeout
        {
            get;
            protected set;
        }

        protected bool UseSsl
        {
            get;
            set;
        }

        protected X509Certificate Certificate { get; set; }

        private List<Thread> m_workers;
        private object m_lock = new object();
        private bool m_closing;
        private TcpListener m_listener;

        public void BeginPolling()
        {
            lock (m_lock)
            {
                if (m_workers.Count > 0) return;

                LogHelper.Write(String.Format("{0} server running on port {1} with {2} threads.", Title, ((IPEndPoint)m_listener.LocalEndpoint).Port, Threads));

                m_closing = false;
                m_listener.Start();
                for (int x = 0; x < Threads; x++)
                {
                    Thread t = new Thread(MainLoop);
                    m_workers.Add(t);
                    t.Start();
                }
            }
        }

        public void EndPolling()
        {
            lock (m_lock)
            {
                if (m_workers.Count == 0) return;

                m_closing = true;
                // wait for worker threads to exit
                while (m_workers.Count > 0) 
                {
                    Thread.Sleep(10);
                }
                m_listener.Stop();
            }
        }

        private void MainLoop(object o)
        {
            int threadIndex = m_workers.IndexOf(Thread.CurrentThread);
            // This is too chatty for an event log.
            //LogHelper.Write(String.Format("Thread {0} begins.", threadIndex));

            while (!m_closing)
            {
                try
                {
                    if (!m_listener.Pending())
                    {
                        Thread.Sleep(10);
                        continue;
                    }
                    using (TcpClient c = AcceptClient())
                    {
                        if (c == null)
                        {
                            Thread.Sleep(10);
                            continue;
                        }

                        try
                        {
                            c.ReceiveTimeout = Timeout;
                            c.SendTimeout = Timeout;

                            Stream s = GetStream(c);
                            BinaryReader br = new BinaryReader(s);

                            int length = br.ReadInt32();
                            if (length > 7820)
                            {
                                LogHelper.Write(String.Format("Indicated request length is over limit.\nHost: {0}", c.Client.RemoteEndPoint), EventLogEntryType.FailureAudit);
                                continue;
                            }
                            if (length < 320)
                            {
                                LogHelper.Write(String.Format("Indicated request length is under limit.\nHost: {0}", c.Client.RemoteEndPoint), EventLogEntryType.FailureAudit);
                                continue;
                            }

                            byte[] data = new byte[length];
                            BitConverter.GetBytes(length).CopyTo(data, 0);

                            int actualLength = br.ReadBlock(data, 4, length - 4);
                            if (actualLength + 4 != length)
                            {
                                LogHelper.Write(String.Format("The client disconnected prematurely.\nHost: {0}", c.Client.RemoteEndPoint), EventLogEntryType.FailureAudit);
                                continue;
                            }

                            byte[] response = ProcessRequest(data, c);
                            s.Write(response, 0, response.Length);
                        }
                        catch (Exception ex)
                        {
                            LogHelper.Write(String.Format("Unhandled exception while handling request:\nHost: {0}\nException: {1}", c.Client.RemoteEndPoint, ex.Message), EventLogEntryType.Error);
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Write(String.Format("Unhandled exception while handling request:\nException: {0}", ex.Message), EventLogEntryType.Error);
                }
            }

            //LogHelper.Write(String.Format("Thread {0} ends.", threadIndex));
            m_workers.Remove(Thread.CurrentThread);
        }

        private TcpClient AcceptClient()
        {
            lock (m_listener)
            {
                if (!m_listener.Pending()) return null;
                return m_listener.AcceptTcpClient();
            }
        }

        private Stream GetStream(TcpClient c)
        {
            if (UseSsl)
            {
                // todo: If we target .NET Core 3+, we can manually enable RC4 cipher suites.
                // https://github.com/dotnet/runtime/issues/23818
                // The DS wants to use SSLv3 and one of the following ciphers:
                // 0x0004 TLS_RSA_WITH_RC4_128_MD5
                // 0x0005 TLS_RSA_WITH_RC4_128_SHA
                // For now, the only functional approach is to enable these ciphers in the registry or via e.g. IISCrypto.
                SslStream sslClient = new SslStream(c.GetStream());
                sslClient.AuthenticateAsServer(Certificate, false, System.Security.Authentication.SslProtocols.Ssl3, false);
                return sslClient;
            }
            else return c.GetStream();
        }

        protected abstract byte[] ProcessRequest(byte[] data, TcpClient c);

        public abstract String Title { get; }

        protected void WriteLength(byte[] message)
        {
            byte[] data = BitConverter.GetBytes(message.Length);
            Array.Copy(data, 0, message, 0, 4);
        }
    }
}


================================================
FILE: GlobalTerminalService/GlobalTerminalService.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{7AB1A65F-3AD1-4356-94E7-F1A669BF4CE0}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>PkmnFoundations.GlobalTerminalService</RootNamespace>
    <AssemblyName>GlobalTerminalService</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <TargetFrameworkProfile>
    </TargetFrameworkProfile>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <PlatformTarget>x86</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup>
    <StartupObject />
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Configuration.Install" />
    <Reference Include="System.Core" />
    <Reference Include="System.Management" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Data" />
    <Reference Include="System.ServiceProcess" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="GTServer4.cs" />
    <Compile Include="GTServer5.cs" />
    <Compile Include="GTServerBase.cs" />
    <Compile Include="ProjectInstaller.cs">
      <SubType>Component</SubType>
    </Compile>
    <Compile Include="ProjectInstaller.Designer.cs">
      <DependentUpon>ProjectInstaller.cs</DependentUpon>
    </Compile>
    <Compile Include="Service1.cs">
      <SubType>Component</SubType>
    </Compile>
    <Compile Include="Service1.Designer.cs">
      <DependentUpon>Service1.cs</DependentUpon>
    </Compile>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\library\Library.csproj">
      <Project>{408EFC7E-C6B0-4160-8628-2679E34385CE}</Project>
      <Name>Library</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <None Include="app.config" />
    <None Include="cert.pfx">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
  <ItemGroup>
    <EmbeddedResource Include="ProjectInstaller.resx">
      <DependentUpon>ProjectInstaller.cs</DependentUpon>
    </EmbeddedResource>
    <EmbeddedResource Include="Service1.resx">
      <DependentUpon>Service1.cs</DependentUpon>
    </EmbeddedResource>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

================================================
FILE: GlobalTerminalService/Program.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;

namespace PkmnFoundations.GlobalTerminalService
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
#if DEBUG
            Service1 myService = new Service1();
            myService.Start();
            while (true) { Thread.Sleep(1000); }
#else
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
			{ 
				new Service1() 
			};
            ServiceBase.Run(ServicesToRun);
#endif
        }
    }
}


================================================
FILE: GlobalTerminalService/ProjectInstaller.Designer.cs
================================================
namespace PkmnFoundations.GlobalTerminalService
{
    partial class ProjectInstaller
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
            this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
            // 
            // serviceProcessInstaller1
            // 
            this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.NetworkService;
            this.serviceProcessInstaller1.Password = null;
            this.serviceProcessInstaller1.Username = null;
            // 
            // serviceInstaller1
            // 
            this.serviceInstaller1.Description = "Provides Global Terminal functionality to Pokémon games on the Nintendo DS.";
            this.serviceInstaller1.DisplayName = "Global Terminal Service";
            this.serviceInstaller1.ServiceName = "GlobalTerminalService";
            this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
            // 
            // ProjectInstaller
            // 
            this.Installers.AddRange(new System.Configuration.Install.Installer[] {
            this.serviceProcessInstaller1,
            this.serviceInstaller1});

        }

        #endregion

        private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
        private System.ServiceProcess.ServiceInstaller serviceInstaller1;
    }
}

================================================
FILE: GlobalTerminalService/ProjectInstaller.cs
================================================
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;

namespace PkmnFoundations.GlobalTerminalService
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();
        }
    }
}


================================================
FILE: GlobalTerminalService/ProjectInstaller.resx
================================================
<?xml version="1.0" encoding="utf-8"?>
<root>
  <!-- 
    Microsoft ResX Schema 
    
    Version 2.0
    
    The primary goals of this format is to allow a simple XML format 
    that is mostly human readable. The generation and parsing of the 
    various data types are done through the TypeConverter classes 
    associated with the data types.
    
    Example:
    
    ... ado.net/XML headers & schema ...
    <resheader name="resmimetype">text/microsoft-resx</resheader>
    <resheader name="version">2.0</resheader>
    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
        <value>[base64 mime encoded serialized .NET Framework object]</value>
    </data>
    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
        <comment>This is a comment</comment>
    </data>
                
    There are any number of "resheader" rows that contain simple 
    name/value pairs.
    
    Each data row contains a name, and value. The row also contains a 
    type or mimetype. Type corresponds to a .NET class that support 
    text/value conversion through the TypeConverter architecture. 
    Classes that don't support this are serialized and stored with the 
    mimetype set.
    
    The mimetype is used for serialized objects, and tells the 
    ResXResourceReader how to depersist the object. This is currently not 
    extensible. For a given mimetype the value must be set accordingly:
    
    Note - application/x-microsoft.net.object.binary.base64 is the format 
    that the ResXResourceWriter will generate, however the reader can 
    read any of the formats listed below.
    
    mimetype: application/x-microsoft.net.object.binary.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
            : and then encoded with base64 encoding.
    
    mimetype: application/x-microsoft.net.object.soap.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
            : and then encoded with base64 encoding.

    mimetype: application/x-microsoft.net.object.bytearray.base64
    value   : The object must be serialized into a byte array 
            : using a System.ComponentModel.TypeConverter
            : and then encoded with base64 encoding.
    -->
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <metadata name="serviceProcessInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>17, 17</value>
  </metadata>
  <metadata name="serviceInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>328, 17</value>
  </metadata>
  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>False</value>
  </metadata>
</root>

================================================
FILE: GlobalTerminalService/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("GlobalTerminalService")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("GlobalTerminalService")]
[assembly: AssemblyCopyright("Copyright ©  2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("47274bc4-d452-4eeb-acfb-6aedfe702a65")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


================================================
FILE: GlobalTerminalService/Service1.Designer.cs
================================================
namespace PkmnFoundations.GlobalTerminalService
{
    partial class Service1
    {
        /// <summary> 
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary> 
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            // 
            // Service1
            // 
            this.ServiceName = "GlobalTerminalService";

        }

        #endregion
    }
}


================================================
FILE: GlobalTerminalService/Service1.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using PkmnFoundations.Support;

namespace PkmnFoundations.GlobalTerminalService
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
#if !DEBUG
            LogHelper.UseEventLog(this.EventLog);
#endif
        }

        private GTServer4 m_server_4 = null;
        private GTServer5 m_server_5 = null;

        protected override void OnStart(string[] args)
        {
            Start();
        }

        public void Start()
        {
            if (m_server_4 == null) m_server_4 = new GTServer4();
            if (m_server_5 == null) m_server_5 = new GTServer5();
            m_server_4.BeginPolling();
            m_server_5.BeginPolling();
        }

        protected override void OnStop()
        {
            if (m_server_4 != null) m_server_4.EndPolling();
            // fixme: it waits for the GenIV server to stop completely before
            // shutting down the GenV server. Should shut them both down async.
            if (m_server_5 != null) m_server_5.EndPolling();
        }
    }
}


================================================
FILE: GlobalTerminalService/Service1.resx
================================================
<?xml version="1.0" encoding="utf-8"?>
<root>
  <!-- 
    Microsoft ResX Schema 
    
    Version 2.0
    
    The primary goals of this format is to allow a simple XML format 
    that is mostly human readable. The generation and parsing of the 
    various data types are done through the TypeConverter classes 
    associated with the data types.
    
    Example:
    
    ... ado.net/XML headers & schema ...
    <resheader name="resmimetype">text/microsoft-resx</resheader>
    <resheader name="version">2.0</resheader>
    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
        <value>[base64 mime encoded serialized .NET Framework object]</value>
    </data>
    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
        <comment>This is a comment</comment>
    </data>
                
    There are any number of "resheader" rows that contain simple 
    name/value pairs.
    
    Each data row contains a name, and value. The row also contains a 
    type or mimetype. Type corresponds to a .NET class that support 
    text/value conversion through the TypeConverter architecture. 
    Classes that don't support this are serialized and stored with the 
    mimetype set.
    
    The mimetype is used for serialized objects, and tells the 
    ResXResourceReader how to depersist the object. This is currently not 
    extensible. For a given mimetype the value must be set accordingly:
    
    Note - application/x-microsoft.net.object.binary.base64 is the format 
    that the ResXResourceWriter will generate, however the reader can 
    read any of the formats listed below.
    
    mimetype: application/x-microsoft.net.object.binary.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
            : and then encoded with base64 encoding.
    
    mimetype: application/x-microsoft.net.object.soap.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
            : and then encoded with base64 encoding.

    mimetype: application/x-microsoft.net.object.bytearray.base64
    value   : The object must be serialized into a byte array 
            : using a System.ComponentModel.TypeConverter
            : and then encoded with base64 encoding.
    -->
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <value>False</value>
  </metadata>
</root>

================================================
FILE: GlobalTerminalService/app.config
================================================
<?xml version="1.0"?>

<configuration>
  
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>

  <runtime>
    <!-- Too bad AppContexts are only supported on .NET 4.6+ and don't seem to override ciphers disabled in the registry anyway. -->
    <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=true"/>
  </runtime>
  
  <connectionStrings>
    <add name="pkmnFoundationsConnectionString"
         connectionString="Server=localhost;Database=gts;User ID=gts;Password=gts;Pooling=true;charset=utf8;Allow User Variables=True"
         providerName="MySql.Data.MySqlClient" />
  </connectionStrings>

</configuration>


================================================
FILE: LICENSE.md
================================================
Copyright © 2014-2023 Megan Edwards (mm201), all rights reserved

You may:
* Run a private instance for development purposes.
* Serve it privately to a LAN for personal use among a group of people you know.
* Privately make changes.
* Contribute those changes back to the author's original project which, at the
time of writing, is located at https://github.com/mm201/pkmn-classic-framework/
. Such contributions will be subject to the author's choice of license.

Should a period of 180 consecutive days elapse where the server operated or
endorsed by the author (which, at the time of writing, is located at
https://pkmnclassic.net/ ) remains offline, then you may take the contents of
this repository and rerelease them under the terms of the GNU Affero General
Public License. The full text of this license may, at time of writing, be found
at https://www.gnu.org/licenses/agpl-3.0.en.html .

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: MakeBaseStatTables/MakeBaseStatTables.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{99FCBB1C-D94F-458D-ABD2-8800FBDC65DA}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>MakeBaseStatTables</RootNamespace>
    <AssemblyName>MakeBaseStatTables</AssemblyName>
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <TargetFrameworkProfile />
    <NuGetPackageImportStamp>a6417236</NuGetPackageImportStamp>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
    <Reference Include="System.Core" />
    <Reference Include="System.Data.SQLite, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\System.Data.SQLite.Core.1.0.94.0\lib\net20\System.Data.SQLite.dll</HintPath>
    </Reference>
    <Reference Include="System.Data.SQLite.Linq, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\System.Data.SQLite.Linq.1.0.94.1\lib\net20\System.Data.SQLite.Linq.dll</HintPath>
    </Reference>
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\library\Library.csproj">
      <Project>{408efc7e-c6b0-4160-8628-2679e34385ce}</Project>
      <Name>Library</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <None Include="app.config" />
    <None Include="packages.config" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="..\packages\System.Data.SQLite.Core.1.0.94.0\build\net20\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.94.0\build\net20\System.Data.SQLite.Core.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\System.Data.SQLite.Core.1.0.94.0\build\net20\System.Data.SQLite.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.Data.SQLite.Core.1.0.94.0\build\net20\System.Data.SQLite.Core.targets'))" />
  </Target>
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

================================================
FILE: MakeBaseStatTables/Program.cs
================================================
using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.IO;
using System.Linq;
using System.Text;
using PkmnFoundations.Data;

namespace MakeBaseStatTables
{
    /// <summary>
    /// Builds some .txt data files from the Veekun data which require manual
    /// edits.
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            String veekunFilename;

            if (args.Length < 1) veekunFilename = "pokedex.sqlite";
            else veekunFilename = args[0];

            if (veekunFilename.Contains(';')) throw new NotSupportedException("The character ; in filenames is not supported.");
            if (veekunFilename.Contains('?'))
            {
                Console.WriteLine("Usage: MakeBaseStatTables [filename]");
                Console.WriteLine("filename: Filename of Veekun sqlite database. Default: pokedex.sqlite");
                return;
            }

            using (SQLiteConnection connVeekun = new SQLiteConnection("Data Source=" + veekunFilename + "; Version=3"))
            {
                connVeekun.Open();

                SQLiteDataReader reader = (SQLiteDataReader)connVeekun.ExecuteReader("SELECT id, " +
                    "(SELECT base_stat FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 1) AS base_hp, " +
                    "(SELECT base_stat FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 2) AS base_attack, " +
                    "(SELECT base_stat FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 3) AS base_defense, " +
                    "(SELECT base_stat FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 4) AS base_sp_attack, " +
                    "(SELECT base_stat FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 5) AS base_sp_defense, " +
                    "(SELECT base_stat FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 6) AS base_speed, " +
                    "(SELECT effort FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 1) AS reward_hp, " +
                    "(SELECT effort FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 2) AS reward_attack, " +
                    "(SELECT effort FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 3) AS reward_defense, " +
                    "(SELECT effort FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 4) AS reward_sp_attack, " +
                    "(SELECT effort FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 5) AS reward_sp_defense, " +
                    "(SELECT effort FROM pokemon_stats WHERE pokemon_id = pokemon_forms.pokemon_id AND stat_id = 6) AS reward_speed, " +
                    "(SELECT type_id FROM pokemon_types WHERE pokemon_id = pokemon_forms.pokemon_id AND slot = 1) AS type1, " +
                    "(SELECT type_id FROM pokemon_types WHERE pokemon_id = pokemon_forms.pokemon_id AND slot = 2) AS type2 " +
                    "FROM pokemon_forms ORDER BY id");

                using (FileStream fs = File.Open("form_stats1.txt", FileMode.Create))
                {
                    StreamWriter sw = new StreamWriter(fs);

                    while (reader.Read())
                    {
                        sw.Write("{0:00000}\t", reader["id"]);
                        sw.Write("{0:00}\t", reader["type1"] is DBNull ? 0 : Convert.ToInt32(reader["type1"]));
                        sw.Write("{0:00}\t", reader["type2"] is DBNull ? 0 : Convert.ToInt32(reader["type2"]));
                        sw.Write("{0:000}\t", Convert.ToInt32(reader["base_hp"]));
                        sw.Write("{0:000}\t", Convert.ToInt32(reader["base_attack"]));
                        sw.Write("{0:000}\t", Convert.ToInt32(reader["base_defense"]));
                        sw.Write("{0:000}\t", Convert.ToInt32(reader["base_speed"]));
                        sw.Write("{0:000}\t", Convert.ToInt32(reader["base_sp_attack"]));
                        sw.Write("{0:000}\t", Convert.ToInt32(reader["base_sp_defense"]));
                        sw.Write("{0:0}\t", Convert.ToByte(reader["reward_hp"]));
                        sw.Write("{0:0}\t", Convert.ToByte(reader["reward_attack"]));
                        sw.Write("{0:0}\t", Convert.ToByte(reader["reward_defense"]));
                        sw.Write("{0:0}\t", Convert.ToByte(reader["reward_speed"]));
                        sw.Write("{0:0}\t", Convert.ToByte(reader["reward_sp_attack"]));
                        sw.WriteLine("{0:0}", Convert.ToByte(reader["reward_sp_defense"]));
                    }
                    sw.Close();
                    fs.Close();
                }
                reader.Close();

                reader = (SQLiteDataReader)connVeekun.ExecuteReader("SELECT id, " +
                    "(SELECT ability_id FROM pokemon_abilities WHERE pokemon_id = pokemon_forms.pokemon_id AND slot = 1) AS ability1, " +
                    "(SELECT ability_id FROM pokemon_abilities WHERE pokemon_id = pokemon_forms.pokemon_id AND slot = 2) AS ability2, " +
                    "(SELECT ability_id FROM pokemon_abilities WHERE pokemon_id = pokemon_forms.pokemon_id AND is_hidden = 1) AS ability_hidden " +
                    "FROM pokemon_forms ORDER BY id");
                using (FileStream fs3 = File.Open("form_abilities3.txt", FileMode.Create), 
                    fs4 = File.Open("form_abilities4.txt", FileMode.Create),
                    fs5 = File.Open("form_abilities5.txt", FileMode.Create),
                    fs6 = File.Open("form_abilities6.txt", FileMode.Create))
                {
                    StreamWriter sw3 = new StreamWriter(fs3);
                    StreamWriter sw4 = new StreamWriter(fs4);
                    StreamWriter sw5 = new StreamWriter(fs5);
                    StreamWriter sw6 = new StreamWriter(fs6);

                    while (reader.Read())
                    {
                        long id = Convert.ToInt64(reader["id"]);

                        if ((id <= 386) || (id >= 10000 && id <= 10033))
                        {
                            sw3.Write("{0:00000}\t", reader["id"]);
                            sw3.Write("{0:000}\t", reader["ability1"] is DBNull ? 0 : Convert.ToInt32(reader["ability1"]));
                            sw3.Write("{0:000}\t", reader["ability2"] is DBNull ? 0 : Convert.ToInt32(reader["ability2"]));
                            sw3.WriteLine("{0:000}", 0);
                        }
                        else if ((id <= 493) || (id >= 10034 && id <= 10065))
                        {
                            sw4.Write("{0:00000}\t", reader["id"]);
                            sw4.Write("{0:000}\t", reader["ability1"] is DBNull ? 0 : Convert.ToInt32(reader["ability1"]));
                            sw4.Write("{0:000}\t", reader["ability2"] is DBNull ? 0 : Convert.ToInt32(reader["ability2"]));
                            sw4.WriteLine("{0:000}", 0);
                        }

                        if ((id <= 649) || (id >= 10000 && id <= 10084))
                        {
                            sw5.Write("{0:00000}\t", reader["id"]);
                            sw5.Write("{0:000}\t", reader["ability1"] is DBNull ? 0 : Convert.ToInt32(reader["ability1"]));
                            sw5.Write("{0:000}\t", reader["ability2"] is DBNull ? 0 : Convert.ToInt32(reader["ability2"]));
                            sw5.WriteLine("{0:000}", reader["ability_hidden"] is DBNull ? 0 : Convert.ToInt32(reader["ability_hidden"]));
                        }
                        else
                        {
                            sw6.Write("{0:00000}\t", reader["id"]);
                            sw6.Write("{0:000}\t", reader["ability1"] is DBNull ? 0 : Convert.ToInt32(reader["ability1"]));
                            sw6.Write("{0:000}\t", reader["ability2"] is DBNull ? 0 : Convert.ToInt32(reader["ability2"]));
                            sw6.WriteLine("{0:000}", reader["ability_hidden"] is DBNull ? 0 : Convert.ToInt32(reader["ability_hidden"]));
                        }
                    }

                    sw3.Close();
                    sw4.Close();
                    sw5.Close();
                    sw6.Close();

                    fs3.Close();
                    fs4.Close();
                    fs5.Close();
                    fs6.Close();
                }

                connVeekun.Close();
            }
        }
    }
}


================================================
FILE: MakeBaseStatTables/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("MakeBaseStatTables")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MakeBaseStatTables")]
[assembly: AssemblyCopyright("Copyright ©  2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("e867b07c-6746-4495-8cd8-ad05b8463a8b")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


================================================
FILE: MakeBaseStatTables/app.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    
  <supportedRuntime version="v2.0.50727" /></startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.91.0" newVersion="1.0.91.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
<system.data>
    <DbProviderFactories>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data></configuration>


================================================
FILE: MakeBaseStatTables/packages.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="System.Data.SQLite" version="1.0.94.1" targetFramework="net35" />
  <package id="System.Data.SQLite.Core" version="1.0.94.0" targetFramework="net35" />
  <package id="System.Data.SQLite.Linq" version="1.0.94.1" targetFramework="net35" />
</packages>

================================================
FILE: README.md
================================================
# Poké Classic Framework

https://pkmnclassic.net/

Poké Classic Framework is a replacement server and class library for Pokémon
Generations 4 and 5. Poké Classic Network is the name of the server itself.

## How to connect

AltWFC is configured to automatically direct you to my servers. Follow the
[instructions](https://github.com/polaris-/dwc_network_server_emulator/wiki) 
at their wiki to connect.

## What works

* GTS
* Battle Videos
* Dressup (PtHGSS)
* Box uploads (PtHGSS)
* Musical photos (BW1/2)
* Wi-Fi Battle Tower and Subway
* Trainer Rankings (PtHGSS)
* Wi-Fi Plaza (PtHGSS) (Surveys still in progress)

Direct communications are handled by 
[AltWFC](https://github.com/polaris-/dwc_network_server_emulator) and are
outside the scope of this project. They work at the time of writing but 
haven't been tested that thoroughly.

## What doesn't

* Game Sync
* Rating Battles / Competitions

## What's planned

* A much more awesome website
* Cheat detection
* Stat checking in a similar manner as Pokécheck
* Game Sync (I will need help with this!)

## How you can help

If there's something you want to see, the best thing is to discuss it with me
and prepare a pull request. You should also check for open issues marked
[Help Wanted](https://github.com/mm201/pkmn-classic-framework/labels/help%20wanted).
Not all of them require programming skill.

The most significant way you can help is simply by using it. The GTS is nothing
without users. Get on there and start trading!

## Credits

* [Project Pokémon](https://projectpokemon.org/) for most of the original fake
GTS reverse engineering work, file format and data structure descriptions, and
many ID number tables, including items and trendy phrases.
* [Pipian](http://www.pipian.net/ierukana/) for more reverse engineering help,
including the Battle Tower and Wi-fi Plaza.
* [Nagato](https://github.com/polaris-), for help reverse engineering the Game
Sync protocol.
* [Billy](https://billy.wales/) for help with GameSpy protocols and interfacing
with Wiimmfi.
* Nagato and other contributors to the
[AltWFC](https://github.com/barronwaffles/dwc_network_server_emulator) project,
which this project depends on for basic Nintendo Wi-Fi fuctionality.
* [Eevee](https://veekun.com/) for her Veekun Pokédex and large sprite rips.
* [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Main_Page) for most item
sprites and Generation 3 item/text conversion tables.
* [kaphotics](https://twitter.com/kaphotics) for the Pokémon mini sprite rips
from ORAS.
* [sosnek](https://github.com/sosnek) for help with held item validation.
* [msikma](https://github.com/msikma/pokesprite) and 
[monsanto](https://github.com/smogon/sprites) for their sprite databases.
* GatorShark and Magical for their
[Spinda spot documentation](https://gatorshark.webs.com/SpindaDocumentation.htm)
and [Python implementation](https://github.com/magical/spinda), respectively.


================================================
FILE: RenameImages/App.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="pkmnFoundationsConnectionString"
         connectionString="Server=localhost;Database=gts;User ID=gts;Password=gts;Pooling=true;charset=utf8;Allow User Variables=True"
         providerName="MySql.Data.MySqlClient" />
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>
</configuration>


================================================
FILE: RenameImages/Program.cs
================================================
using PkmnFoundations.Data;
using PkmnFoundations.Pokedex;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;

namespace RenameImages
{
    /// <summary>
    /// Renames images obtained from Pokesprite. https://github.com/msikma/pokesprite
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            string path;
            char slash = Path.DirectorySeparatorChar;
            ConnectionStringSettings css;

            if (args.Length < 1) path = "." + slash + "pkmn-sm";
            else path = args[0];

            if (path.Contains('?'))
            {
                Console.WriteLine("h e l p");
                return;
            }

            while (path.Length > 0 && (path[path.Length - 1] == '/' || path[path.Length - 1] == '\\'))
            {
                path = path.Substring(0, path.Length - 1);
            }
            path = path + slash;

            if (args.Length < 3)
                css = ConfigurationManager.ConnectionStrings["pkmnFoundationsConnectionString"];
            else
                css = new ConnectionStringSettings("", args[1], args[2]);

            Database db = Database.CreateInstance(css);
            Pokedex pokedex = new Pokedex(db, false);

            foreach (var pair in pokedex.Forms)
            {
                Form form = pair.Value;
                Species species = form.Species;
                StringBuilder speciesNameBuilder = new StringBuilder(species.Name["EN"].ToLowerInvariant());
                speciesNameBuilder.Replace("\'", "");
                speciesNameBuilder.Replace(".", "");
                speciesNameBuilder.Replace("♀", "-f");
                speciesNameBuilder.Replace("♂", "-m");
                speciesNameBuilder.Replace('é', 'e');
                speciesNameBuilder.Replace(' ', '-');
                string speciesName = speciesNameBuilder.ToString();

                // fixme: This is incorrect for Vivillon, Pumpkaboo, and Gourgeist, because their suffixless form is not form 0.
                string oldFilename = (form.Value == 0) 
                    ? String.Format("{0}.png", speciesName)
                    : String.Format("{0}-{1}.png", speciesName, form.Suffix);

                string newFilename = (form.Suffix.Trim().Length == 0)
                    ? String.Format("{0}.png", species.NationalDex)
                    : String.Format("{0}-{1}.png", species.NationalDex, form.Suffix);

                try
                {
                    File.Move(path + oldFilename, path + newFilename);
                    Console.Write("{0} {1}", oldFilename, newFilename);
                }
                catch (Exception ex)
                {
                    Console.Write(ex.Message);
                }

                if (form.Value == 0 && form.Suffix.Trim().Length != 0)
                {
                    try
                    {
                        string speciesFilename = String.Format("{0}.png", species.NationalDex);
                        File.Copy(path + newFilename, path + speciesFilename);
                        Console.Write(" {0}", speciesFilename);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine();
                        Console.Write(ex.Message);
                    }
                }
                Console.WriteLine();
            }

            Console.ReadKey();
        }

        private static string NormalizeFilename(string filename, string path)
        {
            if (filename.Length >= path.Length)
            {
                string pathPart = filename.Substring(0, path.Length);
                if (pathPart == path) filename = filename.Substring(path.Length);
            }
            return filename.ToLowerInvariant().Trim();
        }

    }
}


================================================
FILE: RenameImages/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("RenameImages")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RenameImages")]
[assembly: AssemblyCopyright("Copyright ©  2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("d8787475-2d21-4e60-9320-13fa55c979ac")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


================================================
FILE: RenameImages/RenameImages.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{D8787475-2D21-4E60-9320-13FA55C979AC}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <RootNamespace>RenameImages</RootNamespace>
    <AssemblyName>RenameImages</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Configuration" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\library\Library.csproj">
      <Project>{408efc7e-c6b0-4160-8628-2679e34385ce}</Project>
      <Name>Library</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <None Include="App.config" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

================================================
FILE: Roadmap.md
================================================
# Roadmap

This is a complete list of all the features I want the PCN server to have for me to consider it complete.

## IV and V

* GTS: cheat filter, legal request filter, search, history, player history, push notifications
* Battle tower: room leaders, room history, player history, player's last party used, player's highest floor reached
* Battle videos: Search, history, watch
* Mystery gift: monthly rotation
* Player profiles: login, view, permissions
* Pokédex
* Friend list management? I don’t know whether to handle this at the Trainer or User level.
* I guess we can show friends lists in one’s own trainer profiles after game sync has happened, and have an Add as Friend button. (Add as Dream Pal?)
* Permissions: Game progress (badges, medals, pokedex, battle tower, …), Friends, GTS history, uploaded shit
* Permission levels: Everyone, friends, nobody

## IV

* Dressups: search
* Box uploads: search
* Trainer rankings: current, breakdown by week
* Wifi plaza: survey results
* Stat checking: check via GTS, check via battle videos
* Player profiles: link via GTS

## V

* Musicals: search
* Stat checking: check via Game Sync
* Player profiles: link via Game Sync ID
* pkvldtprod: soft legality check
* Game Sync: put to bed, wake up, receive items, pokemon, musicals, c-gear, pokedex wallpaper
* Dream World: berry garden, pokemon feeder, house decorations
* Rating battles
* Battle competitions 

## Stat checking

* All the features of Pokecheck.
* GenIV links in a Pokecheck style way: Search for Ditto lv9 and under, get a secret code from the search results.
* GenV links using your PGL code.
* Link in one place for both PGL and stat check.
(Provide some basic PGL style functionality eg. player profiles and game selection for Gen4)
In Gen4, you check a pokemon just like Pokecheck, only your request must be Ditto lv9 and under for it to happen.
In Gen5, you check a box of pokemon at a time by renaming the box and using Game Sync. (possible issue: game sync limited to once a day)
You can add tags to your pokemon summaries, works much the same as pokecheck boxes only multiples are allowed.
* Species/shiny/DW are built-in searches.
* Set individual pokemon to public/friends/private.
* Delete button. (this is a 100% real delete)

## Administration

* Can see full “pokecheck” pages for any pokemon in the GTS or history.
* Can eject pokemon from the system.
* Can see all trainer profiles
* Can see all user profiles
* Can ban trainers??
* Can link/unlink trainers to user profiles.
* Gets some secret trainer/user info like pid.
* Sees full validation summaries of all pokemon
* Has access to pkvldtprod logs
* Hide/delete pkgdsprod uploads
* Hex view of pkm data (decrypted, unshuffled)


================================================
FILE: VeekunImport/Program.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using PkmnFoundations.Data;
using System.Data.SQLite;
using System.Data;
using PkmnFoundations.Structures;
using PkmnFoundations.Pokedex;
using PkmnFoundations.Support;
using System.Threading;
using System.Globalization;
using System.IO;

namespace VeekunImport
{
    class Program
    {
        const int GENERATIONS = 6;

        static void Main(string[] args)
        {
            string veekunFilename;
            ConnectionStringSettings css;

            if (args.Length < 1) veekunFilename = "pokedex.sqlite";
            else veekunFilename = args[0];

            if (veekunFilename.Contains(';')) throw new NotSupportedException("The character ; in filenames is not supported.");
            if (veekunFilename.Contains('?'))
            {
                Console.WriteLine("Usage: VeekunImport [filename [connectionString providerName]]");
                Console.WriteLine("filename: Filename of Veekun sqlite database. Default: pokedex.sqlite");
                Console.WriteLine("connectionString: pkmnFoundations connection string. Default: from app.config");
                Console.WriteLine("providerName: .NET classname of connection provider. Default: from app.config");
                return;
            }

            if (args.Length < 3)
                css = ConfigurationManager.ConnectionStrings["pkmnFoundationsConnectionString"];
            else
                css = new ConnectionStringSettings("", args[1], args[2]);

            Database db = Database.CreateInstance(css);

            using (SQLiteConnection connVeekun = new SQLiteConnection("Data Source=" + veekunFilename + "; Version=3"))
            {
                connVeekun.Open();

                // General logic:
                // 1. run a query against veekun, populate a DataTable.
                // 2. foreach DataRow, instance a class from the PkmnFoundations.Pokedex namespace.
                // 3. call Database.AddToPokedex on that object.

                // todo: We need a way to rebuild specific tables

                // pkmncf_pokedex_pokemon_families
                // Obtain the families map. We will use it in a few places.
                Dictionary<int, int> familyMap = new Dictionary<int, int>();
                List<int[]> familyList = new List<int[]>();
                ProcessTSV("families_map.txt", 1, row =>
                    {
                        // todo: allow for comments by stopping consumption of fields once one fails to parse.
                        int[] fieldsInt = row.Fields.Select(s => Convert.ToInt32(s)).ToArray();
                        familyList.Add(fieldsInt);
                        foreach (int x in fieldsInt)
                        {
                            // lineNumber is one-based, unlike familyList index.
                            // species is the key, family ID is the value.
                            // If any species is repeated in family_map.txt, this ought to fail.
                            familyMap.Add(x, row.ValidLineNumber + 1);
                        }
                    });

                // families from families.txt override default behaviour.
                List<Family> overrideFamilies = new List<Family>();
                ProcessTSV("families.txt", 7, row =>
                    {
                        string[] fields = row.Fields;
                        overrideFamilies.Add(new Family(null,
                            Convert.ToInt32(fields[0]),
                            Convert.ToInt32(fields[1]),
                            Convert.ToInt32(fields[2]),
                            Convert.ToInt32(fields[3]),
                            Convert.ToInt32(fields[4]),
                            Convert.ToInt32(fields[5]),
                            Convert.ToByte(fields[6])
                            ));
                    });
                // already sorted
                //someFamilies.Sort((f, other) => f.ID.CompareTo(other.ID));

                int familyCount = familyList.Count;
                int nextOverrideIndex = 0;
                for (int familyId = 1; familyId <= familyCount; familyId++)
                {
                    int basicSpeciesId = familyList[familyId - 1][0];
                    Family f;
                    if (nextOverrideIndex < overrideFamilies.Count && overrideFamilies[nextOverrideIndex].ID == familyId)
                    {
                        // An override exists in the table; use it.
                        f = overrideFamilies[nextOverrideIndex];
                        nextOverrideIndex++;
                    }
                    else
                    {
                        // No override exists so go with default:
                        // Basic male/female are the same species which is the one listed first.
                        // There is no baby species nor incense
                        // (Non-incense babies are considered basic in this system anyway.)
                        // Gender ratio comes from the basic species.
                        byte genderRatio = (byte)Convert.ToInt32(connVeekun.ExecuteScalar("SELECT gender_rate FROM pokemon_species WHERE id = @id", new SQLiteParameter("@id", basicSpeciesId)));
                        f = new Family(null, familyId, basicSpeciesId, basicSpeciesId, 0, 0, 0, genderRatio);
                    }
                    db.PokedexInsertFamily(f);
                    string basic = (f.BasicMaleID != f.BasicFemaleID) ?
                        String.Format(" {0}/{1}", f.BasicMaleID, f.BasicFemaleID) :
                        String.Format(" {0}", f.BasicMaleID);
                    string baby;
                    if (f.BabyMaleID != f.BabyFemaleID)
                        baby = String.Format(" {0}/{1} incense {2}", f.BabyMaleID, f.BabyFemaleID, f.IncenseID);
                    else
                        baby = (f.BabyMaleID == 0) ? "" :
                            String.Format(" {0} incense {1}", f.BabyMaleID, f.IncenseID);
                    string gender = (f.GenderRatio == 255) ? "genderless" :
                        String.Format("{0}% female", (float)f.GenderRatio * 12.5f);
                    Console.WriteLine("Inserted family {0}{1}{2} {3}", f.ID, basic, baby, gender);
                }

                // pkmncf_pokedex_pokemon
                SQLiteDataReader rdPokemon = (SQLiteDataReader)connVeekun.ExecuteReader("SELECT " +
                    "pokemon_species.id, " +
                    "(SELECT pokemon_species_names.name FROM pokemon_species_names WHERE pokemon_species_names.pokemon_species_id = pokemon_species.id AND local_language_id = 1) AS name_ja, " +
                    "(SELECT pokemon_species_names.name FROM pokemon_species_names WHERE pokemon_species_names.pokemon_species_id = pokemon_species.id AND local_language_id = 9) AS name_en, " +
                    "(SELECT pokemon_species_names.name FROM pokemon_species_names WHERE pokemon_species_names.pokemon_species_id = pokemon_species.id AND local_language_id = 5) AS name_fr, " +
                    "(SELECT pokemon_species_names.name FROM pokemon_species_names WHERE pokemon_species_names.pokemon_species_id = pokemon_species.id AND local_language_id = 8) AS name_it, " +
                    "(SELECT pokemon_species_names.name FROM pokemon_species_names WHERE pokemon_species_names.pokemon_species_id = pokemon_species.id AND local_language_id = 6) AS name_de, " +
                    "(SELECT pokemon_species_names.name FROM pokemon_species_names WHERE pokemon_species_names.pokemon_species_id = pokemon_species.id AND local_language_id = 7) AS name_es, " +
                    "(SELECT pokemon_species_names.name FROM pokemon_species_names WHERE pokemon_species_names.pokemon_species_id = pokemon_species.id AND local_language_id = 3) AS name_ko, " +
                    "growth_rate_id, gender_rate, " +
                    "(SELECT egg_group_id FROM pokemon_egg_groups WHERE species_id = pokemon_species.id ORDER BY egg_group_id LIMIT 1) AS egg_group_1, " +
                    "(SELECT egg_group_id FROM pokemon_egg_groups WHERE species_id = pokemon_species.id ORDER BY egg_group_id LIMIT 1, 1) AS egg_group_2, " +
                    "hatch_counter, has_gender_differences " +
                    "FROM pokemon_species " +
                    "ORDER BY pokemon_species.id");

                while (rdPokemon.Read())
                {
                    int id = Convert.ToInt32(rdPokemon["id"]);
                    byte growth_rate_id = Convert.ToByte(rdPokemon["growth_rate_id"]);
                    int gender_rate = Convert.ToInt32(rdPokemon["gender_rate"]);
                    byte egg_group_1 = Convert.ToByte(rdPokemon["egg_group_1"]);
                    byte egg_group_2 = 0;
                    if (!(rdPokemon["egg_group_2"] is DBNull)) egg_group_2 = Convert.ToByte(rdPokemon["egg_group_2"]);
                    int hatch_counter = Convert.ToInt32(rdPokemon["hatch_counter"]);
                    byte has_gender_differences = Convert.ToByte(rdPokemon["has_gender_differences"]);

                    if (id == 255) has_gender_differences = 0; // Torchic doesn't have gender differences.

                    // todo: Family ID
                    Species s = new Species(null, id,
                        familyMap[id],
                        GetLocalizedString(rdPokemon, "name_"),
                        (GrowthRates)growth_rate_id,
                        (byte)gender_rate,
                        (EggGroups)egg_group_1,
                        (EggGroups)egg_group_2,
                        (byte)hatch_counter,
                        has_gender_differences != 0
                        );

                    db.PokedexInsertSpecies(s);
                    Console.WriteLine("Inserted {0} {1} {2} {3} {4} {5}",
                        s.NationalDex, s.Name.ToString(), s.GrowthRate, s.GenderRatio, s.EggSteps, s.GenderVariations);
                }
                rdPokemon.Close();

                // pkmncf_pokedex_pokemon_forms
                Dictionary<int, byte> formValueMap = new Dictionary<int, byte>();
                ProcessTSV("form_values.txt", 3, row =>
                    {
                        string[] fields = row.Fields;
                        formValueMap.Add(Convert.ToInt32(fields[1]), Convert.ToByte(fields[2]));
                    });

                SQLiteDataReader rdForms = (SQLiteDataReader)connVeekun.ExecuteReader("SELECT id, " +
                    "(SELECT species_id FROM pokemon WHERE id = pokemon_id) AS NationalDex, " +
                    "form_order - 1 AS FormValue, " +
                    "(SELECT pokemon_form_names.form_name FROM pokemon_form_names WHERE pokemon_form_names.pokemon_form_id = pokemon_forms.id AND local_language_id = 1) AS name_ja, " +
                    "(SELECT pokemon_form_names.form_name FROM pokemon_form_names WHERE pokemon_form_names.pokemon_form_id = pokemon_forms.id AND local_language_id = 9) AS name_en, " +
                    "(SELECT pokemon_form_names.form_name FROM pokemon_form_names WHERE pokemon_form_names.pokemon_form_id = pokemon_forms.id AND local_language_id = 5) AS name_fr, " +
                    "(SELECT pokemon_form_names.form_name FROM pokemon_form_names WHERE pokemon_form_names.pokemon_form_id = pokemon_forms.id AND local_language_id = 8) AS name_it, " +
                    "(SELECT pokemon_form_names.form_name FROM pokemon_form_names WHERE pokemon_form_names.pokemon_form_id = pokemon_forms.id AND local_language_id = 6) AS name_de, " +
                    "(SELECT pokemon_form_names.form_name FROM pokemon_form_names WHERE pokemon_form_names.pokemon_form_id = pokemon_forms.id AND local_language_id = 7) AS name_es, " +
                    "(SELECT pokemon_form_names.form_name FROM pokemon_form_names WHERE pokemon_form_names.pokemon_form_id = pokemon_forms.id AND local_language_id = 3) AS name_ko, " +
                    "form_identifier, " +
                    "(SELECT height FROM pokemon WHERE id = pokemon_id) AS height, " +
                    "(SELECT weight FROM pokemon WHERE id = pokemon_id) AS weight, " +
                    "(SELECT base_experience FROM pokemon WHERE id = pokemon_id) AS experience " +
                    "FROM pokemon_forms");

                while (rdForms.Read())
                {
                    int id = Convert.ToInt32(rdForms["id"]);
                    int NationalDex = Convert.ToInt32(rdForms["NationalDex"]);
                    byte FormValue = Convert.ToByte(rdForms["FormValue"]);
                    string form_identifier = rdForms["form_identifier"].ToString();
                    int height = Convert.ToInt32(rdForms["height"]);
                    int weight = Convert.ToInt32(rdForms["weight"]);
                    int experience = Convert.ToInt32(rdForms["experience"]);

                    if (formValueMap.ContainsKey(id)) FormValue = formValueMap[id];

                    Form f = new Form(null, id,
                        NationalDex, FormValue,
                        GetLocalizedString(rdForms, "name_"),
                        form_identifier,
                        height,
                        weight,
                        experience
                        );

                    db.PokedexInsertForm(f);
                    Console.WriteLine("Inserted {0} {1} {2} {3} {4} {5:0.0}m {6:0.0}kg {7}",
                        f.ID, f.SpeciesID, f.Value, f.Name.ToString(),
                        f.Suffix, f.Height * 0.1f, f.Weight * 0.1f, f.Experience);
                }
                rdForms.Close();

                // pkmncf_pokedex_pokemon_form_stats
                for (int generation = 1; generation <= GENERATIONS; generation++)
                {
                    string filename = String.Format("form_stats{0}.txt", generation);
                    ProcessTSV(filename, 15, row =>
                        {
                            int[] fieldsInt = row.Fields.Select(s => Convert.ToInt32(s)).ToArray();
                            FormStats f = new FormStats(null, fieldsInt[0], (Generations)generation, fieldsInt[1], fieldsInt[2],
                                new IntStatValues(fieldsInt[3],
                                    fieldsInt[4],
                                    fieldsInt[5],
                                    fieldsInt[6],
                                    fieldsInt[7],
                                    fieldsInt[8]),
                                new ByteStatValues((byte)fieldsInt[9],
                                    (byte)fieldsInt[10],
                                    (byte)fieldsInt[11],
                                    (byte)fieldsInt[12],
                                    (byte)fieldsInt[13],
                                    (byte)fieldsInt[14])
                                );

                            db.PokedexInsertFormStats(f);
                            Console.WriteLine("Inserted stats for {0} gen {1}", f.FormID, (int)f.MinGeneration);
                        });
                }

                // todo: pkmncf_pokedex_pokemon_evolutions

                // pkmncf_pokedex_types
                SQLiteDataReader rdTypes = (SQLiteDataReader)connVeekun.ExecuteReader("SELECT id, damage_class_id, " +
                    "(SELECT name FROM type_names WHERE type_names.type_id = types.id AND local_language_id = 1) AS name_ja, " +
                    "(SELECT name FROM type_names WHERE type_names.type_id = types.id AND local_language_id = 9) AS name_en, " +
                    "(SELECT name FROM type_names WHERE type_names.type_id = types.id AND local_language_id = 5) AS name_fr, " +
                    "(SELECT name FROM type_names WHERE type_names.type_id = types.id AND local_language_id = 8) AS name_it, " +
                    "(SELECT name FROM type_names WHERE type_names.type_id = types.id AND local_language_id = 6) AS name_de, " +
                    "(SELECT name FROM type_names WHERE type_names.type_id = types.id AND local_language_id = 7) AS name_es, " +
                    "(SELECT name FROM type_names WHERE type_names.type_id = types.id AND local_language_id = 3) AS name_ko " +
                    "FROM types ORDER BY id");
                // http://stackoverflow.com/questions/27156585/failed-to-enable-constraints-without-dataadapter

                while (rdTypes.Read())
                {
                    int id = Convert.ToInt32(rdTypes["id"]);

                    PkmnFoundations.Pokedex.Type t = new PkmnFoundations.Pokedex.Type(null,
                        id,
                        GetLocalizedString(rdTypes, "name_"),
                        GetDamageClass(rdTypes));

                    db.PokedexInsertType(t);
                    Console.WriteLine("Inserted type {0} {1} {2}", t.ID, t.Name.ToString(), t.DamageClass);
                }
                rdTypes.Close();

                // pkmncf_pokedex_moves
                SQLiteDataReader rdMoves = (SQLiteDataReader)connVeekun.ExecuteReader("SELECT id, type_id, " +
                    "(SELECT name FROM move_names WHERE move_names.move_id = moves.id AND local_language_id = 1) AS name_ja, " +
                    "(SELECT name FROM move_names WHERE move_names.move_id = moves.id AND local_language_id = 9) AS name_en, " +
                    "(SELECT name FROM move_names WHERE move_names.move_id = moves.id AND local_language_id = 5) AS name_fr, " +
                    "(SELECT name FROM move_names WHERE move_names.move_id = moves.id AND local_language_id = 8) AS name_it, " +
                    "(SELECT name FROM move_names WHERE move_names.move_id = moves.id AND local_language_id = 6) AS name_de, " +
                    "(SELECT name FROM move_names WHERE move_names.move_id = moves.id AND local_language_id = 7) AS name_es, " +
                    "(SELECT name FROM move_names WHERE move_names.move_id = moves.id AND local_language_id = 3) AS name_ko, " +
                    "damage_class_id, power, pp, accuracy, priority, target_id FROM moves");

                while (rdMoves.Read())
                {
                    int id = Convert.ToInt32(rdMoves["id"]);
                    int type_id = Convert.ToInt32(rdMoves["type_id"]);
                    int damage_class_id = Convert.ToInt32(rdMoves["damage_class_id"]);
                    short power = DatabaseExtender.Cast<short ?>(rdMoves["power"]) ?? 0;
                    short pp = DatabaseExtender.Cast<short?>(rdMoves["pp"]) ?? 0;
                    short accuracy = DatabaseExtender.Cast<short?>(rdMoves["accuracy"]) ?? 0;
                    short priority = Convert.ToInt16(rdMoves["priority"]);
                    int target_id = Convert.ToInt32(rdMoves["target_id"]);

                    Move m = new Move(null,
                        id,
                        type_id,
                        GetLocalizedString(rdMoves, "name_"),
                        (DamageClass)damage_class_id,
                        power,
                        pp,
                        accuracy,
                        priority,
                        (BattleTargets)target_id
                        );

                    db.PokedexInsertMove(m);
                    Console.WriteLine("Inserted move {0} {1}", m.ID, m.Name.ToString());
                }

                // pkmncf_pokedex_abilities
                SQLiteDataReader rdAbilities = (SQLiteDataReader)connVeekun.ExecuteReader("SELECT id, " +
                    "(SELECT name FROM ability_names WHERE ability_names.ability_id = abilities.id AND local_language_id = 1) AS name_ja, " +
                    "(SELECT name FROM ability_names WHERE ability_names.ability_id = abilities.id AND local_language_id = 9) AS name_en, " +
                    "(SELECT name FROM ability_names WHERE ability_names.ability_id = abilities.id AND local_language_id = 5) AS name_fr, " +
                    "(SELECT name FROM ability_names WHERE ability_names.ability_id = abilities.id AND local_language_id = 8) AS name_it, " +
                    "(SELECT name FROM ability_names WHERE ability_names.ability_id = abilities.id AND local_language_id = 6) AS name_de, " +
                    "(SELECT name FROM ability_names WHERE ability_names.ability_id = abilities.id AND local_language_id = 7) AS name_es, " +
                    "(SELECT name FROM ability_names WHERE ability_names.ability_id = abilities.id AND local_language_id = 3) AS name_ko " +
                    "FROM abilities WHERE is_main_series = 1");

                while (rdAbilities.Read())
                {
                    int id = Convert.ToInt32(rdAbilities["id"]);
                    Ability a = new Ability(null,
                        id, GetLocalizedString(rdAbilities, "name_")
                        );

                    db.PokedexInsertAbility(a);
                    Console.WriteLine("Inserted ability {0} {1}", a.Value, a.Name.ToString());
                }
                rdAbilities.Close();

                // pkmncf_pokedex_pokemon_form_abilities
                for (int generation = 3; generation <= GENERATIONS; generation++)
                {
                    string filename = String.Format("form_abilities{0}.txt", generation);
                    ProcessTSV(filename, 4, row =>
                    {
                        int[] fieldsInt = row.Fields.Select(s => Convert.ToInt32(s)).ToArray();
                        FormAbilities f = new FormAbilities(null, fieldsInt[0], (Generations)generation, 
                            fieldsInt[1], fieldsInt[2], fieldsInt[3]
                            );

                        db.PokedexInsertFormAbilities(f);
                        Console.WriteLine("Inserted abilities for {0} gen {1}", f.FormID, (int)f.MinGeneration);
                    });
                }


                // pkmncf_pokedex_items
                Dictionary<int, ItemLoading> items = new Dictionary<int, ItemLoading>();

                for (int generation = 3; generation <= GENERATIONS; generation++)
                {
                    string filename = String.Format("items{0}.txt", generation);
                    ProcessTSV(filename, 3, row =>
                    {
                        string[] fields = row.Fields;
                        int id, thisGenId;
                        string name = fields[1];
                        if (!Int32.TryParse(fields[0], out thisGenId) ||
                            !Int32.TryParse(fields[2], out id))
                        {
                            Console.WriteLine("{0} line {1} has bad format, skipped.", filename, row.LineNumber);
                            return;
                        }
                        ItemLoading theItem = null;
                        if (!items.ContainsKey(id))
                        {
                            theItem = new ItemLoading(id, name);
                            items.Add(id, theItem);
                        }
                        theItem = theItem ?? items[id];
                        theItem.Name = name; // prefer newer names where available
                        theItem.SetGenerationValue(thisGenId, generation);
                    });
                }

                // Pokeball IDs:
                ProcessTSV("items_balls.txt", 3, row =>
                {
                    string[] fields = row.Fields;
                    int id, ballId;
                    string name = fields[1];
                    if (!Int32.TryParse(fields[0], out ballId) ||
                        !Int32.TryParse(fields[2], out id))
                    {
                        Console.WriteLine("{0} line {1} has bad format, skipped.", "items_balls.txt", row.LineNumber);
                        return;
                    }
                    ItemLoading theItem = null;
                    if (!items.ContainsKey(id))
                    {
                        theItem = new ItemLoading(id, name);
                        items.Add(id, theItem);
                    }
                    theItem = theItem ?? items[id];
                    if (theItem.Name == null) theItem.Name = name;
                    theItem.PokeballValue = ballId;
                });

                // lookup Veekun ID number against some generation or another.
                Dictionary<int, ItemLoading> items3 = items
                    .Where(i => i.Value.Value3 != null && i.Value.NameLocalized == null)
                    .ToDictionary(i => (int)i.Value.Value3, i => i.Value);
                Dictionary<int, ItemLoading> items4 = items
                    .Where(i => i.Value.Value4 != null && i.Value.NameLocalized == null)
                    .ToDictionary(i => (int)i.Value.Value4, i => i.Value);
                Dictionary<int, ItemLoading> items5 = items
                    .Where(i => i.Value.Value5 != null && i.Value.NameLocalized == null)
                    .ToDictionary(i => (int)i.Value.Value5, i => i.Value);
                Dictionary<int, ItemLoading> items6 = items
                    .Where(i => i.Value.Value6 != null && i.Value.NameLocalized == null)
                    .ToDictionary(i => (int)i.Value.Value6, i => i.Value);

                // veekun has incorrect Gen3 indices for Helix/Dome fossil.
                // (Or they disagree with Bulbapedia which is my primary source)
                SQLiteDataReader rdItems = (SQLiteDataReader)connVeekun.ExecuteReader("SELECT id, cost, " +
                    "(SELECT game_index FROM item_game_indices WHERE item_id = items.id AND generation_id = 3 AND NOT item_id IN (101, 102)) AS value3, " +
                    "(SELECT game_index FROM item_game_indices WHERE item_id = items.id AND generation_id = 4) AS value4, " +
                    "(SELECT game_index FROM item_game_indices WHERE item_id = items.id AND generation_id = 5) AS value5, " +
                    "(SELECT game_index FROM item_game_indices WHERE item_id = items.id AND generation_id = 6) AS value6, " +
                    "(SELECT name FROM item_names WHERE item_names.item_id = items.id AND local_language_id = 1) AS name_ja, " +
                    "(SELECT name FROM item_names WHERE item_names.item_id = items.id AND local_language_id = 9) AS name_en, " +
                    "(SELECT name FROM item_names WHERE item_names.item_id = items.id AND local_language_id = 5) AS name_fr, " +
                    "(SELECT name FROM item_names WHERE item_names.item_id = items.id AND local_language_id = 8) AS name_it, " +
                    "(SELECT name FROM item_names WHERE item_names.item_id = items.id AND local_language_id = 6) AS name_de, " +
                    "(SELECT name FROM item_names WHERE item_names.item_id = items.id AND local_language_id = 7) AS name_es, " +
                    "(SELECT name FROM item_names WHERE item_names.item_id = items.id AND local_language_id = 3) AS name_ko " +
                    "FROM items");

                Dictionary<int, ItemLoading>[] itemsGeneration = new Dictionary<int, ItemLoading>[] { null, null, items3, items4, items5, items6 };

                while (rdItems.Read())
                {
                    List<ItemLoading> toProcess = new List<ItemLoading>(4);

                    for (int generation = 3; generation <= GENERATIONS; generation++)
                    {
                        string col = String.Format("value{0}", generation);
                        if (!(rdItems[col] is DBNull))
                        {
                            Dictionary<int, ItemLoading> dict = itemsGeneration[generation - 1];
                            int value = Convert.ToInt32(rdItems[col]);
                            if (dict.ContainsKey(value))
                            {
                                ItemLoading il = dict[value];
                                il.NameLocalized = GetLocalizedString(rdItems, "name_");
                                il.Price = Convert.ToInt32(rdItems["cost"]);
                            }
                        }
                    }
                }
                rdItems.Close();

                foreach (ItemLoading il in items.Values)
                {
                    LocalizedString name = il.NameLocalized;
                    if (name == null)
                    {
                        name = new LocalizedString() { { "EN", il.Name } };
                        Console.WriteLine("Veekun database missing item {0} {1}. Non-English translations will be missing.", il.ID, name);
                    }
                    Item i = new Item(null, il.ID, il.Value3, il.Value4, il.Value5, il.Value6, il.PokeballValue, il.Price, name);
                    db.PokedexInsertItem(i);
                    Console.WriteLine("Inserted item {0} {1}", i.ID, i.Name.ToString());
                }

                // pkmncf_pokedex_ribbons
                Dictionary<int, RibbonLoading> ribbons = new Dictionary<int, RibbonLoading>();
                if (!ProcessTSV("ribbons.txt", 3, row =>
                    {
                        string[] fields = row.Fields;
                        int id = Convert.ToInt32(fields[0]);
                        ribbons.Add(id, new RibbonLoading(id, fields[1], fields[2]));
                    }))
                    Console.WriteLine("ribbons.txt not found. Not inserting any ribbons.");
                else
                {
                    for (int generation = 3; generation <= GENERATIONS; generation++)
                    {
                        string filename = String.Format("ribbon_positions{0}.txt", generation);
                        ProcessTSV(filename, 2, row =>
                            {
                                string[] fields = row.Fields;
                                int id = Convert.ToInt32(fields[0]);
                                int position = Convert.ToInt32(fields[1]);
                                if (!ribbons.ContainsKey(id))
                                {
                                    Console.WriteLine("Error: Ribbon ID {0} contained in {1} but not in ribbons.txt!", id, filename);
                                    return;
                                }
                                RibbonLoading r = ribbons[id];
                                r.SetGenerationPosition(position, generation);
                            });
                    }

                    foreach (KeyValuePair<int, RibbonLoading> pair in ribbons)
                    {
                        RibbonLoading r = pair.Value;
                        db.PokedexInsertRibbon(new Ribbon(null, r.ID,
                            new LocalizedString() { { "EN", r.Name } },
                            new LocalizedString() { { "EN", r.Description } },
                            r.Position3, r.Position4, r.Position5, r.Position6,
                            null, null, null, null
                            ));
                        Console.WriteLine("Inserted ribbon {0} {1}", r.ID, r.Name);
                    }
                }

                // pkmncf_pokedex_regions
                ProcessTSV("regions.txt", 2, row =>
                {
                    string[] fields = row.Fields;
                    int id = Convert.ToInt32(fields[0]);
                    Region r = new Region(null, id, new LocalizedString() { { "EN", fields[1] } });
                    db.PokedexInsertRegion(r);
                    Console.WriteLine("Inserted region {0} {1}", r.ID, r.Name);
                });

                // pkmncf_pokedex_locations
                SQLiteDataReader rdLocations = (SQLiteDataReader)connVeekun.ExecuteReader("SELECT id, region_id, " +
                    "(SELECT game_index FROM location_game_indices WHERE location_id = locations.id AND generation_id = 3) AS value3, " +
                    "(SELECT game_index FROM location_game_indices WHERE location_id = locations.id AND generation_id = 4) AS value4, " +
                    "(SELECT game_index FROM location_game_indices WHERE location_id = locations.id AND generation_id = 5) AS value5, " +
                    "(SELECT game_index FROM location_game_indices WHERE location_id = locations.id AND generation_id = 6) AS value6, " +
                    "(SELECT name FROM location_names WHERE location_names.location_id = locations.id AND local_language_id = 1) AS name_ja, " +
                    "(SELECT name FROM location_names WHERE location_names.location_id = locations.id AND local_language_id = 9) AS name_en, " +
                    "(SELECT name FROM location_names WHERE location_names.location_id = locations.id AND local_language_id = 5) AS name_fr, " +
                    "(SELECT name FROM location_names WHERE location_names.location_id = locations.id AND local_language_id = 8) AS name_it, " +
                    "(SELECT name FROM location_names WHERE location_names.location_id = locations.id AND local_language_id = 6) AS name_de, " +
                    "(SELECT name FROM location_names WHERE location_names.location_id = locations.id AND local_language_id = 7) AS name_es, " +
                    "(SELECT name FROM location_names WHERE location_names.location_id = locations.id AND local_language_id = 3) AS name_ko " +
                    "FROM locations WHERE id NOT IN (522, 523, 524)");
                // 522, 523, and 524 are duplicates of Kanto routes 19, 20, and 21.

                // todo: gba/colo/xd encounter location values
                
                while (rdLocations.Read())
                {
                    Location l = new Location(null, 
                        Convert.ToInt32(rdLocations["id"]),
                        VeekunLocationToRegion(rdLocations),
                        (int ?)DatabaseExtender.Cast<long?>(rdLocations["value3"]),
                        null,
                        null,
                        (int?)DatabaseExtender.Cast<long?>(rdLocations["value4"]),
                        (int?)DatabaseExtender.Cast<long?>(rdLocations["value5"]),
                        (int?)DatabaseExtender.Cast<long?>(rdLocations["value6"]),
                        GetLocalizedString(rdLocations, "name_")
                        );

                    db.PokedexInsertLocation(l);
                    Console.WriteLine("Inserted location {0} {1}", l.ID, l.Name);
                }
                rdLocations.Close();

                connVeekun.Close();
            }

#if DEBUG
            Console.ReadKey();
#endif
        }

        private static string[] LANGS = { "JA", "EN", "FR", "IT", "DE", "ES", "KO" };
        private static LocalizedString GetLocalizedString(IDataReader reader, string column)
        {
            LocalizedString result = new LocalizedString();
            foreach (string lang in LANGS)
            {
                string col = column + lang.ToLowerInvariant();
                if (reader[col] is DBNull) continue;
                result.Add(lang, (string)reader[col]);
            }
            return result;
        }

        private static DamageClass GetDamageClass(IDataReader reader)
        {
            if (reader["damage_class_id"] is DBNull) return DamageClass.None;
            return (DamageClass)(Convert.ToInt32(reader["damage_class_id"]) - 1);
        }

        private static bool ProcessTSV(string filename, int requiredFields, Action<TsvRow> action)
        {
            if (!File.Exists(filename))
            {
                Console.WriteLine("File {0} not found, skipped.", filename);
                return false;
            }
            using (FileStream fs = File.Open(filename, FileMode.Open))
            {
                StreamReader sr = new StreamReader(fs, Encoding.UTF8);
                string line;
                int lineNumber = 0;
                int validLineNumber = 0;
                while ((line = sr.ReadLine()) != null)
                {
                    string[] fields = line.Split('\t');
                    if (fields.Length < requiredFields)
                    {
                        Console.WriteLine("File {0} line {1} has too few fields, skipped.", filename, lineNumber);
                        lineNumber++;
                        continue;
                    }
                    action(new TsvRow(lineNumber, validLineNumber, fields));
                    lineNumber++;
                    validLineNumber++;
                }
                fs.Close();
            }
            return true;
        }

        private static int VeekunLocationToRegion(SQLiteDataReader reader)
        {
            int id = Convert.ToInt32(reader["id"]);
            long? region = DatabaseExtender.Cast<long?>(reader["region_id"]);

            if (region == null) // not set, usually event
            {
                if (id == 256) return 2; // kanto
                if (id == 257) return 3; // johto
                if (id == 258) return 4; // hoenn
                if (id == 259) return 7; // sinnoh
                if (id == 260) return 5; // "distant land" (only used for orre?)
                if (id == 261) return 7; // traveling man (happini?)
                if (id == 262) return 7; // riley
                if (id == 263) return 7; // cynthia
                if (id == 342) return 3; // mr. pokemon
                if (id == 343) return 3; // primo
                return 1;
            }
            if (region == 1) // kanto and seviis
            {
                if (id >= 491 && id <= 497) return 6; // seven island unown chambers
                if (id >= 500 && id <= 521) return 6; // sevii islands
                if (id >= 526 && id <= 529) return 6; // sevii islands
                return 2;
            }
            if (region == 2) return 3; // johto
            if (region == 3) return 4; // hoenn
            if (region == 4) return 7; // sinnoh
            if (region == 5) return 8; // unova
            if (region == 6) return 9; // kalos

            return (int)region + 3; // for now, assume veekun won't skip more regions.
        }

    }

    internal class ItemLoading
    {
        public ItemLoading(int id, string name)
        {
            ID = id;
            Name = name;
            Value3 = Value4 = Value5 = Value6 = null;
            NameLocalized = null;
            PokeballValue = null;
        }

        public int ID;
        public string Name;
        public LocalizedString NameLocalized;
        public int? Value3, Value4, Value5, Value6;
        public int Price;
        public int? PokeballValue;

        public void SetGenerationValue(int ? value, int generation)
        {
            switch (generation)
            {
                case 3:
                    Value3 = value;
                    break;
                case 4:
                    Value4 = value;
                    break;
                case 5:
                    Value5 = value;
                    break;
                case 6:
                    Value6 = value;
                    break;
            }
        }
    }

    internal class RibbonLoading
    {
        public RibbonLoading(int id, string name, string description)
        {
            ID = id;
            Name = name;
            Description = description;
            Position3 = Position4 = Position5 = Position6 = null;
        }

        public int ID;
        public string Name;
        public string Description;
        public int? Position3, Position4, Position5, Position6;

        public void SetGenerationPosition(int? position, int generation)
        {
            switch (generation)
            {
                case 3:
                    Position3 = position;
                    break;
                case 4:
                    Position4 = position;
                    break;
                case 5:
                    Position5 = position;
                    break;
                case 6:
                    Position6 = position;
                    break;
            }
        }
    }

    internal class TsvRow
    {
        public TsvRow(int lineNumber, int validLineNumber, string[] fields)
        {
            LineNumber = lineNumber;
            ValidLineNumber = validLineNumber;
            Fields = fields;
        }

        public int LineNumber;
        public int ValidLineNumber;
        public string[] Fields;
    }
}


================================================
FILE: VeekunImport/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("VeekunImport")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("VeekunImport")]
[assembly: AssemblyCopyright("Copyright ©  2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("1644dc02-2772-48f6-b123-e611638dbab0")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


================================================
FILE: VeekunImport/VeekunImport.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{2A761C4F-00C2-45D5-B4CA-C41558CEB2DF}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>VeekunImport</RootNamespace>
    <AssemblyName>VeekunImport</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <TargetFrameworkProfile />
    <NuGetPackageImportStamp>
    </NuGetPackageImportStamp>
    <PublishUrl>publish\</PublishUrl>
    <Install>true</Install>
    <InstallFrom>Disk</InstallFrom>
    <UpdateEnabled>false</UpdateEnabled>
    <UpdateMode>Foreground</UpdateMode>
    <UpdateInterval>7</UpdateInterval>
    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
    <UpdatePeriodically>false</UpdatePeriodically>
    <UpdateRequired>false</UpdateRequired>
    <MapFileExtensions>true</MapFileExtensions>
    <ApplicationRevision>0</ApplicationRevision>
    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
    <IsWebBootstrapper>false</IsWebBootstrapper>
    <UseApplicationTrust>false</UseApplicationTrust>
    <BootstrapperEnabled>true</BootstrapperEnabled>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
    <Reference Include="System.configuration" />
    <Reference Include="System.Core" />
    <Reference Include="System.Data.SQLite, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
      <HintPath>..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\lib\net40\System.Data.SQLite.dll</HintPath>
    </Reference>
    <Reference Include="System.Data.SQLite.Linq, Version=1.0.115.5, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Data.SQLite.Linq.1.0.115.5\lib\net40\System.Data.SQLite.Linq.dll</HintPath>
    </Reference>
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="countries4.txt" />
    <Content Include="countries5.txt" />
    <Content Include="families_map.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_abilities3.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_abilities4.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_abilities5.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_abilities6.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_stats1.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_stats6.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_stats5.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_stats4.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_stats3.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_stats2.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="form_values.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="items3.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="items5.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="items4.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="families.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="items_balls.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="regions.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="ribbons.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="ribbon_positions3.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="ribbon_positions5.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="ribbon_positions4.txt">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\library\Library.csproj">
      <Project>{408efc7e-c6b0-4160-8628-2679e34385ce}</Project>
      <Name>Library</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <None Include="app.config" />
    <None Include="packages.config" />
  </ItemGroup>
  <ItemGroup>
    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
      <Visible>False</Visible>
      <ProductName>.NET Framework 3.5 SP1</ProductName>
      <Install>false</Install>
    </BootstrapperPackage>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\build\net40\Stub.System.Data.SQLite.Core.NetFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\build\net40\Stub.System.Data.SQLite.Core.NetFramework.targets'))" />
  </Target>
  <Import Project="..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\build\net40\Stub.System.Data.SQLite.Core.NetFramework.targets" Condition="Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.115.5\build\net40\Stub.System.Data.SQLite.Core.NetFramework.targets')" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

================================================
FILE: VeekunImport/app.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="pkmnFoundationsConnectionString"
         connectionString="Server=localhost;Database=gts;User ID=gts;Password=gts;Pooling=true;charset=utf8;Allow User Variables=True"
         providerName="MySql.Data.MySqlClient" />
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" 
           description=".NET Framework Data Provider for SQLite" 
           type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
</configuration>

================================================
FILE: VeekunImport/countries4.txt
================================================
1	AF	Afghanistan
2	AL	Albania
3	DZ	Algeria
6	AO	Angola
8	AG	Antigua and Barbuda
9	AR	Argentina
12	AU	Australia
13	AT	Austria
15	BS	Bahamas
16	BH	Bahrain
17	BD	Bangladesh
18	BB	Barbados
20	BE	Belgium
21	BZ	Belize
22	BJ	Benin
23	BM	Bermuda
25	BO	Bolivia
27	BW	Botswana
28	BR	Brazil
29	VG	British Virgin Islands
31	BG	Bulgaria
33	BI	Burundi
34	KH	Cambodia
35	CM	Cameroon
36	CA	Canada
40	TD	Chad
42	CL	Chile
43	CN	China
45	CO	Colombia
48	CG	Congo
49	CK	Cook Islands
50	CR	Costa Rica
52	HR	Croatia
54	CY	Cyprus
55	CZ	Czech Republic
56	DK	Denmark
58	DM	Dominica
59	DO	Dominican Republic
60	EC	Ecuador
61	EG	Egypt
62	SV	El Salvador
69	FJ	Fiji
70	FI	Finland
71	FR	France
72	GF	French Guiana
74	GA	Gabon
77	DE	Germany
78	GH	Ghana
79	GI	Gibraltar
80	GR	Greece
81	GL	Greenland
82	GD	Grenada
83	GP	Guadeloupe
85	GT	Guatemala
86	GN	Guinea
88	GY	Guyana
89	HT	Haiti
90	HN	Honduras
91	HK	Hong Kong
92	HU	Hungary
93	IS	Iceland
94	IN	India
95	ID	Indonesia
97	IQ	Iraq
98	IE	Ireland
100	IL	Israel
101	IT	Italy
102	JM	Jamaica
103	JP	Japan
104	JO	Jordan
107	KE	Kenya
110	KR	Republic of Korea
111	KW	Kuwait
115	LB	Lebanon
117	LR	Liberia
118	LY	Libyan Arab Jamhiriya
121	LU	Luxembourg
122	MO	Macau
126	MY	Malaysia
129	MT	Malta
131	MQ	Martinique
133	MU	Mauritius
135	MX	Mexico
140	MA	Morocco
142	MM	Myanmar
146	NL	Netherlands
148	NC	New Caledonia
149	NZ	New Zealand
150	NI	Nicaragua
151	NE	Niger
152	NG	Nigeria
156	NO	Norway
157	OM	Oman
158	PK	Pakistan
160	PA	Panama
161	PG	Papua New Guinea
163	PE	Peru
164	PH	Philippines
166	PL	Poland
167	PT	Portugal
171	RO	Romania
172	RU	Russian Federation
179	WS	Samoa
183	SN	Senegal
186	SL	Sierra Leone
187	SG	Singapore
188	SK	Slovakia
189	SI	Slovenia
192	ZA	South Africa
193	ES	Spain
194	LK	Sri Lanka
196	SR	Suriname
198	SZ	Swaziland
199	SE	Sweden
200	CH	Swiss Confederation
202	TW	Taiwan
204	TZ	United Republic of Tanzania
205	TH	Thailand
207	TG	Togo
211	TN	Tunisia
212	TR	Turkey
216	UG	Uganda
218	AE	United Arab Emirates
219	GB	United Kingdom
220	US	United States of America
221	VI	United States Virgin Islands
222	UY	Uruguay
224	VU	Vanuatu
226	VE	Venezuela
227	VN	Vietnam


================================================
FILE: VeekunImport/countries5.txt
================================================
1	AF	Afghanistan
2	AL	Albania
3	DZ	Algeria
6	AO	Angola
8	AG	Antigua and Barbuda
9	AR	Argentina
12	AU	Australia
13	AT	Austria
15	BS	Bahamas
16	BH	Bahrain
17	BD	Bangladesh
18	BB	Barbados
20	BE	Belgium
21	BZ	Belize
22	BJ	Benin
23	BM	Bermuda
25	BO	Bolivia
27	BW	Botswana
28	BR	Brazil
29	VG	British Virgin Islands
31	BG	Bulgaria
33	BI	Burundi
34	KH	Cambodia
35	CM	Cameroon
36	CA	Canada
40	TD	Chad
42	CL	Chile
43	CN	China
45	CO	Colombia
47	CG	Congo
48	CK	Cook Islands
49	CR	Costa Rica
51	HR	Croatia
53	CY	Cyprus
54	CZ	Czech Republic
58	DK	Denmark
60	DM	Dominica
61	DO	Dominican Republic
62	EC	Ecuador
63	EG	Egypt
64	SV	El Salvador
71	FJ	Fiji
72	FI	Finland
73	FR	France
74	GF	French Guiana
76	GA	Gabon
79	DE	Germany
80	GH	Ghana
81	GI	Gibraltar
82	GR	Greece
83	GL	Greenland
84	GD	Grenada
85	GP	Guadeloupe
87	GT	Guatemala
88	GN	Guinea
90	GY	Guyana
91	HT	Haiti
92	HN	Honduras
93	HU	Hungary
94	IS	Iceland
95	IN	India
96	ID	Indonesia
98	IQ	Iraq
99	IE	Ireland
101	IL	Israel
102	IT	Italy
103	JM	Jamaica
105	JP	Japan
106	JO	Jordan
109	KE	Kenya
111	KW	Kuwait
115	LB	Lebanon
117	LR	Liberia
118	LY	Libya
121	LU	Luxembourg
125	MY	Malaysia
128	MT	Malta
130	MQ	Martinique
132	MU	Mauritius
134	MX	Mexico
138	ME	Montenegro
139	MA	Morocco
141	MM	Myanmar
145	NL	Netherlands
147	NC	New Caledonia
148	NZ	New Zealand
149	NI	Nicaragua
150	NE	Niger
151	NG	Nigeria
155	NO	Norway
156	OM	Oman
157	PK	Pakistan
160	PA	Panama
161	PG	Papua New Guinea
163	PE	Peru
164	PH	Philippines
166	PL	Poland
167	PT	Portugal
170	KR	South Korea
173	RO	Romania
174	RU	Russian Federation
181	WS	Samoa
185	SN	Senegal
186	RS	Serbia
188	SL	Sierra Leone
189	SG	Singapore
190	SK	Slovakia
191	SI	Slovenia
194	ZA	South Africa
195	ES	Spain
196	LK	Sri Lanka
198	SR	Suriname
199	SZ	Swaziland
200	SE	Sweden
201	CH	Switzerland
203	TW	Taiwan
205	TH	Thailand
206	TG	Togo
210	TN	Tunisia
211	TR	Turkey
215	UG	Uganda
217	AE	United Arab Emirates
218	GB	United Kingdom
219	TZ	Tanzania
220	US	United States of America
221	VI	United States Virgin Islands
222	UY	Uruguay
224	VU	Vanatu
226	VE	Venezuela
227	VN	Vietnam


================================================
FILE: VeekunImport/families.txt
================================================
010	172	172	000	000	0000	4
012	029	032	000	000	0000	4
013	173	173	000	000	0000	6
015	174	174	000	000	0000	6
046	236	236	000	000	0000	0
050	113	113	440	440	4319	8
056	122	122	439	439	4314	4
058	238	238	000	000	0000	8
059	239	239	000	000	0000	2
060	240	240	000	000	0000	2
071	143	143	446	446	4316	4
089	183	183	298	298	3220	4
090	185	185	438	438	4315	1
099	202	202	360	360	3221	4
115	226	226	458	458	4317	4
155	313	314	000	000	0000	4
156	315	315	406	406	4318	4
182	358	358	433	433	4320	4

================================================
FILE: VeekunImport/families_map.txt
================================================
001	002	003
004	005	006
007	008	009
010	011	012
013	014	015
016	017	018
019	020
021	022
023	024
025	026	172
027	028
029	030	031	032	033	034
035	036	173
037	038
039	040	174
041	042	169
043	044	045	182
046	047
048	049
050	051
052	053
054	055
056	057
058	059
060	061	062	186
063	064	065
066	067	068
069	070	071
072	073
074	075	076
077	078
079	080	199
081	082	462
083
084	085
086	087
088	089
090	091
092	093	094
095	208
096	097
098	099
100	101
102	103
104	105
106	107	236	237
108	463
109	110
111	112	464
113	242	440
114	465
115
116	117	230
118	119
120	121
122	439
123	212
124	238
125	239	466
126	240	467
127
128
129	130
131
132
133	134	135	136	196	197	470	471	700
137	233	474
138	139
140	141
142
143	446
144
145
146
147	148	149
150
151
152	153	154
155	156	157
158	159	160
161	162
163	164
165	166
167	168
170	171
175	176	468
177	178
179	180	181
183	184	298
185	438
187	188	189
190	424
191	192
193	469
194	195
198	430
200	429
201
202	360
203
204	205
206
207	472
209	210
211
213
214
215	461
216	217
218	219
220	221	473
222
223	224
225
226	458
227
228	229
231	232
234
235
241
243
244
245
246	247	248
249
250
251
252	253	254
255	256	257
258	259	260
261	262
263	264
265	266	267	268	269
270	271	272
273	274	275
276	277
278	279
280	281	282	475
283	284
285	286
287	288	289
290	291	292
293	294	295
296	297
299	476
300	301
302
303
304	305	306
307	308
309	310
311
312
313	314
315	406	407
316	317
318	319
320	321
322	323
324
325	326
327
328	329	330
331	332
333	334
335
336
337
338
339	340
341	342
343	344
345	346
347	348
349	350
351
352
353	354
355	356	477
357
358	433
359
361	362	478
363	364	365
366	367	368
369
370
371	372	373
374	375	376
377
378
379
380
381
382
383
384
385
386
387	388	389
390	391	392
393	394	395
396	397	398
399	400
401	402
403	404	405
408	409
410	411
412	413	414
415	416
417
418	419
420	421
422	423
425	426
427	428
431	432
434	435
436	437
441
442
443	444	445
447	448
449	450
451	452
453	454
455
456	457
459	460
479
480
481
482
483
484
485
486
487
488
489	490
491
492
493
494
495	496	497
498	499	500
501	502	503
504	505
506	507	508
509	510
511	512
513	514
515	516
517	518
519	520	521
522	523
524	525	526
527	528
529	530
531
532	533	534
535	536	537
538
539
540	541	542
543	544	545
546	547
548	549
550
551	552	553
554	555
556
557	558
559	560
561
562	563
564	565
566	567
568	569
570	571
572	573
574	575	576
577	578	579
580	581
582	583	584
585	586
587
588	589
590	591
592	593
594
595	596
597	598
599	600	601
602	603	604
605	606
607	608	609
610	611	612
613	614
615
616	617
618
619
620
621
622	623
624	625
626
627	628
629	630
631
632
633	634	635
636	637
638
639
640
641
642
643
644
645
646
647
648
649
650	651	652
653	654	655
656	657	658
659	660
661	662	663
664	665	666
667	668
669	670	671
672	673
674	675
676
677	678
679	680	681
682	683
684	685
686	687
688	689
690	691
692	693
694	695
696	697
698	699
701
702
703
704	705	706
707
708	709
710	711
712	713
714	715
716
717
718
719
720
721

================================================
FILE: VeekunImport/form_abilities3.txt
================================================
00001	065	000	000
00002	065	000	000
00003	065	000	000
00004	066	000	000
00005	066	000	000
00006	066	000	000
00007	067	000	000
00008	067	000	000
00009	067	000	000
00010	019	000	000
00011	061	000	000
00012	014	000	000
00013	019	000	000
00014	061	000	000
00015	068	000	000
00016	051	000	000
00017	051	000	000
00018	051	000	000
00019	050	062	000
00020	050	062	000
00021	051	000	000
00022	051	000	000
00023	022	061	000
00024	022	061	000
00025	009	000	000
00026	009	000	000
00027	008	000	000
00028	008	000	000
00029	038	000	000
00030	038	000	000
00031	038	000	000
00032	038	000	000
00033	038	000	000
00034	038	000	000
00035	056	000	000
00036	056	000	000
00037	018	000	000
00038	018	000	000
00039	056	000	000
00040	056	000	000
00041	039	000	000
00042	039	000	000
00043	034	000	000
00044	034	000	000
00045	034	000	000
00046	027	000	000
00047	027	000	000
00048	014	000	000
00049	019	000	000
00050	008	071	000
00051	008	071	000
00052	053	000	000
00053	007	000	000
00054	006	013	000
00055	006	013	000
00056	072	000	000
00057	072	000	000
00058	022	018	000
00059	022	018	000
00060	011	006	000
00061	011	006	000
00062	011	006	000
00063	028	039	000
00064	028	039	000
00065	028	039	000
00066	062	000	000
00067	062	000	000
00068	062	000	000
00069	034	000	000
00070	034	000	000
00071	034	000	000
00072	029	064	000
00073	029	064	000
00074	069	005	000
00075	069	005	000
00076	069	005	000
00077	050	018	000
00078	050	018	000
00079	012	020	000
00080	012	020	000
00081	042	005	000
00082	042	005	000
00083	051	039	000
00084	050	048	000
00085	050	048	000
00086	047	000	000
00087	047	000	000
00088	001	060	000
00089	001	060	000
00090	075	000	000
00091	075	000	000
00092	026	000	000
00093	026	000	000
00094	026	000	000
00095	069	005	000
00096	015	000	000
00097	015	000	000
00098	052	075	000
00099	052	075	000
00100	043	009	000
00101	043	009	000
00102	034	000	000
00103	034	000	000
00104	069	031	000
00105	069	031	000
00106	007	000	000
00107	051	000	000
00108	020	012	000
00109	026	000	000
00110	026	000	000
00111	031	069	000
00112	031	069	000
00113	030	032	000
00114	034	000	000
00115	048	000	000
00116	033	000	000
00117	038	000	000
00118	033	041	000
00119	033	041	000
00120	035	030	000
00121	035	030	000
00122	043	000	000
00123	068	000	000
00124	012	000	000
00125	009	000	000
00126	049	000	000
00127	052	000	000
00128	022	000	000
00129	033	000	000
00130	022	000	000
00131	011	075	000
00132	007	000	000
00133	050	000	000
00134	011	000	000
00135	010	000	000
00136	018	000	000
00137	036	000	000
00138	033	075	000
00139	033	075	000
00140	033	004	000
00141	033	004	000
00142	069	046	000
00143	017	047	000
00144	046	000	000
00145	046	000	000
00146	046	000	000
00147	061	000	000
00148	061	000	000
00149	039	000	000
00150	046	000	000
00151	028	000	000
00152	065	000	000
00153	065	000	000
00154	065	000	000
00155	066	000	000
00156	066	000	000
00157	066	000	000
00158	067	000	000
00159	067	000	000
00160	067	000	000
00161	050	051	000
00162	050	051	000
00163	015	051	000
00164	015	051	000
00165	068	048	000
00166	068	048	000
00167	068	015	000
00168	068	015	000
00169	039	000	000
00170	010	035	000
00171	010	035	000
00172	009	000	000
00173	056	000	000
00174	056	000	000
00175	055	032	000
00176	055	032	000
00177	028	048	000
00178	028	048	000
00179	009	000	000
00180	009	000	000
00181	009	000	000
00182	034	000	000
00183	047	037	000
00184	047	037	000
00185	005	069	000
00186	011	006	000
00187	034	102	000
00188	034	102	000
00189	034	102	000
00190	050	053	000
00191	034	000	000
00192	034	000	000
00193	003	014	000
00194	006	011	000
00195	006	011	000
00196	028	000	000
00197	028	000	000
00198	015	000	000
00199	012	020	000
00200	026	000	000
00201	026	000	000
00202	023	000	000
00203	039	048	000
00204	005	000	000
00205	005	000	000
00206	032	050	000
00207	052	008	000
00208	069	005	000
00209	022	050	000
00210	022	000	000
00211	038	033	000
00212	068	000	000
00213	005	000	000
00214	068	062	000
00215	039	051	000
00216	053	000	000
00217	062	000	000
00218	040	049	000
00219	040	049	000
00220	012	000	000
00221	012	000	000
00222	055	030	000
00223	055	000	000
00224	021	000	000
00225	072	055	000
00226	033	011	000
00227	051	005	000
00228	048	018	000
00229	048	018	000
00230	033	000	000
00231	053	000	000
00232	005	000	000
00233	036	000	000
00234	022	000	000
00235	020	000	000
00236	062	000	000
00237	022	000	000
00238	012	000	000
00239	009	000	000
00240	049	000	000
00241	047	000	000
00242	030	032	000
00243	046	000	000
00244	046	000	000
00245	046	000	000
00246	062	000	000
00247	061	000	000
00248	045	000	000
00249	046	000	000
00250	046	000	000
00251	030	000	000
00252	065	000	000
00253	065	000	000
00254	065	000	000
00255	066	000	000
00256	066	000	000
00257	066	000	000
00258	067	000	000
00259	067	000	000
00260	067	000	000
00261	050	000	000
00262	022	000	000
00263	053	000	000
00264	053	000	000
00265	019	000	000
00266	061	000	000
00267	068	000	000
00268	061	000	000
00269	019	000	000
00270	033	044	000
00271	033	044	000
00272	033	044	000
00273	034	048	000
00274	034	048	000
00275	034	048	000
00276	062	000	000
00277	062	000	000
00278	051	000	000
00279	051	000	000
00280	028	036	000
00281	028	036	000
00282	028	036	000
00283	033	000	000
00284	022	000	000
00285	027	000	000
00286	027	000	000
00287	054	000	000
00288	072	000	000
00289	054	000	000
00290	014	000	000
00291	003	000	000
00292	025	000	000
00293	043	000	000
00294	043	000	000
00295	043	000	000
00296	047	062	000
00297	047	062	000
00298	047	037	000
00299	005	042	000
00300	056	000	000
00301	056	000	000
00302	051	000	000
00303	052	022	000
00304	005	069	000
00305	005	069	000
00306	005	069	000
00307	074	000	000
00308	074	000	000
00309	009	031	000
00310	009	031	000
00311	057	000	000
00312	058	000	000
00313	035	068	000
00314	012	000	000
00315	030	038	000
00316	064	060	000
00317	064	060	000
00318	024	000	000
00319	024	000	000
00320	041	012	000
00321	041	012	000
00322	012	000	000
00323	040	000	000
00324	073	000	000
00325	047	020	000
00326	047	020	000
00327	020	000	000
00328	052	071	000
00329	026	000	000
00330	026	000	000
00331	008	000	000
00332	008	000	000
00333	030	000	000
00334	030	000	000
00335	017	000	000
00336	061	000	000
00337	026	000	000
00338	026	000	000
00339	012	000	000
00340	012	000	000
00341	052	075	000
00342	052	075	000
00343	026	000	000
00344	026	000	000
00345	021	000	000
00346	021	000	000
00347	004	000	000
00348	004	000	000
00349	033	000	000
00350	063	000	000
00351	059	000	000
00352	016	000	000
00353	015	000	000
00354	015	000	000
00355	026	000	000
00356	046	000	000
00357	034	000	000
00358	026	000	000
00359	046	000	000
00360	023	000	000
00361	039	000	000
00362	039	000	000
00363	047	000	000
00364	047	000	000
00365	047	000	000
00366	075	000	000
00367	033	000	000
00368	033	000	000
00369	033	069	000
00370	033	000	000
00371	069	000	000
00372	069	000	000
00373	022	000	000
00374	029	000	000
00375	029	000	000
00376	029	000	000
00377	029	000	000
00378	029	000	000
00379	029	000	000
00380	026	000	000
00381	026	000	000
00382	002	000	000
00383	070	000	000
00384	076	000	000
00385	032	000	000
00386	046	000	000
10001	026	000	000
10002	026	000	000
10003	026	000	000
10004	026	000	000
10005	026	000	000
10006	026	000	000
10007	026	000	000
10008	026	000	000
10009	026	000	000
10010	026	000	000
10011	026	000	000
10012	026	000	000
10013	026	000	000
10014	026	000	000
10015	026	000	000
10016	026	000	000
10017	026	000	000
10018	026	000	000
10019	026	000	000
10020	026	000	000
10021	026	000	000
10022	026	000	000
10023	026	000	000
10024	026	000	000
10025	026	000	000
10026	026	000	000
10027	026	000	000
10028	059	000	000
10029	059	000	000
10030	059	000	000
10031	046	000	000
10032	046	000	000
10033	046	000	000


================================================
FILE: VeekunImport/form_abilities4.txt
================================================
00016	051	077	000
00017	051	077	000
00018	051	077	000
00029	038	079	000
00030	038	079	000
00031	038	079	000
00032	038	079	000
00033	038	079	000
00034	038	079	000
00035	056	098	000
00036	056	098	000
00046	027	087	000
00047	027	087	000
00048	014	110	000
00049	019	110	000
00052	053	101	000
00053	007	101	000
00056	072	083	000
00057	072	083	000
00066	062	099	000
00067	062	099	000
00068	062	099	000
00086	047	093	000
00087	047	093	000
00090	075	092	000
00091	075	092	000
00096	015	108	000
00097	015	108	000
00106	007	120	000
00107	051	089	000
00114	034	102	000
00115	048	113	000
00116	033	097	000
00117	038	097	000
00122	043	111	000
00123	068	101	000
00124	012	108	000
00127	052	104	000
00128	022	083	000
00133	050	091	000
00137	036	088	000
00173	056	098	000
00187	034	102	000
00188	034	102	000
00189	034	102	000
00191	034	094	000
00192	034	094	000
00198	015	105	000
00210	022	095	000
00212	068	101	000
00213	005	082	000
00216	053	095	000
00217	062	095	000
00220	012	081	000
00221	012	081	000
00223	055	097	000
00224	021	097	000
00230	033	097	000
00233	036	088	000
00234	022	119	000
00235	020	101	000
00236	062	080	000
00237	022	101	000
00238	012	108	000
00241	047	113	000
00261	050	095	000
00262	022	095	000
00263	053	082	000
00264	053	082	000
00285	027	090	000
00286	027	090	000
00300	056	096	000
00301	056	096	000
00302	051	100	000
00314	012	110	000
00322	012	086	000
00323	040	116	000
00327	020	077	000
00339	012	107	000
00340	012	107	000
00353	015	119	000
00354	015	119	000
00357	034	094	000
00359	046	105	000
00361	039	115	000
00362	039	115	000
00363	047	115	000
00364	047	115	000
00365	047	115	000
00387	065	000	000
00388	065	000	000
00389	065	000	000
00390	066	000	000
00391	066	000	000
00392	066	000	000
00393	067	000	000
00394	067	000	000
00395	067	000	000
00396	051	000	000
00397	022	000	000
00398	022	000	000
00399	086	109	000
00400	086	109	000
00401	061	000	000
00402	068	000	000
00403	079	022	000
00404	079	022	000
00405	079	022	000
00406	030	038	000
00407	030	038	000
00408	104	000	000
00409	104	000	000
00410	005	000	000
00411	005	000	000
00412	061	000	000
00413	107	000	000
00414	068	000	000
00415	118	000	000
00416	046	000	000
00417	050	053	000
00418	033	000	000
00419	033	000	000
00420	034	000	000
00421	122	000	000
00422	060	114	000
00423	060	114	000
00424	101	053	000
00425	106	084	000
00426	106	084	000
00427	050	103	000
00428	056	103	000
00429	026	000	000
00430	015	105	000
00431	007	020	000
00432	047	020	000
00433	026	000	000
00434	001	106	000
00435	001	106	000
00436	026	085	000
00437	026	085	000
00438	005	069	000
00439	043	111	000
00440	030	032	000
00441	051	077	000
00442	046	000	000
00443	008	000	000
00444	008	000	000
00445	008	000	000
00446	053	047	000
00447	080	039	000
00448	080	039	000
00449	045	000	000
00450	045	000	000
00451	004	097	000
00452	004	097	000
00453	107	087	000
00454	107	087	000
00455	026	000	000
00456	033	114	000
00457	033	114	000
00458	033	011	000
00459	117	000	000
00460	117	000	000
00461	046	000	000
00462	042	005	000
00463	020	012	000
00464	031	116	000
00465	034	102	000
00466	078	000	000
00467	049	000	000
00468	055	032	000
00469	003	110	000
00470	102	000	000
00471	081	000	000
00472	052	008	000
00473	012	081	000
00474	091	088	000
00475	080	000	000
00476	005	042	000
00477	046	000	000
00478	081	000	000
00479	026	000	000
00480	026	000	000
00481	026	000	000
00482	026	000	000
00483	046	000	000
00484	046	000	000
00485	018	000	000
00486	112	000	000
00487	046	000	000
00488	026	000	000
00489	093	000	000
00490	093	000	000
00491	123	000	000
00492	030	000	000
00493	121	000	000
10034	061	000	000
10035	061	000	000
10036	107	000	000
10037	107	000	000
10038	122	000	000
10039	060	114	000
10040	060	114	000
10041	121	000	000
10042	121	000	000
10043	121	000	000
10044	121	000	000
10045	121	000	000
10046	121	000	000
10047	121	000	000
10048	121	000	000
10049	121	000	000
10050	121	000	000
10051	121	000	000
10052	121	000	000
10053	121	000	000
10054	121	000	000
10055	121	000	000
10056	121	000	000
10057	121	000	000
10058	026	000	000
10059	026	000	000
10060	026	000	000
10061	026	000	000
10062	026	000	000
10063	026	000	000
10064	032	000	000
10065	009	000	000


================================================
FILE: VeekunImport/form_abilities5.txt
================================================
00001	065	000	034
00002	065	000	034
00003	065	000	034
00004	066	000	094
00005	066	000	094
00006	066	000	094
00007	067	000	044
00008	067	000	044
00009	067	000	044
00010	019	000	050
00011	061	000	000
00012	014	000	110
00013	019	000	050
00014	061	000	000
00015	068	000	097
00016	051	077	145
00017	051	077	145
00018	051	077	145
00019	050	062	055
00020	050	062	055
00021	051	000	097
00022	051	000	097
00023	022	061	127
00024	022	061	127
00025	009	000	031
00026	009	000	031
00027	008	000	146
00028	008	000	146
00029	038	079	055
00030	038	079	055
00031	038	079	125
00032	038	079	055
00033	038	079	055
00034	038	079	125
00035	056	098	132
00036	056	098	109
00037	018	000	070
00038	018	000	070
00039	056	000	132
00040	056	000	119
00041	039	000	151
00042	039	000	151
00043	034	000	050
00044	034	000	001
00045	034	000	027
00046	027	087	006
00047	027	087	006
00048	014	110	050
00049	019	110	147
00050	008	071	159
00051	008	071	159
00052	053	101	127
00053	007	101	127
00054	006	013	033
00055	006	013	033
00056	072	083	128
00057	072	083	128
00058	022	018	154
00059	022	018	154
00060	011	006	033
00061	011	006	033
00062	011	006	033
00063	028	039	098
00064	028	039	098
00065	028	039	098
00066	062	099	080
00067	062	099	080
00068	062	099	080
00069	034	000	082
00070	034	000	082
00071	034	000	082
00072	029	064	044
00073	029	064	044
00074	069	005	008
00075	069	005	008
00076	069	005	008
00077	050	018	049
00078	050	018	049
00079	012	020	144
00080	012	020	144
00081	042	005	148
00082	042	005	148
00083	051	039	128
00084	050	048	077
00085	050	048	077
00086	047	093	115
00087	047	093	115
00088	001	060	143
00089	001	060	143
00090	075	092	142
00091	075	092	142
00092	026	000	000
00093	026	000	000
00094	026	000	000
00095	069	005	133
00096	015	108	039
00097	015	108	039
00098	052	075	125
00099	052	075	125
00100	043	009	106
00101	043	009	106
00102	034	000	139
00103	034	000	139
00104	069	031	004
00105	069	031	004
00106	007	120	084
00107	051	089	039
00108	020	012	013
00109	026	000	000
00110	026	000	000
00111	031	069	120
00112	031	069	120
00113	030	032	131
00114	034	102	144
00115	048	113	039
00116	033	097	006
00117	038	097	006
00118	033	041	031
00119	033	041	031
00120	035	030	148
00121	035	030	148
00122	043	111	101
00123	068	101	080
00124	012	108	087
00125	009	000	072
00126	049	000	072
00127	052	104	153
00128	022	083	125
00129	033	000	155
00130	022	000	153
00131	011	075	093
00132	007	000	150
00133	050	091	107
00134	011	000	093
00135	010	000	095
00136	018	000	062
00137	036	088	148
00138	033	075	133
00139	033	075	133
00140	033	004	133
00141	033	004	133
00142	069	046	127
00143	017	047	082
00144	046	000	081
00145	046	000	031
00146	046	000	049
00147	061	000	063
00148	061	000	063
00149	039	000	136
00150	046	000	127
00151	028	000	000
00152	065	000	102
00153	065	000	102
00154	065	000	102
00155	066	000	018
00156	066	000	018
00157	066	000	018
00158	067	000	125
00159	067	000	125
00160	067	000	125
00161	050	051	119
00162	050	051	119
00163	015	051	110
00164	015	051	110
00165	068	048	155
00166	068	048	089
00167	068	015	097
00168	068	015	097
00169	039	000	151
00170	010	035	011
00171	010	035	011
00172	009	000	031
00173	056	098	132
00174	056	000	132
00175	055	032	105
00176	055	032	105
00177	028	048	156
00178	028	048	156
00179	009	000	057
00180	009	000	057
00181	009	000	057
00182	034	000	131
00183	047	037	157
00184	047	037	157
00185	005	069	155
00186	011	006	002
00187	034	102	151
00188	034	102	151
00189	034	102	151
00190	050	053	092
00191	034	094	048
00192	034	094	048
00193	003	014	119
00194	006	011	109
00195	006	011	109
00196	028	000	156
00197	028	000	039
00198	015	105	158
00199	012	020	144
00200	026	000	000
00201	026	000	000
00202	023	000	140
00203	039	048	157
00204	005	000	142
00205	005	000	142
00206	032	050	155
00207	052	008	017
00208	069	005	125
00209	022	050	155
00210	022	095	155
00211	038	033	022
00212	068	101	135
00213	005	082	126
00214	068	062	153
00215	039	051	124
00216	053	095	118
00217	062	095	127
00218	040	049	133
00219	040	049	133
00220	012	081	047
00221	012	081	047
00222	055	030	144
00223	055	097	141
00224	021	097	141
00225	072	055	015
00226	033	011	041
00227	051	005	133
00228	048	018	127
00229	048	018	127
00230	033	097	006
00231	053	000	008
00232	005	000	008
00233	036	088	148
00234	022	119	157
00235	020	101	141
00236	062	080	072
00237	022	101	080
00238	012	108	093
00239	009	000	072
00240	049	000	072
00241	047	113	157
00242	030	032	131
00243	046	000	010
00244	046	000	018
00245	046	000	011
00246	062	000	008
00247	061	000	000
00248	045	000	127
00249	046	000	136
00250	046	000	144
00251	030	000	000
00252	065	000	084
00253	065	000	084
00254	065	000	084
00255	066	000	003
00256	066	000	003
00257	066	000	003
00258	067	000	006
00259	067	000	006
00260	067	000	006
00261	050	095	155
00262	022	095	153
00263	053	082	095
00264	053	082	095
00265	019	000	050
00266	061	000	000
00267	068	000	079
00268	061	000	000
00269	019	000	014
00270	033	044	020
00271	033	044	020
00272	033	044	020
00273	034	048	124
00274	034	048	124
00275	034	048	124
00276	062	000	113
00277	062	000	113
00278	051	000	044
00279	051	000	044
00280	028	036	140
00281	028	036	140
00282	028	036	140
00283	033	000	044
00284	022	000	127
00285	027	090	095
00286	027	090	101
00287	054	000	000
00288	072	000	000
00289	054	000	000
00290	014	000	050
00291	003	000	151
00292	025	000	000
00293	043	000	155
00294	043	000	113
00295	043	000	113
00296	047	062	125
00297	047	062	125
00298	047	037	157
00299	005	042	159
00300	056	096	147
00301	056	096	147
00302	051	100	158
00303	052	022	125
00304	005	069	134
00305	005	069	134
00306	005	069	134
00307	074	000	140
00308	074	000	140
00309	009	031	058
00310	009	031	058
00311	057	000	000
00312	058	000	000
00313	035	068	158
00314	012	110	158
00315	030	038	102
00316	064	060	082
00317	064	060	082
00318	024	000	003
00319	024	000	003
00320	041	012	046
00321	041	012	046
00322	012	086	020
00323	040	116	083
00324	073	000	075
00325	047	020	082
00326	047	020	082
00327	020	077	126
00328	052	071	125
00329	026	000	000
00330	026	000	000
00331	008	000	011
00332	008	000	011
00333	030	000	013
00334	030	000	013
00335	017	000	137
00336	061	000	151
00337	026	000	000
00338	026	000	000
00339	012	107	093
00340	012	107	093
00341	052	075	091
00342	052	075	091
00343	026	000	000
00344	026	000	000
00345	021	000	114
00346	021	000	114
00347	004	000	033
00348	004	000	033
00349	033	000	091
00350	063	000	056
00351	059	000	000
00352	016	000	000
00353	015	119	130
00354	015	119	130
00355	026	000	000
00356	046	000	000
00357	034	094	139
00358	026	000	000
00359	046	105	154
00360	023	000	140
00361	039	115	141
00362	039	115	141
00363	047	115	012
00364	047	115	012
00365	047	115	012
00366	075	000	155
00367	033	000	041
00368	033	000	093
00369	033	069	005
00370	033	000	093
00371	069	000	125
00372	069	000	142
00373	022	000	153
00374	029	000	135
00375	029	000	135
00376	029	000	135
00377	029	000	005
00378	029	000	115
00379	029	000	135
00380	026	000	000
00381	026	000	000
00382	002	000	000
00383	070	000	000
00384	076	000	000
00385	032	000	000
00386	046	000	000
00387	065	000	075
00388	065	000	075
00389	065	000	075
00390	066	000	089
00391	066	000	089
00392	066	000	089
00393	067	000	128
00394	067	000	128
00395	067	000	128
00396	051	000	000
00397	022	000	120
00398	022	000	120
00399	086	109	141
00400	086	109	141
00401	061	000	050
00402	068	000	101
00403	079	022	062
00404	079	022	062
00405	079	022	062
00406	030	038	102
00407	030	038	101
00408	104	000	125
00409	104	000	125
00410	005	000	043
00411	005	000	043
00412	061	000	142
00413	107	000	142
00414	068	000	110
00415	118	000	055
00416	046	000	127
00417	050	053	010
00418	033	000	041
00419	033	000	041
00420	034	000	000
00421	122	000	000
00422	060	114	159
00423	060	114	159
00424	101	053	092
00425	106	084	138
00426	106	084	138
00427	050	103	007
00428	056	103	007
00429	026	000	000
00430	015	105	153
00431	007	020	051
00432	047	020	128
00433	026	000	000
00434	001	106	051
00435	001	106	051
00436	026	085	134
00437	026	085	134
00438	005	069	155
00439	043	111	101
00440	030	032	132
00441	051	077	145
00442	046	000	151
00443	008	000	024
00444	008	000	024
00445	008	000	024
00446	053	047	082
00447	080	039	158
00448	080	039	154
00449	045	000	159
00450	045	000	159
00451	004	097	051
00452	004	097	051
00453	107	087	143
00454	107	087	143
00455	026	000	000
00456	033	114	041
00457	033	114	041
00458	033	011	041
00459	117	000	043
00460	117	000	043
00461	046	000	124
00462	042	005	148
00463	020	012	013
00464	031	116	120
00465	034	102	144
00466	078	000	072
00467	049	000	072
00468	055	032	105
00469	003	110	119
00470	102	000	034
00471	081	000	115
00472	052	008	090
00473	012	081	047
00474	091	088	148
00475	080	000	154
00476	005	042	159
00477	046	000	000
00478	081	000	130
00479	026	000	000
00480	026	000	000
00481	026	000	000
00482	026	000	000
00483	046	000	140
00484	046	000	140
00485	018	000	049
00486	112	000	000
00487	046	000	140
00488	026	000	000
00489	093	000	000
00490	093	000	000
00491	123	000	000
00492	030	000	000
00493	121	000	000
00494	162	000	000
00495	065	000	126
00496	065	000	126
00497	065	000	126
00498	066	000	047
00499	066	000	047
00500	066	000	120
00501	067	000	075
00502	067	000	075
00503	067	000	075
00504	050	051	148
00505	035	051	148
00506	072	053	050
00507	022	146	113
00508	022	146	113
00509	007	084	158
00510	007	084	158
00511	082	000	065
00512	082	000	065
00513	082	000	066
00514	082	000	066
00515	082	000	067
00516	082	000	067
00517	108	028	140
00518	108	028	140
00519	145	105	079
00520	145	105	079
00521	145	105	079
00522	031	078	157
00523	031	078	157
00524	005	000	159
00525	005	000	159
00526	005	000	159
00527	109	103	086
00528	109	103	086
00529	146	159	104
00530	146	159	104
00531	131	144	103
00532	062	125	089
00533	062	125	089
00534	062	125	089
00535	033	093	011
00536	033	093	011
00537	033	143	011
00538	062	039	104
00539	005	039	104
00540	068	034	142
00541	102	034	142
00542	068	034	142
00543	038	068	095
00544	038	068	095
00545	038	068	095
00546	158	151	034
00547	158	151	034
00548	034	020	102
00549	034	020	102
00550	120	091	104
00551	022	153	083
00552	022	153	083
00553	022	153	083
00554	055	000	039
00555	125	000	161
00556	011	034	114
00557	005	075	133
00558	005	075	133
00559	061	153	022
00560	061	153	022
00561	147	098	110
00562	152	000	000
00563	152	000	000
00564	116	005	033
00565	116	005	033
00566	129	000	000
00567	129	000	000
00568	001	060	106
00569	001	133	106
00570	149	000	000
00571	149	000	000
00572	056	101	092
00573	056	101	092
00574	119	000	023
00575	119	000	023
00576	119	000	023
00577	142	098	144
00578	142	098	144
00579	142	098	144
00580	051	145	093
00581	051	145	093
00582	115	000	133
00583	115	000	133
00584	115	000	133
00585	034	157	032
00586	034	157	032
00587	009	000	078
00588	068	061	099
00589	068	075	142
00590	027	000	144
00591	027	000	144
00592	011	130	006
00593	011	130	006
00594	131	093	144
00595	014	127	068
00596	014	127	068
00597	160	000	000
00598	160	000	000
00599	057	058	029
00600	057	058	029
00601	057	058	029
00602	026	000	000
00603	026	000	000
00604	026	000	000
00605	140	028	148
00606	140	028	148
00607	018	049	023
00608	018	049	023
00609	018	049	023
00610	079	104	127
00611	079	104	127
00612	079	104	127
00613	081	000	155
00614	081	000	033
00615	026	000	000
00616	093	075	142
00617	093	060	084
00618	009	007	008
00619	039	144	120
00620	039	144	120
00621	024	125	104
00622	089	103	099
00623	089	103	099
00624	128	039	046
00625	128	039	046
00626	120	157	043
00627	051	125	055
00628	051	125	128
00629	145	142	133
00630	145	142	133
00631	082	018	073
00632	068	055	054
00633	055	000	000
00634	055	000	000
00635	026	000	000
00636	049	000	068
00637	049	000	068
00638	154	000	000
00639	154	000	000
00640	154	000	000
00641	158	000	128
00642	158	000	128
00643	163	000	000
00644	164	000	000
00645	159	000	125
00646	046	000	000
00647	154	000	000
00648	032	000	000
00649	088	000	000
10001	026	000	000
10002	026	000	000
10003	026	000	000
10004	026	000	000
10005	026	000	000
10006	026	000	000
10007	026	000	000
10008	026	000	000
10009	026	000	000
10010	026	000	000
10011	026	000	000
10012	026	000	000
10013	026	000	000
10014	026	000	000
10015	026	000	000
10016	026	000	000
10017	026	000	000
10018	026	000	000
10019	026	000	000
10020	026	000	000
10021	026	000	000
10022	026	000	000
10023	026	000	000
10024	026	000	000
10025	026	000	000
10026	026	000	000
10027	026	000	000
10028	059	000	000
10029	059	000	000
10030	059	000	000
10031	046	000	000
10032	046	000	000
10033	046	000	000
10034	061	000	142
10035	061	000	142
10036	107	000	142
10037	107	000	142
10038	122	000	000
10039	060	114	159
10040	060	114	159
10041	121	000	000
10042	121	000	000
10043	121	000	000
10044	121	000	000
10045	121	000	000
10046	121	000	000
10047	121	000	000
10048	121	000	000
10049	121	000	000
10050	121	000	000
10051	121	000	000
10052	121	000	000
10053	121	000	000
10054	121	000	000
10055	121	000	000
10056	121	000	000
10057	121	000	000
10058	026	000	000
10059	026	000	000
10060	026	000	000
10061	026	000	000
10062	026	000	000
10063	026	000	000
10064	032	000	000
10065	009	000	031
10066	069	091	104
10067	125	000	161
10068	034	157	032
10069	034	157	032
10070	034	157	032
10071	034	157	032
10072	034	157	032
10073	034	157	032
10074	032	000	000
10075	088	000	000
10076	088	000	000
10077	088	000	000
10078	088	000	000
10079	144	000	000
10080	010	000	000
10081	022	000	000
10082	164	000	000
10083	163	000	000
10084	154	000	000


================================================
FILE: VeekunImport/form_abilities6.txt
================================================
00039	056	172	132
00040	056	172	119
00145	046	000	009
00174	056	172	132
00311	057	000	031
00312	058	000	010
00349	033	012	091
00350	063	172	056
00352	016	000	168
00355	026	000	119
00356	046	000	119
00396	051	000	120
00477	046	000	119
00543	038	068	003
00544	038	068	003
00545	038	068	003
00574	119	172	023
00575	119	172	023
00576	119	172	023
00598	160	000	107
00607	018	049	151
00608	018	049	151
00609	018	049	151
00650	065	000	171
00651	065	000	171
00652	065	000	171
00653	066	000	170
00654	066	000	170
00655	066	000	170
00656	067	000	168
00657	067	000	168
00658	067	000	168
00659	053	167	037
00660	053	167	037
00661	145	000	177
00662	049	000	177
00663	049	000	177
00664	019	014	132
00665	061	000	132
00666	019	014	132
00667	079	127	153
00668	079	127	153
00669	166	000	180
00670	166	000	180
00671	166	000	180
00672	157	000	179
00673	157	000	179
00674	089	104	113
00675	089	104	113
00676	169	000	000
00677	051	151	020
00678	051	151	158
00679	099	000	000
00680	099	000	000
00681	176	000	000
00682	131	000	165
00683	131	000	165
00684	175	000	084
00685	175	000	084
00686	126	021	151
00687	126	021	151
00688	181	097	124
00689	181	097	124
00690	038	143	091
00691	038	143	091
00692	178	000	000
00693	178	000	000
00694	087	008	094
00695	087	008	094
00696	173	000	005
00697	173	000	069
00698	174	000	117
00699	174	000	117
00700	056	000	182
00701	007	084	104
00702	167	053	057
00703	029	000	005
00704	157	093	183
00705	157	093	183
00706	157	093	183
00707	158	000	170
00708	030	119	139
00709	030	119	139
00710	053	119	015
00711	053	119	015
00712	020	115	005
00713	020	115	005
00714	119	151	140
00715	119	151	140
00716	187	000	000
00717	186	000	000
00718	188	000	000
00719	029	000	000
00720	170	000	000
00721	011	000	000
10085	121	000	000
10086	019	014	132
10087	019	014	132
10088	019	014	132
10089	019	014	132
10090	019	014	132
10091	019	014	132
10092	019	014	132
10093	019	014	132
10094	019	014	132
10095	019	014	132
10096	019	014	132
10097	019	014	132
10098	019	014	132
10099	019	014	132
10100	019	014	132
10101	019	014	132
10102	019	014	132
10103	166	00
Download .txt
gitextract_fpvand7g/

├── .gitignore
├── .gitmodules
├── GlobalTerminalService/
│   ├── GTServer4.cs
│   ├── GTServer5.cs
│   ├── GTServerBase.cs
│   ├── GlobalTerminalService.csproj
│   ├── Program.cs
│   ├── ProjectInstaller.Designer.cs
│   ├── ProjectInstaller.cs
│   ├── ProjectInstaller.resx
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Service1.Designer.cs
│   ├── Service1.cs
│   ├── Service1.resx
│   ├── app.config
│   └── cert.pfx
├── LICENSE.md
├── MakeBaseStatTables/
│   ├── MakeBaseStatTables.csproj
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── app.config
│   └── packages.config
├── README.md
├── RenameImages/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── RenameImages.csproj
├── Roadmap.md
├── VeekunImport/
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── VeekunImport.csproj
│   ├── app.config
│   ├── countries4.txt
│   ├── countries5.txt
│   ├── families.txt
│   ├── families_map.txt
│   ├── form_abilities3.txt
│   ├── form_abilities4.txt
│   ├── form_abilities5.txt
│   ├── form_abilities6.txt
│   ├── form_stats1.txt
│   ├── form_stats2.txt
│   ├── form_stats3.txt
│   ├── form_stats4.txt
│   ├── form_stats5.txt
│   ├── form_stats6.txt
│   ├── form_values.txt
│   ├── items3.txt
│   ├── items4.txt
│   ├── items5.txt
│   ├── items_balls.txt
│   ├── packages.config
│   ├── regions.txt
│   ├── ribbon_positions3.txt
│   ├── ribbon_positions4.txt
│   ├── ribbon_positions5.txt
│   └── ribbons.txt
├── bvCrawler4/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── bvCrawler4.csproj
│   └── packages.config
├── bvCrawler5/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── bvCrawler5.csproj
│   └── packages.config
├── bvRestorer4/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── bvRestorer4.csproj
├── bvRestorer5/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── bvRestorer5.csproj
├── gfx/
│   ├── 2014 design/
│   │   ├── fGTS colour blending.psd
│   │   ├── heading-backdrop.psd
│   │   ├── headinglogo.psd
│   │   ├── logo-colour.psd
│   │   └── logov3.psd
│   └── 2023 design/
│       ├── Discord Icon Pride.afdesign
│       ├── Discord Icon.afdesign
│       ├── Logo.afdesign
│       ├── Temp placeholder background.afdesign
│       └── Touch Icon.afdesign
├── gts/
│   ├── Global.asax
│   ├── Global.asax.cs
│   ├── Properties/
│   │   ├── AssemblyInfo.cs
│   │   └── PublishProfiles/
│   │       ├── Local IIS.pubxml
│   │       └── Public.pubxml
│   ├── Web.Public.config
│   ├── Web.config
│   ├── admin/
│   │   ├── Sessions.aspx
│   │   ├── Sessions.aspx.cs
│   │   ├── Sessions.aspx.designer.cs
│   │   ├── Web.Debug.config
│   │   ├── Web.Release.config
│   │   └── Web.config
│   ├── gts.csproj
│   ├── masters/
│   │   ├── MasterPage.master
│   │   ├── MasterPage.master.cs
│   │   └── MasterPage.master.designer.cs
│   ├── pgl.ashx
│   ├── pgl.ashx.cs
│   ├── pkvldtprod.ashx
│   ├── pkvldtprod.ashx.cs
│   ├── pokemondpds.ashx
│   ├── pokemondpds.ashx.cs
│   ├── pokemondpds_web.ashx
│   ├── pokemondpds_web.ashx.cs
│   ├── src/
│   │   ├── AppStateHelper.cs
│   │   ├── BanHelper.cs
│   │   ├── FakeOpponentGenerator.cs
│   │   └── IpAddressHelper.cs
│   ├── syachi2ds.ashx
│   └── syachi2ds.ashx.cs
├── library/
│   ├── Data/
│   │   ├── DataMysql.cs
│   │   ├── DataSqlite.cs
│   │   ├── Database.cs
│   │   ├── DatabaseExtender.cs
│   │   ├── MySqlDatabaseExtender.cs
│   │   └── SqlDatabaseExtender.cs
│   ├── Library.csproj
│   ├── Pokedex/
│   │   ├── Ability.cs
│   │   ├── Evolution.cs
│   │   ├── Family.cs
│   │   ├── Form.cs
│   │   ├── FormAbilities.cs
│   │   ├── FormStats.cs
│   │   ├── Item.cs
│   │   ├── Location.cs
│   │   ├── Move.cs
│   │   ├── Pokedex.cs
│   │   ├── PokedexRecordBase.cs
│   │   ├── Region.cs
│   │   ├── Ribbon.cs
│   │   ├── Species.cs
│   │   └── Type.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── Structures/
│   │   ├── ByteStatValues.cs
│   │   ├── ContestStatValues.cs
│   │   ├── Enums.cs
│   │   ├── Format.cs
│   │   ├── IntStatValues.cs
│   │   ├── IvStatValues.cs
│   │   ├── MoveSlot.cs
│   │   ├── Pokemon4.cs
│   │   ├── Pokemon5.cs
│   │   ├── PokemonBase.cs
│   │   ├── PokemonParty4.cs
│   │   ├── PokemonParty5.cs
│   │   ├── PokemonPartyBase.cs
│   │   ├── StatValues.cs
│   │   ├── StatValuesBase.cs
│   │   └── TrainerMemo.cs
│   ├── Support/
│   │   ├── AliasTable.cs
│   │   ├── AssertHelper.cs
│   │   ├── BinarySerializableBase.cs
│   │   ├── EncodedString4.cs
│   │   ├── EncodedString5.cs
│   │   ├── EncodedStringBase.cs
│   │   ├── EnumerableExtender.cs
│   │   ├── GameSyncUtils.cs
│   │   ├── Indexer1d.cs
│   │   ├── LazyKeyValuePair.cs
│   │   ├── LocalizedString.cs
│   │   ├── LogHelper.cs
│   │   ├── StreamExtender.cs
│   │   ├── StringHelper.cs
│   │   ├── TrendyPhrase4.cs
│   │   ├── TrendyPhrase5.cs
│   │   ├── TrendyPhraseBase.cs
│   │   └── ValidationSummary.cs
│   ├── Wfc/
│   │   ├── BanStatus.cs
│   │   ├── BattleSubwayPokemon5.cs
│   │   ├── BattleSubwayProfile5.cs
│   │   ├── BattleSubwayRecord5.cs
│   │   ├── BattleTowerPokemon4.cs
│   │   ├── BattleTowerPokemonBase.cs
│   │   ├── BattleTowerProfile4.cs
│   │   ├── BattleTowerProfileBase.cs
│   │   ├── BattleTowerRecord4.cs
│   │   ├── BattleTowerRecordBase.cs
│   │   ├── BattleVideoHeader4.cs
│   │   ├── BattleVideoHeader5.cs
│   │   ├── BattleVideoRecord4.cs
│   │   ├── BattleVideoRecord5.cs
│   │   ├── BoxRecord4.cs
│   │   ├── DressupRecord4.cs
│   │   ├── GtsRecord4.cs
│   │   ├── GtsRecord5.cs
│   │   ├── GtsRecordBase.cs
│   │   ├── MusicalRecord5.cs
│   │   ├── PlazaQuestionnaire.cs
│   │   ├── PlazaSchedule.cs
│   │   ├── TrainerProfile4.cs
│   │   ├── TrainerProfile5.cs
│   │   ├── TrainerProfileBase.cs
│   │   ├── TrainerProfilePlaza.cs
│   │   ├── TrainerRankings.cs
│   │   └── VipRecord.cs
│   ├── app.config
│   ├── database.sql
│   ├── lib/
│   │   ├── SQLite.Designer.pdb
│   │   ├── SQLite.Designer.xml
│   │   ├── System.Data.SQLite.Linq.pdb
│   │   ├── System.Data.SQLite.Linq.xml
│   │   ├── System.Data.SQLite.dll.config
│   │   ├── System.Data.SQLite.pdb
│   │   └── System.Data.SQLite.xml
│   └── packages.config
├── pkmn-classic-framework.sln
├── pokedex/
│   └── Shiny lock generations.txt
├── towerRestorer4/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   └── towerRestorer.csproj
└── web/
    ├── Default.aspx
    ├── Default.aspx.cs
    ├── Default.aspx.designer.cs
    ├── Global.asax
    ├── Global.asax.cs
    ├── Properties/
    │   ├── AssemblyInfo.cs
    │   └── PublishProfiles/
    │       └── Public.pubxml
    ├── RoomLeaders.aspx
    ├── RoomLeaders.aspx.cs
    ├── RoomLeaders.aspx.designer.cs
    ├── Web.Public.config
    ├── Web.config
    ├── admin/
    │   ├── AddBoxes.aspx
    │   ├── AddBoxes.aspx.cs
    │   ├── AddBoxes.aspx.designer.cs
    │   ├── AddDressup.aspx
    │   ├── AddDressup.aspx.cs
    │   ├── AddDressup.aspx.designer.cs
    │   ├── AddMusical.aspx
    │   ├── AddMusical.aspx.cs
    │   ├── AddMusical.aspx.designer.cs
    │   ├── Web.Debug.config
    │   ├── Web.Release.config
    │   └── Web.config
    ├── battlevideo/
    │   ├── Default.aspx
    │   ├── Default.aspx.cs
    │   └── Default.aspx.designer.cs
    ├── controls/
    │   ├── DnsAddress.ascx
    │   ├── DnsAddress.ascx.cs
    │   ├── DnsAddress.ascx.designer.cs
    │   ├── ForeignLookup.ascx
    │   ├── ForeignLookup.ascx.cs
    │   ├── ForeignLookup.ascx.designer.cs
    │   ├── LabelTextBox.ascx
    │   ├── LabelTextBox.ascx.cs
    │   ├── LabelTextBox.ascx.designer.cs
    │   ├── PokemonPicker.ascx
    │   ├── PokemonPicker.ascx.cs
    │   ├── PokemonPicker.ascx.designer.cs
    │   ├── PokemonSource.ashx
    │   └── PokemonSource.ashx.cs
    ├── css/
    │   ├── form.css
    │   ├── login.css
    │   ├── main.css
    │   ├── pkmnstats.css
    │   └── types.css
    ├── gts/
    │   ├── Default.aspx
    │   ├── Default.aspx.cs
    │   ├── Default.aspx.designer.cs
    │   ├── Pokemon.aspx
    │   ├── Pokemon.aspx.cs
    │   └── Pokemon.aspx.designer.cs
    ├── masters/
    │   ├── LeftColumn.master
    │   ├── LeftColumn.master.cs
    │   ├── LeftColumn.master.designer.cs
    │   ├── MasterPage.master
    │   ├── MasterPage.master.cs
    │   ├── MasterPage.master.designer.cs
    │   ├── ThreeColumn.master
    │   ├── ThreeColumn.master.cs
    │   └── ThreeColumn.master.designer.cs
    ├── packages.config
    ├── scripts/
    │   ├── form.js
    │   └── retina.js
    ├── src/
    │   ├── AppStateHelper.cs
    │   ├── Common.cs
    │   ├── DependencyNode.cs
    │   ├── ForeignLookupSource.cs
    │   ├── HeaderColour.cs
    │   ├── OnceTemplate.cs
    │   ├── RequireCss.cs
    │   ├── RequireLinkBase.cs
    │   ├── RequireScript.cs
    │   ├── RetinaImage.cs
    │   ├── RetinaImageBase.cs
    │   ├── WebException.cs
    │   └── WebFormat.cs
    ├── test/
    │   ├── BoxUp.aspx
    │   ├── BoxUp.aspx.cs
    │   ├── BoxUp.aspx.designer.cs
    │   ├── Decode.aspx
    │   ├── Decode.aspx.cs
    │   ├── Decode.aspx.designer.cs
    │   ├── Gsid.aspx
    │   ├── Gsid.aspx.cs
    │   ├── Gsid.aspx.designer.cs
    │   ├── NameDecode.aspx
    │   ├── NameDecode.aspx.cs
    │   ├── NameDecode.aspx.designer.cs
    │   ├── NameEncode.aspx
    │   ├── NameEncode.aspx.cs
    │   ├── NameEncode.aspx.designer.cs
    │   ├── VideoId.aspx
    │   ├── VideoId.aspx.cs
    │   ├── VideoId.aspx.designer.cs
    │   └── Web.config
    └── web.csproj
Download .txt
SYMBOL INDEX (1206 symbols across 173 files)

FILE: GlobalTerminalService/GTServer4.cs
  class GTServer4 (line 15) | public class GTServer4 : GTServerBase
    method GTServer4 (line 17) | public GTServer4()
    method GTServer4 (line 23) | public GTServer4(int threads)
    method GTServer4 (line 29) | public GTServer4(int threads, int timeout)
    method Initialize (line 35) | private void Initialize()
    method ProcessRequest (line 40) | protected override byte[] ProcessRequest(byte[] data, TcpClient c)
    method CryptMessage (line 517) | private void CryptMessage(byte[] message)
    method GenerateFakeData (line 571) | private static TrainerRankingsLeaderboardEntry[] GenerateFakeData(int ...
    method GenerateFakeReport (line 578) | private static TrainerRankingsReport GenerateFakeReport(DateTime start...
  type RequestTypes4 (line 589) | internal enum RequestTypes4 : byte

FILE: GlobalTerminalService/GTServer5.cs
  class GTServer5 (line 16) | public class GTServer5 : GTServerBase
    method GTServer5 (line 18) | public GTServer5()
    method GTServer5 (line 24) | public GTServer5(int threads)
    method GTServer5 (line 30) | public GTServer5(int threads, int timeout)
    method GTServer5 (line 36) | public GTServer5(int threads, int timeout, X509Certificate2 certificate)
    method Initialize (line 42) | private void Initialize()
    method ProcessRequest (line 47) | protected override byte[] ProcessRequest(byte[] data, TcpClient c)
    method Byte6 (line 304) | private byte Byte6(RequestTypes5 type)
  type RequestTypes5 (line 330) | internal enum RequestTypes5 : byte

FILE: GlobalTerminalService/GTServerBase.cs
  class GTServerBase (line 16) | public abstract class GTServerBase
    method GTServerBase (line 18) | public GTServerBase(int port)
    method GTServerBase (line 23) | public GTServerBase(int port, bool useSsl)
    method GTServerBase (line 28) | public GTServerBase(int port, bool useSsl, int threads)
    method GTServerBase (line 36) | public GTServerBase(int port, bool useSsl, int threads, int timeout)
    method GTServerBase (line 42) | public GTServerBase(int port, bool useSsl, int threads, int timeout, X...
    method GetDefaultCertificate (line 52) | private static X509Certificate2 GetDefaultCertificate()
    method BeginPolling (line 95) | public void BeginPolling()
    method EndPolling (line 114) | public void EndPolling()
    method MainLoop (line 130) | private void MainLoop(object o)
    method AcceptClient (line 202) | private TcpClient AcceptClient()
    method GetStream (line 211) | private Stream GetStream(TcpClient c)
    method ProcessRequest (line 228) | protected abstract byte[] ProcessRequest(byte[] data, TcpClient c);
    method WriteLength (line 232) | protected void WriteLength(byte[] message)

FILE: GlobalTerminalService/Program.cs
  class Program (line 10) | static class Program
    method Main (line 15) | static void Main()

FILE: GlobalTerminalService/ProjectInstaller.Designer.cs
  class ProjectInstaller (line 3) | partial class ProjectInstaller
    method Dispose (line 14) | protected override void Dispose(bool disposing)
    method InitializeComponent (line 29) | private void InitializeComponent()

FILE: GlobalTerminalService/ProjectInstaller.cs
  class ProjectInstaller (line 10) | [RunInstaller(true)]
    method ProjectInstaller (line 13) | public ProjectInstaller()

FILE: GlobalTerminalService/Service1.Designer.cs
  class Service1 (line 3) | partial class Service1
    method Dispose (line 14) | protected override void Dispose(bool disposing)
    method InitializeComponent (line 29) | private void InitializeComponent()

FILE: GlobalTerminalService/Service1.cs
  class Service1 (line 13) | public partial class Service1 : ServiceBase
    method Service1 (line 15) | public Service1()
    method OnStart (line 26) | protected override void OnStart(string[] args)
    method Start (line 31) | public void Start()
    method OnStop (line 39) | protected override void OnStop()

FILE: MakeBaseStatTables/Program.cs
  class Program (line 15) | class Program
    method Main (line 17) | static void Main(string[] args)

FILE: RenameImages/Program.cs
  class Program (line 15) | class Program
    method Main (line 17) | static void Main(string[] args)
    method NormalizeFilename (line 98) | private static string NormalizeFilename(string filename, string path)

FILE: VeekunImport/Program.cs
  class Program (line 18) | class Program
    method Main (line 22) | static void Main(string[] args)
    method GetLocalizedString (line 581) | private static LocalizedString GetLocalizedString(IDataReader reader, ...
    method GetDamageClass (line 593) | private static DamageClass GetDamageClass(IDataReader reader)
    method ProcessTSV (line 599) | private static bool ProcessTSV(string filename, int requiredFields, Ac...
    method VeekunLocationToRegion (line 630) | private static int VeekunLocationToRegion(SQLiteDataReader reader)
  class ItemLoading (line 667) | internal class ItemLoading
    method ItemLoading (line 669) | public ItemLoading(int id, string name)
    method SetGenerationValue (line 685) | public void SetGenerationValue(int ? value, int generation)
  class RibbonLoading (line 705) | internal class RibbonLoading
    method RibbonLoading (line 707) | public RibbonLoading(int id, string name, string description)
    method SetGenerationPosition (line 720) | public void SetGenerationPosition(int? position, int generation)
  class TsvRow (line 740) | internal class TsvRow
    method TsvRow (line 742) | public TsvRow(int lineNumber, int validLineNumber, string[] fields)

FILE: bvCrawler4/Program.cs
  class BvCrawler4 (line 16) | public class BvCrawler4
    method Main (line 18) | public static void Main(string[] args)
    method FormatVideoId (line 125) | public static String FormatVideoId(ulong videoId)
    method GetBattleVideo (line 135) | public static byte[] GetBattleVideo(int pid, ulong videoId)
    method RunSearch (line 164) | public static bool RunSearch(int pid)
    method QueueTop30 (line 255) | public static void QueueTop30(int pid)
    method QueueSearch (line 260) | public static void QueueSearch(int pid, ushort species, SearchMetagame...
    method QueueSearchResults (line 326) | public static void QueueSearchResults(byte[] data)
    method QueueVideoId (line 356) | public static void QueueVideoId(MySqlConnection db, ulong id)
    method DequeueVideo (line 375) | public static ulong DequeueVideo(MySqlConnection db)
    method PutLength (line 392) | public static void PutLength(byte[] data)
    method Conversation (line 399) | public static byte[] Conversation(byte[] request)
    method Encrypt (line 419) | public static void Encrypt(byte[] data, int padOffset)
    method Decrypt (line 428) | public static void Decrypt(byte[] data)
    method RetryAll (line 434) | public static void RetryAll()
    method CreateConnection (line 486) | public static MySqlConnection CreateConnection()
    method LogError (line 491) | public static void LogError(Exception ex)
    type SearchMetagames (line 497) | public enum SearchMetagames : byte

FILE: bvCrawler5/Program.cs
  class BvCrawler5 (line 18) | public class BvCrawler5
    method Main (line 20) | public static void Main(string[] args)
    method FormatVideoId (line 148) | public static String FormatVideoId(ulong videoId)
    method WriteBase64shit (line 158) | public static void WriteBase64shit(Stream s)
    method GetBattleVideo (line 198) | public static byte[] GetBattleVideo(int pid, ulong videoId)
    method RunSearch (line 227) | public static bool RunSearch(int pid)
    method QueueSpecial (line 319) | public static void QueueSpecial(int pid, SearchSpecial special)
    method QueueSearch (line 324) | public static void QueueSearch(int pid, SearchSpecial special, ushort ...
    method QueueSearchResults (line 397) | public static void QueueSearchResults(byte[] data)
    method QueueVideoId (line 424) | public static void QueueVideoId(MySqlConnection db, ulong id)
    method DequeueVideo (line 443) | public static ulong DequeueVideo(MySqlConnection db)
    method PutLength (line 460) | public static void PutLength(byte[] data)
    method Conversation (line 467) | public static byte[] Conversation(byte[] request)
    method RetryAll (line 489) | public static void RetryAll()
    method CreateConnection (line 541) | public static MySqlConnection CreateConnection()
    method LogError (line 546) | public static void LogError(Exception ex)
    type SearchSpecial (line 552) | public enum SearchSpecial : uint
    type SearchMetagames (line 562) | public enum SearchMetagames : uint

FILE: bvRestorer4/Program.cs
  class Program (line 13) | class Program
    method Main (line 15) | static void Main(string[] args)
    method CryptMessage (line 84) | private static void CryptMessage(byte[] message)

FILE: bvRestorer5/Program.cs
  class Program (line 13) | class Program
    method Main (line 15) | static void Main(string[] args)

FILE: gts/Global.asax.cs
  class Global (line 12) | public class Global : System.Web.HttpApplication
    method Application_Start (line 14) | void Application_Start(object sender, EventArgs e)
    method Application_End (line 20) | void Application_End(object sender, EventArgs e)
    method Application_Error (line 26) | void Application_Error(object sender, EventArgs e)
    method Session_Start (line 32) | void Session_Start(object sender, EventArgs e)
    method Session_End (line 38) | void Session_End(object sender, EventArgs e)
    method Application_BeginRequest (line 47) | void Application_BeginRequest(object sender, EventArgs e)
    method Application_EndRequest (line 58) | void Application_EndRequest(object sender, EventArgs e)
    method RewriteUrl (line 63) | public static String RewriteUrl(String url, out String pathInfo, out S...

FILE: gts/admin/Sessions.aspx.cs
  class Sessions (line 12) | public partial class Sessions : System.Web.UI.Page
    method Page_Load (line 14) | protected void Page_Load(object sender, EventArgs e)

FILE: gts/admin/Sessions.aspx.designer.cs
  class Sessions (line 13) | public partial class Sessions {

FILE: gts/masters/MasterPage.master.cs
  class MasterPage (line 10) | public partial class MasterPage : System.Web.UI.MasterPage
    method Page_Load (line 12) | protected void Page_Load(object sender, EventArgs e)

FILE: gts/masters/MasterPage.master.designer.cs
  class MasterPage (line 13) | public partial class MasterPage {

FILE: gts/pgl.ashx.cs
  class pgl (line 12) | public class pgl : IHttpHandler
    method ProcessRequest (line 15) | public void ProcessRequest(HttpContext context)

FILE: gts/pkvldtprod.ashx.cs
  class pkvldtprod (line 14) | public class pkvldtprod : IHttpHandler
    method ProcessRequest (line 16) | public void ProcessRequest(HttpContext context)
    type PartyValidationResult (line 100) | private enum PartyValidationResult : byte
    type PokemonValidationResult (line 106) | private enum PokemonValidationResult : int
    type RequestType (line 112) | private enum RequestType : short
    method Error400 (line 119) | private void Error400(HttpContext context)
  class Pokemon5 (line 135) | internal class Pokemon5
    method Pokemon5 (line 139) | public Pokemon5(byte[] data)

FILE: gts/pokemondpds.ashx.cs
  class pokemondpds (line 19) | public class pokemondpds : GamestatsHandler
    method pokemondpds (line 21) | public pokemondpds()
    method ProcessGamestatsRequest (line 29) | public override void ProcessGamestatsRequest(byte[] data, MemoryStream...

FILE: gts/pokemondpds_web.ashx.cs
  class pokemondpds_web (line 16) | public class pokemondpds_web : GamestatsHandler
    method pokemondpds_web (line 18) | public pokemondpds_web()
    method ProcessGamestatsRequest (line 25) | public override void ProcessGamestatsRequest(byte[] request, MemoryStr...

FILE: gts/src/AppStateHelper.cs
  class AppStateHelper (line 9) | public static class AppStateHelper
    method Pokedex (line 17) | public static Pokedex.Pokedex Pokedex(HttpApplicationState application)
    method GetTypedApplicationObject (line 22) | public static T GetTypedApplicationObject<T>(HttpApplicationState appl...

FILE: gts/src/BanHelper.cs
  class BanHelper (line 11) | public static class BanHelper
    method GetBanStatus (line 13) | public static BanStatus GetBanStatus(int pid, string IpAddress, Genera...

FILE: gts/src/FakeOpponentGenerator.cs
  class FakeOpponentGenerator (line 14) | public static class FakeOpponentGenerator
    method GenerateFakeOpponents (line 24) | public static BattleTowerRecordBase[] GenerateFakeOpponents(FakeOppone...
    method GenerateFakeOpponent (line 47) | public static BattleTowerRecordBase GenerateFakeOpponent(FakeOpponentF...
  class FakeOpponentFactory (line 643) | public abstract class FakeOpponentFactory
    method CreateRecord (line 645) | public abstract BattleTowerRecordBase CreateRecord(Pokedex.Pokedex pok...
    method CreatePokemon (line 647) | public abstract BattleTowerPokemonBase CreatePokemon(Pokedex.Pokedex p...
    method CreateProfile (line 652) | public abstract BattleTowerProfileBase CreateProfile(string name, Vers...
    method CreateTrendyPhrase (line 656) | public abstract TrendyPhraseBase CreateTrendyPhrase(ushort mood, ushor...
  class FakeOpponentFactory4 (line 661) | public class FakeOpponentFactory4 : FakeOpponentFactory
    method CreateRecord (line 663) | public override BattleTowerRecordBase CreateRecord(Pokedex.Pokedex pok...
    method CreatePokemon (line 671) | public override BattleTowerPokemonBase CreatePokemon(Pokedex.Pokedex p...
    method CreateProfile (line 689) | public override BattleTowerProfileBase CreateProfile(string name,
    method CreateTrendyPhrase (line 702) | public override TrendyPhraseBase CreateTrendyPhrase(ushort mood,
  class FakeOpponentFactory5 (line 717) | public class FakeOpponentFactory5 : FakeOpponentFactory
    method CreateRecord (line 719) | public override BattleTowerRecordBase CreateRecord(Pokedex.Pokedex pok...
    method CreatePokemon (line 727) | public override BattleTowerPokemonBase CreatePokemon(Pokedex.Pokedex p...
    method CreateProfile (line 745) | public override BattleTowerProfileBase CreateProfile(string name,
    method CreateTrendyPhrase (line 758) | public override TrendyPhraseBase CreateTrendyPhrase(ushort mood, ushor...

FILE: gts/src/IpAddressHelper.cs
  class IpAddressHelper (line 9) | public static class IpAddressHelper
    method GetIpAddress (line 11) | public static string GetIpAddress(HttpRequest request)
    method RemovePort (line 30) | private static string RemovePort(string ip)
    method Ipv4ToBinary (line 38) | public static uint Ipv4ToBinary(string ip)

FILE: gts/syachi2ds.ashx.cs
  class syachi2ds (line 18) | public class syachi2ds : GamestatsHandler
    method syachi2ds (line 20) | public syachi2ds()
    method ProcessGamestatsRequest (line 27) | public override void ProcessGamestatsRequest(byte[] request, MemoryStr...

FILE: library/Data/DataMysql.cs
  method DataMysql (line 20) | public DataMysql(string connString)
  method CreateConnection (line 27) | private MySqlConnection CreateConnection()
  method SqlSanitize (line 34) | public static string SqlSanitize(string s)
  method SqlSanitize (line 39) | public static string SqlSanitize(string s, string newChar)
  method WithTransaction (line 55) | private T WithTransaction<T>(Func<MySqlTransaction, T> command)
  method WithTransaction (line 75) | private void WithTransaction(Action<MySqlTransaction> command)
  method WithTransaction (line 95) | private T WithTransaction<T>(WithMysqlTransactionDelegate<T> command)
  method WithTransactionSuccessful (line 123) | private bool WithTransactionSuccessful(Func<MySqlTransaction, bool> comm...
  method GtsDataForUser4 (line 147) | public GtsRecord4 GtsDataForUser4(MySqlTransaction tran, Pokedex.Pokedex...
  method GtsDataForUser4 (line 171) | public override GtsRecord4 GtsDataForUser4(Pokedex.Pokedex pokedex, int ...
  method GtsGetRecord4 (line 176) | public GtsRecord4 GtsGetRecord4(MySqlTransaction tran, Pokedex.Pokedex p...
  method GtsGetRecord4 (line 219) | public override GtsRecord4 GtsGetRecord4(Pokedex.Pokedex pokedex, long t...
  method GtsDepositPokemon4 (line 224) | public bool GtsDepositPokemon4(MySqlTransaction tran, GtsRecord4 record)
  method GtsDepositPokemon4 (line 257) | public override bool GtsDepositPokemon4(GtsRecord4 record)
  method GtsGetDepositId4 (line 265) | public ulong ? GtsGetDepositId4(MySqlTransaction tran, int pid)
  method GtsDeletePokemon4 (line 274) | public bool GtsDeletePokemon4(MySqlTransaction tran, int pid)

FILE: library/Data/DataSqlite.cs
  class DataSqlite (line 11) | public class DataSqlite// : DataAbstract
    method CreateConnection (line 13) | public SQLiteConnection CreateConnection()
    method CreateConnection (line 18) | public SQLiteConnection CreateConnection(string filename)

FILE: library/Data/Database.cs
  class Database (line 13) | public abstract class Database
    method CreateInstance (line 31) | public static Database CreateInstance()
    method CreateInstance (line 39) | public static Database CreateInstance(ConnectionStringSettings connStr)
    method CreateInstance (line 46) | public static Database CreateInstance(string connStr, string provider)
    method DateLerp (line 63) | internal static DateTime DateLerp(DateTime first, DateTime second, dou...
    method HypeDecay (line 82) | internal static double HypeDecay(double oldHype, DateTime oldDate, Dat...
    method GetActiveHypeDate (line 94) | internal static DateTime GetActiveHypeDate(DateTime now)
    method GtsDataForUser4 (line 107) | public abstract GtsRecord4 GtsDataForUser4(Pokedex.Pokedex pokedex, in...
    method GtsGetRecord4 (line 108) | public abstract GtsRecord4 GtsGetRecord4(Pokedex.Pokedex pokedex, long...
    method GtsDepositPokemon4 (line 110) | public abstract bool GtsDepositPokemon4(GtsRecord4 record);
    method GtsDeletePokemon4 (line 112) | public abstract bool GtsDeletePokemon4(int pid);
    method GtsLockPokemon4 (line 114) | public abstract bool GtsLockPokemon4(ulong tradeId, int partner_pid);
    method GtsCheckLockStatus4 (line 115) | public abstract bool GtsCheckLockStatus4(ulong tradeId, int partner_pid);
    method GtsTradePokemon4 (line 117) | public abstract bool GtsTradePokemon4(int pidSrc, int pidDest);
    method GtsTradePokemon4 (line 118) | public abstract bool GtsTradePokemon4(GtsRecord4 upload, GtsRecord4 re...
    method GtsSearch4 (line 120) | public abstract GtsRecord4[] GtsSearch4(Pokedex.Pokedex pokedex, int p...
    method GtsAvailablePokemon4 (line 121) | public abstract int GtsAvailablePokemon4();
    method GtsSetLastSearch4 (line 123) | public abstract void GtsSetLastSearch4(int pid);
    method GtsGetLastSearch4 (line 124) | public abstract DateTime? GtsGetLastSearch4(int pid);
    method BattleTowerUpdateRecord4 (line 128) | public abstract ulong BattleTowerUpdateRecord4(BattleTowerRecord4 reco...
    method BattleTowerAddLeader4 (line 129) | public abstract ulong BattleTowerAddLeader4(BattleTowerRecord4 record);
    method BattleTowerGetOpponents4 (line 130) | public abstract BattleTowerRecord4[] BattleTowerGetOpponents4(Pokedex....
    method BattleTowerGetLeaders4 (line 131) | public abstract BattleTowerProfile4[] BattleTowerGetLeaders4(Pokedex.P...
    method PlazaGetProfile (line 135) | public abstract TrainerProfilePlaza PlazaGetProfile(int pid);
    method PlazaSetProfile (line 136) | public abstract bool PlazaSetProfile(TrainerProfilePlaza profile);
    method GamestatsBumpProfile4 (line 140) | public abstract bool GamestatsBumpProfile4(int pid, string ip_address);
    method GamestatsSetProfile4 (line 141) | public abstract bool GamestatsSetProfile4(TrainerProfile4 profile);
    method GamestatsGetProfile4 (line 142) | public abstract TrainerProfile4 GamestatsGetProfile4(int pid);
    method CheckBanStatus (line 146) | public abstract BanStatus CheckBanStatus(int pid);
    method CheckBanStatus (line 147) | public abstract BanStatus CheckBanStatus(byte[] mac_address);
    method CheckBanStatus (line 148) | public abstract BanStatus CheckBanStatus(string ip_address);
    method CheckBanStatus (line 149) | public abstract BanStatus CheckBanStatus(TrainerProfileBase profile);
    method CheckBanStatus (line 150) | public abstract BanStatus CheckBanStatus(uint ip_address);
    method AddBan (line 152) | public abstract void AddBan(int pid, BanStatus status);
    method AddBan (line 153) | public abstract void AddBan(byte[] mac_address, BanStatus status);
    method AddBan (line 154) | public abstract void AddBan(string ip_address, BanStatus status);
    method GtsDataForUser5 (line 160) | public abstract GtsRecord5 GtsDataForUser5(Pokedex.Pokedex pokedex, in...
    method GtsGetRecord5 (line 161) | public abstract GtsRecord5 GtsGetRecord5(Pokedex.Pokedex pokedex, long...
    method GtsDepositPokemon5 (line 163) | public abstract bool GtsDepositPokemon5(GtsRecord5 record);
    method GtsDeletePokemon5 (line 165) | public abstract bool GtsDeletePokemon5(int pid);
    method GtsLockPokemon5 (line 167) | public abstract bool GtsLockPokemon5(ulong tradeId, int partner_pid);
    method GtsCheckLockStatus5 (line 168) | public abstract bool GtsCheckLockStatus5(ulong tradeId, int partner_pid);
    method GtsTradePokemon5 (line 170) | public abstract bool GtsTradePokemon5(int pidSrc, int pidDest);
    method GtsTradePokemon5 (line 171) | public abstract bool GtsTradePokemon5(GtsRecord5 upload, GtsRecord5 re...
    method GtsSearch5 (line 173) | public abstract GtsRecord5[] GtsSearch5(Pokedex.Pokedex pokedex, int p...
    method GtsAvailablePokemon5 (line 174) | public abstract int GtsAvailablePokemon5();
    method GtsSetLastSearch5 (line 176) | public abstract void GtsSetLastSearch5(int pid);
    method GtsGetLastSearch5 (line 177) | public abstract DateTime ? GtsGetLastSearch5(int pid);
    method GamestatsSetProfile5 (line 181) | public abstract bool GamestatsSetProfile5(TrainerProfile5 profile);
    method GamestatsGetProfile5 (line 182) | public abstract TrainerProfile5 GamestatsGetProfile5(int pid);
    method BattleSubwayUpdateRecord5 (line 186) | public abstract ulong BattleSubwayUpdateRecord5(BattleSubwayRecord5 re...
    method BattleSubwayAddLeader5 (line 187) | public abstract ulong BattleSubwayAddLeader5(BattleSubwayRecord5 record);
    method BattleSubwayGetOpponents5 (line 188) | public abstract BattleSubwayRecord5[] BattleSubwayGetOpponents5(Pokede...
    method BattleSubwayGetLeaders5 (line 189) | public abstract BattleSubwayProfile5[] BattleSubwayGetLeaders5(Pokedex...
    method DressupUpload4 (line 197) | public abstract ulong DressupUpload4(DressupRecord4 record);
    method DressupSearch4 (line 198) | public abstract DressupRecord4[] DressupSearch4(ushort species, int co...
    method BoxUpload4 (line 200) | public abstract ulong BoxUpload4(BoxRecord4 record);
    method BoxSearch4 (line 201) | public abstract BoxRecord4[] BoxSearch4(BoxLabels4 label, int count);
    method BattleVideoUpload4 (line 203) | public abstract ulong BattleVideoUpload4(BattleVideoRecord4 record);
    method BattleVideoSearch4 (line 204) | public abstract BattleVideoHeader4[] BattleVideoSearch4(ushort species...
    method BattleVideoGet4 (line 205) | public abstract BattleVideoRecord4 BattleVideoGet4(ulong serial, bool ...
    method BattleVideoFlagSaved4 (line 206) | public abstract bool BattleVideoFlagSaved4(ulong serial);
    method BattleVideoCount4 (line 208) | public abstract ulong BattleVideoCount4();
    method TrainerRankingsPerformRollover (line 217) | public abstract bool TrainerRankingsPerformRollover();
    method TrainerRankingsGetActiveRecordTypes (line 223) | public abstract IList<TrainerRankingsRecordTypes> TrainerRankingsGetAc...
    method TrainerRankingsSubmit (line 229) | public abstract void TrainerRankingsSubmit(TrainerRankingsSubmission s...
    method TrainerRankingsGetReport (line 238) | public abstract TrainerRankingsReport[] TrainerRankingsGetReport(DateT...
    method TrainerRankingsGetReport (line 246) | public TrainerRankingsReport[] TrainerRankingsGetReport(DateTime start...
    method TrainerRankingsGetReport (line 256) | public TrainerRankingsReport TrainerRankingsGetReport(DateTime during)
    method TrainerRankingsGetReport (line 265) | public TrainerRankingsReport TrainerRankingsGetReport()
    method TrainerRankingsGetPendingReport (line 274) | public abstract TrainerRankingsReport TrainerRankingsGetPendingReport();
    method MusicalUpload5 (line 282) | public abstract ulong MusicalUpload5(MusicalRecord5 record);
    method MusicalSearch5 (line 283) | public abstract MusicalRecord5[] MusicalSearch5(ushort species, int co...
    method BattleVideoUpload5 (line 285) | public abstract ulong BattleVideoUpload5(BattleVideoRecord5 record);
    method BattleVideoSearch5 (line 286) | public abstract BattleVideoHeader5[] BattleVideoSearch5(ushort species...
    method BattleVideoGet5 (line 287) | public abstract BattleVideoRecord5 BattleVideoGet5(ulong serial, bool ...
    method BattleVideoFlagSaved5 (line 288) | public abstract bool BattleVideoFlagSaved5(ulong serial);
    method BattleVideoCount5 (line 290) | public abstract ulong BattleVideoCount5();
    method PokedexInsertSpecies (line 294) | public abstract void PokedexInsertSpecies(Species s);
    method PokedexInsertForm (line 295) | public abstract void PokedexInsertForm(Form f);
    method PokedexInsertFormStats (line 296) | public abstract void PokedexInsertFormStats(FormStats f);
    method PokedexInsertFormAbilities (line 297) | public abstract void PokedexInsertFormAbilities(FormAbilities f);
    method PokedexInsertFamily (line 298) | public abstract void PokedexInsertFamily(Family f);
    method PokedexInsertEvolution (line 299) | public abstract void PokedexInsertEvolution(Evolution f);
    method PokedexInsertType (line 301) | public abstract void PokedexInsertType(PkmnFoundations.Pokedex.Type t);
    method PokedexInsertItem (line 302) | public abstract void PokedexInsertItem(Item i);
    method PokedexInsertMove (line 303) | public abstract void PokedexInsertMove(Move m);
    method PokedexInsertAbility (line 304) | public abstract void PokedexInsertAbility(Ability a);
    method PokedexInsertRibbon (line 305) | public abstract void PokedexInsertRibbon(Ribbon r);
    method PokedexInsertRegion (line 307) | public abstract void PokedexInsertRegion(Region r);
    method PokedexInsertLocation (line 308) | public abstract void PokedexInsertLocation(Location l);
    method PokedexGetAllSpecies (line 313) | public abstract List<Species> PokedexGetAllSpecies(Pokedex.Pokedex pok...
    method PokedexGetAllForms (line 314) | public abstract List<Form> PokedexGetAllForms(Pokedex.Pokedex pokedex);
    method PokedexGetAllFormStats (line 315) | public abstract List<FormStats> PokedexGetAllFormStats(Pokedex.Pokedex...
    method PokedexGetAllFormAbilities (line 316) | public abstract List<FormAbilities> PokedexGetAllFormAbilities(Pokedex...
    method PokedexGetAllFamilies (line 317) | public abstract List<Family> PokedexGetAllFamilies(Pokedex.Pokedex pok...
    method PokedexGetAllEvolutions (line 318) | public abstract List<Evolution> PokedexGetAllEvolutions(Pokedex.Pokede...
    method PokedexGetAllTypes (line 320) | public abstract List<Pokedex.Type> PokedexGetAllTypes(Pokedex.Pokedex ...
    method PokedexGetAllItems (line 321) | public abstract List<Item> PokedexGetAllItems(Pokedex.Pokedex pokedex);
    method PokedexGetAllMoves (line 322) | public abstract List<Move> PokedexGetAllMoves(Pokedex.Pokedex pokedex);
    method PokedexGetAllAbilities (line 323) | public abstract List<Ability> PokedexGetAllAbilities(Pokedex.Pokedex p...
    method PokedexGetAllRibbons (line 324) | public abstract List<Ribbon> PokedexGetAllRibbons(Pokedex.Pokedex poke...
    method PokedexGetAllRegions (line 326) | public abstract List<Region> PokedexGetAllRegions(Pokedex.Pokedex poke...
    method PokedexGetAllLocations (line 327) | public abstract List<Location> PokedexGetAllLocations(Pokedex.Pokedex ...

FILE: library/Data/DatabaseExtender.cs
  class DatabaseExtender (line 14) | public static class DatabaseExtender
    method ExecuteDataTable (line 21) | public static DataTable ExecuteDataTable(this DbCommand cmd)
    method ExecuteDataTable (line 35) | public static DataTable ExecuteDataTable(this DbConnection db, string ...
    method ExecuteDataTable (line 49) | public static DataTable ExecuteDataTable(this DbConnection db, string ...
    method ExecuteDataTable (line 63) | public static DataTable ExecuteDataTable(this DbTransaction tran, stri...
    method ExecuteDataTable (line 77) | public static DataTable ExecuteDataTable(this DbTransaction tran, stri...
    method ExecuteReader (line 91) | public static IDataReader ExecuteReader(this DbConnection db, string s...
    method ExecuteReader (line 108) | public static IDataReader ExecuteReader(this DbConnection db, string s...
    method ExecuteReader (line 119) | public static IDataReader ExecuteReader(this DbTransaction tran, strin...
    method ExecuteReader (line 135) | public static IDataReader ExecuteReader(this DbTransaction tran, strin...
    method ExecuteScalar (line 146) | public static object ExecuteScalar(this DbConnection db, string sqlstr...
    method ExecuteNonQuery (line 160) | public static int ExecuteNonQuery(this DbConnection db, string sqlstr,...
    method ExecuteScalar (line 174) | public static object ExecuteScalar(this DbTransaction tran, string sql...
    method ExecuteNonQuery (line 189) | public static int ExecuteNonQuery(this DbTransaction tran, string sqls...
    method GetStringOrDefault (line 207) | public static string GetStringOrDefault(this IDataReader reader, int c...
    method GetStringOrDefault (line 218) | public static string GetStringOrDefault(this IDataReader reader, int c...
    method GetStringOrDefault (line 230) | public static string GetStringOrDefault(this IDataReader reader, strin...
    method GetStringOrDefault (line 241) | public static string GetStringOrDefault(this IDataReader reader, strin...
    method GetBytes (line 246) | public static void GetBytes(this IDataReader reader, string column, lo...
    method GetByteArray (line 251) | public static byte[] GetByteArray(this IDataReader reader, int column)
    method GetByteArray (line 274) | public static byte[] GetByteArray(this IDataReader reader, int column,...
    method GetByteArray (line 281) | public static byte[] GetByteArray(this IDataReader reader, string column)
    method GetByteArray (line 286) | public static byte[] GetByteArray(this IDataReader reader, string colu...
    method IsDBNull (line 291) | public static bool IsDBNull(this IDataReader reader, string column)
    method Cast (line 297) | public static T Cast<T>(object value)
    method Collect (line 303) | public static List<T> Collect<T>(this IDataReader reader, Func<IDataRe...
    method ExecuteCollection (line 315) | public static List<T> ExecuteCollection<T>(this DbConnection conn, str...
    method ExecuteCollection (line 320) | public static List<T> ExecuteCollection<T>(this DbTransaction tran, st...
    method ExecuteCollection (line 325) | public static List<T> ExecuteCollection<T>(this DbCommand cmd, Func<ID...

FILE: library/Data/MySqlDatabaseExtender.cs
  class MySqlDatabaseExtender (line 10) | public static class MySqlDatabaseExtender
    method CloneParameters (line 19) | public static MySqlParameter[] CloneParameters(this IEnumerable<MySqlP...
    method CloneParameter (line 34) | public static MySqlParameter CloneParameter(this MySqlParameter param)
    method ExecuteProcedure (line 51) | public static object ExecuteProcedure(this MySqlConnection db, string ...
    method ExecuteProcedure (line 62) | public static int ExecuteProcedure(this MySqlConnection db, string nam...
    method ExecuteProcedure (line 78) | public static object ExecuteProcedure(this MySqlTransaction tran, stri...
    method ExecuteProcedure (line 91) | public static int ExecuteProcedure(this MySqlTransaction tran, string ...
    method ExecuteProcedureInternal (line 101) | private static object ExecuteProcedureInternal(MySqlCommand cmd, strin...

FILE: library/Data/SqlDatabaseExtender.cs
  class SqlDatabaseExtender (line 10) | public static class SqlDatabaseExtender
    method CloneParameters (line 19) | public static SqlParameter[] CloneParameters(this IEnumerable<SqlParam...
    method ExecuteProcedure (line 43) | public static object ExecuteProcedure(this SqlConnection db, string na...
    method ExecuteProcedure (line 54) | public static int ExecuteProcedure(this SqlConnection db, string name,...
    method ExecuteProcedure (line 70) | public static object ExecuteProcedure(this SqlTransaction tran, string...
    method ExecuteProcedure (line 83) | public static int ExecuteProcedure(this SqlTransaction tran, string na...
    method ExecuteProcedureInternal (line 93) | private static object ExecuteProcedureInternal(SqlCommand cmd, string ...

FILE: library/Pokedex/Ability.cs
  class Ability (line 10) | public class Ability : PokedexRecordBase
    method Ability (line 12) | public Ability(Pokedex pokedex, int value, LocalizedString name)
    method Ability (line 20) | public Ability(Pokedex pokedex, IDataReader reader)
    method CreatePair (line 32) | public static LazyKeyValuePair<int, Ability> CreatePair(Pokedex pokedex)

FILE: library/Pokedex/Evolution.cs
  class Evolution (line 8) | public class Evolution //: PokedexRecordBase

FILE: library/Pokedex/Family.cs
  class Family (line 10) | public class Family : PokedexRecordBase
    method Family (line 12) | public Family(Pokedex pokedex, int id, int basic_male_id, int basic_fe...
    method Family (line 36) | public Family(Pokedex pokedex, IDataReader reader)
    method CreatePair (line 104) | public static LazyKeyValuePair<int, Family> CreatePair(Pokedex pokedex)

FILE: library/Pokedex/Form.cs
  class Form (line 11) | public class Form : PokedexRecordBase
    method Form (line 13) | public Form(Pokedex pokedex, int id, int species_id, byte value,
    method Form (line 30) | public Form(Pokedex pokedex, IDataReader reader)
    method PrefetchRelations (line 45) | internal override void PrefetchRelations()
    method BaseStats (line 72) | public FormStats BaseStats(Generations generation)
    method Abilities (line 82) | public FormAbilities Abilities(Generations generation)
    method CreatePair (line 89) | public static LazyKeyValuePair<int, Form> CreatePair(Pokedex pokedex)
    method CreatePairForSpecies (line 96) | public static LazyKeyValuePair<byte, Form> CreatePairForSpecies(Pokede...

FILE: library/Pokedex/FormAbilities.cs
  class FormAbilities (line 12) | public class FormAbilities : PokedexRecordBase
    method FormAbilities (line 14) | public FormAbilities(Pokedex pokedex, int form_id, Generations min_gen...
    method FormAbilities (line 33) | public FormAbilities(Pokedex pokedex, IDataReader reader)

FILE: library/Pokedex/FormStats.cs
  class FormStats (line 11) | public class FormStats : PokedexRecordBase
    method FormStats (line 13) | public FormStats(Pokedex pokedex, int form_id, Generations min_generat...
    method FormStats (line 33) | public FormStats(Pokedex pokedex, IDataReader reader)

FILE: library/Pokedex/Item.cs
  class Item (line 11) | public class Item : PokedexRecordBase
    method Item (line 13) | public Item(Pokedex pokedex, int id, int ? value3, int ? value4,
    method Item (line 29) | public Item(Pokedex pokedex, IDataReader reader)
    method Value (line 52) | public int ? Value(Generations generation)
    method CreatePair (line 76) | public static LazyKeyValuePair<int, Item> CreatePair(Pokedex pokedex)
    method CreatePairForGeneration (line 83) | public static LazyKeyValuePair<int, Item> CreatePairForGeneration(Poke...
    method CreatePairPokeball (line 90) | public static LazyKeyValuePair<int, Item> CreatePairPokeball(Pokedex p...

FILE: library/Pokedex/Location.cs
  class Location (line 12) | public class Location : PokedexRecordBase
    method Location (line 14) | public Location(Pokedex pokedex, int id, int region_id, int ? value3,
    method Location (line 33) | public Location(Pokedex pokedex, IDataReader reader)
    method Value (line 71) | public int? Value(Generations generation)
    method Value (line 77) | public int ? Value(LocationNumbering numbering)
    method GenerationToLocationNumbering (line 101) | public static LocationNumbering GenerationToLocationNumbering(Generati...
    method CreatePair (line 122) | public static LazyKeyValuePair<int, Location> CreatePair(Pokedex pokedex)
    method CreatePairForGeneration (line 129) | public static LazyKeyValuePair<int, Location> CreatePairForGeneration(...
    method CreatePairForLocationNumbering (line 144) | public static LazyKeyValuePair<int, Location> CreatePairForLocationNum...

FILE: library/Pokedex/Move.cs
  class Move (line 11) | public class Move : PokedexRecordBase
    method Move (line 13) | public Move(Pokedex pokedex, int id, int type_id, LocalizedString name,
    method Move (line 33) | public Move(Pokedex pokedex, IDataReader reader)
    method CreatePair (line 69) | public static LazyKeyValuePair<int, Move> CreatePair(Pokedex pokedex)

FILE: library/Pokedex/Pokedex.cs
  class Pokedex (line 11) | public class Pokedex
    method Pokedex (line 13) | public Pokedex(Database db, bool lazy)
    method GetAllData (line 22) | private void GetAllData(Database db)
    method BuildAdditionalIndexes (line 42) | private void BuildAdditionalIndexes()
    method ProcessGenerationalChangeset (line 96) | private Dictionary<int, SortedList<Generations, T>> ProcessGenerationa...
    method AddGeneration (line 132) | private void AddGeneration<TGen, TKey, TValue>(Dictionary<TGen, Dictio...
    method PrefetchRelations (line 140) | private void PrefetchRelations()
    method FormsByValue (line 227) | internal Dictionary<byte, Form> FormsByValue(int national_dex)
    method FormStats (line 232) | internal SortedList<Generations, FormStats> FormStats(int form_id)
    method FormAbilities (line 237) | internal SortedList<Generations, FormAbilities> FormAbilities(int form...
    method ItemsByGeneration (line 250) | public IDictionary<int, Item> ItemsByGeneration(Generations generation)
    method RibbonsByGeneration (line 295) | public IDictionary<int, Ribbon> RibbonsByGeneration(Generations genera...
    method LocationsByGeneration (line 316) | public IDictionary<int, Location> LocationsByGeneration(LocationNumber...
    method SpeciesAtGeneration (line 321) | public static int SpeciesAtGeneration(Generations generation)

FILE: library/Pokedex/PokedexRecordBase.cs
  class PokedexRecordBase (line 10) | public class PokedexRecordBase
    method PokedexRecordBase (line 12) | internal PokedexRecordBase(Pokedex pokedex)
    method PrefetchRelations (line 21) | internal virtual void PrefetchRelations()
    method LocalizedStringFromReader (line 27) | public static LocalizedString LocalizedStringFromReader(IDataReader re...

FILE: library/Pokedex/Region.cs
  class Region (line 10) | public class Region : PokedexRecordBase
    method Region (line 12) | public Region(Pokedex pokedex, int id, LocalizedString name) : base(po...
    method Region (line 18) | public Region(Pokedex pokedex, IDataReader reader)
    method CreatePair (line 26) | public static LazyKeyValuePair<int, Region> CreatePair(Pokedex pokedex)

FILE: library/Pokedex/Ribbon.cs
  class Ribbon (line 11) | public class Ribbon : PokedexRecordBase
    method Ribbon (line 13) | public Ribbon(Pokedex pokedex, int id, LocalizedString name,
    method Ribbon (line 32) | public Ribbon(Pokedex pokedex, IDataReader reader) :
    method Position (line 60) | public int? Position(Generations generation)
    method Value (line 79) | public int? Value(Generations generation)

FILE: library/Pokedex/Species.cs
  class Species (line 11) | public class Species : PokedexRecordBase
    method Species (line 13) | public Species(Pokedex pokedex, int national_dex, int family_id, Local...
    method Species (line 34) | public Species(Pokedex pokedex, IDataReader reader)
    method PrefetchRelations (line 50) | internal override void PrefetchRelations()
    method Forms (line 83) | public Form Forms(byte value)
    method CreatePair (line 90) | public static LazyKeyValuePair<int, Species> CreatePair(Pokedex pokedex)

FILE: library/Pokedex/Type.cs
  class Type (line 11) | public class Type : PokedexRecordBase
    method Type (line 13) | public Type(Pokedex pokedex, int id, LocalizedString name, DamageClass...
    method Type (line 21) | public Type(Pokedex pokedex, IDataReader reader)
    method CreatePair (line 35) | public static LazyKeyValuePair<int, Type> CreatePair(Pokedex pokedex)

FILE: library/Structures/ByteStatValues.cs
  class ByteStatValues (line 8) | public class ByteStatValues : StatValues<byte>
    method ByteStatValues (line 10) | public ByteStatValues(byte hp, byte attack, byte defense, byte speed, ...
    method ByteStatValues (line 15) | public ByteStatValues(IEnumerable<byte> s) : base(s)

FILE: library/Structures/ContestStatValues.cs
  class ConditionValues (line 8) | public class ConditionValues : StatValuesBase<byte>
    method ConditionValues (line 10) | public ConditionValues(byte cool, byte beauty, byte cute, byte smart, ...
    method ConditionsIndex (line 23) | public static int ConditionsIndex(Conditions condition)

FILE: library/Structures/Enums.cs
  type Generations (line 8) | public enum Generations
  type GenerationFlags (line 20) | [Flags]
  type LocationNumbering (line 33) | public enum LocationNumbering
  type Versions (line 45) | public enum Versions : byte
  type Languages (line 74) | public enum Languages : byte
  type EvolutionTriggers (line 85) | public enum EvolutionTriggers
  type TimeOfDay (line 93) | public enum TimeOfDay
  type Stats (line 100) | public enum Stats
  type StatFlags (line 110) | [Flags]
  type Potential (line 122) | public enum Potential
  type Conditions (line 130) | public enum Conditions
  type DamageClass (line 140) | public enum DamageClass
  type GrowthRates (line 148) | public enum GrowthRates
  type Genders (line 158) | public enum Genders : byte
  type TrainerGenders (line 166) | public enum TrainerGenders : byte
  type Markings (line 172) | [Flags]
  type EggGroups (line 183) | public enum EggGroups : byte
  type BattleTargets (line 203) | public enum BattleTargets : byte
  type Natures (line 223) | public enum Natures : uint
  type Pokerus (line 232) | public enum Pokerus
  type ShinyLeaves (line 239) | [Flags]

FILE: library/Structures/Format.cs
  class Format (line 8) | public static class Format
    method Markings (line 12) | public static string Markings(Markings markings, string trueFormat, st...
    method GenderSymbol (line 28) | public static string GenderSymbol(Genders gender)
    method ToIso639_1 (line 41) | public static string ToIso639_1(Languages lang)
    method FromIso639_1 (line 64) | public static Languages FromIso639_1(string lang)

FILE: library/Structures/IntStatValues.cs
  class IntStatValues (line 8) | public class IntStatValues : StatValues<int>
    method IntStatValues (line 10) | public IntStatValues(int hp, int attack, int defense, int speed, int s...
    method IntStatValues (line 15) | public IntStatValues(IEnumerable<int> s) : base(s)

FILE: library/Structures/IvStatValues.cs
  class IvStatValues (line 8) | public class IvStatValues : ByteStatValues
    method IvStatValues (line 10) | public IvStatValues(byte hp, byte attack, byte defense, byte speed, by...
    method IvStatValues (line 15) | public IvStatValues(IEnumerable<byte> s) : base(s)
    method IvStatValues (line 23) | public IvStatValues(int ivs) : base(new byte[6])
    method ToInt32 (line 45) | public int ToInt32()
    method UnpackIV (line 57) | public static byte UnpackIV(uint ivs, Stats stat)
    method PackIVs (line 63) | public static uint PackIVs(byte HP, byte Attack, byte Defense, byte Sp...
  type JudgeSummary (line 115) | public struct JudgeSummary
    method JudgeSummary (line 122) | public JudgeSummary(Potential overall_potential, StatFlags best_ivs, P...

FILE: library/Structures/MoveSlot.cs
  class MoveSlot (line 10) | public class MoveSlot
    method MoveSlot (line 12) | public MoveSlot(Pokedex.Pokedex pokedex, int moveId, byte ppUps, byte ...
    method Initialize (line 22) | public void Initialize()

FILE: library/Structures/Pokemon4.cs
  class Pokemon4 (line 12) | public class Pokemon4 : PokemonPartyBase
    method Pokemon4 (line 14) | public Pokemon4(Pokedex.Pokedex pokedex) : base(pokedex)
    method Pokemon4 (line 19) | public Pokemon4(Pokedex.Pokedex pokedex, BinaryReader data) : base(pok...
    method Pokemon4 (line 25) | public Pokemon4(Pokedex.Pokedex pokedex, byte[] data) : base(pokedex)
    method Pokemon4 (line 31) | public Pokemon4(Pokedex.Pokedex pokedex, byte[] data, int offset) : ba...
    method Initialize (line 37) | private void Initialize()
    method Load (line 41) | protected override void Load(BinaryReader reader)
    method Save (line 175) | protected override void Save(BinaryWriter writer)
    method IsPlatHgss (line 297) | private bool IsPlatHgss()
    method IsHgss (line 302) | private bool IsHgss()
    method IsHgssPokeball (line 307) | private static bool IsHgssPokeball(int pokeballId)
    method ValidateActual (line 325) | public static ValidationSummary ValidateActual(PokemonBase thePokemon)

FILE: library/Structures/Pokemon5.cs
  class Pokemon5 (line 12) | public class Pokemon5 : PokemonPartyBase
    method Pokemon5 (line 14) | public Pokemon5(Pokedex.Pokedex pokedex) : base(pokedex)
    method Pokemon5 (line 19) | public Pokemon5(Pokedex.Pokedex pokedex, BinaryReader data) : base(pok...
    method Pokemon5 (line 25) | public Pokemon5(Pokedex.Pokedex pokedex, byte[] data) : base(pokedex)
    method Pokemon5 (line 31) | public Pokemon5(Pokedex.Pokedex pokedex, byte[] data, int offset)
    method Initialize (line 38) | private void Initialize()
    method Load (line 42) | protected override void Load(BinaryReader reader)
    method Save (line 177) | protected override void Save(BinaryWriter writer)
    method IsBw2 (line 298) | private bool IsBw2()
    method ValidateActual (line 308) | public static ValidationSummary ValidateActual(PokemonBase thePokemon)

FILE: library/Structures/PokemonBase.cs
  class PokemonBase (line 12) | public abstract class PokemonBase : BinarySerializableBase
    method PokemonBase (line 14) | public PokemonBase(Pokedex.Pokedex pokedex)
    method Initialize (line 21) | private void Initialize()
    method ShinyTest (line 151) | public static bool ShinyTest(uint personality, uint trainerId, int tri...
    method Validate (line 181) | public virtual ValidationSummary Validate()
    method BlockScramble (line 201) | protected static List<int> BlockScramble(uint personality)
    method Invert (line 229) | protected static List<int> Invert(List<int> arg)
    method ExperienceAt (line 242) | public static int ExperienceAt(int level, GrowthRates gr)
    method LevelAt (line 264) | public static byte LevelAt(int experience, GrowthRates gr)
    method ExperienceAt_Slow (line 292) | private static int ExperienceAt_Slow(int level)
    method ExperienceAt_Medium (line 298) | private static int ExperienceAt_Medium(int level)
    method ExperienceAt_Fast (line 304) | private static int ExperienceAt_Fast(int level)
    method ExperienceAt_MediumSlow (line 310) | private static int ExperienceAt_MediumSlow(int level)
    method ExperienceAt_Erratic (line 317) | private static int ExperienceAt_Erratic(int level)
    method ExperienceAt_Fluctuating (line 332) | private static int ExperienceAt_Fluctuating(int level)
  type Characteristic (line 346) | public struct Characteristic
    method Characteristic (line 351) | public Characteristic(Stats best_iv, byte best_iv_modulo)
    method ToString (line 367) | public override string ToString()

FILE: library/Structures/PokemonParty4.cs
  class PokemonParty4 (line 9) | public class PokemonParty4 : Pokemon4
    method PokemonParty4 (line 11) | public PokemonParty4(Pokedex.Pokedex pokedex) : base(pokedex)
    method PokemonParty4 (line 16) | public PokemonParty4(Pokedex.Pokedex pokedex, BinaryReader data) : bas...
    method PokemonParty4 (line 22) | public PokemonParty4(Pokedex.Pokedex pokedex, byte[] data) : base(poke...
    method PokemonParty4 (line 28) | public PokemonParty4(Pokedex.Pokedex pokedex, byte[] data, int offset)
    method Initialize (line 35) | private void Initialize()
    method Load (line 39) | protected override void Load(BinaryReader reader)

FILE: library/Structures/PokemonParty5.cs
  class PokemonParty5 (line 9) | public class PokemonParty5 : Pokemon5
    method PokemonParty5 (line 11) | public PokemonParty5(Pokedex.Pokedex pokedex) : base(pokedex)
    method PokemonParty5 (line 16) | public PokemonParty5(Pokedex.Pokedex pokedex, BinaryReader data) : bas...
    method PokemonParty5 (line 22) | public PokemonParty5(Pokedex.Pokedex pokedex, byte[] data) : base(poke...
    method PokemonParty5 (line 28) | public PokemonParty5(Pokedex.Pokedex pokedex, byte[] data, int offset)
    method Initialize (line 35) | private void Initialize()
    method Load (line 39) | protected override void Load(BinaryReader reader)

FILE: library/Structures/PokemonPartyBase.cs
  class PokemonPartyBase (line 10) | public abstract class PokemonPartyBase : PokemonBase
    method PokemonPartyBase (line 12) | public PokemonPartyBase(Pokedex.Pokedex pokedex)
    method Initialize (line 18) | private void Initialize()
    method ComputeChecksum (line 167) | public static ushort ComputeChecksum(byte[] data)
    method ComputeChecksum (line 176) | public static ushort ComputeChecksum(byte[][] data)
    method DecryptRNG (line 181) | protected static int DecryptRNG(int prev)
    method DecryptBlocks (line 186) | protected static void DecryptBlocks(byte[][] blocks, ushort checksum)
    method ShuffleBlocks (line 202) | protected static void ShuffleBlocks(byte[][] blocks, uint personality,...
    method HasRibbon (line 218) | public static bool HasRibbon(byte[] ribbons, int value)
    method TrainerMemoDateTime (line 226) | protected static DateTime? TrainerMemoDateTime(byte[] data)

FILE: library/Structures/StatValues.cs
  class StatValues (line 8) | public class StatValues<T> : StatValuesBase<T> where T : struct
    method StatValues (line 10) | public StatValues(T hp, T attack, T defense, T speed, T special_attack...
    method StatValues (line 16) | public StatValues(IEnumerable<T> s) : base(s)
    method StatsIndex (line 27) | public static int StatsIndex(Stats stat)
    method ToString (line 48) | public override string ToString()

FILE: library/Structures/StatValuesBase.cs
  class StatValuesBase (line 8) | public abstract class StatValuesBase<T> where T : struct
    method StatValuesBase (line 10) | protected StatValuesBase(IEnumerable<T> s)
    method StatValuesBase (line 19) | protected StatValuesBase(T s0, T s1, T s2, T s3, T s4, T s5)
    method ToArray (line 26) | public T[] ToArray()

FILE: library/Structures/TrainerMemo.cs
  class TrainerMemo (line 10) | public class TrainerMemo
    method TrainerMemo (line 12) | public TrainerMemo(Pokedex.Pokedex pokedex, LocationNumbering numbering,
    method ToString (line 71) | public override String ToString()
    method LocationToString (line 87) | private String LocationToString(Location l, int id)

FILE: library/Support/AliasTable.cs
  class AliasTable (line 11) | public class AliasTable<Type>
    method NewWithWeights (line 13) | public static AliasTable<Type> NewWithWeights(Dictionary<Type, double>...
    method Sample (line 80) | public Type Sample()
    method AliasTable (line 96) | private AliasTable(Dictionary<Type, Type> table, List<Type> elem, Dict...

FILE: library/Support/AssertHelper.cs
  class AssertHelper (line 9) | public class AssertHelper
    method Assert (line 11) | public static void Assert(bool condition, String message)
    method Assert (line 20) | public static void Assert(bool condition)
    method Unreachable (line 25) | public static void Unreachable()
    method Equals (line 30) | public static void Equals<T>(T first, T second) where T : IEquatable<T>

FILE: library/Support/BinarySerializableBase.cs
  class BinarySerializableBase (line 13) | public abstract class BinarySerializableBase : ISerializable
    method BinarySerializableBase (line 17) | public BinarySerializableBase()
    method BinarySerializableBase (line 21) | public BinarySerializableBase(SerializationInfo info, StreamingContext...
    method GetObjectData (line 27) | public void GetObjectData(SerializationInfo info, StreamingContext con...
    method Save (line 32) | protected abstract void Save(BinaryWriter writer);
    method Load (line 33) | protected abstract void Load(BinaryReader reader);
    method Save (line 43) | public byte[] Save()
    method Load (line 50) | public void Load(byte[] data, int offset)
    method Load (line 58) | public void Load(byte[] data)

FILE: library/Support/EncodedString4.cs
  class EncodedString4 (line 9) | public class EncodedString4 : EncodedStringBase
    method EncodedString4 (line 15) | public EncodedString4(byte[] data) : base(data)
    method EncodedString4 (line 25) | public EncodedString4(byte[] data, int start, int length) : base(data,...
    method EncodedString4 (line 34) | public EncodedString4(string text, int length) : base(text, length)
    method DecodeString_impl (line 39) | public static string DecodeString_impl(byte[] data, int start, int count)
    method DecodeString_impl (line 60) | public static string DecodeString_impl(byte[] data)
    method EncodeString_impl (line 65) | public static byte[] EncodeString_impl(string str, int size)
    method DecodeString (line 83) | protected override string DecodeString(byte[] data, int start, int count)
    method EncodeString (line 88) | protected override byte[] EncodeString(string str, int size)
    method Clone (line 107) | public EncodedString4 Clone()

FILE: library/Support/EncodedString5.cs
  class EncodedString5 (line 9) | public class EncodedString5 : EncodedStringBase
    method EncodedString5 (line 15) | public EncodedString5(byte[] data) : base(data)
    method EncodedString5 (line 25) | public EncodedString5(byte[] data, int start, int length) : base(data,...
    method EncodedString5 (line 34) | public EncodedString5(string text, int length) : base(text, length)
    method DecodeString_impl (line 39) | public static string DecodeString_impl(byte[] data, int start, int count)
    method DecodeString_impl (line 60) | public static string DecodeString_impl(byte[] data)
    method EncodeString_impl (line 65) | public static byte[] EncodeString_impl(string str, int size)
    method DecodeString (line 83) | protected override string DecodeString(byte[] data, int start, int count)
    method EncodeString (line 88) | protected override byte[] EncodeString(string str, int size)
    method ToString (line 94) | public override string ToString()
    method Clone (line 99) | public EncodedString5 Clone()

FILE: library/Support/EncodedStringBase.cs
  class EncodedStringBase (line 8) | public abstract class EncodedStringBase
    method EncodedStringBase (line 10) | public EncodedStringBase()
    method EncodedStringBase (line 15) | public EncodedStringBase(byte[] data) : this()
    method EncodedStringBase (line 26) | public EncodedStringBase(byte[] data, int start, int length)
    method EncodedStringBase (line 43) | public EncodedStringBase(string text, int length)
    method AssignData (line 93) | protected virtual void AssignData(byte[] data)
    method AssignText (line 99) | protected virtual void AssignText(string text)
    method DecodeString (line 105) | protected abstract string DecodeString(byte[] data, int start, int cou...
    method EncodeString (line 107) | protected abstract byte[] EncodeString(string str, int size);
    method ToString (line 109) | public override string ToString()

FILE: library/Support/EnumerableExtender.cs
  class EnumerableExtender (line 8) | public static class EnumerableExtender
    method OrderByLambda (line 10) | public static IEnumerable<T> OrderByLambda<T>(this IEnumerable<T> arg,...
    class LambdaComparer (line 16) | private class LambdaComparer<T> : IComparer<T>
      method LambdaComparer (line 18) | public LambdaComparer(Func<T, T, int> comparer)
      method Compare (line 25) | public int Compare(T first, T second)
    method DrawWithoutReplacement (line 31) | public static IEnumerable<T> DrawWithoutReplacement<T>(this IEnumerabl...

FILE: library/Support/GameSyncUtils.cs
  class GameSyncUtils (line 8) | public static class GameSyncUtils
    method GameSyncCrc16 (line 10) | private static ushort GameSyncCrc16(int val)
    method PidToGsid (line 60) | public static string PidToGsid(int pid)
    method GsidToPid (line 65) | public static int GsidToPid(string gsid)
    method Base32Encode (line 74) | public static string Base32Encode(long value)
    method Base32Decode (line 86) | public static long Base32Decode(string value)

FILE: library/Support/Indexer1d.cs
  class Indexer1d (line 11) | public class Indexer1d<TKey, TValue> : IReadOnlyIndexer1d<TKey, TValue>,...
    method Indexer1d (line 13) | public Indexer1d(Getter1d<TKey, TValue> getter, Setter1d<TKey, TValue>...
  class ReadOnlyIndexer1d (line 35) | public class ReadOnlyIndexer1d<TKey, TValue> : IReadOnlyIndexer1d<TKey, ...
    method ReadOnlyIndexer1d (line 37) | public ReadOnlyIndexer1d(Getter1d<TKey, TValue> getter)
  type IReadOnlyIndexer1d (line 53) | public interface IReadOnlyIndexer1d<in TKey, out TValue>
  type IWriteOnlyIndexer1d (line 58) | public interface IWriteOnlyIndexer1d<in TKey, in TValue>

FILE: library/Support/LazyKeyValuePair.cs
  class LazyKeyValuePair (line 8) | public class LazyKeyValuePair<TKey, TValue> : ILazyKeyValuePair<TKey, TV...
    method LazyKeyValuePair (line 10) | public LazyKeyValuePair(Func<TKey, TValue> evaluator, Func<TValue, TKe...
    method EvaluateKey (line 54) | public void EvaluateKey()
    method Evaluate (line 63) | public void Evaluate()
    method InvalidateKey (line 75) | public void InvalidateKey()
    method Invalidate (line 84) | public void Invalidate()
  type ILazyKeyValuePair (line 91) | public interface ILazyKeyValuePair<out TKey, out TValue>
    method EvaluateKey (line 95) | void EvaluateKey();
    method Evaluate (line 96) | void Evaluate();

FILE: library/Support/LocalizedString.cs
  class LocalizedString (line 9) | public class LocalizedString : Dictionary<string, string>
    method LocalizedString (line 11) | public LocalizedString()
    method ToString (line 16) | public string ToString(string lang)
    method ToString (line 42) | public override string ToString()

FILE: library/Support/LogHelper.cs
  class LogHelper (line 10) | public static class LogHelper
    method LogHelper (line 12) | static LogHelper()
    method Write (line 17) | public static void Write(String message, EventLogEntryType type, int e...
    method Write (line 48) | public static void Write(String message, EventLogEntryType type)
    method Write (line 53) | public static void Write(String message)
    method UseStandardOutput (line 58) | public static void UseStandardOutput()
    method UseStandardError (line 64) | public static void UseStandardError()
    method UseFile (line 70) | public static void UseFile(String filename)
    method UseEventLog (line 78) | public static void UseEventLog(EventLog event_log)
  type EventLogTypes (line 95) | public enum EventLogTypes

FILE: library/Support/StreamExtender.cs
  class StreamExtender (line 9) | public static class StreamExtender
    method ReadBlock (line 20) | public static int ReadBlock(this Stream s, byte[] buffer, int offset, ...
    method ReadBlock (line 41) | public static int ReadBlock(this BinaryReader r, byte[] buffer, int of...
    method CompatibleCopyTo (line 53) | public static void CompatibleCopyTo(this Stream src, Stream dest)
    method WriteBytes (line 64) | public static void WriteBytes(this Stream s, byte[] buffer)

FILE: library/Support/StringHelper.cs
  class StringHelper (line 9) | public static class StringHelper
    method BytesToString (line 11) | public static String BytesToString(byte[] data, Encoding encoding)
    method BytesToString (line 18) | public static String BytesToString(byte[] data, int start, int length,...

FILE: library/Support/TrendyPhrase4.cs
  class TrendyPhrase4 (line 8) | public class TrendyPhrase4 : TrendyPhraseBase
    method TrendyPhrase4 (line 10) | public TrendyPhrase4(byte[] data) : base(data)
    method TrendyPhrase4 (line 14) | public TrendyPhrase4(ushort mood, ushort index, ushort word1, ushort w...
    method Render (line 19) | public override string Render(string wordFormat)
    method RenderPhrase (line 24) | public static string RenderPhrase(byte[] data, string wordFormat)
    method RenderWord (line 42) | public static string RenderWord(ushort word)
    method Clone (line 58) | public TrendyPhrase4 Clone()

FILE: library/Support/TrendyPhrase5.cs
  class TrendyPhrase5 (line 8) | public class TrendyPhrase5 : TrendyPhraseBase
    method TrendyPhrase5 (line 10) | public TrendyPhrase5(byte[] data)
    method TrendyPhrase5 (line 15) | public TrendyPhrase5(ushort mood, ushort index, ushort word1, ushort w...
    method Render (line 20) | public override string Render(string wordFormat)
    method RenderPhrase (line 25) | public static string RenderPhrase(byte[] data, string wordFormat)
    method RenderWord (line 45) | public static string RenderWord(ushort word)
    method Clone (line 66) | public TrendyPhrase5 Clone()

FILE: library/Support/TrendyPhraseBase.cs
  class TrendyPhraseBase (line 8) | public abstract class TrendyPhraseBase
    method TrendyPhraseBase (line 10) | public TrendyPhraseBase(byte[] data)
    method ToString (line 36) | public override string ToString()
    method Render (line 41) | public abstract string Render(string wordFormat);
    method Pack (line 43) | internal static byte[] Pack(ushort mood, ushort index, ushort word1, u...

FILE: library/Support/ValidationSummary.cs
  type ValidationSummary (line 8) | public struct ValidationSummary

FILE: library/Wfc/BanStatus.cs
  class BanStatus (line 8) | public class BanStatus
    method BanStatus (line 10) | public BanStatus()
    method BanStatus (line 15) | public BanStatus(BanLevels level, string reason, DateTime ? expires)
  type BanLevels (line 27) | public enum BanLevels

FILE: library/Wfc/BattleSubwayPokemon5.cs
  class BattleSubwayPokemon5 (line 11) | public class BattleSubwayPokemon5 : BattleTowerPokemonBase
    method BattleSubwayPokemon5 (line 13) | public BattleSubwayPokemon5(Pokedex.Pokedex pokedex) : base(pokedex)
    method BattleSubwayPokemon5 (line 17) | public BattleSubwayPokemon5(Pokedex.Pokedex pokedex, int species, byte...
    method BattleSubwayPokemon5 (line 44) | public BattleSubwayPokemon5(Pokedex.Pokedex pokedex, int species, byte...
    method BattleSubwayPokemon5 (line 53) | public BattleSubwayPokemon5(Pokedex.Pokedex pokedex, BinaryReader data...
    method BattleSubwayPokemon5 (line 58) | public BattleSubwayPokemon5(Pokedex.Pokedex pokedex, byte[] data) : ba...
    method BattleSubwayPokemon5 (line 63) | public BattleSubwayPokemon5(Pokedex.Pokedex pokedex, byte[] data, int ...
    method Save (line 86) | protected override void Save(BinaryWriter writer)
    method Load (line 111) | protected override void Load(BinaryReader reader)
    method Clone (line 141) | public BattleSubwayPokemon5 Clone()

FILE: library/Wfc/BattleSubwayProfile5.cs
  class BattleSubwayProfile5 (line 11) | public class BattleSubwayProfile5 : BattleTowerProfileBase
    method BattleSubwayProfile5 (line 13) | public BattleSubwayProfile5()
    method BattleSubwayProfile5 (line 18) | public BattleSubwayProfile5(byte[] data)
    method BattleSubwayProfile5 (line 23) | public BattleSubwayProfile5(byte[] data, int start)
    method BattleSubwayProfile5 (line 28) | public BattleSubwayProfile5(EncodedString5 name, Versions version,
    method Save (line 58) | public byte[] Save()
    method Load (line 79) | public void Load(byte[] data, int start)

FILE: library/Wfc/BattleSubwayRecord5.cs
  class BattleSubwayRecord5 (line 10) | public class BattleSubwayRecord5 : BattleTowerRecordBase
    method BattleSubwayRecord5 (line 12) | public BattleSubwayRecord5(Pokedex.Pokedex pokedex)
    method BattleSubwayRecord5 (line 17) | public BattleSubwayRecord5(Pokedex.Pokedex pokedex, byte[] data)
    method BattleSubwayRecord5 (line 23) | public BattleSubwayRecord5(Pokedex.Pokedex pokedex, byte[] data, int s...
    method Save (line 114) | public byte[] Save()
    method Load (line 135) | public void Load(byte[] data, int start)

FILE: library/Wfc/BattleTowerPokemon4.cs
  class BattleTowerPokemon4 (line 11) | public class BattleTowerPokemon4 : BattleTowerPokemonBase
    method BattleTowerPokemon4 (line 13) | public BattleTowerPokemon4(Pokedex.Pokedex pokedex) : base(pokedex)
    method BattleTowerPokemon4 (line 17) | public BattleTowerPokemon4(Pokedex.Pokedex pokedex, int species, byte ...
    method BattleTowerPokemon4 (line 43) | public BattleTowerPokemon4(Pokedex.Pokedex pokedex, int species, byte ...
    method BattleTowerPokemon4 (line 52) | public BattleTowerPokemon4(Pokedex.Pokedex pokedex, BinaryReader data)...
    method BattleTowerPokemon4 (line 57) | public BattleTowerPokemon4(Pokedex.Pokedex pokedex, byte[] data) : bas...
    method BattleTowerPokemon4 (line 62) | public BattleTowerPokemon4(Pokedex.Pokedex pokedex, byte[] data, int o...
    method Save (line 83) | protected override void Save(BinaryWriter writer)
    method Load (line 107) | protected override void Load(BinaryReader reader)
    method Clone (line 136) | public BattleTowerPokemon4 Clone()

FILE: library/Wfc/BattleTowerPokemonBase.cs
  class BattleTowerPokemonBase (line 12) | public abstract class BattleTowerPokemonBase : PokemonBase
    method BattleTowerPokemonBase (line 14) | public BattleTowerPokemonBase(Pokedex.Pokedex pokedex) : base(pokedex)
    method CombineSpeciesForm (line 38) | protected static ushort CombineSpeciesForm(int species, byte form)
    method GetSpeciesFromCombined (line 45) | protected static int GetSpeciesFromCombined(ushort combined)
    method GetFormFromCombined (line 50) | protected static byte GetFormFromCombined(ushort combined)
    method GetMovesFromArray (line 55) | internal static void GetMovesFromArray(IList<MoveSlot> result, Pokedex...
    method MoveFromValues (line 68) | internal static MoveSlot MoveFromValues(Pokedex.Pokedex pokedex, ushor...
    method GetArrayFromMoves (line 75) | internal static ushort[] GetArrayFromMoves(IList<MoveSlot> moves)
    method GetPpUpsFromMoves (line 87) | internal static byte GetPpUpsFromMoves(IList<MoveSlot> moves)
    method GetMoveIds (line 99) | public ushort[] GetMoveIds()
    method GetPpUps (line 104) | public byte GetPpUps()

FILE: library/Wfc/BattleTowerProfile4.cs
  class BattleTowerProfile4 (line 11) | public class BattleTowerProfile4 : BattleTowerProfileBase
    method BattleTowerProfile4 (line 13) | public BattleTowerProfile4()
    method BattleTowerProfile4 (line 17) | public BattleTowerProfile4(EncodedString4 name, Versions version,
    method BattleTowerProfile4 (line 36) | public BattleTowerProfile4(byte[] data)
    method BattleTowerProfile4 (line 41) | public BattleTowerProfile4(byte[] data, int start)
    method Save (line 74) | public byte[] Save()
    method Load (line 95) | public void Load(byte[] data, int start)

FILE: library/Wfc/BattleTowerProfileBase.cs
  class BattleTowerProfileBase (line 8) | public abstract class BattleTowerProfileBase

FILE: library/Wfc/BattleTowerRecord4.cs
  class BattleTowerRecord4 (line 10) | public class BattleTowerRecord4 : BattleTowerRecordBase
    method BattleTowerRecord4 (line 12) | public BattleTowerRecord4(Pokedex.Pokedex pokedex)
    method BattleTowerRecord4 (line 17) | public BattleTowerRecord4(Pokedex.Pokedex pokedex, byte[] data)
    method BattleTowerRecord4 (line 23) | public BattleTowerRecord4(Pokedex.Pokedex pokedex, byte[] data, int st...
    method Save (line 113) | public byte[] Save()
    method Load (line 134) | public void Load(byte[] data, int start)

FILE: library/Wfc/BattleTowerRecordBase.cs
  class BattleTowerRecordBase (line 9) | public abstract class BattleTowerRecordBase

FILE: library/Wfc/BattleVideoHeader4.cs
  class BattleVideoHeader4 (line 8) | public class BattleVideoHeader4
    method BattleVideoHeader4 (line 10) | public BattleVideoHeader4()
    method BattleVideoHeader4 (line 14) | public BattleVideoHeader4(int pid, ulong serial_number, byte[] data)
    method Clone (line 83) | public BattleVideoHeader4 Clone()
    method KeyToSerial (line 147) | public static ulong KeyToSerial(ulong key)
    method SerialToKey (line 187) | public static ulong SerialToKey(ulong serial)
    method LongToDigits (line 223) | private static byte[] LongToDigits(ulong value)
    method DigitsToLong (line 235) | private static ulong DigitsToLong(byte[] digits)
    method FormatSerial (line 251) | public static String FormatSerial(ulong serial)
  type BattleVideoMetagames4 (line 262) | public enum BattleVideoMetagames4 : byte
  type BattleVideoRankings4 (line 314) | public enum BattleVideoRankings4 : uint

FILE: library/Wfc/BattleVideoHeader5.cs
  class BattleVideoHeader5 (line 8) | public class BattleVideoHeader5
    method BattleVideoHeader5 (line 10) | public BattleVideoHeader5()
    method BattleVideoHeader5 (line 14) | public BattleVideoHeader5(int pid, ulong serial_number, byte[] data)
    method Clone (line 83) | public BattleVideoHeader5 Clone()
  type BattleVideoMetagames5 (line 89) | public enum BattleVideoMetagames5 : byte
  type BattleVideoRankings5 (line 132) | public enum BattleVideoRankings5 : uint

FILE: library/Wfc/BattleVideoRecord4.cs
  class BattleVideoRecord4 (line 8) | public class BattleVideoRecord4
    method BattleVideoRecord4 (line 10) | public BattleVideoRecord4()
    method BattleVideoRecord4 (line 14) | public BattleVideoRecord4(int pid, ulong serial_number, byte[] data)
    method BattleVideoRecord4 (line 30) | public BattleVideoRecord4(int pid, ulong serial_number, BattleVideoHea...
    method Clone (line 45) | public BattleVideoRecord4 Clone()
    method Save (line 50) | public byte[] Save()

FILE: library/Wfc/BattleVideoRecord5.cs
  class BattleVideoRecord5 (line 8) | public class BattleVideoRecord5
    method BattleVideoRecord5 (line 10) | public BattleVideoRecord5()
    method BattleVideoRecord5 (line 14) | public BattleVideoRecord5(int pid, ulong serial_number, byte[] data)
    method BattleVideoRecord5 (line 30) | public BattleVideoRecord5(int pid, ulong serial_number, BattleVideoHea...
    method Clone (line 45) | public BattleVideoRecord5 Clone()
    method Save (line 50) | public byte[] Save()

FILE: library/Wfc/BoxRecord4.cs
  class BoxRecord4 (line 10) | public class BoxRecord4 : BinarySerializableBase
    method BoxRecord4 (line 12) | public BoxRecord4()
    method BoxRecord4 (line 16) | public BoxRecord4(int pid, BoxLabels4 label, ulong serial_number, Bina...
    method BoxRecord4 (line 25) | public BoxRecord4(int pid, BoxLabels4 label, ulong serial_number, byte...
    method BoxRecord4 (line 34) | public BoxRecord4(int pid, BoxLabels4 label, ulong serial_number, byte...
    method Load (line 76) | protected override void Load(System.IO.BinaryReader reader)
    method Save (line 81) | protected override void Save(System.IO.BinaryWriter writer)
    method Clone (line 86) | public BoxRecord4 Clone()
  type BoxLabels4 (line 92) | public enum BoxLabels4 : int

FILE: library/Wfc/DressupRecord4.cs
  class DressupRecord4 (line 10) | public class DressupRecord4 : BinarySerializableBase
    method DressupRecord4 (line 12) | public DressupRecord4()
    method DressupRecord4 (line 16) | public DressupRecord4(int pid, ulong serial_number, BinaryReader data)
    method DressupRecord4 (line 24) | public DressupRecord4(int pid, ulong serial_number, byte[] data)
    method DressupRecord4 (line 32) | public DressupRecord4(int pid, ulong serial_number, byte[] data, int o...
    method Load (line 82) | protected override void Load(System.IO.BinaryReader reader)
    method Save (line 87) | protected override void Save(System.IO.BinaryWriter writer)
    method Clone (line 92) | public DressupRecord4 Clone()

FILE: library/Wfc/GtsRecord4.cs
  class GtsRecord4 (line 18) | public class GtsRecord4 : GtsRecordBase, IEquatable<GtsRecord4>
    method GtsRecord4 (line 20) | public GtsRecord4(Pokedex.Pokedex pokedex)
    method GtsRecord4 (line 26) | public GtsRecord4(Pokedex.Pokedex pokedex, BinaryReader data)
    method GtsRecord4 (line 33) | public GtsRecord4(Pokedex.Pokedex pokedex, byte[] data)
    method GtsRecord4 (line 40) | public GtsRecord4(Pokedex.Pokedex pokedex, byte[] data, int offset)
    method Initialize (line 47) | private void Initialize()
    method Save (line 129) | protected override void Save(BinaryWriter writer)
    method Load (line 158) | protected override void Load(BinaryReader reader)
    method Clone (line 189) | public GtsRecord4 Clone()
    method Validate (line 195) | public override bool Validate()
    method CanTrade (line 206) | public bool CanTrade(GtsRecord4 other)
    method FlagTraded (line 221) | public void FlagTraded(GtsRecord4 other)
    method ExtrapolateProfile (line 236) | public override TrainerProfileBase ExtrapolateProfile()
    method Equals (line 263) | public override bool Equals(object obj)
    method Equals (line 268) | public bool Equals(GtsRecord4 other)
    method GetHashCode (line 273) | public override int GetHashCode()
    method DateToBinary (line 278) | internal static long DateToBinary(DateTime ? dt)

FILE: library/Wfc/GtsRecord5.cs
  class GtsRecord5 (line 18) | public class GtsRecord5 : GtsRecordBase, IEquatable<GtsRecord5>
    method GtsRecord5 (line 20) | public GtsRecord5(Pokedex.Pokedex pokedex)
    method GtsRecord5 (line 26) | public GtsRecord5(Pokedex.Pokedex pokedex, BinaryReader data)
    method GtsRecord5 (line 33) | public GtsRecord5(Pokedex.Pokedex pokedex, byte[] data)
    method GtsRecord5 (line 40) | public GtsRecord5(Pokedex.Pokedex pokedex, byte[] data, int offset)
    method Initialize (line 47) | private void Initialize()
    method Save (line 132) | protected override void Save(BinaryWriter writer)
    method Load (line 163) | protected override void Load(BinaryReader reader)
    method Clone (line 196) | public GtsRecord5 Clone()
    method Validate (line 202) | public override bool Validate()
    method CanTrade (line 211) | public bool CanTrade(GtsRecord5 other)
    method FlagTraded (line 226) | public void FlagTraded(GtsRecord5 other)
    method ExtrapolateProfile (line 241) | public override TrainerProfileBase ExtrapolateProfile()
    method Equals (line 268) | public override bool Equals(object obj)
    method Equals (line 273) | public bool Equals(GtsRecord5 other)
    method GetHashCode (line 278) | public override int GetHashCode()

FILE: library/Wfc/GtsRecordBase.cs
  class GtsRecordBase (line 10) | public abstract class GtsRecordBase : BinarySerializableBase
    method GtsRecordBase (line 12) | public GtsRecordBase(Pokedex.Pokedex pokedex) : base()
    method Validate (line 87) | public virtual bool Validate()
    method ExtrapolateProfile (line 123) | public abstract TrainerProfileBase ExtrapolateProfile();
    method CheckLevels (line 125) | public static bool CheckLevels(byte min, byte max, byte other)
    method DateToTimestamp (line 131) | public static ulong DateToTimestamp(DateTime? date)
    method TimestampToDate (line 144) | public static DateTime? TimestampToDate(ulong timestamp)

FILE: library/Wfc/MusicalRecord5.cs
  class MusicalRecord5 (line 10) | public class MusicalRecord5 : BinarySerializableBase
    method MusicalRecord5 (line 12) | public MusicalRecord5()
    method MusicalRecord5 (line 16) | public MusicalRecord5(int pid, ulong serial_number, BinaryReader data)
    method MusicalRecord5 (line 24) | public MusicalRecord5(int pid, ulong serial_number, byte[] data)
    method MusicalRecord5 (line 32) | public MusicalRecord5(int pid, ulong serial_number, byte[] data, int o...
    method UpdateParticipants (line 78) | public void UpdateParticipants()
    method Load (line 101) | protected override void Load(System.IO.BinaryReader reader)
    method Save (line 107) | protected override void Save(System.IO.BinaryWriter writer)
    method Clone (line 112) | public MusicalRecord5 Clone()
  class MusicalParticipant5 (line 118) | public class MusicalParticipant5 : BinarySerializableBase
    method MusicalParticipant5 (line 120) | public MusicalParticipant5()
    method MusicalParticipant5 (line 124) | public MusicalParticipant5(BinaryReader data)
    method MusicalParticipant5 (line 130) | public MusicalParticipant5(byte[] data)
    method MusicalParticipant5 (line 136) | public MusicalParticipant5(byte[] data, int offset)
    method Load (line 179) | protected override void Load(System.IO.BinaryReader reader)
    method Save (line 184) | protected override void Save(System.IO.BinaryWriter writer)
    method Clone (line 189) | public MusicalParticipant5 Clone()

FILE: library/Wfc/PlazaQuestionnaire.cs
  class PlazaQuestionnaire (line 6) | public class PlazaQuestionnaire
    method PlazaQuestionnaire (line 13) | public PlazaQuestionnaire(PlazaQuestion currentQuestion, PlazaQuestion...
    method Save (line 38) | public byte[] Save()
    method Load (line 58) | public static PlazaQuestionnaire Load(byte[] data, int start)
  class PlazaQuestion (line 95) | public class PlazaQuestion
    method PlazaQuestion (line 137) | public PlazaQuestion(int id, string sentence, string[] answers, byte[]...
    method PlazaQuestion (line 147) | private PlazaQuestion(int id, int publicID, string sentence, string[] ...
    method Save (line 189) | public byte[] Save()
    method Load (line 214) | public static PlazaQuestion Load(byte[] data, int start)
  class SubmittedQuestionnaire (line 244) | public class SubmittedQuestionnaire
    method SubmittedQuestionnaire (line 254) | public SubmittedQuestionnaire(int id, int publicID, int answerNumber, ...
    method Save (line 282) | public byte[] Save()
    method Load (line 302) | public static SubmittedQuestionnaire Load(byte[] data, int start)

FILE: library/Wfc/PlazaSchedule.cs
  class PlazaSchedule (line 10) | public class PlazaSchedule : BinarySerializableBase
    method PlazaSchedule (line 12) | public PlazaSchedule()
    method PlazaSchedule (line 16) | public PlazaSchedule(uint duration, int unknown1, PlazaFootprintOption...
    method PlazaSchedule (line 27) | public PlazaSchedule(byte[] data)
    method Load (line 39) | protected override void Load(BinaryReader reader)
    method Save (line 55) | protected override void Save(BinaryWriter writer)
  class PlazaScheduleEntry (line 80) | public class PlazaScheduleEntry : BinarySerializableBase
    method PlazaScheduleEntry (line 82) | public PlazaScheduleEntry()
    method PlazaScheduleEntry (line 86) | public PlazaScheduleEntry(int time, PlazaEventTypes eventType)
    method PlazaScheduleEntry (line 92) | public PlazaScheduleEntry(byte[] data)
    method Load (line 97) | protected override void Load(BinaryReader reader)
    method Save (line 103) | protected override void Save(BinaryWriter writer)
  type PlazaFootprintOptions (line 121) | public enum PlazaFootprintOptions : int
  type PlazaRoomTypes (line 127) | public enum PlazaRoomTypes : byte
  type PlazaSeasons (line 136) | public enum PlazaSeasons : byte
  type PlazaEventTypes (line 145) | public enum PlazaEventTypes : int

FILE: library/Wfc/TrainerProfile4.cs
  class TrainerProfile4 (line 8) | public class TrainerProfile4 : TrainerProfileBase
    method TrainerProfile4 (line 10) | public TrainerProfile4() : base()
    method TrainerProfile4 (line 14) | public TrainerProfile4(int pid, byte[] data, string ip_address) : base...
    method Clone (line 30) | public TrainerProfile4 Clone()

FILE: library/Wfc/TrainerProfile5.cs
  class TrainerProfile5 (line 8) | public class TrainerProfile5 : TrainerProfileBase
    method TrainerProfile5 (line 10) | public TrainerProfile5() : base()
    method TrainerProfile5 (line 14) | public TrainerProfile5(int pid, byte[] data, string ip_address) : base...
    method Clone (line 30) | public TrainerProfile5 Clone()

FILE: library/Wfc/TrainerProfileBase.cs
  class TrainerProfileBase (line 10) | public abstract class TrainerProfileBase
    method TrainerProfileBase (line 12) | protected TrainerProfileBase()
    method TrainerProfileBase (line 17) | protected TrainerProfileBase(int pid, byte[] data, string ip_address)

FILE: library/Wfc/TrainerProfilePlaza.cs
  class TrainerProfilePlaza (line 10) | public class TrainerProfilePlaza
    method TrainerProfilePlaza (line 12) | public TrainerProfilePlaza()
    method TrainerProfilePlaza (line 17) | public TrainerProfilePlaza(int pid, byte[] data)
    method Clone (line 98) | public TrainerProfilePlaza Clone()

FILE: library/Wfc/TrainerRankings.cs
  class TrainerRankingsReport (line 11) | public class TrainerRankingsReport
    method TrainerRankingsReport (line 13) | public TrainerRankingsReport(DateTime start_date, DateTime end_date, T...
    method PadResults (line 25) | public void PadResults()
  class TrainerRankingsLeaderboardGroup (line 34) | public class TrainerRankingsLeaderboardGroup
    method TrainerRankingsLeaderboardGroup (line 36) | public TrainerRankingsLeaderboardGroup(TrainerRankingsRecordTypes reco...
    method PadResults (line 51) | public void PadResults(DateTime startDate)
  class TrainerRankingsLeaderboard (line 59) | public class TrainerRankingsLeaderboard
    method TrainerRankingsLeaderboard (line 61) | public TrainerRankingsLeaderboard(TrainerRankingsTeamCategories team_c...
    method PadResults (line 71) | public void PadResults(DateTime startDate, int entryCount, int minTeam...
  class TrainerRankingsLeaderboardEntry (line 90) | public class TrainerRankingsLeaderboardEntry
    method TrainerRankingsLeaderboardEntry (line 92) | public TrainerRankingsLeaderboardEntry(int team, long score)
  type TrainerRankingsRecordTypes (line 102) | public enum TrainerRankingsRecordTypes : int
  type TrainerClass (line 199) | public enum TrainerClass : int
  type TrainerRankingsTeamCategories (line 221) | public enum TrainerRankingsTeamCategories
  class TrainerRankingsSubmission (line 226) | public class TrainerRankingsSubmission : BinarySerializableBase
    method TrainerRankingsSubmission (line 228) | public TrainerRankingsSubmission(int pid, Versions version,
    method TrainerRankingsSubmission (line 245) | public TrainerRankingsSubmission(int pid, byte[] data, int offset)
    method TrainerRankingsSubmission (line 251) | public TrainerRankingsSubmission(int pid, byte[] data)
    method TrainerRankingsSubmission (line 257) | public TrainerRankingsSubmission(int pid, BinaryReader reader)
    method Load (line 263) | protected override void Load(BinaryReader reader)
    method Save (line 301) | protected override void Save(BinaryWriter writer)
  class TrainerRankingsSubmissionEntry (line 352) | public class TrainerRankingsSubmissionEntry : BinarySerializableBase
    method TrainerRankingsSubmissionEntry (line 354) | public TrainerRankingsSubmissionEntry(TrainerRankingsRecordTypes recor...
    method TrainerRankingsSubmissionEntry (line 360) | public TrainerRankingsSubmissionEntry(byte[] data, int offset)
    method TrainerRankingsSubmissionEntry (line 365) | public TrainerRankingsSubmissionEntry(byte[] data)
    method TrainerRankingsSubmissionEntry (line 370) | public TrainerRankingsSubmissionEntry(BinaryReader reader)
    method Load (line 375) | protected override void Load(BinaryReader reader)
    method Save (line 381) | protected override void Save(BinaryWriter writer)

FILE: library/Wfc/VipRecord.cs
  class VipRecord (line 10) | public class VipRecord : BinarySerializableBase
    method VipRecord (line 12) | public VipRecord()
    method VipRecord (line 21) | public VipRecord(uint pid)
    method VipRecord (line 30) | public VipRecord(uint pid, byte wordA, byte wordB, byte wordC, byte wo...
    method VipRecord (line 39) | public VipRecord(byte[] data)
    method Load (line 50) | protected override void Load(BinaryReader reader)
    method Save (line 59) | protected override void Save(BinaryWriter writer)

FILE: library/database.sql
  type `BattleVideoCrawlQueue` (line 18) | CREATE TABLE IF NOT EXISTS `BattleVideoCrawlQueue` (
  type `BattleVideoCrawlQueue5` (line 29) | CREATE TABLE IF NOT EXISTS `BattleVideoCrawlQueue5` (
  type `BattleVideoSearchHistory` (line 40) | CREATE TABLE IF NOT EXISTS `BattleVideoSearchHistory` (
  type `BattleVideoSearchHistory5` (line 52) | CREATE TABLE IF NOT EXISTS `BattleVideoSearchHistory5` (
  type `GtsBattleSubway5` (line 65) | CREATE TABLE IF NOT EXISTS `GtsBattleSubway5` (
  type `GtsBattleSubwayLeaders5` (line 98) | CREATE TABLE IF NOT EXISTS `GtsBattleSubwayLeaders5` (
  type `GtsBattleSubwayPokemon5` (line 123) | CREATE TABLE IF NOT EXISTS `GtsBattleSubwayPokemon5` (
  type `GtsBattleTower4` (line 149) | CREATE TABLE IF NOT EXISTS `GtsBattleTower4` (
  type `GtsBattleTowerLeaders4` (line 181) | CREATE TABLE IF NOT EXISTS `GtsBattleTowerLeaders4` (
  type `GtsBattleTowerPokemon4` (line 206) | CREATE TABLE IF NOT EXISTS `GtsBattleTowerPokemon4` (
  type `GtsHistory4` (line 231) | CREATE TABLE IF NOT EXISTS `GtsHistory4` (
  type `GtsHistory5` (line 269) | CREATE TABLE IF NOT EXISTS `GtsHistory5` (
  type `GtsPokemon4` (line 310) | CREATE TABLE IF NOT EXISTS `GtsPokemon4` (
  type `GtsPokemon5` (line 347) | CREATE TABLE IF NOT EXISTS `GtsPokemon5` (
  type `GtsProfiles4` (line 387) | CREATE TABLE IF NOT EXISTS `GtsProfiles4` (
  type `GtsProfiles5` (line 412) | CREATE TABLE IF NOT EXISTS `GtsProfiles5` (
  type `pkmncf_gamestats_bans_ip` (line 437) | CREATE TABLE IF NOT EXISTS `pkmncf_gamestats_bans_ip` (
  type `pkmncf_gamestats_bans_ipv4_range` (line 448) | CREATE TABLE IF NOT EXISTS `pkmncf_gamestats_bans_ipv4_range` (
  type `pkmncf_gamestats_bans_mac` (line 459) | CREATE TABLE IF NOT EXISTS `pkmncf_gamestats_bans_mac` (
  type `pkmncf_gamestats_bans_pid` (line 470) | CREATE TABLE IF NOT EXISTS `pkmncf_gamestats_bans_pid` (
  type `pkmncf_gamestats_bans_savefile` (line 481) | CREATE TABLE IF NOT EXISTS `pkmncf_gamestats_bans_savefile` (
  type `pkmncf_plaza_profiles` (line 495) | CREATE TABLE IF NOT EXISTS `pkmncf_plaza_profiles` (
  type `pkmncf_pokedex_abilities` (line 513) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_abilities` (
  type `pkmncf_pokedex_countries` (line 528) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_countries` (
  type `pkmncf_pokedex_country_regions` (line 549) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_country_regions` (
  type `pkmncf_pokedex_encounters_random` (line 571) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_encounters_random` (
  type `pkmncf_pokedex_items` (line 586) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_items` (
  type `pkmncf_pokedex_locations` (line 613) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_locations` (
  type `pkmncf_pokedex_moves` (line 635) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_moves` (
  type `pkmncf_pokedex_pokemon` (line 658) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_pokemon` (
  type `pkmncf_pokedex_pokemon_families` (line 683) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_pokemon_families` (
  type `pkmncf_pokedex_pokemon_forms` (line 697) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_pokemon_forms` (
  type `pkmncf_pokedex_pokemon_form_abilities` (line 720) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_pokemon_form_abilities` (
  type `pkmncf_pokedex_pokemon_form_stats` (line 735) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_pokemon_form_stats` (
  type `pkmncf_pokedex_regions` (line 761) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_regions` (
  type `pkmncf_pokedex_ribbons` (line 776) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_ribbons` (
  type `pkmncf_pokedex_rooms` (line 806) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_rooms` (
  type `pkmncf_pokedex_types` (line 816) | CREATE TABLE IF NOT EXISTS `pkmncf_pokedex_types` (
  type `pkmncf_terminal_trainer_rankings_leaderboards_class` (line 894) | CREATE TABLE IF NOT EXISTS `pkmncf_terminal_trainer_rankings_leaderboard...
  type `pkmncf_terminal_trainer_rankings_leaderboards_month` (line 907) | CREATE TABLE IF NOT EXISTS `pkmncf_terminal_trainer_rankings_leaderboard...
  type `pkmncf_terminal_trainer_rankings_leaderboards_pokemon` (line 920) | CREATE TABLE IF NOT EXISTS `pkmncf_terminal_trainer_rankings_leaderboard...
  type `pkmncf_terminal_trainer_rankings_records` (line 933) | CREATE TABLE IF NOT EXISTS `pkmncf_terminal_trainer_rankings_records` (
  type `pkmncf_terminal_trainer_rankings_reports` (line 945) | CREATE TABLE IF NOT EXISTS `pkmncf_terminal_trainer_rankings_reports` (
  type `pkmncf_terminal_trainer_rankings_teams` (line 960) | CREATE TABLE IF NOT EXISTS `pkmncf_terminal_trainer_rankings_teams` (
  type `pkmncf_web_news` (line 975) | CREATE TABLE IF NOT EXISTS `pkmncf_web_news` (
  type `TerminalBattleVideoPokemon4` (line 983) | CREATE TABLE IF NOT EXISTS `TerminalBattleVideoPokemon4` (
  type `TerminalBattleVideoPokemon5` (line 995) | CREATE TABLE IF NOT EXISTS `TerminalBattleVideoPokemon5` (
  type `TerminalBattleVideos4` (line 1007) | CREATE TABLE IF NOT EXISTS `TerminalBattleVideos4` (
  type `TerminalBattleVideos5` (line 1039) | CREATE TABLE IF NOT EXISTS `TerminalBattleVideos5` (
  type `TerminalBoxes4` (line 1071) | CREATE TABLE IF NOT EXISTS `TerminalBoxes4` (
  type `TerminalDressup4` (line 1088) | CREATE TABLE IF NOT EXISTS `TerminalDressup4` (
  type `TerminalMusicalPokemon5` (line 1105) | CREATE TABLE IF NOT EXISTS `TerminalMusicalPokemon5` (
  type `TerminalMusicals5` (line 1117) | CREATE TABLE IF NOT EXISTS `TerminalMusicals5` (

FILE: towerRestorer4/Program.cs
  class Program (line 14) | class Program
    method Main (line 16) | static void Main(string[] args)

FILE: web/Default.aspx.cs
  class Default (line 12) | public partial class Default : System.Web.UI.Page
    method Page_Load (line 14) | protected void Page_Load(object sender, EventArgs e)

FILE: web/Default.aspx.designer.cs
  class Default (line 14) | public partial class Default

FILE: web/Global.asax.cs
  class Global (line 11) | public class Global : System.Web.HttpApplication
    method Application_Start (line 13) | void Application_Start(object sender, EventArgs e)
    method Application_End (line 19) | void Application_End(object sender, EventArgs e)
    method Application_Error (line 25) | void Application_Error(object sender, EventArgs e)
    method Session_Start (line 31) | void Session_Start(object sender, EventArgs e)
    method Session_End (line 37) | void Session_End(object sender, EventArgs e)
    method Application_BeginRequest (line 46) | void Application_BeginRequest(object sender, EventArgs e)
    method Application_EndRequest (line 57) | void Application_EndRequest(object sender, EventArgs e)
    method RewriteUrl (line 62) | public static String RewriteUrl(String url, out String pathInfo, out S...

FILE: web/RoomLeaders.aspx.cs
  class RoomLeaders (line 16) | public partial class RoomLeaders : System.Web.UI.Page
    method Page_Load (line 18) | protected void Page_Load(object sender, EventArgs e)
    method btnGet_Click (line 23) | protected void btnGet_Click(object sender, EventArgs e)

FILE: web/RoomLeaders.aspx.designer.cs
  class RoomLeaders (line 13) | public partial class RoomLeaders {

FILE: web/admin/AddBoxes.aspx.cs
  class AddBoxes (line 14) | public partial class AddBoxes : System.Web.UI.Page
    method Page_Init (line 16) | protected void Page_Init(object sender, EventArgs e)
    method Page_Load (line 21) | protected void Page_Load(object sender, EventArgs e)
    method btnSend_Click (line 26) | protected void btnSend_Click(object sender, EventArgs e)
    method Fail (line 68) | private void Fail()

FILE: web/admin/AddBoxes.aspx.designer.cs
  class AddBoxes (line 13) | public partial class AddBoxes {

FILE: web/admin/AddDressup.aspx.cs
  class AddDressup (line 15) | public partial class AddDressup : System.Web.UI.Page
    method Page_Init (line 17) | protected void Page_Init(object sender, EventArgs e)
    method Page_Load (line 22) | protected void Page_Load(object sender, EventArgs e)
    method btnSend_Click (line 27) | protected void btnSend_Click(object sender, EventArgs e)
    method Fail (line 68) | private void Fail()

FILE: web/admin/AddDressup.aspx.designer.cs
  class AddDressup (line 13) | public partial class AddDressup {

FILE: web/admin/AddMusical.aspx.cs
  class AddMusical (line 13) | public partial class AddMusical : System.Web.UI.Page
    method Page_Init (line 15) | protected void Page_Init(object sender, EventArgs e)
    method Page_Load (line 20) | protected void Page_Load(object sender, EventArgs e)
    method btnSend_Click (line 25) | protected void btnSend_Click(object sender, EventArgs e)
    method Fail (line 65) | private void Fail()

FILE: web/admin/AddMusical.aspx.designer.cs
  class AddMusical (line 13) | public partial class AddMusical {

FILE: web/battlevideo/Default.aspx.cs
  class BattleVideo (line 13) | public partial class BattleVideo : System.Web.UI.Page
    method Page_Load (line 15) | protected void Page_Load(object sender, EventArgs e)
    method btnSend4_Click (line 44) | protected void btnSend4_Click(object sender, EventArgs e)
    method QueueVideoId4 (line 62) | private void QueueVideoId4(MySqlConnection db, ulong id)
    method btnSend5_Click (line 75) | protected void btnSend5_Click(object sender, EventArgs e)
    method QueueVideoId5 (line 93) | private void QueueVideoId5(MySqlConnection db, ulong id)
    method CreateConnection (line 106) | public static MySqlConnection CreateConnection()

FILE: web/battlevideo/Default.aspx.designer.cs
  class BattleVideo (line 13) | public partial class BattleVideo {

FILE: web/controls/DnsAddress.ascx.cs
  class DnsAddress (line 10) | public partial class DnsAddress : System.Web.UI.UserControl
    method Page_Load (line 12) | protected void Page_Load(object sender, EventArgs e)

FILE: web/controls/DnsAddress.ascx.designer.cs
  class DnsAddress (line 14) | public partial class DnsAddress

FILE: web/controls/ForeignLookup.ascx.cs
  class ForeignLookup (line 11) | public partial class ForeignLookup : System.Web.UI.UserControl
    method Page_Init (line 13) | protected void Page_Init(object sender, EventArgs e)
    method Page_Load (line 17) | protected void Page_Load(object sender, EventArgs e)
    method LoadViewState (line 98) | protected override void LoadViewState(object savedState)
    method SaveViewState (line 108) | protected override object SaveViewState()
    type ForeignLookupViewState (line 119) | [Serializable()]

FILE: web/controls/ForeignLookup.ascx.designer.cs
  class ForeignLookup (line 13) | public partial class ForeignLookup {

FILE: web/controls/LabelTextBox.ascx.cs
  class LabelTextBox (line 10) | public partial class LabelTextBox : System.Web.UI.UserControl
    method Page_Load (line 12) | protected void Page_Load(object sender, EventArgs e)

FILE: web/controls/LabelTextBox.ascx.designer.cs
  class LabelTextBox (line 13) | public partial class LabelTextBox {

FILE: web/controls/PokemonPicker.ascx.cs
  class PokemonPicker (line 11) | public partial class PokemonPicker : System.Web.UI.UserControl
    method Page_Load (line 13) | protected void Page_Load(object sender, EventArgs e)

FILE: web/controls/PokemonPicker.ascx.designer.cs
  class PokemonPicker (line 13) | public partial class PokemonPicker {

FILE: web/controls/PokemonSource.ashx.cs
  class PokemonSource (line 14) | public class PokemonSource : ForeignLookupSource
    method GetData (line 16) | protected override System.Data.DataTable GetData(HttpContext context, ...

FILE: web/gts/Default.aspx.cs
  class AllPokemon (line 16) | public partial class AllPokemon : System.Web.UI.Page
    method Page_Load (line 18) | protected void Page_Load(object sender, EventArgs e)
    method FormatLevels (line 48) | private string FormatLevels(byte min, byte max)
    method CreateOfferImage (line 72) | protected string CreateOfferImage(object DataItem)
    method CreatePokeball (line 87) | protected string CreatePokeball(object DataItem)
    method CreatePokerus (line 105) | protected string CreatePokerus(object DataItem)
    method CreateLevel (line 126) | protected string CreateLevel(object DataItem)
    method CreateGender (line 132) | protected string CreateGender(object DataItem)
    method CreateNickname (line 138) | protected string CreateNickname(object DataItem)
    method CreateSpecies (line 151) | protected string CreateSpecies(object DataItem)
    method CreatePokedex (line 165) | protected string CreatePokedex(object DataItem)
    method CreateHeldItem (line 178) | protected string CreateHeldItem(object DataItem)
    method CreateNature (line 195) | protected string CreateNature(object DataItem)
    method CreateAbility (line 208) | protected string CreateAbility(object DataItem)
    method CreateTrainer (line 221) | protected string CreateTrainer(object DataItem)
    method CreateWantedSpecies (line 227) | protected string CreateWantedSpecies(object DataItem)
    method CreateWantedGender (line 241) | protected string CreateWantedGender(object DataItem)
    method CreateWantedLevel (line 247) | protected string CreateWantedLevel(object DataItem)
    method CreateDate (line 253) | protected string CreateDate(object DataItem)
    method CreateAdminLinks (line 260) | protected string CreateAdminLinks(object DataItem)

FILE: web/gts/Default.aspx.designer.cs
  class AllPokemon (line 14) | public partial class AllPokemon

FILE: web/gts/Pokemon.aspx.cs
  class Pokemon (line 16) | public partial class Pokemon : System.Web.UI.Page
    method Page_Init (line 18) | protected void Page_Init(object sender, EventArgs e)
    method Page_Load (line 25) | protected void Page_Load(object sender, EventArgs e)
    method Bind (line 91) | private void Bind(GtsRecordBase record)

FILE: web/gts/Pokemon.aspx.designer.cs
  class Pokemon (line 14) | public partial class Pokemon

FILE: web/masters/LeftColumn.master.cs
  class LeftColumn (line 10) | public partial class LeftColumn : System.Web.UI.MasterPage
    method Page_Load (line 12) | protected void Page_Load(object sender, EventArgs e)

FILE: web/masters/LeftColumn.master.designer.cs
  class LeftColumn (line 14) | public partial class LeftColumn

FILE: web/masters/MasterPage.master.cs
  class MasterPage (line 11) | public partial class MasterPage : System.Web.UI.MasterPage
    method Page_Load (line 13) | protected void Page_Load(object sender, EventArgs e)

FILE: web/masters/MasterPage.master.designer.cs
  class MasterPage (line 14) | public partial class MasterPage

FILE: web/masters/ThreeColumn.master.cs
  class ThreeColumn (line 10) | public partial class ThreeColumn : System.Web.UI.MasterPage
    method Page_Load (line 12) | protected void Page_Load(object sender, EventArgs e)

FILE: web/masters/ThreeColumn.master.designer.cs
  class ThreeColumn (line 13) | public partial class ThreeColumn {

FILE: web/scripts/form.js
  function labelTextBox_Change (line 1) | function labelTextBox_Change()
  function pfHandleLookupKeypress (line 16) | function pfHandleLookupKeypress(id_outer, id_value, id_results, count, url)
  function pfHandleLookupKeypress3 (line 25) | function pfHandleLookupKeypress3(id_outer, id_value, id_results, count, ...
  function pfHandleLookupKeypress2 (line 43) | function pfHandleLookupKeypress2(id_outer, id_value, id_results, count, ...
  function pfHandleLookup (line 77) | function pfHandleLookup(id_outer, id_value, id_results, count, url)
  function pfShowLookupResults (line 105) | function pfShowLookupResults(id_value, id_results)
  function pfReceiveLookupResults (line 119) | function pfReceiveLookupResults(response, status, id_outer, id_value, id...
  function pfHideLookupResults (line 138) | function pfHideLookupResults(id)
  function pfSelectLookupResult (line 143) | function pfSelectLookupResult(id_main, id_value, value, id_text, text)
  function pfLookupResultsVisible (line 152) | function pfLookupResultsVisible(id)

FILE: web/scripts/retina.js
  function setPixelRatioCookie (line 1) | function setPixelRatioCookie(scale)
  function getPixelRatio (line 9) | function getPixelRatio()
  function matchScale (line 21) | function matchScale(scale)
  function bisectScale (line 33) | function bisectScale(min, max, tolerance)
  function checkRetina (line 42) | function checkRetina(element, scale)
  function checkAllRetina (line 97) | function checkAllRetina()
  function checkRetinaIn (line 107) | function checkRetinaIn(element)
  function handleBeforePrint (line 116) | function handleBeforePrint()
  function handleAfterPrint (line 122) | function handleAfterPrint()
  function handlePrintListener (line 128) | function handlePrintListener(mql)

FILE: web/src/AppStateHelper.cs
  class AppStateHelper (line 9) | public static class AppStateHelper
    method Pokedex (line 11) | public static Pokedex.Pokedex Pokedex(HttpApplicationState application)
    method GetTypedApplicationObject (line 16) | public static T GetTypedApplicationObject<T>(HttpApplicationState appl...

FILE: web/src/Common.cs
  class Common (line 12) | public static class Common
    method HtmlEncode (line 14) | public static string HtmlEncode(string s)
    method JsEncode (line 19) | public static String JsEncode(String s)
    method NeedsJsEscape (line 51) | private static bool NeedsJsEscape(char c)
    method FormatReturns (line 65) | public static string FormatReturns(string text, string ending)
    method CryptMessage (line 76) | public static void CryptMessage(byte[] message)
    method ResolveUrl (line 94) | public static String ResolveUrl(String url)
    method GetExtension (line 110) | public static String GetExtension(String filename)
    method GetExtension (line 117) | public static String GetExtension(String filename, out String namepart)
    method CreateConnection (line 129) | public static MySqlConnection CreateConnection()

FILE: web/src/DependencyNode.cs
  class DependencyNode (line 9) | internal class DependencyNode<TKey, TValue>
    method DependencyNode (line 11) | public DependencyNode()
    method DependencyNode (line 16) | public DependencyNode(TKey key, TValue value)
    method DependencyNode (line 23) | public DependencyNode(TKey key, TValue value, HashSet<TKey> dependencies)
    method Clone (line 33) | public DependencyNode<TKey, TValue> Clone()
  class DependencyGraph (line 39) | internal class DependencyGraph<TKey, TValue>
    method DependencyGraph (line 41) | public DependencyGraph()
    method DependencyGraph (line 46) | public DependencyGraph(List<DependencyNode<TKey, TValue>> graph)
    method Resolve (line 54) | public List<TValue> Resolve()
  class CircularDependencyException (line 113) | public class CircularDependencyException : Exception
    method CircularDependencyException (line 116) | public CircularDependencyException(String message) : base(message)

FILE: web/src/ForeignLookupSource.cs
  class ForeignLookupSource (line 16) | public class ForeignLookupSource : IHttpHandler, System.Web.SessionState...
    method ForeignLookupSource (line 18) | public ForeignLookupSource()
    method ProcessRequest (line 25) | public void ProcessRequest(HttpContext context)
    method ServerError (line 110) | private void ServerError(HttpContext context)
    method EmptyResult (line 117) | private void EmptyResult(HttpContext context, string format)
    method WriteHtml (line 135) | private void WriteHtml(HttpContext context, DataTable data, string con...
    method WriteJson (line 190) | private void WriteJson(HttpContext context, DataTable data)
    method GetData (line 206) | protected virtual DataTable GetData(HttpContext context, string query,...
  class ForeignLookupResult (line 212) | internal class ForeignLookupResult

FILE: web/src/HeaderColour.cs
  class HeaderColour (line 8) | public class HeaderColour : System.Web.UI.Control
    method HeaderColour (line 10) | public HeaderColour()
    method HeaderColour_PreRender (line 16) | private void HeaderColour_PreRender(object sender, EventArgs e)
    method SetHeaderCssClass (line 21) | private void SetHeaderCssClass(System.Web.UI.MasterPage master)
    method LoadViewState (line 35) | protected override void LoadViewState(object savedState)
    method SaveViewState (line 44) | protected override object SaveViewState()
    type HeaderColourViewState (line 56) | [Serializable()]

FILE: web/src/OnceTemplate.cs
  class OnceTemplate (line 11) | public class OnceTemplate : System.Web.UI.WebControls.PlaceHolder
    method OnceTemplate (line 13) | public OnceTemplate() : base()
    method Render (line 35) | protected override void Render(System.Web.UI.HtmlTextWriter writer)

FILE: web/src/RequireCss.cs
  class RequireCss (line 8) | public class RequireCss : RequireLinkBase
    method RequireCss (line 10) | public RequireCss() : base()
    method RenderHeader (line 15) | public override void RenderHeader(System.Web.UI.HtmlTextWriter writer)

FILE: web/src/RequireLinkBase.cs
  class RequireLinkBase (line 10) | public abstract class RequireLinkBase : System.Web.UI.Control
    method RequireLinkBase (line 12) | protected RequireLinkBase()
    method RequireLinkBase_Init (line 20) | void RequireLinkBase_Init(object sender, EventArgs e)
    method RequireLinkBase_Load (line 26) | void RequireLinkBase_Load(object sender, EventArgs e)
    method RequireLinkBase_PreRender (line 30) | void RequireLinkBase_PreRender(object sender, EventArgs e)
    method Page_PreRender (line 40) | void Page_PreRender(object sender, EventArgs e)
    method RenderHeader (line 53) | public abstract void RenderHeader(System.Web.UI.HtmlTextWriter writer);
    method GetDependencyGraph (line 59) | private DependencyGraph<String, RequireLinkBase> GetDependencyGraph()
    method ParseDependencies (line 80) | private HashSet<String> ParseDependencies(String dependencies)
  class RequireLinkRenderer (line 87) | internal class RequireLinkRenderer : System.Web.UI.Control
    method RequireLinkRenderer (line 89) | public RequireLinkRenderer(DependencyGraph<String, RequireLinkBase> gr...
    method Render (line 97) | protected override void Render(System.Web.UI.HtmlTextWriter writer)

FILE: web/src/RequireScript.cs
  class RequireScript (line 8) | public class RequireScript : RequireLinkBase
    method RequireScript (line 10) | public RequireScript() : base()
    method RenderHeader (line 15) | public override void RenderHeader(System.Web.UI.HtmlTextWriter writer)

FILE: web/src/RetinaImage.cs
  class RetinaImage (line 9) | public class RetinaImage : RetinaImageBase
    method RetinaImage (line 14) | public RetinaImage()
    method ScaledImageName (line 23) | public static String ScaledImageName(String filename, String format, f...
    method GetScales (line 43) | protected override List<ImageRendition> GetScales()
    method LoadViewState (line 65) | protected override void LoadViewState(object savedState)
    method SaveViewState (line 73) | protected override object SaveViewState()
    type RetinaImageViewState (line 116) | [Serializable()]

FILE: web/src/RetinaImageBase.cs
  class RetinaImageBase (line 14) | public abstract class RetinaImageBase : System.Web.UI.WebControls.Image
    method RetinaImageBase (line 16) | public RetinaImageBase() : base()
    method AddAttributesToRender (line 23) | protected override void AddAttributesToRender(System.Web.UI.HtmlTextWr...
    method WriteDataAttributes (line 29) | private void WriteDataAttributes(HtmlTextWriter writer)
    method AttributeName (line 39) | public static String AttributeName(float scale)
    method getDevicePixelRatio (line 44) | public static float getDevicePixelRatio(Page page)
    method RetinaImageBase_PreRender (line 52) | public void RetinaImageBase_PreRender(object sender, EventArgs e)
    method GetScales (line 70) | protected abstract List<ImageRendition> GetScales();
    method UpdateCssClass (line 114) | private void UpdateCssClass()
    method LoadViewState (line 120) | protected override void LoadViewState(object savedState)
    method SaveViewState (line 130) | protected override object SaveViewState()
    type ImageRendition (line 140) | protected struct ImageRendition : IComparable<ImageRendition>
      method ImageRendition (line 145) | public ImageRendition(String image_url, float scale)
      method CompareTo (line 151) | public int CompareTo(ImageRendition other)
    type RetinaImageBaseViewState (line 157) | [Serializable()]

FILE: web/src/WebException.cs
  class WebException (line 8) | public class WebException : Exception
    method WebException (line 10) | public WebException(String message, int responseCode) : base(message)
    method WebException (line 15) | public WebException(String message) : this(message, 500)
    method WebException (line 20) | public WebException(int responseCode) : this(DefaultMessage(responseCo...
    method WebException (line 25) | public WebException() : this(500)
    method DefaultMessage (line 32) | public static String DefaultMessage(int responseCode)

FILE: web/src/WebFormat.cs
  class WebFormat (line 11) | public static class WebFormat
    method Markings (line 13) | public static String Markings(Markings markings)
    method Gender (line 18) | public static String Gender(Genders gender)
    method RenderProgress (line 31) | public static String RenderProgress(int curr, int max)
    method RenderType (line 37) | public static String RenderType(Pokedex.Type type)
    method PokemonImageLarge (line 42) | public static String PokemonImageLarge(PokemonPartyBase pokemon)
    method PokemonImageSmall (line 48) | public static String PokemonImageSmall(PokemonPartyBase pokemon)
    method SpeciesImageLarge (line 55) | public static String SpeciesImageLarge(Form f)
    method SpeciesImageLarge (line 60) | public static String SpeciesImageLarge(Species s)
    method SpeciesImageSmall (line 65) | public static String SpeciesImageSmall(Form f)
    method SpeciesImageSmall (line 72) | public static String SpeciesImageSmall(Species s)
    method PokemonImage2 (line 77) | private static String PokemonImage2(PokemonPartyBase pokemon)
    method PokemonImage2 (line 82) | private static String PokemonImage2(Form f, Genders g)
    method ItemImage (line 98) | public static String ItemImage(Item item)

FILE: web/test/BoxUp.aspx.cs
  class BoxUp (line 13) | public partial class BoxUp : System.Web.UI.Page
    method Page_Init (line 15) | protected void Page_Init(object sender, EventArgs e)
    method Page_Load (line 20) | protected void Page_Load(object sender, EventArgs e)
    method btnSend_Click (line 27) | protected void btnSend_Click(object sender, EventArgs e)
    method RenderHex (line 50) | private string RenderHex(string hex)
    method RenderCArray (line 67) | private string RenderCArray(string hex)
    method CryptMessage (line 83) | private void CryptMessage(byte[] message)

FILE: web/test/BoxUp.aspx.designer.cs
  class BoxUp (line 14) | public partial class BoxUp

FILE: web/test/Decode.aspx.cs
  class Decode (line 13) | public partial class Decode : System.Web.UI.Page
    method Page_Load (line 15) | protected void Page_Load(object sender, EventArgs e)
    method btnDecode_Click (line 21) | protected void btnDecode_Click(object sender, EventArgs e)
    method DecryptData (line 113) | public static byte[] DecryptData(String data)
    method RenderHex (line 125) | private String RenderHex(String hex)

FILE: web/test/Decode.aspx.designer.cs
  class Decode (line 13) | public partial class Decode {

FILE: web/test/Gsid.aspx.cs
  class Gsid (line 12) | public partial class Gsid : System.Web.UI.Page
    method Page_Load (line 14) | protected void Page_Load(object sender, EventArgs e)

FILE: web/test/Gsid.aspx.designer.cs
  class Gsid (line 14) | public partial class Gsid

FILE: web/test/NameDecode.aspx.cs
  class NameDecode (line 13) | public partial class NameDecode : System.Web.UI.Page
    method Page_Load (line 15) | protected void Page_Load(object sender, EventArgs e)
    method btnSubmit_Click (line 20) | protected void btnSubmit_Click(object sender, EventArgs e)

FILE: web/test/NameDecode.aspx.designer.cs
  class NameDecode (line 13) | public partial class NameDecode {

FILE: web/test/NameEncode.aspx.cs
  class NameEncode (line 11) | public partial class NameEncode : System.Web.UI.Page
    method Page_Load (line 13) | protected void Page_Load(object sender, EventArgs e)
    method btnSubmit_Click (line 18) | protected void btnSubmit_Click(object sender, EventArgs e)

FILE: web/test/NameEncode.aspx.designer.cs
  class NameEncode (line 13) | public partial class NameEncode {

FILE: web/test/VideoId.aspx.cs
  class VideoId (line 12) | public partial class VideoId : System.Web.UI.Page
    method Page_Load (line 14) | protected void Page_Load(object sender, EventArgs e)
    method btnToSerial_Click (line 19) | protected void btnToSerial_Click(object sender, EventArgs e)
    method btnToVideo_Click (line 25) | protected void btnToVideo_Click(object sender, EventArgs e)

FILE: web/test/VideoId.aspx.designer.cs
  class VideoId (line 13) | public partial class VideoId {
Condensed preview — 314 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,775K chars).
[
  {
    "path": ".gitignore",
    "chars": 133,
    "preview": "[Tt]humbs.db\r\n*.suo\r\n*.csproj.user\r\n*.pubxml.user\r\n[Dd]ebug/\r\n[Rr]elease/\r\n[Bb]in/\r\n[Pp]ackages/\r\n.DS_Store\r\n._.DS_Store"
  },
  {
    "path": ".gitmodules",
    "chars": 113,
    "preview": "[submodule \"GamestatsBase\"]\n\tpath = GamestatsBase\n\turl = git@github.com:mm201/GamestatsBase.git\n\tbranch = master\n"
  },
  {
    "path": "GlobalTerminalService/GTServer4.cs",
    "chars": 28595,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing PkmnFounda"
  },
  {
    "path": "GlobalTerminalService/GTServer5.cs",
    "chars": 14802,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoundations.Support;\nus"
  },
  {
    "path": "GlobalTerminalService/GTServerBase.cs",
    "chars": 8860,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing Syste"
  },
  {
    "path": "GlobalTerminalService/GlobalTerminalService.csproj",
    "chars": 3874,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "GlobalTerminalService/Program.cs",
    "chars": 723,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.ServiceProcess;\r\nusing System.Text;\r"
  },
  {
    "path": "GlobalTerminalService/ProjectInstaller.Designer.cs",
    "chars": 2299,
    "preview": "namespace PkmnFoundations.GlobalTerminalService\n{\n    partial class ProjectInstaller\n    {\n        /// <summary>\n      "
  },
  {
    "path": "GlobalTerminalService/ProjectInstaller.cs",
    "chars": 421,
    "preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Con"
  },
  {
    "path": "GlobalTerminalService/ProjectInstaller.resx",
    "chars": 6286,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "GlobalTerminalService/Properties/AssemblyInfo.cs",
    "chars": 1451,
    "preview": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General I"
  },
  {
    "path": "GlobalTerminalService/Service1.Designer.cs",
    "chars": 1139,
    "preview": "namespace PkmnFoundations.GlobalTerminalService\r\n{\r\n    partial class Service1\r\n    {\r\n        /// <summary> \r\n        "
  },
  {
    "path": "GlobalTerminalService/Service1.cs",
    "chars": 1319,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Data;\r\nusing System.Diagno"
  },
  {
    "path": "GlobalTerminalService/Service1.resx",
    "chars": 5874,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "GlobalTerminalService/app.config",
    "chars": 690,
    "preview": "<?xml version=\"1.0\"?>\n\n<configuration>\n  \n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4"
  },
  {
    "path": "LICENSE.md",
    "chars": 1358,
    "preview": "Copyright © 2014-2023 Megan Edwards (mm201), all rights reserved\n\nYou may:\n* Run a private instance for development purp"
  },
  {
    "path": "MakeBaseStatTables/MakeBaseStatTables.csproj",
    "chars": 4383,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "MakeBaseStatTables/Program.cs",
    "chars": 8676,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data.SQLite;\nusing System.IO;\nusing System.Linq;\nusing Sys"
  },
  {
    "path": "MakeBaseStatTables/Properties/AssemblyInfo.cs",
    "chars": 1409,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "MakeBaseStatTables/app.config",
    "chars": 1607,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    \n    <section name=\"entityFramework\" type"
  },
  {
    "path": "MakeBaseStatTables/packages.config",
    "chars": 315,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"System.Data.SQLite\" version=\"1.0.94.1\" targetFramework"
  },
  {
    "path": "README.md",
    "chars": 2994,
    "preview": "# Poké Classic Framework\r\n\r\nhttps://pkmnclassic.net/\r\n\r\nPoké Classic Framework is a replacement server and class library"
  },
  {
    "path": "RenameImages/App.config",
    "chars": 450,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <connectionStrings>\n    <add name=\"pkmnFoundationsConnectionS"
  },
  {
    "path": "RenameImages/Program.cs",
    "chars": 3928,
    "preview": "using PkmnFoundations.Data;\nusing PkmnFoundations.Pokedex;\nusing System;\nusing System.Collections.Generic;\nusing System"
  },
  {
    "path": "RenameImages/Properties/AssemblyInfo.cs",
    "chars": 1392,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "RenameImages/RenameImages.csproj",
    "chars": 2456,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbui"
  },
  {
    "path": "Roadmap.md",
    "chars": 2721,
    "preview": "# Roadmap\n\nThis is a complete list of all the features I want the PCN server to have for me to consider it complete.\n\n##"
  },
  {
    "path": "VeekunImport/Program.cs",
    "chars": 40495,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Configuration;\nusing"
  },
  {
    "path": "VeekunImport/Properties/AssemblyInfo.cs",
    "chars": 1397,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "VeekunImport/VeekunImport.csproj",
    "chars": 8163,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "VeekunImport/app.config",
    "chars": 1906,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    \n    <section name=\"entityFramework\" type"
  },
  {
    "path": "VeekunImport/countries4.txt",
    "chars": 2090,
    "preview": "1\tAF\tAfghanistan\n2\tAL\tAlbania\n3\tDZ\tAlgeria\n6\tAO\tAngola\n8\tAG\tAntigua and Barbuda\n9\tAR\tArgentina\n12\tAU\tAustralia\n13\tAT\tAu"
  },
  {
    "path": "VeekunImport/countries5.txt",
    "chars": 2043,
    "preview": "1\tAF\tAfghanistan\n2\tAL\tAlbania\n3\tDZ\tAlgeria\n6\tAO\tAngola\n8\tAG\tAntigua and Barbuda\n9\tAR\tArgentina\n12\tAU\tAustralia\n13\tAT\tAu"
  },
  {
    "path": "VeekunImport/families.txt",
    "chars": 486,
    "preview": "010\t172\t172\t000\t000\t0000\t4\n012\t029\t032\t000\t000\t0000\t4\n013\t173\t173\t000\t000\t0000\t6\n015\t174\t174\t000\t000\t0000\t6\n046\t236\t236"
  },
  {
    "path": "VeekunImport/families_map.txt",
    "chars": 2883,
    "preview": "001\t002\t003\n004\t005\t006\n007\t008\t009\n010\t011\t012\n013\t014\t015\n016\t017\t018\n019\t020\n021\t022\n023\t024\n025\t026\t172\n027\t028\n029\t"
  },
  {
    "path": "VeekunImport/form_abilities3.txt",
    "chars": 7542,
    "preview": "00001\t065\t000\t000\n00002\t065\t000\t000\n00003\t065\t000\t000\n00004\t066\t000\t000\n00005\t066\t000\t000\n00006\t066\t000\t000\n00007\t067\t00"
  },
  {
    "path": "VeekunImport/form_abilities4.txt",
    "chars": 4104,
    "preview": "00016\t051\t077\t000\n00017\t051\t077\t000\n00018\t051\t077\t000\n00029\t038\t079\t000\n00030\t038\t079\t000\n00031\t038\t079\t000\n00032\t038\t07"
  },
  {
    "path": "VeekunImport/form_abilities5.txt",
    "chars": 13194,
    "preview": "00001\t065\t000\t034\n00002\t065\t000\t034\n00003\t065\t000\t034\n00004\t066\t000\t094\n00005\t066\t000\t094\n00006\t066\t000\t094\n00007\t067\t00"
  },
  {
    "path": "VeekunImport/form_abilities6.txt",
    "chars": 3654,
    "preview": "00039\t056\t172\t132\n00040\t056\t172\t119\n00145\t046\t000\t009\n00174\t056\t172\t132\n00311\t057\t000\t031\n00312\t058\t000\t010\n00349\t033\t01"
  },
  {
    "path": "VeekunImport/form_stats1.txt",
    "chars": 7248,
    "preview": "00001\t12\t04\t045\t049\t049\t045\t065\t065\t0\t0\t0\t0\t1\t0\n00002\t12\t04\t060\t062\t063\t060\t080\t080\t0\t0\t0\t0\t1\t1\n00003\t12\t04\t080\t082\t083\t"
  },
  {
    "path": "VeekunImport/form_stats2.txt",
    "chars": 11328,
    "preview": "00004\t10\t00\t039\t052\t043\t065\t060\t050\t0\t0\t0\t1\t0\t0\n00005\t10\t00\t058\t064\t058\t080\t080\t065\t0\t0\t0\t1\t1\t0\n00006\t10\t03\t078\t084\t078\t"
  },
  {
    "path": "VeekunImport/form_stats3.txt",
    "chars": 6864,
    "preview": "00252\t12\t00\t040\t045\t035\t070\t065\t055\t0\t0\t0\t1\t0\t0\n00253\t12\t00\t050\t065\t045\t095\t085\t065\t0\t0\t0\t2\t0\t0\n00254\t12\t00\t070\t085\t065\t"
  },
  {
    "path": "VeekunImport/form_stats4.txt",
    "chars": 6672,
    "preview": "00387\t12\t00\t055\t068\t064\t031\t045\t055\t0\t1\t0\t0\t0\t0\n00388\t12\t00\t075\t089\t085\t036\t055\t065\t0\t1\t1\t0\t0\t0\n00389\t12\t05\t095\t109\t105\t"
  },
  {
    "path": "VeekunImport/form_stats5.txt",
    "chars": 8640,
    "preview": "00494\t14\t10\t100\t100\t100\t100\t100\t100\t3\t0\t0\t0\t0\t0\n00495\t12\t00\t045\t045\t055\t063\t045\t055\t0\t0\t0\t1\t0\t0\n00496\t12\t00\t060\t060\t075\t"
  },
  {
    "path": "VeekunImport/form_stats6.txt",
    "chars": 10944,
    "preview": "00012\t07\t03\t060\t045\t050\t070\t090\t080\t0\t0\t0\t0\t2\t1\n00015\t07\t04\t065\t090\t040\t075\t045\t080\t0\t2\t0\t0\t0\t1\n00018\t01\t03\t083\t080\t075\t"
  },
  {
    "path": "VeekunImport/form_values.txt",
    "chars": 797,
    "preview": "201\t201\t0\n201\t10001\t1\n201\t10002\t2\n201\t10003\t3\n201\t10004\t4\n201\t10005\t5\n201\t10006\t6\n201\t10007\t7\n201\t10008\t8\n201\t10009\t9\n2"
  },
  {
    "path": "VeekunImport/items3.txt",
    "chars": 5735,
    "preview": "1\tMaster Ball\t3001\n2\tUltra Ball\t3002\n3\tGreat Ball\t3003\n4\tPoké Ball\t3004\n5\tSafari Ball\t3005\n6\tNet Ball\t3006\n7\tDive Ball\t3"
  },
  {
    "path": "VeekunImport/items4.txt",
    "chars": 9717,
    "preview": "1\tMaster Ball\t3001\n2\tUltra Ball\t3002\n3\tGreat Ball\t3003\n4\tPoké Ball\t3004\n5\tSafari Ball\t3005\n6\tNet Ball\t3006\n7\tDive Ball\t"
  },
  {
    "path": "VeekunImport/items5.txt",
    "chars": 11860,
    "preview": "1\tMaster Ball\t3001\n2\tUltra Ball\t3002\n3\tGreat Ball\t3003\n4\tPoké Ball\t3004\n5\tSafari Ball\t3005\n6\tNet Ball\t3006\n7\tDive Ball\t3"
  },
  {
    "path": "VeekunImport/items_balls.txt",
    "chars": 484,
    "preview": "1\tMaster Ball\t3001\n2\tUltra Ball\t3002\n3\tGreat Ball\t3003\n4\tPoké Ball\t3004\n5\tSafari Ball\t3005\n6\tNet Ball\t3006\n7\tDive Ball\t"
  },
  {
    "path": "VeekunImport/packages.config",
    "chars": 341,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Stub.System.Data.SQLite.Core.NetFramework\" version=\"1."
  },
  {
    "path": "VeekunImport/regions.txt",
    "chars": 80,
    "preview": "1\tEvent\n2\tKanto\n3\tJohto\n4\tHoenn\n5\tOrre\n6\tSevii Islands\n7\tSinnoh\n8\tUnova\n9\tKalos"
  },
  {
    "path": "VeekunImport/ribbon_positions3.txt",
    "chars": 119,
    "preview": "3021\t15\t;Champion Ribbon\n3022\t16\t;Winning Ribbon\n3023\t17\t;Victory Ribbon\n3024\t18\t;Artist Ribbon\n3025\t19\t;Effort Ribbon"
  },
  {
    "path": "VeekunImport/ribbon_positions4.txt",
    "chars": 2288,
    "preview": "3001\t0\t;Hoenn Cool Ribbon\n3002\t1\t;Hoenn Cool Ribbon Super\n3003\t2\t;Hoenn Cool Ribbon Hyper\n3004\t3\t;Hoenn Cool Ribbon Mas"
  },
  {
    "path": "VeekunImport/ribbon_positions5.txt",
    "chars": 2338,
    "preview": "3001\t0\t;Hoenn Cool Ribbon\n3002\t1\t;Hoenn Cool Ribbon Super\n3003\t2\t;Hoenn Cool Ribbon Hyper\n3004\t3\t;Hoenn Cool Ribbon Mas"
  },
  {
    "path": "VeekunImport/ribbons.txt",
    "chars": 6607,
    "preview": "3001\tCool Ribbon\tHoenn Cool Contest Normal Rank winner!\n3002\tCool Ribbon Super\tHoenn Cool Contest Super Rank winner!\n30"
  },
  {
    "path": "bvCrawler4/App.config",
    "chars": 963,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <connectionStrings>\r\n    <add name=\"pkmnFoundationsConnectio"
  },
  {
    "path": "bvCrawler4/Program.cs",
    "chars": 21000,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing Syste"
  },
  {
    "path": "bvCrawler4/Properties/AssemblyInfo.cs",
    "chars": 1429,
    "preview": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General I"
  },
  {
    "path": "bvCrawler4/bvCrawler4.csproj",
    "chars": 3205,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "bvCrawler4/packages.config",
    "chars": 132,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"MySql.Data\" version=\"6.9.8\" targetFramework=\"net40\" />"
  },
  {
    "path": "bvCrawler5/App.config",
    "chars": 963,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <connectionStrings>\r\n    <add name=\"pkmnFoundationsConnectio"
  },
  {
    "path": "bvCrawler5/Program.cs",
    "chars": 25558,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\nusing Syste"
  },
  {
    "path": "bvCrawler5/Properties/AssemblyInfo.cs",
    "chars": 1429,
    "preview": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General I"
  },
  {
    "path": "bvCrawler5/bvCrawler5.csproj",
    "chars": 3086,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "bvCrawler5/packages.config",
    "chars": 132,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"MySql.Data\" version=\"6.9.8\" targetFramework=\"net40\" />"
  },
  {
    "path": "bvRestorer4/App.config",
    "chars": 403,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"pkmnFoundationsConnectionStr"
  },
  {
    "path": "bvRestorer4/Program.cs",
    "chars": 3154,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing PkmnFounda"
  },
  {
    "path": "bvRestorer4/Properties/AssemblyInfo.cs",
    "chars": 1395,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "bvRestorer4/bvRestorer4.csproj",
    "chars": 2709,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microso"
  },
  {
    "path": "bvRestorer5/App.config",
    "chars": 423,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <startup> \n        \n    <supportedRuntime version=\"v2.0.50727"
  },
  {
    "path": "bvRestorer5/Program.cs",
    "chars": 2493,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "bvRestorer5/Properties/AssemblyInfo.cs",
    "chars": 1395,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "bvRestorer5/bvRestorer5.csproj",
    "chars": 2738,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "gts/Global.asax",
    "chars": 101,
    "preview": "<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"PkmnFoundations.GTS.Global\" Language=\"C#\" %>\r\n"
  },
  {
    "path": "gts/Global.asax.cs",
    "chars": 3836,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Web;\r\nusing System.Web.Security;\r\nus"
  },
  {
    "path": "gts/Properties/AssemblyInfo.cs",
    "chars": 1374,
    "preview": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General I"
  },
  {
    "path": "gts/Properties/PublishProfiles/Local IIS.pubxml",
    "chars": 687,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nhttps://go.microsoft.com/fwlink/?LinkID=208121. \n-->\n<Project ToolsVersion="
  },
  {
    "path": "gts/Properties/PublishProfiles/Public.pubxml",
    "chars": 1108,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\nThis file is used by the publish/package process of your Web project. You ca"
  },
  {
    "path": "gts/Web.Public.config",
    "chars": 537,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n"
  },
  {
    "path": "gts/Web.config",
    "chars": 1361,
    "preview": "<?xml version=\"1.0\"?>\r\n\r\n<!--\r\n  For more information on how to configure your ASP.NET application, please visit\r\n  htt"
  },
  {
    "path": "gts/admin/Sessions.aspx",
    "chars": 403,
    "preview": "<%@ Page Title=\"\" Language=\"C#\" MasterPageFile=\"~/masters/MasterPage.master\" AutoEventWireup=\"true\" CodeBehind=\"Session"
  },
  {
    "path": "gts/admin/Sessions.aspx.cs",
    "chars": 1468,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Web;\nusing System.We"
  },
  {
    "path": "gts/admin/Sessions.aspx.designer.cs",
    "chars": 770,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "gts/admin/Web.Debug.config",
    "chars": 1361,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.mic"
  },
  {
    "path": "gts/admin/Web.Release.config",
    "chars": 1364,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.mic"
  },
  {
    "path": "gts/admin/Web.config",
    "chars": 129,
    "preview": "<?xml version=\"1.0\"?>\n<configuration>\n  <system.web>\n    <authorization>\n\n    </authorization>\n  </system.web>\n</config"
  },
  {
    "path": "gts/gts.csproj",
    "chars": 8382,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "gts/masters/MasterPage.master",
    "chars": 387,
    "preview": "<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"MasterPage.master.cs\" Inherits=\"PkmnFoundations.GTS.masters"
  },
  {
    "path": "gts/masters/MasterPage.master.cs",
    "chars": 339,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System."
  },
  {
    "path": "gts/masters/MasterPage.master.designer.cs",
    "chars": 1106,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "gts/pgl.ashx",
    "chars": 90,
    "preview": "<%@ WebHandler Language=\"C#\" CodeBehind=\"pgl.ashx.cs\" Class=\"PkmnFoundations.GTS.pgl\" %>\n"
  },
  {
    "path": "gts/pgl.ashx.cs",
    "chars": 4582,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing PkmnFoundations.Support;\n\nna"
  },
  {
    "path": "gts/pkvldtprod.ashx",
    "chars": 104,
    "preview": "<%@ WebHandler Language=\"C#\" CodeBehind=\"pkvldtprod.ashx.cs\" Class=\"PkmnFoundations.GTS.pkvldtprod\" %>\n"
  },
  {
    "path": "gts/pkvldtprod.ashx.cs",
    "chars": 5708,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.IO;\nusing PkmnFoundat"
  },
  {
    "path": "gts/pokemondpds.ashx",
    "chars": 107,
    "preview": "<%@ WebHandler Language=\"C#\" CodeBehind=\"pokemondpds.ashx.cs\" Class=\"PkmnFoundations.GTS.pokemondpds\" %>\r\n"
  },
  {
    "path": "gts/pokemondpds.ashx.cs",
    "chars": 33902,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Web;\r\nusing System.Web.SessionState;"
  },
  {
    "path": "gts/pokemondpds_web.ashx",
    "chars": 114,
    "preview": "<%@ WebHandler Language=\"C#\" CodeBehind=\"pokemondpds_web.ashx.cs\" Class=\"PkmnFoundations.GTS.pokemondpds_web\" %>\n"
  },
  {
    "path": "gts/pokemondpds_web.ashx.cs",
    "chars": 15544,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Web;\nusing GamestatsBa"
  },
  {
    "path": "gts/src/AppStateHelper.cs",
    "chars": 1098,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing PkmnFoundations.Data;\n\nnames"
  },
  {
    "path": "gts/src/BanHelper.cs",
    "chars": 2457,
    "preview": "using PkmnFoundations.Data;\nusing PkmnFoundations.Structures;\nusing PkmnFoundations.Wfc;\nusing System;\nusing System.Col"
  },
  {
    "path": "gts/src/FakeOpponentGenerator.cs",
    "chars": 35468,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing PkmnFoundations.Structures;\n"
  },
  {
    "path": "gts/src/IpAddressHelper.cs",
    "chars": 1788,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Web;\n\nnames"
  },
  {
    "path": "gts/syachi2ds.ashx",
    "chars": 103,
    "preview": "<%@ WebHandler Language=\"C#\" CodeBehind=\"syachi2ds.ashx.cs\" Class=\"PkmnFoundations.GTS.syachi2ds\" %>\r\n"
  },
  {
    "path": "gts/syachi2ds.ashx.cs",
    "chars": 27742,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Web;\r\nusing System.Web.SessionState;"
  },
  {
    "path": "library/Data/DataMysql.cs",
    "chars": 202037,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Data;\r\nusing MyS"
  },
  {
    "path": "library/Data/DataSqlite.cs",
    "chars": 690,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Data;\r\nusing Sys"
  },
  {
    "path": "library/Data/Database.cs",
    "chars": 14955,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Data;\nusing PkmnFoun"
  },
  {
    "path": "library/Data/DatabaseExtender.cs",
    "chars": 14031,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Web;\r\nusing System.Data;\r\nusing Syst"
  },
  {
    "path": "library/Data/MySqlDatabaseExtender.cs",
    "chars": 4800,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing MySql.Da"
  },
  {
    "path": "library/Data/SqlDatabaseExtender.cs",
    "chars": 4516,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Data.SqlClient;\nusing System.Linq;\nusin"
  },
  {
    "path": "library/Library.csproj",
    "chars": 8341,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "library/Pokedex/Ability.cs",
    "chars": 1087,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/Evolution.cs",
    "chars": 187,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Pokede"
  },
  {
    "path": "library/Pokedex/Family.cs",
    "chars": 3579,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/Form.cs",
    "chars": 3766,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/FormAbilities.cs",
    "chars": 3617,
    "preview": "using PkmnFoundations.Data;\nusing PkmnFoundations.Structures;\nusing PkmnFoundations.Support;\nusing System;\nusing System"
  },
  {
    "path": "library/Pokedex/FormStats.cs",
    "chars": 3228,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/Item.cs",
    "chars": 3667,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/Location.cs",
    "chars": 6146,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/Move.cs",
    "chars": 2500,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/Pokedex.cs",
    "chars": 13379,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoundations.Data;\nusing"
  },
  {
    "path": "library/Pokedex/PokedexRecordBase.cs",
    "chars": 1485,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/Region.cs",
    "chars": 952,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/Ribbon.cs",
    "chars": 3805,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/Species.cs",
    "chars": 3770,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Pokedex/Type.cs",
    "chars": 1472,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoun"
  },
  {
    "path": "library/Properties/AssemblyInfo.cs",
    "chars": 1441,
    "preview": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General I"
  },
  {
    "path": "library/Structures/ByteStatValues.cs",
    "chars": 495,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Struct"
  },
  {
    "path": "library/Structures/ContestStatValues.cs",
    "chars": 1478,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Struct"
  },
  {
    "path": "library/Structures/Enums.cs",
    "chars": 5004,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\n\r\nnamespace PkmnFoundations.S"
  },
  {
    "path": "library/Structures/Format.cs",
    "chars": 2634,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Struct"
  },
  {
    "path": "library/Structures/IntStatValues.cs",
    "chars": 484,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Struct"
  },
  {
    "path": "library/Structures/IvStatValues.cs",
    "chars": 4053,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Struct"
  },
  {
    "path": "library/Structures/MoveSlot.cs",
    "chars": 1310,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoundations.Pokedex;\nus"
  },
  {
    "path": "library/Structures/Pokemon4.cs",
    "chars": 16422,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Structures/Pokemon5.cs",
    "chars": 16174,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Structures/PokemonBase.cs",
    "chars": 12844,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.IO;\nusing System.Lin"
  },
  {
    "path": "library/Structures/PokemonParty4.cs",
    "chars": 3167,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnF"
  },
  {
    "path": "library/Structures/PokemonParty5.cs",
    "chars": 3189,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnF"
  },
  {
    "path": "library/Structures/PokemonPartyBase.cs",
    "chars": 7258,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoundations.Pokedex;\nus"
  },
  {
    "path": "library/Structures/StatValues.cs",
    "chars": 1727,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Struct"
  },
  {
    "path": "library/Structures/StatValuesBase.cs",
    "chars": 916,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Struct"
  },
  {
    "path": "library/Structures/TrainerMemo.cs",
    "chars": 3459,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoundations.Pokedex;\nus"
  },
  {
    "path": "library/Support/AliasTable.cs",
    "chars": 3005,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace PkmnFoundations.Support\n{\n  /// <summary>\n  /// Vose's imple"
  },
  {
    "path": "library/Support/AssertHelper.cs",
    "chars": 933,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\n\r\nna"
  },
  {
    "path": "library/Support/BinarySerializableBase.cs",
    "chars": 1864,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.Serialization;"
  },
  {
    "path": "library/Support/EncodedString4.cs",
    "chars": 71378,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\n\r\nnamespace"
  },
  {
    "path": "library/Support/EncodedString5.cs",
    "chars": 4685,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.IO;\r\n\r\nnamespace"
  },
  {
    "path": "library/Support/EncodedStringBase.cs",
    "chars": 3676,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Suppor"
  },
  {
    "path": "library/Support/EnumerableExtender.cs",
    "chars": 1262,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Suppor"
  },
  {
    "path": "library/Support/GameSyncUtils.cs",
    "chars": 3858,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Suppor"
  },
  {
    "path": "library/Support/Indexer1d.cs",
    "chars": 1663,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace PkmnFoundations.Support\n{\n    /// <summar"
  },
  {
    "path": "library/Support/LazyKeyValuePair.cs",
    "chars": 2489,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Suppor"
  },
  {
    "path": "library/Support/LocalizedString.cs",
    "chars": 920,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\n\nnamespac"
  },
  {
    "path": "library/Support/LogHelper.cs",
    "chars": 2992,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing Sys"
  },
  {
    "path": "library/Support/StreamExtender.cs",
    "chars": 2584,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\n\nnamespace PkmnF"
  },
  {
    "path": "library/Support/StringHelper.cs",
    "chars": 723,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\n\nnamespace PkmnF"
  },
  {
    "path": "library/Support/TrendyPhrase4.cs",
    "chars": 32307,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Suppor"
  },
  {
    "path": "library/Support/TrendyPhrase5.cs",
    "chars": 40601,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Suppor"
  },
  {
    "path": "library/Support/TrendyPhraseBase.cs",
    "chars": 2477,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Suppor"
  },
  {
    "path": "library/Support/ValidationSummary.cs",
    "chars": 370,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Suppor"
  },
  {
    "path": "library/Wfc/BanStatus.cs",
    "chars": 666,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Wfc\n{\n"
  },
  {
    "path": "library/Wfc/BattleSubwayPokemon5.cs",
    "chars": 6191,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Wfc/BattleSubwayProfile5.cs",
    "chars": 3047,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Wfc/BattleSubwayRecord5.cs",
    "chars": 4521,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Wfc/BattleTowerPokemon4.cs",
    "chars": 5963,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Wfc/BattleTowerPokemonBase.cs",
    "chars": 3214,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Wfc/BattleTowerProfile4.cs",
    "chars": 3452,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Wfc/BattleTowerProfileBase.cs",
    "chars": 257,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Wfc\n{\n"
  },
  {
    "path": "library/Wfc/BattleTowerRecord4.cs",
    "chars": 4490,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Wfc/BattleTowerRecordBase.cs",
    "chars": 636,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoundations.Support;\n\nn"
  },
  {
    "path": "library/Wfc/BattleVideoHeader4.cs",
    "chars": 10448,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Wfc\n{\n"
  },
  {
    "path": "library/Wfc/BattleVideoHeader5.cs",
    "chars": 3563,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Wfc\n{\n"
  },
  {
    "path": "library/Wfc/BattleVideoRecord4.cs",
    "chars": 1693,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Wfc\n{\n"
  },
  {
    "path": "library/Wfc/BattleVideoRecord5.cs",
    "chars": 1693,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace PkmnFoundations.Wfc\n{\n"
  },
  {
    "path": "library/Wfc/BoxRecord4.cs",
    "chars": 2383,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Wfc/DressupRecord4.cs",
    "chars": 2330,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Wfc/GtsRecord4.cs",
    "chars": 10525,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Runtime.Serializatio"
  },
  {
    "path": "library/Wfc/GtsRecord5.cs",
    "chars": 10681,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Runtime.Serializatio"
  },
  {
    "path": "library/Wfc/GtsRecordBase.cs",
    "chars": 5148,
    "preview": "using PkmnFoundations.Support;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nus"
  },
  {
    "path": "library/Wfc/MusicalRecord5.cs",
    "chars": 4719,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing PkmnFounda"
  },
  {
    "path": "library/Wfc/PlazaQuestionnaire.cs",
    "chars": 10475,
    "preview": "using System;\nusing System.IO;\n\nnamespace PkmnFoundations.Wfc\n{\n    public class PlazaQuestionnaire\n    {\n        publi"
  },
  {
    "path": "library/Wfc/PlazaSchedule.cs",
    "chars": 3808,
    "preview": "using PkmnFoundations.Support;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusin"
  },
  {
    "path": "library/Wfc/TrainerProfile4.cs",
    "chars": 776,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing PkmnFoundations.Support;\n\nnamespace PkmnFounda"
  },
  {
    "path": "library/Wfc/TrainerProfile5.cs",
    "chars": 776,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing PkmnFoundations.Support;\n\nnamespace PkmnFounda"
  },
  {
    "path": "library/Wfc/TrainerProfileBase.cs",
    "chars": 3198,
    "preview": "using PkmnFoundations.Structures;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nu"
  },
  {
    "path": "library/Wfc/TrainerProfilePlaza.cs",
    "chars": 2093,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing PkmnFoundations.Structures;"
  },
  {
    "path": "library/Wfc/TrainerRankings.cs",
    "chars": 14508,
    "preview": "using PkmnFoundations.Structures;\nusing PkmnFoundations.Support;\nusing System;\nusing System.Collections.Generic;\nusing "
  },
  {
    "path": "library/Wfc/VipRecord.cs",
    "chars": 1996,
    "preview": "using PkmnFoundations.Support;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing"
  },
  {
    "path": "library/app.config",
    "chars": 702,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <system.data>\n    <DbProviderFactories>\n      <add name=\"SQLit"
  },
  {
    "path": "library/database.sql",
    "chars": 44169,
    "preview": "-- --------------------------------------------------------\n-- Host:                         127.0.0.1\n-- Server version"
  },
  {
    "path": "library/lib/SQLite.Designer.xml",
    "chars": 17118,
    "preview": "<?xml version=\"1.0\"?>\r\n<doc>\r\n    <assembly>\r\n        <name>SQLite.Designer</name>\r\n    </assembly>\r\n    <members>\r\n    "
  },
  {
    "path": "library/lib/System.Data.SQLite.Linq.xml",
    "chars": 113915,
    "preview": "<?xml version=\"1.0\"?>\r\n<doc>\r\n    <assembly>\r\n        <name>System.Data.SQLite.Linq</name>\r\n    </assembly>\r\n    <member"
  },
  {
    "path": "library/lib/System.Data.SQLite.dll.config",
    "chars": 4843,
    "preview": "<?xml version=\"1.0\"?>\r\n<!--\r\n *\r\n * System.Data.SQLite.dll.config -\r\n *\r\n * Written by Joe Mistachkin.\r\n * Released to t"
  },
  {
    "path": "library/lib/System.Data.SQLite.xml",
    "chars": 683655,
    "preview": "<?xml version=\"1.0\"?>\r\n<doc>\r\n    <assembly>\r\n        <name>System.Data.SQLite</name>\r\n    </assembly>\r\n    <members>\r\n "
  },
  {
    "path": "library/packages.config",
    "chars": 385,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"MySql.Data\" version=\"6.9.8\" targetFramework=\"net35\" />"
  },
  {
    "path": "pkmn-classic-framework.sln",
    "chars": 14055,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.3212"
  },
  {
    "path": "pokedex/Shiny lock generations.txt",
    "chars": 725,
    "preview": "NatDex\tName\tNo ribbon including Wiimmfi events\tNo ribbon full legal\tAny including ribbons\n251\tCelebi  \t7\t7\t7\n493\tArceus "
  },
  {
    "path": "towerRestorer4/App.config",
    "chars": 421,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"pkmnFoundationsConnectionStr"
  }
]

// ... and 114 more files (download for full content)

About this extraction

This page contains the full source code of the mm201/pkmn-classic-framework GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 314 files (2.5 MB), approximately 663.1k tokens, and a symbol index with 1206 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!