[
  {
    "path": ".gitattributes",
    "content": "# Path-based git attributes\n# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html\n\n# Ignore all test and documentation with \"export-ignore\".\n/.gitattributes     export-ignore\n/.gitignore         export-ignore\n/phpunit.xml.dist   export-ignore\n/tests              export-ignore\n"
  },
  {
    "path": ".gitignore",
    "content": ".env\nvendor\ncomposer.lock\nstorage/logs\n.idea\nbuild\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright (c) 2016, Nicklas Wallgren\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met: \n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer. \n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "README.md",
    "content": "# PokemonGoAPI-PHP\n\n[![Total Downloads][ico-downloads]][link-packagist]\n[![PHP7 Ready](https://img.shields.io/badge/PHP7-ready-green.svg)][link-packagist]\n\nPokemon GO PHP API library\n\n# Install\nRun the command `composer require nicklasw/pkm-go-api`.\n\n# Usage\nEG:\n```php\n // Create the authentication config\n$config = new Config();\n$config->setProvider(Factory::PROVIDER_PTC);\n$config->setUser('INSERT_USER');\n$config->setPassword('INSERT_PASSWORD');\n\n// Create the authentication manager\n$manager = Factory::create($config);\n\n// Add a event listener,\n$manager->addListener(function ($event, $value) {\n    if ($event === Manager::EVENT_ACCESS_TOKEN) {\n        /** @var AccessToken $accessToken */\n        $accessToken = $value;\n\n        // Persist the access token in session storage, cache or whatever.\n    }\n});\n\n// Initialize the pokemon go application\n$application = new ApplicationKernel($manager);\n\n// Retrieve the pokemon go api instance\n$pokemonGoApi = $application->getPokemonGoApi();\n\n// Retrieve the inventory\n$inventory = $pokemonGoApi->getInventory();\n\n// Retrieve the poke bank\n$pokeBank = $inventory->getPokeBank();\n\n// Retrieve a pokemon of type pidgey\n$pokemon = $pokeBank->getPokemonsByType(PokemonId::PIDGEY)->first();\n\n// Transfer / Release the pokemon (Send to the meat grinder)\n$pokemon->transfer();\n```\n\n## TODO\n  - Implement the Map API\n  - Improve logging\n\n## Contributors\n  - [Nicklas Wallgren](https://github.com/NicklasWallgren)\n  - [Ni42](https://github.com/Ni42)\n  - [All Contributors][link-contributors]\n\n## Testing\n\n``` bash\n$ composer test\n```\n\n## Slack Chat\n\nWe use [Slack](https://slack.com) for community discussions. You can find our team here: https://pokemongoapi-php.slack.com\n\n## Credits\n- [Grover-c13](https://github.com/Grover-c13) for the inspiration\n- [AeonLucid](https://github.com/AeonLucid/POGOProtos) for improved protos\n\n[ico-downloads]: https://img.shields.io/packagist/dt/nicklasw/pkm-go-api.svg?style=flat-square\n\n[link-packagist]: https://packagist.org/packages/nicklasw/pkm-go-api\n[link-contributors]: ../../contributors\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"nicklasw/pkm-go-api\",\n    \"description\": \"The Pokemon Go API library.\",\n    \"keywords\": [\"Pokemon Go API\"],\n    \"license\": \"MIT\",\n    \"type\": \"project\",\n    \"require\": {\n        \"php\": \">=5.6\",\n        \"paquettg/php-html-parser\": \"1.7\",\n        \"guzzlehttp/guzzle\": \"^6.2.1\",\n        \"jeremeamia/xstatic\": \"^1.0\",\n        \"php-di/php-di\": \"^5.3\",\n        \"phpseclib/phpseclib\": \"^2.0\",\n        \"nicklasw/s2-geometry-library-php\": \"^v2.0\",\n        \"nicklasw/pogoprotos-php\": \"^v2.0\",\n        \"psr/log\": \"^1.0\",\n        \"illuminate/support\": \"^5.2\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"~4.0||~5.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"NicklasW\\\\PkmGoApi\\\\\": \"src/\"\n        },\n        \"files\": [\n            \"includes/config.php\"\n        ]\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"NicklasW\\\\PkmGoApi\\\\Test\\\\\": \"tests/\"\n        }\n    },\n    \"scripts\": {\n        \"test\": \"phpunit\"\n    }\n}\n"
  },
  {
    "path": "examples/AuthenticationExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\n\nclass AuthenticationExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        echo \"This is not a runnable script.\";\n\n        // EXAMPLE Authentication via Google user credentials\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_GOOGLE);\n        $config->setUser('INSERT_EMAIL');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // EXAMPLE Authentication via PTC user credentials\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // EXAMPLE Authentication via Google authentication code\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_GOOGLE);\n        $config->setAuthToken('INSERT_AUTHENTICATION_CODE');\n\n        // EXAMPLE Authentication via Google refresh token\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_GOOGLE);\n        $config->setRefreshToken('INSERT_AUTHENTICATION_REFRESH_TOKEN');\n\n        // Add a event listener,\n        $manager->addListener(function ($event, $value) {\n\n            if ($event === Manager::EVENT_ACCESS_TOKEN) {\n                /** @var AccessToken $accessToken */\n                $accessToken = $value;\n\n                // Persist the access token in session storage, cache or whatever.\n                // The persisted access token should be passed to the Authentication factory for authentication\n            }\n\n        });\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n    }\n\n}\n\necho \"This is not a runnable example script.\";\n"
  },
  {
    "path": "examples/CheckChallengeExample.php",
    "content": "<?php\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\n\nclass CheckChallengeRequest {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Initialize the error string\n        $error = null;\n\n        // EXAMPLE Authentication via PTC user credentials\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('');\n        $config->setPassword('');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the example application\n        $application = new ApplicationKernel($manager);\n\n        // Bookmarklet Config - load your own bookmarklet source to customize RECaptcha iframe injection logic\n        $bookmarkletUrl = \"https://aa2e9e20ba653c1903e8-f9a24a1a98160d8ae95f4a0da76ebd6d.ssl.cf1.rackcdn.com/js/pgo-captcha.js?v=1\";\n        $bookmarkletScript = \"javascript:(function(){document.body.appendChild(document.createElement('script')).src='\" . $bookmarkletUrl . \"';})();\";\n\n        if ($application)\n        {\n            $pogoApi = $application->getPokemonGoApi();\n            // Ensure api and user are not empty\n            if ($pogoApi && $config->getUser())\n            {\n                try {\n                    $checkChallenge = $pogoApi->checkChallenge()->getData();\n                } catch (Exception $e) {\n                    // DEBUG\n                    // 498 - invalid_grant in body response (missing token/expires values)\n                    // 503 - Oops! It seems that Pokemon.com has had an unexpected error.\n                    // 0   - default error code\n                    $error = 'ERROR ' . $e->getCode() . ': ' . $e->getMessage() . '\\n';\n                    $checkChallenge = FALSE;\n                }\n                \n                if ($checkChallenge)\n                {\n                    // Convert showChallenge boolean to string equiv\n                    $flagged = var_export($checkChallenge->getShowChallenge(), true);\n\n                    // Get challengeUrl value - appears to return \" \" (space) when user is not flagged for captcha\n                    $challengeUrl = $checkChallenge->getChallengeUrl();\n\n                    // If challengeUrl empty, hide \"SHOW CHALLANGE\" html\n                    $showUrl = empty(trim($challengeUrl)) ? 'hidden' : '';\n\n                    echo <<<EOBODY\n<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <title>Check Challenge Example</title>\n        <meta name=\"referrer\" content=\"no-referrer\" />\n    </head>\n    <body>\n        <div class=\"container\">\n            <h1 class=\"text-center\">Check Challenge Example</h1>\n            <pre>USER: {$config->getUser()} </pre>\n            <pre>SHOW CHALLANGE: {$flagged} </pre>\n            <pre class=\"{$showUrl}\">CHALLENGE URL: <a target=\"_blank\" rel=\"noreferrer\" href=\"{$challengeUrl}\">{$challengeUrl}</a></pre>\n            <pre>BOOKMARKLET: <a class=\"btn btn-primary btn-lg\" class=\"button\" href=\"{$bookmarkletScript}\">PGO-Captcha</a></pre>\n\n            <div id=\"instructions\">\n                <h2>Instructions:</h2>\n                <ol>\n                    <li><b>Drag and Drop the [ PGO-Captcha ] bookmarklet</b> button above to your browser's bookmark toolbar.</li>\n                    <li><b>Open the CHALLENGE URL</b> in a new tab.</li>\n                    <li><b>Execute the PGO-Captcha bookmarklet</b> against the challenge page to display the modified captcha form.</li>\n                    <li><b>Solve the captcha</b> that is displayed to generate a unique challenge token and copy it to your clipboard.</li>\n                    <li><b>Post the challenge token back</b> through the api using the script @ <a href='VerifyChallengeExample.php' target=_blank>VerifyChallengeExample.php</a></li>\n                </ol>\n\n                <h3>Alternatively to the bookmarklet, execute this JS using your browser's developer tools:</h3>\n                <pre>\nfunction captchaResponse(challengeToken){\n    var responseDiv=document.createElement('div');\n    responseDiv.id='response';\n    document.getElementsByTagName('body')[0].appendChild(responseDiv);\n    document.getElementById('response').innerHTML=challengeToken;\n}\nvar captchaHTML='&lt;form action=\"?\" method=\"POST\">&lt;div class=\"g-recaptcha\" data-size=\"compact\" data-sitekey=\"6LeeTScTAAAAADqvhqVMhPpr_vB9D364Ia-1dSgK\" data-callback=\"captchaResponse\">&lt;/div>&lt;/form>';\ndocument.body.parentElement.innerHTML=captchaHTML;\nvar script=document.createElement('script');\nscript.src='https://www.google.com/recaptcha/api.js?hl=en';\nscript.type='text/javascript';\ndocument.getElementsByTagName('head')[0].appendChild(script);\n                </pre>\n\n            </div><!-- //END #instructions -->\n        </div><!-- //END .container -->\n        <link href=\"http://getbootstrap.com/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    </body>\n</html>\nEOBODY;\n                    exit;\n                }\n                \n            }else\n                $error = \"Failed to initialize the PokemonGo API! Did you forget to set your credentials?\";\n        }else\n            $error = \"Failed to initialize the application kernel!\";\n\n        if ($error)\n        {\n            echo <<<EOERROR\n<!doctype html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"UTF-8\">\n        <link href=\"http://getbootstrap.com/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    </head>\n    <body>\n        <div class=\"alert alert-danger\">{$error}</div>\n    </body>\n</html>\nEOERROR;\n        }\n\n    }//END run()\n}//END CheckChallengeRequestExample\n\n$checkChallengeRequest = new CheckChallengeRequest();\n$checkChallengeRequest->run();\n\n?>"
  },
  {
    "path": "examples/GUI_BestCpPokemonDetails.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\nuse POGOProtos\\Enums\\PokemonFamilyId;\nuse POGOProtos\\Enums\\PokemonId;\n\n$config = new Config();\n$config->setProvider(Factory::PROVIDER_PTC);\n$config->setUser('INSERT_USER');\n$config->setPassword('INSERT_PASSWORD');\n\n$manager = Factory::create($config);\n\n$application = new ApplicationKernel($manager);\n$error = null;\n\nif ($application)\n{\n\t$pokemonGoApi = $application->getPokemonGoApi();\n\tif ($pokemonGoApi)\n\t{\n\t\t$pokez = $pokemonGoApi->getInventory()->getPokeBank()->getPokemons();\n\t\t$pokes = $pokez->sortByCp(true);\n\t\tif ($pokes)\n\t\t{\n\t\t\t$best = $pokes->first();\n\t\t\tif ($best)\n\t\t\t{\n\t\t\t\thtml_header();\n\t\t\t\thtml_start();\n\n\t\t\t\t$perc = round($best->getStamina()/$best->getStaminaMax() * 100);\n\t\t\t\t$fname = normalize(PokemonFamilyId::toString($best->getFamilyId()));\n\n\t\t\t\techo \"<table class='table table-bordered'>\";\n\t\t\t\techo \"<tr><td colspan='2' class='text-center'>\";\n\t\t\t\techo \"<h3>Pokemon '{$best->getName()}' details</h3>\";\n\t\t\t\techo \"<img src='http://veekun.com/dex/media/pokemon/main-sprites/omegaruby-alphasapphire/{$best->getPokemonId()}.png' title='{$fname}'>\";\n\t\t\t\techo \"<div class='progress center-block' style='width:200px;'>\";\n\t\t\t\techo \"<div class='progress-bar progress-bar-success' role='progressbar' aria-valuenow='{$best->getStamina()}' aria-valuemin='0' aria-valuemax='{$best->getStaminaMax()}' style='width: {$perc}%;'><div>{$best->getStamina()}/{$best->getStaminaMax()}</div></div>\";\n\t\t\t\techo \"</div>\";\n\t\t\t\techo \"</td></tr>\";\n\n\t\t\t\tmake_row(\"FamilyName\", $fname);\n\t\t\t\tmake_row(\"FamilyId\", $best->getFamilyId());\n\t\t\t\tmake_row(\"Name\", $best->getName());\n\t\t\t\tmake_row(\"Id\", $best->getId());\n\t\t\t\tmake_row(\"PokemonId\", $best->getPokemonId());\n\t\t\t\tmake_row(\"Type\", normalize($best->getType1String()));\n\t\t\t\tmake_row(\"Favorite\", $best->getFavorite() ? \"Yes\" : \"No\");\n\t\t\t\tmake_row(\"LVL\", $best->getLevel());\n\t\t\t\tmake_row(\"CP\", $best->getCp());\n\t\t\t\tmake_row(\"IV\", number_format($best->getIvRatio()*100, 2).\"%\");\n\t\t\t\tmake_row(\"HP\", $best->getStamina().\"/\".$best->getStaminaMax());\n\t\t\t\tmake_row(\"Attack 1\", normalize($best->getMove1String()));\n\t\t\t\tmake_row(\"Attack 2\", normalize($best->getMove2String()));\n\t\t\t\tmake_row(\"Height\", number_format($best->getHeightM(), 2).\" m\");\n\t\t\t\tmake_row(\"Weight\", number_format($best->getWeightKg(), 2).\" kg\");\n\t\t\t\tmake_row(\"Powerup cost\", $best->getStardustCostsForPowerup().\" stardust, \".$best->getCandyCostForPowerup().\" candies\");\n\t\t\t\tif ($best->getCandiesToEvolve() > 0)\n\t\t\t\t\tmake_row(\"Evolve cost\", $best->getCandiesToEvolve());\n\t\t\t\telse\n\t\t\t\t\tmake_row(\"Evolve\", \"Cannot be evolved\");\n\n\t\t\t\techo \"</table>\";\n\n\t\t\t\thtml_footer();\n\t\t\t}\n\t\t\telse\n\t\t\t\t$error = \"There is problem with getting best Pokemon from PokeBank.\";\n\t\t}\n\t\telse\n\t\t\t$error = \"There is problem with your PokeBank.\";\n\t}\n\telse\n\t\t$error = \"There is problem with PokemonGo API.\";\n}\nelse\n\t$error = \"Cannot connect with PokemonGo servers.\";\n\nif ($error)\n{\n\thtml_header();\n\tshow_error($error);\n\thtml_footer();\n}\n\nfunction normalize($text)\n{\n\treturn ucfirst(strtolower(str_replace(\"_\", \" \", str_replace(array(\"FAMILY_\", \"POKEMON_TYPE_\"), \"\", $text))));\n}\n\nfunction make_row($k, $v)\n{\n\techo \"\\n<tr>\\n<td>$k</td>\\n<td>$v</td>\\n</tr>\\n\";\n}\n\nfunction show_error($txt)\n{\n\techo \"<div class='alert alert-danger'>{$txt}</div>\";\n}\n\nfunction html_start()\n{\n\t?>\n\t<div class=\"container\">\n\t\t<div class=\"header clearfix\"><h3 class=\"text-muted\">PokemonGoAPI-PHP</h3></div>\n\t<?php\n}\n\nfunction html_stop()\n{\n\t?>\n\t</div>\n\t<?php\n}\n\nfunction html_header()\n{\n\t?>\n\t<!doctype html>\n\t<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t\t<meta name=\"Author\" content=\"Gandaflux\">\n\t\t<link href=\"http://getbootstrap.com/examples/jumbotron-narrow/jumbotron-narrow.css\" rel=\"stylesheet\">\n\t\t<link href=\"http://getbootstrap.com/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\t</head>\n\t<body>\n\t<?php\n}\n\nfunction html_footer()\n{\n\t?>\n\t<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\" integrity=\"sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa\" crossorigin=\"anonymous\"></script>\n\t</body>\n\t</html>\n\t<?php\n}\n\n?>"
  },
  {
    "path": "examples/ProxyExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse GuzzleHttp\\Client;\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\nuse GuzzleHttp\\RequestOptions;\n\nclass ProxyExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Create the authentication config\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n\n        // Pass a custom client to the library\n        $application->setClient(new Client(array(RequestOptions::PROXY => 'INSERT_PROXY')));\n\n        // Retrieve the pokemon go api instance\n        $pokemonGoApi = $application->getPokemonGoApi();\n\n        // Retrieve the profile\n        $profile = $pokemonGoApi->getProfile();\n\n        // Retrieve the profile data\n        $profileData = $profile->getData();\n\n        echo sprintf('The profile data: %s', print_r($profileData, true));\n    }\n\n}\n\n$example = new RetrievePlayerProfileExample();\n$example->run();"
  },
  {
    "path": "examples/ReleaseOnePidgeExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\nuse POGOProtos\\Enums\\PokemonId;\n\nclass ReleaseOnePidgeExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Create the authentication config\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n\n        // Retrieve the pokemon go api instance\n        $pokemonGoApi = $application->getPokemonGoApi();\n\n        // Retrieve the inventory\n        $inventory = $pokemonGoApi->getInventory();\n\n        // Retrieve the poke bank\n        $pokeBank = $inventory->getPokeBank();\n\n        // Retrieve a pokemon of type pidgey\n        $pokemon = $pokeBank->getPokemonsByType(PokemonId::PIDGEY)->first();\n\n        // Check if we retrieved a pokemon\n        if (!$pokemon) {\n            throw new Exception('No pokemon of type pidgey found. Please check your inventory');\n        }\n\n        // Transfer / Release the pokemon\n        $pokemon->transfer();\n    }\n\n}\n\n$example = new ReleaseOnePidgeExample();\n$example->run();"
  },
  {
    "path": "examples/RetrieveAppliedItemsExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\ItemMetaRegistry;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\ItemId;\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\n\nclass RetrieveAppliedItemsExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Create the authentication config\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n\n        // Retrieve the pokemon go api instance\n        $pokemonGoApi = $application->getPokemonGoApi();\n\n        // Retrieve the inventory\n        $inventory = $pokemonGoApi->getInventory();\n\n        // Retrieve the applied items instance\n        $appliedItems = $inventory->getAppliedItems();\n\n        // Retrieve the items within the applied items instance\n        $items = $appliedItems->getAppliedItems();\n\n        foreach($items as $item)\n        {\n            // Retrieve item name\n            $item->setName(ItemId::name($item->getItemId()));\n\n            echo sprintf('Applied item: %s', print_r($item, true));\n        }\n    }\n}\n\n$example = new RetrieveAppliedItemsExample();\n$example->run();\n"
  },
  {
    "path": "examples/RetrieveJournalExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\ItemId;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\PokemonId;\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\n\nclass RetrieveJournalExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Create the authentication config\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n\n        // Retrieve the pokemon go api instance\n        $pokemonGoApi = $application->getPokemonGoApi();\n\n        // Retrieve the journal data\n        $journal = $pokemonGoApi->getJournal();\n\n        // Loop across all Pokemon encounters\n        foreach($journal->getPokemons() as $pkmn) {\n            echo sprintf(\"[%s] [Pokemon] #%s %s, Result: %s, %s CP\\n\",\n                (new DateTime('@'.floor($pkmn->getTimestampMs()/1000)))->format('d.m.Y H:i'),\n                $pkmn->getPokemonId(), PokemonId::name($pkmn->getPokemonId()), $pkmn->getResult() == 2 ? 'flee' : 'captured',\n                $pkmn->getCombatPoints());\n        }\n\n        // Loop across all Pokestop interactions\n        foreach($journal->getForts() as $fort) {\n           echo sprintf(\"[%s] [Fort] Eggs: %s, Items: %s\\n\",\n               (new DateTime('@'.floor($fort->getTimestampMs()/1000)))->format('d.m.Y H:i'),\n               $fort->getEggs(),\n               array_reduce(\n                   $fort->getItems(),\n                   function($val, $e) {\n                       if($val) $val.=', ';\n                       return $val.$e->getCount().'x '.ItemId::name($e->getItemId());\n                   }\n               )\n           );\n        }\n    }\n\n}\n\n$example = new RetrieveJournalExample();\n$example->run();"
  },
  {
    "path": "examples/RetrievePlayerPokedexExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Data\\PokemonMetaRegistry;\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\n\nclass RetrievePlayerPokedexExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Create the authentication config\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n\n        // Retrieve the pokemon go api instance\n        $pokemonGoApi = $application->getPokemonGoApi();\n\n        // Retrieve the inventory\n        $inventory = $pokemonGoApi->getInventory();\n\n        // Retrieve the pokedex\n        $pokedex = $inventory->getPokedex();\n\n        // Show info about pokemons\n        for($i=1; $i<= 151; $i++)\n        {\n            // Retrieve MetaRegistry for pokemon\n            $pokemonmeta = PokemonMetaRegistry::getByPokemonId($i);\n\n            // Retrieve Pokedex entry for pokemon\n            $pokemondata = $pokedex->get($i);\n\n            // If pokedex is empty we don't 'know' that creature\n            if($pokemondata !== null)\n            {\n                echo sprintf(\"Informations about Pokemon %d. Name: %s \\n\", $i, $pokemonmeta->getuniqueId());\n            }\n            else\n                echo sprintf(\"No information about id: %d \\n\", $i);\n        }\n    }\n}\n\n$example = new RetrievePlayerPokedexExample();\n$example->run();\n"
  },
  {
    "path": "examples/RetrievePlayerProfileExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\n\nclass RetrievePlayerProfileExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Create the authentication config\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n\n        // Retrieve the pokemon go api instance\n        $pokemonGoApi = $application->getPokemonGoApi();\n\n        // Retrieve the profile\n        $profile = $pokemonGoApi->getProfile();\n\n        // Retrieve the profile data\n        $profileData = $profile->getData();\n\n        echo sprintf('The profile data: %s', print_r($profileData, true));\n    }\n\n}\n\n$example = new RetrievePlayerProfileExample();\n$example->run();"
  },
  {
    "path": "examples/RetrievePlayerStatsExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\n\nclass RetrievePlayerStatsExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Create the authentication config\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n\n        // Retrieve the pokemon go api instance\n        $pokemonGoApi = $application->getPokemonGoApi();\n\n        // Retrieve the inventory\n        $inventory = $pokemonGoApi->getInventory();\n\n        // Retrieve the player stats\n        $playerStats = $inventory->getStats();\n\n        echo sprintf('The player level: %s', $playerStats->getLevel());\n    }\n\n}\n\n$example = new RetrievePlayerStatsExample();\n$example->run();"
  },
  {
    "path": "examples/RetrievePokemonCandyCountExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\nuse POGOProtos\\Enums\\PokemonFamilyId;\n\nclass RetrievePokemonCandyCountExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Create the authentication config\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n\n        // Retrieve the pokemon go api instance\n        $pokemonGoApi = $application->getPokemonGoApi();\n\n        // Retrieve the inventory\n        $inventory = $pokemonGoApi->getInventory();\n\n        // Retrieve the candy bank\n        $candyBank = $inventory->getCandyBank();\n\n        // Retrieve the pidgey candy item\n        $candyItem = $candyBank->get(PokemonFamilyId::FAMILY_PIDGEY);\n\n        echo sprintf('Number or pidgey candies \\'%s\\'', $candyItem->getCount());\n    }\n\n}\n\n$example = new RetrievePokemonCandyCountExample();\n$example->run();"
  },
  {
    "path": "examples/RetrievePokemonCountExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\nuse POGOProtos\\Enums\\PokemonId;\n\nclass RetrievePokemonCountExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Create the authentication config\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n\n        // Retrieve the pokemon go api instance\n        $pokemonGoApi = $application->getPokemonGoApi();\n\n        // Retrieve the inventory\n        $inventory = $pokemonGoApi->getInventory();\n\n        // Retrieve the poke bank\n        $pokeBank = $inventory->getPokeBank();\n\n        // Retrieve a pokemons of type pidgey\n        $pokemons = $pokeBank->getPokemonsByType(PokemonId::PIDGEY);\n\n        echo sprintf('Number of pokemon of type pidgey: \\'%s\\'', sizeof($pokemons));\n    }\n\n}\n\n$example = new RetrievePokemonCountExample();\n$example->run();"
  },
  {
    "path": "examples/RetrievePokemonTraitExample.php",
    "content": "<?php\n\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\nuse POGOProtos\\Enums\\PokemonId;\n\nclass RetrievePokemonTraitExample {\n\n    /**\n     * Run the example.\n     */\n    public function run()\n    {\n        // Create the authentication config\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('INSERT_USER');\n        $config->setPassword('INSERT_PASSWORD');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application\n        $application = new ApplicationKernel($manager);\n\n        // Retrieve the pokemon go api instance\n        $pokemonGoApi = $application->getPokemonGoApi();\n\n        // Retrieve the inventory\n        $inventory = $pokemonGoApi->getInventory();\n\n        // Retrieve the poke bank\n        $pokeBank = $inventory->getPokeBank();\n\n        // Retrieve a pokemon of type pidgey\n        $pokemon = $pokeBank->getPokemons()->first();\n\n        // Check if we retrieved a pokemon\n        if (!$pokemon) {\n            throw new Exception('Cannot find any pokemons in your PokeBank.');\n        }\n\n        echo sprintf(\"Pokemon %s, Id: %s, Cp: %d, type: %s, attacks: %s and %s, \", $pokemon->getName(), $pokemon->getId(), $pokemon->getCp(), $pokemon->getType1String(), $pokemon->getMove1String(), $pokemon->getMove2String());\n\n    }\n\n}\n\n$example = new RetrievePokemonTraitExample();\n$example->run();"
  },
  {
    "path": "examples/VerifyChallengeExample.php",
    "content": "<?php\nrequire __DIR__ . '/../vendor/autoload.php';\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\n\nclass VerifyChallengeRequest {\n    \n    /**\n     * Display the verifyChallenge html form.\n     */\n    public function showForm()\n    {\n        echo <<<EOFORM\n<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <title>Verify Challenge Example</title>\n        <meta name=\"referrer\" content=\"no-referrer\" />\n    </head>\n    <body>\n        <div class=\"container\">\n            <h1 class=\"text-center\">Verify Challenge Example</h1>\n            <form id=\"challengeForm\" role=\"form\">\n                <div class=\"form-group\">\n                    <label class=\"control-label\" for=\"token\">RECaptcha Challenge Token</label>\n                    <textarea class=\"form-control\" cols=\"40\" id=\"token\" name=\"token\" rows=\"10\"></textarea>\n                    <p class=\"help-block\">\n                        The RECaptcha challenge token can be obtained by using the <a href=\"CheckChallengeExample.php\" target=\"_blank\">CheckChallengeExample.php</a> script and PGO-Captcha bookmarklet.\n                    </p>\n                    <small>\n                        Ex POST: <code>\\$_POST['token']</code><br/>\n                        Ex Response: <code>\"{\\\"user\\\":\\\"YOURUSERNAME\\\",\\\"success\\\":true}\"</code>\n                    </small>\n                </div>\n                <div class=\"form-group text-center\">\n                    <button id=\"form-submit\" type=\"submit\" class=\"btn btn-lg btn-success\">SUBMIT</button>\n                </div>\n            </form>\n            <div id=\"results\"></div>\n        </div>\n        <link href=\"http://getbootstrap.com/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n        <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js\"></script>\n        <script>\n            $(\"#challengeForm\").submit(function(event){\n                event.preventDefault();\n                submitForm();\n            });\n            function submitForm(){\n                var token = $(\"#token\").val();\n                $.ajax({\n                    type: \"POST\",\n                    url: \"VerifyChallengeExample.php\",\n                    data: \"token=\" + token,\n                    beforeSend: function(){\n                        $(\"#results\").html(\"<pre>... LOADING ...</pre>\");\n                    },\n                    success : function(response){\n                        if (response){\n                            $(\"#results\").html(\"<pre>\" + JSON.stringify(response) + \"</pre>\");\n                        }\n                    }\n                });\n            }\n        </script>\n    </body>\n</html>\nEOFORM;\n        exit;\n    }\n    \n    /**\n     * Authenticate and submit the user supplied challenge token through API.\n     */\n    public function processRequest($token)\n    {\n        // Initialize error string\n        $error = null;\n        \n        // EXAMPLE Authentication via PTC user credentials\n        $config = new Config();\n        $config->setProvider(Factory::PROVIDER_PTC);\n        $config->setUser('');\n        $config->setPassword('');\n\n        // Create the authentication manager\n        $manager = Factory::create($config);\n\n        // Initialize the pokemon go application kernel\n        $application = new ApplicationKernel($manager);\n        if ($application)\n        {\n            // Initialize the pokemon go api\n            $pogoApi = $application->getPokemonGoApi();\n            if ($pogoApi)\n            {\n                // Process api request\n                $success = $pogoApi->verifyChallenge($token);\n\n                $challengeResponse = [\n                    \"user\" => $config->getUser(),\n                    \"success\" => $success,\n                ];\n\n                // return JSON encoded challengeResponse\n                return json_encode($challengeResponse);\n                \n            }else\n                $error = \"Failed to initialize the PokemonGo API!\";\n        }else\n            $error = \"Failed to initialize the application kernel!\";\n            \n        if ($error) { return json_encode(array(\"error\", $error)); }\n        \n    }//END sendToken()\n    \n}//END VerifyChallengeRequest\n\n// Initialize VerifyChallengeRequest\n$verifyChallengeRequest = new VerifyChallengeRequest();\n\n// Sanatize User Supplied Post Input\n$_POST = !empty($_POST) ? filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING) : null;\n\n// Check For Post\nif(!$_POST) {\n    // Display challengeForm if no postback detected\n    $verifyChallengeRequest->showForm();\n}else {\n    // Check for challenge token\n    if($_POST['token']) {\n        // Process request\n        echo $verifyChallengeRequest->processRequest($_POST['token']);\n    }\n    else {\n        // POST received but token not specified.\n        echo json_encode(array(\"error\", \"POST detected but no valid TOKEN value supplied!\"));\n    }\n}\n?>"
  },
  {
    "path": "includes/config.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Str;\n\nif (!function_exists('env')) {\n    /**\n     * Gets the value of an environment variable. Supports boolean, empty and null.\n     *\n     * @param  string $key\n     * @param  mixed  $default\n     * @return mixed\n     */\n    function env($key, $default = null)\n    {\n        $value = getenv($key);\n\n        if ($value === false) {\n            return value($default);\n        }\n\n        switch (strtolower($value)) {\n            case 'true':\n            case '(true)':\n                return true;\n\n            case 'false':\n            case '(false)':\n                return false;\n\n            case 'empty':\n            case '(empty)':\n                return '';\n\n            case 'null':\n            case '(null)':\n                return;\n        }\n\n        if (strlen($value) > 1 && Str::startsWith($value, '\"') && Str::endsWith($value, '\"')) {\n            return substr($value, 1, -1);\n        }\n\n        return $value;\n    }\n}"
  },
  {
    "path": "includes/protocolbuffers.inc.php",
    "content": "<?php\n/****\n * PHP Protocol Buffer Parser\n * https://github.com/bramp/protoc-gen-php\n * Licence (Simplified BSD License)\n * --------------------------------\n * Copyright (c) 2010-2016, Andrew Brampton\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nif (PHP_INT_SIZE !== 8) {\n\techo 'For now we only support PHP on 64bit platforms \\n';\n\n    die();\n}\n\nfunction checkArgument($exp, $message)\n{\n    if (!$exp) {\n        throw new InvalidArgumentException($message);\n    }\n}\n\nabstract class ProtobufIO {\n\n    public static function toStream($in, &$limit = PHP_INT_MAX)\n    {\n        // If the input is a string, turn it into a stream and decode it\n        if (is_string($in)) {\n            $limit = min($limit, strlen($in));\n            $fp = fopen('php://temp', 'w+b');\n            fwrite($fp, $in, $limit);\n            rewind($fp);\n            return $fp;\n        }\n\n        checkArgument(get_resource_type($in) === 'stream', 'fp must be a string or file resource');\n        return $in;\n    }\n}\n\nabstract class ProtobufEnum {\n\n    public static function toString($value)\n    {\n        checkArgument(is_int($value), 'value must be a integer');\n\n        if (array_key_exists($value, self::$_values))\n            return self::$_values[$value];\n\n        return 'UNKNOWN';\n    }\n}\n\nabstract class ProtobufMessage {\n\n    private $_unknown;\n\n    function __construct($fp = null, &$limit = PHP_INT_MAX)\n    {\n        // Zero arguments, so construct a empty one\n        if ($fp === null) {\n            return;\n        }\n\n        // Decode\n        $this->read($fp, $limit);\n    }\n\n    // Reads the protobuf\n    public function read($in, &$limit = PHP_INT_MAX)\n    {\n        $fp = ProtobufIO::toStream($in, $limit);\n        while (!feof($fp) && $limit > 0) {\n            $tag = self::read_varint($fp, $limit);\n            if ($tag === false) break;\n            $wire = $tag & 0x07;\n            $field = $tag >> 3;\n\n            $field_idx = $field . '-' . self::get_wiretype($wire);\n            $this->_unknown[$field_idx][] = self::read_field($fp, $wire, $limit);\n        }\n    }\n\n    abstract public function write($fp);\n\n    abstract public function size();\n\n\n    // TODO Rename this\n    public function toProtobuf()\n    {\n        $fp = fopen('php://temp', 'w+b');\n        $this->write($fp);\n        rewind($fp);\n        return stream_get_contents($fp);\n    }\n}\n\n/**\n * Class to aid in the parsing and creating of Protocol Buffer Messages\n * This class should be included by the developer before they use a\n * generated protobuf class.\n *\n * @author Andrew Brampton\n */\nabstract class Protobuf {\n\n    const TYPE_DOUBLE = 1;   // double, exactly eight bytes on the wire.\n\n    const TYPE_FLOAT = 2;   // float, exactly four bytes on the wire.\n\n    const TYPE_INT64 = 3;   // int64, varint on the wire.  Negative numbers\n\n    // take 10 bytes.  Use TYPE_SINT64 if negative\n    // values are likely.\n    const TYPE_UINT64 = 4;   // uint64, varint on the wire.\n\n    const TYPE_INT32 = 5;   // int32, varint on the wire.  Negative numbers\n\n    // take 10 bytes.  Use TYPE_SINT32 if negative\n    // values are likely.\n    const TYPE_FIXED64 = 6;   // uint64, exactly eight bytes on the wire.\n\n    const TYPE_FIXED32 = 7;   // uint32, exactly four bytes on the wire.\n\n    const TYPE_BOOL = 8;   // bool, varint on the wire.\n\n    const TYPE_STRING = 9;   // UTF-8 text.\n\n    const TYPE_GROUP = 10;  // Tag-delimited message.  Deprecated.\n\n    const TYPE_MESSAGE = 11;  // Length-delimited message.\n\n    const TYPE_BYTES = 12;  // Arbitrary byte array.\n\n    const TYPE_UINT32 = 13;  // uint32, varint on the wire\n\n    const TYPE_ENUM = 14;  // Enum, varint on the wire\n\n    const TYPE_SFIXED32 = 15;  // int32, exactly four bytes on the wire\n\n    const TYPE_SFIXED64 = 16;  // int64, exactly eight bytes on the wire\n\n    const TYPE_SINT32 = 17;  // int32, ZigZag-encoded varint on the wire\n\n    const TYPE_SINT64 = 18;  // int64, ZigZag-encoded varint on the wire\n\n    const MIN_INT32 = -2147483648;\n\n    const MAX_INT32 = 2147483647;\n\n    const MIN_UINT32 = 0;\n\n    const MAX_UINT32 = 4294967296;\n\n    const MIN_INT64 = -9223372036854775808;\n\n    const MAX_INT64 = 9223372036854775807;\n\n    const MIN_UINT64 = 0;\n\n    const MAX_UINT64 = 18446744073709551616;\n\n    const MAX_VARINT_LEN = 10;\n\n    const MAX_PHP_INT_VARINT_LEN = 9; // The length of the longest varint that represents a valid PHP int\n\n    /**\n     * Returns a string representing this wiretype\n     * // TODO Rename to something enum related\n     */\n    public static function get_wiretype($wire_type)\n    {\n        checkArgument(is_int($wire_type), 'wire_type must be a integer');\n\n        switch ($wire_type) {\n            case 0:\n                return '(0) varint';\n            case 1:\n                return '(1) 64-bit';\n            case 2:\n                return '(2) length-delimited';\n            case 3:\n                return '(3) group start';\n            case 4:\n                return '(4) group end';\n            case 5:\n                return '(5) 32-bit';\n            default:\n                return 'unknown';\n        }\n    }\n\n\n    /**\n     * Returns how big (in bytes) this number would be as a varint\n     */\n    public static function size_varint($value)\n    {\n        // TODO Assert 64bit doubles\n        checkArgument(is_int($value) || is_float($value), 'value must be a integer or float');\n\n        // TODO Rearrange to make a binary search\n        if ($value < 0) return self::MAX_VARINT_LEN; // Negitive numbers are signed extended and always take 10 bytes\n        if ($value < 0x80) return 1; // 2^7\n        if ($value < 0x4000) return 2; // 2^14\n        if ($value < 0x200000) return 3; // 2^21\n        if ($value < 0x10000000) return 4; // 2^28\n        if ($value < 0x800000000) return 5; // 2^35\n        if ($value < 0x40000000000) return 6; // 2^42\n        if ($value < 0x2000000000000) return 7; // 2^49\n        if ($value < 0x100000000000000) return 8; // 2^56\n\n        if (is_int($value)) {\n            // A PHP int can't be compared to 2^63, so compare to 2^63-1\n            if ($value <= 0x7FFFFFFFFFFFFFFF) return 9;\n        } else {\n            // However, a float can't exactly represent 2^63-1, so in that case compare to 2^63 (which it can represent)\n            if ($value < 0x8000000000000000) return 9;\n        }\n\n        return self::MAX_VARINT_LEN;\n    }\n\n    /**\n     * Parses the raw bytes of a varint, and returns the number it represents\n     *\n     * @param value the raw bytes int to decode\n     * @returns the decoded int\n     */\n    public static function decode_varint($encoded)\n    {\n        checkArgument(is_string($encoded), 'encoded value must be a string of bytes');\n\n        $len = strlen($encoded);\n        if ($len <= self::MAX_PHP_INT_VARINT_LEN) { // TODO lower this on PHP32.\n            return self::decode_varint_int($encoded, $len);\n        } else {\n            return self::decode_varint_float($encoded, $len);\n        }\n    }\n\n    public static function decode_signed_varint($encoded)\n    {\n        checkArgument(is_string($encoded), 'encoded value must be a string of bytes');\n        checkArgument($encoded !== '', 'encoded value contains no bytes');\n\n        $len = strlen($encoded);\n        if ($len === self::MAX_VARINT_LEN) {\n            // Negative number\n            // Because PHP only has signed types, there is no native way to do\n            // signed extension. To help maintain a accuracy we do it manually\n            // over the bytes of the varint, by flipping the bits and adding one.\n\n            $len--;\n            for ($i = 0; $i < $len; $i++) {\n                $encoded[$i] = chr(~(ord($encoded[$i]) & 0x7F));\n            }\n\n            // Drop the last digit as it's above 64bit and not used\n            $encoded = substr($encoded, 0, $len);\n            $encoded = rtrim($encoded, \"\\x80\"); // TODO change this to rtrim(\\xff) and move above the loop\n\n            return -self::decode_varint($encoded) - 1;\n        } else {\n            return self::decode_varint($encoded);\n        }\n    }\n\n\n    public static function decode_varint_int($encoded, $len)\n    {\n        $result = 0;\n        $shift = 0;\n        for ($i = 0; $i < $len; $i++) {\n            $result |= ((ord($encoded[$i]) & 0x7F) << $shift);\n            $shift += 7;\n        }\n\n        return $result;\n    }\n\n    /**\n     * Slower implementation that uses math instead of bit operators (as they don't work on floats)\n     */\n    public static function decode_varint_float($encoded, $len)\n    {\n        $result = 0.0;\n        $shift = 1.0;\n        for ($i = 0; $i < $len; $i++) {\n            $result += (ord($encoded[$i]) & 0x7F) * $shift;\n            $shift *= 128;\n        }\n\n        return $result;\n    }\n\n    public static function decode_varint_bc($encoded, $len)\n    {\n        $result = 0;\n        $shift = 1;\n        for ($i = 0; $i < $len; $i++) {\n            $result = bcadd($result, bcmul(ord($encoded[$i]) & 0x7F, $shift));\n            $shift = bcmul($shift, 128);\n        }\n        return $result;\n    }\n\n    public static function decode_varint_gmp($encoded, $len)\n    {\n        $i128 = gmp_init(128);\n        $result = gmp_init(0);\n        $shift = gmp_init(1);\n        for ($i = 0; $i < $len; $i++) {\n            $result = gmp_add($result, gmp_mul(ord($encoded[$i]) & 0x7F, $shift));\n            $shift = gmp_mul($shift, $i128);\n        }\n        return gmp_strval($result);\n    }\n\n    public static function read_bytes($fp, $len, &$limit = PHP_INT_MAX)\n    {\n\n        if ($len <= 0) {\n            return;\n        }\n\n        checkArgument(get_resource_type($fp) === 'stream', 'fp must be a file resource');\n        checkArgument(is_integer($len) && $len >= 0, 'len must be a postitive integer');\n        checkArgument(is_integer($limit) && $limit >= 0, 'limit must be a postitive integer');\n\n        if ($limit < $len) {\n            throw new Exception('read_bytes(): Unexpected end of stream');\n        }\n\n        $bytes = fread($fp, $len);\n        if ($bytes === '' && feof($fp)) {\n            return false;\n        }\n\n        if ($bytes === false) {\n            throw new Exception('read_bytes(): Error reading byte');\n        }\n\n        if (strlen($bytes) !== $len) {\n            throw new Exception('read_bytes(): Unexpected end of stream');\n        }\n\n        $limit -= $len;\n        return $bytes;\n    }\n\n    /**\n     * Reads a varint but does not decode.\n     *\n     * @param  resource $fp    Resource stream to read from\n     * @param  int      $limit Max bytes to read, passed by reference and will be decremented by the number of read bytes\n     * @return string|bool Returns the read varint bytes, or false on EOF.\n     * @throws exception if stream error occurs\n     */\n    public static function read_varint_bytes($fp, &$limit = PHP_INT_MAX)\n    {\n        $value = '';\n        do { // Keep reading until we find the last byte\n            $b = self::read_bytes($fp, 1, $limit);\n            if ($b === false) {\n                return false;\n            }\n\n            $value .= $b;\n        } while ($b >= \"\\x80\");\n\n        return $value;\n    }\n\n    /**\n     * Tries to read a varint from $fp.\n     *\n     * @returns the decoded varint in the range [0,2^64-1] from the stream, or false if the stream has reached eof.\n     * @throws exception if stream error occurs\n     */\n    public static function read_varint($fp, &$limit = PHP_INT_MAX)\n    {\n        $value = self::read_varint_bytes($fp, $limit);\n        if ($value === false) {\n            return false;\n        }\n        return self::decode_varint($value);\n    }\n\n    public static function read_signed_varint($fp, &$limit = PHP_INT_MAX)\n    {\n        $value = self::read_varint_bytes($fp, $limit);\n        if ($value === false) {\n            return false;\n        }\n        return self::decode_signed_varint($value);\n    }\n\n    /**\n     * @returns a integer as specified by the pack variable.\n     * On EOF false is returned, otherwise Exception is thrown on stream error or invalid argument.\n     */\n    protected static function read_unpack($fp, $len, $pack, &$limit = PHP_INT_MAX)\n    {\n        checkArgument(is_string($pack), 'pack must be a valid string');\n\n        $bytes = self::read_bytes($fp, $len, $limit);\n        if ($bytes === false) {\n            return false;\n        }\n\n        return unpack($pack, $bytes)[1];\n    }\n\n    public static function read_float($fp, &$limit = PHP_INT_MAX)\n    {\n        return self::read_unpack($fp, 4, 'f', $limit);\n    } // BUG We need to convert from little order to machine order first\n\n    public static function read_double($fp, &$limit = PHP_INT_MAX)\n    {\n        return self::read_unpack($fp, 8, 'd', $limit);\n    } // BUG We need to convert from little order to machine order first\n\n    public static function read_int32($fp, &$limit = PHP_INT_MAX)\n    {\n        return self::read_unpack($fp, 4, 'l', $limit);\n    } // BUG We need to convert from little order to machine order first\n\n    public static function read_uint32($fp, &$limit = PHP_INT_MAX)\n    {\n        return self::read_unpack($fp, 4, 'V', $limit);\n    }\n\n    // unpack 'q' and 'P' are only supported since PHP 5.6.3\n    public static function read_int64($fp, &$limit = PHP_INT_MAX)\n    {\n        return self::read_unpack($fp, 8, 'q', $limit);\n    } // BUG We need to convert from little order to machine order first\n\n    public static function read_uint64($fp, &$limit = PHP_INT_MAX)\n    {\n        return self::read_unpack($fp, 8, 'P', $limit);\n    }\n\n    public static function read_zint32($fp, &$limit = PHP_INT_MAX)\n    {\n        $i = self::read_varint($fp, $limit);\n        if ($i === false) {\n            return false;\n        }\n\n        return (!($i & 0x1) ? ($i >> 1) : (($i >> 1) ^ (~0)));\n    }\n\n    public static function read_zint64($fp, &$limit = PHP_INT_MAX)\n    {\n        $i = self::read_varint($fp, $limit);\n        if ($i === false) {\n            return false;\n        }\n\n        return (!($i & 0x1) ? ($i >> 1) : (($i >> 1) ^ (~0)));\n    }\n\n    /**\n     * Read a unknown field from the stream and decodes the value if possible.\n     */\n    public static function read_field($fp, $wire_type, &$limit = PHP_INT_MAX)\n    {\n        checkArgument(get_resource_type($fp) === 'stream', 'fp must be a file resource');\n        checkArgument(is_integer($limit) && $limit >= 0, 'limit must be a postitive integer');\n\n        switch ($wire_type) {\n            case 0: // varint\n                return self::read_varint_bytes($fp, $limit);\n\n            case 1: // 64bit\n                return self::read_bytes($fp, 8, $limit);\n\n            case 2: // length delimited\n                $len = self::read_varint($fp, $limit);\n                if ($len <= 0) {\n                    throw new Exception('read_field(' . self::get_wiretype($wire_type) . '): Invalid length: $len it must be >= 0');\n                }\n                return self::read_bytes($fp, $len, $limit);\n\n            //case 3: // Start group TODO we must keep looping until we find the closing end grou\n            //case 4: // End group - We should never skip a end group!\n            //\treturn 0; // Do nothing\n\n            case 5: // 32bit\n                return self::read_bytes($fp, 4, $limit);\n\n            default:\n                throw new Exception('read_field(' . self::get_wiretype($wire_type) . '): Unsupported wire_type');\n        }\n    }\n\n    /**\n     * Varint encodes a integer, using a loop-less bitwise method.\n     *\n     * @param int|float $value The number to encode\n     * @return string the bytes of the encoded value\n     */\n    public static function encode_varint_slide($value)\n    {\n        checkArgument(is_int($value), 'value must be a integer');\n        checkArgument($value >= 0, 'value must be positive');\n\n        // Code adapted from CodedOutputStream::WriteVarint64ToArrayInline in\n        // coded_stream.cc original protobuf source\n        $target = \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n        $part0 = $value & 0xffffffff;\n        $part1 = ($value >> 28) & 0xffffffff;\n        $part2 = ($value >> 56) & 0xffffffff;\n\n        if ($part2 === 0) {\n            if ($part1 === 0) {\n                if ($part0 < (1 << 14)) {\n                    if ($part0 < (1 << 7)) {\n                        $size = 1;\n                        goto size1;\n                    } else {\n                        $size = 2;\n                        goto size2;\n                    }\n                } else {\n                    if ($part0 < (1 << 21)) {\n                        $size = 3;\n                        goto size3;\n                    } else {\n                        $size = 4;\n                        goto size4;\n                    }\n                }\n            } else {\n                if ($part1 < (1 << 14)) {\n                    if ($part1 < (1 << 7)) {\n                        $size = 5;\n                        goto size5;\n                    } else {\n                        $size = 6;\n                        goto size6;\n                    }\n                } else {\n                    if ($part1 < (1 << 21)) {\n                        $size = 7;\n                        goto size7;\n                    } else {\n                        $size = 8;\n                        goto size8;\n                    }\n                }\n            }\n        } else {\n            if ($part2 < (1 << 7)) {\n                $size = 9;\n                goto size9;\n            } else {\n                $size = 10;\n                goto size10;\n            }\n        }\n\n        assert(false, 'reached a line we should never get to');\n\n        // Slide\n        size10:\n        $target[9] = chr(($part2 >> 7) | 0x80);\n        size9 :\n        $target[8] = chr(($part2) | 0x80);\n        size8 :\n        $target[7] = chr(($part1 >> 21) | 0x80);\n        size7 :\n        $target[6] = chr(($part1 >> 14) | 0x80);\n        size6 :\n        $target[5] = chr(($part1 >> 7) | 0x80);\n        size5 :\n        $target[4] = chr(($part1) | 0x80);\n        size4 :\n        $target[3] = chr(($part0 >> 21) | 0x80);\n        size3 :\n        $target[2] = chr(($part0 >> 14) | 0x80);\n        size2 :\n        $target[1] = chr(($part0 >> 7) | 0x80);\n        size1 :\n        $target[0] = chr(($part0) | 0x80);\n\n        $target[$size - 1] = chr(ord($target[$size - 1]) & 0x7F);\n\n        return substr($target, 0, $size);\n    }\n\n    /**\n     * Varint encodes a integer, using a bitwise method.\n     *\n     * @param int|float $value The number to encode\n     * @return string the bytes of the encoded value\n     */\n    public static function encode_varint_int($value)\n    {\n        checkArgument(is_int($value), 'value must be a integer');\n        checkArgument($value >= 0, 'value must be positive');\n\n        $buf = '';\n        while ($value > 0x7F) {\n            $buf .= chr(($value & 0x7F) | 0x80);\n            $value = $value >> 7;\n        }\n        return $buf . chr($value & 0x7F);\n    }\n\n    /**\n     * Varint encodes a float, using a arithmetic method.\n     *\n     * @param int|float $value The number to encode\n     * @return string the bytes of the encoded value\n     */\n    public static function encode_varint_float($value)\n    {\n        checkArgument(is_int($value) || is_float($value), 'value must be a integer or float');\n        checkArgument($value >= 0 && $value <= self::MAX_UINT64, 'value must be in the range [0, 2^64-1]');\n\n        $buf = '';\n        while ($value > 0x7F) {\n            $buf .= chr(($value & 0x7F) | 0x80); // TODO Test if mod/+ is faster than and/or\n            $value = floor($value / 128.0); // TODO Test if ($a - $a % $b) / $b; is faster\n        }\n        return $buf . chr($value & 0x7F);\n    }\n\n    public static function encode_varint_bc($value)\n    {\n        checkArgument(is_numeric($value), 'value must be numeric');\n        checkArgument(bccomp($value, 0) >= 0 && bccomp($value, \"18446744073709551615\") <= 0, 'value must be in the range [0, 2^64-1]');\n\n        $buf = '';\n        while (bccomp($value, 128) >= 0) {\n            $buf .= chr(bcadd(bcmod($value, 128), 128));\n            $value = bcdiv($value, 128, 0);\n        }\n\n        return $buf . chr(bcmod($value, 128));\n    }\n\n    public static function encode_varint_gmp($value)\n    {\n        checkArgument(is_numeric($value), 'value must be numeric');\n\n        $value = gmp_init($value);\n        checkArgument(gmp_cmp($value, 0) >= 0 && gmp_cmp($value, \"18446744073709551615\") <= 0, 'value must be in the range [0, 2^64-1]');\n\n        $i128 = gmp_init(128);\n\n        $buf = '';\n        while (gmp_cmp($value, $i128) >= 0) {\n            $buf .= chr(gmp_intval(gmp_add(gmp_mod($value, $i128), $i128)));\n            $value = gmp_div($value, $i128, GMP_ROUND_ZERO); // TODO Consider changing to gmp_div_qr so we can avoid a mod\n        }\n\n        return $buf . chr(gmp_intval(gmp_mod($value, $i128)));\n    }\n\n    /**\n     * Varint encodes a number.\n     * Depending on the type of value, either the the bitwise or\n     * arithmetic method is used. Typically bitwise is faster, but\n     * only works with ints, thus to encode floats a arithmetic method\n     * is used instead.\n     *\n     * @param int|float $value The number to encode\n     * @return string the bytes of the encoded value\n     * @throws InvalidArgumentException if the $value is not a integer of float\n     */\n    public static function encode_varint($value)\n    {\n\n        if ($value < 0) {\n            $value = -($value + 1);\n            $negative = true;\n        } else {\n            $negative = false;\n        }\n\n        if (is_int($value)) {\n            $encoded = self::encode_varint_int($value);\n        } elseif (is_float($value)) {\n            $encoded = self::encode_varint_float($value);\n        } else {\n            throw new InvalidArgumentException('value must be a integer or float');\n        }\n\n        if ($negative) {\n            $len = strlen($encoded);\n            for ($i = $len - 1; $i >= 0; $i--) {\n                $encoded[$i] = chr(~(ord($encoded[$i])) | 0x80);\n            }\n\n            // Now sign extend\n            $encoded = str_pad($encoded, 9, \"\\xff\", STR_PAD_RIGHT) . \"\\x01\";\n        }\n\n        return $encoded;\n    }\n\n    /**\n     * Writes a unsigned varint to $fp\n     * returns the number of bytes written\n     *\n     * @param $fp\n     * @param $value The int to encode and write\n     * @return The number of bytes written\n     */\n    public static function write_varint($fp, $value)\n    {\n        checkArgument(get_resource_type($fp) === 'stream', 'fp must be a file resource');\n\n        $buf = self::encode_varint($value);\n        $len = strlen($buf);\n\n        if (fwrite($fp, $buf) !== $len)\n            throw new Exception('write_varint(): Error writing byte');\n\n        return $len;\n    }\n\n    /**\n     * Writes a packed value to $fp\n     * returns the number of bytes written\n     *\n     * @param $fp\n     * @param $value The int to encode and write\n     * @param $pack  The pack format\n     * @return The number of bytes written\n     */\n    protected static function write_pack($fp, $value, $pack)\n    {\n        checkArgument(get_resource_type($fp) === 'stream', 'fp must be a file resource');\n        checkArgument(is_integer($value) || is_float($value), 'value must be numeric');\n        checkArgument(is_string($pack), 'pack must be a valid string');\n\n        $encoded = pack($pack, $value);\n        $len = strlen($encoded);\n\n        $wrote = fwrite($fp, $encoded, $len);\n        if ($wrote === false || $wrote !== $len) {\n            throw new Exception('write_pack(): Error writing byte');\n        }\n\n        return $len;\n    }\n\n    public static function write_float($fp, $f)\n    {\n        return self::write_pack($fp, $f, 'f');\n    } // BUG We need to convert from machine order to little order first\n\n    public static function write_double($fp, $d)\n    {\n        return self::write_pack($fp, $d, 'd');\n    } // BUG We need to convert from machine order to little order first\n\n    public static function write_int32($fp, $i)\n    {\n        return self::write_pack($fp, $i, 'l');\n    } // BUG We need to convert from machine order to little order first\n\n    public static function write_uint32($fp, $i)\n    {\n        return self::write_pack($fp, $i, 'V');\n    }\n\n    // unpack 'q' and 'P' are only supported since PHP 5.6.3\n    public static function write_int64($fp, $i)\n    {\n        return self::write_pack($fp, $i, 'q');\n    } // BUG We need to convert from machine order to little order first\n\n    public static function write_uint64($fp, $i)\n    {\n        return self::write_pack($fp, $i, 'P');\n    }\n\n    public static function write_zint32($fp, $i)\n    {\n        return self::write_varint($fp, ($i >= 0 ? ($i << 1) : (($i << 1) ^ ~0)));\n    }\n\n    public static function write_zint64($fp, $i)\n    {\n        return self::write_varint($fp, ($i >= 0 ? ($i << 1) : (($i << 1) ^ ~0)));\n    }\n\n    /**\n     * Seek past a varint\n     */\n    public static function skip_varint($fp)\n    {\n        checkArgument(get_resource_type($fp) === 'stream', 'fp must be a file resource');\n\n        $value = self::read_varint_bytes($fp);\n        if ($value === false) {\n            return false;\n        }\n    }\n\n    /**\n     * Seek past the current field\n     * TODO Rewrite this to be safer\n     */\n    public static function skip_field($fp, $wire_type, &$limit = PHP_INT_MAX)\n    {\n        checkArgument(get_resource_type($fp) === 'stream', 'fp must be a file resource');\n        checkArgument(is_int($wire_type), 'wire_type must be a integer');\n\n        switch ($wire_type) {\n            case 0: // varint\n                $tmp = self::skip_varint($fp, $limit);\n                if ($tmp === false) throw new \\Exception('Protobuf::skip_varint returned false');\n\n            case 1: // 64bit\n                if (fseek($fp, 8, SEEK_CUR) === -1)\n                    throw new Exception('skip(' . self::get_wiretype(1) . '): Error seeking');\n                $limit -= 8;\n\n            case 2: // length delimited\n                $len = self::read_varint($fp, $limit);\n                if ($len === false) throw new \\Exception('Protobuf::read_varint returned false');\n                if (fseek($fp, $len, SEEK_CUR) === -1)\n                    throw new Exception('skip(' . self::get_wiretype(2) . '): Error seeking');\n                $limit -= $len;\n\n            //case 3: // Start group TODO we must keep looping until we find the closing end grou\n            //case 4: // End group - We should never skip a end group!\n            //\treturn 0; // Do nothing\n\n            case 5: // 32bit\n//\t\t\t\tif (fseek($fp, 4, SEEK_CUR) === -1)\n//\t\t\t\t\tthrow new Exception('skip('. self::get_wiretype(5) . '): Error seeking');\n//\t\t\t\t$limit -= 4;\n\n            default:\n//\t\t\t\tthrow new Exception('skip('. self::get_wiretype($wire_type) . '): Unsupported wire_type');\n        }\n    }\n\n    /**\n     * TODO Decide to delete toString(). It used when printing unknown fields\n     * Used to aid in pretty printing of Protobuf objects\n     * TODO Decode enums\n     */\n    private static $print_depth = 0;\n\n    private static $indent_char = \"\\t\";\n\n    private static $print_limit = 50;\n\n    public static function toString($key, $value, $default = null)\n    {\n        if ($value === $default)\n            return;\n\n        $ret = str_repeat(self::$indent_char, self::$print_depth) . \"$key=>\";\n        if (is_array($value)) {\n            $ret .= \"array(\\n\";\n            self::$print_depth++;\n            foreach ($value as $i => $v)\n                $ret .= self::toString(\"[$i]\", $v);\n            self::$print_depth--;\n            $ret .= str_repeat(self::$indent_char, self::$print_depth) . \")\\n\";\n\n        } elseif (is_object($value)) {\n            self::$print_depth++;\n            $ret .= get_class($value) . \"(\\n\";\n            $ret .= $value->__toString() . \"\\n\";\n            self::$print_depth--;\n            $ret .= str_repeat(self::$indent_char, self::$print_depth) . \")\\n\";\n\n        } elseif (is_string($value)) {\n            $safevalue = addcslashes($value, \"\\0..\\37\\177..\\377\");\n            if (strlen($safevalue) > self::$print_limit) {\n                $safevalue = substr($safevalue, 0, self::$print_limit) . '...';\n            }\n\n            $ret .= '\"' . $safevalue . '\" (' . strlen($value) . \" bytes)\\n\";\n\n        } elseif (is_bool($value)) {\n            $ret .= ($value ? 'true' : 'false') . \"\\n\";\n\n        } else {\n            $ret .= (string)$value . \"\\n\";\n        }\n        return $ret;\n    }\n}\n"
  },
  {
    "path": "phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit bootstrap=\"vendor/autoload.php\"\n         backupGlobals=\"false\"\n         backupStaticAttributes=\"false\"\n         colors=\"true\"\n         verbose=\"true\"\n         convertErrorsToExceptions=\"true\"\n         convertNoticesToExceptions=\"true\"\n         convertWarningsToExceptions=\"true\"\n         processIsolation=\"false\"\n         stopOnFailure=\"false\">\n    <testsuites>\n        <testsuite name=\"PokemonGoAPI-PHP Test Suite\">\n            <directory>tests</directory>\n        </testsuite>\n    </testsuites>\n    <filter>\n        <whitelist>\n            <directory suffix=\".php\">src/</directory>\n        </whitelist>\n    </filter>\n    <logging>\n        <log type=\"tap\" target=\"build/report.tap\"/>\n        <log type=\"junit\" target=\"build/report.junit.xml\"/>\n    </logging>\n</phpunit>\n"
  },
  {
    "path": "src/Api/Data/Data.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Data;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse ReflectionClass;\n\nabstract class Data {\n\n    /**\n     * Creates a data instance from a Protobuf Message.\n     *\n     * @param Message $data\n     * @return static\n     */\n    public static function create($data)\n    {\n        // Check if we retrieved valid data\n        if ($data == null) {\n            return;\n        }\n\n        $instance = new static();\n\n        // Retrieve the properties within the protobuf message class\n        $dataProperties = self::getClassProperties($data);\n\n        // Retrieve the properties within the data class\n        $properties = self::getClassDefaultProperties($instance);\n\n        foreach ($dataProperties as $property) {\n            // Retrieve the property name\n            $propertyName = camel_case($property->getName());\n\n            // Check if the same property exists within the data class\n            if (!array_key_exists($propertyName, $properties)) {\n                continue;\n            }\n\n            // Sets the property value\n            $instance->{'set' . $propertyName}($data->{'get' . $propertyName}());\n        }\n\n        return $instance;\n    }\n\n    /**\n     * @param $name\n     * @param $arguments\n     */\n    public function __call($name, $arguments)\n    {\n        if ($this->isSetMethod($name)) {\n            $attribute = $this->getAttribute($name);\n\n            $this->{$attribute} = current($arguments);\n\n        } elseif ($this->isGetMethod($name)) {\n            $attribute = $this->getAttribute($name);\n\n            return $this->{$attribute};\n        }\n    }\n\n    /**\n     * Returns the class properties of a class.\n     *\n     * @param mixed $instance\n     * @return array\n     */\n    protected static function getClassProperties($instance)\n    {\n        $reflection = new ReflectionClass($instance);\n\n        return $reflection->getProperties();\n    }\n\n    /**\n     * Returns the class properties of a class.\n     *\n     * @param mixed $instance\n     * @return array\n     */\n    protected static function getClassDefaultProperties($instance)\n    {\n        $reflection = new ReflectionClass($instance);\n\n        return $reflection->getDefaultProperties();\n    }\n\n    /**\n     * Returns the corresponding attribute.\n     *\n     * @param $method\n     * @return string\n     */\n    protected function getAttribute($method)\n    {\n        return lcfirst(substr($method, 3));\n    }\n\n    /**\n     * Returns true if the method corresponds to a setter method, false otherwise.\n     *\n     * @param string $method\n     * @return boolean\n     */\n    protected function isSetMethod($method)\n    {\n        return strpos($method, 'set') !== FALSE;\n    }\n\n    /**\n     * Returns true if the method corresponds to a getter method, false otherwise.\n     *\n     * @param string $method\n     * @return boolean\n     */\n    protected function isGetMethod($method)\n    {\n        return strpos($method, 'get') !== FALSE;\n    }\n\n\n}"
  },
  {
    "path": "src/Api/Data/Device.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Data;\n\nclass Device extends Data\n{\n    /**\n     * @var string\n     */\n    protected $deviceId = \"\";\n\n    /**\n     * @var string\n     */\n    protected $androidBoardName = \"\";\n\n    /**\n     * @var string\n     */\n    protected $androidBootloader = \"\";\n\n    /**\n     * @var string\n     */\n    protected $deviceBrand = \"\";\n\n    /**\n     * @var string\n     */\n    protected $deviceModel = \"\";\n\n    /**\n     * @var string\n     */\n    protected $deviceModelIdentifier = \"\";\n\n    /**\n     * @var string\n     */\n    protected $deviceModelBoot = \"\";\n\n    /**\n     * @var string\n     */\n    protected $hardwareManufacturer = \"\";\n\n    /**\n     * @var string\n     */\n    protected $hardwareModel = \"\";\n\n    /**\n     * @var string\n     */\n    protected $firmwareBrand = \"\";\n\n    /**\n     * @var string\n     */\n    protected $firmwareTags = \"\";\n\n    /**\n     * @var string\n     */\n    protected $firmwareType = \"\";\n\n    /**\n     * @var string\n     */\n    protected $firmwareFingerprint = \"\";\n\n}"
  },
  {
    "path": "src/Api/Data/Location.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Data;\n\n/**\n * @method void setLatitude(double $latitude)\n * @method void setLongitude(double $longitude)\n *\n * @method double getLatitude()\n * @method double getLongitude()\n */\nclass Location extends Data {\n\n    /**\n     * @var double\n     */\n    protected $latitude;\n\n    /**\n     * @var double\n     */\n    protected $longitude;\n\n    /**\n     * Location constructor.\n     *\n     * @param double $latitude\n     * @param double $longitude\n     */\n    public function __construct($latitude = 0.0, $longitude = 0.0)\n    {\n        $this->latitude = $latitude;\n        $this->longitude = $longitude;\n    }\n\n}"
  },
  {
    "path": "src/Api/Map/Data/Resource.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Map\\Data;\n\nuse GetMapObjectsResponse;\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources\\CatchablePokemon;\nuse NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources\\Fort;\nuse NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources\\NearbyPokemon;\nuse NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources\\SpawnPoint;\nuse NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources\\WildPokemon as WildPokemonData;\nuse NicklasW\\PkmGoApi\\Api\\Map\\Pokestop;\nuse POGOProtos\\Map\\Fort\\FortData;\nuse POGOProtos\\Map\\Fort\\FortType;\nuse POGOProtos\\Map\\Pokemon\\MapPokemon;\nuse POGOProtos\\Map\\Pokemon\\WildPokemon;\nuse POGOProtos\\Map\\SpawnPoint as SpawnPointData;\n\nclass Resource extends Data {\n\n    /**\n     * @var Fort[]\n     */\n    protected $pokestops = array();\n\n    /**\n     * @var Fort[]\n     */\n    protected $gyms = array();\n\n    /**\n     * @var SpawnPoint[]\n     */\n    protected $spawnPoints = array();\n\n    /**\n     * @var CatchablePokemon[]\n     */\n    protected $catchablePokemons = array();\n\n    /**\n     * @var WildPokemonData[]\n     */\n    protected $wildPokemons = array();\n\n    /**\n     * @var NearbyPokemon[]\n     */\n    protected $nearbyPokemons = array();\n\n    /**\n     * Creates a data instance from a Protobuf Message.\n     *\n     * @param GetMapObjectsResponse $data\n     * @return static\n     */\n    public static function create($data)\n    {\n        $instance = new static();\n\n        // Iterate through the list of map cells\n        foreach ($data->getMapCellsArray() as $mapCell) {\n            // Add forts to the list of forts\n            $instance->addForts($mapCell->getFortsArray());\n\n            // Add spawn points to the list of spawn points\n            $instance->addSpawnPoints($mapCell->getSpawnPointsArray());\n\n            // Add catchable pokemons to the list of catchable pokemons\n            $instance->addCatchablePokemons($mapCell->getCatchablePokemonsArray());\n\n            // Add wild pokemons to the list of catchable pokemons\n            $instance->addCatchablePokemons($mapCell->getWildPokemonsArray());\n\n            // Add wild pokemons to the list of wild pokemons\n            $instance->addWildPokemons($mapCell->getWildPokemonsArray());\n\n            // Add nearby pokemons to the list of nearby pokemons\n            $instance->addNearbyPokemons($mapCell->getNearbyPokemonsArray());\n\n        }\n\n        return $instance;\n    }\n\n    /**\n     * Add a new fort.\n     *\n     * @param FortData[] $forts\n     */\n    public function addForts($forts)\n    {\n        foreach ($forts as $fort) {\n            // Create the fort instance\n            $instance = Fort::create($fort);\n\n            switch ($fort->getType()) {\n                case FortType::CHECKPOINT:\n                    // Add the fort to the list of pokestop\n                    $this->pokestops[] = new Pokestop($instance);\n\n                    break;\n                case FortType::GYM:\n                    // Add the fort to the list of gym\n                    $this->gyms[] = $instance;\n\n                    break;\n            }\n        }\n    }\n\n    /**\n     * Adds a spawn point to the list of spawns points.\n     *\n     * @param SpawnPointData[] $spawnPoints\n     */\n    public function addSpawnPoints($spawnPoints)\n    {\n        foreach ($spawnPoints as $spawnPoint) {\n            // Add spawn point to the list of spawn points\n            $this->spawnPoints[] = SpawnPoint::create($spawnPoint);\n        }\n    }\n\n    /**\n     * Adds catchable pokemon to the list of catchable pokemons.\n     *\n     * @param MapPokemon $catchablePokemons\n     */\n    public function addCatchablePokemons($catchablePokemons)\n    {\n        foreach ($catchablePokemons as $catchablePokemon) {\n            $this->catchablePokemons[] = CatchablePokemon::create($catchablePokemon);\n        }\n    }\n    /**\n     * Adds catchable pokemon to the list of catchable pokemons.\n     *\n     * @param WildPokemon $wildPokemons\n     */\n    public function addWildPokemons($wildPokemons)\n    {\n        foreach ($wildPokemons as $wildPokemon) {\n            $this->wildPokemons[] = WildPokemonData::create($wildPokemon);\n        }\n    }\n\n    /**\n     * Adds nearby pokemon to the list of nearby pokemons.\n     *\n     * @param MapPokemon $nearbyPokemons\n     */\n    public function addNearbyPokemons($nearbyPokemons)\n    {\n        foreach ($nearbyPokemons as $nearbyPokemon) {\n            $this->nearbyPokemons[] = NearbyPokemon::create($nearbyPokemon);\n        }\n    }\n\n}"
  },
  {
    "path": "src/Api/Map/Data/Resources/CatchablePokemon.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Enums\\PokemonId;\n\nclass CatchablePokemon extends Data {\n\n    /**\n     * @var string\n     */\n    protected $spawnPointId = \"\";\n\n    /**\n     * @var int\n     */\n    protected $encounterId = 0;\n\n    /**\n     * @var\n     */\n    protected $pokemonId = PokemonId::MISSINGNO;\n\n    /**\n     * @var int\n     */\n    protected $expirationTimestampMs = 0;\n\n    /**\n     * @var double\n     */\n    protected $latitude = 0;\n\n    /**\n     * @var double\n     */\n    protected $longitude = 0;\n\n}"
  },
  {
    "path": "src/Api/Map/Data/Resources/Fort.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Enums\\PokemonId;\nuse POGOProtos\\Enums\\TeamColor;\nuse POGOProtos\\Map\\Fort\\FortRenderingType;\nuse POGOProtos\\Map\\Fort\\FortSponsor;\nuse POGOProtos\\Map\\Fort\\FortType;\n\n\n/**\n * @method void setId(string $id)\n * @method void setLastModifiedTimestampMs(int $lastModifiedTimestampMs)\n * @method void setLatitude(int $latitude)\n * @method void setLongitude(int $longitude)\n * @method void setEnabled(boolean $enabled)\n * @method void setType(int $type)\n * @method void setOwnedByTeam(int $ownedByTeam)\n * @method void setGuardPokemonId(int $candies)\n * @method void setGuardPokemonCp(int $candies)\n * @method void setGymPoints(int $gymPoints)\n * @method void setIsInBattle(boolean $isInBattle)\n * @method void setCooldownCompleteTimestampMs(int $cooldownCompleteTimestampMs)\n * @method void setRenderingType(int $candies)\n * @method void setActiveFortModifier(int $activeFortModifier)\n * @method void setLureInfo($lureInfo)\n *\n * @method string getId()\n * @method int getLastModifiedTimestampMs()\n * @method int getLatitude()\n * @method int getLongitude()\n * @method boolean getEnabled()\n * @method int getType()\n * @method int getOwnedByTeam()\n * @method int getGuardPokemonId()\n * @method int getGuardPokemonCp()\n * @method int getGymPoints()\n * @method boolean getIsInBattle()\n * @method int getCooldownCompleteTimestampMs()\n * @method int getRenderingType()\n * @method int getActiveFortModifier()\n * @method void getLureInfo()\n*/\nclass Fort extends Data {\n\n    /**\n     * @var string\n     */\n    protected $id = \"\";\n\n    /**\n     * @var int\n     */\n    protected $lastModifiedTimestampMs = 0;\n\n    /**\n     * @var int\n     */\n    protected $latitude = 0;\n\n    /**\n     * @var int\n     */\n    protected $longitude = 0;\n\n    /**\n     * @var bool\n     */\n    protected $enabled = false;\n\n    /**\n     * @var\n     */\n    protected $type = FortType::GYM;\n\n    /**\n     * @var\n     */\n    protected $ownedByTeam = TeamColor::NEUTRAL;\n\n    /**\n     * @var\n     */\n    protected $guardPokemonId = PokemonId::MISSINGNO;\n\n    /**\n     * @var int\n     */\n    protected $guardPokemonCp = 0;\n\n    /**\n     * @var int\n     */\n    protected $gymPoints = 0;\n\n    /**\n     * @var bool\n     */\n    protected $isInBattle = false;\n\n    /**\n     * @var int\n     */\n    protected $cooldownCompleteTimestampMs = 0;\n\n    /**\n     * @var\n     */\n    protected $sponsor = FortSponsor::UNSET_SPONSOR;\n\n    /**\n     * @var\n     */\n    protected $renderingType = FortRenderingType::DEFAULT;\n\n    /**\n     * @var string\n     */\n    protected $activeFortModifier = \"\";\n\n    /**\n     * @var\n     */\n    protected $lureInfo = null;\n\n}"
  },
  {
    "path": "src/Api/Map/Data/Resources/NearbyPokemon.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Enums\\PokemonId;\n\nclass NearbyPokemon extends Data {\n\n    /**\n     * @var\n     */\n    protected $pokemonId = PokemonId::MISSINGNO;\n\n    /**\n     * @var int\n     */\n    protected $distanceInMeters = 0;\n\n    /**\n     * @var int\n     */\n    protected $encounterId = 0;\n\n}"
  },
  {
    "path": "src/Api/Map/Data/Resources/SpawnPoint.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\nclass SpawnPoint extends Data {\n\n    \n\n\n\n\n\n\n    \n\n\n\n}"
  },
  {
    "path": "src/Api/Map/Data/Resources/WildPokemon.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\nclass WildPokemon extends Data {\n\n    /**\n     * @var int\n     */\n    protected $encounterId = 0; // optional fixed64 encounter_id = 1\n\n    /**\n     * @var int\n     */\n    protected $lastModifiedTimestampMs = 0; // optional int64 last_modified_timestamp_ms = 2\n\n    /**\n     * @var int\n     */\n    protected $latitude = 0; // optional double latitude = 3\n\n    /**\n     * @var int\n     */\n    protected $longitude = 0; // optional double longitude = 4\n\n    /**\n     * @var string\n     */\n    protected $spawnPointId = \"\"; // optional string spawn_point_id = 5\n\n    /**\n     * @var null\n     */\n    protected $pokemonData = null; // optional .POGOProtos.Data.PokemonData pokemon_data = 7\n\n    /**\n     * @var int\n     */\n    protected $timeTillHiddenMs = 0; // optional int32 time_till_hidden_ms = 11\n\n}"
  },
  {
    "path": "src/Api/Map/Data/Results/PokestopSpinResult.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Map\\Data\\Results;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Networking\\Responses\\FortSearchResponse_Result;\n\nclass PokestopSpinResult extends Data {\n\n    /**\n     * @var int\n     */\n    private $result = FortSearchResponse_Result::NO_RESULT_SET;\n\n    /**\n     * @var array\n     */\n    protected $itemsAwarded = array(); // repeated .POGOProtos.Inventory.Item.ItemAward items_awarded = 2\n\n    /**\n     * @var int\n     */\n    protected $gemsAwarded = 0; // optional int32 gems_awarded = 3\n\n    /**\n     * @var null\n     */\n    protected $pokemonDataEgg = null; // optional .POGOProtos.Data.PokemonData pokemon_data_egg = 4\n\n    /**\n     * @var int\n     */\n    protected $experienceAwarded = 0; // optional int32 experience_awarded = 5\n\n    /**\n     * @var int\n     */\n    protected $cooldownCompleteTimestampMs = 0; // optional int64 cooldown_complete_timestamp_ms = 6\n\n    /**\n     * @var int\n     */\n    protected $chainHackSequenceNumber = 0;\n\n    /**\n     * @return int\n     */\n    public function getResult()\n    {\n        return $this->result;\n    }\n\n    /**\n     * @return array\n     */\n    public function getItemsAwarded()\n    {\n        return $this->itemsAwarded;\n    }\n\n    /**\n     * @return int\n     */\n    public function getGemsAwarded()\n    {\n        return $this->gemsAwarded;\n    }\n\n    /**\n     * @return null\n     */\n    public function getPokemonDataEgg()\n    {\n        return $this->pokemonDataEgg;\n    }\n\n    /**\n     * @return int\n     */\n    public function getExperienceAwarded()\n    {\n        return $this->experienceAwarded;\n    }\n\n    /**\n     * @return int\n     */\n    public function getCooldownCompleteTimestampMs()\n    {\n        return $this->cooldownCompleteTimestampMs;\n    }\n\n    /**\n     * @return int\n     */\n    public function getChainHackSequenceNumber()\n    {\n        return $this->chainHackSequenceNumber;\n    }\n\n}"
  },
  {
    "path": "src/Api/Map/Map.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Map;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resource;\nuse NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources\\Fort;\nuse NicklasW\\PkmGoApi\\Api\\Map\\Support\\S2;\nuse NicklasW\\PkmGoApi\\Api\\Procedure;\nuse NicklasW\\PkmGoApi\\Services\\Request\\MapRequestService;\nuse POGOProtos\\Networking\\Responses\\GetMapObjectsResponse;\n\nclass Map extends Procedure {\n\n    /**\n     * Map constructor.\n     */\n    public function __construct()\n    {\n        $this->data = new Resource();\n    }\n\n    /**\n     * Returns the pokestops.\n     *\n     * @return Fort[]\n     */\n    public function getPokestops()\n    {\n        return $this->data->getPokestops();\n    }\n\n    /**\n     * Returns gyms.\n     *\n     * @return Fort[]\n     */\n    public function getGyms()\n    {\n        return $this->data->getGyms();\n    }\n\n    /**\n     * Returns the catchable pokemon located on the map.\n     */\n    public function getCatchablePokemon()\n    {\n\n\n    }\n\n    /**\n     * Returns the map resources.\n     *\n     * @throws Exception\n     */\n    public function update()\n    {\n        // Retrieve the map resources\n        $resources = $this->getMapResources();\n\n        // Create the resource data instance\n        $this->data = Resource::create($resources);\n    }\n\n    /**\n     * Returns the map resources.\n     *\n     * @return GetMapObjectsResponse\n     */\n    protected function getMapResources()\n    {\n        // Retrieved the latitude\n        $latitude = $this->getApplication()->getLatitude();\n\n        // Retrieved the longitude\n        $longitude = $this->getApplication()->getLongitude();\n\n        // Retrieve a list of cell ids from the latitude and longitude\n        $cellIds = S2::getCellIds($latitude, $longitude);\n\n        // Retrieve the map resources\n        return $this->getRequestService()->getResources($latitude, $longitude, $cellIds);\n    }\n\n    /**\n     * Returns the request service.\n     *\n     * @return MapRequestService\n     */\n    protected function getRequestService()\n    {\n        return new MapRequestService();\n    }\n\n}"
  },
  {
    "path": "src/Api/Map/Pokestop.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Map;\n\nuse NicklasW\\PkmGoApi\\Api\\Map\\Data\\Resources\\Fort;\nuse NicklasW\\PkmGoApi\\Api\\Map\\Data\\Results\\PokestopSpinResult;\nuse NicklasW\\PkmGoApi\\Api\\Procedure;\nuse NicklasW\\PkmGoApi\\Services\\Request\\PokestopRequestService;\nuse POGOProtos\\Networking\\Responses\\FortSearchResponse_Result;\nuse S2\\S2LatLng;\n\n/**\n * @method void setId(string $id)\n * @method void setLastModifiedTimestampMs(int $lastModifiedTimestampMs)\n * @method void setLatitude(int $latitude)\n * @method void setLongitude(int $longitude)\n * @method void setEnabled(boolean $enabled)\n * @method void setType(int $type)\n * @method void setOwnedByTeam(int $ownedByTeam)\n * @method void setGuardPokemonId(int $candies)\n * @method void setGuardPokemonCp(int $candies)\n * @method void setGymPoints(int $gymPoints)\n * @method void setIsInBattle(boolean $isInBattle)\n * @method void setCooldownCompleteTimestampMs(int $cooldownCompleteTimestampMs)\n * @method void setRenderingType(int $candies)\n * @method void setActiveFortModifier(int $activeFortModifier)\n * @method void setLureInfo($lureInfo)\n * @method string getId()\n * @method int getLastModifiedTimestampMs()\n * @method int getLatitude()\n * @method int getLongitude()\n * @method boolean getEnabled()\n * @method int getType()\n * @method int getOwnedByTeam()\n * @method int getGuardPokemonId()\n * @method int getGuardPokemonCp()\n * @method int getGymPoints()\n * @method boolean getIsInBattle()\n * @method int getCooldownCompleteTimestampMs()\n * @method int getRenderingType()\n * @method int getActiveFortModifier()\n * @method void getLureInfo()\n */\nclass Pokestop extends Procedure {\n\n    /**\n     * @var int The loot distance\n     */\n    protected static $LOOT_DISTANCE = 30;\n\n    /**\n     * @var int The fort cooldown timestamp\n     */\n    protected $cooldownTimestamp = 0;\n\n    /**\n     * Pokestop constructor.\n     *\n     * @param Fort $fortData\n     */\n    public function __construct($fortData)\n    {\n        $this->data = $fortData;\n    }\n\n    /**\n     * Returns true if within range of the pokestop, false otherwise.\n     *\n     * @return boolean\n     */\n    public function isInRange()\n    {\n        // Retrieve the pokestop location\n        $pokestopLocation = S2LatLng::fromDegrees($this->getLatitude(), $this->getLongitude());\n\n        // The current player location\n        $playerLocation = S2LatLng::fromDegrees($this->getCurrentLatitude(), $this->getCurrentLongitude());\n\n        // Check if the distance is within the loot interval\n        return $pokestopLocation->getEarthDistance($playerLocation) < self::$LOOT_DISTANCE;\n    }\n\n    /**\n     * Returns true if available for spin, false otherwise.\n     *\n     * @return boolean\n     */\n    public function canSpin()\n    {\n        // Check if the pokestop is on cooldown\n        $active = $this->cooldownTimestamp < microtime();\n\n        return $this->isInRange() && $active;\n    }\n\n    /**\n     * Spin the pokestop.\n     *\n     * @return PokestopSpinResult\n     */\n    public function spin()\n    {\n        // Retrieve the map resources\n        $fortResponse = $this->getRequestService()->spin($this->getId(),\n            $this->getLatitude(), $this->getLongitude());\n\n        switch ($fortResponse->getResult()) {\n\n            case FortSearchResponse_Result::SUCCESS:\n                // Update inventory\n\n                // Set the cooldown timestamp\n                $this->cooldownTimestamp = $fortResponse->getCooldownCompleteTimestampMs();\n\n                break;\n        }\n\n        return PokestopSpinResult::create($fortResponse);\n    }\n\n    public function hasLure()\n    {\n\n    }\n\n    public function addLure()\n    {\n\n    }\n\n    /**\n     * Returns the pokestop details.\n     */\n    public function getDetails()\n    {\n\n    }\n\n    /**\n     * Returns the current latitude.\n     *\n     * @return double\n     */\n    protected function getCurrentLatitude()\n    {\n        return $this->getApplication()->getLocation()->getLatitude();\n    }\n\n    /**\n     * Returns the current longitude.\n     *\n     * @return double\n     */\n    protected function getCurrentLongitude()\n    {\n        return $this->getApplication()->getLocation()->getLongitude();\n    }\n\n    /**\n     * Returns the request service.\n     *\n     * @return PokestopRequestService\n     */\n    protected function getRequestService()\n    {\n        return new PokestopRequestService();\n    }\n\n}"
  },
  {
    "path": "src/Api/Map/Support/S2.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Map\\Support;\n\nuse S2\\S2CellId;\nuse S2\\S2LatLng;\n\nclass S2 {\n\n    /**\n     * Returns a list of cell ids for latitue and longitude.\n     *\n     * @param double $latitude\n     * @param double $longitude\n     * @param int    $width\n     * @return array\n     */\n    public static function getCellIds($latitude, $longitude, $width = 9)\n    {\n        // Create s2 instance from latitude and longitude\n        $s2latLng = S2LatLng::fromDegrees($latitude, $longitude);\n\n        // Get s2 cell id from latitude and longitude\n        $cellId = S2CellId::fromLatLng($s2latLng)->parent(15);\n\n        // Calculate the size\n        $size = 1 * (2 ** (S2CellId::MAX_LEVEL - $cellId->level()));\n\n        $index = 0;\n        $jindex = 0;\n\n        $face = $cellId->toFaceIJOrientation($index, $jindex);\n\n        $cells = array();\n\n        $halfWidth = (int)floor($width / 2);\n\n        for ($x = -$halfWidth; $x <= $halfWidth; $x++) {\n            for ($y = -$halfWidth; $y <= $halfWidth; $y++) {\n                $s2CellID = S2CellId::fromFaceIJ($face, $index + $x * $size, $jindex + $y * $size);\n\n                $cells[] = $s2CellID->parent(15)->id();\n            }\n        }\n\n        return $cells;\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/CheckChallenge.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player;\n\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\CheckChallenge\\CheckChallengeData;\nuse NicklasW\\PkmGoApi\\Api\\Procedure;\nuse NicklasW\\PkmGoApi\\Services\\Request\\CheckChallengeRequestService;\n\n/**\n * @method array checkChallenge()\n */\nclass CheckChallenge extends Procedure {\n\n    /**\n     * Returns the request data.\n     *\n     * @returns CheckChallengeData\n     */\n    public function getData()\n    {\n        return parent::getData();\n    }\n\n    /**\n     * Updates the player CheckChallenge with the latest data.\n     */\n    public function update()\n    {\n        // Retrieves the checkChallenge metadata\n        $data = $this->getRequestService()->checkChallenge();\n\n        // Set the checkChallenge data\n        $this->data = CheckChallengeData::create($data); \n    }\n\n    /**\n     * Returns the request service.\n     *\n     * @return CheckChallengeRequestService\n     */\n    protected function getRequestService()\n    {\n        return new CheckChallengeRequestService();\n    }\n}\n\n"
  },
  {
    "path": "src/Api/Player/Data/CheckChallenge/CheckChallengeData.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\CheckChallenge;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Networking\\Responses\\CheckChallengeResponse;\n\nclass CheckChallengeData extends Data {\n\n    /**\n     * @var bool The showChallenge value\n     */\n    protected $showChallenge;\n\n    /**\n     * @var string The challengeUrl\n     */\n    protected $challengeUrl;\n\n    /**\n     * Creates a data instance from a Protobuf Message.\n     *\n     * @param CheckChallengeData $data\n     * @return static\n     */\n    public static function create($data)\n    {\n        // Check if we retrieved valid data\n        if ($data == null) {\n            return;\n        }\n\n        // Creates a instance of CheckChallengeData\n        $instance = new static();\n\n        // Set the showChallenge\n        $instance->showChallenge = $data->getShowChallenge();\n\n        // Set the challengeUrl\n        $instance->challengeUrl = $data->getChallengeUrl();\n\n        return $instance;\n    }\n}\n\n"
  },
  {
    "path": "src/Api/Player/Data/Inventory/AppliedItem.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Inventory\\Item\\ItemId;\nuse POGOProtos\\Inventory\\Item\\ItemType;\n\n/**\n * @method void setItemId(int $itemId)\n * @method void setItemType(int $itemType)\n * @method void setExpireMs(int $expireMs)\n * @method void setAppliedMs(int $appliedMs)\n\n * @method int getItemId()\n * @method int getItemType()\n * @method int getExpireMs()\n * @method int getAppliedMs()\n */\nclass AppliedItem extends Data {\n\n    /**\n     * @var int\n     */\n    protected $itemId = ItemId::ITEM_UNKNOWN;\n\n    /**\n     * @var int\n     */\n    protected $itemType = ItemType::ITEM_TYPE_NONE;\n\n    /**\n     * @var int\n     */\n    protected $expireMs = 0;\n\n    /**\n     * @var int\n     */\n    protected $appliedMs = 0;\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/AppliedItems.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Inventory\\AppliedItem as AppliedItemData;\nuse POGOProtos\\Inventory\\AppliedItems as AppliedItemsData;\n\n/**\n * @method void setAppliedItems(AppliedItem[] $candies)\n * @method AppliedItem[] getAppliedItems()\n */\nclass AppliedItems extends Data {\n\n    /**\n     * @var AppliedItem[]\n     */\n    protected $appliedItems = array();\n\n    /**\n     * Add applied item to the list of applied items.\n     *\n     * @param AppliedItemData $appliedItem\n     */\n    public function add($appliedItem)\n    {\n        // Add the applied item to the list of applied items\n        $this->appliedItems[] = AppliedItem::create($appliedItem);\n    }\n\n    /**\n     * Creates a data instance from a Protobuf Message.\n     *\n     * @param AppliedItemsData $data\n     * @return static\n     */\n    public static function create($data)\n    {\n        // Create a instance\n        $instance = new static();\n\n        // Retrieve the items\n        $items = $data->getItem();\n\n        // Iterate through the list of items\n        foreach ($items as $item) {\n            // Add a applied item to the list of applied items\n            $instance->add($item);\n        }\n\n        return $instance;\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/CandyBank.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\PokemonFamilyId;\nuse POGOProtos\\Inventory\\Candy;\nuse POGOProtos\\Inventory\\PokemonFamily;\n\n/**\n * @method void setCandies(CandyItem[] $candies)\n * @method CandyItem[] getCandies()\n */\nclass CandyBank extends Data {\n\n    /**\n     * @var CandyItem[]\n     */\n    protected $candies = array();\n\n    /**\n     * @param Candy $data\n     */\n    public function add($data)\n    {\n        // Create a candy item from pokemon family data\n        $candyItem = CandyItem::create($data);\n\n        // Check if a candy item with the family id already exists\n        if (array_key_exists($candyItem->getFamilyId(), $this->candies)) {\n            // Retrieve the candy item\n            $storedCandyItem = $this->candies[$candyItem->getFamilyId()];\n\n            // Update the number of candy item\n            $storedCandyItem->setCandy($storedCandyItem->getCandy() + $candyItem->getCandy());\n        } else {\n            $this->candies[$candyItem->getFamilyId()] = $candyItem;\n        }\n    }\n\n    /**\n     * Gets candy item by pokemon family id.\n     *\n     * @param integer $familyId\n     * @return CandyItem\n     * @throws Exception\n     */\n    public function get($familyId)\n    {\n        // Check if the provided family id is valid\n        if (!PokemonFamilyId::isValid($familyId)) {\n            throw new Exception(sprintf('Invalid pokemon family id provided. Pokemon family id \\'%s\\'', $familyId));\n        }\n\n        // Check if the candy bank contains the pokemon family id\n        if (!array_key_exists($familyId, $this->candies)) {\n            throw new Exception(sprintf('The candy bank does not contain candy for the pokemon family. Pokemon family id \\'%s\\'', $familyId));\n        }\n\n        return $this->candies[$familyId];\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/CandyItem.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Enums\\PokemonFamilyId;\n\n/**\n * @method void setFamilyId(integer $familyId)\n * @method void setCandy(integer $candy)\n * @method integer getFamilyId()\n * @method integer getCandy()\n */\nclass CandyItem extends Data {\n\n    /**\n     * @var integer\n     */\n    protected $familyId = PokemonFamilyId::FAMILY_UNSET;\n\n    /**\n     * @var integer\n     */\n    protected $candy = 0;\n\n    /**\n     * Returns the number of candies.\n     *\n     * @return int\n     */\n    public function getCount()\n    {\n        return $this->candy;\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/EggIncubator.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Inventory\\EggIncubatorType;\nuse POGOProtos\\Inventory\\Item\\ItemId;\n\n/**\n * @method void setId(string $id)\n * @method void setItemId(int $itemId)\n * @method void setIncubatorType(int $incubatorType)\n * @method void setUsesRemaining(int $usesRemaining)\n * @method void setPokemonId(int $pokemonId)\n * @method void setStartKmWalked(int $startKmWalked)\n * @method void setTargetKmWalked(int $targetKmWalked)\n\n * @method string getId()\n * @method int getItemId()\n * @method int getIncubatorType()\n * @method int getUsesRemaining()\n * @method int getPokemonId()\n * @method int getStartKmWalked()\n * @method int getTargetKmWalked()\n */\nclass EggIncubator extends Data {\n\n    /**\n     * @var string\n     */\n    protected $id = \"\";\n\n    /**\n     * @var int\n     */\n    protected $itemId = ItemId::ITEM_UNKNOWN;\n\n    /**\n     * @var int\n     */\n    protected $incubatorType = EggIncubatorType::INCUBATOR_UNSET;\n\n    /**\n     * @var int\n     */\n    protected $usesRemaining = 0;\n\n    /**\n     * @var int\n     */\n    protected $pokemonId = 0;\n\n    /**\n     * @var int\n     */\n    protected $startKmWalked = 0;\n\n    /**\n     * @var int\n     */\n    protected $targetKmWalked = 0;\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/EggIncubators.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\nuse POGOProtos\\Inventory\\EggIncubator as EggIncubatorData;\nuse POGOProtos\\Inventory\\EggIncubators as EggIncubatorsData;\n\n/**\n * @method void setEggIncubators(EggIncubator[] $eggIncubators)\n * @method EggIncubator[] getEggIncubators()\n */\nclass EggIncubators extends Data {\n\n    /**\n     * @var EggIncubator[]\n     */\n    protected $eggIncubators = array();\n\n    /**\n     * @param EggIncubatorData $eggIncubator\n     */\n    public function add($eggIncubator)\n    {\n        // Add the egg incubator to the list of egg incubators\n        $this->eggIncubators[] = EggIncubator::create($eggIncubator);\n    }\n\n    /**\n     * Creates a data instance from a Protobuf Message.\n     *\n     * @param EggIncubatorsData $data\n     * @return static\n     */\n    public static function create($data)\n    {\n        // Create a instance\n        $instance = new static();\n\n        // Iterate through the list of egg incubators\n        foreach ($data->getEggIncubator() as $eggIncubator) {\n            // Add a egg incubator to the list of egg incubators\n            $instance->add($eggIncubator);\n        }\n\n        return $instance;\n    }\n\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/EggPokemon.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\n/**\n * @method void setId(long $id)\n * @method void setEggKmWalkedTarget(double $eggKmWalkedTarget)\n * @method void setCapturedCellId(long $capturedCellId)\n * @method void setCreationTimeMs(long $creationTimeMs)\n * @method void setEggIncubatorId(string $eggIncubatorId)\n\n * @method long getId()\n * @method double getEggKmWalkedTarget()\n * @method long getCapturedCellId()\n * @method long getCreationTimeMs()\n * @method string getEggIncubatorId()\n */\nclass EggPokemon extends Data {\n\n    /**\n     * @var long\n     */\n    protected $id;\n\n    /**\n     * @var double\n     */\n    protected $eggKmWalkedTarget;\n\n    /**\n     * @var long\n     */\n    protected $capturedCellId;\n\n    /**\n     * @var long\n     */\n    protected $creationTimeMs;\n\n    /**\n     * @var string\n     */\n    protected $eggIncubatorId;\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/Item.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\n/**\n * @method void setItemId(integer $itemId)\n * @method void setCount(integer $count)\n * @method void setUnseen(boolean $unseen)\n *\n * @method integer getItemId()\n * @method integer getCount()\n * @method boolean getUnseen()\n */\n\nclass Item extends Data {\n\n    /**\n     * @var integer The item id, POGOProtos\\Inventory\\ItemId\n     */\n    protected $itemId;\n\n    /**\n     * @var integer\n     */\n    protected $count;\n\n    /**\n     * @var boolean\n     */\n    protected $unseen;\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/Items.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\ItemId;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse POGOProtos\\Inventory\\InventoryDelta;\nuse POGOProtos\\Inventory\\InventoryItem;\nuse POGOProtos\\Inventory\\InventoryItemData;\n\n/**\n * @method void setPokeBank(PokeBank $pokeBank)\n * @method void setItems(Item[] $items)\n * @method void setCandyBank(CandyBank $candyBank)\n * @method void setPokedex(Pokedex $pokedex)\n * @method void setAppliedItems(AppliedItems $appliedItems)\n * @method void setStats(Stats $stats)\n * @method void setEggPokemon(EggPokemon[] $eggPokemon)\n * @method PokeBank getPokeBank()\n * @method Item[] getItems()\n * @method CandyBank getCandyBank()\n * @method Pokedex getPokedex()\n * @method EggIncubators getEggIncubators()\n * @method AppliedItems getAppliedItems()\n * @method Stats getStats()\n * @method EggPokemon[] getEggPokemon()\n */\nclass Items extends Data {\n\n    /**\n     * @var PokeBank\n     */\n    protected $pokeBank;\n\n    /**\n     * @var Item[]\n     */\n    protected $items;\n\n    /**\n     * @var CandyBank\n     */\n    protected $candyBank;\n\n    /**\n     * @var Pokedex\n     */\n    protected $pokedex;\n\n    /**\n     * @var EggIncubators\n     */\n    protected $eggIncubators;\n\n    /**\n     * @var AppliedItems\n     */\n    protected $appliedItems;\n\n    /**\n     * @var Stats\n     */\n    protected $stats;\n\n    /**\n     * @var EggPokemon[]\n     */\n    protected $eggPokemon = array();\n\n    /**\n     * Items constructor.\n     */\n    public function __construct()\n    {\n        $this->pokeBank = new PokeBank();\n        $this->candyBank = new CandyBank();\n        $this->pokedex = new Pokedex();\n        $this->eggIncubators = new EggIncubators();\n        $this->appliedItems = new AppliedItems();\n    }\n\n    /**\n     * Creates a data instance from a Protobuf Message.\n     *\n     * @param InventoryDelta $data\n     * @return static\n     */\n    public static function create($data)\n    {\n        // Initialize the Items instance\n        $instance = new static();\n\n        /** @var InventoryItem[] $items */\n        $items = $data->getInventoryItems();\n\n        // Iterate through the inventory items\n        foreach ($items as $item) {\n            // Create the corresponding item type\n            $instance->createItemData($item->getInventoryItemData());\n        }\n\n        return $instance;\n    }\n\n    /**\n     * Creates item data.\n     *\n     * @param InventoryItemData $itemData\n     * @throws Exception\n     */\n    protected function createItemData($itemData)\n    {\n        if (self::isItem($itemData)) {\n            // Retrieve the item data instance\n            $item = $itemData->getItem();\n\n            // Retrieve the item data\n            $this->items[$item->getItemId()] = Item::create($item);\n        } elseif (self::isEggPokemon($itemData)) {\n            // Retrieve the applied items data\n            $this->eggPokemon[] = EggPokemon::create($itemData->getPokemonData());\n\n        } elseif (self::isPokemon($itemData)) {\n            // Retrieve the pokemon data\n            $this->pokeBank->add($itemData->getPokemonData());\n\n        } elseif (self::isCandy($itemData)) {\n            // Retrieve the candy item data\n            $this->candyBank->add($itemData->getCandy());\n\n        } elseif (self::isPokedexItem($itemData)) {\n            // Retrieve the pokedex item data\n            $this->pokedex->add($itemData->getPokedexEntry());\n\n        } elseif (self::isEggIncubators($itemData)) {\n            // Retrieve the egg incubators item data\n            $this->eggIncubators = EggIncubators::create($itemData->getEggIncubators());\n\n        } elseif (self::isAppliedItems($itemData)) {\n            // Retrieve the applied items data\n            $this->appliedItems = AppliedItems::create($itemData->getAppliedItems());\n\n        } elseif (self::isPlayerStats($itemData)) {\n            // Retrieve the applied items data\n            $this->stats = Stats::create($itemData->getPlayerStats());\n        } else {\n            Log::warning('Unknown item type encountered', array('item' => $itemData));\n        }\n\n    }\n\n    /**\n     * Returns item instance or null.\n     *\n     * @param integer $id\n     * @return Item\n     * @throws Exception\n     */\n    public function getItemById($id)\n    {\n        // Check if we retrieved a valid item id\n        if (!ItemId::isValid($id)) {\n            throw new Exception(sprintf('Invalid item id provided. Id \\'%s\\'', $id));\n        }\n\n        // Check if we have that particular item in the inventory\n        if (!array_key_exists($id, $this->items)) {\n            return null;\n        }\n\n        return $this->items[$id];\n    }\n\n    /**\n     * Returns true if the item data is of type item, false otherwise.\n     *\n     * @param InventoryItemData $itemData\n     * @return boolean\n     */\n    protected static function isItem($itemData)\n    {\n        return $itemData->getItem() != null;\n    }\n\n    /**\n     * Returns true if the item data is of type pokemon, false otherwise.\n     *\n     * @param InventoryItemData $itemData\n     * @return boolean\n     */\n    protected static function isPokemon($itemData)\n    {\n        return $itemData->getPokemonData() != null;\n    }\n\n    /**\n     * Returns true if the item data is of type candy, false otherwise.\n     *\n     * @param InventoryItemData $itemData\n     * @return boolean\n     */\n    protected static function isCandy($itemData)\n    {\n        return $itemData->getCandy() != null;\n    }\n\n    /**\n     * Returns true if the item data is of type pokedex item, false otherwise.\n     *\n     * @param InventoryItemData $itemData\n     * @return boolean\n     */\n    protected static function isPokedexItem($itemData)\n    {\n        return $itemData->getPokedexEntry() != null;\n    }\n\n    /**\n     * Returns true if the item data is of type pokedex item, false otherwise.\n     *\n     * @param InventoryItemData $itemData\n     * @return boolean\n     */\n    protected static function isEggIncubators($itemData)\n    {\n        return $itemData->getEggIncubators() != null;\n    }\n\n    /**\n     * Returns true if the item data is of type pokedex item, false otherwise.\n     *\n     * @param InventoryItemData $itemData\n     * @return boolean\n     */\n    protected static function isAppliedItems($itemData)\n    {\n        return $itemData->getAppliedItems() != null;\n    }\n\n    /**\n     * Returns true if the item data is of type pokedex item, false otherwise.\n     *\n     * @param InventoryItemData $itemData\n     * @return boolean\n     */\n    protected static function isPlayerStats($itemData)\n    {\n        return $itemData->getPlayerStats() != null;\n    }\n\n    /**\n     * Returns true if the item data is of type egg pokemon item, false otherwise.\n     *\n     * @param InventoryItemData $itemData\n     * @return boolean\n     */\n    protected static function isEggPokemon($itemData)\n    {\n        return $itemData->getPokemonData() != null && $itemData->getPokemonData()->getIsEgg();\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/PokeBank.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Collection\\PokemonCollection;\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Pokemon;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\PokemonFamilyId;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\PokemonId;\nuse POGOProtos\\Data\\PokemonData;\n\n/**\n * @method void setPokemons(PokemonCollection $pokemons)\n * @method PokemonCollection getPokemons()\n */\nclass PokeBank extends Data {\n\n    /**\n     * @var PokemonCollection\n     */\n    protected $pokemons = array();\n\n    /**\n     * PokeBank constructor.\n     */\n    public function __construct()\n    {\n        $this->pokemons = new PokemonCollection();\n    }\n\n    /**\n     * Add a pokemon to the poke bank by pokemon data.\n     *\n     * @param PokemonData $data\n     */\n    public function add($data)\n    {\n        // Create a new pokemon instance\n        $pokemon = new Pokemon(PokemonItem::create($data));\n\n        // Add the pokemon to the list of pokemons\n        $this->pokemons->put($pokemon->getId(), $pokemon);\n    }\n\n    /**\n     * Add a pokemon to the poke bank.\n     *\n     * @param Pokemon $pokemon\n     */\n    public function addPokemon($pokemon)\n    {\n        // Add the pokemon to the list of pokemons\n        $this->pokemons->put($pokemon->getId(), $pokemon);\n    }\n\n    /**\n     * Remove the pokemon from the poke bank by pokemon id.\n     *\n     * @param integer $id\n     * @return boolean\n     */\n    public function removeBydId($id)\n    {\n        // Check if the poke bank contains the pokemon\n        if (!$this->pokemons->offsetExists($id)) {\n            return false;\n        }\n\n        // Remove the pokemon from the poke bank\n        $this->pokemons->forget($id);\n\n        return true;\n    }\n\n    /**\n     * Remove the pokemon from the poke bank.\n     *\n     * @param Pokemon $pokemon\n     * @return boolean\n     */\n    public function removePokemon($pokemon)\n    {\n        return $this->removeBydId($pokemon->getPokemonId());\n    }\n\n    /**\n     * Returns a pokemon by pokemon id.\n     *\n     * @param integer $id\n     * @return Pokemon\n     */\n    public function getPokemonById($id)\n    {\n        // Check if the pokemon exists within the poke bank\n        if (!$this->pokemons->offsetExists($id)) {\n            return null;\n        }\n\n        return $this->pokemons->get($id);\n    }\n\n    /**\n     * Returns pokemons by pokemon type.\n     *\n     * @param integer $typeId\n     * @return PokemonCollection\n     * @throws Exception\n     */\n    public function getPokemonsByType($typeId)\n    {\n        // Check if we retrieved a valid pokemon type id\n        if (!PokemonId::isValid($typeId)) {\n            throw new Exception(sprintf('Invalid pokemon type id provided. Provided pokemon type id: \\'%s\\'', $typeId));\n        }\n        return $this->pokemons->filter(function (Pokemon $pokemon) use ($typeId) {\n            return $pokemon->getPokemonId() == $typeId;\n        });\n    }\n\n    /**\n     * Returns pokemons by pokemon family.\n     *\n     * @param integer $familyId\n     * @return PokemonCollection\n     * @throws Exception\n     */\n    public function getPokemonsByFamily($familyId)\n    {\n        // Check if we retrieved a valid pokemon family id\n        if (!PokemonFamilyId::isValid($familyId)) {\n            throw new Exception(sprintf('Invalid pokemon family id provided. Provided pokemon family id: \\'%s\\'', $familyId));\n        }\n\n        return $this->pokemons->filter(function (Pokemon $pokemon) use ($familyId) {\n            return $pokemon->getFamilyId() == $familyId;\n        });\n    }\n\n}\n"
  },
  {
    "path": "src/Api/Player/Data/Inventory/Pokedex.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\PokemonId;\nuse POGOProtos\\Data\\PokedexEntry;\n\n/**\n * @method void setItems(PokedexItem[] $items)\n * @method PokedexItem[] getItems()\n */\nclass Pokedex extends Data {\n\n    /**\n     * @var array\n     */\n    protected $items = array();\n\n    /**\n     * Add pokedex item.\n     *\n     * @param PokedexEntry $pokedexEntry\n     */\n    public function add($pokedexEntry)\n    {\n        // Create the pokedex item\n        $item = PokedexItem::create($pokedexEntry);\n\n        // Add the pokedex item to the list of pokedex items\n        $this->items[$item->getPokemonId()] = $item;\n    }\n\n    /**\n     * Gets the pokedex item by pokemon id\n     *\n     * @param integer $pokemonId\n     * @return PokedexItem|null\n     */\n    public function get($pokemonId)\n    {\n        // Check whether a valid pokemon id was provided\n        if (!PokemonId::isValid($pokemonId)) {\n            return null;\n        }\n\n        // Check if the pokemon exists within the pokedex\n        if (array_key_exists($pokemonId, $this->items)) {\n            return $this->items[$pokemonId];\n        }\n\n        return $this->createEmptyItem($pokemonId);\n    }\n\n    /**\n     * Creates a empty PokedexItem.\n     *\n     * @param integer $pokemonId\n     * @return PokedexItem\n     */\n    protected function createEmptyItem($pokemonId)\n    {\n        // Create a new pokedex item\n        $entry = new PokedexItem();\n\n        // Set the pokemon id\n        $entry->setPokemonId($pokemonId);\n\n        return $entry;\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/PokedexItem.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\n/**\n * @method void setPokemonId(integer $pokemonId)\n * @method void setTimesEncountered(integer $timesEncountered)\n * @method void setTimesCaptured(integer $timesCaptured)\n * @method void setEvolutionStonePieces(integer $evolutionStonePieces)\n * @method void setEvolutionStones(integer $evolutionStones)\n *\n * @method int getPokemonId()\n * @method int getTimesEncountered()\n * @method int getTimesCaptured()\n * @method int getEvolutionStonePieces()\n * @method int getEvolutionStones()\n */\nclass PokedexItem extends Data {\n\n    /**\n     * @var int\n     */\n    protected $pokemonId = 0;\n\n    /**\n     * @var int\n     */\n    protected $timesEncountered = 0;\n\n    /**\n     * @var int\n     */\n    protected $timesCaptured = 0;\n\n    /**\n     * @var int\n     */\n    protected $evolutionStonePieces = 0;\n\n    /**\n     * @var int\n     */\n    protected $evolutionStones = 0;\n\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/PokemonItem.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Enums\\PokemonId;\nuse POGOProtos\\Enums\\PokemonMove;\n\n/**\n * @method void setId(int $id)\n * @method void setPokemonId(int $pokemonId)\n * @method void setCp(int $cp)\n * @method void setStamina(int $stamina)\n * @method void setStaminaMax(int $staminaMax)\n * @method void setMove1(int $move1)\n * @method void setMove2(int $move2)\n * @method void setDeployedFortId(int $deployedFortId)\n * @method void setOwnerName(string $ownerName)\n * @method void setIsEgg(boolean $isEgg)\n * @method void setEggKmWalkedTarget(int $eggKmWalkedTarget)\n * @method void setEggKmWalkedStart(int $eggKmWalkedStart)\n * @method void setOrigin(int $origin)\n * @method void setHeightM(int $heightM)\n * @method void setWeightKg(int $weightKg)\n * @method void setIndividualAttack(int $individualAttack)\n * @method void setIndividualDefense(int $individualDefense)\n * @method void setIndividualStamina(int $individualStamina)\n * @method void setCpMultiplier(int $cpMultiplier)\n * @method void setPokeball(int $pokeball)\n * @method void setCapturedCellId(int $capturedCellId)\n * @method void setBattlesAttacked(int $battlesAttacked)\n * @method void setBattlesDefended(int $battlesDefended)\n * @method void setEggIncubatorId(string $eggIncubatorId)\n * @method void setCreationTimeMs(int $creationTimeMs)\n * @method void setNumUpgrades(int $numUpgrades)\n * @method void setAdditionalCpMultiplier(int $additionalCpMultiplier)\n * @method void setFavorite(int $favorite)\n * @method void setNickname(string $nickname)\n * @method void setFromFort(int $fromFort)\n *\n * @method int getId()\n * @method int getPokemonId()\n * @method int getCp()\n * @method int getStamina()\n * @method int getStaminaMax()\n * @method int getMove1()\n * @method int getMove2()\n * @method int getDeployedFortId()\n * @method string getOwnerName()\n * @method boolean getIsEgg()\n * @method int getEggKmWalkedTarget()\n * @method int getEggKmWalkedStart()\n * @method int getOrigin()\n * @method int getHeightM()\n * @method int getWeightKg()\n * @method int getIndividualAttack()\n * @method int getIndividualDefense()\n * @method int getIndividualStamina()\n * @method int getCpMultiplier()\n * @method int getPokeball()\n * @method int getCapturedCellId()\n * @method int getBattlesAttacked()\n * @method int getBattlesDefended()\n * @method string getEggIncubatorId()\n * @method int getCreationTimeMs()\n * @method int getNumUpgrades()\n * @method int getAdditionalCpMultiplier()\n * @method int getFavorite()\n * @method string getNickname()\n * @method int getFromFort()\n */\nclass PokemonItem extends Data {\n\n    /**\n     * @var int\n     */\n    protected $id = 0;\n\n    /**\n     * @var int\n     */\n    protected $pokemonId = PokemonId::MISSINGNO;\n\n    /**\n     * @var int\n     */\n    protected $cp = 0;\n\n    /**\n     * @var int\n     */\n    protected $stamina = 0;\n\n    /**\n     * @var int\n     */\n    protected $staminaMax = 0;\n\n    /**\n     * @var int\n     */\n    protected $move1 = PokemonMove::MOVE_UNSET;\n\n    /**\n     * @var int\n     */\n    protected $move2 = PokemonMove::MOVE_UNSET;\n\n    /**\n     * @var int\n     */\n    protected $deployedFortId = 0;\n\n    /**\n     * @var string\n     */\n    protected $ownerName = \"\";\n\n    /**\n     * @var bool\n     */\n    protected $isEgg = false;\n\n    /**\n     * @var int\n     */\n    protected $eggKmWalkedTarget = 0;\n\n    /**\n     * @var int\n     */\n    protected $eggKmWalkedStart = 0;\n\n    /**\n     * @var int\n     */\n    protected $origin = 0;\n\n    /**\n     * @var int\n     */\n    protected $heightM = 0;\n\n    /**\n     * @var int\n     */\n    protected $weightKg = 0;\n\n    /**\n     * @var int\n     */\n    protected $individualAttack = 0;\n\n    /**\n     * @var int\n     */\n    protected $individualDefense = 0;\n\n    /**\n     * @var int\n     */\n    protected $individualStamina = 0;\n\n    /**\n     * @var int\n     */\n    protected $cpMultiplier = 0;\n\n    /**\n     * @var int\n     */\n    protected $pokeball = 0;\n\n    /**\n     * @var int\n     */\n    protected $capturedCellId = 0;\n\n    /**\n     * @var int\n     */\n    protected $battlesAttacked = 0;\n\n    /**\n     * @var int\n     */\n    protected $battlesDefended = 0;\n\n    /**\n     * @var string\n     */\n    protected $eggIncubatorId = \"\";\n\n    /**\n     * @var int\n     */\n    protected $creationTimeMs = 0;\n\n    /**\n     * @var int\n     */\n    protected $numUpgrades = 0;\n\n    /**\n     * @var int\n     */\n    protected $additionalCpMultiplier = 0;\n\n    /**\n     * @var int\n     */\n    protected $favorite = 0;\n\n    /**\n     * @var string\n     */\n    protected $nickname = \"\";\n\n    /**\n     * @var int\n     */\n    protected $fromFort = 0;\n    \n}"
  },
  {
    "path": "src/Api/Player/Data/Inventory/Stats.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Inventory\\AppliedItem as AppliedItemData;\nuse POGOProtos\\Inventory\\AppliedItems as AppliedItemsData;\n\n/**\n * @method void setLevel(int $candies)\n * @method void setExperience(int $experience)\n * @method void setPrevLevelXp(int $prevLevelXp)\n * @method void setNextLevelXp(int $nextLevelXp)\n * @method void setKmWalked(int $kmWalked)\n * @method void setPokemonsEncountered(int $pokemonsEncountered)\n * @method void setAppliedItems(int $candies)\n * @method void setUniquePokedexEntries(int $uniquePokedexEntries)\n * @method void setPokemonsCaptured(int $pokemonsCaptured)\n * @method void setEvolutions(int $evolutions)\n * @method void setPokeStopVisits(int $pokeStopVisits)\n * @method void setPokeballsThrown(int $pokeballsThrown)\n * @method void setEggsHatched(int $eggsHatched)\n * @method void setBigMagikarpCaught(int $bigMagikarpCaught)\n * @method void setBattleAttackWon(int $battleAttackWon)\n * @method void setBattleAttackTotal(int $battleAttackTotal)\n * @method void setBattleDefendedWon(int $battleDefendedWon)\n * @method void setBattleTrainingWon(int $battleTrainingWon)\n * @method void setBattleTrainingTotal(int $battleTrainingTotal)\n * @method void setPrestigeRaisedTotal(int $prestigeRaisedTotal)\n * @method void setPrestigeDroppedTotal(int $prestigeDroppedTotal)\n * @method void setPokemonDeployed(int $pokemonDeployed)\n * @method void setPokemonCaughtByType(string $pokemonCaughtByType)\n * @method void setSmallRattataCaught(int $smallRattataCaught)\n \n * @method int getLevel()\n * @method int getExperience()\n * @method int getPrevLevelXp()\n * @method int getNextLevelXp()\n * @method int getKmWalked()\n * @method int getPokemonsEncountered()\n * @method int getAppliedItems()\n * @method int getUniquePokedexEntries()\n * @method int getPokemonsCaptured()\n * @method int getEvolutions()\n * @method int getPokeStopVisits()\n * @method int getPokeballsThrown()\n * @method int getEggsHatched()\n * @method int getBigMagikarpCaught()\n * @method int getBattleAttackWon()\n * @method int getBattleAttackTotal()\n * @method int getBattleDefendedWon()\n * @method int getBattleTrainingWon()\n * @method int getBattleTrainingTotal()\n * @method int getPrestigeRaisedTotal()\n * @method int getPrestigeDroppedTotal()\n * @method int getPokemonDeployed()\n * @method int getPokemonCaughtByType()\n * @method int getSmallRattataCaught()\n */\nclass Stats extends Data {\n\n    /**\n     * @var int\n     */\n    protected $level = 0;\n\n    /**\n     * @var int\n     */\n    protected $experience = 0;\n\n    /**\n     * @var int\n     */\n    protected $prevLevelXp = 0;\n\n    /**\n     * @var int\n     */\n    protected $nextLevelXp = 0;\n\n    /**\n     * @var int\n     */\n    protected $kmWalked = 0;\n\n    /**\n     * @var int\n     */\n    protected $pokemonsEncountered = 0;\n\n    /**\n     * @var int\n     */\n    protected $uniquePokedexEntries = 0;\n\n    /**\n     * @var int\n     */\n    protected $pokemonsCaptured = 0;\n\n    /**\n     * @var int\n     */\n    protected $evolutions = 0;\n\n    /**\n     * @var int\n     */\n    protected $pokeStopVisits = 0;\n\n    /**\n     * @var int\n     */\n    protected $pokeballsThrown = 0;\n\n    /**\n     * @var int\n     */\n    protected $eggsHatched = 0;\n\n    /**\n     * @var int\n     */\n    protected $bigMagikarpCaught = 0;\n\n    /**\n     * @var int\n     */\n    protected $battleAttackWon = 0;\n\n    /**\n     * @var int\n     */\n    protected $battleAttackTotal = 0;\n\n    /**\n     * @var int\n     */\n    protected $battleDefendedWon = 0;\n\n    /**\n     * @var int\n     */\n    protected $battleTrainingWon = 0;\n\n    /**\n     * @var int\n     */\n    protected $battleTrainingTotal = 0;\n\n    /**\n     * @var int\n     */\n    protected $prestigeRaisedTotal = 0;\n\n    /**\n     * @var int\n     */\n    protected $prestigeDroppedTotal = 0;\n\n    /**\n     * @var int\n     */\n    protected $pokemonDeployed = 0;\n\n    /**\n     * @var string\n     */\n    protected $pokemonCaughtByType = \"\";\n\n    /**\n     * @var int\n     */\n    protected $smallRattataCaught = 0;\n\n    /**\n     * @var int[]\n     */\n    protected static $requiredXp = [\n        0, 1000, 3000, 6000, 10000, 15000, 21000, 28000, 36000, 45000, 55000, 65000, 75000, 85000, 100000, 120000,\n        140000, 160000, 185000, 210000, 260000, 335000, 435000, 560000, 710000, 900000, 1100000, 1350000, 1650000,\n        2000000, 2500000, 3000000, 3750000, 4750000, 6000000, 7500000, 9500000, 12000000, 15000000, 20000000];\n\n    /**\n     * Return the XP required for the given level.\n     *\n     * @param int $level\n     * @return int\n     */\n    public function getLevelXp($level = 1) {\n        return isset(self::$requiredXp[$level-1]) ? self::$requiredXp[$level-1] : 0;\n    }\n\n    /**\n     * Return the XP required for the current level.\n     *\n     * @return int\n     */\n    public function getCurrentLevelXp() {\n        return $this->getLevelXp($this->getLevel());\n    }\n\n    /**\n     * Return the XP earned on the current level.\n     *\n     * @return number\n     */\n    public function getCurrentLevelProgressXp() {\n        return $this->getExperience() - $this->getCurrentLevelXp();\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Journal/Fort.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Journal;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Data\\Logs\\FortSearchLogEntry;\n\nclass Fort extends Data {\n\n    /**\n     * @var integer\n     */\n    protected $timestampMs;\n\n    /**\n     * @var integer\n     */\n    protected $result;\n\n    /**\n     * @var string\n     */\n    protected $fortId;\n\n    /**\n     * @var integer\n     */\n    protected $eggs;\n\n    /**\n     * @var Item[]\n     */\n    protected $items;\n\n    /**\n     * Creates a data instance from a Protobuf Message.\n     *\n     * @param FortSearchLogEntry $data\n     * @return static\n     */\n    public static function create($data)\n    {\n        // Check if we retrieved valid data\n        if ($data == null) {\n            return;\n        }\n\n        $instance = new static();\n\n        // Set the result status\n        $instance->result = $data->getResult();\n\n        // Set the fort id\n        $instance->fortId = $data->getFortId();\n\n        // Set the egg count\n        $instance->eggs = $data->getEggs();\n\n        foreach ($data->getItems() as $item) {\n            // Add the item to the list of items\n            $instance->items[] = Item::create($item);\n        }\n\n        return $instance;\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Journal/Item.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Journal;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\nclass Item extends Data {\n\n    /**\n     * @var integer\n     */\n    protected $itemId;\n\n    /**\n     * @var integer\n     */\n    protected $count;\n\n    /**\n     * @var boolean\n     */\n    protected $unseen;\n\n    /**\n     * Returns the item id.\n     *\n     * @return int\n     */\n    public function getItemId()\n    {\n        return $this->itemId;\n    }\n\n    /**\n     * Returns the count.\n     *\n     * @return int\n     */\n    public function getCount()\n    {\n        return $this->count;\n    }\n\n    /**\n     * Return true if unseen, false otherwise.\n     *\n     * @return boolean\n     */\n    public function isUnseen()\n    {\n        return $this->unseen;\n    }\n    \n\n}"
  },
  {
    "path": "src/Api/Player/Data/Journal/Log.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Journal;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Data\\Logs\\ActionLogEntry;\n\nclass Log extends Data\n{\n\n    /**\n     * @var Fort[]\n     */\n    protected $forts = array();\n\n    /**\n     * @var Pokemon[]\n     */\n    protected $pokemons = array();\n\n    /**\n     * @return Fort[]\n     */\n    public function getForts()\n    {\n        return $this->forts;\n    }\n\n    /**\n     * @return Pokemon[]\n     */\n    public function getPokemons()\n    {\n        return $this->pokemons;\n    }\n\n    /**\n     * Creates a data instance from a Protobuf Message.\n     *\n     * @param ActionLogEntry[] $data\n     * @return static\n     */\n    public static function create($data)\n    {\n        $instance = new static();\n\n        // Check if we retrieved valid data\n        if ($data == null) {\n            return $instance;\n        }\n\n        foreach ($data as $logEntry) {\n            if ($logEntry->getCatchPokemon()) {\n                $element = Pokemon::create($logEntry->getCatchPokemon());\n                $element->setTimestampMs($logEntry->getTimestampMs());\n\n                // Adds pokemon to the list of pokemon log entries\n                $instance->pokemons[] = $element;\n            } elseif ($logEntry->getFortSearch()) {\n                $element = Fort::create($logEntry->getFortSearch());;\n                $element->setTimestampMs($logEntry->getTimestampMs());\n\n                // Add fort to the list of fort log entries\n                $instance->forts[] = $element;\n            }\n        }\n\n        return $instance;\n    }\n\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Journal/Pokemon.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Journal;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\PokedexItem;\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Data\\PokemonMeta;\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Data\\PokemonMetaRegistry;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Traits\\MakeApiResourcesAvailable;\n\nclass Pokemon extends Data {\n\n    use MakeApiResourcesAvailable;\n\n    /**\n     * @var integer\n     */\n    protected $timestampMs;\n\n    /**\n     * @var integer\n     */\n    protected $result;\n\n    /**\n     * @var integer\n     */\n    protected $pokemonId;\n\n    /**\n     * @var integer\n     */\n    protected $combatPoints;\n\n    /**\n     * @var integer\n     */\n    protected $pokemonDataId;\n\n    /**\n     * Returns the timestamp (in ms) of this log entry.\n     *\n     * @return integer\n     */\n    public function getTimestampMs() {\n        return $this->timestampMs;\n    }\n\n    /**\n     * Returns the catch result.\n     * (1=success, 2=escaped)\n     * @return int\n     */\n    public function getResult()\n    {\n        return $this->result;\n    }\n\n    /**\n     * Returns pokemon id.\n     *\n     * @return int\n     */\n    public function getPokemonId()\n    {\n        return $this->pokemonId;\n    }\n\n    /**\n     * Returns the combat points.\n     *\n     * @return int\n     */\n    public function getCombatPoints()\n    {\n        return $this->combatPoints;\n    }\n\n    /**\n     * Returns the pokemon data id.\n     *\n     * @return int\n     */\n    public function getPokemonDataId()\n    {\n        return $this->pokemonDataId;\n    }\n\n    /**\n     * Returns the pokemon metadata.\n     *\n     * @return PokemonMeta\n     */\n    public function getPokemonMeta()\n    {\n        return PokemonMetaRegistry::getByPokemonId($this->pokemonId);\n    }\n\n    /**\n     * Returns the pokedex entry.\n     *\n     * @return PokedexItem\n     */\n    public function getPokedexEntry()\n    {\n        return $this->pokedex()->get($this->pokemonId);\n    }\n\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Profile/Avatar.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\n/**\n * @method void setSkin(int $skin)\n * @method void setHair(int $hair)\n * @method void setShirt(int $shirt)\n * @method void setPants(int $pants)\n * @method void setHat(int $hat)\n * @method void setShoes(int $shoes)\n * @method void setGender(int $gender)\n * @method void setEyes(int $eyes)\n * @method void setBackpack(int $backpack)\n *\n * @method integer getSkin()\n * @method integer getHair()\n * @method integer getShirt()\n * @method integer getPants()\n * @method integer getHat()\n * @method integer getShoes()\n * @method integer getGender()\n * @method integer getEyes()\n * @method integer getBackpack()\n */\nclass Avatar extends Data {\n\n    /**\n     * @var integer\n     */\n    protected $skin;\n\n    /**\n     * @var integer\n     */\n    protected $hair;\n\n    /**\n     * @var integer\n     */\n    protected $shirt;\n\n    /**\n     * @var integer\n     */\n    protected $pants;\n\n    /**\n     * @var integer\n     */\n    protected $hat;\n\n    /**\n     * @var integer\n     */\n    protected $shoes;\n\n    /**\n     * @var integer\n     */\n    protected $gender;\n\n    /**\n     * @var integer\n     */\n    protected $eyes;\n\n    /**\n     * @var integer\n     */\n    protected $backpack;\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Profile/Badge.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\n/**\n * @method void setBadgeType(int $badgeType)\n * @method void setLevel(int $level)\n * @method void setNextEquipChangeAllowedTimestampMs(int $nextEquipChangeAllowedTimestampMs)\n *\n * @method integer getBadgeType()\n * @method integer getLevel()\n * @method integer getNextEquipChangeAllowedTimestampMs()\n */\nclass Badge extends Data {\n\n    /**\n     * @var integer\n     */\n    protected $badgeType;\n    /**\n     * @var array\n     */\n    protected $level;\n\n    /**\n     * @var integer\n     */\n    protected $nextEquipChangeAllowedTimestampMs;\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Profile/ContactSettings.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\n/**\n * @method void setSendMarketingEmails(int $sendMarketingEmails)\n * @method void setSendPushNotifications(int $sendPushNotifications)\n *\n * @method integer getSendMarketingEmails()\n * @method integer getSendPushNotifications()\n */\nclass ContactSettings extends Data {\n\n    /**\n     * @var integer\n     */\n    protected $sendMarketingEmails;\n\n    /**\n     * @var integer\n     */\n    protected $sendPushNotifications;\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Profile/Currencies.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Data\\Player\\Currency as PlayerCurrency;\n\n/**\n * @method integer setCurrencies(array $state)\n * @method integer getCurrencies()\n */\nclass Currencies extends Data {\n\n    /**\n     * @var string The pokecoin currency type\n     */\n    const CURRENCY_TYPE_POKECOIN = 'POKECOIN';\n\n    /**\n     * @var string The stardust currency type\n     */\n    const CURRENCY_TYPE_STARDUST = 'STARDUST';\n\n    /**\n     * @var Currency[]\n     */\n    protected $currencies;\n\n    /**\n     * Creates a TutorialState instance.\n     *\n     * @param PlayerCurrency[] $currencies\n     * @return static\n     */\n    public static function create($currencies)\n    {\n        $instance = new static();\n\n        foreach ($currencies as $playerCurrency) {\n            $currency = new Currency();\n\n            $currency->setName($playerCurrency->getName());\n            $currency->setAmount($playerCurrency->getAmount());\n\n            $instance->currencies[$playerCurrency->getName()] = $currency;\n        }\n\n        return $instance;\n    }\n\n    /**\n     * Returns the currency by currency type.\n     *\n     * @param string $type\n     * @return Currency\n     * @throws Exception\n     */\n    public function getByType($type)\n    {\n        // Check if the provided type is a valid currency type\n        if (!array_key_exists($type, $this->currencies)) {\n            throw new Exception('Invalid currency type provided');\n        }\n\n        return $this->currencies[$type];\n    }\n\n    /**\n     * Returns the pokecoins currency.\n     *\n     * @return Currency\n     * @throws Exception\n     */\n    public function getPokecoins()\n    {\n        return $this->getByType(self::CURRENCY_TYPE_POKECOIN);\n    }\n\n    /**\n     * Returns stardust currency.\n     *\n     * @return Currency\n     * @throws Exception\n     */\n    public function getStardust()\n    {\n        return $this->getByType(self::CURRENCY_TYPE_STARDUST);\n    }\n\n    /**\n     * Returns all currency types.\n     *\n     * @return array\n     */\n    public function toArray()\n    {\n        return $this->currencies;\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Profile/Currency.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\n/**\n * @method void setName(string $state)\n * @method void setAmount(integer $state)\n *\n * @method string getName()\n * @method integer getAmount()\n */\nclass Currency extends Data {\n\n    /**\n     * @var string\n     */\n    protected $name;\n\n    /**\n     * @var string\n     */\n    protected $amount;\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Profile/DailyBonus.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\n/**\n * @method void setNextCollectedTimestampMs(int $nextCollectedTimestampMs)\n * @method void setNextDefenderBonusCollectTimestampMs(int $nextDefenderBonusCollectTimestampMs)\n *\n * @method integer getNextCollectedTimestampMs()\n * @method integer getNextDefenderBonusCollectTimestampMs()\n */\nclass DailyBonus extends Data {\n\n    /**\n     * @var int\n     */\n    protected $nextCollectedTimestampMs;\n\n    /**\n     * @var int\n     */\n    protected $nextDefenderBonusCollectTimestampMs;\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Profile/ProfileData.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse POGOProtos\\Data\\PlayerData;\n\n/**\n * @method void setCreationTime(string $creationTime)\n * @method void setUsername(string $username)\n * @method void setTeam(integer $team)\n * @method void setTutorialState(TutorialState $tutorialState)\n * @method void setAvatar(Avatar $avatar)\n * @method void setPokemonStorage(array $pokemonStorage)\n * @method void setItemStorage(array $itemStorage)\n * @method void setDailyBonus(DailyBonus $dailyBonus)\n * @method void setBadge(Badge $badge)\n * @method void setContactSettings(ContactSettings $state)\n * @method void setCurrencies(Currencies $currencies)\n\n * @method string getCreationTime()\n * @method string getUsername()\n * @method integer getTeam()\n * @method TutorialState getTutorialState()\n * @method Avatar getAvatar()\n * @method array getPokemonStorage()\n * @method array getItemStorage()\n * @method DailyBonus getDailyBonus()\n * @method ContactSettings getBadge()\n * @method ContactSettings getContactSettings()\n * @method Currencies getCurrencies()\n */\nclass ProfileData extends Data {\n\n    /**\n     * @var string The creation time\n     */\n    protected $creationTime;\n\n    /**\n     * @var string The username\n     */\n    protected $username;\n\n    /**\n     * @var integer\n     */\n    protected $team;\n\n    /**\n     * @var TutorialState\n     */\n    protected $tutorialState;\n\n    /**\n     * @var Avatar\n     */\n    protected $avatar;\n\n    /**\n     * @var int\n     */\n    protected $pokemonStorage;\n\n    /**\n     * @var int\n     */\n    protected $itemStorage;\n\n    /**\n     * @var DailyBonus\n     */\n    protected $dailyBonus;\n\n    /**\n     * @var Badge\n     */\n    protected $badge;\n\n    /**\n     * @var ContactSettings\n     */\n    protected $contactSettings;\n\n    /**\n     * @var Currencies\n     */\n    protected $currencies;\n\n    /**\n     * Creates a data instance from a Protobuf Message.\n     *\n     * @param PlayerData $data\n     * @return static\n     */\n    public static function create($data)\n    {\n        // Creates a instance of ProfileData\n        $instance = new static();\n\n        // Set the username\n        $instance->username = $data->getUsername();\n\n        // Set the team\n        $instance->team = $data->getTeam();\n\n        // Set the creation time\n        $instance->creationTime = $data->getCreationTimestampMs();\n\n        // Crates the tutorial state\n        $instance->tutorialState = TutorialState::create($data->getTutorialState());\n\n        // Creates the player avatar\n        $instance->avatar = Avatar::create($data->getAvatar());\n\n        // Set the pokemon storage\n        $instance->pokemonStorage = $data->getMaxPokemonStorage();\n\n        // Set the item storage\n        $instance->itemStorage = $data->getMaxItemStorage();\n\n        // Set the daily bonus\n        $instance->dailyBonus = DailyBonus::create($data->getDailyBonus());\n\n        // Set the equipped badge\n        $instance->badge = Badge::create($data->getEquippedBadge());\n\n        // Set the contact settings\n        $instance->contactSettings = ContactSettings::create($data->getContactSettings());\n\n        // Sets the player currencies\n        $instance->currencies = Currencies::create($data->getCurrencies());\n\n        return $instance;\n    }\n\n\n}"
  },
  {
    "path": "src/Api/Player/Data/Profile/TutorialState.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\n\n/**\n * @method integer setState(array $state)\n *\n * @method integer getState()\n */\nclass TutorialState extends Data {\n\n    /**\n     * @var array\n     */\n    protected $state;\n\n    /**\n     * Creates a TutorialState instance.\n     *\n     * @param array $tutorialState\n     * @return static\n     */\n    public static function create($tutorialState)\n    {\n        $instance = new static();\n        $instance->setState($tutorialState);\n\n        return $instance;\n    }\n\n\n}"
  },
  {
    "path": "src/Api/Player/Inventory.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\AppliedItems;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\CandyBank;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\EggIncubators;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\EggPokemon;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\Item;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\Items;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\PokeBank;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\Pokedex;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\Stats;\nuse NicklasW\\PkmGoApi\\Api\\Procedure;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\GenericEnum;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse NicklasW\\PkmGoApi\\Services\\Request\\InventoryRequestService;\nuse POGOProtos\\Networking\\Responses\\RecycleInventoryItemResponse;\nuse POGOProtos\\Networking\\Responses\\RecycleInventoryItemResponse_Result;\nuse POGOProtos\\Networking\\Responses\\UseIncenseResponse;\nuse POGOProtos\\Networking\\Responses\\UseIncenseResponse_Result;\nuse POGOProtos\\Networking\\Responses\\UseItemXpBoostResponse;\nuse POGOProtos\\Networking\\Responses\\UseItemXpBoostResponse_Result;\n\n/**\n * @method void setPokeBank(PokeBank $pokeBank)\n * @method void setItems(Item[] $items)\n * @method void setCandyBank(CandyBank $candyBank)\n * @method void setPokedex(Pokedex $pokedex)\n * @method void setAppliedItems(AppliedItems $appliedItems)\n * @method void setStats(Stats $stats)\n * @method void setEggPokemon(EggPokemon[] $eggPokemon)\n * @method PokeBank getPokeBank()\n * @method Item[] getItems()\n * @method CandyBank getCandyBank()\n * @method Pokedex getPokedex()\n * @method EggIncubators getEggIncubators()\n * @method AppliedItems getAppliedItems()\n * @method Stats getStats()\n * @method EggPokemon[] getEggPokemon()\n */\nclass Inventory extends Procedure\n{\n\n    /**\n     * @var Items\n     */\n    protected $data;\n\n    /**\n     * Returns the items.\n     *\n     * @returns Items\n     */\n    public function getData()\n    {\n        return parent::getData();\n    }\n\n    /**\n     * Updates the player profile with the latest data.\n     */\n    public function update()\n    {\n        Log::debug(sprintf('[#%s] Retrieving inventory', __CLASS__));\n\n        // Retrieves the player inventory metadata\n        $playerInventory = $this->getRequestService()->getInventory();\n\n        // Retrieve the inventory items\n        $inventoryItems = $playerInventory->getInventoryDelta();\n\n        // Set the items\n        $this->data = Items::create($inventoryItems);\n\n        Log::debug(sprintf('[#%s] Retrieved inventory.', __CLASS__));\n    }\n\n    /**\n     * Recycle inventory item\n     *\n     * @param int $itemId\n     * @param int $count\n     * @throws Exception\n     * @return RecycleInventoryItemResponse\n     */\n    public function recycle($itemId, $count)\n    {\n        // Retrieve the item from the inventory\n        $item = $this->data->getItemById($itemId);\n\n        // Retrieve the item from the inventory, validate the capacity\n        if ($item == null || $item->getCount() < $count) {\n            return RecycleInventoryItemResponse_Result::ERROR_NOT_ENOUGH_COPIES;\n        }\n\n        // Execute the API request\n        $response = $this->getRequestService()->recycle($itemId, $count);\n\n        // Check if the request was successfully executed\n        if ($response->getResult() !== RecycleInventoryItemResponse_Result::SUCCESS) {\n            throw new Exception(sprintf('Invalid response during item recycle. Result: \\'%s\\' Code: \\'%s\\'',\n                $response->getResult(),\n                GenericEnum::name(RecycleInventoryItemResponse_Result::class, $response->getResult())));\n        }\n\n        // Update inventory to reflect on the changes\n        $item->setCount($item->getCount() - $count);\n\n        return $response;\n    }\n\n    /**\n     * Use incense item\n     *\n     * @param int $itemId\n     * @throws Exception\n     * @return UseIncenseResponse\n     */\n    public function useIncense($itemId)\n    {\n        // Execute the API request\n        $response = $this->getRequestService()->useIncense($itemId);\n\n        // Check if the request was successfully executed\n        if ($response->getResult() !== UseIncenseResponse_Result::SUCCESS) {\n            throw new Exception(sprintf('Invalid response during item usage. Result: \\'%s\\' Code: \\'%s\\'',\n                $response->getResult(), GenericEnum::name(UseIncenseResponse_Result::class, $response->getResult())));\n        }\n\n        // Update inventory\n        $this->update();\n\n        return $response;\n    }\n\n    /**\n     * Use XP Boost item\n     *\n     * @param int $itemId\n     * @throws Exception\n     * @return UseItemXpBoostResponse\n     */\n    public function useItemXpBoost($itemId)\n    {\n        // Execute the API request\n        $response = $this->getRequestService()->useItemXpBoost($itemId);\n\n        // Check if the request was successfully executed\n        if ($response->getResult() !== UseItemXpBoostResponse_Result::SUCCESS) {\n            throw new Exception(sprintf('Invalid response during item usage. Result: \\'%s\\' Code: \\'%s\\'',\n                $response->getResult(),\n                GenericEnum::name(UseItemXpBoostResponse_Result::class, $response->getResult())));\n        }\n\n        // Update inventory\n        $this->update();\n\n        return $response;\n    }\n\n    /**\n     * Returns the request service.\n     *\n     * @return InventoryRequestService\n     */\n    protected function getRequestService()\n    {\n        return new InventoryRequestService();\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/Journal.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player;\n\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Journal\\Log;\nuse NicklasW\\PkmGoApi\\Api\\Procedure;\nuse NicklasW\\PkmGoApi\\Services\\Request\\JournalRequestService;\n\nclass Journal extends Procedure {\n\n    /**\n     * Returns the forts log entries.\n     *\n     * @return Data\\Journal\\Fort[]\n     */\n    public function getForts()\n    {\n        return $this->getData()->getForts();\n    }\n\n    /**\n     * Returns the pokemon log entries.\n     *\n     * @return Data\\Journal\\Pokemon[]\n     */\n    public function getPokemons()\n    {\n        return $this->getData()->getPokemons();\n    }\n\n    /**\n     * Returns the log entries.\n     *\n     * @return Log\n     */\n    public function getEntries()\n    {\n        return $this->getData();\n    }\n\n    /**\n     *\n     */\n    public function update()\n    {\n        // Retrieves the player metadata\n        $data = $this->getRequestService()->getJournal();\n\n        // Set the log entries\n        $this->data = Log::create($data->getLogEntries());\n    }\n\n    /**\n     * Returns the request service.\n     *\n     * @return JournalRequestService\n     */\n    protected function getRequestService()\n    {\n        return new JournalRequestService();\n    }\n\n}"
  },
  {
    "path": "src/Api/Player/Profile.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Player;\n\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile\\Avatar;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile\\Badge;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile\\ContactSettings;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile\\Currencies;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile\\DailyBonus;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile\\ProfileData;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile\\TutorialState;\nuse NicklasW\\PkmGoApi\\Api\\Procedure;\nuse NicklasW\\PkmGoApi\\Services\\Request\\PlayerRequestService;\n\n/**\n * @method void setCreationTime(string $creationTime)\n * @method void setUsername(string $username)\n * @method void setTeam(integer $team)\n * @method void setTutorialState(TutorialState $tutorialState)\n * @method void setAvatar(Avatar $avatar)\n * @method void setPokemonStorage(array $pokemonStorage)\n * @method void setItemStorage(array $itemStorage)\n * @method void setDailyBonus(DailyBonus $dailyBonus)\n * @method void setBadge(Badge $badge)\n * @method void setContactSettings(ContactSettings $state)\n * @method void setCurrencies(Currencies $currencies)\n\n * @method string getCreationTime()\n * @method string getUsername()\n * @method integer getTeam()\n * @method TutorialState getTutorialState()\n * @method Avatar getAvatar()\n * @method array getPokemonStorage()\n * @method array getItemStorage()\n * @method DailyBonus getDailyBonus()\n * @method Badge getBadge()\n * @method ContactSettings getContactSettings()\n * @method Currencies getCurrencies()\n */\nclass Profile extends Procedure {\n\n    /**\n     * Returns the profile data.\n     *\n     * @returns ProfileData\n     */\n    public function getData()\n    {\n        return parent::getData();\n    }\n\n    /**\n     * Updates the player profile with the latest data.\n     */\n    public function update()\n    {\n        // Retrieves the player metadata\n        $data = $this->getRequestService()->getPlayer();\n\n        // Set the profile data\n        $this->data = ProfileData::create($data->getPlayerData());\n    }\n\n    /**\n     * Returns the request service.\n     *\n     * @return PlayerRequestService\n     */\n    protected function getRequestService()\n    {\n        return new PlayerRequestService();\n    }\n\n}"
  },
  {
    "path": "src/Api/Pokemon/Collection/PokemonCollection.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Pokemon\\Collection;\n\nuse Illuminate\\Support\\Collection;\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Pokemon;\n\nclass PokemonCollection extends Collection {\n\n    /**\n     * Returns a sorted collection by name.\n     *\n     * @param bool $descending\n     * @return static\n     */\n    public function sortByName($descending = false)\n    {\n        return $this->sortBy(function (Pokemon $pokemon1) {\n            return $pokemon1->getName();\n        }, SORT_REGULAR, $descending);\n    }\n\n    /**\n     * Returns a sorted collection by level.\n     *\n     * @param bool $descending\n     * @return static\n     */\n    public function sortByLevel($descending = false)\n    {\n        return $this->sortBy(function (Pokemon $pokemon1) {\n            return $pokemon1->getLevel();\n        }, SORT_REGULAR, $descending);\n\n    }\n\n    /**\n     * Returns a sorted collection by combat points.\n     *\n     * @param bool $descending\n     * @return static\n     */\n    public function sortByCp($descending = false)\n    {\n        return $this->sortBy(function (Pokemon $pokemon1) {\n            return $pokemon1->getCp();\n        }, SORT_REGULAR, $descending);\n\n    }\n\n    /**\n     * Returns a sorted collection by Pokedex index.\n     *\n     * @param bool $descending\n     * @return static\n     */\n    public function sortByPokedexIndex($descending = false)\n    {\n        return $this->sortBy(function (Pokemon $pokemon1) {\n            return $pokemon1->getPokemonId();\n        }, SORT_REGULAR, $descending);\n\n    }\n\n    /**\n     * Returns a sorted collection by IV ratio.\n     *\n     * @param bool $descending\n     * @return static\n     */\n    public function sortByIVRatio($descending = false)\n    {\n        return $this->sortBy(function (Pokemon $pokemon1) {\n            return $pokemon1->getIVRatio();\n        }, SORT_REGULAR, $descending);\n    }\n\n    /**\n     * Returns a sorted collection by date captured.\n     *\n     * @param bool $descending\n     * @return static\n     */\n    public function sortByDate($descending = false)\n    {\n        return $this->sortBy(function (Pokemon $pokemon1) {\n            return $pokemon1->getCreationTimeMs();\n        }, SORT_REGULAR, $descending);\n    }\n\n}"
  },
  {
    "path": "src/Api/Pokemon/Data/MovementType.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Pokemon\\Data;\n\nclass MovementType {\n\n    /**\n     *\n     */\n    const PSYCHIC = 0;\n\n    /**\n     *\n     */\n    const FLYING = 1;\n\n    /**\n     *\n     */\n    \n    const ELECTRIC = 2;\n\n    /**\n     *\n     */\n    const NORMAL = 3;\n\n    /**\n     *\n     */\n    const HOVERING = 4;\n\n    /**\n     *\n     */\n    const JUMP = 5;\n\n}"
  },
  {
    "path": "src/Api/Pokemon/Data/PokemonClass.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Pokemon\\Data;\n\nclass PokemonClass {\n\n    /**\n     *\n     */\n    const NONE = 0;\n\n    /**\n     *\n     */\n    const VERY_COMMON = 1;\n\n    /**\n     *\n     */\n    const COMMON = 2;\n\n    /**\n     *\n     */\n    const UNCOMMON = 3;\n\n    /**\n     *\n     */\n    const RARE = 4;\n\n    /**\n     *\n     */\n    const VERY_RARE = 5;\n\n    /**\n     *\n     */\n    const EPIC = 6;\n\n    /**\n     *\n     */\n    const LEGENDARY = 7;\n\n    /**\n     *\n     */\n    const MYTHIC = 8;\n\n\n}"
  },
  {
    "path": "src/Api/Pokemon/Data/PokemonMeta.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Pokemon\\Data;\n\nclass PokemonMeta {\n\n    protected $heightStdDev;\n\n    protected $baseStamina;\n\n    protected $cylRadiusM;\n\n    protected $baseFleeRate;\n\n    protected $baseAttack;\n\n    protected $diskRadiusM;\n\n    protected $collisionRadiusM;\n\n    protected $pokedexWeightKg;\n\n    protected $movementType;\n\n    protected $type1;\n\n    protected $collisionHeadRadiusM;\n\n    protected $movementTimerS;\n\n    protected $jumpTimeS;\n\n    protected $modelScale;\n\n    protected $uniqueId;\n\n    protected $baseDefense;\n\n    protected $attackTimerS;\n\n    protected $weightStdDev;\n\n    protected $cylHeightM;\n\n    protected $candyToEvolve;\n\n    protected $collisionHeightM;\n\n    protected $shoulderModeScale;\n\n    protected $baseCaptureRate;\n\n    protected $parentId;\n\n    protected $cylGroundM;\n\n    protected $quickMoves;\n\n    protected $templateId;\n\n    protected $family;\n\n    protected $pokemonClass;\n\n    protected $type2;\n\n    protected $pokedexHeightM;\n\n    protected $cinematicMoves;\n\n    protected $number;\n\n    /**\n     * @return mixed\n     */\n    public function getTemplateId()\n    {\n        return $this->templateId;\n    }\n\n    /**\n     * @param mixed $templateId\n     */\n    public function setTemplateId($templateId)\n    {\n        $this->templateId = $templateId;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getFamily()\n    {\n        return $this->family;\n    }\n\n    /**\n     * @param mixed $family\n     */\n    public function setFamily($family)\n    {\n        $this->family = $family;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getPokemonClass()\n    {\n        return $this->pokemonClass;\n    }\n\n    /**\n     * @param mixed $pokemonClass\n     */\n    public function setPokemonClass($pokemonClass)\n    {\n        $this->pokemonClass = $pokemonClass;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getType2()\n    {\n        return $this->type2;\n    }\n\n    /**\n     * @param mixed $type2\n     */\n    public function setType2($type2)\n    {\n        $this->type2 = $type2;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getPokedexHeightM()\n    {\n        return $this->pokedexHeightM;\n    }\n\n    /**\n     * @param mixed $pokedexHeightM\n     */\n    public function setPokedexHeightM($pokedexHeightM)\n    {\n        $this->pokedexHeightM = $pokedexHeightM;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getHeightStdDev()\n    {\n        return $this->heightStdDev;\n    }\n\n    /**\n     * @param mixed $heightStdDev\n     */\n    public function setHeightStdDev($heightStdDev)\n    {\n        $this->heightStdDev = $heightStdDev;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getBaseStamina()\n    {\n        return $this->baseStamina;\n    }\n\n    /**\n     * @param mixed $baseStamina\n     */\n    public function setBaseStamina($baseStamina)\n    {\n        $this->baseStamina = $baseStamina;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getCylRadiusM()\n    {\n        return $this->cylRadiusM;\n    }\n\n    /**\n     * @param mixed $cylRadiusM\n     */\n    public function setCylRadiusM($cylRadiusM)\n    {\n        $this->cylRadiusM = $cylRadiusM;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getBaseFleeRate()\n    {\n        return $this->baseFleeRate;\n    }\n\n    /**\n     * @param mixed $baseFleeRate\n     */\n    public function setBaseFleeRate($baseFleeRate)\n    {\n        $this->baseFleeRate = $baseFleeRate;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getBaseAttack()\n    {\n        return $this->baseAttack;\n    }\n\n    /**\n     * @param mixed $baseAttack\n     */\n    public function setBaseAttack($baseAttack)\n    {\n        $this->baseAttack = $baseAttack;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getDiskRadiusM()\n    {\n        return $this->diskRadiusM;\n    }\n\n    /**\n     * @param mixed $diskRadiusM\n     */\n    public function setDiskRadiusM($diskRadiusM)\n    {\n        $this->diskRadiusM = $diskRadiusM;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getCollisionRadiusM()\n    {\n        return $this->collisionRadiusM;\n    }\n\n    /**\n     * @param mixed $collisionRadiusM\n     */\n    public function setCollisionRadiusM($collisionRadiusM)\n    {\n        $this->collisionRadiusM = $collisionRadiusM;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getPokedexWeightKg()\n    {\n        return $this->pokedexWeightKg;\n    }\n\n    /**\n     * @param mixed $pokedexWeightKg\n     */\n    public function setPokedexWeightKg($pokedexWeightKg)\n    {\n        $this->pokedexWeightKg = $pokedexWeightKg;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getMovementType()\n    {\n        return $this->movementType;\n    }\n\n    /**\n     * @param mixed $movementType\n     */\n    public function setMovementType($movementType)\n    {\n        $this->movementType = $movementType;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getType1()\n    {\n        return $this->type1;\n    }\n\n    /**\n     * @param mixed $type1\n     */\n    public function setType1($type1)\n    {\n        $this->type1 = $type1;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getCollisionHeadRadiusM()\n    {\n        return $this->collisionHeadRadiusM;\n    }\n\n    /**\n     * @param mixed $collisionHeadRadiusM\n     */\n    public function setCollisionHeadRadiusM($collisionHeadRadiusM)\n    {\n        $this->collisionHeadRadiusM = $collisionHeadRadiusM;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getMovementTimerS()\n    {\n        return $this->movementTimerS;\n    }\n\n    /**\n     * @param mixed $movementTimerS\n     */\n    public function setMovementTimerS($movementTimerS)\n    {\n        $this->movementTimerS = $movementTimerS;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getJumpTimeS()\n    {\n        return $this->jumpTimeS;\n    }\n\n    /**\n     * @param mixed $jumpTimeS\n     */\n    public function setJumpTimeS($jumpTimeS)\n    {\n        $this->jumpTimeS = $jumpTimeS;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getModelScale()\n    {\n        return $this->modelScale;\n    }\n\n    /**\n     * @param mixed $modelScale\n     */\n    public function setModelScale($modelScale)\n    {\n        $this->modelScale = $modelScale;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getUniqueId()\n    {\n        return $this->uniqueId;\n    }\n\n    /**\n     * @param mixed $uniqueId\n     */\n    public function setUniqueId($uniqueId)\n    {\n        $this->uniqueId = $uniqueId;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getBaseDefense()\n    {\n        return $this->baseDefense;\n    }\n\n    /**\n     * @param mixed $baseDefense\n     */\n    public function setBaseDefense($baseDefense)\n    {\n        $this->baseDefense = $baseDefense;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getAttackTimerS()\n    {\n        return $this->attackTimerS;\n    }\n\n    /**\n     * @param mixed $attackTimerS\n     */\n    public function setAttackTimerS($attackTimerS)\n    {\n        $this->attackTimerS = $attackTimerS;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getWeightStdDev()\n    {\n        return $this->weightStdDev;\n    }\n\n    /**\n     * @param mixed $weightStdDev\n     */\n    public function setWeightStdDev($weightStdDev)\n    {\n        $this->weightStdDev = $weightStdDev;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getCylHeightM()\n    {\n        return $this->cylHeightM;\n    }\n\n    /**\n     * @param mixed $cylHeightM\n     */\n    public function setCylHeightM($cylHeightM)\n    {\n        $this->cylHeightM = $cylHeightM;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getCandyToEvolve()\n    {\n        return $this->candyToEvolve;\n    }\n\n    /**\n     * @param mixed $candyToEvolve\n     */\n    public function setCandyToEvolve($candyToEvolve)\n    {\n        $this->candyToEvolve = $candyToEvolve;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getCollisionHeightM()\n    {\n        return $this->collisionHeightM;\n    }\n\n    /**\n     * @param mixed $collisionHeightM\n     */\n    public function setCollisionHeightM($collisionHeightM)\n    {\n        $this->collisionHeightM = $collisionHeightM;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getShoulderModeScale()\n    {\n        return $this->shoulderModeScale;\n    }\n\n    /**\n     * @param mixed $shoulderModeScale\n     */\n    public function setShoulderModeScale($shoulderModeScale)\n    {\n        $this->shoulderModeScale = $shoulderModeScale;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getBaseCaptureRate()\n    {\n        return $this->baseCaptureRate;\n    }\n\n    /**\n     * @param mixed $baseCaptureRate\n     */\n    public function setBaseCaptureRate($baseCaptureRate)\n    {\n        $this->baseCaptureRate = $baseCaptureRate;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getParentId()\n    {\n        return $this->parentId;\n    }\n\n    /**\n     * @param mixed $parentId\n     */\n    public function setParentId($parentId)\n    {\n        $this->parentId = $parentId;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getCylGroundM()\n    {\n        return $this->cylGroundM;\n    }\n\n    /**\n     * @param mixed $cylGroundM\n     */\n    public function setCylGroundM($cylGroundM)\n    {\n        $this->cylGroundM = $cylGroundM;\n    }\n\n    /**\n     * @return PokemonMove\n     */\n    public function getQuickMoves()\n    {\n        return $this->quickMoves;\n    }\n\n    /**\n     * @param PokemonMove $quickMoves\n     */\n    public function setQuickMoves(PokemonMove $quickMoves)\n    {\n        $this->quickMoves = $quickMoves;\n    }\n\n    /**\n     * @return PokemonMove\n     */\n    public function getCinematicMoves()\n    {\n        return $this->cinematicMoves;\n    }\n\n    /**\n     * @param PokemonMove $cinematicMoves\n     */\n    public function setCinematicMoves(PokemonMove $cinematicMoves)\n    {\n        $this->cinematicMoves = $cinematicMoves;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getNumber()\n    {\n        return $this->number;\n    }\n\n    /**\n     * @param mixed $number\n     */\n    public function setNumber($number)\n    {\n        $this->number = $number;\n    }\n\n\n}"
  },
  {
    "path": "src/Api/Pokemon/Data/PokemonMetaRegistry.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Pokemon\\Data;\n\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Data\\PokemonMove as PokemonMoveData;\nuse POGOProtos\\Enums\\PokemonFamilyId;\nuse POGOProtos\\Enums\\PokemonId;\nuse POGOProtos\\Enums\\PokemonMove;\nuse POGOProtos\\Enums\\PokemonType;\n\nclass PokemonMetaRegistry {\n\n    /**\n     * @var PokemonMeta[] The list of pokemon meta data\n     */\n    public static $POKEMON_META = array();\n\n    /**\n     * Returns the pokemon meta data by pokemon id.\n     *\n     * @param integer $pokemonId\n     * @return PokemonMeta\n     */\n    public static function getByPokemonId($pokemonId)\n    {\n        return self::$POKEMON_META[$pokemonId];\n    }\n\n    /**\n     * Initialize the pokemon meta registry.\n     */\n    public static function initialize()\n    {\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0001_POKEMON_BULBASAUR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_BULBASAUR);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(0.7);\n        $pokemonMeta->setHeightStdDev(0.0875);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.3815);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(118);\n        $pokemonMeta->setDiskRadiusM(0.5723);\n        $pokemonMeta->setCollisionRadiusM(0.3815);\n        $pokemonMeta->setPokedexWeightKg(6.9);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2725);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1.15);\n        $pokemonMeta->setModelScale(1.09);\n        $pokemonMeta->setUniqueId(\"V0001_POKEMON_BULBASAUR\");\n        $pokemonMeta->setBaseDefense(118);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.8625);\n        $pokemonMeta->setCylHeightM(0.763);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.654);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::VINE_WHIP_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::SEED_BOMB,\n            PokemonMove::POWER_WHIP,\n        )));\n        $pokemonMeta->setNumber(1);\n        self::$POKEMON_META[PokemonId::BULBASAUR] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0002_POKEMON_IVYSAUR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_BULBASAUR);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.51);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(151);\n        $pokemonMeta->setDiskRadiusM(0.765);\n        $pokemonMeta->setCollisionRadiusM(0.31875);\n        $pokemonMeta->setPokedexWeightKg(13);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.255);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1.5);\n        $pokemonMeta->setModelScale(0.85);\n        $pokemonMeta->setUniqueId(\"V0002_POKEMON_IVYSAUR\");\n        $pokemonMeta->setBaseDefense(151);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(1.625);\n        $pokemonMeta->setCylHeightM(1.0625);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.6375);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.08);\n        $pokemonMeta->setParentId(PokemonId::BULBASAUR);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::VINE_WHIP_FAST,\n            PokemonMove::RAZOR_LEAF_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::POWER_WHIP,\n            PokemonMove::SOLAR_BEAM,\n        )));\n        $pokemonMeta->setNumber(2);\n        self::$POKEMON_META[PokemonId::IVYSAUR] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0003_POKEMON_VENUSAUR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_BULBASAUR);\n        $pokemonMeta->setPokemonClass(PokemonClass::EPIC);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(2);\n        $pokemonMeta->setHeightStdDev(0.25);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.759);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(198);\n        $pokemonMeta->setDiskRadiusM(1.1385);\n        $pokemonMeta->setCollisionRadiusM(0.759);\n        $pokemonMeta->setPokedexWeightKg(100);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3795);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.69);\n        $pokemonMeta->setUniqueId(\"V0003_POKEMON_VENUSAUR\");\n        $pokemonMeta->setBaseDefense(198);\n        $pokemonMeta->setAttackTimerS(4);\n        $pokemonMeta->setWeightStdDev(12.5);\n        $pokemonMeta->setCylHeightM(1.2075);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.035);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.04);\n        $pokemonMeta->setParentId(PokemonId::IVYSAUR);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::VINE_WHIP_FAST,\n            PokemonMove::RAZOR_LEAF_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::PETAL_BLIZZARD,\n            PokemonMove::SOLAR_BEAM,\n        )));\n        $pokemonMeta->setNumber(3);\n        self::$POKEMON_META[PokemonId::VENUSAUR] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0004_POKEMON_CHARMANDER\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CHARMANDER);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.6);\n        $pokemonMeta->setHeightStdDev(0.075);\n        $pokemonMeta->setBaseStamina(78);\n        $pokemonMeta->setCylRadiusM(0.3125);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(116);\n        $pokemonMeta->setDiskRadiusM(0.4688);\n        $pokemonMeta->setCollisionRadiusM(0.15625);\n        $pokemonMeta->setPokedexWeightKg(8.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.15625);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1.25);\n        $pokemonMeta->setUniqueId(\"V0004_POKEMON_CHARMANDER\");\n        $pokemonMeta->setBaseDefense(96);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(1.0625);\n        $pokemonMeta->setCylHeightM(0.75);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.46875);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SCRATCH_FAST,\n            PokemonMove::EMBER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::FLAME_CHARGE,\n            PokemonMove::FLAME_BURST,\n            PokemonMove::FLAMETHROWER,\n        )));\n        $pokemonMeta->setNumber(4);\n        self::$POKEMON_META[PokemonId::CHARMANDER] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0005_POKEMON_CHARMELEON\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CHARMANDER);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.1);\n        $pokemonMeta->setHeightStdDev(0.1375);\n        $pokemonMeta->setBaseStamina(116);\n        $pokemonMeta->setCylRadiusM(0.4635);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(158);\n        $pokemonMeta->setDiskRadiusM(0.6953);\n        $pokemonMeta->setCollisionRadiusM(0.2575);\n        $pokemonMeta->setPokedexWeightKg(19);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.23175);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.03);\n        $pokemonMeta->setUniqueId(\"V0005_POKEMON_CHARMELEON\");\n        $pokemonMeta->setBaseDefense(129);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(2.375);\n        $pokemonMeta->setCylHeightM(1.133);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.7725);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.08);\n        $pokemonMeta->setParentId(PokemonId::CHARMANDER);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SCRATCH_FAST,\n            PokemonMove::EMBER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::FIRE_PUNCH,\n            PokemonMove::FLAME_BURST,\n            PokemonMove::FLAMETHROWER,\n        )));\n        $pokemonMeta->setNumber(5);\n        self::$POKEMON_META[PokemonId::CHARMELEON] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0006_POKEMON_CHARIZARD\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CHARMANDER);\n        $pokemonMeta->setPokemonClass(PokemonClass::EPIC);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.7);\n        $pokemonMeta->setHeightStdDev(0.2125);\n        $pokemonMeta->setBaseStamina(156);\n        $pokemonMeta->setCylRadiusM(0.81);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(223);\n        $pokemonMeta->setDiskRadiusM(1.215);\n        $pokemonMeta->setCollisionRadiusM(0.405);\n        $pokemonMeta->setPokedexWeightKg(90.5);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2025);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.81);\n        $pokemonMeta->setUniqueId(\"V0006_POKEMON_CHARIZARD\");\n        $pokemonMeta->setBaseDefense(176);\n        $pokemonMeta->setAttackTimerS(4);\n        $pokemonMeta->setWeightStdDev(11.3125);\n        $pokemonMeta->setCylHeightM(1.377);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.0125);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.04);\n        $pokemonMeta->setParentId(PokemonId::CHARMELEON);\n        $pokemonMeta->setCylGroundM(0.405);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WING_ATTACK_FAST,\n            PokemonMove::EMBER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DRAGON_CLAW,\n            PokemonMove::FLAMETHROWER,\n            PokemonMove::FIRE_BLAST,\n        )));\n        $pokemonMeta->setNumber(6);\n        self::$POKEMON_META[PokemonId::CHARIZARD] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0007_POKEMON_SQUIRTLE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SQUIRTLE);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.5);\n        $pokemonMeta->setHeightStdDev(0.0625);\n        $pokemonMeta->setBaseStamina(88);\n        $pokemonMeta->setCylRadiusM(0.3825);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(94);\n        $pokemonMeta->setDiskRadiusM(0.5738);\n        $pokemonMeta->setCollisionRadiusM(0.2295);\n        $pokemonMeta->setPokedexWeightKg(9);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.19125);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.53);\n        $pokemonMeta->setUniqueId(\"V0007_POKEMON_SQUIRTLE\");\n        $pokemonMeta->setBaseDefense(122);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(1.125);\n        $pokemonMeta->setCylHeightM(0.64259988);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.3825);\n        $pokemonMeta->setShoulderModeScale(0.1);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n            PokemonMove::BUBBLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::AQUA_TAIL,\n            PokemonMove::WATER_PULSE,\n            PokemonMove::AQUA_JET,\n        )));\n        $pokemonMeta->setNumber(7);\n        self::$POKEMON_META[PokemonId::SQUIRTLE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0008_POKEMON_WARTORTLE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SQUIRTLE);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(118);\n        $pokemonMeta->setCylRadiusM(0.375);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(126);\n        $pokemonMeta->setDiskRadiusM(0.5625);\n        $pokemonMeta->setCollisionRadiusM(0.25);\n        $pokemonMeta->setPokedexWeightKg(22.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1875);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0008_POKEMON_WARTORTLE\");\n        $pokemonMeta->setBaseDefense(155);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(2.8125);\n        $pokemonMeta->setCylHeightM(1);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.625);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.08);\n        $pokemonMeta->setParentId(PokemonId::SQUIRTLE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::WATER_GUN_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ICE_BEAM,\n            PokemonMove::HYDRO_PUMP,\n            PokemonMove::AQUA_JET,\n        )));\n        $pokemonMeta->setNumber(8);\n        self::$POKEMON_META[PokemonId::WARTORTLE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0009_POKEMON_BLASTOISE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SQUIRTLE);\n        $pokemonMeta->setPokemonClass(PokemonClass::EPIC);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.6);\n        $pokemonMeta->setHeightStdDev(0.2);\n        $pokemonMeta->setBaseStamina(158);\n        $pokemonMeta->setCylRadiusM(0.564);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(171);\n        $pokemonMeta->setDiskRadiusM(0.846);\n        $pokemonMeta->setCollisionRadiusM(0.564);\n        $pokemonMeta->setPokedexWeightKg(85.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.282);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.94);\n        $pokemonMeta->setUniqueId(\"V0009_POKEMON_BLASTOISE\");\n        $pokemonMeta->setBaseDefense(210);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(10.6875);\n        $pokemonMeta->setCylHeightM(1.2925);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.175);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.04);\n        $pokemonMeta->setParentId(PokemonId::WARTORTLE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::WATER_GUN_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ICE_BEAM,\n            PokemonMove::FLASH_CANNON,\n            PokemonMove::HYDRO_PUMP,\n        )));\n        $pokemonMeta->setNumber(9);\n        self::$POKEMON_META[PokemonId::BLASTOISE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0010_POKEMON_CATERPIE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CATERPIE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.306);\n        $pokemonMeta->setBaseFleeRate(0.2);\n        $pokemonMeta->setBaseAttack(55);\n        $pokemonMeta->setDiskRadiusM(0.459);\n        $pokemonMeta->setCollisionRadiusM(0.102);\n        $pokemonMeta->setPokedexWeightKg(2.9);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.153);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(0);\n        $pokemonMeta->setModelScale(2.04);\n        $pokemonMeta->setUniqueId(\"V0010_POKEMON_CATERPIE\");\n        $pokemonMeta->setBaseDefense(62);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.3625);\n        $pokemonMeta->setCylHeightM(0.408);\n        $pokemonMeta->setCandyToEvolve(12);\n        $pokemonMeta->setCollisionHeightM(0.306);\n        $pokemonMeta->setShoulderModeScale(0);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BUG_BITE_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(10);\n        self::$POKEMON_META[PokemonId::CATERPIE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0011_POKEMON_METAPOD\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CATERPIE);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.7);\n        $pokemonMeta->setHeightStdDev(0.0875);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.351);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(45);\n        $pokemonMeta->setDiskRadiusM(0.5265);\n        $pokemonMeta->setCollisionRadiusM(0.117);\n        $pokemonMeta->setPokedexWeightKg(9.9);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1755);\n        $pokemonMeta->setMovementTimerS(3600);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.17);\n        $pokemonMeta->setUniqueId(\"V0011_POKEMON_METAPOD\");\n        $pokemonMeta->setBaseDefense(64);\n        $pokemonMeta->setAttackTimerS(3600);\n        $pokemonMeta->setWeightStdDev(1.2375);\n        $pokemonMeta->setCylHeightM(0.6435);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.6435);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.2);\n        $pokemonMeta->setParentId(PokemonId::CATERPIE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BUG_BITE_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(11);\n        self::$POKEMON_META[PokemonId::METAPOD] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0012_POKEMON_BUTTERFREE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CATERPIE);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.1);\n        $pokemonMeta->setHeightStdDev(0.1375);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.666);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(167);\n        $pokemonMeta->setDiskRadiusM(0.999);\n        $pokemonMeta->setCollisionRadiusM(0.1665);\n        $pokemonMeta->setPokedexWeightKg(32);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1776);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.11);\n        $pokemonMeta->setUniqueId(\"V0012_POKEMON_BUTTERFREE\");\n        $pokemonMeta->setBaseDefense(151);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(4);\n        $pokemonMeta->setCylHeightM(1.11);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.555);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.1);\n        $pokemonMeta->setParentId(PokemonId::METAPOD);\n        $pokemonMeta->setCylGroundM(0.555);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::BUG_BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BUG_BUZZ,\n            PokemonMove::PSYCHIC,\n            PokemonMove::SIGNAL_BEAM,\n        )));\n        $pokemonMeta->setNumber(12);\n        self::$POKEMON_META[PokemonId::BUTTERFREE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0013_POKEMON_WEEDLE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_WEEDLE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.209);\n        $pokemonMeta->setBaseFleeRate(0.2);\n        $pokemonMeta->setBaseAttack(63);\n        $pokemonMeta->setDiskRadiusM(0.3135);\n        $pokemonMeta->setCollisionRadiusM(0.1045);\n        $pokemonMeta->setPokedexWeightKg(3.2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.15675);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(2.09);\n        $pokemonMeta->setUniqueId(\"V0013_POKEMON_WEEDLE\");\n        $pokemonMeta->setBaseDefense(55);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.4);\n        $pokemonMeta->setCylHeightM(0.418);\n        $pokemonMeta->setCandyToEvolve(12);\n        $pokemonMeta->setCollisionHeightM(0.209);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_STING_FAST,\n            PokemonMove::BUG_BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(13);\n        self::$POKEMON_META[PokemonId::WEEDLE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0014_POKEMON_KAKUNA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_WEEDLE);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(0.6);\n        $pokemonMeta->setHeightStdDev(0.075);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.25);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(46);\n        $pokemonMeta->setDiskRadiusM(0.375);\n        $pokemonMeta->setCollisionRadiusM(0.25);\n        $pokemonMeta->setPokedexWeightKg(10);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.125);\n        $pokemonMeta->setMovementTimerS(3600);\n        $pokemonMeta->setJumpTimeS(0);\n        $pokemonMeta->setModelScale(1.25);\n        $pokemonMeta->setUniqueId(\"V0014_POKEMON_KAKUNA\");\n        $pokemonMeta->setBaseDefense(86);\n        $pokemonMeta->setAttackTimerS(3600);\n        $pokemonMeta->setWeightStdDev(1.25);\n        $pokemonMeta->setCylHeightM(0.75);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.75);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.2);\n        $pokemonMeta->setParentId(PokemonId::WEEDLE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_STING_FAST,\n            PokemonMove::BUG_BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(14);\n        self::$POKEMON_META[PokemonId::KAKUNA] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0015_POKEMON_BEEDRILL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_WEEDLE);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.462);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(169);\n        $pokemonMeta->setDiskRadiusM(0.693);\n        $pokemonMeta->setCollisionRadiusM(0.308);\n        $pokemonMeta->setPokedexWeightKg(29.5);\n        $pokemonMeta->setMovementType(MovementType::ELECTRIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.231);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.77);\n        $pokemonMeta->setUniqueId(\"V0015_POKEMON_BEEDRILL\");\n        $pokemonMeta->setBaseDefense(150);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(3.6875);\n        $pokemonMeta->setCylHeightM(0.77);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.5775);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.1);\n        $pokemonMeta->setParentId(PokemonId::KAKUNA);\n        $pokemonMeta->setCylGroundM(0.385);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BUG_BITE_FAST,\n            PokemonMove::POISON_JAB_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::AERIAL_ACE,\n            PokemonMove::X_SCISSOR,\n        )));\n        $pokemonMeta->setNumber(15);\n        self::$POKEMON_META[PokemonId::BEEDRILL] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0016_POKEMON_PIDGEY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PIDGEY);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.252);\n        $pokemonMeta->setBaseFleeRate(0.2);\n        $pokemonMeta->setBaseAttack(85);\n        $pokemonMeta->setDiskRadiusM(0.378);\n        $pokemonMeta->setCollisionRadiusM(0.1344);\n        $pokemonMeta->setPokedexWeightKg(1.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.126);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1.4);\n        $pokemonMeta->setModelScale(1.68);\n        $pokemonMeta->setUniqueId(\"V0016_POKEMON_PIDGEY\");\n        $pokemonMeta->setBaseDefense(76);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.225);\n        $pokemonMeta->setCylHeightM(0.504);\n        $pokemonMeta->setCandyToEvolve(12);\n        $pokemonMeta->setCollisionHeightM(0.252);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n            PokemonMove::QUICK_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::TWISTER,\n            PokemonMove::AERIAL_ACE,\n            PokemonMove::AIR_CUTTER,\n        )));\n        $pokemonMeta->setNumber(16);\n        self::$POKEMON_META[PokemonId::PIDGEY] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0017_POKEMON_PIDGEOTTO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PIDGEY);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.1);\n        $pokemonMeta->setHeightStdDev(0.1375);\n        $pokemonMeta->setBaseStamina(126);\n        $pokemonMeta->setCylRadiusM(0.474);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(117);\n        $pokemonMeta->setDiskRadiusM(0.711);\n        $pokemonMeta->setCollisionRadiusM(0.316);\n        $pokemonMeta->setPokedexWeightKg(30);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.237);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.79);\n        $pokemonMeta->setUniqueId(\"V0017_POKEMON_PIDGEOTTO\");\n        $pokemonMeta->setBaseDefense(108);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(3.75);\n        $pokemonMeta->setCylHeightM(0.9875);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.69125);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.2);\n        $pokemonMeta->setParentId(PokemonId::PIDGEY);\n        $pokemonMeta->setCylGroundM(0.395);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::STEEL_WING_FAST,\n            PokemonMove::WING_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::TWISTER,\n            PokemonMove::AERIAL_ACE,\n            PokemonMove::AIR_CUTTER,\n        )));\n        $pokemonMeta->setNumber(17);\n        self::$POKEMON_META[PokemonId::PIDGEOTTO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0018_POKEMON_PIDGEOT\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PIDGEY);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(166);\n        $pokemonMeta->setCylRadiusM(0.864);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(166);\n        $pokemonMeta->setDiskRadiusM(1.296);\n        $pokemonMeta->setCollisionRadiusM(0.36);\n        $pokemonMeta->setPokedexWeightKg(39.5);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.216);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.72);\n        $pokemonMeta->setUniqueId(\"V0018_POKEMON_PIDGEOT\");\n        $pokemonMeta->setBaseDefense(157);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(4.9375);\n        $pokemonMeta->setCylHeightM(1.44);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.008);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.1);\n        $pokemonMeta->setParentId(PokemonId::PIDGEOTTO);\n        $pokemonMeta->setCylGroundM(0.36);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::STEEL_WING_FAST,\n            PokemonMove::WING_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::HURRICANE,\n            PokemonMove::AERIAL_ACE,\n            PokemonMove::AIR_CUTTER,\n        )));\n        $pokemonMeta->setNumber(18);\n        self::$POKEMON_META[PokemonId::PIDGEOT] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0019_POKEMON_RATTATA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_RATTATA);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(60);\n        $pokemonMeta->setCylRadiusM(0.252);\n        $pokemonMeta->setBaseFleeRate(0.2);\n        $pokemonMeta->setBaseAttack(103);\n        $pokemonMeta->setDiskRadiusM(0.378);\n        $pokemonMeta->setCollisionRadiusM(0.189);\n        $pokemonMeta->setPokedexWeightKg(3.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.126);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(0.9);\n        $pokemonMeta->setModelScale(1.26);\n        $pokemonMeta->setUniqueId(\"V0019_POKEMON_RATTATA\");\n        $pokemonMeta->setBaseDefense(70);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.4375);\n        $pokemonMeta->setCylHeightM(0.378);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.252);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::QUICK_ATTACK_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DIG,\n            PokemonMove::BODY_SLAM,\n            PokemonMove::HYPER_FANG,\n        )));\n        $pokemonMeta->setNumber(19);\n        self::$POKEMON_META[PokemonId::RATTATA] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0020_POKEMON_RATICATE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_RATTATA);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.7);\n        $pokemonMeta->setHeightStdDev(0.0875);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.5265);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(161);\n        $pokemonMeta->setDiskRadiusM(0.7898);\n        $pokemonMeta->setCollisionRadiusM(0.2925);\n        $pokemonMeta->setPokedexWeightKg(18.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.26325);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.17);\n        $pokemonMeta->setUniqueId(\"V0020_POKEMON_RATICATE\");\n        $pokemonMeta->setBaseDefense(144);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(2.3125);\n        $pokemonMeta->setCylHeightM(0.936);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.585);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::RATTATA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::QUICK_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DIG,\n            PokemonMove::HYPER_BEAM,\n            PokemonMove::HYPER_FANG,\n        )));\n        $pokemonMeta->setNumber(20);\n        self::$POKEMON_META[PokemonId::RATICATE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0021_POKEMON_SPEAROW\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SPEAROW);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.296);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(112);\n        $pokemonMeta->setDiskRadiusM(0.444);\n        $pokemonMeta->setCollisionRadiusM(0.148);\n        $pokemonMeta->setPokedexWeightKg(2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.148);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1.48);\n        $pokemonMeta->setUniqueId(\"V0021_POKEMON_SPEAROW\");\n        $pokemonMeta->setBaseDefense(61);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.25);\n        $pokemonMeta->setCylHeightM(0.518);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.2664);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::QUICK_ATTACK_FAST,\n            PokemonMove::PECK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::TWISTER,\n            PokemonMove::AERIAL_ACE,\n            PokemonMove::DRILL_PECK,\n        )));\n        $pokemonMeta->setNumber(21);\n        self::$POKEMON_META[PokemonId::SPEAROW] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0022_POKEMON_FEAROW\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SPEAROW);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.2);\n        $pokemonMeta->setHeightStdDev(0.15);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.504);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(182);\n        $pokemonMeta->setDiskRadiusM(1.26);\n        $pokemonMeta->setCollisionRadiusM(0.252);\n        $pokemonMeta->setPokedexWeightKg(38);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.126);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.84);\n        $pokemonMeta->setUniqueId(\"V0022_POKEMON_FEAROW\");\n        $pokemonMeta->setBaseDefense(135);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(4.75);\n        $pokemonMeta->setCylHeightM(1.05);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.63);\n        $pokemonMeta->setShoulderModeScale(0.375);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::SPEAROW);\n        $pokemonMeta->setCylGroundM(0.42);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::STEEL_WING_FAST,\n            PokemonMove::PECK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::TWISTER,\n            PokemonMove::AERIAL_ACE,\n            PokemonMove::DRILL_RUN,\n        )));\n        $pokemonMeta->setNumber(22);\n        self::$POKEMON_META[PokemonId::FEAROW] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0023_POKEMON_EKANS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_EKANS);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(2);\n        $pokemonMeta->setHeightStdDev(0.25);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.4325);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(110);\n        $pokemonMeta->setDiskRadiusM(0.6488);\n        $pokemonMeta->setCollisionRadiusM(0.2595);\n        $pokemonMeta->setPokedexWeightKg(6.9);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1384);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1.73);\n        $pokemonMeta->setUniqueId(\"V0023_POKEMON_EKANS\");\n        $pokemonMeta->setBaseDefense(102);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(0.8625);\n        $pokemonMeta->setCylHeightM(0.6055);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.346);\n        $pokemonMeta->setShoulderModeScale(0.375);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_STING_FAST,\n            PokemonMove::ACID_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::WRAP,\n            PokemonMove::GUNK_SHOT,\n        )));\n        $pokemonMeta->setNumber(23);\n        self::$POKEMON_META[PokemonId::EKANS] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0024_POKEMON_ARBOK\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_EKANS);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(3.5);\n        $pokemonMeta->setHeightStdDev(0.4375);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.615);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(167);\n        $pokemonMeta->setDiskRadiusM(0.9225);\n        $pokemonMeta->setCollisionRadiusM(0.41);\n        $pokemonMeta->setPokedexWeightKg(65);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.164);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.82);\n        $pokemonMeta->setUniqueId(\"V0024_POKEMON_ARBOK\");\n        $pokemonMeta->setBaseDefense(158);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(8.125);\n        $pokemonMeta->setCylHeightM(1.353);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.353);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::EKANS);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::ACID_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DARK_PULSE,\n            PokemonMove::GUNK_SHOT,\n            PokemonMove::SLUDGE_WAVE,\n        )));\n        $pokemonMeta->setNumber(24);\n        self::$POKEMON_META[PokemonId::ARBOK] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0025_POKEMON_PIKACHU\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PIKACHU);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.4);\n        $pokemonMeta->setHeightStdDev(0.05);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(112);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.185);\n        $pokemonMeta->setPokedexWeightKg(6);\n        $pokemonMeta->setMovementType(MovementType::NORMAL);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.185);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.48);\n        $pokemonMeta->setUniqueId(\"V0025_POKEMON_PIKACHU\");\n        $pokemonMeta->setBaseDefense(101);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.75);\n        $pokemonMeta->setCylHeightM(0.74);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.518);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::QUICK_ATTACK_FAST,\n            PokemonMove::THUNDER_SHOCK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER,\n            PokemonMove::THUNDERBOLT,\n            PokemonMove::DISCHARGE,\n        )));\n        $pokemonMeta->setNumber(25);\n        self::$POKEMON_META[PokemonId::PIKACHU] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0026_POKEMON_RAICHU\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PIKACHU);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.8);\n        $pokemonMeta->setHeightStdDev(0.1);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.486);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(192);\n        $pokemonMeta->setDiskRadiusM(0.729);\n        $pokemonMeta->setCollisionRadiusM(0.27);\n        $pokemonMeta->setPokedexWeightKg(30);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.216);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1.08);\n        $pokemonMeta->setUniqueId(\"V0026_POKEMON_RAICHU\");\n        $pokemonMeta->setBaseDefense(165);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(3.75);\n        $pokemonMeta->setCylHeightM(1.35);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.54);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.08);\n        $pokemonMeta->setParentId(PokemonId::PIKACHU);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SPARK_FAST,\n            PokemonMove::THUNDER_SHOCK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER_PUNCH,\n            PokemonMove::THUNDER,\n            PokemonMove::BRICK_BREAK,\n        )));\n        $pokemonMeta->setNumber(26);\n        self::$POKEMON_META[PokemonId::RAICHU] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0027_POKEMON_SANDSHREW\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SANDSHREW);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.6);\n        $pokemonMeta->setHeightStdDev(0.075);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.3225);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(126);\n        $pokemonMeta->setDiskRadiusM(0.4838);\n        $pokemonMeta->setCollisionRadiusM(0.258);\n        $pokemonMeta->setPokedexWeightKg(12);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1935);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.29);\n        $pokemonMeta->setUniqueId(\"V0027_POKEMON_SANDSHREW\");\n        $pokemonMeta->setBaseDefense(145);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(1.5);\n        $pokemonMeta->setCylHeightM(0.774);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.48375);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::SCRATCH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DIG,\n            PokemonMove::ROCK_SLIDE,\n            PokemonMove::ROCK_TOMB,\n        )));\n        $pokemonMeta->setNumber(27);\n        self::$POKEMON_META[PokemonId::SANDSHREW] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0028_POKEMON_SANDSLASH\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SANDSHREW);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.4);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(182);\n        $pokemonMeta->setDiskRadiusM(0.6);\n        $pokemonMeta->setCollisionRadiusM(0.35);\n        $pokemonMeta->setPokedexWeightKg(29.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.35);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0028_POKEMON_SANDSLASH\");\n        $pokemonMeta->setBaseDefense(202);\n        $pokemonMeta->setAttackTimerS(4);\n        $pokemonMeta->setWeightStdDev(3.6875);\n        $pokemonMeta->setCylHeightM(1);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.9);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::SANDSHREW);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::METAL_CLAW_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BULLDOZE,\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::ROCK_TOMB,\n        )));\n        $pokemonMeta->setNumber(28);\n        self::$POKEMON_META[PokemonId::SANDSLASH] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0029_POKEMON_NIDORAN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_NIDORAN_FEMALE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.4);\n        $pokemonMeta->setHeightStdDev(0.05);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(86);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.185);\n        $pokemonMeta->setPokedexWeightKg(7);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.185);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1.48);\n        $pokemonMeta->setUniqueId(\"V0029_POKEMON_NIDORAN\");\n        $pokemonMeta->setBaseDefense(94);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(0.875);\n        $pokemonMeta->setCylHeightM(0.666);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.37);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::POISON_STING_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_FANG,\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::BODY_SLAM,\n        )));\n        $pokemonMeta->setNumber(29);\n        self::$POKEMON_META[PokemonId::NIDORAN_FEMALE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0030_POKEMON_NIDORINA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_NIDORAN_FEMALE);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.8);\n        $pokemonMeta->setHeightStdDev(0.1);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.4388);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(117);\n        $pokemonMeta->setDiskRadiusM(0.6581);\n        $pokemonMeta->setCollisionRadiusM(0.2925);\n        $pokemonMeta->setPokedexWeightKg(20);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1755);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.17);\n        $pokemonMeta->setUniqueId(\"V0030_POKEMON_NIDORINA\");\n        $pokemonMeta->setBaseDefense(126);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(2.5);\n        $pokemonMeta->setCylHeightM(0.87749988);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.585);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.2);\n        $pokemonMeta->setParentId(PokemonId::NIDORAN_FEMALE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::POISON_STING_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_FANG,\n            PokemonMove::DIG,\n            PokemonMove::SLUDGE_BOMB,\n        )));\n        $pokemonMeta->setNumber(30);\n        self::$POKEMON_META[PokemonId::NIDORINA] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0031_POKEMON_NIDOQUEEN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_NIDORAN_FEMALE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.4095);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(180);\n        $pokemonMeta->setDiskRadiusM(0.6143);\n        $pokemonMeta->setCollisionRadiusM(0.455);\n        $pokemonMeta->setPokedexWeightKg(60);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2275);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.91);\n        $pokemonMeta->setUniqueId(\"V0031_POKEMON_NIDOQUEEN\");\n        $pokemonMeta->setBaseDefense(174);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(7.5);\n        $pokemonMeta->setCylHeightM(1.183);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.79625);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.1);\n        $pokemonMeta->setParentId(PokemonId::NIDORINA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::POISON_JAB_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STONE_EDGE,\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::SLUDGE_WAVE,\n        )));\n        $pokemonMeta->setNumber(31);\n        self::$POKEMON_META[PokemonId::NIDOQUEEN] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0032_POKEMON_NIDORAN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_NIDORAN_MALE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.5);\n        $pokemonMeta->setHeightStdDev(0.0625);\n        $pokemonMeta->setBaseStamina(92);\n        $pokemonMeta->setCylRadiusM(0.4725);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(105);\n        $pokemonMeta->setDiskRadiusM(0.7088);\n        $pokemonMeta->setCollisionRadiusM(0.252);\n        $pokemonMeta->setPokedexWeightKg(9);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1575);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.26);\n        $pokemonMeta->setUniqueId(\"V0032_POKEMON_NIDORAN\");\n        $pokemonMeta->setBaseDefense(76);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(1.125);\n        $pokemonMeta->setCylHeightM(0.756);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.315);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_STING_FAST,\n            PokemonMove::PECK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::HORN_ATTACK,\n            PokemonMove::BODY_SLAM,\n        )));\n        $pokemonMeta->setNumber(32);\n        self::$POKEMON_META[PokemonId::NIDORAN_MALE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0033_POKEMON_NIDORINO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_NIDORAN_MALE);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.9);\n        $pokemonMeta->setHeightStdDev(0.1125);\n        $pokemonMeta->setBaseStamina(122);\n        $pokemonMeta->setCylRadiusM(0.495);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(137);\n        $pokemonMeta->setDiskRadiusM(0.7425);\n        $pokemonMeta->setCollisionRadiusM(0.297);\n        $pokemonMeta->setPokedexWeightKg(19.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2475);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.99);\n        $pokemonMeta->setUniqueId(\"V0033_POKEMON_NIDORINO\");\n        $pokemonMeta->setBaseDefense(112);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(2.4375);\n        $pokemonMeta->setCylHeightM(0.792);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.594);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.2);\n        $pokemonMeta->setParentId(PokemonId::NIDORAN_MALE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_STING_FAST,\n            PokemonMove::POISON_JAB_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::DIG,\n            PokemonMove::HORN_ATTACK,\n        )));\n        $pokemonMeta->setNumber(33);\n        self::$POKEMON_META[PokemonId::NIDORINO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0034_POKEMON_NIDOKING\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_NIDORAN_MALE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(162);\n        $pokemonMeta->setCylRadiusM(0.5481);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(204);\n        $pokemonMeta->setDiskRadiusM(0.8222);\n        $pokemonMeta->setCollisionRadiusM(0.5481);\n        $pokemonMeta->setPokedexWeightKg(62);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.27405);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.87);\n        $pokemonMeta->setUniqueId(\"V0034_POKEMON_NIDOKING\");\n        $pokemonMeta->setBaseDefense(157);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(7.75);\n        $pokemonMeta->setCylHeightM(1.305);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.87);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.1);\n        $pokemonMeta->setParentId(PokemonId::NIDORINO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::FURY_CUTTER_FAST,\n            PokemonMove::POISON_JAB_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::MEGAHORN,\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::SLUDGE_WAVE,\n        )));\n        $pokemonMeta->setNumber(34);\n        self::$POKEMON_META[PokemonId::NIDOKING] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0035_POKEMON_CLEFAIRY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CLEFAIRY);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.6);\n        $pokemonMeta->setHeightStdDev(0.075);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.45);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(107);\n        $pokemonMeta->setDiskRadiusM(0.675);\n        $pokemonMeta->setCollisionRadiusM(0.3125);\n        $pokemonMeta->setPokedexWeightKg(7.5);\n        $pokemonMeta->setMovementType(MovementType::NORMAL);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setCollisionHeadRadiusM(0.225);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1.25);\n        $pokemonMeta->setUniqueId(\"V0035_POKEMON_CLEFAIRY\");\n        $pokemonMeta->setBaseDefense(116);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(0.9375);\n        $pokemonMeta->setCylHeightM(0.75);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.75);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POUND_FAST,\n            PokemonMove::ZEN_HEADBUTT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DISARMING_VOICE,\n            PokemonMove::MOONBLAST,\n            PokemonMove::BODY_SLAM,\n        )));\n        $pokemonMeta->setNumber(35);\n        self::$POKEMON_META[PokemonId::CLEFAIRY] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0036_POKEMON_CLEFABLE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CLEFAIRY);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(190);\n        $pokemonMeta->setCylRadiusM(0.712);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(178);\n        $pokemonMeta->setDiskRadiusM(1.1681);\n        $pokemonMeta->setCollisionRadiusM(0.445);\n        $pokemonMeta->setPokedexWeightKg(40);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setCollisionHeadRadiusM(0.445);\n        $pokemonMeta->setMovementTimerS(4);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.89);\n        $pokemonMeta->setUniqueId(\"V0036_POKEMON_CLEFABLE\");\n        $pokemonMeta->setBaseDefense(171);\n        $pokemonMeta->setAttackTimerS(11);\n        $pokemonMeta->setWeightStdDev(5);\n        $pokemonMeta->setCylHeightM(1.44625);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.1125);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.08);\n        $pokemonMeta->setParentId(PokemonId::CLEFAIRY);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POUND_FAST,\n            PokemonMove::ZEN_HEADBUTT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DAZZLING_GLEAM,\n            PokemonMove::PSYCHIC,\n            PokemonMove::MOONBLAST,\n        )));\n        $pokemonMeta->setNumber(36);\n        self::$POKEMON_META[PokemonId::CLEFABLE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0037_POKEMON_VULPIX\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_VULPIX);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.6);\n        $pokemonMeta->setHeightStdDev(0.075);\n        $pokemonMeta->setBaseStamina(76);\n        $pokemonMeta->setCylRadiusM(0.567);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(96);\n        $pokemonMeta->setDiskRadiusM(0.8505);\n        $pokemonMeta->setCollisionRadiusM(0.315);\n        $pokemonMeta->setPokedexWeightKg(9.9);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.252);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.26);\n        $pokemonMeta->setUniqueId(\"V0037_POKEMON_VULPIX\");\n        $pokemonMeta->setBaseDefense(122);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(1.2375);\n        $pokemonMeta->setCylHeightM(0.756);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.63);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::EMBER_FAST,\n            PokemonMove::QUICK_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::FLAME_CHARGE,\n            PokemonMove::FLAMETHROWER,\n            PokemonMove::BODY_SLAM,\n        )));\n        $pokemonMeta->setNumber(37);\n        self::$POKEMON_META[PokemonId::VULPIX] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0038_POKEMON_NINETALES\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_VULPIX);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.1);\n        $pokemonMeta->setHeightStdDev(0.1375);\n        $pokemonMeta->setBaseStamina(146);\n        $pokemonMeta->setCylRadiusM(0.864);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(169);\n        $pokemonMeta->setDiskRadiusM(1.296);\n        $pokemonMeta->setCollisionRadiusM(0.36);\n        $pokemonMeta->setPokedexWeightKg(19.9);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.24);\n        $pokemonMeta->setMovementTimerS(5);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.96);\n        $pokemonMeta->setUniqueId(\"V0038_POKEMON_NINETALES\");\n        $pokemonMeta->setBaseDefense(204);\n        $pokemonMeta->setAttackTimerS(14);\n        $pokemonMeta->setWeightStdDev(2.4875);\n        $pokemonMeta->setCylHeightM(1.2);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.96);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.08);\n        $pokemonMeta->setParentId(PokemonId::VULPIX);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::FEINT_ATTACK_FAST,\n            PokemonMove::EMBER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::FLAMETHROWER,\n            PokemonMove::HEAT_WAVE,\n            PokemonMove::FIRE_BLAST,\n        )));\n        $pokemonMeta->setNumber(38);\n        self::$POKEMON_META[PokemonId::NINETALES] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0039_POKEMON_JIGGLYPUFF\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_JIGGLYPUFF);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setPokedexHeightM(0.5);\n        $pokemonMeta->setHeightStdDev(0.0625);\n        $pokemonMeta->setBaseStamina(230);\n        $pokemonMeta->setCylRadiusM(0.512);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(80);\n        $pokemonMeta->setDiskRadiusM(0.768);\n        $pokemonMeta->setCollisionRadiusM(0.32);\n        $pokemonMeta->setPokedexWeightKg(5.5);\n        $pokemonMeta->setMovementType(MovementType::NORMAL);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.256);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(3);\n        $pokemonMeta->setModelScale(1.28);\n        $pokemonMeta->setUniqueId(\"V0039_POKEMON_JIGGLYPUFF\");\n        $pokemonMeta->setBaseDefense(44);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.6875);\n        $pokemonMeta->setCylHeightM(0.96);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.64);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POUND_FAST,\n            PokemonMove::FEINT_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DISARMING_VOICE,\n            PokemonMove::PLAY_ROUGH,\n            PokemonMove::BODY_SLAM,\n        )));\n        $pokemonMeta->setNumber(39);\n        self::$POKEMON_META[PokemonId::JIGGLYPUFF] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0040_POKEMON_WIGGLYTUFF\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_JIGGLYPUFF);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(280);\n        $pokemonMeta->setCylRadiusM(0.445);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(156);\n        $pokemonMeta->setDiskRadiusM(1.0013);\n        $pokemonMeta->setCollisionRadiusM(0.356);\n        $pokemonMeta->setPokedexWeightKg(12);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2225);\n        $pokemonMeta->setMovementTimerS(4);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.89);\n        $pokemonMeta->setUniqueId(\"V0040_POKEMON_WIGGLYTUFF\");\n        $pokemonMeta->setBaseDefense(93);\n        $pokemonMeta->setAttackTimerS(11);\n        $pokemonMeta->setWeightStdDev(1.5);\n        $pokemonMeta->setCylHeightM(1.22375);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.89);\n        $pokemonMeta->setShoulderModeScale(0.4);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::JIGGLYPUFF);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POUND_FAST,\n            PokemonMove::FEINT_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DAZZLING_GLEAM,\n            PokemonMove::PLAY_ROUGH,\n            PokemonMove::HYPER_BEAM,\n        )));\n        $pokemonMeta->setNumber(40);\n        self::$POKEMON_META[PokemonId::WIGGLYTUFF] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0041_POKEMON_ZUBAT\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ZUBAT);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.8);\n        $pokemonMeta->setHeightStdDev(0.1);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.642);\n        $pokemonMeta->setBaseFleeRate(0.2);\n        $pokemonMeta->setBaseAttack(83);\n        $pokemonMeta->setDiskRadiusM(0.963);\n        $pokemonMeta->setCollisionRadiusM(0.0535);\n        $pokemonMeta->setPokedexWeightKg(7.5);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1605);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.07);\n        $pokemonMeta->setUniqueId(\"V0041_POKEMON_ZUBAT\");\n        $pokemonMeta->setBaseDefense(76);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.9375);\n        $pokemonMeta->setCylHeightM(0.6955);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.0535);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.535);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::QUICK_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_FANG,\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::AIR_CUTTER,\n        )));\n        $pokemonMeta->setNumber(41);\n        self::$POKEMON_META[PokemonId::ZUBAT] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0042_POKEMON_GOLBAT\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ZUBAT);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.6);\n        $pokemonMeta->setHeightStdDev(0.2);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.75);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(161);\n        $pokemonMeta->setDiskRadiusM(1.5975);\n        $pokemonMeta->setCollisionRadiusM(0.0355);\n        $pokemonMeta->setPokedexWeightKg(55);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.355);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.71);\n        $pokemonMeta->setUniqueId(\"V0042_POKEMON_GOLBAT\");\n        $pokemonMeta->setBaseDefense(153);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(6.875);\n        $pokemonMeta->setCylHeightM(1.2425);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.0355);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::ZUBAT);\n        $pokemonMeta->setCylGroundM(1.065);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::WING_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_FANG,\n            PokemonMove::AIR_CUTTER,\n            PokemonMove::OMINOUS_WIND,\n        )));\n        $pokemonMeta->setNumber(42);\n        self::$POKEMON_META[PokemonId::GOLBAT] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0043_POKEMON_ODDISH\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ODDISH);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(0.5);\n        $pokemonMeta->setHeightStdDev(0.0625);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.405);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(131);\n        $pokemonMeta->setDiskRadiusM(0.6075);\n        $pokemonMeta->setCollisionRadiusM(0.2025);\n        $pokemonMeta->setPokedexWeightKg(5.4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2025);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.35);\n        $pokemonMeta->setUniqueId(\"V0043_POKEMON_ODDISH\");\n        $pokemonMeta->setBaseDefense(116);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.675);\n        $pokemonMeta->setCylHeightM(0.81000012);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.50625);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.48);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ACID_FAST,\n            PokemonMove::RAZOR_LEAF_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::SEED_BOMB,\n            PokemonMove::MOONBLAST,\n        )));\n        $pokemonMeta->setNumber(43);\n        self::$POKEMON_META[PokemonId::ODDISH] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0044_POKEMON_GLOOM\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ODDISH);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(0.8);\n        $pokemonMeta->setHeightStdDev(0.1);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.495);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(153);\n        $pokemonMeta->setDiskRadiusM(0.7425);\n        $pokemonMeta->setCollisionRadiusM(0.4125);\n        $pokemonMeta->setPokedexWeightKg(8.6);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2475);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.1);\n        $pokemonMeta->setUniqueId(\"V0044_POKEMON_GLOOM\");\n        $pokemonMeta->setBaseDefense(139);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(1.075);\n        $pokemonMeta->setCylHeightM(0.88000011);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.88000011);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::ODDISH);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ACID_FAST,\n            PokemonMove::RAZOR_LEAF_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::PETAL_BLIZZARD,\n            PokemonMove::MOONBLAST,\n        )));\n        $pokemonMeta->setNumber(44);\n        self::$POKEMON_META[PokemonId::GLOOM] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0045_POKEMON_VILEPLUME\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ODDISH);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1.2);\n        $pokemonMeta->setHeightStdDev(0.15);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.828);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(202);\n        $pokemonMeta->setDiskRadiusM(1.242);\n        $pokemonMeta->setCollisionRadiusM(1.012);\n        $pokemonMeta->setPokedexWeightKg(18.6);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.552);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.92);\n        $pokemonMeta->setUniqueId(\"V0045_POKEMON_VILEPLUME\");\n        $pokemonMeta->setBaseDefense(170);\n        $pokemonMeta->setAttackTimerS(4);\n        $pokemonMeta->setWeightStdDev(2.325);\n        $pokemonMeta->setCylHeightM(1.196);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.196);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::GLOOM);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ACID_FAST,\n            PokemonMove::RAZOR_LEAF_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::MOONBLAST,\n            PokemonMove::PETAL_BLIZZARD,\n            PokemonMove::SOLAR_BEAM,\n        )));\n        $pokemonMeta->setNumber(45);\n        self::$POKEMON_META[PokemonId::VILEPLUME] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0046_POKEMON_PARAS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PARAS);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.384);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(121);\n        $pokemonMeta->setDiskRadiusM(0.576);\n        $pokemonMeta->setCollisionRadiusM(0.192);\n        $pokemonMeta->setPokedexWeightKg(5.4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.192);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(1.1);\n        $pokemonMeta->setModelScale(1.28);\n        $pokemonMeta->setUniqueId(\"V0046_POKEMON_PARAS\");\n        $pokemonMeta->setBaseDefense(99);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(0.675);\n        $pokemonMeta->setCylHeightM(0.448);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.32);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BUG_BITE_FAST,\n            PokemonMove::SCRATCH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::CROSS_POISON,\n            PokemonMove::X_SCISSOR,\n            PokemonMove::SEED_BOMB,\n        )));\n        $pokemonMeta->setNumber(46);\n        self::$POKEMON_META[PokemonId::PARAS] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0047_POKEMON_PARASECT\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PARAS);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.6313);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(165);\n        $pokemonMeta->setDiskRadiusM(0.9469);\n        $pokemonMeta->setCollisionRadiusM(0.4545);\n        $pokemonMeta->setPokedexWeightKg(29.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.505);\n        $pokemonMeta->setMovementTimerS(17);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1.01);\n        $pokemonMeta->setUniqueId(\"V0047_POKEMON_PARASECT\");\n        $pokemonMeta->setBaseDefense(146);\n        $pokemonMeta->setAttackTimerS(6);\n        $pokemonMeta->setWeightStdDev(3.6875);\n        $pokemonMeta->setCylHeightM(1.01);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.01);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::PARAS);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BUG_BITE_FAST,\n            PokemonMove::FURY_CUTTER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::CROSS_POISON,\n            PokemonMove::X_SCISSOR,\n            PokemonMove::SOLAR_BEAM,\n        )));\n        $pokemonMeta->setNumber(47);\n        self::$POKEMON_META[PokemonId::PARASECT] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0048_POKEMON_VENONAT\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_VENONAT);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.5325);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(100);\n        $pokemonMeta->setDiskRadiusM(0.7988);\n        $pokemonMeta->setCollisionRadiusM(0.355);\n        $pokemonMeta->setPokedexWeightKg(30);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.26625);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.71);\n        $pokemonMeta->setUniqueId(\"V0048_POKEMON_VENONAT\");\n        $pokemonMeta->setBaseDefense(102);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(3.75);\n        $pokemonMeta->setCylHeightM(1.1715);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.71);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::BUG_BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DAZZLING_GLEAM,\n            PokemonMove::SHADOW_BALL,\n            PokemonMove::PSYBEAM,\n        )));\n        $pokemonMeta->setNumber(48);\n        self::$POKEMON_META[PokemonId::VENONAT] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0049_POKEMON_VENOMOTH\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_VENONAT);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.576);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(179);\n        $pokemonMeta->setDiskRadiusM(0.864);\n        $pokemonMeta->setCollisionRadiusM(0.36);\n        $pokemonMeta->setPokedexWeightKg(12.5);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.288);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.72);\n        $pokemonMeta->setUniqueId(\"V0049_POKEMON_VENOMOTH\");\n        $pokemonMeta->setBaseDefense(150);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(1.5625);\n        $pokemonMeta->setCylHeightM(1.08);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.72);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::VENONAT);\n        $pokemonMeta->setCylGroundM(0.36);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::BUG_BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_FANG,\n            PokemonMove::PSYCHIC,\n            PokemonMove::BUG_BUZZ,\n        )));\n        $pokemonMeta->setNumber(49);\n        self::$POKEMON_META[PokemonId::VENOMOTH] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0050_POKEMON_DIGLETT\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DIGLETT);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.2);\n        $pokemonMeta->setHeightStdDev(0.025);\n        $pokemonMeta->setBaseStamina(20);\n        $pokemonMeta->setCylRadiusM(0.3);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(109);\n        $pokemonMeta->setDiskRadiusM(0.45);\n        $pokemonMeta->setCollisionRadiusM(0.16);\n        $pokemonMeta->setPokedexWeightKg(0.8);\n        $pokemonMeta->setMovementType(MovementType::NORMAL);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.18);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(0);\n        $pokemonMeta->setModelScale(2);\n        $pokemonMeta->setUniqueId(\"V0050_POKEMON_DIGLETT\");\n        $pokemonMeta->setBaseDefense(88);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(0.1);\n        $pokemonMeta->setCylHeightM(0.4);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.4);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::SCRATCH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DIG,\n            PokemonMove::MUD_BOMB,\n            PokemonMove::ROCK_TOMB,\n        )));\n        $pokemonMeta->setNumber(50);\n        self::$POKEMON_META[PokemonId::DIGLETT] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0051_POKEMON_DUGTRIO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DIGLETT);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.7);\n        $pokemonMeta->setHeightStdDev(0.0875);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.672);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(167);\n        $pokemonMeta->setDiskRadiusM(1.008);\n        $pokemonMeta->setCollisionRadiusM(0.448);\n        $pokemonMeta->setPokedexWeightKg(33.3);\n        $pokemonMeta->setMovementType(MovementType::NORMAL);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.336);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(0);\n        $pokemonMeta->setModelScale(1.12);\n        $pokemonMeta->setUniqueId(\"V0051_POKEMON_DUGTRIO\");\n        $pokemonMeta->setBaseDefense(147);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(4.1625);\n        $pokemonMeta->setCylHeightM(0.84);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.84);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::DIGLETT);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SUCKER_PUNCH_FAST,\n            PokemonMove::MUD_SHOT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STONE_EDGE,\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::MUD_BOMB,\n        )));\n        $pokemonMeta->setNumber(51);\n        self::$POKEMON_META[PokemonId::DUGTRIO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0052_POKEMON_MEOWTH\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MEOWTH);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.4);\n        $pokemonMeta->setHeightStdDev(0.05);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.4);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(92);\n        $pokemonMeta->setDiskRadiusM(0.6);\n        $pokemonMeta->setCollisionRadiusM(0.128);\n        $pokemonMeta->setPokedexWeightKg(4.2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.6);\n        $pokemonMeta->setUniqueId(\"V0052_POKEMON_MEOWTH\");\n        $pokemonMeta->setBaseDefense(81);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(0.525);\n        $pokemonMeta->setCylHeightM(0.64);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.4);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::SCRATCH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DARK_PULSE,\n            PokemonMove::NIGHT_SLASH,\n            PokemonMove::BODY_SLAM,\n        )));\n        $pokemonMeta->setNumber(52);\n        self::$POKEMON_META[PokemonId::MEOWTH] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0053_POKEMON_PERSIAN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MEOWTH);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.533);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(150);\n        $pokemonMeta->setDiskRadiusM(0.7995);\n        $pokemonMeta->setCollisionRadiusM(0.328);\n        $pokemonMeta->setPokedexWeightKg(32);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.164);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.82);\n        $pokemonMeta->setUniqueId(\"V0053_POKEMON_PERSIAN\");\n        $pokemonMeta->setBaseDefense(139);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(4);\n        $pokemonMeta->setCylHeightM(0.902);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.615);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MEOWTH);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SCRATCH_FAST,\n            PokemonMove::FEINT_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PLAY_ROUGH,\n            PokemonMove::POWER_GEM,\n            PokemonMove::NIGHT_SLASH,\n        )));\n        $pokemonMeta->setNumber(53);\n        self::$POKEMON_META[PokemonId::PERSIAN] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0054_POKEMON_PSYDUCK\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PSYDUCK);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.8);\n        $pokemonMeta->setHeightStdDev(0.1);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.3638);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(122);\n        $pokemonMeta->setDiskRadiusM(0.5456);\n        $pokemonMeta->setCollisionRadiusM(0.291);\n        $pokemonMeta->setPokedexWeightKg(19.6);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3395);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.97);\n        $pokemonMeta->setUniqueId(\"V0054_POKEMON_PSYDUCK\");\n        $pokemonMeta->setBaseDefense(96);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(2.45);\n        $pokemonMeta->setCylHeightM(0.97);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.60625);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_GUN_FAST,\n            PokemonMove::ZEN_HEADBUTT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::AQUA_TAIL,\n            PokemonMove::PSYBEAM,\n            PokemonMove::CROSS_CHOP,\n        )));\n        $pokemonMeta->setNumber(54);\n        self::$POKEMON_META[PokemonId::PSYDUCK] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0055_POKEMON_GOLDUCK\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PSYDUCK);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.7);\n        $pokemonMeta->setHeightStdDev(0.2125);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.465);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(191);\n        $pokemonMeta->setDiskRadiusM(0.9765);\n        $pokemonMeta->setCollisionRadiusM(0.2325);\n        $pokemonMeta->setPokedexWeightKg(76.6);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2325);\n        $pokemonMeta->setMovementTimerS(5);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.93);\n        $pokemonMeta->setUniqueId(\"V0055_POKEMON_GOLDUCK\");\n        $pokemonMeta->setBaseDefense(163);\n        $pokemonMeta->setAttackTimerS(14);\n        $pokemonMeta->setWeightStdDev(9.575);\n        $pokemonMeta->setCylHeightM(1.3485);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.81375);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::PSYDUCK);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::WATER_GUN_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::HYDRO_PUMP,\n            PokemonMove::ICE_BEAM,\n        )));\n        $pokemonMeta->setNumber(55);\n        self::$POKEMON_META[PokemonId::GOLDUCK] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0056_POKEMON_MANKEY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MANKEY);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.5);\n        $pokemonMeta->setHeightStdDev(0.0625);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.4838);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(148);\n        $pokemonMeta->setDiskRadiusM(0.7256);\n        $pokemonMeta->setCollisionRadiusM(0.1935);\n        $pokemonMeta->setPokedexWeightKg(28);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setCollisionHeadRadiusM(0.129);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.29);\n        $pokemonMeta->setUniqueId(\"V0056_POKEMON_MANKEY\");\n        $pokemonMeta->setBaseDefense(87);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(3.5);\n        $pokemonMeta->setCylHeightM(0.80625);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.645);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::KARATE_CHOP_FAST,\n            PokemonMove::SCRATCH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::LOW_SWEEP,\n            PokemonMove::BRICK_BREAK,\n            PokemonMove::CROSS_CHOP,\n        )));\n        $pokemonMeta->setNumber(56);\n        self::$POKEMON_META[PokemonId::MANKEY] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0057_POKEMON_PRIMEAPE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MANKEY);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.46);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(207);\n        $pokemonMeta->setDiskRadiusM(0.69);\n        $pokemonMeta->setCollisionRadiusM(0.46);\n        $pokemonMeta->setPokedexWeightKg(32);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setCollisionHeadRadiusM(0.23);\n        $pokemonMeta->setMovementTimerS(17);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.92);\n        $pokemonMeta->setUniqueId(\"V0057_POKEMON_PRIMEAPE\");\n        $pokemonMeta->setBaseDefense(144);\n        $pokemonMeta->setAttackTimerS(6);\n        $pokemonMeta->setWeightStdDev(4);\n        $pokemonMeta->setCylHeightM(1.15);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.104);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MANKEY);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::KARATE_CHOP_FAST,\n            PokemonMove::LOW_KICK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::LOW_SWEEP,\n            PokemonMove::NIGHT_SLASH,\n            PokemonMove::CROSS_CHOP,\n        )));\n        $pokemonMeta->setNumber(57);\n        self::$POKEMON_META[PokemonId::PRIMEAPE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0058_POKEMON_GROWLITHE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GROWLITHE);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.7);\n        $pokemonMeta->setHeightStdDev(0.0875);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.585);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(136);\n        $pokemonMeta->setDiskRadiusM(0.8775);\n        $pokemonMeta->setCollisionRadiusM(0.234);\n        $pokemonMeta->setPokedexWeightKg(19);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1755);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.17);\n        $pokemonMeta->setUniqueId(\"V0058_POKEMON_GROWLITHE\");\n        $pokemonMeta->setBaseDefense(96);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(2.375);\n        $pokemonMeta->setCylHeightM(1.02375);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.585);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::EMBER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::FLAME_WHEEL,\n            PokemonMove::FLAMETHROWER,\n            PokemonMove::BODY_SLAM,\n        )));\n        $pokemonMeta->setNumber(58);\n        self::$POKEMON_META[PokemonId::GROWLITHE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0059_POKEMON_ARCANINE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GROWLITHE);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.9);\n        $pokemonMeta->setHeightStdDev(0.2375);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.666);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(227);\n        $pokemonMeta->setDiskRadiusM(0.999);\n        $pokemonMeta->setCollisionRadiusM(0.37);\n        $pokemonMeta->setPokedexWeightKg(155);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.333);\n        $pokemonMeta->setMovementTimerS(4);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.74);\n        $pokemonMeta->setUniqueId(\"V0059_POKEMON_ARCANINE\");\n        $pokemonMeta->setBaseDefense(166);\n        $pokemonMeta->setAttackTimerS(11);\n        $pokemonMeta->setWeightStdDev(19.375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.74);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.08);\n        $pokemonMeta->setParentId(PokemonId::GROWLITHE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::FIRE_FANG_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BULLDOZE,\n            PokemonMove::FLAMETHROWER,\n            PokemonMove::FIRE_BLAST,\n        )));\n        $pokemonMeta->setNumber(59);\n        self::$POKEMON_META[PokemonId::ARCANINE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0060_POKEMON_POLIWAG\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_POLIWAG);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.6);\n        $pokemonMeta->setHeightStdDev(0.075);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.5);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(101);\n        $pokemonMeta->setDiskRadiusM(0.75);\n        $pokemonMeta->setCollisionRadiusM(0.3125);\n        $pokemonMeta->setPokedexWeightKg(12.4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3125);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.25);\n        $pokemonMeta->setUniqueId(\"V0060_POKEMON_POLIWAG\");\n        $pokemonMeta->setBaseDefense(82);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(1.55);\n        $pokemonMeta->setCylHeightM(0.875);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.75);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::BUBBLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_BOMB,\n            PokemonMove::BUBBLE_BEAM,\n            PokemonMove::BODY_SLAM,\n        )));\n        $pokemonMeta->setNumber(60);\n        self::$POKEMON_META[PokemonId::POLIWAG] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0061_POKEMON_POLIWHIRL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_POLIWAG);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.735);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(130);\n        $pokemonMeta->setDiskRadiusM(1.1025);\n        $pokemonMeta->setCollisionRadiusM(0.49);\n        $pokemonMeta->setPokedexWeightKg(20);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3675);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(0.8);\n        $pokemonMeta->setModelScale(0.98);\n        $pokemonMeta->setUniqueId(\"V0061_POKEMON_POLIWHIRL\");\n        $pokemonMeta->setBaseDefense(130);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(2.5);\n        $pokemonMeta->setCylHeightM(1.078);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.882);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.2);\n        $pokemonMeta->setParentId(PokemonId::POLIWAG);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::BUBBLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SCALD,\n            PokemonMove::MUD_BOMB,\n            PokemonMove::BUBBLE_BEAM,\n        )));\n        $pokemonMeta->setNumber(61);\n        self::$POKEMON_META[PokemonId::POLIWHIRL] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0062_POKEMON_POLIWRATH\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_POLIWAG);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.817);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(182);\n        $pokemonMeta->setDiskRadiusM(1.2255);\n        $pokemonMeta->setCollisionRadiusM(0.645);\n        $pokemonMeta->setPokedexWeightKg(54);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.344);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1.05);\n        $pokemonMeta->setModelScale(0.86);\n        $pokemonMeta->setUniqueId(\"V0062_POKEMON_POLIWRATH\");\n        $pokemonMeta->setBaseDefense(187);\n        $pokemonMeta->setAttackTimerS(4);\n        $pokemonMeta->setWeightStdDev(6.75);\n        $pokemonMeta->setCylHeightM(1.204);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.118);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.1);\n        $pokemonMeta->setParentId(PokemonId::POLIWHIRL);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::BUBBLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::HYDRO_PUMP,\n            PokemonMove::SUBMISSION,\n            PokemonMove::ICE_PUNCH,\n        )));\n        $pokemonMeta->setNumber(62);\n        self::$POKEMON_META[PokemonId::POLIWRATH] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0063_POKEMON_ABRA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ABRA);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.9);\n        $pokemonMeta->setHeightStdDev(0.1125);\n        $pokemonMeta->setBaseStamina(50);\n        $pokemonMeta->setCylRadiusM(0.448);\n        $pokemonMeta->setBaseFleeRate(0.99);\n        $pokemonMeta->setBaseAttack(195);\n        $pokemonMeta->setDiskRadiusM(0.672);\n        $pokemonMeta->setCollisionRadiusM(0.28);\n        $pokemonMeta->setPokedexWeightKg(19.5);\n        $pokemonMeta->setMovementType(MovementType::PSYCHIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.28);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.12);\n        $pokemonMeta->setUniqueId(\"V0063_POKEMON_ABRA\");\n        $pokemonMeta->setBaseDefense(103);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(2.4375);\n        $pokemonMeta->setCylHeightM(0.784);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.56);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.168);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ZEN_HEADBUTT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SHADOW_BALL,\n            PokemonMove::PSYSHOCK,\n            PokemonMove::SIGNAL_BEAM,\n        )));\n        $pokemonMeta->setNumber(63);\n        self::$POKEMON_META[PokemonId::ABRA] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0064_POKEMON_KADABRA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ABRA);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.6675);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(232);\n        $pokemonMeta->setDiskRadiusM(1.0013);\n        $pokemonMeta->setCollisionRadiusM(0.445);\n        $pokemonMeta->setPokedexWeightKg(56.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.33375);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.89);\n        $pokemonMeta->setUniqueId(\"V0064_POKEMON_KADABRA\");\n        $pokemonMeta->setBaseDefense(138);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(7.0625);\n        $pokemonMeta->setCylHeightM(1.157);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.89);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.2);\n        $pokemonMeta->setParentId(PokemonId::ABRA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::PSYCHO_CUT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DAZZLING_GLEAM,\n            PokemonMove::SHADOW_BALL,\n            PokemonMove::PSYBEAM,\n        )));\n        $pokemonMeta->setNumber(64);\n        self::$POKEMON_META[PokemonId::KADABRA] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0065_POKEMON_ALAKAZAM\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ABRA);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.51);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(271);\n        $pokemonMeta->setDiskRadiusM(0.765);\n        $pokemonMeta->setCollisionRadiusM(0.425);\n        $pokemonMeta->setPokedexWeightKg(48);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.255);\n        $pokemonMeta->setMovementTimerS(4);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.85);\n        $pokemonMeta->setUniqueId(\"V0065_POKEMON_ALAKAZAM\");\n        $pokemonMeta->setBaseDefense(194);\n        $pokemonMeta->setAttackTimerS(11);\n        $pokemonMeta->setWeightStdDev(6);\n        $pokemonMeta->setCylHeightM(1.275);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.93500012);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.1);\n        $pokemonMeta->setParentId(PokemonId::KADABRA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::PSYCHO_CUT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::DAZZLING_GLEAM,\n            PokemonMove::SHADOW_BALL,\n        )));\n        $pokemonMeta->setNumber(65);\n        self::$POKEMON_META[PokemonId::ALAKAZAM] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0066_POKEMON_MACHOP\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MACHOP);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.8);\n        $pokemonMeta->setHeightStdDev(0.1);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.4125);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(137);\n        $pokemonMeta->setDiskRadiusM(0.6188);\n        $pokemonMeta->setCollisionRadiusM(0.22);\n        $pokemonMeta->setPokedexWeightKg(19.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setCollisionHeadRadiusM(0.20625);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.1);\n        $pokemonMeta->setUniqueId(\"V0066_POKEMON_MACHOP\");\n        $pokemonMeta->setBaseDefense(88);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(2.4375);\n        $pokemonMeta->setCylHeightM(0.88000011);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.55);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::KARATE_CHOP_FAST,\n            PokemonMove::LOW_KICK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::LOW_SWEEP,\n            PokemonMove::BRICK_BREAK,\n            PokemonMove::CROSS_CHOP,\n        )));\n        $pokemonMeta->setNumber(66);\n        self::$POKEMON_META[PokemonId::MACHOP] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0067_POKEMON_MACHOKE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MACHOP);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.546);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(177);\n        $pokemonMeta->setDiskRadiusM(0.819);\n        $pokemonMeta->setCollisionRadiusM(0.54600012);\n        $pokemonMeta->setPokedexWeightKg(70.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1365);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.91);\n        $pokemonMeta->setUniqueId(\"V0067_POKEMON_MACHOKE\");\n        $pokemonMeta->setBaseDefense(130);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(8.8125);\n        $pokemonMeta->setCylHeightM(1.274);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(1.092);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.2);\n        $pokemonMeta->setParentId(PokemonId::MACHOP);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::KARATE_CHOP_FAST,\n            PokemonMove::LOW_KICK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SUBMISSION,\n            PokemonMove::BRICK_BREAK,\n            PokemonMove::CROSS_CHOP,\n        )));\n        $pokemonMeta->setNumber(67);\n        self::$POKEMON_META[PokemonId::MACHOKE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0068_POKEMON_MACHAMP\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MACHOP);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.6);\n        $pokemonMeta->setHeightStdDev(0.2);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.5785);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(234);\n        $pokemonMeta->setDiskRadiusM(0.8678);\n        $pokemonMeta->setCollisionRadiusM(0.5785);\n        $pokemonMeta->setPokedexWeightKg(130);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1335);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.89);\n        $pokemonMeta->setUniqueId(\"V0068_POKEMON_MACHAMP\");\n        $pokemonMeta->setBaseDefense(162);\n        $pokemonMeta->setAttackTimerS(3);\n        $pokemonMeta->setWeightStdDev(16.25);\n        $pokemonMeta->setCylHeightM(1.424);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.246);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.1);\n        $pokemonMeta->setParentId(PokemonId::MACHOKE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::KARATE_CHOP_FAST,\n            PokemonMove::BULLET_PUNCH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STONE_EDGE,\n            PokemonMove::SUBMISSION,\n            PokemonMove::CROSS_CHOP,\n        )));\n        $pokemonMeta->setNumber(68);\n        self::$POKEMON_META[PokemonId::MACHAMP] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0069_POKEMON_BELLSPROUT\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_BELLSPROUT);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(0.7);\n        $pokemonMeta->setHeightStdDev(0.0875);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.4515);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(139);\n        $pokemonMeta->setDiskRadiusM(0.6773);\n        $pokemonMeta->setCollisionRadiusM(0.1935);\n        $pokemonMeta->setPokedexWeightKg(4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.22575);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1.2);\n        $pokemonMeta->setModelScale(1.29);\n        $pokemonMeta->setUniqueId(\"V0069_POKEMON_BELLSPROUT\");\n        $pokemonMeta->setBaseDefense(64);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.5);\n        $pokemonMeta->setCylHeightM(0.90299988);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.4515);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::VINE_WHIP_FAST,\n            PokemonMove::ACID_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::POWER_WHIP,\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::WRAP,\n        )));\n        $pokemonMeta->setNumber(69);\n        self::$POKEMON_META[PokemonId::BELLSPROUT] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0070_POKEMON_WEEPINBELL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_BELLSPROUT);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.65);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(172);\n        $pokemonMeta->setDiskRadiusM(0.975);\n        $pokemonMeta->setCollisionRadiusM(0.25);\n        $pokemonMeta->setPokedexWeightKg(6.4);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.25);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0070_POKEMON_WEEPINBELL\");\n        $pokemonMeta->setBaseDefense(95);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(0.8);\n        $pokemonMeta->setCylHeightM(1);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.95);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.2);\n        $pokemonMeta->setParentId(PokemonId::BELLSPROUT);\n        $pokemonMeta->setCylGroundM(0.375);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ACID_FAST,\n            PokemonMove::RAZOR_LEAF_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::POWER_WHIP,\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::SEED_BOMB,\n        )));\n        $pokemonMeta->setNumber(70);\n        self::$POKEMON_META[PokemonId::WEEPINBELL] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0071_POKEMON_VICTREEBEL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_BELLSPROUT);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1.7);\n        $pokemonMeta->setHeightStdDev(0.2125);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.546);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(207);\n        $pokemonMeta->setDiskRadiusM(0.819);\n        $pokemonMeta->setCollisionRadiusM(0.336);\n        $pokemonMeta->setPokedexWeightKg(15.5);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.273);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.84);\n        $pokemonMeta->setUniqueId(\"V0071_POKEMON_VICTREEBEL\");\n        $pokemonMeta->setBaseDefense(138);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(1.9375);\n        $pokemonMeta->setCylHeightM(1.428);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.428);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.1);\n        $pokemonMeta->setParentId(PokemonId::WEEPINBELL);\n        $pokemonMeta->setCylGroundM(0.42);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ACID_FAST,\n            PokemonMove::RAZOR_LEAF_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::LEAF_BLADE,\n            PokemonMove::SOLAR_BEAM,\n        )));\n        $pokemonMeta->setNumber(71);\n        self::$POKEMON_META[PokemonId::VICTREEBEL] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0072_POKEMON_TENTACOOL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TENTACOOL);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(0.9);\n        $pokemonMeta->setHeightStdDev(0.1125);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.315);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(97);\n        $pokemonMeta->setDiskRadiusM(0.4725);\n        $pokemonMeta->setCollisionRadiusM(0.21);\n        $pokemonMeta->setPokedexWeightKg(45.5);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1575);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.05);\n        $pokemonMeta->setUniqueId(\"V0072_POKEMON_TENTACOOL\");\n        $pokemonMeta->setBaseDefense(182);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(5.6875);\n        $pokemonMeta->setCylHeightM(0.91874993);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.91874993);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.2625);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_STING_FAST,\n            PokemonMove::BUBBLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_PULSE,\n            PokemonMove::BUBBLE_BEAM,\n            PokemonMove::WRAP,\n        )));\n        $pokemonMeta->setNumber(72);\n        self::$POKEMON_META[PokemonId::TENTACOOL] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0073_POKEMON_TENTACRUEL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TENTACOOL);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1.6);\n        $pokemonMeta->setHeightStdDev(0.2);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.492);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(166);\n        $pokemonMeta->setDiskRadiusM(0.738);\n        $pokemonMeta->setCollisionRadiusM(0.492);\n        $pokemonMeta->setPokedexWeightKg(55);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.246);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.82);\n        $pokemonMeta->setUniqueId(\"V0073_POKEMON_TENTACRUEL\");\n        $pokemonMeta->setBaseDefense(237);\n        $pokemonMeta->setAttackTimerS(4);\n        $pokemonMeta->setWeightStdDev(6.875);\n        $pokemonMeta->setCylHeightM(1.312);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.23);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::TENTACOOL);\n        $pokemonMeta->setCylGroundM(0.205);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ACID_FAST,\n            PokemonMove::POISON_JAB_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BLIZZARD,\n            PokemonMove::HYDRO_PUMP,\n            PokemonMove::SLUDGE_WAVE,\n        )));\n        $pokemonMeta->setNumber(73);\n        self::$POKEMON_META[PokemonId::TENTACRUEL] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0074_POKEMON_GEODUDE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GEODUDE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(0.4);\n        $pokemonMeta->setHeightStdDev(0.05);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.3915);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(132);\n        $pokemonMeta->setDiskRadiusM(0.5873);\n        $pokemonMeta->setCollisionRadiusM(0.3915);\n        $pokemonMeta->setPokedexWeightKg(20);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.19575);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.87);\n        $pokemonMeta->setUniqueId(\"V0074_POKEMON_GEODUDE\");\n        $pokemonMeta->setBaseDefense(163);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(2.5);\n        $pokemonMeta->setCylHeightM(0.348);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.1305);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.261);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ROCK_THROW_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DIG,\n            PokemonMove::ROCK_SLIDE,\n            PokemonMove::ROCK_TOMB,\n        )));\n        $pokemonMeta->setNumber(74);\n        self::$POKEMON_META[PokemonId::GEODUDE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0075_POKEMON_GRAVELER\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GEODUDE);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.697);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(164);\n        $pokemonMeta->setDiskRadiusM(1.0455);\n        $pokemonMeta->setCollisionRadiusM(0.492);\n        $pokemonMeta->setPokedexWeightKg(105);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.369);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1.2);\n        $pokemonMeta->setModelScale(0.82);\n        $pokemonMeta->setUniqueId(\"V0075_POKEMON_GRAVELER\");\n        $pokemonMeta->setBaseDefense(196);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(13.125);\n        $pokemonMeta->setCylHeightM(0.82);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.697);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.2);\n        $pokemonMeta->setParentId(PokemonId::GEODUDE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::ROCK_THROW_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DIG,\n            PokemonMove::ROCK_SLIDE,\n            PokemonMove::STONE_EDGE,\n        )));\n        $pokemonMeta->setNumber(75);\n        self::$POKEMON_META[PokemonId::GRAVELER] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0076_POKEMON_GOLEM\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GEODUDE);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.63);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(211);\n        $pokemonMeta->setDiskRadiusM(0.945);\n        $pokemonMeta->setCollisionRadiusM(0.63);\n        $pokemonMeta->setPokedexWeightKg(300);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.315);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1.2);\n        $pokemonMeta->setModelScale(0.84);\n        $pokemonMeta->setUniqueId(\"V0076_POKEMON_GOLEM\");\n        $pokemonMeta->setBaseDefense(229);\n        $pokemonMeta->setAttackTimerS(3);\n        $pokemonMeta->setWeightStdDev(37.5);\n        $pokemonMeta->setCylHeightM(1.092);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.092);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.1);\n        $pokemonMeta->setParentId(PokemonId::GRAVELER);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::ROCK_THROW_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STONE_EDGE,\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::ANCIENT_POWER,\n        )));\n        $pokemonMeta->setNumber(76);\n        self::$POKEMON_META[PokemonId::GOLEM] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0077_POKEMON_PONYTA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PONYTA);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.3788);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(170);\n        $pokemonMeta->setDiskRadiusM(0.5681);\n        $pokemonMeta->setCollisionRadiusM(0.2525);\n        $pokemonMeta->setPokedexWeightKg(30);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.202);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(0.95);\n        $pokemonMeta->setModelScale(1.01);\n        $pokemonMeta->setUniqueId(\"V0077_POKEMON_PONYTA\");\n        $pokemonMeta->setBaseDefense(132);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(3.75);\n        $pokemonMeta->setCylHeightM(1.2625);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.63125);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::EMBER_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::FLAME_WHEEL,\n            PokemonMove::FLAME_CHARGE,\n            PokemonMove::FIRE_BLAST,\n        )));\n        $pokemonMeta->setNumber(77);\n        self::$POKEMON_META[PokemonId::PONYTA] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0078_POKEMON_RAPIDASH\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PONYTA);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.7);\n        $pokemonMeta->setHeightStdDev(0.2125);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.405);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(207);\n        $pokemonMeta->setDiskRadiusM(0.6075);\n        $pokemonMeta->setCollisionRadiusM(0.324);\n        $pokemonMeta->setPokedexWeightKg(95);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.243);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.81);\n        $pokemonMeta->setUniqueId(\"V0078_POKEMON_RAPIDASH\");\n        $pokemonMeta->setBaseDefense(167);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(11.875);\n        $pokemonMeta->setCylHeightM(1.701);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.891);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::PONYTA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::LOW_KICK_FAST,\n            PokemonMove::EMBER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::HEAT_WAVE,\n            PokemonMove::DRILL_RUN,\n            PokemonMove::FIRE_BLAST,\n        )));\n        $pokemonMeta->setNumber(78);\n        self::$POKEMON_META[PokemonId::RAPIDASH] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0079_POKEMON_SLOWPOKE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SLOWPOKE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setPokedexHeightM(1.2);\n        $pokemonMeta->setHeightStdDev(0.15);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.5925);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(109);\n        $pokemonMeta->setDiskRadiusM(1.185);\n        $pokemonMeta->setCollisionRadiusM(0.316);\n        $pokemonMeta->setPokedexWeightKg(36);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.29625);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.79);\n        $pokemonMeta->setUniqueId(\"V0079_POKEMON_SLOWPOKE\");\n        $pokemonMeta->setBaseDefense(109);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(4.5);\n        $pokemonMeta->setCylHeightM(0.94800007);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.5135);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::WATER_GUN_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::WATER_PULSE,\n            PokemonMove::PSYSHOCK,\n        )));\n        $pokemonMeta->setNumber(79);\n        self::$POKEMON_META[PokemonId::SLOWPOKE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0080_POKEMON_SLOWBRO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SLOWPOKE);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setPokedexHeightM(1.6);\n        $pokemonMeta->setHeightStdDev(0.2);\n        $pokemonMeta->setBaseStamina(190);\n        $pokemonMeta->setCylRadiusM(0.4675);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(177);\n        $pokemonMeta->setDiskRadiusM(0.7013);\n        $pokemonMeta->setCollisionRadiusM(0.425);\n        $pokemonMeta->setPokedexWeightKg(78.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.255);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.85);\n        $pokemonMeta->setUniqueId(\"V0080_POKEMON_SLOWBRO\");\n        $pokemonMeta->setBaseDefense(194);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(9.8125);\n        $pokemonMeta->setCylHeightM(1.275);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.85);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::SLOWPOKE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::WATER_GUN_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::WATER_PULSE,\n            PokemonMove::ICE_BEAM,\n        )));\n        $pokemonMeta->setNumber(80);\n        self::$POKEMON_META[PokemonId::SLOWBRO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0081_POKEMON_MAGNEMITE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MAGNEMITE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_STEEL);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(50);\n        $pokemonMeta->setCylRadiusM(0.456);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(165);\n        $pokemonMeta->setDiskRadiusM(0.684);\n        $pokemonMeta->setCollisionRadiusM(0.456);\n        $pokemonMeta->setPokedexWeightKg(6);\n        $pokemonMeta->setMovementType(MovementType::ELECTRIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.228);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.52);\n        $pokemonMeta->setUniqueId(\"V0081_POKEMON_MAGNEMITE\");\n        $pokemonMeta->setBaseDefense(128);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(0.75);\n        $pokemonMeta->setCylHeightM(0.456);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.456);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.912);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SPARK_FAST,\n            PokemonMove::THUNDER_SHOCK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::MAGNET_BOMB,\n            PokemonMove::THUNDERBOLT,\n            PokemonMove::DISCHARGE,\n        )));\n        $pokemonMeta->setNumber(81);\n        self::$POKEMON_META[PokemonId::MAGNEMITE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0082_POKEMON_MAGNETON\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MAGNEMITE);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_STEEL);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.44);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(223);\n        $pokemonMeta->setDiskRadiusM(0.66);\n        $pokemonMeta->setCollisionRadiusM(0.44);\n        $pokemonMeta->setPokedexWeightKg(60);\n        $pokemonMeta->setMovementType(MovementType::ELECTRIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.22);\n        $pokemonMeta->setMovementTimerS(5);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.1);\n        $pokemonMeta->setUniqueId(\"V0082_POKEMON_MAGNETON\");\n        $pokemonMeta->setBaseDefense(182);\n        $pokemonMeta->setAttackTimerS(14);\n        $pokemonMeta->setWeightStdDev(7.5);\n        $pokemonMeta->setCylHeightM(1.1);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.825);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MAGNEMITE);\n        $pokemonMeta->setCylGroundM(0.44);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SPARK_FAST,\n            PokemonMove::THUNDER_SHOCK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::MAGNET_BOMB,\n            PokemonMove::FLASH_CANNON,\n            PokemonMove::DISCHARGE,\n        )));\n        $pokemonMeta->setNumber(82);\n        self::$POKEMON_META[PokemonId::MAGNETON] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0083_POKEMON_FARFETCHD\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_FARFETCHD);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.8);\n        $pokemonMeta->setHeightStdDev(0.1);\n        $pokemonMeta->setBaseStamina(104);\n        $pokemonMeta->setCylRadiusM(0.452);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(124);\n        $pokemonMeta->setDiskRadiusM(0.678);\n        $pokemonMeta->setCollisionRadiusM(0.2825);\n        $pokemonMeta->setPokedexWeightKg(15);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2825);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1.13);\n        $pokemonMeta->setUniqueId(\"V0083_POKEMON_FARFETCHD\");\n        $pokemonMeta->setBaseDefense(128);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(1.875);\n        $pokemonMeta->setCylHeightM(0.8475);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.42375);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::FURY_CUTTER_FAST,\n            PokemonMove::CUT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::AERIAL_ACE,\n            PokemonMove::LEAF_BLADE,\n            PokemonMove::AIR_CUTTER,\n        )));\n        $pokemonMeta->setNumber(83);\n        self::$POKEMON_META[PokemonId::FARFETCHD] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0084_POKEMON_DODUO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DODUO);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.396);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(158);\n        $pokemonMeta->setDiskRadiusM(0.594);\n        $pokemonMeta->setCollisionRadiusM(0.352);\n        $pokemonMeta->setPokedexWeightKg(39.2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.198);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.88);\n        $pokemonMeta->setUniqueId(\"V0084_POKEMON_DODUO\");\n        $pokemonMeta->setBaseDefense(88);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(4.9);\n        $pokemonMeta->setCylHeightM(1.232);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(1.232);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::QUICK_ATTACK_FAST,\n            PokemonMove::PECK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::AERIAL_ACE,\n            PokemonMove::DRILL_PECK,\n            PokemonMove::SWIFT,\n        )));\n        $pokemonMeta->setNumber(84);\n        self::$POKEMON_META[PokemonId::DODUO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0085_POKEMON_DODRIO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DODUO);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.8);\n        $pokemonMeta->setHeightStdDev(0.225);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.5148);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(218);\n        $pokemonMeta->setDiskRadiusM(0.7722);\n        $pokemonMeta->setCollisionRadiusM(0.39);\n        $pokemonMeta->setPokedexWeightKg(85.2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2574);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.78);\n        $pokemonMeta->setUniqueId(\"V0085_POKEMON_DODRIO\");\n        $pokemonMeta->setBaseDefense(145);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(10.65);\n        $pokemonMeta->setCylHeightM(1.287);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.287);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::DODUO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::STEEL_WING_FAST,\n            PokemonMove::FEINT_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::AERIAL_ACE,\n            PokemonMove::DRILL_PECK,\n            PokemonMove::AIR_CUTTER,\n        )));\n        $pokemonMeta->setNumber(85);\n        self::$POKEMON_META[PokemonId::DODRIO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0086_POKEMON_SEEL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SEEL);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.1);\n        $pokemonMeta->setHeightStdDev(0.1375);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.275);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(85);\n        $pokemonMeta->setDiskRadiusM(0.4125);\n        $pokemonMeta->setCollisionRadiusM(0.275);\n        $pokemonMeta->setPokedexWeightKg(90);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.22);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(0.9);\n        $pokemonMeta->setModelScale(1.1);\n        $pokemonMeta->setUniqueId(\"V0086_POKEMON_SEEL\");\n        $pokemonMeta->setBaseDefense(128);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(11.25);\n        $pokemonMeta->setCylHeightM(0.55);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.4125);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_GUN_FAST,\n            PokemonMove::ICE_SHARD_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ICY_WIND,\n            PokemonMove::AQUA_TAIL,\n            PokemonMove::AQUA_JET,\n        )));\n        $pokemonMeta->setNumber(86);\n        self::$POKEMON_META[PokemonId::SEEL] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0087_POKEMON_DEWGONG\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SEEL);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ICE);\n        $pokemonMeta->setPokedexHeightM(1.7);\n        $pokemonMeta->setHeightStdDev(0.2125);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.525);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(139);\n        $pokemonMeta->setDiskRadiusM(0.7875);\n        $pokemonMeta->setCollisionRadiusM(0.315);\n        $pokemonMeta->setPokedexWeightKg(120);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.13125);\n        $pokemonMeta->setMovementTimerS(5);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.05);\n        $pokemonMeta->setUniqueId(\"V0087_POKEMON_DEWGONG\");\n        $pokemonMeta->setBaseDefense(184);\n        $pokemonMeta->setAttackTimerS(14);\n        $pokemonMeta->setWeightStdDev(15);\n        $pokemonMeta->setCylHeightM(0.84);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.63);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::SEEL);\n        $pokemonMeta->setCylGroundM(0.39375);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ICE_SHARD_FAST,\n            PokemonMove::FROST_BREATH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ICY_WIND,\n            PokemonMove::BLIZZARD,\n            PokemonMove::AQUA_JET,\n        )));\n        $pokemonMeta->setNumber(87);\n        self::$POKEMON_META[PokemonId::DEWGONG] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0088_POKEMON_GRIMER\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GRIMER);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.9);\n        $pokemonMeta->setHeightStdDev(0.1125);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.588);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(135);\n        $pokemonMeta->setDiskRadiusM(0.882);\n        $pokemonMeta->setCollisionRadiusM(0.49);\n        $pokemonMeta->setPokedexWeightKg(30);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.294);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.98);\n        $pokemonMeta->setUniqueId(\"V0088_POKEMON_GRIMER\");\n        $pokemonMeta->setBaseDefense(90);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(3.75);\n        $pokemonMeta->setCylHeightM(0.98);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.83300012);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SLAP_FAST,\n            PokemonMove::ACID_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::MUD_BOMB,\n            PokemonMove::SLUDGE,\n        )));\n        $pokemonMeta->setNumber(88);\n        self::$POKEMON_META[PokemonId::GRIMER] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0089_POKEMON_MUK\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GRIMER);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.2);\n        $pokemonMeta->setHeightStdDev(0.15);\n        $pokemonMeta->setBaseStamina(210);\n        $pokemonMeta->setCylRadiusM(0.86);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(190);\n        $pokemonMeta->setDiskRadiusM(1.14);\n        $pokemonMeta->setCollisionRadiusM(0.76);\n        $pokemonMeta->setPokedexWeightKg(30);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.38);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.76);\n        $pokemonMeta->setUniqueId(\"V0089_POKEMON_MUK\");\n        $pokemonMeta->setBaseDefense(184);\n        $pokemonMeta->setAttackTimerS(3);\n        $pokemonMeta->setWeightStdDev(3.75);\n        $pokemonMeta->setCylHeightM(0.912);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.57);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::GRIMER);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ACID_FAST,\n            PokemonMove::POISON_JAB_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DARK_PULSE,\n            PokemonMove::GUNK_SHOT,\n            PokemonMove::SLUDGE_WAVE,\n        )));\n        $pokemonMeta->setNumber(89);\n        self::$POKEMON_META[PokemonId::MUK] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0090_POKEMON_SHELLDER\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SHELLDER);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(60);\n        $pokemonMeta->setCylRadiusM(0.3864);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(116);\n        $pokemonMeta->setDiskRadiusM(0.5796);\n        $pokemonMeta->setCollisionRadiusM(0.336);\n        $pokemonMeta->setPokedexWeightKg(4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.294);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1.2);\n        $pokemonMeta->setModelScale(1.68);\n        $pokemonMeta->setUniqueId(\"V0090_POKEMON_SHELLDER\");\n        $pokemonMeta->setBaseDefense(168);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(0.5);\n        $pokemonMeta->setCylHeightM(0.504);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.504);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ICE_SHARD_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ICY_WIND,\n            PokemonMove::WATER_PULSE,\n            PokemonMove::BUBBLE_BEAM,\n        )));\n        $pokemonMeta->setNumber(90);\n        self::$POKEMON_META[PokemonId::SHELLDER] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0091_POKEMON_CLOYSTER\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SHELLDER);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ICE);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.63);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(186);\n        $pokemonMeta->setDiskRadiusM(0.945);\n        $pokemonMeta->setCollisionRadiusM(0.42);\n        $pokemonMeta->setPokedexWeightKg(132.5);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.54599988);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.84);\n        $pokemonMeta->setUniqueId(\"V0091_POKEMON_CLOYSTER\");\n        $pokemonMeta->setBaseDefense(323);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(16.5625);\n        $pokemonMeta->setCylHeightM(1.05);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.05);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::SHELLDER);\n        $pokemonMeta->setCylGroundM(0.42);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ICE_SHARD_FAST,\n            PokemonMove::FROST_BREATH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ICY_WIND,\n            PokemonMove::BLIZZARD,\n            PokemonMove::HYDRO_PUMP,\n        )));\n        $pokemonMeta->setNumber(91);\n        self::$POKEMON_META[PokemonId::CLOYSTER] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0092_POKEMON_GASTLY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GASTLY);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(60);\n        $pokemonMeta->setCylRadiusM(0.45);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(186);\n        $pokemonMeta->setDiskRadiusM(0.675);\n        $pokemonMeta->setCollisionRadiusM(0.25);\n        $pokemonMeta->setPokedexWeightKg(0.1);\n        $pokemonMeta->setMovementType(MovementType::PSYCHIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GHOST);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3);\n        $pokemonMeta->setMovementTimerS(29);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0092_POKEMON_GASTLY\");\n        $pokemonMeta->setBaseDefense(70);\n        $pokemonMeta->setAttackTimerS(10);\n        $pokemonMeta->setWeightStdDev(0.0125);\n        $pokemonMeta->setCylHeightM(0.8);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.6);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.6);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SUCKER_PUNCH_FAST,\n            PokemonMove::LICK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::DARK_PULSE,\n            PokemonMove::OMINOUS_WIND,\n        )));\n        $pokemonMeta->setNumber(92);\n        self::$POKEMON_META[PokemonId::GASTLY] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0093_POKEMON_HAUNTER\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GASTLY);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1.6);\n        $pokemonMeta->setHeightStdDev(0.2);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.51);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(223);\n        $pokemonMeta->setDiskRadiusM(0.765);\n        $pokemonMeta->setCollisionRadiusM(0.442);\n        $pokemonMeta->setPokedexWeightKg(0.1);\n        $pokemonMeta->setMovementType(MovementType::PSYCHIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GHOST);\n        $pokemonMeta->setCollisionHeadRadiusM(0.442);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.68);\n        $pokemonMeta->setUniqueId(\"V0093_POKEMON_HAUNTER\");\n        $pokemonMeta->setBaseDefense(112);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(0.0125);\n        $pokemonMeta->setCylHeightM(1.088);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(1.156);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::GASTLY);\n        $pokemonMeta->setCylGroundM(0.34);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SHADOW_CLAW_FAST,\n            PokemonMove::LICK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::SHADOW_BALL,\n            PokemonMove::DARK_PULSE,\n        )));\n        $pokemonMeta->setNumber(93);\n        self::$POKEMON_META[PokemonId::HAUNTER] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0094_POKEMON_GENGAR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GASTLY);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.462);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(261);\n        $pokemonMeta->setDiskRadiusM(0.693);\n        $pokemonMeta->setCollisionRadiusM(0.462);\n        $pokemonMeta->setPokedexWeightKg(40.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GHOST);\n        $pokemonMeta->setCollisionHeadRadiusM(0.504);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1.3);\n        $pokemonMeta->setModelScale(0.84);\n        $pokemonMeta->setUniqueId(\"V0094_POKEMON_GENGAR\");\n        $pokemonMeta->setBaseDefense(156);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(5.0625);\n        $pokemonMeta->setCylHeightM(1.176);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.092);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.08);\n        $pokemonMeta->setParentId(PokemonId::HAUNTER);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SUCKER_PUNCH_FAST,\n            PokemonMove::SHADOW_CLAW_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SHADOW_BALL,\n            PokemonMove::DARK_PULSE,\n            PokemonMove::SLUDGE_WAVE,\n        )));\n        $pokemonMeta->setNumber(94);\n        self::$POKEMON_META[PokemonId::GENGAR] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0095_POKEMON_ONIX\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ONIX);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(8.8);\n        $pokemonMeta->setHeightStdDev(1.1);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.658);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(85);\n        $pokemonMeta->setDiskRadiusM(0.987);\n        $pokemonMeta->setCollisionRadiusM(0.658);\n        $pokemonMeta->setPokedexWeightKg(210);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.376);\n        $pokemonMeta->setMovementTimerS(17);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.47);\n        $pokemonMeta->setUniqueId(\"V0095_POKEMON_ONIX\");\n        $pokemonMeta->setBaseDefense(288);\n        $pokemonMeta->setAttackTimerS(6);\n        $pokemonMeta->setWeightStdDev(26.25);\n        $pokemonMeta->setCylHeightM(1.41);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.175);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ROCK_THROW_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::IRON_HEAD,\n            PokemonMove::STONE_EDGE,\n            PokemonMove::ROCK_SLIDE,\n        )));\n        $pokemonMeta->setNumber(95);\n        self::$POKEMON_META[PokemonId::ONIX] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0096_POKEMON_DROWZEE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DROWZEE);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.42);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(89);\n        $pokemonMeta->setDiskRadiusM(0.63);\n        $pokemonMeta->setCollisionRadiusM(0.3675);\n        $pokemonMeta->setPokedexWeightKg(32.4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2625);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1.05);\n        $pokemonMeta->setUniqueId(\"V0096_POKEMON_DROWZEE\");\n        $pokemonMeta->setBaseDefense(158);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(4.05);\n        $pokemonMeta->setCylHeightM(1.05);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.63);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::POUND_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::PSYSHOCK,\n            PokemonMove::PSYBEAM,\n        )));\n        $pokemonMeta->setNumber(96);\n        self::$POKEMON_META[PokemonId::DROWZEE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0097_POKEMON_HYPNO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DROWZEE);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.6);\n        $pokemonMeta->setHeightStdDev(0.2);\n        $pokemonMeta->setBaseStamina(170);\n        $pokemonMeta->setCylRadiusM(0.6225);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(144);\n        $pokemonMeta->setDiskRadiusM(0.9338);\n        $pokemonMeta->setCollisionRadiusM(0.332);\n        $pokemonMeta->setPokedexWeightKg(75.6);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.332);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(0.8);\n        $pokemonMeta->setModelScale(0.83);\n        $pokemonMeta->setUniqueId(\"V0097_POKEMON_HYPNO\");\n        $pokemonMeta->setBaseDefense(215);\n        $pokemonMeta->setAttackTimerS(4);\n        $pokemonMeta->setWeightStdDev(9.45);\n        $pokemonMeta->setCylHeightM(1.328);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.83);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::DROWZEE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::ZEN_HEADBUTT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::SHADOW_BALL,\n            PokemonMove::PSYSHOCK,\n        )));\n        $pokemonMeta->setNumber(97);\n        self::$POKEMON_META[PokemonId::HYPNO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0098_POKEMON_KRABBY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_KRABBY);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.4);\n        $pokemonMeta->setHeightStdDev(0.05);\n        $pokemonMeta->setBaseStamina(60);\n        $pokemonMeta->setCylRadiusM(0.522);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(181);\n        $pokemonMeta->setDiskRadiusM(0.783);\n        $pokemonMeta->setCollisionRadiusM(0.522);\n        $pokemonMeta->setPokedexWeightKg(6.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.261);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.16);\n        $pokemonMeta->setUniqueId(\"V0098_POKEMON_KRABBY\");\n        $pokemonMeta->setBaseDefense(156);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(0.8125);\n        $pokemonMeta->setCylHeightM(0.87);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.87);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::BUBBLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_PULSE,\n            PokemonMove::VICE_GRIP,\n            PokemonMove::BUBBLE_BEAM,\n        )));\n        $pokemonMeta->setNumber(98);\n        self::$POKEMON_META[PokemonId::KRABBY] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0099_POKEMON_KINGLER\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_KRABBY);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.6525);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(240);\n        $pokemonMeta->setDiskRadiusM(0.9788);\n        $pokemonMeta->setCollisionRadiusM(0.6525);\n        $pokemonMeta->setPokedexWeightKg(60);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.32625);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(0.8);\n        $pokemonMeta->setModelScale(0.87);\n        $pokemonMeta->setUniqueId(\"V0099_POKEMON_KINGLER\");\n        $pokemonMeta->setBaseDefense(214);\n        $pokemonMeta->setAttackTimerS(3);\n        $pokemonMeta->setWeightStdDev(7.5);\n        $pokemonMeta->setCylHeightM(1.0005);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.0005);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::KRABBY);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::METAL_CLAW_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_PULSE,\n            PokemonMove::X_SCISSOR,\n            PokemonMove::VICE_GRIP,\n        )));\n        $pokemonMeta->setNumber(99);\n        self::$POKEMON_META[PokemonId::KINGLER] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0100_POKEMON_VOLTORB\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_VOLTORB);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.5);\n        $pokemonMeta->setHeightStdDev(0.0625);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.3375);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(109);\n        $pokemonMeta->setDiskRadiusM(0.5063);\n        $pokemonMeta->setCollisionRadiusM(0.3375);\n        $pokemonMeta->setPokedexWeightKg(10.4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.16875);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1.2);\n        $pokemonMeta->setModelScale(1.35);\n        $pokemonMeta->setUniqueId(\"V0100_POKEMON_VOLTORB\");\n        $pokemonMeta->setBaseDefense(114);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(1.3);\n        $pokemonMeta->setCylHeightM(0.675);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.675);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SPARK_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SIGNAL_BEAM,\n            PokemonMove::THUNDERBOLT,\n            PokemonMove::DISCHARGE,\n        )));\n        $pokemonMeta->setNumber(100);\n        self::$POKEMON_META[PokemonId::VOLTORB] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0101_POKEMON_ELECTRODE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_VOLTORB);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.2);\n        $pokemonMeta->setHeightStdDev(0.15);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.552);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(173);\n        $pokemonMeta->setDiskRadiusM(0.828);\n        $pokemonMeta->setCollisionRadiusM(0.552);\n        $pokemonMeta->setPokedexWeightKg(66.6);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.276);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1.2);\n        $pokemonMeta->setModelScale(0.92);\n        $pokemonMeta->setUniqueId(\"V0101_POKEMON_ELECTRODE\");\n        $pokemonMeta->setBaseDefense(179);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(8.325);\n        $pokemonMeta->setCylHeightM(1.104);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.104);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::VOLTORB);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SPARK_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::HYPER_BEAM,\n            PokemonMove::THUNDERBOLT,\n            PokemonMove::DISCHARGE,\n        )));\n        $pokemonMeta->setNumber(101);\n        self::$POKEMON_META[PokemonId::ELECTRODE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0102_POKEMON_EXEGGCUTE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_EXEGGCUTE);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setPokedexHeightM(0.4);\n        $pokemonMeta->setHeightStdDev(0.05);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.515);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(107);\n        $pokemonMeta->setDiskRadiusM(0.7725);\n        $pokemonMeta->setCollisionRadiusM(0.515);\n        $pokemonMeta->setPokedexWeightKg(2.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2575);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.03);\n        $pokemonMeta->setUniqueId(\"V0102_POKEMON_EXEGGCUTE\");\n        $pokemonMeta->setBaseDefense(140);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(0.3125);\n        $pokemonMeta->setCylHeightM(0.412);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.412);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::SEED_BOMB,\n            PokemonMove::ANCIENT_POWER,\n        )));\n        $pokemonMeta->setNumber(102);\n        self::$POKEMON_META[PokemonId::EXEGGCUTE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0103_POKEMON_EXEGGUTOR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_EXEGGCUTE);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setPokedexHeightM(2);\n        $pokemonMeta->setHeightStdDev(0.25);\n        $pokemonMeta->setBaseStamina(190);\n        $pokemonMeta->setCylRadiusM(0.507);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(233);\n        $pokemonMeta->setDiskRadiusM(0.7605);\n        $pokemonMeta->setCollisionRadiusM(0.507);\n        $pokemonMeta->setPokedexWeightKg(120);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2535);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.78);\n        $pokemonMeta->setUniqueId(\"V0103_POKEMON_EXEGGUTOR\");\n        $pokemonMeta->setBaseDefense(158);\n        $pokemonMeta->setAttackTimerS(3);\n        $pokemonMeta->setWeightStdDev(15);\n        $pokemonMeta->setCylHeightM(1.365);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.365);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::EXEGGCUTE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::ZEN_HEADBUTT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::SEED_BOMB,\n            PokemonMove::SOLAR_BEAM,\n        )));\n        $pokemonMeta->setNumber(103);\n        self::$POKEMON_META[PokemonId::EXEGGUTOR] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0104_POKEMON_CUBONE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CUBONE);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.4);\n        $pokemonMeta->setHeightStdDev(0.05);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.296);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(90);\n        $pokemonMeta->setDiskRadiusM(0.444);\n        $pokemonMeta->setCollisionRadiusM(0.222);\n        $pokemonMeta->setPokedexWeightKg(6.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.222);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.48);\n        $pokemonMeta->setUniqueId(\"V0104_POKEMON_CUBONE\");\n        $pokemonMeta->setBaseDefense(165);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(0.8125);\n        $pokemonMeta->setCylHeightM(0.592);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.37);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SLAP_FAST,\n            PokemonMove::ROCK_SMASH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DIG,\n            PokemonMove::BONE_CLUB,\n            PokemonMove::BULLDOZE,\n        )));\n        $pokemonMeta->setNumber(104);\n        self::$POKEMON_META[PokemonId::CUBONE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0105_POKEMON_MAROWAK\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CUBONE);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.35);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(144);\n        $pokemonMeta->setDiskRadiusM(0.525);\n        $pokemonMeta->setCollisionRadiusM(0.25);\n        $pokemonMeta->setPokedexWeightKg(45);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.25);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(0.85);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0105_POKEMON_MAROWAK\");\n        $pokemonMeta->setBaseDefense(200);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(5.625);\n        $pokemonMeta->setCylHeightM(1);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.75);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::CUBONE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SLAP_FAST,\n            PokemonMove::ROCK_SMASH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DIG,\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::BONE_CLUB,\n        )));\n        $pokemonMeta->setNumber(105);\n        self::$POKEMON_META[PokemonId::MAROWAK] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0106_POKEMON_HITMONLEE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HITMONLEE);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.415);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(224);\n        $pokemonMeta->setDiskRadiusM(0.6225);\n        $pokemonMeta->setCollisionRadiusM(0.415);\n        $pokemonMeta->setPokedexWeightKg(49.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2075);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(0.8);\n        $pokemonMeta->setModelScale(0.83);\n        $pokemonMeta->setUniqueId(\"V0106_POKEMON_HITMONLEE\");\n        $pokemonMeta->setBaseDefense(211);\n        $pokemonMeta->setAttackTimerS(4);\n        $pokemonMeta->setWeightStdDev(6.225);\n        $pokemonMeta->setCylHeightM(1.245);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.245);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::LOW_KICK_FAST,\n            PokemonMove::ROCK_SMASH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STOMP,\n            PokemonMove::STONE_EDGE,\n            PokemonMove::LOW_SWEEP,\n        )));\n        $pokemonMeta->setNumber(106);\n        self::$POKEMON_META[PokemonId::HITMONLEE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0107_POKEMON_HITMONCHAN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HITMONCHAN);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.459);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(193);\n        $pokemonMeta->setDiskRadiusM(0.6885);\n        $pokemonMeta->setCollisionRadiusM(0.3315);\n        $pokemonMeta->setPokedexWeightKg(50.2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setCollisionHeadRadiusM(0.255);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1.1);\n        $pokemonMeta->setModelScale(1.02);\n        $pokemonMeta->setUniqueId(\"V0107_POKEMON_HITMONCHAN\");\n        $pokemonMeta->setBaseDefense(212);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(6.275);\n        $pokemonMeta->setCylHeightM(1.428);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.02);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BULLET_PUNCH_FAST,\n            PokemonMove::ROCK_SMASH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER_PUNCH,\n            PokemonMove::FIRE_PUNCH,\n            PokemonMove::BRICK_BREAK,\n            PokemonMove::ICE_PUNCH,\n        )));\n        $pokemonMeta->setNumber(107);\n        self::$POKEMON_META[PokemonId::HITMONCHAN] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0108_POKEMON_LICKITUNG\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_LICKITUNG);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.2);\n        $pokemonMeta->setHeightStdDev(0.15);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.46);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(108);\n        $pokemonMeta->setDiskRadiusM(0.69);\n        $pokemonMeta->setCollisionRadiusM(0.46);\n        $pokemonMeta->setPokedexWeightKg(65.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.253);\n        $pokemonMeta->setMovementTimerS(23);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.92);\n        $pokemonMeta->setUniqueId(\"V0108_POKEMON_LICKITUNG\");\n        $pokemonMeta->setBaseDefense(137);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(8.1875);\n        $pokemonMeta->setCylHeightM(1.104);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.92);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ZEN_HEADBUTT_FAST,\n            PokemonMove::LICK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STOMP,\n            PokemonMove::POWER_WHIP,\n            PokemonMove::HYPER_BEAM,\n        )));\n        $pokemonMeta->setNumber(108);\n        self::$POKEMON_META[PokemonId::LICKITUNG] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0109_POKEMON_KOFFING\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_KOFFING);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.6);\n        $pokemonMeta->setHeightStdDev(0.075);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.48);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(119);\n        $pokemonMeta->setDiskRadiusM(0.72);\n        $pokemonMeta->setCollisionRadiusM(0.36);\n        $pokemonMeta->setPokedexWeightKg(1);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.6);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.2);\n        $pokemonMeta->setUniqueId(\"V0109_POKEMON_KOFFING\");\n        $pokemonMeta->setBaseDefense(164);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(0.125);\n        $pokemonMeta->setCylHeightM(0.72);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.66);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.6);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ACID_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::DARK_PULSE,\n            PokemonMove::SLUDGE,\n        )));\n        $pokemonMeta->setNumber(109);\n        self::$POKEMON_META[PokemonId::KOFFING] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0110_POKEMON_WEEZING\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_KOFFING);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.2);\n        $pokemonMeta->setHeightStdDev(0.15);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.62);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(174);\n        $pokemonMeta->setDiskRadiusM(0.93);\n        $pokemonMeta->setCollisionRadiusM(0.682);\n        $pokemonMeta->setPokedexWeightKg(9.5);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.465);\n        $pokemonMeta->setMovementTimerS(4);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.24);\n        $pokemonMeta->setUniqueId(\"V0110_POKEMON_WEEZING\");\n        $pokemonMeta->setBaseDefense(221);\n        $pokemonMeta->setAttackTimerS(11);\n        $pokemonMeta->setWeightStdDev(1.1875);\n        $pokemonMeta->setCylHeightM(0.744);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.744);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::KOFFING);\n        $pokemonMeta->setCylGroundM(0.62);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ACID_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::SHADOW_BALL,\n            PokemonMove::DARK_PULSE,\n        )));\n        $pokemonMeta->setNumber(110);\n        self::$POKEMON_META[PokemonId::WEEZING] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0111_POKEMON_RHYHORN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_RHYHORN);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.5);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(140);\n        $pokemonMeta->setDiskRadiusM(0.75);\n        $pokemonMeta->setCollisionRadiusM(0.5);\n        $pokemonMeta->setPokedexWeightKg(115);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0111_POKEMON_RHYHORN\");\n        $pokemonMeta->setBaseDefense(157);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(14.375);\n        $pokemonMeta->setCylHeightM(0.85);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.85);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SLAP_FAST,\n            PokemonMove::ROCK_SMASH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STOMP,\n            PokemonMove::BULLDOZE,\n            PokemonMove::HORN_ATTACK,\n        )));\n        $pokemonMeta->setNumber(111);\n        self::$POKEMON_META[PokemonId::RHYHORN] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0112_POKEMON_RHYDON\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_RHYHORN);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setPokedexHeightM(1.9);\n        $pokemonMeta->setHeightStdDev(0.2375);\n        $pokemonMeta->setBaseStamina(210);\n        $pokemonMeta->setCylRadiusM(0.79);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(222);\n        $pokemonMeta->setDiskRadiusM(1.185);\n        $pokemonMeta->setCollisionRadiusM(0.5925);\n        $pokemonMeta->setPokedexWeightKg(120);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.395);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.79);\n        $pokemonMeta->setUniqueId(\"V0112_POKEMON_RHYDON\");\n        $pokemonMeta->setBaseDefense(206);\n        $pokemonMeta->setAttackTimerS(3);\n        $pokemonMeta->setWeightStdDev(15);\n        $pokemonMeta->setCylHeightM(1.343);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.185);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::RHYHORN);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SLAP_FAST,\n            PokemonMove::ROCK_SMASH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STONE_EDGE,\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::MEGAHORN,\n        )));\n        $pokemonMeta->setNumber(112);\n        self::$POKEMON_META[PokemonId::RHYDON] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0113_POKEMON_CHANSEY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CHANSEY);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.1);\n        $pokemonMeta->setHeightStdDev(0.1375);\n        $pokemonMeta->setBaseStamina(500);\n        $pokemonMeta->setCylRadiusM(0.48);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(60);\n        $pokemonMeta->setDiskRadiusM(0.72);\n        $pokemonMeta->setCollisionRadiusM(0.48);\n        $pokemonMeta->setPokedexWeightKg(34.6);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.24);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.96);\n        $pokemonMeta->setUniqueId(\"V0113_POKEMON_CHANSEY\");\n        $pokemonMeta->setBaseDefense(176);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(4.325);\n        $pokemonMeta->setCylHeightM(1.056);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.056);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POUND_FAST,\n            PokemonMove::ZEN_HEADBUTT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::DAZZLING_GLEAM,\n            PokemonMove::PSYBEAM,\n        )));\n        $pokemonMeta->setNumber(113);\n        self::$POKEMON_META[PokemonId::CHANSEY] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0114_POKEMON_TANGELA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TANGELA);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.73);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(183);\n        $pokemonMeta->setDiskRadiusM(1.095);\n        $pokemonMeta->setCollisionRadiusM(0.5);\n        $pokemonMeta->setPokedexWeightKg(35);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.365);\n        $pokemonMeta->setMovementTimerS(4);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0114_POKEMON_TANGELA\");\n        $pokemonMeta->setBaseDefense(205);\n        $pokemonMeta->setAttackTimerS(11);\n        $pokemonMeta->setWeightStdDev(4.375);\n        $pokemonMeta->setCylHeightM(1);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.9);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::VINE_WHIP_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::POWER_WHIP,\n            PokemonMove::SLUDGE_BOMB,\n            PokemonMove::SOLAR_BEAM,\n        )));\n        $pokemonMeta->setNumber(114);\n        self::$POKEMON_META[PokemonId::TANGELA] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0115_POKEMON_KANGASKHAN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_KANGASKHAN);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(2.2);\n        $pokemonMeta->setHeightStdDev(0.275);\n        $pokemonMeta->setBaseStamina(210);\n        $pokemonMeta->setCylRadiusM(0.576);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(181);\n        $pokemonMeta->setDiskRadiusM(0.864);\n        $pokemonMeta->setCollisionRadiusM(0.504);\n        $pokemonMeta->setPokedexWeightKg(80);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.36);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(0.7);\n        $pokemonMeta->setModelScale(0.72);\n        $pokemonMeta->setUniqueId(\"V0115_POKEMON_KANGASKHAN\");\n        $pokemonMeta->setBaseDefense(165);\n        $pokemonMeta->setAttackTimerS(4);\n        $pokemonMeta->setWeightStdDev(10);\n        $pokemonMeta->setCylHeightM(1.584);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.26);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SLAP_FAST,\n            PokemonMove::LOW_KICK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STOMP,\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::BRICK_BREAK,\n        )));\n        $pokemonMeta->setNumber(115);\n        self::$POKEMON_META[PokemonId::KANGASKHAN] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0116_POKEMON_HORSEA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HORSEA);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.4);\n        $pokemonMeta->setHeightStdDev(0.05);\n        $pokemonMeta->setBaseStamina(60);\n        $pokemonMeta->setCylRadiusM(0.25);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(129);\n        $pokemonMeta->setDiskRadiusM(0.2775);\n        $pokemonMeta->setCollisionRadiusM(0.148);\n        $pokemonMeta->setPokedexWeightKg(8);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.185);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.48);\n        $pokemonMeta->setUniqueId(\"V0116_POKEMON_HORSEA\");\n        $pokemonMeta->setBaseDefense(125);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(1);\n        $pokemonMeta->setCylHeightM(0.74);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.444);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.185);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_GUN_FAST,\n            PokemonMove::BUBBLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::FLASH_CANNON,\n            PokemonMove::BUBBLE_BEAM,\n            PokemonMove::DRAGON_PULSE,\n        )));\n        $pokemonMeta->setNumber(116);\n        self::$POKEMON_META[PokemonId::HORSEA] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0117_POKEMON_SEADRA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HORSEA);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.2);\n        $pokemonMeta->setHeightStdDev(0.15);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.46);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(187);\n        $pokemonMeta->setDiskRadiusM(0.69);\n        $pokemonMeta->setCollisionRadiusM(0.322);\n        $pokemonMeta->setPokedexWeightKg(25);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.414);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.92);\n        $pokemonMeta->setUniqueId(\"V0117_POKEMON_SEADRA\");\n        $pokemonMeta->setBaseDefense(182);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(3.125);\n        $pokemonMeta->setCylHeightM(1.15);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.46);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::HORSEA);\n        $pokemonMeta->setCylGroundM(0.46);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::DRAGON_BREATH_FAST,\n            PokemonMove::WATER_GUN_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BLIZZARD,\n            PokemonMove::HYDRO_PUMP,\n            PokemonMove::DRAGON_PULSE,\n        )));\n        $pokemonMeta->setNumber(117);\n        self::$POKEMON_META[PokemonId::SEADRA] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0118_POKEMON_GOLDEEN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GOLDEEN);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.6);\n        $pokemonMeta->setHeightStdDev(0.075);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.27);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(123);\n        $pokemonMeta->setDiskRadiusM(0.405);\n        $pokemonMeta->setCollisionRadiusM(0.135);\n        $pokemonMeta->setPokedexWeightKg(15);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.16875);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.35);\n        $pokemonMeta->setUniqueId(\"V0118_POKEMON_GOLDEEN\");\n        $pokemonMeta->setBaseDefense(115);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(1.875);\n        $pokemonMeta->setCylHeightM(0.3375);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.16875);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.3375);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::PECK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_PULSE,\n            PokemonMove::HORN_ATTACK,\n            PokemonMove::AQUA_TAIL,\n        )));\n        $pokemonMeta->setNumber(118);\n        self::$POKEMON_META[PokemonId::GOLDEEN] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0119_POKEMON_SEAKING\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GOLDEEN);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.396);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(175);\n        $pokemonMeta->setDiskRadiusM(0.594);\n        $pokemonMeta->setCollisionRadiusM(0.044);\n        $pokemonMeta->setPokedexWeightKg(39);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.242);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.88);\n        $pokemonMeta->setUniqueId(\"V0119_POKEMON_SEAKING\");\n        $pokemonMeta->setBaseDefense(154);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(4.875);\n        $pokemonMeta->setCylHeightM(0.748);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.044);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::GOLDEEN);\n        $pokemonMeta->setCylGroundM(0.33);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_JAB_FAST,\n            PokemonMove::PECK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ICY_WIND,\n            PokemonMove::MEGAHORN,\n            PokemonMove::DRILL_RUN,\n        )));\n        $pokemonMeta->setNumber(119);\n        self::$POKEMON_META[PokemonId::SEAKING] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0120_POKEMON_STARYU\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_STARYU);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.8);\n        $pokemonMeta->setHeightStdDev(0.1);\n        $pokemonMeta->setBaseStamina(60);\n        $pokemonMeta->setCylRadiusM(0.4125);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(137);\n        $pokemonMeta->setDiskRadiusM(0.6188);\n        $pokemonMeta->setCollisionRadiusM(0.4125);\n        $pokemonMeta->setPokedexWeightKg(34.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.20625);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1.35);\n        $pokemonMeta->setModelScale(1.1);\n        $pokemonMeta->setUniqueId(\"V0120_POKEMON_STARYU\");\n        $pokemonMeta->setBaseDefense(112);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(4.3125);\n        $pokemonMeta->setCylHeightM(0.88000011);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.88000011);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.4);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_GUN_FAST,\n            PokemonMove::QUICK_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::POWER_GEM,\n            PokemonMove::BUBBLE_BEAM,\n            PokemonMove::SWIFT,\n        )));\n        $pokemonMeta->setNumber(120);\n        self::$POKEMON_META[PokemonId::STARYU] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0121_POKEMON_STARMIE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_STARYU);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setPokedexHeightM(1.1);\n        $pokemonMeta->setHeightStdDev(0.1375);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.485);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(210);\n        $pokemonMeta->setDiskRadiusM(0.7275);\n        $pokemonMeta->setCollisionRadiusM(0.485);\n        $pokemonMeta->setPokedexWeightKg(80);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2425);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1.6);\n        $pokemonMeta->setModelScale(0.97);\n        $pokemonMeta->setUniqueId(\"V0121_POKEMON_STARMIE\");\n        $pokemonMeta->setBaseDefense(184);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(10);\n        $pokemonMeta->setCylHeightM(1.067);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.067);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::STARYU);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_GUN_FAST,\n            PokemonMove::QUICK_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYBEAM,\n            PokemonMove::HYDRO_PUMP,\n            PokemonMove::POWER_GEM,\n        )));\n        $pokemonMeta->setNumber(121);\n        self::$POKEMON_META[PokemonId::STARMIE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0122_POKEMON_MR_MIME\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MR_MIME);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.445);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(192);\n        $pokemonMeta->setDiskRadiusM(0.6675);\n        $pokemonMeta->setCollisionRadiusM(0.267);\n        $pokemonMeta->setPokedexWeightKg(54.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.267);\n        $pokemonMeta->setMovementTimerS(5);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.89);\n        $pokemonMeta->setUniqueId(\"V0122_POKEMON_MR_MIME\");\n        $pokemonMeta->setBaseDefense(233);\n        $pokemonMeta->setAttackTimerS(14);\n        $pokemonMeta->setWeightStdDev(6.8125);\n        $pokemonMeta->setCylHeightM(1.157);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.6675);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::ZEN_HEADBUTT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::SHADOW_BALL,\n            PokemonMove::PSYBEAM,\n        )));\n        $pokemonMeta->setNumber(122);\n        self::$POKEMON_META[PokemonId::MR_MIME] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0123_POKEMON_SCYTHER\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SCYTHER);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.76);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(218);\n        $pokemonMeta->setDiskRadiusM(1.14);\n        $pokemonMeta->setCollisionRadiusM(0.4);\n        $pokemonMeta->setPokedexWeightKg(56);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.8);\n        $pokemonMeta->setUniqueId(\"V0123_POKEMON_SCYTHER\");\n        $pokemonMeta->setBaseDefense(170);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(7);\n        $pokemonMeta->setCylHeightM(1.2);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.4);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::STEEL_WING_FAST,\n            PokemonMove::FURY_CUTTER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BUG_BUZZ,\n            PokemonMove::X_SCISSOR,\n            PokemonMove::NIGHT_SLASH,\n        )));\n        $pokemonMeta->setNumber(123);\n        self::$POKEMON_META[PokemonId::SCYTHER] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0124_POKEMON_JYNX\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_JYNX);\n        $pokemonMeta->setPokemonClass(PokemonClass::COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.6525);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(223);\n        $pokemonMeta->setDiskRadiusM(0.9788);\n        $pokemonMeta->setCollisionRadiusM(0.435);\n        $pokemonMeta->setPokedexWeightKg(40.6);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ICE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.522);\n        $pokemonMeta->setMovementTimerS(4);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.87);\n        $pokemonMeta->setUniqueId(\"V0124_POKEMON_JYNX\");\n        $pokemonMeta->setBaseDefense(182);\n        $pokemonMeta->setAttackTimerS(11);\n        $pokemonMeta->setWeightStdDev(5.075);\n        $pokemonMeta->setCylHeightM(1.218);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.87);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POUND_FAST,\n            PokemonMove::FROST_BREATH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYSHOCK,\n            PokemonMove::DRAINING_KISS,\n            PokemonMove::ICE_PUNCH,\n        )));\n        $pokemonMeta->setNumber(124);\n        self::$POKEMON_META[PokemonId::JYNX] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0125_POKEMON_ELECTABUZZ\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ELECTABUZZ);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.1);\n        $pokemonMeta->setHeightStdDev(0.1375);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.5635);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(198);\n        $pokemonMeta->setDiskRadiusM(0.8453);\n        $pokemonMeta->setCollisionRadiusM(0.392);\n        $pokemonMeta->setPokedexWeightKg(30);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.28175);\n        $pokemonMeta->setMovementTimerS(6);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.98);\n        $pokemonMeta->setUniqueId(\"V0125_POKEMON_ELECTABUZZ\");\n        $pokemonMeta->setBaseDefense(173);\n        $pokemonMeta->setAttackTimerS(17);\n        $pokemonMeta->setWeightStdDev(3.75);\n        $pokemonMeta->setCylHeightM(0.98);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.735);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::LOW_KICK_FAST,\n            PokemonMove::THUNDER_SHOCK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER_PUNCH,\n            PokemonMove::THUNDER,\n            PokemonMove::THUNDERBOLT,\n        )));\n        $pokemonMeta->setNumber(125);\n        self::$POKEMON_META[PokemonId::ELECTABUZZ] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0126_POKEMON_MAGMAR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MAGMAR);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.66);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(206);\n        $pokemonMeta->setDiskRadiusM(0.99);\n        $pokemonMeta->setCollisionRadiusM(0.44);\n        $pokemonMeta->setPokedexWeightKg(44.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.33);\n        $pokemonMeta->setMovementTimerS(14);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.88);\n        $pokemonMeta->setUniqueId(\"V0126_POKEMON_MAGMAR\");\n        $pokemonMeta->setBaseDefense(169);\n        $pokemonMeta->setAttackTimerS(5);\n        $pokemonMeta->setWeightStdDev(5.5625);\n        $pokemonMeta->setCylHeightM(1.144);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.88);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::KARATE_CHOP_FAST,\n            PokemonMove::EMBER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::FIRE_PUNCH,\n            PokemonMove::FLAMETHROWER,\n            PokemonMove::FIRE_BLAST,\n        )));\n        $pokemonMeta->setNumber(126);\n        self::$POKEMON_META[PokemonId::MAGMAR] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0127_POKEMON_PINSIR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PINSIR);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.348);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(232);\n        $pokemonMeta->setDiskRadiusM(0.522);\n        $pokemonMeta->setCollisionRadiusM(0.348);\n        $pokemonMeta->setPokedexWeightKg(55);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.348);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.87);\n        $pokemonMeta->setUniqueId(\"V0127_POKEMON_PINSIR\");\n        $pokemonMeta->setBaseDefense(197);\n        $pokemonMeta->setAttackTimerS(3);\n        $pokemonMeta->setWeightStdDev(6.875);\n        $pokemonMeta->setCylHeightM(1.131);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.87);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::FURY_CUTTER_FAST,\n            PokemonMove::ROCK_SMASH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::SUBMISSION,\n            PokemonMove::X_SCISSOR,\n            PokemonMove::VICE_GRIP,\n        )));\n        $pokemonMeta->setNumber(127);\n        self::$POKEMON_META[PokemonId::PINSIR] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0128_POKEMON_TAUROS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TAUROS);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.5742);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(198);\n        $pokemonMeta->setDiskRadiusM(0.8613);\n        $pokemonMeta->setCollisionRadiusM(0.435);\n        $pokemonMeta->setPokedexWeightKg(88.4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2871);\n        $pokemonMeta->setMovementTimerS(4);\n        $pokemonMeta->setJumpTimeS(1.2);\n        $pokemonMeta->setModelScale(0.87);\n        $pokemonMeta->setUniqueId(\"V0128_POKEMON_TAUROS\");\n        $pokemonMeta->setBaseDefense(197);\n        $pokemonMeta->setAttackTimerS(11);\n        $pokemonMeta->setWeightStdDev(11.05);\n        $pokemonMeta->setCylHeightM(1.19625);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.19625);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.24);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ZEN_HEADBUTT_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::IRON_HEAD,\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::HORN_ATTACK,\n        )));\n        $pokemonMeta->setNumber(128);\n        self::$POKEMON_META[PokemonId::TAUROS] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0129_POKEMON_MAGIKARP\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MAGIKARP);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.9);\n        $pokemonMeta->setHeightStdDev(0.1125);\n        $pokemonMeta->setBaseStamina(40);\n        $pokemonMeta->setCylRadiusM(0.428);\n        $pokemonMeta->setBaseFleeRate(0.15);\n        $pokemonMeta->setBaseAttack(29);\n        $pokemonMeta->setDiskRadiusM(0.642);\n        $pokemonMeta->setCollisionRadiusM(0.2675);\n        $pokemonMeta->setPokedexWeightKg(10);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.321);\n        $pokemonMeta->setMovementTimerS(3600);\n        $pokemonMeta->setJumpTimeS(1.3);\n        $pokemonMeta->setModelScale(1.07);\n        $pokemonMeta->setUniqueId(\"V0129_POKEMON_MAGIKARP\");\n        $pokemonMeta->setBaseDefense(102);\n        $pokemonMeta->setAttackTimerS(3600);\n        $pokemonMeta->setWeightStdDev(1.25);\n        $pokemonMeta->setCylHeightM(0.535);\n        $pokemonMeta->setCandyToEvolve(400);\n        $pokemonMeta->setCollisionHeightM(0.4815);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.56);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SPLASH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(129);\n        self::$POKEMON_META[PokemonId::MAGIKARP] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0130_POKEMON_GYARADOS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MAGIKARP);\n        $pokemonMeta->setPokemonClass(PokemonClass::EPIC);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(6.5);\n        $pokemonMeta->setHeightStdDev(0.8125);\n        $pokemonMeta->setBaseStamina(190);\n        $pokemonMeta->setCylRadiusM(0.48);\n        $pokemonMeta->setBaseFleeRate(0.07);\n        $pokemonMeta->setBaseAttack(237);\n        $pokemonMeta->setDiskRadiusM(0.72);\n        $pokemonMeta->setCollisionRadiusM(0.24);\n        $pokemonMeta->setPokedexWeightKg(235);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.36);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.48);\n        $pokemonMeta->setUniqueId(\"V0130_POKEMON_GYARADOS\");\n        $pokemonMeta->setBaseDefense(197);\n        $pokemonMeta->setAttackTimerS(3);\n        $pokemonMeta->setWeightStdDev(29.375);\n        $pokemonMeta->setCylHeightM(1.2);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.48);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.08);\n        $pokemonMeta->setParentId(PokemonId::MAGIKARP);\n        $pokemonMeta->setCylGroundM(0.48);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::DRAGON_BREATH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::TWISTER,\n            PokemonMove::HYDRO_PUMP,\n            PokemonMove::DRAGON_PULSE,\n        )));\n        $pokemonMeta->setNumber(130);\n        self::$POKEMON_META[PokemonId::GYARADOS] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0131_POKEMON_LAPRAS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_LAPRAS);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ICE);\n        $pokemonMeta->setPokedexHeightM(2.5);\n        $pokemonMeta->setHeightStdDev(0.3125);\n        $pokemonMeta->setBaseStamina(260);\n        $pokemonMeta->setCylRadiusM(0.7);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(186);\n        $pokemonMeta->setDiskRadiusM(1.05);\n        $pokemonMeta->setCollisionRadiusM(0.525);\n        $pokemonMeta->setPokedexWeightKg(220);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.35);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1.2);\n        $pokemonMeta->setModelScale(0.7);\n        $pokemonMeta->setUniqueId(\"V0131_POKEMON_LAPRAS\");\n        $pokemonMeta->setBaseDefense(190);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(27.5);\n        $pokemonMeta->setCylHeightM(1.75);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.7);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ICE_SHARD_FAST,\n            PokemonMove::FROST_BREATH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BLIZZARD,\n            PokemonMove::ICE_BEAM,\n            PokemonMove::DRAGON_PULSE,\n        )));\n        $pokemonMeta->setNumber(131);\n        self::$POKEMON_META[PokemonId::LAPRAS] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0132_POKEMON_DITTO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DITTO);\n        $pokemonMeta->setPokemonClass(PokemonClass::EPIC);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(96);\n        $pokemonMeta->setCylRadiusM(0.4025);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(91);\n        $pokemonMeta->setDiskRadiusM(0.6038);\n        $pokemonMeta->setCollisionRadiusM(0.4025);\n        $pokemonMeta->setPokedexWeightKg(4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.20125);\n        $pokemonMeta->setMovementTimerS(3600);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.61);\n        $pokemonMeta->setUniqueId(\"V0132_POKEMON_DITTO\");\n        $pokemonMeta->setBaseDefense(91);\n        $pokemonMeta->setAttackTimerS(3600);\n        $pokemonMeta->setWeightStdDev(0.5);\n        $pokemonMeta->setCylHeightM(0.52325);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.52325);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POUND_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(132);\n        self::$POKEMON_META[PokemonId::DITTO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0133_POKEMON_EEVEE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_EEVEE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_COMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.42);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(104);\n        $pokemonMeta->setDiskRadiusM(0.63);\n        $pokemonMeta->setCollisionRadiusM(0.252);\n        $pokemonMeta->setPokedexWeightKg(6.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.252);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(1.35);\n        $pokemonMeta->setModelScale(1.68);\n        $pokemonMeta->setUniqueId(\"V0133_POKEMON_EEVEE\");\n        $pokemonMeta->setBaseDefense(121);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.8125);\n        $pokemonMeta->setCylHeightM(0.504);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.336);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n            PokemonMove::QUICK_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DIG,\n            PokemonMove::SWIFT,\n            PokemonMove::BODY_SLAM,\n        )));\n        $pokemonMeta->setNumber(133);\n        self::$POKEMON_META[PokemonId::EEVEE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0134_POKEMON_VAPOREON\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_EEVEE);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(260);\n        $pokemonMeta->setCylRadiusM(0.3465);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(205);\n        $pokemonMeta->setDiskRadiusM(0.5198);\n        $pokemonMeta->setCollisionRadiusM(0.21);\n        $pokemonMeta->setPokedexWeightKg(29);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.2625);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.05);\n        $pokemonMeta->setUniqueId(\"V0134_POKEMON_VAPOREON\");\n        $pokemonMeta->setBaseDefense(177);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(3.625);\n        $pokemonMeta->setCylHeightM(0.94499987);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.525);\n        $pokemonMeta->setShoulderModeScale(0.4);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::EEVEE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_GUN_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_PULSE,\n            PokemonMove::HYDRO_PUMP,\n            PokemonMove::AQUA_TAIL,\n        )));\n        $pokemonMeta->setNumber(134);\n        self::$POKEMON_META[PokemonId::VAPOREON] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0135_POKEMON_JOLTEON\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_EEVEE);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.8);\n        $pokemonMeta->setHeightStdDev(0.1);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.33);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(232);\n        $pokemonMeta->setDiskRadiusM(0.495);\n        $pokemonMeta->setCollisionRadiusM(0.22);\n        $pokemonMeta->setPokedexWeightKg(24.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.22);\n        $pokemonMeta->setMovementTimerS(4);\n        $pokemonMeta->setJumpTimeS(1.3);\n        $pokemonMeta->setModelScale(1.1);\n        $pokemonMeta->setUniqueId(\"V0135_POKEMON_JOLTEON\");\n        $pokemonMeta->setBaseDefense(201);\n        $pokemonMeta->setAttackTimerS(11);\n        $pokemonMeta->setWeightStdDev(3.0625);\n        $pokemonMeta->setCylHeightM(0.88000011);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.55);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::EEVEE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER_SHOCK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER,\n            PokemonMove::THUNDERBOLT,\n            PokemonMove::DISCHARGE,\n        )));\n        $pokemonMeta->setNumber(135);\n        self::$POKEMON_META[PokemonId::JOLTEON] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0136_POKEMON_FLAREON\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_EEVEE);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.9);\n        $pokemonMeta->setHeightStdDev(0.1125);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.3045);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(246);\n        $pokemonMeta->setDiskRadiusM(0.4568);\n        $pokemonMeta->setCollisionRadiusM(0.2175);\n        $pokemonMeta->setPokedexWeightKg(25);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.19575);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1.35);\n        $pokemonMeta->setModelScale(0.87);\n        $pokemonMeta->setUniqueId(\"V0136_POKEMON_FLAREON\");\n        $pokemonMeta->setBaseDefense(204);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(3.125);\n        $pokemonMeta->setCylHeightM(0.783);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.522);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::EEVEE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::EMBER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::FLAMETHROWER,\n            PokemonMove::HEAT_WAVE,\n            PokemonMove::FIRE_BLAST,\n        )));\n        $pokemonMeta->setNumber(136);\n        self::$POKEMON_META[PokemonId::FLAREON] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0137_POKEMON_PORYGON\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PORYGON);\n        $pokemonMeta->setPokemonClass(PokemonClass::EPIC);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.8);\n        $pokemonMeta->setHeightStdDev(0.1);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.55);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(153);\n        $pokemonMeta->setDiskRadiusM(0.825);\n        $pokemonMeta->setCollisionRadiusM(0.385);\n        $pokemonMeta->setPokedexWeightKg(36.5);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.33);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.1);\n        $pokemonMeta->setUniqueId(\"V0137_POKEMON_PORYGON\");\n        $pokemonMeta->setBaseDefense(139);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(4.5625);\n        $pokemonMeta->setCylHeightM(0.93500012);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.55);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.55);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n            PokemonMove::QUICK_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DISCHARGE,\n            PokemonMove::PSYBEAM,\n            PokemonMove::SIGNAL_BEAM,\n        )));\n        $pokemonMeta->setNumber(137);\n        self::$POKEMON_META[PokemonId::PORYGON] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0138_POKEMON_OMANYTE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_OMANYTE);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setPokedexHeightM(0.4);\n        $pokemonMeta->setHeightStdDev(0.05);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.222);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(155);\n        $pokemonMeta->setDiskRadiusM(0.333);\n        $pokemonMeta->setCollisionRadiusM(0.222);\n        $pokemonMeta->setPokedexWeightKg(7.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.111);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1.3);\n        $pokemonMeta->setModelScale(1.48);\n        $pokemonMeta->setUniqueId(\"V0138_POKEMON_OMANYTE\");\n        $pokemonMeta->setBaseDefense(174);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(0.9375);\n        $pokemonMeta->setCylHeightM(0.592);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.592);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::WATER_GUN_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ROCK_TOMB,\n            PokemonMove::ANCIENT_POWER,\n            PokemonMove::BRINE,\n        )));\n        $pokemonMeta->setNumber(138);\n        self::$POKEMON_META[PokemonId::OMANYTE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0139_POKEMON_OMASTAR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_OMANYTE);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setPokedexHeightM(1);\n        $pokemonMeta->setHeightStdDev(0.125);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.375);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(207);\n        $pokemonMeta->setDiskRadiusM(0.5625);\n        $pokemonMeta->setCollisionRadiusM(0.25);\n        $pokemonMeta->setPokedexWeightKg(35);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.1875);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0139_POKEMON_OMASTAR\");\n        $pokemonMeta->setBaseDefense(227);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(4.375);\n        $pokemonMeta->setCylHeightM(1);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.9);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::OMANYTE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ROCK_THROW_FAST,\n            PokemonMove::WATER_GUN_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::HYDRO_PUMP,\n            PokemonMove::ANCIENT_POWER,\n            PokemonMove::ROCK_SLIDE,\n        )));\n        $pokemonMeta->setNumber(139);\n        self::$POKEMON_META[PokemonId::OMASTAR] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0140_POKEMON_KABUTO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_KABUTO);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setPokedexHeightM(0.5);\n        $pokemonMeta->setHeightStdDev(0.0625);\n        $pokemonMeta->setBaseStamina(60);\n        $pokemonMeta->setCylRadiusM(0.3375);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(148);\n        $pokemonMeta->setDiskRadiusM(0.5063);\n        $pokemonMeta->setCollisionRadiusM(0.3375);\n        $pokemonMeta->setPokedexWeightKg(11.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.16875);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(0.9);\n        $pokemonMeta->setModelScale(1.35);\n        $pokemonMeta->setUniqueId(\"V0140_POKEMON_KABUTO\");\n        $pokemonMeta->setBaseDefense(162);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(1.4375);\n        $pokemonMeta->setCylHeightM(0.50625);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.50625);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::SCRATCH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ANCIENT_POWER,\n            PokemonMove::AQUA_JET,\n            PokemonMove::ROCK_TOMB,\n        )));\n        $pokemonMeta->setNumber(140);\n        self::$POKEMON_META[PokemonId::KABUTO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0141_POKEMON_KABUTOPS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_KABUTO);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.455);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(220);\n        $pokemonMeta->setDiskRadiusM(0.6825);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(40.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.91);\n        $pokemonMeta->setUniqueId(\"V0141_POKEMON_KABUTOPS\");\n        $pokemonMeta->setBaseDefense(203);\n        $pokemonMeta->setAttackTimerS(4);\n        $pokemonMeta->setWeightStdDev(5.0625);\n        $pokemonMeta->setCylHeightM(1.1375);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::KABUTO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::MUD_SHOT_FAST,\n            PokemonMove::FURY_CUTTER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STONE_EDGE,\n            PokemonMove::WATER_PULSE,\n            PokemonMove::ANCIENT_POWER,\n        )));\n        $pokemonMeta->setNumber(141);\n        self::$POKEMON_META[PokemonId::KABUTOPS] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0142_POKEMON_AERODACTYL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_AERODACTYL);\n        $pokemonMeta->setPokemonClass(PokemonClass::VERY_RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.8);\n        $pokemonMeta->setHeightStdDev(0.225);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.399);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(221);\n        $pokemonMeta->setDiskRadiusM(0.5985);\n        $pokemonMeta->setCollisionRadiusM(0.285);\n        $pokemonMeta->setPokedexWeightKg(59);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.285);\n        $pokemonMeta->setMovementTimerS(5);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.57);\n        $pokemonMeta->setUniqueId(\"V0142_POKEMON_AERODACTYL\");\n        $pokemonMeta->setBaseDefense(164);\n        $pokemonMeta->setAttackTimerS(14);\n        $pokemonMeta->setWeightStdDev(7.375);\n        $pokemonMeta->setCylHeightM(0.9975);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.9975);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.855);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BITE_FAST,\n            PokemonMove::STEEL_WING_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::IRON_HEAD,\n            PokemonMove::HYPER_BEAM,\n            PokemonMove::ANCIENT_POWER,\n        )));\n        $pokemonMeta->setNumber(142);\n        self::$POKEMON_META[PokemonId::AERODACTYL] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0143_POKEMON_SNORLAX\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SNORLAX);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(2.1);\n        $pokemonMeta->setHeightStdDev(0.2625);\n        $pokemonMeta->setBaseStamina(320);\n        $pokemonMeta->setCylRadiusM(0.74);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(190);\n        $pokemonMeta->setDiskRadiusM(1.11);\n        $pokemonMeta->setCollisionRadiusM(0.74);\n        $pokemonMeta->setPokedexWeightKg(460);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.481);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.74);\n        $pokemonMeta->setUniqueId(\"V0143_POKEMON_SNORLAX\");\n        $pokemonMeta->setBaseDefense(190);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(57.5);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.11);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.16);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ZEN_HEADBUTT_FAST,\n            PokemonMove::LICK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::HYPER_BEAM,\n            PokemonMove::BODY_SLAM,\n        )));\n        $pokemonMeta->setNumber(143);\n        self::$POKEMON_META[PokemonId::SNORLAX] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0144_POKEMON_ARTICUNO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ARTICUNO);\n        $pokemonMeta->setPokemonClass(PokemonClass::LEGENDARY);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.7);\n        $pokemonMeta->setHeightStdDev(0.2125);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.396);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(192);\n        $pokemonMeta->setDiskRadiusM(0.594);\n        $pokemonMeta->setCollisionRadiusM(0.231);\n        $pokemonMeta->setPokedexWeightKg(55.4);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ICE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.231);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.66);\n        $pokemonMeta->setUniqueId(\"V0144_POKEMON_ARTICUNO\");\n        $pokemonMeta->setBaseDefense(249);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(6.925);\n        $pokemonMeta->setCylHeightM(0.99);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.66);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.66);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::FROST_BREATH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ICY_WIND,\n            PokemonMove::BLIZZARD,\n            PokemonMove::ICE_BEAM,\n        )));\n        $pokemonMeta->setNumber(144);\n        self::$POKEMON_META[PokemonId::ARTICUNO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0145_POKEMON_ZAPDOS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ZAPDOS);\n        $pokemonMeta->setPokemonClass(PokemonClass::LEGENDARY);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.6);\n        $pokemonMeta->setHeightStdDev(0.2);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.5175);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(253);\n        $pokemonMeta->setDiskRadiusM(0.7763);\n        $pokemonMeta->setCollisionRadiusM(0.4485);\n        $pokemonMeta->setPokedexWeightKg(52.6);\n        $pokemonMeta->setMovementType(MovementType::ELECTRIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.276);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.69);\n        $pokemonMeta->setUniqueId(\"V0145_POKEMON_ZAPDOS\");\n        $pokemonMeta->setBaseDefense(188);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(6.575);\n        $pokemonMeta->setCylHeightM(1.035);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.759);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.8625);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER_SHOCK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER,\n            PokemonMove::THUNDERBOLT,\n            PokemonMove::DISCHARGE,\n        )));\n        $pokemonMeta->setNumber(145);\n        self::$POKEMON_META[PokemonId::ZAPDOS] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0146_POKEMON_MOLTRES\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MOLTRES);\n        $pokemonMeta->setPokemonClass(PokemonClass::LEGENDARY);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(2);\n        $pokemonMeta->setHeightStdDev(0.25);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.62);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(251);\n        $pokemonMeta->setDiskRadiusM(0.93);\n        $pokemonMeta->setCollisionRadiusM(0.403);\n        $pokemonMeta->setPokedexWeightKg(60);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.217);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.62);\n        $pokemonMeta->setUniqueId(\"V0146_POKEMON_MOLTRES\");\n        $pokemonMeta->setBaseDefense(184);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(7.5);\n        $pokemonMeta->setCylHeightM(1.395);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.93);\n        $pokemonMeta->setShoulderModeScale(0.25);\n        $pokemonMeta->setBaseCaptureRate(0.00);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.93);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::EMBER_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::FLAMETHROWER,\n            PokemonMove::HEAT_WAVE,\n            PokemonMove::FIRE_BLAST,\n        )));\n        $pokemonMeta->setNumber(146);\n        self::$POKEMON_META[PokemonId::MOLTRES] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0147_POKEMON_DRATINI\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DRATINI);\n        $pokemonMeta->setPokemonClass(PokemonClass::UNCOMMON);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.8);\n        $pokemonMeta->setHeightStdDev(0.225);\n        $pokemonMeta->setBaseStamina(82);\n        $pokemonMeta->setCylRadiusM(0.2775);\n        $pokemonMeta->setBaseFleeRate(0.09);\n        $pokemonMeta->setBaseAttack(119);\n        $pokemonMeta->setDiskRadiusM(0.4163);\n        $pokemonMeta->setCollisionRadiusM(0.2775);\n        $pokemonMeta->setPokedexWeightKg(3.3);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_DRAGON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.19425);\n        $pokemonMeta->setMovementTimerS(10);\n        $pokemonMeta->setJumpTimeS(0.85);\n        $pokemonMeta->setModelScale(1.11);\n        $pokemonMeta->setUniqueId(\"V0147_POKEMON_DRATINI\");\n        $pokemonMeta->setBaseDefense(94);\n        $pokemonMeta->setAttackTimerS(29);\n        $pokemonMeta->setWeightStdDev(0.4125);\n        $pokemonMeta->setCylHeightM(0.8325);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.555);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::DRAGON_BREATH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::TWISTER,\n            PokemonMove::WRAP,\n            PokemonMove::AQUA_TAIL,\n        )));\n        $pokemonMeta->setNumber(147);\n        self::$POKEMON_META[PokemonId::DRATINI] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0148_POKEMON_DRAGONAIR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DRATINI);\n        $pokemonMeta->setPokemonClass(PokemonClass::RARE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(4);\n        $pokemonMeta->setHeightStdDev(0.5);\n        $pokemonMeta->setBaseStamina(122);\n        $pokemonMeta->setCylRadiusM(0.5625);\n        $pokemonMeta->setBaseFleeRate(0.06);\n        $pokemonMeta->setBaseAttack(163);\n        $pokemonMeta->setDiskRadiusM(0.8438);\n        $pokemonMeta->setCollisionRadiusM(0.375);\n        $pokemonMeta->setPokedexWeightKg(16.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_DRAGON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.28125);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1.25);\n        $pokemonMeta->setModelScale(0.75);\n        $pokemonMeta->setUniqueId(\"V0148_POKEMON_DRAGONAIR\");\n        $pokemonMeta->setBaseDefense(138);\n        $pokemonMeta->setAttackTimerS(23);\n        $pokemonMeta->setWeightStdDev(2.0625);\n        $pokemonMeta->setCylHeightM(1.5);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(1.125);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.08);\n        $pokemonMeta->setParentId(PokemonId::DRATINI);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::DRAGON_BREATH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::WRAP,\n            PokemonMove::AQUA_TAIL,\n            PokemonMove::DRAGON_PULSE,\n        )));\n        $pokemonMeta->setNumber(148);\n        self::$POKEMON_META[PokemonId::DRAGONAIR] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0149_POKEMON_DRAGONITE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DRATINI);\n        $pokemonMeta->setPokemonClass(PokemonClass::EPIC);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(2.2);\n        $pokemonMeta->setHeightStdDev(0.275);\n        $pokemonMeta->setBaseStamina(182);\n        $pokemonMeta->setCylRadiusM(0.42);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(263);\n        $pokemonMeta->setDiskRadiusM(0.63);\n        $pokemonMeta->setCollisionRadiusM(0.42);\n        $pokemonMeta->setPokedexWeightKg(210);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_DRAGON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.245);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.7);\n        $pokemonMeta->setUniqueId(\"V0149_POKEMON_DRAGONITE\");\n        $pokemonMeta->setBaseDefense(201);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(26.25);\n        $pokemonMeta->setCylHeightM(1.47);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.05);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.04);\n        $pokemonMeta->setParentId(PokemonId::DRAGONAIR);\n        $pokemonMeta->setCylGroundM(0.595);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::STEEL_WING_FAST,\n            PokemonMove::DRAGON_BREATH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::DRAGON_CLAW,\n            PokemonMove::HYPER_BEAM,\n            PokemonMove::DRAGON_PULSE,\n        )));\n        $pokemonMeta->setNumber(149);\n        self::$POKEMON_META[PokemonId::DRAGONITE] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0150_POKEMON_MEWTWO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MEWTWO);\n        $pokemonMeta->setPokemonClass(PokemonClass::LEGENDARY);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(2);\n        $pokemonMeta->setHeightStdDev(0.25);\n        $pokemonMeta->setBaseStamina(212);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(330);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.37);\n        $pokemonMeta->setPokedexWeightKg(122);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.185);\n        $pokemonMeta->setMovementTimerS(8);\n        $pokemonMeta->setJumpTimeS(1.2);\n        $pokemonMeta->setModelScale(0.74);\n        $pokemonMeta->setUniqueId(\"V0150_POKEMON_MEWTWO\");\n        $pokemonMeta->setBaseDefense(200);\n        $pokemonMeta->setAttackTimerS(3);\n        $pokemonMeta->setWeightStdDev(15.25);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(1.184);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::PSYCHO_CUT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::PSYCHIC,\n            PokemonMove::SHADOW_BALL,\n            PokemonMove::HYPER_BEAM,\n        )));\n        $pokemonMeta->setNumber(150);\n        self::$POKEMON_META[PokemonId::MEWTWO] = $pokemonMeta;\n\n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0151_POKEMON_MEW\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MEWTWO);\n        $pokemonMeta->setPokemonClass(PokemonClass::MYTHIC);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.4);\n        $pokemonMeta->setHeightStdDev(0.05);\n        $pokemonMeta->setBaseStamina(200);\n        $pokemonMeta->setCylRadiusM(0.282);\n        $pokemonMeta->setBaseFleeRate(0.1);\n        $pokemonMeta->setBaseAttack(210);\n        $pokemonMeta->setDiskRadiusM(0.423);\n        $pokemonMeta->setCollisionRadiusM(0.141);\n        $pokemonMeta->setPokedexWeightKg(4);\n        $pokemonMeta->setMovementType(MovementType::PSYCHIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.17625);\n        $pokemonMeta->setMovementTimerS(3);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.41);\n        $pokemonMeta->setUniqueId(\"V0151_POKEMON_MEW\");\n        $pokemonMeta->setBaseDefense(210);\n        $pokemonMeta->setAttackTimerS(8);\n        $pokemonMeta->setWeightStdDev(0.5);\n        $pokemonMeta->setCylHeightM(0.7755);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.564);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.0705);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POUND_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::MOONBLAST,\n            PokemonMove::FIRE_BLAST,\n            PokemonMove::SOLAR_BEAM,\n            PokemonMove::HYPER_BEAM,\n            PokemonMove::PSYCHIC,\n            PokemonMove::HURRICANE,\n            PokemonMove::EARTHQUAKE,\n            PokemonMove::DRAGON_PULSE,\n            PokemonMove::THUNDER,\n        )));\n        $pokemonMeta->setNumber(151);\n        self::$POKEMON_META[PokemonId::MEW] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0152_POKEMON_CHIKORITA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CHIKORITA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.89);\n        $pokemonMeta->setHeightStdDev(0.11125);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(92);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(6.4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.11);\n        $pokemonMeta->setUniqueId(\"V0152_POKEMON_CHIKORITA\");\n        $pokemonMeta->setBaseDefense(122);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.8);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.32);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::RAZOR_LEAF_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(152);\n        self::$POKEMON_META[PokemonId::CHIKORITA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0153_POKEMON_BAYLEEF\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CHIKORITA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.19);\n        $pokemonMeta->setHeightStdDev(0.14875);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(122);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(15.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.75);\n        $pokemonMeta->setUniqueId(\"V0153_POKEMON_BAYLEEF\");\n        $pokemonMeta->setBaseDefense(155);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.975);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(100);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.25);\n        $pokemonMeta->setParentId(PokemonId::CHIKORITA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::RAZOR_LEAF_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(153);\n        self::$POKEMON_META[PokemonId::BAYLEEF] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0154_POKEMON_MEGANIUM\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CHIKORITA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.8);\n        $pokemonMeta->setHeightStdDev(0.225);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(168);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(100.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(0.7);\n        $pokemonMeta->setUniqueId(\"V0154_POKEMON_MEGANIUM\");\n        $pokemonMeta->setBaseDefense(202);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(12.5625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(0);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::BAYLEEF);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::RAZOR_LEAF_FAST,\n            PokemonMove::VINE_WHIP_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(154);\n        self::$POKEMON_META[PokemonId::MEGANIUM] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0155_POKEMON_CYNDAQUIL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CYNDAQUIL);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.51);\n        $pokemonMeta->setHeightStdDev(0.06375);\n        $pokemonMeta->setBaseStamina(78);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(116);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(7.9);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0155_POKEMON_CYNDAQUIL\");\n        $pokemonMeta->setBaseDefense(96);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.9875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::EMBER_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(155);\n        self::$POKEMON_META[PokemonId::CYNDAQUIL] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0156_POKEMON_QUILAVA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CYNDAQUIL);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.89);\n        $pokemonMeta->setHeightStdDev(0.11125);\n        $pokemonMeta->setBaseStamina(116);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(158);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(19);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0156_POKEMON_QUILAVA\");\n        $pokemonMeta->setBaseDefense(129);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(2.375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::CYNDAQUIL);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::EMBER_FAST,\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(156);\n        self::$POKEMON_META[PokemonId::QUILAVA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0157_POKEMON_TYPHLOSION\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CYNDAQUIL);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.7);\n        $pokemonMeta->setHeightStdDev(0.2125);\n        $pokemonMeta->setBaseStamina(156);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(223);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(79.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0157_POKEMON_TYPHLOSION\");\n        $pokemonMeta->setBaseDefense(176);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(9.9375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::QUILAVA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::EMBER_FAST,\n            PokemonMove::SHADOW_CLAW_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(157);\n        self::$POKEMON_META[PokemonId::TYPHLOSION] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0158_POKEMON_TOTODILE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TOTODILE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(117);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(9.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0158_POKEMON_TOTODILE\");\n        $pokemonMeta->setBaseDefense(116);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.1875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_GUN_FAST,\n            PokemonMove::SCRATCH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(158);\n        self::$POKEMON_META[PokemonId::TOTODILE] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0159_POKEMON_CROCONAW\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TOTODILE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.09);\n        $pokemonMeta->setHeightStdDev(0.13625);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(150);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(25);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0159_POKEMON_CROCONAW\");\n        $pokemonMeta->setBaseDefense(151);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(3.125);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::TOTODILE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_GUN_FAST,\n            PokemonMove::SCRATCH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(159);\n        self::$POKEMON_META[PokemonId::CROCONAW] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0160_POKEMON_FERALIGATR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TOTODILE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(2.31);\n        $pokemonMeta->setHeightStdDev(0.28875);\n        $pokemonMeta->setBaseStamina(170);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(205);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(88.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0160_POKEMON_FERALIGATR\");\n        $pokemonMeta->setBaseDefense(197);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(11.1);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::CROCONAW);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_GUN_FAST,\n            PokemonMove::BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(160);\n        self::$POKEMON_META[PokemonId::FERALIGATR] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0161_POKEMON_SENTRET\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SENTRET);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.79);\n        $pokemonMeta->setHeightStdDev(0.09875);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(79);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(6);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0161_POKEMON_SENTRET\");\n        $pokemonMeta->setBaseDefense(77);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.75);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::SCRATCH_FAST,\n            PokemonMove::QUICK_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(161);\n        self::$POKEMON_META[PokemonId::SENTRET] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0162_POKEMON_FURRET\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SENTRET);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.8);\n        $pokemonMeta->setHeightStdDev(0.225);\n        $pokemonMeta->setBaseStamina(170);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(148);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(32.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0162_POKEMON_FURRET\");\n        $pokemonMeta->setBaseDefense(130);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(4.0625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::SENTRET);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::QUICK_ATTACK_FAST,\n            PokemonMove::SUCKER_PUNCH_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(162);\n        self::$POKEMON_META[PokemonId::FURRET] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0163_POKEMON_HOOTHOOT\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HOOTHOOT);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.71);\n        $pokemonMeta->setHeightStdDev(0.08875);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(67);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(21.2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0163_POKEMON_HOOTHOOT\");\n        $pokemonMeta->setBaseDefense(101);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(2.65);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n            PokemonMove::PECK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(163);\n        self::$POKEMON_META[PokemonId::HOOTHOOT] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0164_POKEMON_NOCTOWL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HOOTHOOT);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.6);\n        $pokemonMeta->setHeightStdDev(0.2);\n        $pokemonMeta->setBaseStamina(200);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(145);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(40.8);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0164_POKEMON_NOCTOWL\");\n        $pokemonMeta->setBaseDefense(179);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(5.1);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::HOOTHOOT);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n            PokemonMove::PECK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(164);\n        self::$POKEMON_META[PokemonId::NOCTOWL] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0165_POKEMON_LEDYBA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_LEDYBA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.99);\n        $pokemonMeta->setHeightStdDev(0.12375);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(72);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(10.8);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0165_POKEMON_LEDYBA\");\n        $pokemonMeta->setBaseDefense(142);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.35);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n            PokemonMove::BUG_BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(165);\n        self::$POKEMON_META[PokemonId::LEDYBA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0166_POKEMON_LEDIAN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_LEDYBA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(107);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(35.6);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0166_POKEMON_LEDIAN\");\n        $pokemonMeta->setBaseDefense(209);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(4.45);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::LEDYBA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n            PokemonMove::BUG_BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(166);\n        self::$POKEMON_META[PokemonId::LEDIAN] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0167_POKEMON_SPINARAK\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SPINARAK);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(0.51);\n        $pokemonMeta->setHeightStdDev(0.06375);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(105);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(8.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0167_POKEMON_SPINARAK\");\n        $pokemonMeta->setBaseDefense(73);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.0625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_STING_FAST,\n            PokemonMove::BUG_BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(167);\n        self::$POKEMON_META[PokemonId::SPINARAK] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0168_POKEMON_ARIADOS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SPINARAK);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(1.09);\n        $pokemonMeta->setHeightStdDev(0.13625);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(161);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(33.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0168_POKEMON_ARIADOS\");\n        $pokemonMeta->setBaseDefense(128);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(4.1875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::SPINARAK);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POISON_STING_FAST,\n            PokemonMove::BUG_BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(168);\n        self::$POKEMON_META[PokemonId::ARIADOS] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0169_POKEMON_CROBAT\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ZUBAT);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.8);\n        $pokemonMeta->setHeightStdDev(0.225);\n        $pokemonMeta->setBaseStamina(170);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(194);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(75);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0169_POKEMON_CROBAT\");\n        $pokemonMeta->setBaseDefense(178);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(9.375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::GOLBAT);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WING_ATTACK_FAST,\n            PokemonMove::BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(169);\n        self::$POKEMON_META[PokemonId::CROBAT] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0170_POKEMON_CHINCHOU\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CHINCHOU);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setPokedexHeightM(0.51);\n        $pokemonMeta->setHeightStdDev(0.06375);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(106);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(12);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0170_POKEMON_CHINCHOU\");\n        $pokemonMeta->setBaseDefense(106);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.5);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::BUBBLE_FAST,\n            PokemonMove::SPARK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(170);\n        self::$POKEMON_META[PokemonId::CHINCHOU] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0171_POKEMON_LANTURN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CHINCHOU);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setPokedexHeightM(1.19);\n        $pokemonMeta->setHeightStdDev(0.14875);\n        $pokemonMeta->setBaseStamina(250);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(146);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(22.5);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0171_POKEMON_LANTURN\");\n        $pokemonMeta->setBaseDefense(146);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(2.8125);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::CHINCHOU);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::WATER_GUN_FAST,\n            PokemonMove::SPARK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(171);\n        self::$POKEMON_META[PokemonId::LANTURN] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0172_POKEMON_PICHU\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PIKACHU);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(40);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(77);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.185);\n        $pokemonMeta->setPokedexWeightKg(2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.76);\n        $pokemonMeta->setUniqueId(\"V0172_POKEMON_PICHU\");\n        $pokemonMeta->setBaseDefense(63);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.25);\n        $pokemonMeta->setCylHeightM(0.65);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.42);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER_SHOCK_FAST,\n            PokemonMove::QUICK_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDERBOLT,\n            PokemonMove::DISARMING_VOICE,\n            PokemonMove::THUNDER_PUNCH,\n        )));\n        $pokemonMeta->setNumber(172);\n        self::$POKEMON_META[PokemonId::PICHU] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0173_POKEMON_CLEFFA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CLEFAIRY);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.45);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(75);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.2);\n        $pokemonMeta->setPokedexWeightKg(3);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setCollisionHeadRadiusM(0.215);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(0.9);\n        $pokemonMeta->setModelScale(2);\n        $pokemonMeta->setUniqueId(\"V0173_POKEMON_CLEFFA\");\n        $pokemonMeta->setBaseDefense(91);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.375);\n        $pokemonMeta->setCylHeightM(0.65);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.52);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POUND_FAST,\n            PokemonMove::ZEN_HEADBUTT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BODY_SLAM,\n            PokemonMove::PSYCHIC,\n            PokemonMove::SIGNAL_BEAM,\n        )));\n        $pokemonMeta->setNumber(173);\n        self::$POKEMON_META[PokemonId::CLEFFA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0174_POKEMON_IGGLYBUFF\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_JIGGLYPUFF);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.4);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(69);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.2);\n        $pokemonMeta->setPokedexWeightKg(1);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.45);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(0.2);\n        $pokemonMeta->setModelScale(1.88);\n        $pokemonMeta->setUniqueId(\"V0174_POKEMON_IGGLYBUFF\");\n        $pokemonMeta->setBaseDefense(34);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.125);\n        $pokemonMeta->setCylHeightM(0.74);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.42);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0.4);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::POUND_FAST,\n            PokemonMove::FEINT_ATTACK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BODY_SLAM,\n            PokemonMove::SHADOW_BALL,\n            PokemonMove::PSYCHIC,\n        )));\n        $pokemonMeta->setNumber(174);\n        self::$POKEMON_META[PokemonId::IGGLYBUFF] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0175_POKEMON_TOGEPI\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TOGEPI);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.4);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(67);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.2);\n        $pokemonMeta->setPokedexWeightKg(1.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setCollisionHeadRadiusM(0.185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(0.8);\n        $pokemonMeta->setModelScale(2);\n        $pokemonMeta->setUniqueId(\"V0175_POKEMON_TOGEPI\");\n        $pokemonMeta->setBaseDefense(116);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.1875);\n        $pokemonMeta->setCylHeightM(0.65);\n        $pokemonMeta->setCandyToEvolve(50);\n        $pokemonMeta->setCollisionHeightM(0.45);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ZEN_HEADBUTT_FAST,\n            PokemonMove::PECK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ANCIENT_POWER,\n            PokemonMove::PSYSHOCK,\n            PokemonMove::DAZZLING_GLEAM,\n        )));\n        $pokemonMeta->setNumber(175);\n        self::$POKEMON_META[PokemonId::TOGEPI] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0176_POKEMON_TOGETIC\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TOGEPI);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.45);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(139);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.2);\n        $pokemonMeta->setPokedexWeightKg(3.2);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setCollisionHeadRadiusM(0.185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(0.2);\n        $pokemonMeta->setModelScale(1.33);\n        $pokemonMeta->setUniqueId(\"V0176_POKEMON_TOGETIC\");\n        $pokemonMeta->setBaseDefense(191);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.4);\n        $pokemonMeta->setCylHeightM(0.8);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.7);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::TOGEPI);\n        $pokemonMeta->setCylGroundM(0.4);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ZEN_HEADBUTT_FAST,\n            PokemonMove::STEEL_WING_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ANCIENT_POWER,\n            PokemonMove::DAZZLING_GLEAM,\n            PokemonMove::AERIAL_ACE,\n        )));\n        $pokemonMeta->setNumber(176);\n        self::$POKEMON_META[PokemonId::TOGETIC] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0177_POKEMON_NATU\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_NATU);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.2);\n        $pokemonMeta->setHeightStdDev(0.025);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(134);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0177_POKEMON_NATU\");\n        $pokemonMeta->setBaseDefense(89);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.25);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::PECK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(177);\n        self::$POKEMON_META[PokemonId::NATU] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0178_POKEMON_XATU\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_NATU);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(192);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(15);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0178_POKEMON_XATU\");\n        $pokemonMeta->setBaseDefense(146);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::NATU);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(178);\n        self::$POKEMON_META[PokemonId::XATU] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0179_POKEMON_MAREEP\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MAREEP);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(114);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(7.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0179_POKEMON_MAREEP\");\n        $pokemonMeta->setBaseDefense(82);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.975);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(179);\n        self::$POKEMON_META[PokemonId::MAREEP] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0180_POKEMON_FLAAFFY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MAREEP);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.79);\n        $pokemonMeta->setHeightStdDev(0.09875);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(145);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(13.3);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0180_POKEMON_FLAAFFY\");\n        $pokemonMeta->setBaseDefense(112);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.6625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MAREEP);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(180);\n        self::$POKEMON_META[PokemonId::FLAAFFY] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0181_POKEMON_AMPHAROS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MAREEP);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(211);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(61.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0181_POKEMON_AMPHAROS\");\n        $pokemonMeta->setBaseDefense(172);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(7.6875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::FLAAFFY);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(181);\n        self::$POKEMON_META[PokemonId::AMPHAROS] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0182_POKEMON_BELLOSSOM\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ODDISH);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.41);\n        $pokemonMeta->setHeightStdDev(0.05125);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(169);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(5.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0182_POKEMON_BELLOSSOM\");\n        $pokemonMeta->setBaseDefense(189);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.725);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::GLOOM);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(182);\n        self::$POKEMON_META[PokemonId::BELLOSSOM] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0183_POKEMON_MARILL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MARILL);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setPokedexHeightM(0.41);\n        $pokemonMeta->setHeightStdDev(0.05125);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(37);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(8.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0183_POKEMON_MARILL\");\n        $pokemonMeta->setBaseDefense(93);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.0625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(183);\n        self::$POKEMON_META[PokemonId::MARILL] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0184_POKEMON_AZUMARILL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MARILL);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setPokedexHeightM(0.79);\n        $pokemonMeta->setHeightStdDev(0.09875);\n        $pokemonMeta->setBaseStamina(200);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(112);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(28.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0184_POKEMON_AZUMARILL\");\n        $pokemonMeta->setBaseDefense(152);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(3.5625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MARILL);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(184);\n        self::$POKEMON_META[PokemonId::AZUMARILL] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0185_POKEMON_SUDOWOODO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SUDOWOODO);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.19);\n        $pokemonMeta->setHeightStdDev(0.14875);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(167);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(38);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0185_POKEMON_SUDOWOODO\");\n        $pokemonMeta->setBaseDefense(198);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(4.75);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(185);\n        self::$POKEMON_META[PokemonId::SUDOWOODO] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0186_POKEMON_POLITOED\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_POLIWAG);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(10.9);\n        $pokemonMeta->setHeightStdDev(1.3625);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(174);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(33.9);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0186_POKEMON_POLITOED\");\n        $pokemonMeta->setBaseDefense(192);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(4.2375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::POLIWHIRL);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(186);\n        self::$POKEMON_META[PokemonId::POLITOED] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0187_POKEMON_HOPPIP\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HOPPIP);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.41);\n        $pokemonMeta->setHeightStdDev(0.05125);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(67);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(0.5);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0187_POKEMON_HOPPIP\");\n        $pokemonMeta->setBaseDefense(101);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.0625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::SKIPLOOM);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(187);\n        self::$POKEMON_META[PokemonId::HOPPIP] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0188_POKEMON_SKIPLOOM\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HOPPIP);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(91);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(1);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0188_POKEMON_SKIPLOOM\");\n        $pokemonMeta->setBaseDefense(127);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.125);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::JUMPLUFF);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(188);\n        self::$POKEMON_META[PokemonId::SKIPLOOM] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0189_POKEMON_JUMPLUFF\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HOPPIP);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.79);\n        $pokemonMeta->setHeightStdDev(0.09875);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(118);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(3);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0189_POKEMON_JUMPLUFF\");\n        $pokemonMeta->setBaseDefense(197);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(189);\n        self::$POKEMON_META[PokemonId::JUMPLUFF] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0190_POKEMON_AIPOM\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_AIPOM);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.79);\n        $pokemonMeta->setHeightStdDev(0.09875);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(136);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(11.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0190_POKEMON_AIPOM\");\n        $pokemonMeta->setBaseDefense(112);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.4375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(190);\n        self::$POKEMON_META[PokemonId::AIPOM] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0191_POKEMON_SUNKERN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SUNKERN);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.3);\n        $pokemonMeta->setHeightStdDev(0.0375);\n        $pokemonMeta->setBaseStamina(60);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(55);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(1.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0191_POKEMON_SUNKERN\");\n        $pokemonMeta->setBaseDefense(55);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.225);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::SUNFLORA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(191);\n        self::$POKEMON_META[PokemonId::SUNKERN] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0192_POKEMON_SUNFLORA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SUNKERN);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.79);\n        $pokemonMeta->setHeightStdDev(0.09875);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(185);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(8.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0192_POKEMON_SUNFLORA\");\n        $pokemonMeta->setBaseDefense(148);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.0625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(192);\n        self::$POKEMON_META[PokemonId::SUNFLORA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0193_POKEMON_YANMA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_YANMA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.19);\n        $pokemonMeta->setHeightStdDev(0.14875);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(154);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(38);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0193_POKEMON_YANMA\");\n        $pokemonMeta->setBaseDefense(94);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(4.75);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(193);\n        self::$POKEMON_META[PokemonId::YANMA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0194_POKEMON_WOOPER\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_WOOPER);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(0.41);\n        $pokemonMeta->setHeightStdDev(0.05125);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(75);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(8.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0194_POKEMON_WOOPER\");\n        $pokemonMeta->setBaseDefense(75);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.0625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::QUAGSIRE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(194);\n        self::$POKEMON_META[PokemonId::WOOPER] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0195_POKEMON_QUAGSIRE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_WOOPER);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(190);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(152);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(75);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0195_POKEMON_QUAGSIRE\");\n        $pokemonMeta->setBaseDefense(152);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(9.375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(195);\n        self::$POKEMON_META[PokemonId::QUAGSIRE] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0196_POKEMON_ESPEON\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_EEVEE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.89);\n        $pokemonMeta->setHeightStdDev(0.11125);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.4);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(261);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.2525);\n        $pokemonMeta->setPokedexWeightKg(26.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1.1);\n        $pokemonMeta->setModelScale(1.25);\n        $pokemonMeta->setUniqueId(\"V0196_POKEMON_ESPEON\");\n        $pokemonMeta->setBaseDefense(194);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(3.3125);\n        $pokemonMeta->setCylHeightM(1);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.9);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::EEVEE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::CONFUSION_FAST,\n            PokemonMove::ZEN_HEADBUTT_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(196);\n        self::$POKEMON_META[PokemonId::ESPEON] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0197_POKEMON_UMBREON\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_EEVEE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.99);\n        $pokemonMeta->setHeightStdDev(0.12375);\n        $pokemonMeta->setBaseStamina(190);\n        $pokemonMeta->setCylRadiusM(0.4);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(126);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.2525);\n        $pokemonMeta->setPokedexWeightKg(27);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_DARK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1.1);\n        $pokemonMeta->setModelScale(1.01);\n        $pokemonMeta->setUniqueId(\"V0197_POKEMON_UMBREON\");\n        $pokemonMeta->setBaseDefense(250);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(3.375);\n        $pokemonMeta->setCylHeightM(0.85);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.8);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::EEVEE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::FEINT_ATTACK_FAST,\n            PokemonMove::BITE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(197);\n        self::$POKEMON_META[PokemonId::UMBREON] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0198_POKEMON_MURKROW\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MURKROW);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.51);\n        $pokemonMeta->setHeightStdDev(0.06375);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(175);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(2.1);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_DARK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0198_POKEMON_MURKROW\");\n        $pokemonMeta->setBaseDefense(87);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.2625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(198);\n        self::$POKEMON_META[PokemonId::MURKROW] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0199_POKEMON_SLOWKING\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SLOWPOKE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setPokedexHeightM(2.01);\n        $pokemonMeta->setHeightStdDev(0.25125);\n        $pokemonMeta->setBaseStamina(190);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(177);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(79.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0199_POKEMON_SLOWKING\");\n        $pokemonMeta->setBaseDefense(194);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(9.9375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::SLOWPOKE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(199);\n        self::$POKEMON_META[PokemonId::SLOWKING] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0200_POKEMON_MISDREAVUS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MISDREAVUS);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.71);\n        $pokemonMeta->setHeightStdDev(0.08875);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(167);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(1);\n        $pokemonMeta->setMovementType(MovementType::PSYCHIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GHOST);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0200_POKEMON_MISDREAVUS\");\n        $pokemonMeta->setBaseDefense(167);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.125);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(200);\n        self::$POKEMON_META[PokemonId::MISDREAVUS] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0201_POKEMON_UNOWN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_UNOWN);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.51);\n        $pokemonMeta->setHeightStdDev(0.06375);\n        $pokemonMeta->setBaseStamina(96);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(136);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(5);\n        $pokemonMeta->setMovementType(MovementType::PSYCHIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0201_POKEMON_UNOWN\");\n        $pokemonMeta->setBaseDefense(91);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(201);\n        self::$POKEMON_META[PokemonId::UNOWN] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0202_POKEMON_WOBBUFFET\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_WOBBUFFET);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.3);\n        $pokemonMeta->setHeightStdDev(0.1625);\n        $pokemonMeta->setBaseStamina(380);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(60);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(28.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0202_POKEMON_WOBBUFFET\");\n        $pokemonMeta->setBaseDefense(106);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(3.5625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(202);\n        self::$POKEMON_META[PokemonId::WOBBUFFET] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0203_POKEMON_GIRAFARIG\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GIRAFARIG);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(182);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(41.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0203_POKEMON_GIRAFARIG\");\n        $pokemonMeta->setBaseDefense(133);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(5.1875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(203);\n        self::$POKEMON_META[PokemonId::GIRAFARIG] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0204_POKEMON_PINECO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PINECO);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(108);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(7.2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0204_POKEMON_PINECO\");\n        $pokemonMeta->setBaseDefense(146);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.9);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(204);\n        self::$POKEMON_META[PokemonId::PINECO] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0205_POKEMON_FORRETRESS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PINECO);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_STEEL);\n        $pokemonMeta->setPokedexHeightM(1.19);\n        $pokemonMeta->setHeightStdDev(0.14875);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(161);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(125.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0205_POKEMON_FORRETRESS\");\n        $pokemonMeta->setBaseDefense(242);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(15.725);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::PINECO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(205);\n        self::$POKEMON_META[PokemonId::FORRETRESS] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0206_POKEMON_DUNSPARCE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DUNSPARCE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(200);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(131);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(14);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0206_POKEMON_DUNSPARCE\");\n        $pokemonMeta->setBaseDefense(131);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.75);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(206);\n        self::$POKEMON_META[PokemonId::DUNSPARCE] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0207_POKEMON_GLIGAR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_GLIGAR);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.09);\n        $pokemonMeta->setHeightStdDev(0.13625);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(143);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(64.8);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0207_POKEMON_GLIGAR\");\n        $pokemonMeta->setBaseDefense(204);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(8.1);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(207);\n        self::$POKEMON_META[PokemonId::GLIGAR] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0208_POKEMON_STEELIX\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ONIX);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(9.19);\n        $pokemonMeta->setHeightStdDev(1.14875);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(148);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(400);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_STEEL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0208_POKEMON_STEELIX\");\n        $pokemonMeta->setBaseDefense(333);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(50);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::ONIX);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(208);\n        self::$POKEMON_META[PokemonId::STEELIX] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0209_POKEMON_SNUBBULL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SNUBBULL);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(137);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(7.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0209_POKEMON_SNUBBULL\");\n        $pokemonMeta->setBaseDefense(89);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.975);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(209);\n        self::$POKEMON_META[PokemonId::SNUBBULL] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0210_POKEMON_GRANBULL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SNUBBULL);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(212);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(48.7);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FAIRY);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0210_POKEMON_GRANBULL\");\n        $pokemonMeta->setBaseDefense(137);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(6.0875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::SNUBBULL);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(210);\n        self::$POKEMON_META[PokemonId::GRANBULL] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0211_POKEMON_QWILFISH\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_QWILFISH);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_POISON);\n        $pokemonMeta->setPokedexHeightM(0.51);\n        $pokemonMeta->setHeightStdDev(0.06375);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(184);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(3.9);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0211_POKEMON_QWILFISH\");\n        $pokemonMeta->setBaseDefense(148);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.4875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(211);\n        self::$POKEMON_META[PokemonId::QWILFISH] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0212_POKEMON_SCIZOR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SCYTHER);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_STEEL);\n        $pokemonMeta->setPokedexHeightM(2.01);\n        $pokemonMeta->setHeightStdDev(0.25125);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(236);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(125);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0212_POKEMON_SCIZOR\");\n        $pokemonMeta->setBaseDefense(191);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(15.625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::SCYTHER);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(212);\n        self::$POKEMON_META[PokemonId::SCIZOR] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0213_POKEMON_SHUCKLE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SHUCKLE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(40);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(17);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(20.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0213_POKEMON_SHUCKLE\");\n        $pokemonMeta->setBaseDefense(396);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(2.5625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(213);\n        self::$POKEMON_META[PokemonId::SHUCKLE] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0214_POKEMON_HERACROSS\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HERACROSS);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(160);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(234);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(54);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_BUG);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0214_POKEMON_HERACROSS\");\n        $pokemonMeta->setBaseDefense(189);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(6.75);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(214);\n        self::$POKEMON_META[PokemonId::HERACROSS] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0215_POKEMON_SNEASEL\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SNEASEL);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ICE);\n        $pokemonMeta->setPokedexHeightM(0.89);\n        $pokemonMeta->setHeightStdDev(0.11125);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(189);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(28);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_DARK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0215_POKEMON_SNEASEL\");\n        $pokemonMeta->setBaseDefense(157);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(3.5);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(215);\n        self::$POKEMON_META[PokemonId::SNEASEL] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0216_POKEMON_TEDDIURSA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TEDDIURSA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(120);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(142);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(8.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0216_POKEMON_TEDDIURSA\");\n        $pokemonMeta->setBaseDefense(93);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.1);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(216);\n        self::$POKEMON_META[PokemonId::TEDDIURSA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0217_POKEMON_URSARING\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TEDDIURSA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.8);\n        $pokemonMeta->setHeightStdDev(0.225);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(236);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(125.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0217_POKEMON_URSARING\");\n        $pokemonMeta->setBaseDefense(144);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(15.725);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::TEDDIURSA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(217);\n        self::$POKEMON_META[PokemonId::URSARING] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0218_POKEMON_SLUGMA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SLUGMA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.71);\n        $pokemonMeta->setHeightStdDev(0.08875);\n        $pokemonMeta->setBaseStamina(80);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(118);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(35);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0218_POKEMON_SLUGMA\");\n        $pokemonMeta->setBaseDefense(71);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(4.375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(218);\n        self::$POKEMON_META[PokemonId::SLUGMA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0219_POKEMON_MAGCARGO\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SLUGMA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setPokedexHeightM(0.79);\n        $pokemonMeta->setHeightStdDev(0.09875);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(139);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(55);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0219_POKEMON_MAGCARGO\");\n        $pokemonMeta->setBaseDefense(209);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(6.875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::SLUGMA);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(219);\n        self::$POKEMON_META[PokemonId::MAGCARGO] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0220_POKEMON_SWINUB\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SWINUB);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(0.41);\n        $pokemonMeta->setHeightStdDev(0.05125);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(90);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(6.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ICE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0220_POKEMON_SWINUB\");\n        $pokemonMeta->setBaseDefense(74);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.8125);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(220);\n        self::$POKEMON_META[PokemonId::SWINUB] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0221_POKEMON_PILOSWINE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SWINUB);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(1.09);\n        $pokemonMeta->setHeightStdDev(0.13625);\n        $pokemonMeta->setBaseStamina(200);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(181);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(55.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ICE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0221_POKEMON_PILOSWINE\");\n        $pokemonMeta->setBaseDefense(147);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(6.975);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::SWINUB);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(221);\n        self::$POKEMON_META[PokemonId::PILOSWINE] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0222_POKEMON_CORSOLA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CORSOLA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(118);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0222_POKEMON_CORSOLA\");\n        $pokemonMeta->setBaseDefense(156);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(222);\n        self::$POKEMON_META[PokemonId::CORSOLA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0223_POKEMON_REMORAID\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_REMORAID);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(127);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(12);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0223_POKEMON_REMORAID\");\n        $pokemonMeta->setBaseDefense(69);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.5);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(223);\n        self::$POKEMON_META[PokemonId::REMORAID] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0224_POKEMON_OCTILLERY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_REMORAID);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.89);\n        $pokemonMeta->setHeightStdDev(0.11125);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(197);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(28.5);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0224_POKEMON_OCTILLERY\");\n        $pokemonMeta->setBaseDefense(141);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(3.5625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::REMORAID);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(224);\n        self::$POKEMON_META[PokemonId::OCTILLERY] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0225_POKEMON_DELIBIRD\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_DELIBIRD);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(0.89);\n        $pokemonMeta->setHeightStdDev(0.11125);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(128);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(16);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ICE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0225_POKEMON_DELIBIRD\");\n        $pokemonMeta->setBaseDefense(90);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(2);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(225);\n        self::$POKEMON_META[PokemonId::DELIBIRD] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0226_POKEMON_MANTINE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MANTINE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(2.11);\n        $pokemonMeta->setHeightStdDev(0.26375);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(148);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(220);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0226_POKEMON_MANTINE\");\n        $pokemonMeta->setBaseDefense(260);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(27.5);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(226);\n        self::$POKEMON_META[PokemonId::MANTINE] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0227_POKEMON_SKARMORY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SKARMORY);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(1.7);\n        $pokemonMeta->setHeightStdDev(0.2125);\n        $pokemonMeta->setBaseStamina(130);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(148);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(50.5);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_STEEL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0227_POKEMON_SKARMORY\");\n        $pokemonMeta->setBaseDefense(260);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(6.3125);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(227);\n        self::$POKEMON_META[PokemonId::SKARMORY] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0228_POKEMON_HOUNDOUR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HOUNDOUR);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(152);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(10.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_DARK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0228_POKEMON_HOUNDOUR\");\n        $pokemonMeta->setBaseDefense(93);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(1.35);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(228);\n        self::$POKEMON_META[PokemonId::HOUNDOUR] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0229_POKEMON_HOUNDOOM\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HOUNDOUR);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(224);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(35);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_DARK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0229_POKEMON_HOUNDOOM\");\n        $pokemonMeta->setBaseDefense(159);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(4.375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::HOUNDOUR);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(229);\n        self::$POKEMON_META[PokemonId::HOUNDOOM] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0230_POKEMON_KINGDRA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HORSEA);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_DRAGON);\n        $pokemonMeta->setPokedexHeightM(1.8);\n        $pokemonMeta->setHeightStdDev(0.225);\n        $pokemonMeta->setBaseStamina(150);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(194);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(152);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0230_POKEMON_KINGDRA\");\n        $pokemonMeta->setBaseDefense(194);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(19);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(230);\n        self::$POKEMON_META[PokemonId::KINGDRA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0231_POKEMON_PHANPY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PHANPY);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.51);\n        $pokemonMeta->setHeightStdDev(0.06375);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(107);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(33.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0231_POKEMON_PHANPY\");\n        $pokemonMeta->setBaseDefense(107);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(4.1875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(231);\n        self::$POKEMON_META[PokemonId::PHANPY] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0232_POKEMON_DONPHAN\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PHANPY);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.09);\n        $pokemonMeta->setHeightStdDev(0.13625);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(214);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(120);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0232_POKEMON_DONPHAN\");\n        $pokemonMeta->setBaseDefense(214);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(15);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::PHANPY);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(232);\n        self::$POKEMON_META[PokemonId::DONPHAN] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0233_POKEMON_PORYGON2\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_PORYGON);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(170);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(198);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(32.5);\n        $pokemonMeta->setMovementType(MovementType::HOVERING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0233_POKEMON_PORYGON2\");\n        $pokemonMeta->setBaseDefense(183);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(4.0625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::PORYGON);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(233);\n        self::$POKEMON_META[PokemonId::PORYGON2] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0234_POKEMON_STANTLER\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_STANTLER);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(146);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(192);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(71.2);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0234_POKEMON_STANTLER\");\n        $pokemonMeta->setBaseDefense(132);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(8.9);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(234);\n        self::$POKEMON_META[PokemonId::STANTLER] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0235_POKEMON_SMEARGLE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SMEARGLE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.19);\n        $pokemonMeta->setHeightStdDev(0.14875);\n        $pokemonMeta->setBaseStamina(110);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(40);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(58);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0235_POKEMON_SMEARGLE\");\n        $pokemonMeta->setBaseDefense(88);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(7.25);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(235);\n        self::$POKEMON_META[PokemonId::SMEARGLE] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0236_POKEMON_TYROGUE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TYROGUE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.71);\n        $pokemonMeta->setHeightStdDev(0.08875);\n        $pokemonMeta->setBaseStamina(70);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(64);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.2);\n        $pokemonMeta->setPokedexWeightKg(21);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setCollisionHeadRadiusM(0.185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1.1);\n        $pokemonMeta->setModelScale(1.23);\n        $pokemonMeta->setUniqueId(\"V0236_POKEMON_TYROGUE\");\n        $pokemonMeta->setBaseDefense(64);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(2.625);\n        $pokemonMeta->setCylHeightM(0.85);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.75);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::ROCK_SMASH_FAST,\n            PokemonMove::LOW_KICK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BRICK_BREAK,\n            PokemonMove::BODY_SLAM,\n            PokemonMove::LOW_SWEEP,\n        )));\n        $pokemonMeta->setNumber(236);\n        self::$POKEMON_META[PokemonId::TYROGUE] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0237_POKEMON_HITMONTOP\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_TYROGUE);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.4);\n        $pokemonMeta->setHeightStdDev(0.175);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(173);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(48);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIGHTING);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0237_POKEMON_HITMONTOP\");\n        $pokemonMeta->setBaseDefense(214);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(6);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::TYROGUE);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(237);\n        self::$POKEMON_META[PokemonId::HITMONTOP] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0238_POKEMON_SMOOCHUM\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_JYNX);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setPokedexHeightM(0.41);\n        $pokemonMeta->setHeightStdDev(0.05125);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.4);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(153);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.35);\n        $pokemonMeta->setPokedexWeightKg(6);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ICE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.215);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1.52);\n        $pokemonMeta->setUniqueId(\"V0238_POKEMON_SMOOCHUM\");\n        $pokemonMeta->setBaseDefense(116);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.75);\n        $pokemonMeta->setCylHeightM(0.075);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.6);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::FROST_BREATH_FAST,\n            PokemonMove::POUND_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::ICE_BEAM,\n            PokemonMove::ICE_PUNCH,\n            PokemonMove::PSYSHOCK,\n        )));\n        $pokemonMeta->setNumber(238);\n        self::$POKEMON_META[PokemonId::SMOOCHUM] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0239_POKEMON_ELEKID\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ELECTABUZZ);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.4);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(135);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.3);\n        $pokemonMeta->setPokedexWeightKg(23.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.215);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1.1);\n        $pokemonMeta->setModelScale(1.33);\n        $pokemonMeta->setUniqueId(\"V0239_POKEMON_ELEKID\");\n        $pokemonMeta->setBaseDefense(110);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(2.9375);\n        $pokemonMeta->setCylHeightM(0.85);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.6);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER_SHOCK_FAST,\n            PokemonMove::LOW_KICK_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::THUNDER_PUNCH,\n            PokemonMove::THUNDERBOLT,\n            PokemonMove::DISCHARGE,\n        )));\n        $pokemonMeta->setNumber(239);\n        self::$POKEMON_META[PokemonId::ELEKID] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0240_POKEMON_MAGBY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MAGMAR);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(0.71);\n        $pokemonMeta->setHeightStdDev(0.08875);\n        $pokemonMeta->setBaseStamina(90);\n        $pokemonMeta->setCylRadiusM(0.4);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(151);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.35);\n        $pokemonMeta->setPokedexWeightKg(21.4);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.215);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1.1);\n        $pokemonMeta->setModelScale(1.23);\n        $pokemonMeta->setUniqueId(\"V0240_POKEMON_MAGBY\");\n        $pokemonMeta->setBaseDefense(108);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(2.675);\n        $pokemonMeta->setCylHeightM(0.9);\n        $pokemonMeta->setCandyToEvolve(25);\n        $pokemonMeta->setCollisionHeightM(0.9);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::EMBER_FAST,\n            PokemonMove::KARATE_CHOP_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::BRICK_BREAK,\n            PokemonMove::FIRE_PUNCH,\n            PokemonMove::FLAMETHROWER,\n        )));\n        $pokemonMeta->setNumber(240);\n        self::$POKEMON_META[PokemonId::MAGBY] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0241_POKEMON_MILTANK\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_MILTANK);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.19);\n        $pokemonMeta->setHeightStdDev(0.14875);\n        $pokemonMeta->setBaseStamina(190);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(157);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(75.5);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0241_POKEMON_MILTANK\");\n        $pokemonMeta->setBaseDefense(211);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(9.4375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(241);\n        self::$POKEMON_META[PokemonId::MILTANK] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0242_POKEMON_BLISSEY\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CHANSEY);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.5);\n        $pokemonMeta->setHeightStdDev(0.1875);\n        $pokemonMeta->setBaseStamina(510);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(129);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(46.8);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_NORMAL);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0242_POKEMON_BLISSEY\");\n        $pokemonMeta->setBaseDefense(229);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(5.85);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::CHANSEY);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(242);\n        self::$POKEMON_META[PokemonId::BLISSEY] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0243_POKEMON_RAIKOU\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_RAIKOU);\n        $pokemonMeta->setPokemonClass(PokemonClass::LEGENDARY);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(1.91);\n        $pokemonMeta->setHeightStdDev(0.23875);\n        $pokemonMeta->setBaseStamina(180);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(241);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(178);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ELECTRIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0243_POKEMON_RAIKOU\");\n        $pokemonMeta->setBaseDefense(210);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(22.25);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(243);\n        self::$POKEMON_META[PokemonId::RAIKOU] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0244_POKEMON_ENTEI\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_ENTEI);\n        $pokemonMeta->setPokemonClass(PokemonClass::LEGENDARY);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(2.11);\n        $pokemonMeta->setHeightStdDev(0.26375);\n        $pokemonMeta->setBaseStamina(230);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(235);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(198);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0244_POKEMON_ENTEI\");\n        $pokemonMeta->setBaseDefense(176);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(24.75);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(244);\n        self::$POKEMON_META[PokemonId::ENTEI] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0245_POKEMON_SUICUNE\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_SUICUNE);\n        $pokemonMeta->setPokemonClass(PokemonClass::LEGENDARY);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_NONE);\n        $pokemonMeta->setPokedexHeightM(2.01);\n        $pokemonMeta->setHeightStdDev(0.25125);\n        $pokemonMeta->setBaseStamina(200);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(180);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(187);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_WATER);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0245_POKEMON_SUICUNE\");\n        $pokemonMeta->setBaseDefense(235);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(23.375);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(245);\n        self::$POKEMON_META[PokemonId::SUICUNE] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0246_POKEMON_LARVITAR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_LARVITAR);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(100);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(115);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(72);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0246_POKEMON_LARVITAR\");\n        $pokemonMeta->setBaseDefense(93);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(9);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(246);\n        self::$POKEMON_META[PokemonId::LARVITAR] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0247_POKEMON_PUPITAR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_LARVITAR);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GROUND);\n        $pokemonMeta->setPokedexHeightM(1.19);\n        $pokemonMeta->setHeightStdDev(0.14875);\n        $pokemonMeta->setBaseStamina(140);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(155);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(152);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0247_POKEMON_PUPITAR\");\n        $pokemonMeta->setBaseDefense(133);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(19);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::LARVITAR);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(247);\n        self::$POKEMON_META[PokemonId::PUPITAR] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0248_POKEMON_TYRANITAR\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_LARVITAR);\n        $pokemonMeta->setPokemonClass(PokemonClass::NONE);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_DARK);\n        $pokemonMeta->setPokedexHeightM(2.01);\n        $pokemonMeta->setHeightStdDev(0.25125);\n        $pokemonMeta->setBaseStamina(200);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(251);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(202);\n        $pokemonMeta->setMovementType(MovementType::JUMP);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_ROCK);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0248_POKEMON_TYRANITAR\");\n        $pokemonMeta->setBaseDefense(212);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(25.25);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::PUPITAR);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(248);\n        self::$POKEMON_META[PokemonId::TYRANITAR] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0249_POKEMON_LUGIA\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_LUGIA);\n        $pokemonMeta->setPokemonClass(PokemonClass::LEGENDARY);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(5.21);\n        $pokemonMeta->setHeightStdDev(0.65125);\n        $pokemonMeta->setBaseStamina(212);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(193);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(216);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0249_POKEMON_LUGIA\");\n        $pokemonMeta->setBaseDefense(323);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(27);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(249);\n        self::$POKEMON_META[PokemonId::LUGIA] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0250_POKEMON_HO_OH\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_HO_OH);\n        $pokemonMeta->setPokemonClass(PokemonClass::LEGENDARY);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_FLYING);\n        $pokemonMeta->setPokedexHeightM(3.81);\n        $pokemonMeta->setHeightStdDev(0.47625);\n        $pokemonMeta->setBaseStamina(212);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(263);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(199);\n        $pokemonMeta->setMovementType(MovementType::FLYING);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_FIRE);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0250_POKEMON_HO_OH\");\n        $pokemonMeta->setBaseDefense(301);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(24.875);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(250);\n        self::$POKEMON_META[PokemonId::HO_OH] = $pokemonMeta;\n        \n        $pokemonMeta = new PokemonMeta();\n        $pokemonMeta->setTemplateId(\"V0251_POKEMON_CELEBI\");\n        $pokemonMeta->setFamily(PokemonFamilyId::FAMILY_CELEBI);\n        $pokemonMeta->setPokemonClass(PokemonClass::MYTHIC);\n        $pokemonMeta->setType2(PokemonType::POKEMON_TYPE_GRASS);\n        $pokemonMeta->setPokedexHeightM(0.61);\n        $pokemonMeta->setHeightStdDev(0.07625);\n        $pokemonMeta->setBaseStamina(200);\n        $pokemonMeta->setCylRadiusM(0.37);\n        $pokemonMeta->setBaseFleeRate(0.05);\n        $pokemonMeta->setBaseAttack(210);\n        $pokemonMeta->setDiskRadiusM(0.555);\n        $pokemonMeta->setCollisionRadiusM(0.364);\n        $pokemonMeta->setPokedexWeightKg(5);\n        $pokemonMeta->setMovementType(MovementType::PSYCHIC);\n        $pokemonMeta->setType1(PokemonType::POKEMON_TYPE_PSYCHIC);\n        $pokemonMeta->setCollisionHeadRadiusM(0.3185);\n        $pokemonMeta->setMovementTimerS(11);\n        $pokemonMeta->setJumpTimeS(1);\n        $pokemonMeta->setModelScale(1);\n        $pokemonMeta->setUniqueId(\"V0251_POKEMON_CELEBI\");\n        $pokemonMeta->setBaseDefense(210);\n        $pokemonMeta->setAttackTimerS(20);\n        $pokemonMeta->setWeightStdDev(0.625);\n        $pokemonMeta->setCylHeightM(1.48);\n        $pokemonMeta->setCandyToEvolve(1);\n        $pokemonMeta->setCollisionHeightM(0.91);\n        $pokemonMeta->setShoulderModeScale(0.5);\n        $pokemonMeta->setBaseCaptureRate(0.12);\n        $pokemonMeta->setParentId(PokemonId::MISSINGNO);\n        $pokemonMeta->setCylGroundM(0);\n        $pokemonMeta->setQuickMoves(new PokemonMoveData(array(\n            PokemonMove::TACKLE_FAST,\n        )));\n        $pokemonMeta->setCinematicMoves(new PokemonMoveData(array(\n            PokemonMove::STRUGGLE,\n        )));\n        $pokemonMeta->setNumber(251);\n        self::$POKEMON_META[PokemonId::CELEBI] = $pokemonMeta;\n\n    }\n\n}\n\nPokemonMetaRegistry::initialize();"
  },
  {
    "path": "src/Api/Pokemon/Data/PokemonMove.php",
    "content": "<?php\n/**\n * @author DrDelay <info@vi0lation.de>\n */\n\nnamespace NicklasW\\PkmGoApi\\Api\\Pokemon\\Data;\n\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\PokemonMove as PokemonMoveEnumSupport;\nuse POGOProtos\\Enums\\PokemonMove as PokemonMoveEnum;\n\nclass PokemonMove\n{\n    /** @var array|int[]|PokemonMoveEnum[] */\n    protected $moves;\n\n    /**\n     * PokemonMove constructor.\n     *\n     * @param array|int[]|PokemonMoveEnum[] $moves\n     */\n    public function __construct(array $moves)\n    {\n        $this->moves = $moves;\n    }\n\n    /**\n     * Get the moves (raw).\n     *\n     * @return array|\\int[]|PokemonMoveEnum[]\n     */\n    public function getMoves()\n    {\n        return $this->moves;\n    }\n\n    /**\n     * Get the moves as names.\n     *\n     * @return string[]\n     */\n    public function getMovesStrings()\n    {\n        return array_map(function ($move) {\n            return PokemonMoveEnumSupport::name($move);\n        }, $this->getMoves());\n    }\n}\n"
  },
  {
    "path": "src/Api/Pokemon/Pokemon.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Pokemon;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\PokemonItem;\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Support\\PokemonDetailsTrait;\nuse NicklasW\\PkmGoApi\\Api\\Procedure;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\GenericEnum;\nuse NicklasW\\PkmGoApi\\Services\\Request\\PokemonRequestService;\nuse POGOProtos\\Networking\\Responses\\EvolvePokemonResponse;\nuse POGOProtos\\Networking\\Responses\\EvolvePokemonResponse_Result;\nuse POGOProtos\\Networking\\Responses\\NicknamePokemonResponse;\nuse POGOProtos\\Networking\\Responses\\NicknamePokemonResponse_Result;\nuse POGOProtos\\Networking\\Responses\\ReleasePokemonResponse;\nuse POGOProtos\\Networking\\Responses\\ReleasePokemonResponse_Result;\nuse POGOProtos\\Networking\\Responses\\SetFavoritePokemonResponse;\nuse POGOProtos\\Networking\\Responses\\SetFavoritePokemonResponse_Result;\nuse POGOProtos\\Networking\\Responses\\UpgradePokemonResponse;\nuse POGOProtos\\Networking\\Responses\\UpgradePokemonResponse_Result;\n\n/**\n * @method void setId(int $id)\n * @method void setPokemonId(int $pokemonId)\n * @method void setCp(int $cp)\n * @method void setStamina(int $stamina)\n * @method void setStaminaMax(int $staminaMax)\n * @method void setMove1(int $move1)\n * @method void setMove2(int $move2)\n * @method void setDeployedFortId(int $deployedFortId)\n * @method void setOwnerName(string $ownerName)\n * @method void setIsEgg(boolean $isEgg)\n * @method void setEggKmWalkedTarget(int $eggKmWalkedTarget)\n * @method void setEggKmWalkedStart(int $eggKmWalkedStart)\n * @method void setOrigin(int $origin)\n * @method void setHeightM(int $heightM)\n * @method void setWeightKg(int $weightKg)\n * @method void setIndividualAttack(int $individualAttack)\n * @method void setIndividualDefense(int $individualDefense)\n * @method void setIndividualStamina(int $individualStamina)\n * @method void setCpMultiplier(int $cpMultiplier)\n * @method void setPokeball(int $pokeball)\n * @method void setCapturedCellId(int $capturedCellId)\n * @method void setBattlesAttacked(int $battlesAttacked)\n * @method void setBattlesDefended(int $battlesDefended)\n * @method void setEggIncubatorId(string $eggIncubatorId)\n * @method void setCreationTimeMs(int $creationTimeMs)\n * @method void setNumUpgrades(int $numUpgrades)\n * @method void setAdditionalCpMultiplier(int $additionalCpMultiplier)\n * @method void setFavorite(int $favorite)\n * @method void setNickname(string $nickname)\n * @method void setFromFort(int $fromFort)\n * @method int getId()\n * @method int getPokemonId()\n * @method int getCp()\n * @method int getStamina()\n * @method int getStaminaMax()\n * @method int getMove1()\n * @method int getMove2()\n * @method int getDeployedFortId()\n * @method string getOwnerName()\n * @method boolean getIsEgg()\n * @method int getEggKmWalkedTarget()\n * @method int getEggKmWalkedStart()\n * @method int getOrigin()\n * @method int getHeightM()\n * @method int getWeightKg()\n * @method int getIndividualAttack()\n * @method int getIndividualDefense()\n * @method int getIndividualStamina()\n * @method int getCpMultiplier()\n * @method int getPokeball()\n * @method int getCapturedCellId()\n * @method int getBattlesAttacked()\n * @method int getBattlesDefended()\n * @method string getEggIncubatorId()\n * @method int getCreationTimeMs()\n * @method int getNumUpgrades()\n * @method int getAdditionalCpMultiplier()\n * @method int getFavorite()\n * @method string getNickname()\n * @method int getFromFort()\n */\nclass Pokemon extends Procedure\n{\n\n    use PokemonDetailsTrait;\n\n    /**\n     * Pokemon constructor.\n     *\n     * @param array|PokemonItem $pokemonData\n     */\n    public function __construct($pokemonData)\n    {\n        $this->data = $pokemonData;\n    }\n\n    /**\n     * Transfers the pokemon.\n     *\n     * @return ReleasePokemonResponse\n     * @throws Exception\n     */\n    public function transfer()\n    {\n        // Check if the pokemon is deployed\n        if ($this->isDeployed()) {\n            return ReleasePokemonResponse_Result::POKEMON_DEPLOYED;\n        }\n\n        // Execute the API request\n        $response = $this->getRequestService()->transfer($this->getId());\n\n        // Check if the request was successfully executed\n        if ($response->getResult() !== ReleasePokemonResponse_Result::SUCCESS) {\n            throw new Exception(sprintf('Invalid response during pokemon transfer. Result: \\'%s\\' Code: \\'%s\\'',\n                $response->getResult(), GenericEnum::name(ReleasePokemonResponse_Result::class, $response->getResult())));\n        }\n\n        // Retrieve the poke bank\n        $pokeBank = $this->pokeBank();\n\n        // Remove the pokemon from the poke bank\n        $pokeBank->removePokemon($this);\n\n        return $response;\n    }\n\n    /**\n     * Upgrade the pokemon.\n     *\n     * @return UpgradePokemonResponse\n     * @throws Exception\n     */\n    public function upgrade()\n    {\n        // Validate the upgrade status\n        if (($status = $this->getUpgradeStatus()) !== UpgradePokemonResponse_Result::SUCCESS) {\n            return $status;\n        }\n\n        // Execute the API request\n        $response = $this->getRequestService()->upgrade($this->getId());\n\n        // Check if the request was successfully executed\n        if ($response->getResult() !== UpgradePokemonResponse_Result::SUCCESS) {\n            throw new Exception(sprintf('Invalid response during pokemon upgrade. Result: \\'%s\\' Code: \\'%s\\'',\n                $response->getResult(), GenericEnum::name(UpgradePokemonResponse_Result::class, $response->getResult())));\n        }\n\n        // Retrieve the poke bank\n        $pokeBank = $this->pokeBank();\n\n        // Remove the pokemon from the poke bank\n        $pokeBank->removePokemon($this);\n\n        return $response;\n    }\n\n    /**\n     * Renames the pokemon.\n     *\n     * @param string $name\n     * @throws Exception\n     * @return NicknamePokemonResponse\n     */\n    public function rename($name)\n    {\n        // Execute the API request\n        $response = $this->getRequestService()->rename($this->getId(), $name);\n\n        // Check if the request was successfully executed\n        if ($response->getResult() !== NicknamePokemonResponse_Result::SUCCESS) {\n            throw new Exception(sprintf('Invalid response during pokemon rename. Result: \\'%s\\' Code: \\'%s\\'',\n                $response->getResult(), GenericEnum::name(NicknamePokemonResponse_Result::class, $response->getResult())));\n        }\n\n        // Update the pokemon name\n        $this->data->setNickname($name);\n\n        return $response;\n    }\n\n    /**\n     * Evolves the pokemon.\n     *\n     * @return EvolvePokemonResponse\n     * @throws Exception\n     */\n    public function evolve()\n    {\n        // Validate the evolve status\n        if (($status = $this->getEvolveStatus()) !== EvolvePokemonResponse_Result::SUCCESS) {\n            return $status;\n        }\n\n        // Execute the API request\n        $response = $this->getRequestService()->envolve($this->getId());\n\n        // Check if the request was successfully executed\n        if ($response->getResult() !== EvolvePokemonResponse_Result::SUCCESS) {\n            throw new Exception(sprintf('Invalid response during pokemon evolve. Result: \\'%s\\' Code: \\'%s\\'',\n                $response->getResult(), GenericEnum::name(EvolvePokemonResponse_Result::class, $response->getResult())));\n        }\n\n        // Update the inventory\n        $this->inventory()->update();\n\n        return $response;\n    }\n\n    /**\n     * Set favorite pokemon.\n     *\n     * @param boolean $favourite\n     * @throws Exception\n     * @return SetFavoritePokemonResponse\n     */\n    public function favorite($favourite)\n    {\n        // Check if already has the requested state\n\n        // Execute the API request\n        $response = $this->getRequestService()->favorite($this->getId(), $favourite);\n\n        // Check if the request was successfully executed\n        if ($response->getResult() !== SetFavoritePokemonResponse_Result::SUCCESS) {\n            throw new Exception(sprintf('Invalid response during changing favorite state. Result: \\'%s\\' Code: \\'%s\\'',\n                $response->getResult(), GenericEnum::name(SetFavoritePokemonResponse_Result::class, $response->getResult())));\n        }\n\n        // Update pokemon state\n        $this->data->setFavorite($favourite);\n\n        return $response;\n    }\n\n    /**\n     * Returns the pokemon data.\n     *\n     * @return PokemonItem\n     */\n    public function getData()\n    {\n        return parent::getData();\n    }\n\n    /**\n     * Returns the request service.\n     *\n     * @return PokemonRequestService\n     */\n    protected function getRequestService()\n    {\n        return new PokemonRequestService();\n    }\n\n}"
  },
  {
    "path": "src/Api/Pokemon/Support/BasePokemonRetriever.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Pokemon\\Support;\n\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\PokemonFamilyId;\n\nclass BasePokemonRetriever\n{\n\n    /**\n     * Returns the pokemon family id.\n     *\n     * @param integer $pokemonId\n     * @return integer\n     */\n    public static function getPokemonFamilyId($pokemonId)\n    {\n        // Check if the pokemon id is a valid pokemon family id\n        if (!PokemonFamilyId::isValid($pokemonId)) {\n            return self::getPokemonFamilyId(--$pokemonId);\n        }\n\n        return $pokemonId;\n    }\n\n}"
  },
  {
    "path": "src/Api/Pokemon/Support/CombatPointsCalculator.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Pokemon\\Support;\n\nclass CombatPointsCalculator\n{\n\n    /**\n     * Calculates the level by combat points multiplier\n     *\n     * @param float $cpMuliplier\n     * @return float\n     */\n    public static function getLevel($cpMuliplier)\n    {\n        $level = 0;\n\n        if ($cpMuliplier < 0.734) {\n            $level = 58.35178527 * $cpMuliplier * $cpMuliplier - 2.838007664 * $cpMuliplier + 0.8539209906;\n        } else {\n            $level = 171.0112688 * $cpMuliplier - 95.20425243;\n        }\n\n        return round(($level) * 2) / 2.0;\n    }\n\n    /**\n     * Get the maximum CP by base attack, base defense and base stamina.\n     *\n     * @param integer $baseAttack\n     * @param integer $baseDefense\n     * @param integer $baseStamina\n     * @return integer\n     */\n    public static function getMaxCp($baseAttack, $baseDefense, $baseStamina)\n    {\n        $attack = 15 + $baseAttack;\n        $defense = 15 + $baseDefense;\n        $stamina = 15 + $baseStamina;\n\n        return self::getMaxCpForPlayer($attack, $defense, $stamina, 40);\n    }\n\n    /**\n     * Get the CP by attack, defense and stamina.\n     *\n     * @param integer $attack\n     * @param integer $defense\n     * @param integer $stamina\n     * @param integer $cpMultiplier\n     * @return integer\n     */\n    public static function getCp($attack, $defense, $stamina, $cpMultiplier)\n    {\n        return (int)($attack * pow($defense, 0.5) * pow($stamina, 0.5) * pow($cpMultiplier, 2) / 10);\n    }\n\n    /**\n     * Get the maximum CP for the player level.\n     *\n     * @param integer $attack\n     * @param integer $defense\n     * @param integer $stamina\n     * @param integer $level\n     * @return float Maximum CP for these levels\n     */\n    public static function getMaxCpForPlayer($attack, $defense, $stamina, $level)\n    {\n        $maxLevel = min($level + 1.5, 40);\n\n        return self::getCp($attack, $defense, $stamina, self::$LEVEL_TO_CP_MULTIPLIER[$maxLevel]);\n    }\n\n    /**\n     * Returns the combat points after powerup.\n     *\n     * @param float $cp\n     * @param float $cpMultiplier\n     * @return integer\n     */\n    public static function getCpAfterPowerup($cp, $cpMultiplier)\n    {\n        $level = self::getLevel($cpMultiplier);\n\n        if ($level <= 10) {\n            return (int)round(($cp * 0.009426125469) / pow($cpMultiplier, 2));\n        }\n        if ($level <= 20) {\n            return (int)round(($cp * 0.008919025675) / pow($cpMultiplier, 2));\n        }\n        if ($level <= 30) {\n            return (int)round(($cp * 0.008924905903) / pow($cpMultiplier, 2));\n        }\n\n        return $cp + (int)round(($cp * 0.00445946079) / pow($cpMultiplier, 2));\n    }\n\n    /**\n     * Returns the candy cost for powerup.\n     *\n     * @param float   $cpMultiplier\n     * @param integer $powerups\n     * @return integer\n     */\n    public static function getCandyCostForPowerup($cpMultiplier, $powerups)\n    {\n        $level = self::getLevel($cpMultiplier);\n\n        if ($level <= 11 && $powerups <= 20) {\n            return 1;\n        }\n\n        if ($level <= 21 && $powerups <= 40) {\n            return 2;\n        }\n\n        if ($level <= 31 && $powerups <= 60) {\n            return 3;\n        }\n\n        return 4;\n    }\n\n    /**\n     * Returns the stardust cost for powerup.\n     *\n     * @param float   $cpMultiplier\n     * @param integer $powerups\n     * @return integer\n     */\n    public static function getStardustCostsForPowerup($cpMultiplier, $powerups)\n    {\n        $level = self::getLevel($cpMultiplier);\n\n        if ($level <= 3 && $powerups <= 4) {\n            return 200;\n        }\n        if ($level <= 4 && $powerups <= 8) {\n            return 400;\n        }\n        if ($level <= 7 && $powerups <= 12) {\n            return 600;\n        }\n        if ($level <= 8 && $powerups <= 16) {\n            return 800;\n        }\n        if ($level <= 11 && $powerups <= 20) {\n            return 1000;\n        }\n        if ($level <= 13 && $powerups <= 24) {\n            return 1300;\n        }\n        if ($level <= 15 && $powerups <= 28) {\n            return 1600;\n        }\n        if ($level <= 17 && $powerups <= 32) {\n            return 1900;\n        }\n        if ($level <= 19 && $powerups <= 36) {\n            return 2200;\n        }\n        if ($level <= 21 && $powerups <= 40) {\n            return 2500;\n        }\n        if ($level <= 23 && $powerups <= 44) {\n            return 3000;\n        }\n        if ($level <= 25 && $powerups <= 48) {\n            return 3500;\n        }\n        if ($level <= 27 && $powerups <= 52) {\n            return 4000;\n        }\n        if ($level <= 29 && $powerups <= 56) {\n            return 4500;\n        }\n        if ($level <= 31 && $powerups <= 60) {\n            return 5000;\n        }\n        if ($level <= 33 && $powerups <= 64) {\n            return 6000;\n        }\n        if ($level <= 35 && $powerups <= 68) {\n            return 7000;\n        }\n        if ($level <= 37 && $powerups <= 72) {\n            return 8000;\n        }\n        if ($level <= 39 && $powerups <= 76) {\n            return 9000;\n        }\n\n        return 10000;\n\n\n    }\n\n    /**\n     * @var array The level to combat points multiplier\n     */\n    protected static $LEVEL_TO_CP_MULTIPLIER = array(\n        '1'    => 0.094,\n        '1.5'  => 0.135137432,\n        '2'    => 0.16639787,\n        '2.5'  => 0.192650919,\n        '3'    => 0.21573247,\n        '3.5'  => 0.236572661,\n        '4'    => 0.25572005,\n        '4.5'  => 0.273530381,\n        '5'    => 0.29024988,\n        '5.5'  => 0.306057377,\n        '6'    => 0.3210876,\n        '6.5'  => 0.335445036,\n        '7'    => 0.34921268,\n        '7.5'  => 0.362457751,\n        '8'    => 0.37523559,\n        '8.5'  => 0.387592406,\n        '9'    => 0.39956728,\n        '9.5'  => 0.411193551,\n        '10'   => 0.42250001,\n        '10.5' => 0.432926419,\n        '11'   => 0.44310755,\n        '11.5' => 0.453059958,\n        '12'   => 0.46279839,\n        '12.5' => 0.472336083,\n        '13'   => 0.48168495,\n        '13.5' => 0.4908558,\n        '14'   => 0.49985844,\n        '14.5' => 0.508701765,\n        '15'   => 0.51739395,\n        '15.5' => 0.525942511,\n        '16'   => 0.53435433,\n        '16.5' => 0.542635767,\n        '17'   => 0.55079269,\n        '17.5' => 0.558830576,\n        '18'   => 0.56675452,\n        '18.5' => 0.574569153,\n        '19'   => 0.58227891,\n        '19.5' => 0.589887917,\n        '20'   => 0.59740001,\n        '20.5' => 0.604818814,\n        '21'   => 0.61215729,\n        '21.5' => 0.619399365,\n        '22'   => 0.62656713,\n        '22.5' => 0.633644533,\n        '23'   => 0.64065295,\n        '23.5' => 0.647576426,\n        '24'   => 0.65443563,\n        '24.5' => 0.661214806,\n        '25'   => 0.667934,\n        '25.5' => 0.674577537,\n        '26'   => 0.68116492,\n        '26.5' => 0.687680648,\n        '27'   => 0.69414365,\n        '27.5' => 0.700538673,\n        '28'   => 0.70688421,\n        '28.5' => 0.713164996,\n        '29'   => 0.71939909,\n        '29.5' => 0.725571552,\n        '30'   => 0.7317,\n        '30.5' => 0.734741009,\n        '31'   => 0.73776948,\n        '31.5' => 0.740785574,\n        '32'   => 0.74378943,\n        '32.5' => 0.746781211,\n        '33'   => 0.74976104,\n        '33.5' => 0.752729087,\n        '34'   => 0.75568551,\n        '34.5' => 0.758630378,\n        '35'   => 0.76156384,\n        '35.5' => 0.764486065,\n        '36'   => 0.76739717,\n        '36.5' => 0.770297266,\n        '37'   => 0.7731865,\n        '37.5' => 0.776064962,\n        '38'   => 0.77893275,\n        '38.5' => 0.781790055,\n        '39'   => 0.78463697,\n        '39.5' => 0.787473578,\n        '40'   => 0.79030001,\n    );\n\n}\n"
  },
  {
    "path": "src/Api/Pokemon/Support/PokemonDetailsTrait.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Pokemon\\Support;\n\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\CandyItem;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\PokedexItem;\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Data\\PokemonMetaRegistry;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\PokemonId;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\PokemonMove;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Enums\\PokemonType;\nuse POGOProtos\\Networking\\Responses\\EvolvePokemonResponse_Result;\nuse POGOProtos\\Networking\\Responses\\UpgradePokemonResponse_Result;\n\ntrait PokemonDetailsTrait\n{\n\n    /**\n     * Returns the pokemon family id.\n     *\n     * @return integer\n     */\n    public function getFamilyId()\n    {\n        // Retrieve the pokemon metadata\n        $data = PokemonMetaRegistry::getByPokemonId($this->getPokemonId());\n\n        return $data->getFamily();\n    }\n\n    /**\n     * Returns the pokemon type.\n     *\n     * @return string\n     */\n    public function getType1String()\n    {\n        // Retrieve the pokemon metadata\n        $data = PokemonMetaRegistry::getByPokemonId($this->getPokemonId());\n\n        return PokemonType::name($data->getType1());\n    }\n\n    /**\n     * Returns the pokemon second type.\n     *\n     * @return string\n     */\n    public function getType2String()\n    {\n        // Retrieve the pokemon metadata\n        $data = PokemonMetaRegistry::getByPokemonId($this->getPokemonId());\n\n        return PokemonType::name($data->getType2());\n    }\n\n    /**\n     * Returns the pokemon move1.\n     *\n     * @return string\n     */\n    public function getMove1String()\n    {\n        return PokemonMove::name($this->getMove1());\n    }\n\n    /**\n     * Returns the pokemon move2.\n     *\n     * @return string\n     */\n    public function getMove2String()\n    {\n        return PokemonMove::name($this->getMove2());\n    }\n\n    /**\n     * Returns the combat points after powerup.\n     *\n     * @return int\n     */\n    public function getCpAfterPowerup()\n    {\n        return CombatPointsCalculator::getCpAfterPowerup($this->getCp(),\n            $this->getCpMultiplier() + $this->getAdditionalCpMultiplier());\n    }\n\n    /**\n     * Returns the candy cost for powerup.\n     *\n     * @return integer\n     */\n    public function getCandyCostForPowerup()\n    {\n        return CombatPointsCalculator::getCandyCostForPowerup($this->getCpMultiplier() + $this->getAdditionalCpMultiplier(),\n            $this->getNumUpgrades());\n    }\n\n    /**\n     * Returns the stardust cost for powerup.\n     *\n     * @return integer\n     */\n    public function getStardustCostsForPowerup()\n    {\n        return CombatPointsCalculator::getStardustCostsForPowerup($this->getCpMultiplier() + $this->getAdditionalCpMultiplier(),\n            $this->getNumUpgrades());\n    }\n\n    /**\n     * Returns true if injured, false otherwise.\n     *\n     * @return boolean\n     */\n    public function isInjured()\n    {\n        return !$this->isFainted() && $this->getStamina() < $this->getStaminaMax();\n    }\n\n    /**\n     * Returns true if fainted, false otherwise.\n     *\n     * @return boolean\n     */\n    public function isFainted()\n    {\n        return $this->getStamina() == 0;\n    }\n\n    /**\n     * Returns true if it is possible to evolve, false otherwise.\n     *\n     * @return boolean\n     */\n    public function canEvolve()\n    {\n        return $this->getEvolveStatus() === EvolvePokemonResponse_Result::SUCCESS;\n    }\n\n    /**\n     * Returns the evolve status.\n     *\n     * @return int\n     */\n    public function getEvolveStatus()\n    {\n        // Check if the pokemon is deployed at fort\n        if ($this->isDeployed()) {\n            return EvolvePokemonResponse_Result::FAILED_POKEMON_IS_DEPLOYED;\n        }\n\n        // Retrieve the pokemon metadata\n        $data = PokemonMetaRegistry::getByPokemonId($this->getPokemonId());\n\n        // Check if the pokemon type can be evolved\n        if ($data->getCandyToEvolve() === 0) {\n            return EvolvePokemonResponse_Result::FAILED_POKEMON_CANNOT_EVOLVE;\n        }\n\n        if ($this->getCandies()->getCount() < $data->getCandyToEvolve()) {\n            return EvolvePokemonResponse_Result::FAILED_INSUFFICIENT_RESOURCES;\n        }\n\n        return EvolvePokemonResponse_Result::SUCCESS;\n    }\n\n    /**\n     * Returns true if it is possible to upgrade, false otherwise.\n     *\n     * @return boolean\n     */\n    public function canUpgrade()\n    {\n        return $this->getUpgradeStatus() === UpgradePokemonResponse_Result::SUCCESS;\n    }\n\n    /**\n     * Returns the upgrade status.\n     *\n     * @return int\n     */\n    public function getUpgradeStatus()\n    {\n        // Check if the pokemon is deployed at fort\n        if ($this->isDeployed()) {\n            return UpgradePokemonResponse_Result::ERROR_POKEMON_IS_DEPLOYED;\n        }\n\n        // Check if the combat points is higher than the maximum level for the player level\n        if ($this->getCp() >= $this->getMaxCpForPlayer()) {\n            return UpgradePokemonResponse_Result::ERROR_UPGRADE_NOT_AVAILABLE;\n        }\n\n        // Retrieve the amount of stardust\n        $stardustAmount = $this->profile()->getCurrencies()->getStardust()->getAmount();\n\n        // Retrieve the candy amount\n        $candyAmount = $this->getCandies()->getCount();\n\n        if ($stardustAmount < $this->getStardustCostsForPowerup() || $candyAmount < $this->getCandyCostForPowerup()) {\n            return UpgradePokemonResponse_Result::ERROR_INSUFFICIENT_RESOURCES;\n        }\n\n        return UpgradePokemonResponse_Result::SUCCESS;\n    }\n\n\n    /**\n     * Returns the base stamina.\n     *\n     * @return integer\n     */\n    public function getBaseStamina()\n    {\n        // Retrieve the pokemon metadata\n        $data = PokemonMetaRegistry::getByPokemonId($this->getPokemonId());\n\n        return $data->getBaseStamina();\n    }\n\n    /**\n     * Returns the base capture rate.\n     *\n     * @return double\n     */\n    public function getBaseCaptureRate()\n    {\n        // Retrieve the pokemon metadata\n        $data = PokemonMetaRegistry::getByPokemonId($this->getPokemonId());\n\n        return $data->getBaseCaptureRate();\n    }\n\n    /**\n     * Returns the candies to evolve.\n     *\n     * @return integer\n     */\n    public function getCandiesToEvolve()\n    {\n        // Retrieve the pokemon metadata\n        $data = PokemonMetaRegistry::getByPokemonId($this->getPokemonId());\n\n        return $data->getCandyToEvolve();\n    }\n\n    /**\n     * Returns base flee rate.\n     *\n     * @return integer\n     */\n    public function getBaseFleeRate()\n    {\n        // Retrieve the pokemon metadata\n        $data = PokemonMetaRegistry::getByPokemonId($this->getPokemonId());\n\n        return $data->getBaseFleeRate();\n    }\n\n    /**\n     * Returns the pokemon name.\n     *\n     * @return mixed|string\n     */\n    public function getName()\n    {\n        return $this->getNameOrNickname();\n    }\n\n    /**\n     * Returns the level.\n     *\n     * @return float\n     */\n    public function getLevel()\n    {\n        return CombatPointsCalculator::getLevel($this->getCpMultiplier() + $this->getAdditionalCpMultiplier());\n    }\n\n    /**\n     * @return float\n     */\n    public function getIvRatio()\n    {\n        return ($this->getIndividualAttack() +\n            $this->getIndividualDefense() + $this->getIndividualStamina()) / 45.0;\n    }\n\n    /**\n     * Returns the number of candies.\n     *\n     * @return CandyItem\n     */\n    public function getCandies()\n    {\n        return $this->candyBank()->get($this->getFamilyId());\n    }\n\n    /**\n     * Returns the pokedex entry.\n     *\n     * @return PokedexItem\n     */\n    public function getPokedexEntry()\n    {\n        return $this->pokedex()->get($this->getPokemonId());\n    }\n\n    /**\n     * Returns true if deployed, false otherwise.\n     *\n     * @return boolean\n     */\n    public function isDeployed()\n    {\n        return $this->getDeployedFortId() != null;\n    }\n\n    /**\n     * Calculate the maximum CP for this individual pokemon and this player's level\n     *\n     * @return float The maximum CP for this pokemon\n     * @throws NoSuchItemException   If the PokemonId value cannot be found in the {@link PokemonMetaRegistry}.\n     * @throws LoginFailedException  If login failed\n     * @throws RemoteServerException If the server is causing issues\n     */\n    public function getMaxCpForPlayer()\n    {\n        // Retrieve the pokemon metadata\n        $data = PokemonMetaRegistry::getByPokemonId($this->getPokemonId());\n\n        $attack = $this->getIndividualAttack() + $data->getBaseAttack();\n        $defense = $this->getIndividualDefense() + $data->getBaseDefense();\n        $stamina = $this->getIndividualStamina() + $data->getBaseStamina();\n\n        $level = $this->inventory()->getStats()->getLevel();\n\n        return CombatPointsCalculator::getMaxCpForPlayer($attack, $defense, $stamina, $level);\n    }\n\n\n    /**\n     * Returns the pokemon name or nickname.\n     *\n     * @return string\n     */\n    protected function getNameOrNickname()\n    {\n        // Check if the pokemon has a nickname\n        if ($this->getNickname() != null) {\n            return $this->getNickname();\n        }\n\n        return PokemonId::name($this->getPokemonId());\n    }\n\n}"
  },
  {
    "path": "src/Api/PokemonGoApi.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api;\n\nuse NicklasW\\PkmGoApi\\Api\\Map\\Map;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Inventory;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Journal;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Profile;\nuse NicklasW\\PkmGoApi\\Api\\Player\\CheckChallenge;\nuse NicklasW\\PkmGoApi\\Requests\\VerifyChallengeRequest;\nuse NicklasW\\PkmGoApi\\Services\\RequestService;\n\nclass PokemonGoApi {\n\n    /**\n     * @var RequestService\n     */\n    protected $requestService;\n\n    /**\n     * @var Inventory\n     */\n    protected $inventory;\n\n    /**\n     * @var Profile\n     */\n    protected $profile;\n\n    /**\n     * @var Journal\n     */\n    protected $journal;\n\n    /**\n     * @var Map\n     */\n    protected $map;\n\n    /**\n     * @var CheckChallenge\n     */\n    protected $checkChallenge;\n\n    /**\n     * Application constructor.\n     */\n    public function __construct()\n    {\n        // Initial the Request Service\n        $this->requestService = new RequestService();\n\n        // Initialize the prerequisites\n        $this->initialize();\n    }\n\n    /**\n     * Returns the player inventory.\n     *\n     * @return Inventory\n     */\n    public function getInventory()\n    {\n        return $this->inventory;\n    }\n\n    /**\n     * Returns the player profile.\n     *\n     * @return Profile\n     */\n    public function getProfile()\n    {\n        return $this->profile;\n    }\n\n    /**\n     * @return Journal\n     */\n    public function getJournal()\n    {\n        return $this->journal;\n    }\n\n    /**\n     * Returns the map.\n     *\n     * @return Map\n     */\n    public function getMap()\n    {\n        return $this->map;\n    }\n\n    /**\n     * Returns the player checkChallenge.\n     *\n     * @return CheckChallenge\n     */\n    public function checkChallenge()\n    {\n        return $this->checkChallenge;\n    }\n\n    /**\n     * Sends back the RECaptcha challenge token\n     *\n     * @param string $token The recaptcha \"solved-token\"\n     *\n     * @return bool Whether the account is now \"unflagged\"\n     */\n    public function verifyChallenge($token)\n    {\n        $request = new VerifyChallengeRequest($token);\n\n        $this->getRequestService()->requestHandler()->handle($request);\n\n        /** @var \\POGOProtos\\Networking\\Responses\\VerifyChallengeResponse $response */\n        $response = $request->getData();\n\n        return (bool) $response->getSuccess();\n    }\n\n    /**\n     * @return RequestService\n     */\n    public function getRequestService()\n    {\n        return $this->requestService;\n    }\n\n    /**\n     * Initialize the prerequisites.\n     */\n    protected function initialize()\n    {\n        // Initialize the inventory instance\n        $this->inventory = new Inventory($this);\n\n        // Initialize the profile instance\n        $this->profile = new Profile($this);\n\n        // Initialize the journal instance\n        $this->journal = new Journal($this);\n\n        // Initialize the map instance\n        $this->map = new Map($this);\n\n        // Initialize the checkChallenge instance\n        $this->checkChallenge = new CheckChallenge($this);\n    }\n}\n\n"
  },
  {
    "path": "src/Api/Procedure.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Api;\n\nuse NicklasW\\PkmGoApi\\Api\\Data\\Data;\nuse NicklasW\\PkmGoApi\\Api\\Support\\Traits\\MakeApiResourcesAvailable;\nuse NicklasW\\PkmGoApi\\Services\\RequestService;\n\nabstract class Procedure\n{\n\n    use MakeApiResourcesAvailable;\n\n    /**\n     * @var mixed\n     */\n    protected $data;\n\n    /**\n     * Update the data.\n     */\n    public function update()\n    {\n\n    }\n\n    /**\n     * Returns the data.\n     *\n     * @returns Data\n     */\n    public function getData()\n    {\n        // Check if the data is available since earlier\n        if ($this->data === null) {\n            $this->update();\n        }\n\n        return $this->data;\n    }\n\n    /**\n     * @param string $name\n     * @param mixed $arguments\n     * @return mixed\n     */\n    public function __call($name, $arguments)\n    {\n        // Check if the data is defined\n        if ($this->data == null) {\n            $this->update();\n        }\n\n        return $this->data->{$name}($arguments);\n    }\n\n    /**\n     * Returns the request service.\n     *\n     * @return RequestService\n     */\n    protected function getRequestService()\n    {\n        return $this->getPokemonGoApi()->getRequestService();\n    }\n\n}"
  },
  {
    "path": "src/Api/Support/Enums/AbstractEnum.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Support\\Enums;\n\nuse ReflectionClass;\n\nabstract class AbstractEnum\n{\n\n    /**\n     * @var array List of cached entries and corresponding name.\n     */\n    protected static $CACHED_ENTRIES;\n\n    /**\n     * @var string The enum class\n     */\n    protected static $class;\n\n    /**\n     * Returns the enum name.\n     *\n     * @param int $id The enum id\n     * @return string|null\n     */\n    public static function name($id)\n    {\n        // Retrieve the list of enum ids\n        $enum = static::getCachedEnumEntries();\n\n        // Check if we retrieved a valid enu id\n        if (array_key_exists($id, $enum)) {\n            return $enum[$id];\n        }\n\n        return null;\n    }\n\n    /**\n     * Returns true if valid, false otherwise.\n     *\n     * @param int $id The enum id\n     * @return bool\n     */\n    public static function isValid($id)\n    {\n        // Retrieve the list of enum ids\n        $pokemon = static::getCachedEnumEntries();\n\n        return array_key_exists($id, $pokemon);\n    }\n\n    /**\n     * Returns defined enum ids.\n     *\n     * @return array\n     */\n    protected static function getCachedEnumEntries()\n    {\n        // Check if the pokemon ids has been cached since earlier\n        if (static::$CACHED_ENTRIES == null) {\n            $reflectClass = new ReflectionClass(static::$class);\n            static::$CACHED_ENTRIES = array_flip($reflectClass->getConstants());\n        }\n\n        return static::$CACHED_ENTRIES;\n    }\n\n}"
  },
  {
    "path": "src/Api/Support/Enums/GenericEnum.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Support\\Enums;\n\nuse ReflectionClass;\n\nclass GenericEnum\n{\n\n    /**\n     * @var array List of cached entries and corresponding name.\n     */\n    protected static $CACHED_ENTRIES = array();\n\n    /**\n     * Returns the enum name.\n     *\n     * @param string $class The enum class\n     * @param int    $id    The enum id\n     * @return null|string\n     */\n    public static function name($class, $id)\n    {\n        // Retrieve the list of enum ids\n        $enum = self::getCachedEnumEntries($class);\n\n        var_dump($enum);\n\n\n        // Check if we retrieved a valid enu id\n        if (array_key_exists($id, $enum)) {\n            return $enum[$id];\n        }\n\n        return null;\n    }\n\n    /**\n     * Returns true if valid, false otherwise.\n     *\n     * @param int $class The enum class\n     * @param int $id    The enum id\n     * @return bool\n     */\n    public static function isValid($class, $id)\n    {\n        // Retrieve the list of enum ids\n        $pokemon = self::getCachedEnumEntries($class);\n\n        return array_key_exists($id, $pokemon);\n    }\n\n    /**\n     * Returns defined enum ids.\n     *\n     * @param string $class The enum class\n     * @return array\n     */\n    protected static function getCachedEnumEntries($class)\n    {\n        // Check whether the enum class is cached since earlier\n        if (!array_key_exists($class, self::$CACHED_ENTRIES)) {\n            $reflectClass = new ReflectionClass($class);\n            self::$CACHED_ENTRIES[$class] = array_flip($reflectClass->getConstants());\n        }\n\n        return self::$CACHED_ENTRIES[$class];\n    }\n\n}"
  },
  {
    "path": "src/Api/Support/Enums/ItemId.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Support\\Enums;\n\nclass ItemId extends AbstractEnum\n{\n\n    /**\n     * @var string The enum class\n     */\n    protected static $class = \\POGOProtos\\Inventory\\Item\\ItemId::class;\n\n    /**\n     * @var array List of cached entries and corresponding name.\n     */\n    protected static $CACHED_ENTRIES;\n\n}"
  },
  {
    "path": "src/Api/Support/Enums/PokemonFamilyId.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Support\\Enums;\n\nclass PokemonFamilyId extends AbstractEnum\n{\n\n    /**\n     * @var string The enum class\n     */\n    protected static $class = \\POGOProtos\\Enums\\PokemonFamilyId::class;\n\n    /**\n     * @var array List of cached entries and corresponding name.\n     */\n    protected static $CACHED_ENTRIES;\n\n}"
  },
  {
    "path": "src/Api/Support/Enums/PokemonId.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Support\\Enums;\n\nclass PokemonId extends AbstractEnum\n{\n\n    /**\n     * @var string The enum class\n     */\n    protected static $class = \\POGOProtos\\Enums\\PokemonId::class;\n\n    /**\n     * @var array List of cached entries and corresponding name.\n     */\n    protected static $CACHED_ENTRIES;\n\n}"
  },
  {
    "path": "src/Api/Support/Enums/PokemonMove.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Support\\Enums;\n\nclass PokemonMove extends AbstractEnum\n{\n\n    /**\n     * @var string The enum class\n     */\n    protected static $class = \\POGOProtos\\Enums\\PokemonMove::class;\n\n    /**\n     * @var array List of cached entries and corresponding name.\n     */\n    protected static $CACHED_ENTRIES;\n\n}"
  },
  {
    "path": "src/Api/Support/Enums/PokemonType.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Support\\Enums;\n\nclass PokemonType extends AbstractEnum\n{\n\n    /**\n     * @var string The enum class\n     */\n    protected static $class = \\POGOProtos\\Enums\\PokemonType::class;\n\n    /**\n     * @var array List of cached entries and corresponding name.\n     */\n    protected static $CACHED_ENTRIES;\n\n}"
  },
  {
    "path": "src/Api/Support/Traits/MakeApiResourcesAvailable.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Support\\Traits;\n\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\CandyBank;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\PokeBank;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\Pokedex;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Inventory;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Profile;\nuse NicklasW\\PkmGoApi\\Api\\PokemonGoApi;\nuse NicklasW\\PkmGoApi\\Facades\\App;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\n\ntrait MakeApiResourcesAvailable {\n\n    /**\n     * Returns the poke bank.\n     *\n     * @return PokeBank\n     */\n    protected function pokeBank()\n    {\n        return $this->getPokemonGoApi()->getInventory()->getPokeBank();\n    }\n\n    /**\n     * Returns the candy bank.\n     *\n     * @return Pokedex\n     */\n    protected function pokedex()\n    {\n        return $this->inventory()->getPokedex();\n    }\n\n    /**\n     * Returns the candy bank.\n     *\n     * @return CandyBank\n     */\n    protected function candyBank()\n    {\n        return $this->inventory()->getCandyBank();\n    }\n\n    /**\n     * Returns the candy bank.\n     *\n     * @return Profile\n     */\n    protected function profile()\n    {\n        return $this->getPokemonGoApi()->getProfile();\n    }\n\n    /**\n     * Returns the inventory.\n     *\n     * @return Inventory\n     */\n    protected function inventory()\n    {\n        return $this->getPokemonGoApi()->getInventory();\n    }\n\n    /**\n     * Returns the pokemon go api.\n     *\n     * @return PokemonGoApi\n     */\n    protected function getPokemonGoApi()\n    {\n        return App::getPokemonGoApi();\n    }\n\n    /**\n     * Returns the application.\n     *\n     * @return ApplicationKernel\n     */\n    protected function getApplication()\n    {\n        return App::getInstance();\n    }\n}\n\n"
  },
  {
    "path": "src/Api/Support/Traits/MakeDataPropertiesCallable.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Api\\Support\\Traits;\n\ntrait MakeDataPropertiesCallable {\n\n    /**\n     * @param $name\n     * @param $arguments\n     */\n    public function __call($name, $arguments)\n    {\n        return $this->data->{$name}($arguments);\n    }\n\n}\n"
  },
  {
    "path": "src/Authentication/AccessToken.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication;\n\nclass AccessToken {\n\n    /**\n     * @var string\n     */\n    const PROVIDER_GOOGLE = 'google';\n\n    /**\n     * @var string\n     */\n    const PROVIDER_PTC = 'ptc';\n\n    /**\n     * @var string The Oauth token\n     */\n    protected $token;\n\n    /**\n     * @var integer The lifetime timestamp of the token\n     */\n    protected $timestamp;\n\n    /**\n     * @var string The refresh token\n     */\n    protected $refreshToken;\n\n    /**\n     * @var string The token provider\n     */\n    protected $provider;\n\n    /**\n     * AccessToken constructor.\n     *\n     * @param string  $token        The Oauth token\n     * @param string  $provider     The provider, either google or ptc\n     * @param integer $timestamp    The timestamp of the Oauth token\n     * @param string  $refreshToken The refresh token\n     */\n    public function __construct($token, $provider, $timestamp = null, $refreshToken = null)\n    {\n        $this->token = $token;\n        $this->provider = $provider;\n        $this->timestamp = $timestamp;\n        $this->refreshToken = $refreshToken;\n    }\n\n    /**\n     * @return string\n     */\n    public function getToken()\n    {\n        return $this->token;\n    }\n\n    /**\n     * @param string $token\n     */\n    public function setToken($token)\n    {\n        $this->token = $token;\n    }\n\n    /**\n     * @return int\n     */\n    public function getTimestamp()\n    {\n        return $this->timestamp;\n    }\n\n    /**\n     * @param int $timestamp\n     */\n    public function setTimestamp($timestamp)\n    {\n        $this->timestamp = $timestamp;\n    }\n\n    /**\n     * Returns true if the timestamp is defined, false otherwise.\n     *\n     * @return boolean\n     */\n    public function hasTimestamp()\n    {\n        return $this->timestamp !== null;\n    }\n\n    /**\n     * Returns true if the timestamp is valid, false otherwise.\n     *\n     * @return boolean\n     */\n    public function isTimestampValid()\n    {\n        return $this->hasTimestamp() && intval($this->timestamp) > time();\n    }\n\n    /**\n     * Returns true if the access token is valid, false otherwise.\n     *\n     * @return boolean\n     */\n    public function isValid()\n    {\n        // Check if we have a oauth token, but no token lifetime timestamp\n        if ($this->getToken() && !$this->hasTimestamp()) {\n            // Authenticated using oauth token, we can't validate the state of the access token.\n            return true;\n        }\n\n        // Check if we have a oauth token, a token lifetime timestamp and no fresh token\n        if ($this->getToken() && $this->hasTimestamp() && !$this->hasFreshToken()) {\n            // Authenticated using user credentials. We have no refresh token.\n            return $this->isTimestampValid();\n        }\n\n        // Check if we have a fresh token and a token lifetime timestamp\n        if ($this->hasFreshToken() && $this->hasTimestamp()) {\n            // Authenticated using authentication code, or refresh token.\n            return true;\n        }\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getRefreshToken()\n    {\n        return $this->refreshToken;\n    }\n\n    /**\n     * @param mixed $refreshToken\n     */\n    public function setRefreshToken($refreshToken)\n    {\n        $this->refreshToken = $refreshToken;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function hasFreshToken()\n    {\n        return $this->refreshToken !== null;\n    }\n\n    /**\n     * @return string\n     */\n    public function getProvider()\n    {\n        return $this->provider;\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Config/Config.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Config;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\n\nclass Config {\n\n    /**\n     * @var string\n     */\n    protected $user;\n\n    /**\n     * @var string\n     */\n    protected $password;\n\n    /**\n     * @var string\n     */\n    protected $authToken;\n\n    /**\n     * @var string\n     */\n    protected $refreshToken;\n\n    /**\n     * @var string\n     */\n    protected $oauthToken;\n\n    /**\n     * @var string\n     */\n    protected $provider;\n\n    /**\n     * @return string\n     */\n    public function getUser()\n    {\n        return $this->user;\n    }\n\n    /**\n     * @param string $user\n     */\n    public function setUser($user)\n    {\n        $this->user = $user;\n    }\n\n    /**\n     * @return string\n     */\n    public function getPassword()\n    {\n        return $this->password;\n    }\n\n    /**\n     * @param string $password\n     */\n    public function setPassword($password)\n    {\n        $this->password = $password;\n    }\n\n    /**\n     * @return string\n     */\n    public function getAuthToken()\n    {\n        return $this->authToken;\n    }\n\n    /**\n     * @param string $authToken\n     */\n    public function setAuthToken($authToken)\n    {\n        $this->authToken = $authToken;\n    }\n\n    /**\n     * @return string\n     */\n    public function getRefreshToken()\n    {\n        return $this->refreshToken;\n    }\n\n    /**\n     * @param string $refreshToken\n     */\n    public function setRefreshToken($refreshToken)\n    {\n        $this->refreshToken = $refreshToken;\n    }\n\n    /**\n     * @return string\n     */\n    public function getOauthToken()\n    {\n        return $this->oauthToken;\n    }\n\n    /**\n     * @param string $oauthToken\n     */\n    public function setOauthToken($oauthToken)\n    {\n        $this->oauthToken = $oauthToken;\n    }\n\n    /**\n     * @return string\n     */\n    public function getProvider()\n    {\n        return $this->provider;\n    }\n\n    /**\n     * @param string $provider\n     */\n    public function setProvider($provider)\n    {\n        $this->provider = $provider;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isGoogle()\n    {\n        return $this->provider === Factory::PROVIDER_GOOGLE;\n    }\n\n    /**\n     * @return boolean\n     */\n    public function isPTC()\n    {\n        return $this->provider === Factory::PROVIDER_PTC;\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Contracts/Authenticator.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Contracts;\n\ninterface Authenticator {\n\n    public function authenticate();\n\n}"
  },
  {
    "path": "src/Authentication/Exceptions/AuthenticationException.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Exceptions;\n\nuse \\Exception;\n\nclass AuthenticationException extends Exception {\n\n    const PTC_INVALID_GRANT_ERROR = 498;\n    const AUTH_SERVER_ERROR = 503;\n\n    /**\n     * AuthenticationException constructor.\n     *\n     * @param string    $message\n     * @param int       $code\n     * @param Exception $previous\n     */\n    public function __construct($message = '', $code = 0, Exception $previous = null)\n    {\n        parent::__construct($message, $code, $previous);\n    }\n\n    /**\n     * Determines whether the authentication should be retried.\n     * It makes sense to retry if a server-error occured, but not if the credentials are invalid.\n     *\n     * @return bool\n     */\n    public function shouldRetry()\n    {\n        $code = $this->getCode();\n\n        return $code == static::PTC_INVALID_GRANT_ERROR || $code == static::AUTH_SERVER_ERROR;\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Exceptions/IllegalAuthenticationTypeException.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Exceptions;\n\nuse \\Exception;\n\nclass IllegalAuthenticationTypeException extends Exception {\n\n    /**\n     * IllegalAuthenticationTypeException constructor.\n     *\n     * @param string    $message\n     * @param int       $code\n     * @param Exception $previous\n     */\n    public function __construct($message = '', $code = 0, Exception $previous = null)\n    {\n        parent::__construct($message, $code, $previous);\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Exceptions/ResponseException.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Exceptions;\n\nuse \\Exception;\n\nclass ResponseException extends Exception {\n\n    /**\n     * AuthenticationException constructor.\n     *\n     * @param string    $message\n     * @param int       $code\n     * @param Exception $previous\n     */\n    public function __construct($message = '', $code = 0, Exception $previous = null)\n    {\n        parent::__construct($message, $code, $previous);\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Factory/Factory.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Factory;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCodeManager as GoogleAuthenticationCodeManager;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentialsManager as GoogleAuthenticationCredentialsManager;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationOauthTokenManager as GoogleAuthenticationOauthTokenManager;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshTokenManager as GoogleAuthenticationRefreshTokenManager;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentialsManager as PTCAuthenticationCredentialsManager;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationOauthTokenManager as PTCAuthenticationOauthTokenManager;\n\nclass Factory {\n\n    /**\n     * @var string\n     */\n    const PROVIDER_GOOGLE = 'google';\n\n    /**\n     * @var string\n     */\n    const PROVIDER_PTC = 'ptc';\n\n    /**\n     * Create authentication manager.\n     *\n     * @param Config|AccessToken $config\n     * @return Manager\n     */\n    public static function create($config)\n    {\n        if (self::isAccessConfig($config)) {\n            return self::createAuthenticationManagerByAccessToken($config);\n        }\n\n        return self::createAuthenticationManager($config);\n    }\n\n    /**\n     * @param Config $config\n     * @return Manager\n     * @throws Exception\n     */\n    protected static function createAuthenticationManager($config)\n    {\n        if ($config->isGoogle()) {\n            return self::createGoogleManager($config);\n        } elseif ($config->isPTC()) {\n            return self::createPTCManager($config);\n        }\n\n        throw new Exception('Invalid config provided. No provider defined');\n    }\n\n    /**\n     * Create authentication manager.\n     *\n     * @param AccessToken $accessToken\n     *\n     * @return Manager\n     *\n     * @throws AuthenticationException\n     * @throws Exception\n     */\n    protected static function createAuthenticationManagerByAccessToken($accessToken)\n    {\n        if ($accessToken->getProvider() == AccessToken::PROVIDER_GOOGLE) {\n            // Check if a token timestamp is provided\n            if (!$accessToken->hasTimestamp()) {\n                return new GoogleAuthenticationOauthTokenManager($accessToken);\n            }\n\n            // Check if a fresh token is available, check if it is still valid\n            if ($accessToken->hasFreshToken() && $accessToken->isTimestampValid()) {\n                return new GoogleAuthenticationRefreshTokenManager($accessToken->getRefreshToken());\n            }\n\n            if ($accessToken->isTimestampValid()) {\n                return new GoogleAuthenticationOauthTokenManager($accessToken);\n            }\n\n            throw new AuthenticationException('Please re-login, the access token has expired');\n        } elseif ($accessToken->getProvider() == AccessToken::PROVIDER_PTC) {\n            if (!$accessToken->isTimestampValid()) {\n                throw new AuthenticationException('Please re-login, the access token has expired');\n            }\n\n            return new PTCAuthenticationOauthTokenManager($accessToken);\n        }\n\n        throw new Exception('Invalid config provided. No provider defined');\n    }\n\n    /**\n     * Create Google authentication manager.\n     *\n     * @param Config $config\n     * @return GoogleAuthenticationCodeManager|GoogleAuthenticationCredentialsManager|GoogleAuthenticationOauthTokenManager\n     * @throws AuthenticationException\n     */\n    protected static function createGoogleManager($config)\n    {\n        if (self::isAdaptedForGoogleRefreshTokenManager($config)) {\n            return self::createGoogleRefreshTokenManager($config);\n        }\n\n        if (self::isAdaptedForGoogleOauthToken($config)) {\n            return self::createGoogleOauthManager($config);\n        }\n\n        if (self::isAdaptedForGoogleAuthenticationCodeManager($config)) {\n            return self::createGoogleAuthenticationCodeManager($config);\n        }\n\n        if (self::isAdaptedForUserCredentialsManager($config)) {\n            return self::createGoogleUserCredentialsManager($config);\n        }\n\n        throw new AuthenticationException('Invalid config provided. Could not create authentication manager');\n\n    }\n\n    /**\n     * Create PTC authentication manager.\n     *\n     * @param Config $config\n     * @return PTCAuthenticationCredentialsManager\n     * @throws AuthenticationException\n     */\n    protected static function createPTCManager($config)\n    {\n        if (self::isAdaptedForUserCredentialsManager($config)) {\n            return new PTCAuthenticationCredentialsManager($config->getUser(), $config->getPassword());\n        }\n\n        throw new AuthenticationException('Invalid config provided. Could not create authentication manager');\n    }\n\n    /**\n     * Return true if config is of type access token, false otherwise.\n     *\n     * @param Config|AccessToken $config\n     * @return boolean\n     */\n    protected static function isAccessConfig($config)\n    {\n        return $config instanceof AccessToken;\n    }\n\n    /**\n     * Returns true if the config is adapted for google authentication code manager, false otherwise.\n     *\n     * @param Config $config\n     * @return boolean\n     */\n    protected static function isAdaptedForGoogleAuthenticationCodeManager($config)\n    {\n        return $config->getAuthToken() !== null;\n    }\n\n    /**\n     * Returns true if the config is adapted for google user credentials manager, false otherwise.\n     *\n     * @param Config $config\n     * @return boolean\n     */\n    protected static function isAdaptedForUserCredentialsManager($config)\n    {\n        return $config->getUser() !== null && $config->getPassword() !== null;\n    }\n\n    /**\n     * Returns true if the config is adapted for google Oauth token manager, false otherwise.\n     *\n     * @param Config $config\n     * @return boolean\n     */\n    protected static function isAdaptedForGoogleOauthToken($config)\n    {\n        return $config->getOauthToken() !== null;\n    }\n\n    /**\n     * Returns true if the config is adapted for google refresh token manager, false otherwise.\n     *\n     * @param Config $config\n     * @return boolean\n     */\n    protected static function isAdaptedForGoogleRefreshTokenManager($config)\n    {\n        return $config->getRefreshToken() !== null;\n    }\n\n    /**\n     * Create Google refresh token manager.\n     *\n     * @param Config $config\n     * @return GoogleAuthenticationCodeManager\n     */\n    protected static function createGoogleRefreshTokenManager($config)\n    {\n        return new GoogleAuthenticationRefreshTokenManager($config->getRefreshToken());\n    }\n\n    /**\n     * Create Google oauth manager.\n     *\n     * @param Config $config\n     * @return GoogleAuthenticationOauthTokenManager\n     */\n    protected static function createGoogleOauthManager($config)\n    {\n        return new GoogleAuthenticationOauthTokenManager($config->getOauthToken());\n    }\n\n    /**\n     * Create Google user credentials manager.\n     *\n     * @param Config $config\n     * @return GoogleAuthenticationCodeManager\n     */\n    protected static function createGoogleAuthenticationCodeManager($config)\n    {\n        return new GoogleAuthenticationCodeManager($config->getAuthToken());\n    }\n\n    /**\n     * Create Google user credentials manager.\n     *\n     * @param Config $config\n     * @return GoogleAuthenticationCredentialsManager\n     */\n    protected static function createGoogleUserCredentialsManager($config)\n    {\n        return new GoogleAuthenticationCredentialsManager($config->getUser(), $config->getPassword());\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Manager.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication;\n\nuse Closure;\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\AuthenticationException;\n\nabstract class Manager {\n\n    /**\n     * @var integer The access token event\n     */\n    const EVENT_ACCESS_TOKEN = 0;\n\n    /**\n     * @var array\n     */\n    protected $listeners = array();\n\n    /**\n     * @var AccessToken The access token\n     */\n    protected $accessToken;\n\n    /**\n     * Returns the Oauth token.\n     *\n     * @return AccessToken\n     */\n    abstract public function getAccessToken();\n\n    /**\n     * Returns the identifier.\n     *\n     * @return string\n     */\n    abstract public function getIdentifier();\n\n    /**\n     * Adds a listener to the list of listeners\n     *\n     * @param Closure $listener\n     */\n    public function addListener(Closure $listener)\n    {\n        $this->listeners[] = $listener;\n    }\n\n    /**\n     * Dispatch a event to the listeners\n     *\n     * @param int   $event\n     * @param mixed $data\n     */\n    public function dispatchEvent($event, $data)\n    {\n        // Iterate through the list of listeners\n        foreach ($this->listeners as $listener) {\n            // Dispatch the event to the listener\n            $listener($event, $data);\n        }\n    }\n\n    /**\n     * @param AccessToken $accessToken\n     */\n    public function setAccessToken($accessToken)\n    {\n        $this->accessToken = $accessToken;\n    }\n\n    /**\n     * Refresh the token if possible.\n     *\n     * @return AccessToken\n     * @throws AuthenticationException\n     */\n    protected function refreshTokenIfPossible()\n    {\n        // Check if the oauth token is valid\n        if ($this->isTokenValid()) {\n            return $this->accessToken;\n        }\n\n        // Check if a refresh token is defined\n        if ($this->hasFreshToken()) {\n            // Use refresh token to retrieve new oauth token\n\n            // Dispatch event to listeners\n            $this->dispatchEvent(static::EVENT_ACCESS_TOKEN, $this->accessToken);\n\n            return $this->accessToken;\n        }\n        \n        throw new AuthenticationException('Unable to refresh token, please re-login');\n    }\n\n    /**\n     * Returns true if the manager has authenticated, false otherwise.\n     *\n     * @return boolean\n     */\n    protected function isAuthenticated()\n    {\n        return $this->accessToken !== null;\n    }\n\n    /**\n     * Returns true if the token is valid, false otherwise.\n     *\n     * @return boolean\n     */\n    protected function isTokenValid()\n    {\n        // Check if the access token contains lifetime timestamp\n        if ($this->isAuthenticated() && !$this->accessToken->hasTimestamp()) {\n            return true;\n        }\n\n        return $this->isAuthenticated() && $this->accessToken->isTimestampValid();\n    }\n\n    /**\n     * Return true if fresh token is defined and valid, false otherwise.\n     *\n     * @return bool\n     */\n    protected function hasFreshToken()\n    {\n        return $this->isAuthenticated() && $this->accessToken->isTimestampValid();\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCode/Authenticator.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Clients\\AuthenticationClient;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Parsers\\Results\\AuthenticationTokenResult;\n\nclass Authenticator {\n\n    /**\n     * @var Authenticator\n     */\n    protected $authenticationClient;\n\n    /**\n     * Authenticate using authentication code.\n     *\n     * @param string $token\n     * @return string\n     */\n    public function loginByToken($token)\n    {\n        // Retrieve Oauth token by authentication code\n        $result = $this->getOauthTokenByAuthenticationCode($token);\n\n        return new AccessToken($result->getToken(), AccessToken::PROVIDER_GOOGLE, $result->getExpiryTimestamp(), $result->getRefreshToken());\n    }\n\n    /**\n     * Returns the authentication identifier.\n     *\n     * @return string\n     */\n    public function identifier()\n    {\n        return 'google';\n    }\n\n    /**\n     * Returns the oauth token by authentication code.\n     *\n     * @param string $authenticationCode\n     * @return AuthenticationTokenResult\n     */\n    protected function getOauthTokenByAuthenticationCode($authenticationCode)\n    {\n        return $this->client()->getOauthTokenByAuthenticationCode($authenticationCode);\n    }\n\n    /**\n     * Returns the Authentication client\n     *\n     * @return AuthenticationClient\n     */\n    protected function client()\n    {\n        // Check if the authentication client is initialized\n        if ($this->authenticationClient == null) {\n            $this->authenticationClient = new AuthenticationClient();\n        }\n\n        return $this->authenticationClient;\n    }\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCode/Clients/AuthenticationClient.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Clients;\n\nuse GuzzleHttp\\Client;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Parsers\\OauthTokenParser;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Parsers\\Results\\AuthenticationTokenResult;\nuse NicklasW\\PkmGoApi\\Facades\\App;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass AuthenticationClient {\n\n    /**\n     * @var string The authentication token url\n     */\n    protected static $URL_TOKEN_URL = 'https://www.googleapis.com/oauth2/v4/token';\n\n    /**\n     * @var string The client id parameter\n     */\n    protected static $PARAMETER_CLIENT_ID = '848232511240-73ri3t7plvk96pj4f85uj8otdat2alem.apps.googleusercontent.com';\n\n    /**\n     * @var string The client secret parameter\n     */\n    protected static $PARAMETER_CLIENT_SECRET= 'NCjF1TLi2CcY6t5mt0ZveuL7';\n\n    /**\n     * @var string The grant type parameter\n     */\n    protected static $PARAMETER_GRANT_TYPE = 'authorization_code';\n\n    /**\n     * @var string The redirect uri parameter\n     */\n    protected static $PARAMETER_REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob';\n\n    /**\n     * @var string The scope parameter\n     */\n    protected static $PARAMETER_SCOPE = 'openid email https://www.googleapis.com/auth/userinfo.email';\n\n    /**\n     * @var Client\n     */\n    protected $client;\n\n    /**\n     * Retrieves the the oauth token using authentication code.\n     *\n     * @param string $authenticationCode\n     * @return AuthenticationTokenResult\n     */\n    public function getOauthTokenByAuthenticationCode($authenticationCode)\n    {\n        $parameters = array(\n            'client_id'     => self::$PARAMETER_CLIENT_ID,\n            'client_secret' => self::$PARAMETER_CLIENT_SECRET,\n            'code'          => $authenticationCode,\n            'grant_type'    => self::$PARAMETER_GRANT_TYPE,\n            'redirect_uri'  => self::$PARAMETER_REDIRECT_URI,\n        );\n\n        // Retrieve the content\n        $response = $this->post(self::$URL_TOKEN_URL, array('form_params' => $parameters));\n\n        // Get the authentication token parser\n        $parser = new OauthTokenParser();\n\n        // Parse the content\n        return $parser->parse($response);\n    }\n\n    /**\n     * Execute a POST request and returns the response content.\n     *\n     * @param string $url\n     * @param array  $parameters\n     * @return ResponseInterface\n     */\n    protected function post($url, $parameters = array())\n    {\n        // Execute the POST request\n        $response = $this->client()->post($url, $parameters);\n\n        // Retrieve the content\n        return $response;\n    }\n\n    /**\n     * Returns the Client.\n     *\n     * @return Client\n     */\n    protected function client()\n    {\n        return App::get('client');\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCode/Parsers/OauthTokenParser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Parsers;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\ResponseException;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Parsers\\Results\\AuthenticationTokenResult;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass OauthTokenParser extends Parser {\n\n    /**\n     * OauthTokenParser constructor.\n     */\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /**\n     * The method which parses the page.\n     *\n     * @param ResponseInterface $response\n     * @return AuthenticationTokenResult\n     */\n    public function parse($response)\n    {\n        // Validate the retrieved response\n        $this->validateResponse($response);\n\n        // Retrieve the content\n        $content = (string)$response->getBody();\n\n        // Decode the response content\n        $content = json_decode($content);\n\n        Log::debug(sprintf('[#%s] Retrieved response. Content: \\'%s\\'', __CLASS__, print_r($content, true)));\n\n        return new AuthenticationTokenResult(\n            array(\n                'token'         => $content->id_token,\n                'timestamp'     => time() + $content->expires_in,\n                'refresh_token' => $content->refresh_token,\n            )\n        );\n    }\n\n    /**\n     * Validate the request response.\n     *\n     * @param ResponseInterface $response\n     * @throws AuthenticationException\n     * @throws ResponseException\n     */\n    protected function validateResponse($response)\n    {\n        Log::debug(sprintf('[#%s] Validating response. Status code: \\'%s\\'', __CLASS__, $response->getStatusCode()));\n\n        // Check if the response corresponds to a server error\n        if (!$this->isServerError($response)) {\n            return;\n        }\n\n        // Retrieve the response content\n        $content = json_decode((string)$response->getBody());\n\n        // Check if the token is already redeemed\n        if ($this->isTokenAlreadyRedeemed($content)) {\n            throw new AuthenticationException($content->error_description);\n        }\n\n        // Check if the token is invalid\n        if ($this->isTokenInvalid($content)) {\n            throw new AuthenticationException('Invalid token provided');\n        }\n\n        Log::debug(sprintf('[#%s] Retrieved a invalid response. Content: \\'%s\\'', __CLASS__, $response->getBody()));\n\n        throw new ResponseException(\n            sprintf('Retrieved a invalid response. Response: \\'%s\\'', (string)$response->getBody()));\n    }\n\n    /**\n     * Check if the token provided is already redeemed.\n     *\n     * @param $content\n     * @return boolean\n     */\n    protected function isTokenAlreadyRedeemed($content)\n    {\n        return $content->error_description === 'Code was already redeemed.';\n    }\n\n    /**\n     * Check if the token provided was invalid.\n     *\n     * @param $content\n     * @return boolean\n     */\n    protected function isTokenInvalid($content)\n    {\n        return $content->error_description === 'Bad Request';\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCode/Parsers/Parser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Parsers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\ResponseException;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Parsers\\Results\\Result;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nabstract class Parser {\n\n    /**\n     * @var integer The success status response code\n     */\n    protected static $RESPONSE_STATUS_SUCCESS = 200;\n\n    /**\n     * @var integer The redirect status response code\n     */\n    protected static $RESPONSE_STATUS_REDIRECT = 302;\n\n    /**\n     * @var integer The forbidden status response code\n     */\n    protected static $RESPONSE_STATUS_FORBIDDEN = 403;\n\n    /**\n     * @var Dom The DOM\n     */\n    protected $dom;\n\n    /**\n     * Parser constructor.\n     *\n     * @param Dom $dom\n     */\n    public function __construct($dom = null)\n    {\n        $this->dom = $dom;\n    }\n\n    /**\n     * The method which parses the content.\n     *\n     * @param string $content\n     * @return Result\n     */\n    abstract public function parse($content);\n\n    /**\n     * Validate the request response.\n     *\n     * @param ResponseInterface $response\n     * @throws ResponseException\n     */\n    protected function validateResponse($response)\n    {\n        Log::debug(sprintf('[#%s] Validating response. Status code: \\'%s\\'', __CLASS__, $response->getStatusCode()));\n\n        // Check if the response corresponds to a server error\n        if (!$this->isServerError($response)) {\n            return;\n        }\n\n        Log::debug(sprintf('[#%s] Retrieved a invalid response. Content: \\'%s\\'', __CLASS__, $response->getBody()));\n\n        throw new ResponseException(\n            sprintf('Retrieved a invalid response. Response: \\'%s\\'', (string)$response->getBody()));\n    }\n\n    /**\n     * Returns true if the status code corresponds to a server error, false otherwise.\n     *\n     * @param ResponseInterface $response\n     * @return boolean\n     */\n    protected function isServerError($response)\n    {\n        // Retrieve the initial integer from the status code\n        $responseCode = substr($response->getStatusCode(), 0, 1);\n\n        return $responseCode == 5 || $responseCode == 4;\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCode/Parsers/Results/AuthenticationTokenResult.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Parsers\\Results;\n\nclass AuthenticationTokenResult extends Result {\n\n    /**\n     * Returns the token.\n     *\n     * @return string\n     */\n    public function getToken()\n    {\n        return $this->data['token'];\n    }\n\n    /**\n     * Returns the refresh token.\n     *\n     * @return string\n     */\n    public function getRefreshToken()\n    {\n        return $this->data['refresh_token'];\n    }\n\n    /**\n     * Returns the expiry timestamp.\n     *\n     * @return string\n     */\n    public function getExpiryTimestamp()\n    {\n        return $this->data['timestamp'];\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCode/Parsers/Results/Result.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Parsers\\Results;\n\nclass Result {\n\n    /**\n     * @var mixed The parsed data\n     */\n    protected $data;\n\n    /**\n     * Result constructor.\n     *\n     * @param $data\n     */\n    public function __construct($data)\n    {\n        $this->data = $data;\n    }\n\n    /**\n     * @return mixed The parsed data\n     */\n    public function getData()\n    {\n        return $this->data;\n    }\n\n    /**\n     * @param $data The parsed data\n     */\n    public function setData($data)\n    {\n        $this->data = $data;\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCodeManager.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCode\\Authenticator;\n\nclass AuthenticationCodeManager extends Manager {\n\n    /**\n     * @var string The authentication code\n     */\n    protected $authenticationCode;\n\n    /**\n     * AuthenticationCodeManager constructor.\n     *\n     * @param string $authenticationCode\n     */\n    public function __construct($authenticationCode)\n    {\n        $this->authenticationCode = $authenticationCode;\n    }\n\n    /**\n     * Returns the Oauth token.\n     *\n     * @return AccessToken\n     */\n    public function getAccessToken()\n    {\n        // Check if we are authenticated\n        if ($this->isAuthenticated()) {\n            // Try to refresh the token if required and possible\n            return $this->refreshTokenIfPossible();\n        }\n\n        // Retrieve the Google authenticator\n        $authenticator = $this->authenticator();\n\n        // Retrieve the access token by authentication code\n        $accessToken = $authenticator->loginByToken($this->authenticationCode);\n        \n        // Dispatch event to listeners\n        $this->dispatchEvent(static::EVENT_ACCESS_TOKEN, $accessToken);\n\n        // Add the access token to the manager\n        $this->setAccessToken($accessToken);\n\n        return $accessToken;\n    }\n\n    /**\n     * Returns the identifier.\n     *\n     * @return string\n     */\n    public function getIdentifier()\n    {\n        return $this->authenticator()->identifier();\n    }\n\n    /**\n     * Returns the authenticator.\n     *\n     * @return Authenticator\n     */\n    protected function authenticator()\n    {\n        return new Authenticator();\n    }\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCredentials/Authenticator.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Clients\\AuthenticationClient;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers\\Results\\AuthenticationTokenResult;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\n\nclass Authenticator {\n\n    /**\n     * @var Authenticator\n     */\n    protected $authenticationClient;\n\n    /**\n     * Authenticate using email and password.\n     *\n     * @param string $email\n     * @param string $password\n     * @return AccessToken The access token\n     */\n    public function login($email, $password)\n    {\n        // Retrieve the authentication token result\n        $tokenResult = $this->getAuthenticationToken($email, $password);\n\n        Log::debug(sprintf('[#%s] Token: \\'%s\\'', __CLASS__, $tokenResult->getToken()));\n\n        // Retrieve the oauth token\n        $result = $this->getOauthTokenByUserCredentials($email, $tokenResult->getToken());\n\n        Log::debug(sprintf('[#%s] OAuth token: \\'%s\\'', __CLASS__, $result->getToken()));\n\n        return new AccessToken($result->getToken(), AccessToken::PROVIDER_GOOGLE, $result->getExpiryTimestamp());\n    }\n\n\n    /**\n     * Returns the authentication identifier.\n     *\n     * @return string\n     */\n    public function identifier()\n    {\n        return 'google';\n    }\n\n    /**\n     * Returns the authentication token.\n     *\n     * @param $email\n     * @param $password\n     * @return AuthenticationTokenResult\n     */\n    protected function getAuthenticationToken($email, $password)\n    {\n        return $this->client()->getAuthenticationToken($email, $password);\n    }\n\n    /**\n     * Returns the oauth token by user credentials.\n     *\n     * @param string $email\n     * @param string $token\n     * @return AuthenticationTokenResult\n     */\n    protected function getOauthTokenByUserCredentials($email, $token)\n    {\n        return $this->client()->getOauthTokenByUserCredentials($email, $token);\n    }\n\n    /**\n     * Returns the Authentication client\n     *\n     * @return AuthenticationClient\n     */\n    protected function client()\n    {\n        // Check if the authentication client is initialized\n        if ($this->authenticationClient == null) {\n            $this->authenticationClient = new AuthenticationClient();\n        }\n\n        return $this->authenticationClient;\n    }\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCredentials/Clients/AuthenticationClient.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Clients;\n\nuse GuzzleHttp\\Client;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers\\OauthTokenParser;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers\\Results\\AuthenticationTokenResult;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers\\TokenParser;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Support\\Signature;\nuse NicklasW\\PkmGoApi\\Facades\\App;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass AuthenticationClient\n{\n\n    /**\n     * @var string The android authentication token url\n     */\n    protected static $URL_ANDROID_TOKEN_URL = 'https://android.clients.google.com/auth';\n\n    /**\n     * @var string The authentication token url\n     */\n    protected static $URL_TOKEN_URL = 'https://accounts.google.com/o/oauth2/token';\n\n    /**\n     * @var string The oauth login service\n     */\n    protected static $OAUTH_LOGIN_SERVICE = 'audience:server:client_id:848232511240-7so421jotr2609rmqakceuu1luuq0ptb.apps.googleusercontent.com';\n\n    /**\n     * @var string The oauth login application\n     */\n    protected static $OAUTH_LOGIN_APPLICATION = 'com.nianticlabs.pokemongo';\n\n    /**\n     * @var string The oauth login client signature\n     */\n    protected static $OAUTH_LOGIN_CLIENT_SIGNATURE = '321187995bc7cdc2b5fc91b11a96e2baa8602c62';\n\n    /**\n     * @var Client\n     */\n    protected $client;\n\n    /**\n     * Returns the authentication token.\n     *\n     * @param string $email\n     * @param string $password\n     * @return AuthenticationTokenResult\n     */\n    public function getAuthenticationToken($email, $password)\n    {\n        // Retrieve the encrypted password\n        $encryptedPassword = Signature::create($email, $password);\n\n        $parameters = array(\n            'accountType'     => 'HOSTED_OR_GOOGLE',\n            'Email'           => $email,\n            'has_permission'  => 1,\n            'add_account'     => 1,\n            'EncryptedPasswd' => $encryptedPassword,\n            'service'         => 'ac2dm',\n            'source'          => 'android',\n            'device_country'  => 'us',\n            'operatorCountry' => 'us',\n            'lang'            => 'en',\n            'sdk_version'     => '17',\n        );\n\n        // Retrieve the response\n        $response = $this->post(self::$URL_ANDROID_TOKEN_URL, array('form_params' => $parameters));\n\n        // Get the authentication token parser\n        $parser = new TokenParser();\n\n        // Parse the content\n        return $parser->parse($response);\n    }\n\n    /**\n     * Retrieves the the oauth token using user credentials.\n     *\n     * @param string $email\n     * @param string $token\n     * @return AuthenticationTokenResult\n     */\n    public function getOauthTokenByUserCredentials($email, $token)\n    {\n        $parameters = array(\n            'accountType'     => 'HOSTED_OR_GOOGLE',\n            'Email'           => $email,\n            'has_permission'  => 1,\n            'EncryptedPasswd' => $token,\n            'service'         => self::$OAUTH_LOGIN_SERVICE,\n            'source'          => 'android',\n            'app'             => self::$OAUTH_LOGIN_APPLICATION,\n            'client_sig'      => self::$OAUTH_LOGIN_CLIENT_SIGNATURE,\n            'device_country'  => 'us',\n            'operatorCountry' => 'us',\n            'lang'            => 'en',\n            'sdk_version'     => '17',\n        );\n\n        // Retrieve the response\n        $response = $this->post(self::$URL_ANDROID_TOKEN_URL, array('form_params' => $parameters));\n\n        // Get the authentication token parser\n        $parser = new OauthTokenParser();\n\n        // Parse the content\n        return $parser->parse($response);\n    }\n\n    /**\n     * Execute a POST request and returns the response content.\n     *\n     * @param string $url\n     * @param array  $parameters\n     * @return ResponseInterface\n     */\n    protected function post($url, $parameters = array())\n    {\n        // Execute the POST request\n        $response = $this->client()->post($url, $parameters);\n\n        // Retrieve the content\n        return $response;\n    }\n\n    /**\n     * Retrieve the options.\n     *\n     * @param array $options\n     * @return array\n     */\n    protected function options($options = array())\n    {\n        return array_merge($options, array(array('headers' => array('User-Agent' => 'gpsoauth/0.0.5'))));\n    }\n\n    /**\n     * Returns the Client.\n     *\n     * @return Client\n     */\n    protected function client()\n    {\n        return App::get('client');\n    }\n\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCredentials/Parsers/OauthTokenParser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers\\Results\\AuthenticationTokenResult;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass OauthTokenParser extends Parser {\n\n    /**\n     * OauthTokenParser constructor.\n     */\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /**\n     * The method which parses the page.\n     *\n     * @param ResponseInterface $response\n     * @return AuthenticationTokenResult\n     */\n    public function parse($response)\n    {\n        // Validate the retrieved response\n        $this->validateResponse($response);\n\n        // Retrieve the content\n        $content = (string)$response->getBody();\n\n        Log::debug(sprintf('[#%s] Retrieved response. Content: \\'%s\\'', __CLASS__, $content));\n\n        return new AuthenticationTokenResult(\n            array('token' => $this->parseAuthId($content), 'timestamp' => $this->parseExpiryTimestamp($content)));\n    }\n\n    /**\n     * Returns the parsed auth id.\n     *\n     * @param string $content\n     * @return string\n     */\n    protected function parseAuthId($content)\n    {\n        $matches = array();\n\n        preg_match('/Auth=(?<token>.*)/', $content, $matches);\n\n        return $matches['token'];\n    }\n\n    /**\n     * Returns the expiry timestamp.\n     *\n     * @param string $content\n     * @return string\n     */\n    protected function parseExpiryTimestamp($content)\n    {\n        $matches = array();\n\n        preg_match('/Expiry=(?<expiry>.*)/', $content, $matches);\n\n        return $matches['expiry'];\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCredentials/Parsers/Parser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\ResponseException;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers\\Results\\Result;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nabstract class Parser {\n\n    /**\n     * @var integer The success status response code\n     */\n    protected static $RESPONSE_STATUS_SUCCESS = 200;\n\n    /**\n     * @var integer The redirect status response code\n     */\n    protected static $RESPONSE_STATUS_REDIRECT = 302;\n\n    /**\n     * @var integer The forbidden status response code\n     */\n    protected static $RESPONSE_STATUS_FORBIDDEN = 403;\n\n    /**\n     * @var Dom The DOM\n     */\n    protected $dom;\n\n    /**\n     * Parser constructor.\n     *\n     * @param Dom $dom\n     */\n    public function __construct($dom = null)\n    {\n        $this->dom = $dom;\n    }\n\n    /**\n     * The method which parses the content.\n     *\n     * @param string $content\n     * @return Result\n     */\n    abstract public function parse($content);\n\n    /**\n     * Validate the request response.\n     *\n     * @param ResponseInterface $response\n     * @throws ResponseException\n     */\n    protected function validateResponse($response)\n    {\n        Log::debug(sprintf('[#%s] Validating response. Status code: \\'%s\\'', __CLASS__, $response->getStatusCode()));\n\n        // Check if the response corresponds to a server error\n        if (!$this->isServerError($response)) {\n            return;\n        }\n\n        Log::debug(sprintf('[#%s] Retrieved a invalid response. Content: \\'%s\\'', __CLASS__, $response->getBody()));\n\n        throw new ResponseException(\n            sprintf('Retrieved a invalid response. Response: \\'%s\\'', (string)$response->getBody()));\n    }\n\n    /**\n     * Returns true if the status code corresponds to a server error, false otherwise.\n     *\n     * @param ResponseInterface $response\n     * @return boolean\n     */\n    protected function isServerError($response)\n    {\n        // Retrieve the initial integer from the status code\n        $responseCode = substr($response->getStatusCode(), 0, 1);\n\n        return $responseCode === 5;\n    }\n\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCredentials/Parsers/Results/AuthenticationTokenResult.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers\\Results;\n\nclass AuthenticationTokenResult extends Result {\n\n    /**\n     * Returns the token.\n     *\n     * @return string\n     */\n    public function getToken()\n    {\n        return $this->data['token'];\n    }\n\n    /**\n     * Returns the auth id.\n     *\n     * @return string\n     */\n    public function getAuthId()\n    {\n        return $this->data['auth'];\n    }\n\n    /**\n     * Returns the expiry timestamp.\n     *\n     * @return string\n     */\n    public function getExpiryTimestamp()\n    {\n        return $this->data['timestamp'];\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCredentials/Parsers/Results/Result.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers\\Results;\n\nclass Result {\n\n    /**\n     * @var mixed The parsed data\n     */\n    protected $data;\n\n    /**\n     * Result constructor.\n     *\n     * @param $data\n     */\n    public function __construct($data)\n    {\n        $this->data = $data;\n    }\n\n    /**\n     * @return The parsed data\n     */\n    public function getData()\n    {\n        return $this->data;\n    }\n\n    /**\n     * @param mixed $data The parsed data\n     */\n    public function setData($data)\n    {\n        $this->data = $data;\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCredentials/Parsers/TokenParser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\ResponseException;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Parsers\\Results\\AuthenticationTokenResult;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass TokenParser extends Parser {\n\n    /**\n     * TokenParser constructor.\n     */\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /**\n     * The method which parses the page.\n     *\n     * @param ResponseInterface $response\n     * @return AuthenticationTokenResult\n     * @throws AuthenticationException\n     * @throws ResponseException\n     */\n    public function parse($response)\n    {\n        // Validate the retrieved response\n        $this->validateResponse($response);\n\n        // Retrieve the content\n        $content = (string)$response->getBody();\n\n        // Check if we provided valid user credentials\n        if ($response->getStatusCode() === self::$RESPONSE_STATUS_FORBIDDEN) {\n            Log::debug(sprintf('[#%s] Retrieved invalid response. Content: \\'%s\\' Status code: \\'%s\\' ',\n                __CLASS__, $content, $response->getStatusCode()));\n\n            throw new AuthenticationException(\n                sprintf('Invalid user credentials. Response: \\'%s\\'', $content));\n        }\n\n        Log::debug(sprintf('[#%s] Response content: \\'%s\\'', __CLASS__, $content));\n\n        return new AuthenticationTokenResult(array('token' => $this->parseToken($content)));\n    }\n\n    /**\n     * Returns the parsed ticket.\n     *\n     * @param string $content\n     * @return string mixed\n     */\n    protected function parseToken($content)\n    {\n        $matches = array();\n\n        preg_match('/Token=(?<token>.*)/', $content, $matches);\n\n        return $matches['token'];\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCredentials/Support/Signature.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Support;\n\nuse phpseclib\\Crypt\\RSA;\nuse phpseclib\\Math\\BigInteger;\n\nclass Signature {\n\n    /**\n     * @var string The public key\n     */\n    protected static $PUBLIC_KEY = 'AAAAgMom/1a/v0lblO2Ubrt60J2gcuXSljGFQXgcyZWveWLEwo6prwgi3iJIZdodyhKZQrNWp5nKJ3srRXcUW+F1BD3baEVGcmEgqaLZUNBjm057pKRI16kB0YppeGx5qIQ5QjKzsR8ETQbKLNWgRY0QRNVz34kMJR3P/LgHax/6rmf5AAAAAwEAAQ==';\n\n    /**\n     * Generates a signature.\n     *\n     * @param string $email    The email\n     * @param string $password The password\n     * @return string\n     */\n    public static function create($email, $password)\n    {\n        // Retrieve the binary key\n        $binaryKey = bin2hex(base64_decode(self::$PUBLIC_KEY));\n\n        // Retrieve the modulus\n        $modulus = self::modulus($binaryKey);\n\n        // Retrieve the exponent\n        $exponent = self::exponent($binaryKey);\n\n        // Retrieve the signature\n        $signature = self::signature();\n\n        // Retrieve the encrypted key\n        $encrypted = self::encrypt($email, $password, $modulus, $exponent);\n\n        $output = hex2bin($signature . $encrypted);\n\n        $b64EncryptedPasswd = str_replace(array(\"+\", \"/\"), array(\"-\", \"_\"), mb_convert_encoding(base64_encode($output), \"US-ASCII\"));\n\n        return $b64EncryptedPasswd;\n    }\n\n    /**\n     * Returns the modulus key.\n     *\n     * @param string $binaryKey\n     * @return BigInteger\n     */\n    protected static function modulus($binaryKey)\n    {\n        $half = substr($binaryKey, 8, 256);\n\n        return new BigInteger(hex2bin($half), 256);\n    }\n\n    /**\n     * Returns the exponent key.\n     *\n     * @param string $binaryKey\n     * @return BigInteger\n     */\n    protected static function exponent($binaryKey)\n    {\n        $half = substr($binaryKey, 272, 6);\n\n        return new BigInteger(hex2bin($half), 256);\n    }\n\n    /**\n     * Returns the signature.\n     */\n    protected static function signature()\n    {\n        $sha1 = sha1(base64_decode(self::$PUBLIC_KEY), true);\n\n        return '00' . bin2hex(substr($sha1, 0, 4));\n    }\n\n    /**\n     * Returns the encrypted key.\n     *\n     * @param string     $email\n     * @param string     $password\n     * @param BigInteger $modulus\n     * @param BigInteger $exponent\n     * @return string\n     */\n    protected static function encrypt($email, $password, $modulus, $exponent)\n    {\n        $rsa = new RSA();\n\n        $rsa->setPublicKeyFormat(\"CRYPT_RSA_PUBLIC_FORMAT_RAW\");\n        $rsa->setEncryptionMode(\"CRYPT_RSA_ENCRYPTION_OAEP\");\n        $rsa->loadKey(array('n' => $modulus, 'e' => $exponent));\n\n        $rsa->setPublicKey();\n\n        $plain = \"{$email}\\x00{$password}\";\n\n        return bin2hex($rsa->encrypt($plain));\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationCredentialsManager.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationCredentials\\Authenticator;\n\nclass AuthenticationCredentialsManager extends Manager {\n\n    /**\n     * @var string\n     */\n    protected $email;\n\n    /**\n     * @var string\n     */\n    protected $password;\n\n    /**\n     * AuthenticationCredentialsManager constructor.\n     *\n     * @param string $email\n     * @param string $password\n     */\n    public function __construct($email, $password)\n    {\n        $this->email = $email;\n        $this->password = $password;\n    }\n\n    /**\n     * Returns the Oauth token.\n     *\n     * @return AccessToken\n     */\n    public function getAccessToken()\n    {\n        // Check if we are authenticated\n        if ($this->isAuthenticated() && ($token = $this->refreshTokenIfPossible())) {\n            return $token;\n        }\n\n        // Retrieve the Google authenticator\n        $authenticator = $this->authenticator();\n\n        // Retrieve the access token by user credentials\n        $accessToken = $authenticator->login($this->email, $this->password);\n\n        // Dispatch event to listeners\n        $this->dispatchEvent(static::EVENT_ACCESS_TOKEN, $accessToken);\n\n        // Add the access token to the manager\n        $this->setAccessToken($accessToken);\n\n        return $accessToken;\n    }\n\n    /**\n     * Returns the identifier.\n     *\n     * @return string\n     */\n    public function getIdentifier()\n    {\n        return $this->authenticator()->identifier();\n    }\n\n    /**\n     * Refresh the token if possible.\n     *\n     * @return AccessToken|null\n     * @throws AuthenticationException\n     */\n    protected function refreshTokenIfPossible()\n    {\n        // Check if the oauth token is valid\n        if ($this->isTokenValid()) {\n            return $this->accessToken;\n        }\n\n        // Check if a refresh token is defined\n        if ($this->hasFreshToken()) {\n            // Use refresh token to retrieve new oauth token\n\n            // Dispatch event to listeners\n            $this->dispatchEvent(static::EVENT_ACCESS_TOKEN, $this->accessToken);\n\n            return $this->accessToken;\n        }\n\n        return null;\n    }\n\n    /**\n     * Returns the authenticator.\n     *\n     * @return Authenticator\n     */\n    protected function authenticator()\n    {\n        return new Authenticator();\n    }\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationOauthTokenManager.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\n\nclass AuthenticationOauthTokenManager extends Manager {\n\n    /**\n     * @var\n     */\n    protected $token;\n\n    /**\n     * AuthenticationOauthTokenManager constructor.\n     *\n     * @param AccessToken|string $token\n     */\n    public function __construct($token)\n    {\n        if ($token instanceof AccessToken) {\n            $this->setAccessToken($token);\n        } else {\n            $this->token = $token;\n        }\n    }\n\n    /**\n     * Returns the Oauth token.\n     *\n     * @return AccessToken\n     */\n    public function getAccessToken()\n    {\n        if (!$this->accessToken) {\n            $this->accessToken = new AccessToken($this->token, AccessToken::PROVIDER_GOOGLE);\n        }\n\n        // Dispatch event to listeners\n        $this->dispatchEvent(static::EVENT_ACCESS_TOKEN, $this->accessToken);\n\n        return $this->accessToken;\n    }\n\n    /**\n     * Returns the identifier.\n     *\n     * @return string\n     */\n    public function getIdentifier()\n    {\n        return 'google';\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationRefreshToken/Authenticator.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Clients\\AuthenticationClient;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Parsers\\Results\\AuthenticationTokenResult;\n\nclass Authenticator {\n\n    /**\n     * @var Authenticator\n     */\n    protected $authenticationClient;\n\n    /**\n     * Authenticate using refresh code.\n     *\n     * @param string $token\n     * @return AccessToken\n     */\n    public function loginByRefreshToken($token)\n    {\n        // Retrieve Oauth token by refresh code\n        $result = $this->getOauthTokenByAuthenticationRefreshToken($token);\n\n        return new AccessToken($result->getToken(), AccessToken::PROVIDER_GOOGLE, $result->getExpiryTimestamp());\n    }\n\n    /**\n     * Returns the authentication identifier.\n     *\n     * @return string\n     */\n    public function identifier()\n    {\n        return 'google';\n    }\n\n    /**\n     * Returns the oauth token by refresh code.\n     *\n     * @param string $AuthenticationRefreshToken\n     * @return AuthenticationTokenResult\n     */\n    protected function getOauthTokenByAuthenticationRefreshToken($AuthenticationRefreshToken)\n    {\n        return $this->client()->getOauthTokenByAuthenticationRefreshToken($AuthenticationRefreshToken);\n    }\n\n    /**\n     * Returns the Authentication client\n     *\n     * @return AuthenticationClient\n     */\n    protected function client()\n    {\n        // Check if the authentication client is initialized\n        if ($this->authenticationClient == null) {\n            $this->authenticationClient = new AuthenticationClient();\n        }\n\n        return $this->authenticationClient;\n    }\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationRefreshToken/Clients/AuthenticationClient.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Clients;\n\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\Cookie\\CookieJar;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Parsers\\OauthTokenParser;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Parsers\\Results\\AuthenticationTokenResult;\nuse NicklasW\\PkmGoApi\\Facades\\App;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass AuthenticationClient\n{\n\n    /**\n     * @var string The authentication token url\n     */\n    protected static $URL_TOKEN_URL = 'https://www.googleapis.com/oauth2/v4/token';\n\n    /**\n     * @var string The client id parameter\n     */\n    protected static $PARAMETER_CLIENT_ID = '848232511240-73ri3t7plvk96pj4f85uj8otdat2alem.apps.googleusercontent.com';\n\n    /**\n     * @var string The client secret parameter\n     */\n    protected static $PARAMETER_CLIENT_SECRET = 'NCjF1TLi2CcY6t5mt0ZveuL7';\n\n    /**\n     * @var string The grant type parameter\n     */\n    protected static $PARAMETER_GRANT_TYPE = 'authorization_code';\n\n    /**\n     * @var string The redirect uri parameter\n     */\n    protected static $PARAMETER_REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob';\n\n    /**\n     * @var string The scope parameter\n     */\n    protected static $PARAMETER_SCOPE = 'openid email https://www.googleapis.com/auth/userinfo.email';\n\n    /**\n     * @var Client\n     */\n    protected $client;\n\n    /**\n     * @var CookieJar\n     */\n    protected $cookies;\n\n    /**\n     * AuthenticationClient constructor.\n     */\n    public function __construct()\n    {\n        $this->cookies = new CookieJar();\n    }\n\n    /**\n     * Retrieves the the oauth token using refresh code.\n     *\n     * @param string $token\n     * @return AuthenticationTokenResult\n     */\n    public function getOauthTokenByAuthenticationRefreshToken($token)\n    {\n        $parameters = array(\n            'access_type'   => 'offline',\n            'client_id'     => self::$PARAMETER_CLIENT_ID,\n            'client_secret' => self::$PARAMETER_CLIENT_SECRET,\n            'refresh_token' => $token,\n            'grant_type'    => 'refresh_token',\n            'scope'         => self::$PARAMETER_SCOPE,\n        );\n\n        // Retrieve the content\n        $response = $this->post(self::$URL_TOKEN_URL, array('form_params' => $parameters));\n\n        // Get the authentication token parser\n        $parser = new OauthTokenParser();\n\n        // Parse the content\n        return $parser->parse($response);\n    }\n\n    /**\n     * Execute a POST request and returns the response content.\n     *\n     * @param string $url\n     * @param array  $parameters\n     * @return ResponseInterface\n     */\n    protected function post($url, $parameters = array())\n    {\n        // Execute the POST request\n        $response = $this->client()->post($url, $this->options($parameters));\n\n        // Retrieve the content\n        return $response;\n    }\n\n    /**\n     * Retrieve the options.\n     *\n     * @param array $options\n     * @return array\n     */\n    protected function options($options = array())\n    {\n        return array_merge($options, array('cookies' => $this->cookies));\n    }\n\n    /**\n     * Returns the Client.\n     *\n     * @return Client\n     */\n    protected function client()\n    {\n        return App::get('client');\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationRefreshToken/Parsers/OauthTokenParser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Parsers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\ResponseException;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Parsers\\Results\\AuthenticationTokenResult;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass OauthTokenParser extends Parser {\n\n    /**\n     * OauthTokenParser constructor.\n     */\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /**\n     * The method which parses the page.\n     *\n     * @param ResponseInterface $response\n     * @return AuthenticationTokenResult\n     */\n    public function parse($response)\n    {\n        // Validate the retrieved response\n        $this->validateResponse($response);\n\n        // Retrieve the content\n        $content = (string)$response->getBody();\n\n        // Decode the response content\n        $content = json_decode($content);\n\n        Log::debug(sprintf('[#%s] Retrieved response. Content: \\'%s\\'', __CLASS__, print_r($content, true)));\n\n\n        return new AuthenticationTokenResult(\n            array(\n                'token'         => $content->id_token,\n                'timestamp'     => time() + $content->expires_in,\n            )\n        );\n    }\n\n    /**\n     * Validate the request response.\n     *\n     * @param ResponseInterface $response\n     * @throws AuthenticationException\n     */\n    protected function validateResponse($response)\n    {\n        Log::debug(sprintf('[#%s] Validating response. Status code: \\'%s\\'', __CLASS__, $response->getStatusCode()));\n\n        // Check if the response corresponds to a server error\n        if (!$this->isServerError($response)) {\n            return;\n        }\n\n        // Retrieve the response content\n        $content = json_decode((string)$response->getBody());\n\n        // Check if the token is already redeemed\n        if ($this->isTokenAlreadyRedeemed($content)) {\n            throw new AuthenticationException($content->error_description);\n        }\n\n        // Check if the token is invalid\n        if ($this->isTokenInvalid($content)) {\n            throw new AuthenticationException('Invalid token provided');\n        }\n\n        Log::debug(sprintf('[#%s] Retrieved a invalid response. Content: \\'%s\\'', __CLASS__, $response->getBody()));\n\n        throw new ResponseException(\n            sprintf('Retrieved a invalid response. Response: \\'%s\\'', (string)$response->getBody()));\n    }\n\n    /**\n     * Check if the token provided is already redeemed.\n     *\n     * @param $content\n     * @return boolean\n     */\n    protected function isTokenAlreadyRedeemed($content)\n    {\n        return $content->error_description === 'Code was already redeemed.';\n    }\n\n    /**\n     * Check if the token provided was invalid.\n     *\n     * @param $content\n     * @return boolean\n     */\n    protected function isTokenInvalid($content)\n    {\n        return $content->error_description === 'Bad Request';\n    }\n\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationRefreshToken/Parsers/Parser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Parsers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\ResponseException;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Parsers\\Results\\Result;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nabstract class Parser {\n\n    /**\n     * @var integer The success status response code\n     */\n    protected static $RESPONSE_STATUS_SUCCESS = 200;\n\n    /**\n     * @var integer The redirect status response code\n     */\n    protected static $RESPONSE_STATUS_REDIRECT = 302;\n\n    /**\n     * @var integer The forbidden status response code\n     */\n    protected static $RESPONSE_STATUS_FORBIDDEN = 403;\n\n    /**\n     * @var Dom The DOM\n     */\n    protected $dom;\n\n    /**\n     * Parser constructor.\n     *\n     * @param Dom $dom\n     */\n    public function __construct($dom = null)\n    {\n        $this->dom = $dom;\n    }\n\n    /**\n     * The method which parses the content.\n     *\n     * @param string $content\n     * @return Result\n     */\n    abstract public function parse($content);\n\n    /**\n     * Validate the request response.\n     *\n     * @param ResponseInterface $response\n     * @throws ResponseException\n     */\n    protected function validateResponse($response)\n    {\n        Log::debug(sprintf('[#%s] Validating response. Status code: \\'%s\\'', __CLASS__, $response->getStatusCode()));\n\n        // Check if the response corresponds to a server error\n        if (!$this->isServerError($response)) {\n            return;\n        }\n\n        Log::debug(sprintf('[#%s] Retrieved a invalid response. Content: \\'%s\\'', __CLASS__, $response->getBody()));\n\n        throw new ResponseException(\n            sprintf('Retrieved a invalid response. Response: \\'%s\\'', (string)$response->getBody()));\n    }\n\n    /**\n     * Returns true if the status code corresponds to a server error, false otherwise.\n     *\n     * @param ResponseInterface $response\n     * @return boolean\n     */\n    protected function isServerError($response)\n    {\n        // Retrieve the initial integer from the status code\n        $responseCode = substr($response->getStatusCode(), 0, 1);\n\n        return $responseCode == 5 || $responseCode == 4;\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationRefreshToken/Parsers/Results/AuthenticationTokenResult.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Parsers\\Results;\n\nclass AuthenticationTokenResult extends Result {\n\n    /**\n     * Returns the token.\n     *\n     * @return string\n     */\n    public function getToken()\n    {\n        return $this->data['token'];\n    }\n\n    /**\n     * Returns the expiry timestamp.\n     *\n     * @return string\n     */\n    public function getExpiryTimestamp()\n    {\n        return $this->data['timestamp'];\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationRefreshToken/Parsers/Results/Result.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Parsers\\Results;\n\nclass Result\n{\n\n    /**\n     * @var mixed The parsed data\n     */\n    protected $data;\n\n    /**\n     * Result constructor.\n     *\n     * @param mixed $data\n     */\n    public function __construct($data)\n    {\n        $this->data = $data;\n    }\n\n    /**\n     * @return mixed The parsed data\n     */\n    public function getData()\n    {\n        return $this->data;\n    }\n\n    /**\n     * @param mixed $data The parsed data\n     */\n    public function setData($data)\n    {\n        $this->data = $data;\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/Google/AuthenticationRefreshTokenManager.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\Google;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\Google\\AuthenticationRefreshToken\\Authenticator;\n\nclass AuthenticationRefreshTokenManager extends Manager {\n\n    /**\n     * @var\n     */\n    protected $token;\n\n    /**\n     * AuthenticationOauthTokenManager constructor.\n     *\n     * @param string $token\n     */\n    public function __construct($token)\n    {\n        $this->token = $token;\n    }\n\n    /**\n     * Returns the Oauth token.\n     *\n     * @return AccessToken\n     */\n    public function getAccessToken()\n    {\n        // Check if we are authenticated\n        if ($this->isAuthenticated()) {\n            // Try to refresh the token if required and possible\n            return $this->refreshTokenIfPossible();\n        }\n\n        // Retrieve the Google authenticator\n        $authenticator = $this->authenticator();\n\n        // Retrieve the access token by refresh token\n        $accessToken = $authenticator->loginByRefreshToken($this->token);\n\n        // Add the refresh token to the access token\n        $accessToken->setRefreshToken($this->token);\n\n        // Dispatch event to listeners\n        $this->dispatchEvent(static::EVENT_ACCESS_TOKEN, $accessToken);\n\n        // Add the access token to the manager\n        $this->setAccessToken($accessToken);\n\n        return $accessToken;\n    }\n\n    /**\n     * Returns the identifier.\n     *\n     * @return string\n     */\n    public function getIdentifier()\n    {\n        return $this->authenticator()->identifier();\n    }\n\n    /**\n     * Returns the authenticator.\n     *\n     * @return Authenticator\n     */\n    protected function authenticator()\n    {\n        return new Authenticator();\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentials/Authenticator.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Contracts\\Authentication;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Clients\\AuthenticationClient;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\n\nclass Authenticator {\n\n    /**\n     * @var AuthenticationClient\n     */\n    protected $authenticationClient;\n\n    /**\n     * Authenticate using email and password.\n     *\n     * @param string $username\n     * @param string $password\n     * @return AccessToken The access token\n     */\n    public function login($username, $password)\n    {\n        // Retrieve the authentication information\n        $authenticationInformation = $this->client()->authenticationInformation();\n\n        // Retrieve the authentication ticket\n        $ticketInformation = $this->client()->ticket($username, $password, $authenticationInformation);\n\n        Log::debug(sprintf('[#%s] Retrieved ticket: \\'%s\\'', __CLASS__, $ticketInformation->getTicket()));\n\n        // Retrieve the authentication token\n        $tokenInformation = $this->client()->token($ticketInformation->getTicket());\n\n        Log::debug(sprintf('[#%s] Retrieved token: \\'%s\\'', __CLASS__, $tokenInformation->getToken()));\n\n        return new AccessToken($tokenInformation->getToken(), AccessToken::PROVIDER_PTC, $tokenInformation->getTimestamp());\n    }\n\n    /**\n     * Returns the authentication identifier.\n     *\n     * @return string\n     */\n    public function identifier()\n    {\n        return 'ptc';\n    }\n\n    /**\n     * Returns the Authentication client\n     *\n     * @return AuthenticationClient\n     */\n    protected function client()\n    {\n        // Check if the authentication client is initialized\n        if ($this->authenticationClient == null) {\n            $this->authenticationClient = new AuthenticationClient();\n        }\n\n        return $this->authenticationClient;\n    }\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentials/Clients/AuthenticationClient.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Clients;\n\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\Cookie\\CookieJar;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\AuthenticationInformationParser;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results\\AuthenticationInformationResult;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results\\TicketResult;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results\\TokenResult;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\TicketParser;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\TokenParser;\nuse NicklasW\\PkmGoApi\\Facades\\App;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass AuthenticationClient {\n\n    /**\n     * @var string The login endpoint url\n     */\n    protected static $URL_ENDPOINT_LOGIN = 'https://sso.pokemon.com/sso/login?service=https%3A%2F%2Fsso.pokemon.com%2Fsso%2Foauth2.0%2FcallbackAuthorize';\n\n    /**\n     * @var string The oauth endpoint url\n     */\n    protected static $URL_ENDPOINT_OAUTH = 'https://sso.pokemon.com/sso/oauth2.0/accessToken';\n\n    /**\n     * @var string The client secret\n     */\n    protected static $CLIENT_SECRET = 'w8ScCUXJQc6kXKw8FiOhd8Fixzht18Dq3PEVkUCP5ZPxtgyWsbTvWHFLm2wNY0JR';\n\n    /**\n     * @var CookieJar\n     */\n    protected $cookies;\n\n    /**\n     * AuthenticationClient constructor.\n     */\n    public function __construct()\n    {\n        $this->cookies = new CookieJar();\n    }\n\n    /**\n     * Returns the authentication information.\n     *\n     * @return AuthenticationInformationResult\n     */\n    public function authenticationInformation()\n    {\n        // Retrieve the response\n        $response = $this->get(self::$URL_ENDPOINT_LOGIN);\n\n        // Get the authentication information parser\n        $parser = new AuthenticationInformationParser();\n\n        // Parse the content\n        return $parser->parse($response);\n    }\n\n    /**\n     * Returns the authentication ticket.\n     *\n     * @param string                          $username\n     * @param string                          $password\n     * @param AuthenticationInformationResult $authenticationInformation\n     * @return TicketResult\n     */\n    public function ticket($username, $password, $authenticationInformation)\n    {\n        $parameters = array(\n            'lt'        => $authenticationInformation->getLtCode(),\n            'execution' => $authenticationInformation->getExecutionCode(),\n            '_eventId'  => 'submit',\n            'username'  => $username,\n            'password'  => $password,\n            'Login'     => 'Sign In',\n        );\n\n        // Retrieve the content.\n        $response = $this->post(self::$URL_ENDPOINT_LOGIN, array('form_params' => $parameters, 'allow_redirects' => false));\n\n        // Get the authentication ticket parser\n        $parser = new TicketParser();\n\n        // Parse the content\n        return $parser->parse($response);\n    }\n\n    /**\n     * Returns the authentication token.\n     *\n     * @param string $ticket\n     * @return TokenResult\n     */\n    public function token($ticket)\n    {\n        $parameters = array(\n            'client_id'     => 'mobile-app_pokemon-go',\n            'redirect_uri'  => 'https://www.nianticlabs.com/pokemongo/error',\n            'client_secret' => self::$CLIENT_SECRET,\n            'grant_type'    => 'refresh_token',\n            'code'          => $ticket,\n        );\n\n        Log::debug(sprintf('[#%s] Ticket: \\'%s\\'', __CLASS__, $ticket));\n\n        // Retrieve the content.\n        $content = $this->post(self::$URL_ENDPOINT_OAUTH, array('form_params' => $parameters));\n\n        // Get the authentication ticket parser\n        $parser = new TokenParser();\n\n        // Parse the content\n        return $parser->parse($content);\n    }\n\n    /**\n     * Execute a GET request and returns the response content.\n     *\n     * @param string $url\n     * @param array  $parameters\n     * @return ResponseInterface\n     */\n    protected function get($url, $parameters = array())\n    {\n        // Execute the GET request\n        $response = $this->client()->get($url, $this->options($parameters));\n\n        // Retrieve the content\n        return $response;\n    }\n\n    /**\n     * Execute a POST request and returns the response content.\n     *\n     * @param string $url\n     * @param array  $parameters\n     * @return ResponseInterface\n     */\n    protected function post($url, $parameters = array())\n    {\n        // Execute the POST request\n        $response = $this->client()->post($url, $this->options($parameters));\n\n        // Retrieve the content\n        return $response;\n    }\n\n    /**\n     * Retrieve the options.\n     *\n     * @param array $options\n     * @return array\n     */\n    protected function options($options = array())\n    {\n        return array_merge($options, array('cookies' => $this->cookies, array('headers' => array('User-Agent' => 'niantic'))));\n    }\n\n    /**\n     * Returns the Client.\n     *\n     * @return Client\n     */\n    protected function client()\n    {\n        return App::get('client');\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentials/Parsers/AuthenticationInformationParser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\ResponseException;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results\\AuthenticationInformationResult;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass AuthenticationInformationParser extends Parser {\n\n    /**\n     * Authenticate constructor.\n     */\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /**\n     * The method which parses the content.\n     *\n     * @param ResponseInterface $response\n     * @return AuthenticationInformationResult\n     * @throws ResponseException\n     */\n    public function parse($response)\n    {\n        // Validate the retrieved response\n        $this->validateResponse($response);\n\n        // Retrieve the content\n        $content = (string)$response->getBody();\n\n        // Decode the content\n        $content = $this->content($content);\n\n        Log::debug(sprintf('[#%s] Retrieved content: \\'%s\\' ', __CLASS__, var_export($content, true)));\n\n        return new AuthenticationInformationResult(array('lt' => $content->lt, 'execution' => $content->execution));\n    }\n\n    /**\n     * Returns the content.\n     *\n     * @param ResponseInterface $response\n     * @return mixed\n     */\n    protected function content($response)\n    {\n        return json_decode($response);\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentials/Parsers/Parser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\ResponseException;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results\\Result;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nabstract class Parser\n{\n\n    /**\n     * @var integer The success status response code\n     */\n    protected static $RESPONSE_STATUS_SUCCESS = 200;\n\n    /**\n     * @var integer The redirect status response code\n     */\n    protected static $RESPONSE_STATUS_REDIRECT = 302;\n\n    /**\n     * @var Dom The DOM\n     */\n    protected $dom;\n\n    /**\n     * Parser constructor.\n     *\n     * @param Dom $dom\n     */\n    public function __construct($dom = null)\n    {\n        $this->dom = $dom;\n    }\n\n    /**\n     * The method which parses the content.\n     *\n     * @param mixed $content\n     * @return Result\n     */\n    abstract public function parse($content);\n\n    /**\n     * @param ResponseInterface $response\n     * @throws ResponseException\n     */\n    protected function validateResponse($response)\n    {\n        Log::debug(sprintf('[#%s] Validating response. Status code: \\'%s\\'', __CLASS__, $response->getStatusCode()));\n\n        // Check if we retrieved a valid response status code\n        if ($this->isSuccessfulResponse($response) || $this->isRedirect($response)) {\n            return;\n        }\n\n        Log::debug(sprintf('[#%s] Retrieved a invalid response. Content: \\'%s\\'', __CLASS__, $response->getBody()));\n\n        throw new ResponseException('Retrieved a invalid response from the server. Please try again later');\n    }\n\n    /**\n     * Returns true if the response was successful, false otherwise.\n     *\n     * @param ResponseInterface $response\n     * @return bool\n     */\n    protected function isSuccessfulResponse($response)\n    {\n        return $response->getStatusCode() === self::$RESPONSE_STATUS_SUCCESS;\n    }\n\n    /**\n     * Returns true if the response corresponds to a redirect, false otherwise\n     *\n     * @param ResponseInterface $response\n     * @return bool\n     */\n    protected function isRedirect($response)\n    {\n        return $response->getStatusCode() === self::$RESPONSE_STATUS_REDIRECT;\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentials/Parsers/Results/AuthenticationInformationResult.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results;\n\nclass AuthenticationInformationResult extends Result {\n\n    /**\n     * Returns the code.\n     *\n     * @return mixed\n     */\n    public function getLtCode()\n    {\n        return $this->data['lt'];\n    }\n\n    /**\n     * Returns the execution code.\n     */\n    public function getExecutionCode()\n    {\n        return $this->data['execution'];\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentials/Parsers/Results/Result.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results;\n\nclass Result {\n\n    /**\n     * @var mixed The parsed data\n     */\n    protected $data;\n\n    /**\n     * Result constructor.\n     *\n     * @param $data\n     */\n    public function __construct($data)\n    {\n        $this->data = $data;\n    }\n\n    /**\n     * @return mixed The parsed data\n     */\n    public function getData()\n    {\n        return $this->data;\n    }\n\n    /**\n     * @param mixed $data The parsed data\n     */\n    public function setData($data)\n    {\n        $this->data = $data;\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentials/Parsers/Results/TicketResult.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results;\n\nclass TicketResult extends Result {\n\n    /**\n     * Returns the ticket.\n     *\n     * @return mixed\n     */\n    public function getTicket()\n    {\n        return $this->data['ticket'];\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentials/Parsers/Results/TokenResult.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results;\n\nclass TokenResult extends Result {\n\n    /**\n     * Returns the token.\n     *\n     * @return mixed\n     */\n    public function getToken()\n    {\n        return $this->data['token'];\n    }\n\n    /**\n     * Returns the timestamp.\n     *\n     * @return string\n     */\n    public function getTimestamp()\n    {\n        return $this->data['timestamp'];\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentials/Parsers/TicketParser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\ResponseException;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results\\AuthenticationInformationResult;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results\\TicketResult;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass TicketParser extends Parser {\n\n    /**\n     * Authenticate constructor.\n     */\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /**\n     * The method which parses the content.\n     *\n     * @param ResponseInterface $response\n     * @return AuthenticationInformationResult\n     * @throws AuthenticationException\n     * @throws ResponseException\n     */\n    public function parse($response)\n    {\n        // Validate the retrieved response\n        $this->validateResponse($response);\n\n        Log::debug(sprintf('[#%s] Retrieved content: \\'%s\\'', __CLASS__, $response->getBody()));\n\n        // Parse the content\n        $content = $this->parseContent($response);\n\n        // Check if the response includes any error messages\n        if (array_key_exists('errors', $content)) {\n            // Retrieve the error messages\n            $errors = $content['errors'];\n\n            // Check if there are any available error messages\n            if (sizeof($errors) > 0) {\n                Log::debug(sprintf('[#%s] Error messages in response. Errors: \\'%s\\'', __CLASS__,\n                    print_r($errors, true)));\n                // A code of 503 indicates a service unavailable or unexpected error response. 0 is default\n                $code = (strpos(implode($errors), 'unexpected error') !== false) ? AuthenticationException::AUTH_SERVER_ERROR : 0;\n                throw new AuthenticationException(current($errors),$code);\n            }\n        }\n\n        // Retrieves the location header\n        $location = current($response->getHeader('Location'));\n\n        Log::debug(sprintf('[#%s] Retrieved location header: \\'%s\\'', __CLASS__, $location));\n\n        return new TicketResult(array('ticket' => $this->parseTicket($location)));\n    }\n\n    /**\n     * Returns the parsed content.\n     *\n     * @param ResponseInterface $response\n     * @return array\n     */\n    protected function parseContent($response)\n    {\n        // Retrieve the content\n        $content = (string)$response->getBody();\n\n        // Decode the response body\n        $content = json_decode($content, true);\n\n        // Check if the response body is null\n        if ($content === null) {\n            return array();\n        }\n\n        return $content;\n    }\n\n    /**\n     * Returns the parsed ticket.\n     *\n     * @param string $location\n     * @return string mixed\n     */\n    protected function parseTicket($location)\n    {\n        return substr($location, strpos($location, '=') + 1);\n    }\n\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentials/Parsers/TokenParser.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Parsers\\Results\\TokenResult;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse PHPHtmlParser\\Dom;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass TokenParser extends Parser {\n\n    /**\n     * Authenticate constructor.\n     */\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /**\n     * The method which parses the content.\n     *\n     * @param ResponseInterface $response\n     * @throws AuthenticationException\n     * @return TokenResult\n     */\n    public function parse($response)\n    {\n        // Retrieve the content\n        $content = $response->getBody();\n        \n        $errors = array();\n\n        // Check if the response includes any error messages\n        preg_match('/error=(?<error>.*)/', $content->getContents(), $errors);\n        if (sizeof($errors) > 0) {\n            Log::debug(sprintf('[#%s] Error messages in response. Errors: \\'%s\\'', __CLASS__,\n                print_r($errors, true)));\n            // A code of 498 indicates an expired or otherwise invalid token. 0 is default\n            $code = in_array('invalid_grant', $errors) ? AuthenticationException::PTC_INVALID_GRANT_ERROR : 0;\n            throw new AuthenticationException(current($errors),$code);\n        }\n\n        $content = (string)$content;\n        Log::debug(sprintf('[#%s] Retrieved content: \\'%s\\'', __CLASS__, $content));\n\n        return new TokenResult(\n            array('token' => $this->parseToken($content), 'timestamp' => $this->parseExpiresTimestamp($content)));\n    }\n\n    /**\n     * Returns the parsed ticket.\n     *\n     * @param string $content\n     * @return string mixed\n     */\n    protected function parseToken($content)\n    {\n        $matches = array();\n\n        preg_match('/access_token=(?<token>.*)&expires/', $content, $matches);\n\n        return $matches['token'];\n    }\n\n    /**\n     * Returns the parsed ticket.\n     *\n     * @param string $content\n     * @return string mixed\n     */\n    protected function parseExpiresTimestamp($content)\n    {\n        $matches = array();\n\n        preg_match('/expires=(?<expires>.*)/', $content, $matches);\n\n        return time() + intval($matches['expires']);\n    }\n\n}\n\n"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationCredentialsManager.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC\\AuthenticationCredentials\\Authenticator;\n\nclass AuthenticationCredentialsManager extends Manager {\n\n    /**\n     * @var string\n     */\n    protected $password;\n\n    /**\n     * @var string\n     */\n    protected $username;\n\n    /**\n     * AuthenticationCodeManager constructor.\n     *\n     * @param string $username\n     * @param string $password\n     */\n    public function __construct($username, $password)\n    {\n        $this->username = $username;\n        $this->password = $password;\n    }\n\n    /**\n     * Returns the Oauth token.\n     *\n     * @return AccessToken\n     */\n    public function getAccessToken()\n    {\n        // Check if we are authenticated\n        if ($this->isAuthenticated() && ($token = $this->refreshTokenIfPossible())) {\n            return $token;\n        }\n\n        // Retrieve the PTC authenticator\n        $authenticator = $this->authenticator();\n\n        // Retrieve the access token by user credentials\n        $accessToken = $authenticator->login($this->username, $this->password);\n\n        // Dispatch event to listeners\n        $this->dispatchEvent(static::EVENT_ACCESS_TOKEN, $accessToken);\n\n        // Add the access token to the manager\n        $this->setAccessToken($accessToken);\n\n        return $accessToken;\n    }\n\n    /**\n     * Returns the identifier.\n     *\n     * @return string\n     */\n    public function getIdentifier()\n    {\n        return $this->authenticator()->identifier();\n    }\n\n    /**\n     * Refresh the token if possible.\n     *\n     * @return AccessToken|null\n     * @throws AuthenticationException\n     */\n    protected function refreshTokenIfPossible()\n    {\n        // Check if the oauth token is valid\n        if ($this->isTokenValid()) {\n            return $this->accessToken;\n        }\n\n        // Check if a refresh token is defined\n        if ($this->hasFreshToken()) {\n            // Use refresh token to retrieve new oauth token\n\n            // Dispatch event to listeners\n            $this->dispatchEvent(static::EVENT_ACCESS_TOKEN, $this->accessToken);\n\n            return $this->accessToken;\n        }\n\n        return null;\n    }\n\n    /**\n     * Returns the authenticator.\n     *\n     * @return Authenticator\n     */\n    protected function authenticator()\n    {\n        return new Authenticator();\n    }\n}"
  },
  {
    "path": "src/Authentication/Managers/PTC/AuthenticationOauthTokenManager.php",
    "content": "<?php\n\n/**\n * @author DrDelay <info@vi0lation.de>\n */\n\nnamespace NicklasW\\PkmGoApi\\Authentication\\Managers\\PTC;\n\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse NicklasW\\PkmGoApi\\Authentication\\Factory\\Factory;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\n\nclass AuthenticationOauthTokenManager extends Manager\n{\n    /**\n     * AuthenticationOauthTokenManager constructor.\n     *\n     * @param AccessToken $token\n     */\n    public function __construct(AccessToken $token)\n    {\n        $this->setAccessToken($token);\n    }\n\n    public function getAccessToken()\n    {\n        $this->dispatchEvent(static::EVENT_ACCESS_TOKEN, $this->accessToken);\n\n        return $this->accessToken;\n    }\n\n    public function getIdentifier()\n    {\n        return Factory::PROVIDER_PTC;\n    }\n}\n"
  },
  {
    "path": "src/Clients/Proxies/ClientProxy.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Clients\\Proxies;\n\nuse GuzzleHttp\\ClientInterface;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\HandlerStack;\nuse GuzzleHttp\\MessageFormatter;\nuse GuzzleHttp\\Middleware;\nuse GuzzleHttp\\Promise\\PromiseInterface;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse Psr\\Http\\Message\\RequestInterface;\nuse Psr\\Http\\Message\\ResponseInterface;\nuse Psr\\Http\\Message\\UriInterface;\n\nclass ClientProxy implements ClientInterface\n{\n\n    /**\n     * @var string The logger message format\n     */\n    protected static $LOGGER_MESSAGE_FORMAT = \"\\nRequest: %1$1 {request} \\nResponse: {response} \\nError: {error} \\n\";\n\n    /**\n     * @var \\GuzzleHttp\\Client\n     */\n    private $client;\n\n    /**\n     * Client constructor.\n     *\n     * @param \\GuzzleHttp\\Client $client\n     */\n    public function __construct($client)\n    {\n        $this->client = $client;\n    }\n\n    /**\n     * Send an HTTP request.\n     *\n     * @param RequestInterface $request Request to send\n     * @param array            $options Request options to apply to the given\n     *                                  request and to the transfer.\n     * @return ResponseInterface\n     * @throws GuzzleException\n     */\n    public function send(RequestInterface $request, array $options = [])\n    {\n        return $this->client->send($request, $this->options($options));\n    }\n\n    /**\n     * Asynchronously send an HTTP request.\n     *\n     * @param RequestInterface $request Request to send\n     * @param array            $options Request options to apply to the given\n     *                                  request and to the transfer.\n     * @return PromiseInterface\n     */\n    public function sendAsync(RequestInterface $request, array $options = [])\n    {\n        return $this->client->sendAsync($request, $this->options($options));\n    }\n\n    /**\n     * Create and send an HTTP request.\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well.\n     *\n     * @param string              $method  HTTP method.\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     * @return ResponseInterface\n     * @throws GuzzleException\n     */\n    public function request($method, $uri, array $options = [])\n    {\n        return $this->client->request($method, $uri, $this->options($options));\n    }\n\n    /**\n     * Create and send an asynchronous HTTP request.\n     * Use an absolute path to override the base path of the client, or a\n     * relative path to append to the base path of the client. The URL can\n     * contain the query string as well. Use an array to provide a URL\n     * template and additional variables to use in the URL template expansion.\n     *\n     * @param string              $method  HTTP method\n     * @param string|UriInterface $uri     URI object or string.\n     * @param array               $options Request options to apply.\n     * @return PromiseInterface\n     */\n    public function requestAsync($method, $uri, array $options = [])\n    {\n        return $this->client->requestAsync($method, $uri, $this->options($options));\n    }\n\n    /**\n     * Get a client configuration option.\n     * These options include default request options of the client, a \"handler\"\n     * (if utilized by the concrete client), and a \"base_uri\" if utilized by\n     * the concrete client.\n     *\n     * @param string|null $option The config option to retrieve.\n     * @return mixed\n     */\n    public function getConfig($option = null)\n    {\n        return $this->client->getConfig($option);\n    }\n\n    /**\n     * @param string $method\n     * @param array  $args\n     * @return PromiseInterface|ResponseInterface\n     */\n    public function __call($method, $args)\n    {\n        if (count($args) < 1) {\n            throw new \\InvalidArgumentException('Magic request methods require a URI and optional options array');\n        }\n\n        $uri = $args[0];\n        $opts = isset($args[1]) ? $args[1] : [];\n\n        return substr($method, -5) === 'Async'\n            ? $this->requestAsync(substr($method, 0, -5), $uri, $this->options($opts))\n            : $this->request($method, $uri, $this->options($opts));\n    }\n\n    /**\n     * Returns the default configuration.\n     *\n     * @param array $options\n     * @return array\n     */\n    protected function options($options)\n    {\n        // Create a handler stack instance\n        $stack = HandlerStack::create();\n\n        // Create a middleware for logging\n        $stack->unshift(Middleware::log(Log::getInstance(), new MessageFormatter(self::$LOGGER_MESSAGE_FORMAT)));\n\n        return array_merge($options, array('http_errors' => false));\n    }\n\n}"
  },
  {
    "path": "src/Facades/App.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Facades;\n\nuse XStatic\\StaticProxy;\n\nclass App extends StaticProxy {\n\n    /**\n     * Retrieves the Instance Identifier that is used to retrieve the Proxy Subject from the Container\n     *\n     * @return string\n     * @throws \\BadMethodCallException if the method has not been implemented by a subclass\n     */\n    public static function getInstanceIdentifier()\n    {\n        return 'app';\n    }\n\n}"
  },
  {
    "path": "src/Facades/Log.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Facades;\n\nuse XStatic\\StaticProxy;\n\nclass Log extends StaticProxy {\n\n    /**\n     * Retrieves the Instance Identifier that is used to retrieve the Proxy Subject from the Container\n     *\n     * @return string\n     * @throws \\BadMethodCallException if the method has not been implemented by a subclass\n     */\n    public static function getInstanceIdentifier()\n    {\n        return 'log';\n    }\n\n}"
  },
  {
    "path": "src/Handlers/RequestHandler/Exceptions/AuthenticationException.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Handlers\\RequestHandler\\Exceptions;\n\nuse Exception;\n\nclass AuthenticationException extends \\Exception {\n\n    /**\n     * AuthenticationException constructor.\n     *\n     * @param string    $message\n     * @param int       $code\n     * @param Exception $previous\n     */\n    public function __construct($message = '', $code = 0, Exception $previous = null)\n    {\n        parent::__construct($message, $code, $previous);\n    }\n\n}"
  },
  {
    "path": "src/Handlers/RequestHandler/Exceptions/ResponseException.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Handlers\\RequestHandler\\Exceptions;\n\nuse Exception;\n\nclass ResponseException extends \\Exception {\n\n    /**\n     * AuthenticationException constructor.\n     *\n     * @param string    $message\n     * @param int       $code\n     * @param Exception $previous\n     */\n    public function __construct($message = '', $code = 0, Exception $previous = null)\n    {\n        parent::__construct($message, $code, $previous);\n    }\n\n}"
  },
  {
    "path": "src/Handlers/RequestHandler.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Handlers;\n\nuse Exception;\nuse Google\\Protobuf\\Internal\\GPBType;\nuse Google\\Protobuf\\Internal\\RepeatedField;\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\Psr7\\Request as HttpRequest;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Facades\\App;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse NicklasW\\PkmGoApi\\Handlers\\RequestHandler\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Handlers\\RequestHandler\\Exceptions\\ResponseException;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\nuse NicklasW\\PkmGoApi\\Requests\\Envelops\\Factory as EnvelopeFactory;\nuse NicklasW\\PkmGoApi\\Requests\\Request;\nuse POGOProtos\\Networking\\Envelopes\\RequestEnvelope;\nuse POGOProtos\\Networking\\Envelopes\\RequestEnvelope_AuthInfo_JWT;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Request as NetworkRequest;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nclass RequestHandler\n{\n\n    /**\n     * @var string The API URL\n     */\n    protected static $API_URL = 'https://pgorelease.nianticlabs.com/plfe/rpc';\n\n    /**\n     * @var int The request code\n     */\n    protected static $REQUEST_STATUS_CODE = 2;\n\n    /**\n     * @var string Authentication error response status\n     */\n    protected static $RESPONSE_STATUS_AUTHENTICATION_ERROR = 102;\n\n    /**\n     * @var string Account banned error response status\n     */\n    protected static $RESPONSE_STATUS_ACCOUNT_BANNED_ERROR = 3;\n\n    /**\n     * @var string The handskake response status\n     */\n    protected static $RESPONSE_STATUS_HANDSHAKE = 53;\n\n    /**\n     * @var string The handskake response status\n     */\n    protected static $RESPONSE_STATUS_THROTTLED = 52;\n\n    /**\n     * @var string The unknown response statuses\n     */\n    protected static $RESPONSE_STATUS_UNKNOWN = array(100);\n\n    /**\n     * @var Request[] The list of requests to be handled\n     */\n    protected $requests;\n\n    /**\n     * @var Session\n     */\n    protected $session;\n\n    /**\n     * @var Client\n     */\n    protected $client;\n\n    /**\n     * @var integer The request id\n     */\n    protected $requestId;\n\n    /**\n     * @var ApplicationKernel\n     */\n    protected $application;\n\n    /**\n     * @var EnvelopeFactory\n     */\n    protected $envelopeFactory;\n\n    /**\n     * RequestHandler constructor.\n     *\n     * @param ApplicationKernel $application\n     */\n    public function __construct($application)\n    {\n        // Set the initial request id\n        $this->requestId = rand(100000000, 999999999);\n\n        // Set the application\n        $this->application = $application;\n\n        // Initialize the envelope factory\n        $this->envelopeFactory = new EnvelopeFactory();\n    }\n\n    /**\n     * Handles a request.\n     *\n     * @param Request $request\n     * @param integer $retry\n     * @throws AuthenticationException\n     * @throws Exception\n     */\n    public function handle($request, $retry = 0)\n    {\n        // Validate the session, check if the auth token has expired and renew if possible\n        $this->validateSession();\n\n        // Build and populate request envelope\n        $requestEnvelope = $this->build($request);\n\n        // Execute the HTTP request\n        $response = $this->call($requestEnvelope);\n\n        // Validate the response envelope\n        $this->validateResponseEnvelope($response);\n\n        // Initialize session\n        $this->session($response);\n\n        // Check if the request corresponds to a handshake\n        if ($this->isHandshake($response)) {\n            Log::debug(sprintf('Handshake response. Status code: \\'%s\\'',\n                $response->getStatusCode(), print_r($response->getError(), true)));\n\n            $this->handle($request);\n\n            return;\n        }\n\n        // Check if the request corresponds to a throttled response\n        if ($this->isThrottledResponse($response)) {\n            // Check the number of retries, only retry twice\n            if ($retry < 2) {\n                Log::debug(sprintf('Throttle response. Retrying. Number of retries: \\'%s\\'', $retry));\n\n                // Only one or two request per second is allowed, sleep one second before retrying\n                sleep(1);\n\n                $this->handle($request, ++$retry);\n\n                return;\n            }\n\n            throw new Exception(sprintf('The server is to busy. Please try again later', $response->getStatusCode()));\n        }\n\n        // Check if the request corresponds to a unknown response\n        if ($this->isUnknownResponse($response)) {\n            throw new Exception(sprintf('Retrieved a unknown status code %s', $response->getStatusCode()));\n        }\n\n        // Handles and unsmarshalles the response envelope\n        $request->handleResponse($response);\n    }\n\n    /**\n     * Validates the response envelope. Throws exception on error.\n     *\n     * @param ResponseEnvelope $response\n     * @throws AuthenticationException\n     */\n    protected function validateResponseEnvelope($response)\n    {\n        // Check the authentication status\n        if ($this->hasAuthenticationError($response)) {\n            Log::debug(sprintf('Authentication error. Status code: \\'%s\\' Error message: \\'%s\\'',\n                $response->getStatusCode(), print_r($response->getError(), true)));\n\n            throw new AuthenticationException('Invalid authentication token provided');\n        }\n\n        // Check the account status\n        if ($this->isAccountBannedError($response)) {\n            Log::debug(sprintf('Authentication error. Status code: \\'%s\\' Error message: \\'%s\\'',\n                $response->getStatusCode(), print_r($response->getError(), true)));\n\n            throw new AuthenticationException('Invalid authentication state. The account may be banned');\n        }\n    }\n\n\n    /**\n     * Re-initialize the session.\n     *\n     * @param RequestEnvelope_AuthInfo_JWT $authenticationInformation\n     */\n    protected function reinitializeSession($authenticationInformation)\n    {\n        $this->session = new Session();\n\n        $this->session->setAuthenticationInformation($authenticationInformation);\n    }\n\n    /**\n     * Builds the server request envelope.\n     *\n     * @param Request $request\n     * @return RequestEnvelope\n     */\n    protected function build($request)\n    {\n        // Prepare the network request\n        $networkRequest = new NetworkRequest();\n        $networkRequest->setRequestType($request->getType());\n        $networkRequest->setRequestMessage($request->getMessage()->encode());\n\n        // Prepare the request envelope\n        $requestEnvelope = new RequestEnvelope();\n        $requestEnvelope->setStatusCode(self::$REQUEST_STATUS_CODE);\n\n        // Sets the request id\n        $requestEnvelope->setRequestId($this->requestId());\n        $requestEnvelope->setMsSinceLastLocationfix(rand(901, 999));\n\n        // Sets the location\n        $requestEnvelope->setLatitude($this->application->getLocation()->getLatitude());\n        $requestEnvelope->setLongitude($this->application->getLocation()->getLongitude());\n        $requestEnvelope->setAccuracy(rand(30, 100) / 10);\n\n        $repeatedField = new RepeatedField(GPBType::MESSAGE, NetworkRequest::class);\n        $repeatedField[] = $networkRequest;\n\n        // Add request\n        $requestEnvelope->setRequests($repeatedField);\n\n        return $requestEnvelope;\n    }\n\n    /**\n     * Execute the server request.\n     *\n     * @param RequestEnvelope $requestEnvelope\n     * @return ResponseEnvelope\n     */\n    protected function call($requestEnvelope)\n    {\n        // Set the API URL\n        $url = $this->session->getApiUrl();\n\n        // Check if a session is available\n        if ($url == null) {\n            $url = self::$API_URL;\n        }\n\n        // Prepare the authentication\n        $this->prepareAuthentication($requestEnvelope);\n\n        Log::debug(sprintf('The request envelope. Content: \\'%s\\'', print_r($requestEnvelope, true)));\n\n        // Prepare the HTTP request\n        $request = new HttpRequest('POST', $url, array('User-Agent' => 'Niantic App'), $requestEnvelope->encode());\n\n        // Execute the request\n        $response = $this->client()->send($request);\n\n        // Validate the retrieved response\n        $this->validateResponse($response);\n\n        // Unmarshall the response\n        return $this->unmarshall($response);\n    }\n\n    /**\n     * Unmarshall the response.\n     *\n     * @param ResponseInterface $response\n     * @return ResponseEnvelope\n     */\n    protected function unmarshall($response)\n    {\n        // Initialize the response envelope\n        $responseEnvelop = new ResponseEnvelope();\n\n        // Unmarshall the response\n        $responseEnvelop->decode($response->getBody()->getContents());\n\n        return $responseEnvelop;\n    }\n\n    /**\n     * Handle the session.\n     *\n     * @param ResponseEnvelope $response\n     * @return Session\n     */\n    protected function session($response)\n    {\n        // Check if the session is initialized\n        if (!$this->session) {\n            return new Session();\n        }\n\n        // Return if not initial handshake\n        if (!$this->isHandshake($response)) {\n            return;\n        }\n\n        // Set the API URL\n        $this->session->setApiUrl(sprintf('https://%s/rpc', $response->getApiUrl()));\n\n        // Set the authentication ticket\n        $this->session->setAuthenticationTicket($response->getAuthTicket());\n    }\n\n    /**\n     * Check if the session is valid, if not we refresh if possible.\n     */\n    protected function validateSession()\n    {\n        // Check if the current session is valid\n        if ($this->session !== null && $this->session->isValid()) {\n            return;\n        }\n\n        // Retrieve the renewed access token\n        $accessToken = $this->manager()->getAccessToken();\n\n        // Build the authentication information\n        $authenticationInformation = $this->envelopeFactory->create(\n            EnvelopeFactory::$TYPE_AUTHINFO, $accessToken->getProvider(), $accessToken);\n\n        // Reinitialize the session\n        $this->reinitializeSession($authenticationInformation);\n    }\n\n    /**\n     * Returns true if the request type corresponds to a authentication error, false otherwise.\n     *\n     * @param ResponseEnvelope $responseEnvelop\n     * @return boolean\n     */\n    protected function hasAuthenticationError($responseEnvelop)\n    {\n        return $responseEnvelop->getStatusCode() === self::$RESPONSE_STATUS_AUTHENTICATION_ERROR;\n    }\n\n    /**\n     * Returns true if the request type corresponds to an account banned error, false otherwise.\n     *\n     * @param ResponseEnvelope $responseEnvelop\n     * @return boolean\n     */\n    protected function isAccountBannedError($responseEnvelop)\n    {\n        return $responseEnvelop->getStatusCode() === self::$RESPONSE_STATUS_ACCOUNT_BANNED_ERROR;\n    }\n\n    /**\n     * Returns true if request type corresponds to a handshake, false otherwise.\n     *\n     * @param ResponseEnvelope $responseEnvelop\n     * @return boolean\n     */\n    protected function isHandshake($responseEnvelop)\n    {\n        return $responseEnvelop->getStatusCode() === self::$RESPONSE_STATUS_HANDSHAKE;\n    }\n\n    /**\n     * Returns true if the request status code is unknown, false otherwise.\n     *\n     * @param ResponseEnvelope $responseEnvelop\n     * @return boolean\n     */\n    protected function isThrottledResponse($responseEnvelop)\n    {\n        return $responseEnvelop->getStatusCode() === self::$RESPONSE_STATUS_THROTTLED;\n    }\n\n    /**\n     * Returns true if the request status code is unknown, false otherwise.\n     *\n     * @param ResponseEnvelope $responseEnvelop\n     * @return boolean\n     */\n    protected function isUnknownResponse($responseEnvelop)\n    {\n        return in_array($responseEnvelop->getStatusCode(), self::$RESPONSE_STATUS_UNKNOWN);\n    }\n\n    /**\n     * Returns true if the status code corresponds to a server error, false otherwise.\n     *\n     * @param ResponseInterface $response\n     * @return boolean\n     */\n    protected function isServerError($response)\n    {\n        // Retrieve the initial integer from the status code\n        $responseCode = substr($response->getStatusCode(), 0, 1);\n\n        return $responseCode == 5 || $responseCode == 4;\n    }\n\n    /**\n     * Returns the request id.\n     *\n     * @return integer\n     */\n    protected function requestId()\n    {\n        return ++$this->requestId;\n    }\n\n    /**\n     * Validate the request response.\n     *\n     * @param ResponseInterface $response\n     * @throws ResponseException\n     */\n    protected function validateResponse($response)\n    {\n        // Check if the response corresponds to a server error\n        if (!$this->isServerError($response)) {\n            return;\n        }\n\n        throw new ResponseException(\n            sprintf('Retrieved a invalid response. Response code: \\'%s\\'', $response->getStatusCode()));\n    }\n\n    /**\n     * Prepares the user authentication.\n     *\n     * @param RequestEnvelope $requestEnvelope\n     */\n    protected function prepareAuthentication($requestEnvelope)\n    {\n        // Check if we retrieved a authentication ticket since earlier\n        if ($this->session->getAuthenticationTicket() == null) {\n            @$requestEnvelope->setAuthInfo($this->session->getAuthenticationInformation());\n\n            return;\n        }\n\n        @$requestEnvelope->setAuthTicket($this->session->getAuthenticationTicket());\n    }\n\n    /**\n     * Returns the authentication manager\n     *\n     * @return Manager\n     */\n    protected function manager()\n    {\n        return $this->application->getManager();\n    }\n\n    /**\n     * Returns the client.\n     *\n     * @returns Client\n     */\n    protected function client()\n    {\n        return App::get('client');\n    }\n\n}"
  },
  {
    "path": "src/Handlers/Session.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Handlers;\n\nuse POGOProtos\\Networking\\Envelopes\\AuthTicket;\nuse POGOProtos\\Networking\\Envelopes\\RequestEnvelope_AuthInfo_JWT;\n\nclass Session {\n\n    /**\n     * @var AuthTicket\n     */\n    protected $authenticationTicket;\n\n    /**\n     * @var RequestEnvelope_AuthInfo_JWT\n     */\n    protected $authenticationInformation;\n\n    /**\n     * @var string The API url\n     */\n    protected $apiUrl;\n\n    /**\n     * Returns true if the session is valid, false otherwise.\n     *\n     * @return boolean\n     */\n    public function isValid()\n    {\n        // Retrieve the authentication ticket instance from the session\n        $authenticationTicket = $this->getAuthenticationTicket();\n\n        // Check if we have not authenticated yet\n        if ($authenticationTicket === null && $this->getAuthenticationInformation() !== null) {\n            return true;\n        }\n\n        // Check if the expire timestamp is valid\n        if ($authenticationTicket->getExpireTimestampMs() > microtime()) {\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * @return AuthTicket\n     */\n    public function getAuthenticationTicket()\n    {\n        return $this->authenticationTicket;\n    }\n\n    /**\n     * @param AuthTicket $authenticationTicket\n     */\n    public function setAuthenticationTicket($authenticationTicket)\n    {\n        $this->authenticationTicket = $authenticationTicket;\n    }\n\n    /**\n     * @return RequestEnvelope_AuthInfo_JWT\n     */\n    public function getAuthenticationInformation()\n    {\n        return $this->authenticationInformation;\n    }\n\n    /**\n     * @param RequestEnvelope_AuthInfo_JWT $authenticationInformation\n     */\n    public function setAuthenticationInformation($authenticationInformation)\n    {\n        $this->authenticationInformation = $authenticationInformation;\n    }\n\n    /**\n     * @return string\n     */\n    public function getApiUrl()\n    {\n        return $this->apiUrl;\n    }\n\n    /**\n     * @param string $apiUrl\n     */\n    public function setApiUrl($apiUrl)\n    {\n        $this->apiUrl = $apiUrl;\n    }\n\n}"
  },
  {
    "path": "src/Kernels/ApplicationKernel.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Kernels;\n\nuse DI\\NotFoundException;\nuse GuzzleHttp\\Client;\nuse NicklasW\\PkmGoApi\\Api\\Data\\Location;\nuse NicklasW\\PkmGoApi\\Api\\PokemonGoApi;\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Clients\\Proxies\\ClientProxy;\nuse NicklasW\\PkmGoApi\\Providers\\PokemonGoApiServiceProvider;\nuse NicklasW\\PkmGoApi\\Providers\\RequestHandlerServiceProvider;\n\nclass ApplicationKernel extends Kernel\n{\n\n    /**\n     * @var Manager\n     */\n    protected $manager;\n\n    /**\n     * @var Location\n     */\n    protected $location;\n\n    /**\n     * Kernel constructor.\n     *\n     * @param Manager $manager\n     */\n    public function __construct($manager)\n    {\n        $this->manager = $manager;\n        $this->location = new Location();\n\n        // Add the defined service providers\n        $this->addServiceProviders();\n\n        parent::__construct();\n    }\n\n    /**\n     * Initializes the library.\n     */\n    public function initialize()\n    {\n        parent::initialize();\n\n        // Initialize the client\n        $this->initializeClient();\n\n        // Add the application object to the container\n        $this->container->set('app', $this);\n    }\n\n    /**\n     * Sets the HTTP client.\n     *\n     * @param Client $client\n     */\n    public function setClient($client)\n    {\n        $this->container()->set('client', new ClientProxy($client));\n    }\n\n    /**\n     * Returns the pokemon go api.\n     *\n     * @return PokemonGoApi\n     * @throws NotFoundException\n     */\n    public function getPokemonGoApi()\n    {\n        return $this->container->get('PokemonGoApi');\n    }\n\n    /**\n     * Sets the location.\n     *\n     * @param Location $location\n     */\n    public function setLocation($location)\n    {\n        $this->location = $location;\n    }\n\n    /**\n     * @return Location\n     */\n    public function getLocation()\n    {\n        return $this->location;\n    }\n\n    /**\n     * @return Manager\n     */\n    public function getManager()\n    {\n        return $this->manager;\n    }\n\n    /**\n     * Initialize client.\n     */\n    public function initializeClient()\n    {\n        $this->container->set('client', new ClientProxy(new Client()));\n    }\n\n    /**\n     * Add the facades classes.\n     */\n    protected function addFacades()\n    {\n        $this->proxyManager->addProxy('App', 'NicklasW\\PkmGoApi\\Facades\\App');\n\n        parent::addFacades();\n    }\n\n    /**\n     * Add the service providers classes.\n     */\n    protected function addServiceProviders()\n    {\n        // Add the pokemon go api service provider\n        $this->register(new PokemonGoApiServiceProvider($this));\n\n        // Add the request handler service provider\n        $this->register(new RequestHandlerServiceProvider($this));\n    }\n\n}\n"
  },
  {
    "path": "src/Kernels/Kernel.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Kernels;\n\nuse DI\\Container;\nuse DI\\ContainerBuilder;\nuse Dotenv\\Dotenv;\nuse Interop\\Container\\ContainerInterface;\nuse Monolog\\Formatter\\LineFormatter;\nuse Monolog\\Handler\\NullHandler;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Logger;\nuse NicklasW\\PkmGoApi\\Config\\Config;\nuse NicklasW\\PkmGoApi\\Providers\\ServiceProvider;\nuse Psr\\Log\\LoggerInterface;\nuse Psr\\Log\\NullLogger;\nuse XStatic\\ProxyManager;\n\nclass Kernel implements ContainerInterface\n{\n\n    /**\n     * @var Container\n     */\n    protected $container;\n\n    /**\n     * @var ProxyManager\n     */\n    protected $proxyManager;\n\n    /**\n     * @var ServiceProvider[]\n     */\n    protected $serviceProviders;\n\n    /**\n     * Kernel constructor.\n     */\n    public function __construct()\n    {\n        // Initialize the container\n        $this->initializeContainer();\n\n        // Initialize the library\n        $this->initialize();\n    }\n\n    /**\n     * Finds an entry of the container by its identifier and returns it.\n     *\n     * @param string $id Identifier of the entry to look for.\n     * @throws NotFoundException  No entry was found for this identifier.\n     * @throws ContainerException Error while retrieving the entry.\n     * @return mixed Entry.\n     */\n    public function get($id)\n    {\n        return $this->container->get($id);\n    }\n\n    /**\n     * Returns true if the container can return an entry for the given identifier.\n     * Returns false otherwise.\n     *\n     * @param string $id Identifier of the entry to look for.\n     * @return boolean\n     */\n    public function has($id)\n    {\n        return $this->container->has($id);\n    }\n\n    /**\n     * Register a service provider.\n     *\n     * @param ServiceProvider $provider\n     */\n    public function register($provider)\n    {\n        $this->serviceProviders[] = $provider;\n    }\n\n    /**\n     * Sets the logger instance.\n     *\n     * @param LoggerInterface $logger\n     */\n    public function setLogger(LoggerInterface $logger)\n    {\n        $this->container->set('log', $logger);\n    }\n\n    /**\n     * Initializes the library.\n     */\n    protected function initialize()\n    {\n        // Initialize the proxy manager\n        $this->initializeProxyManager();\n\n        // Initialize the logger\n        $this->initializeLogger();\n\n        // Initialize the service providers\n        $this->initializeServiceProviders();\n    }\n\n    /**\n     * Add the facades classes.\n     */\n    protected function addFacades()\n    {\n        // Add the Log facade\n        $this->proxyManager->addProxy('Log', 'NicklasW\\PkmGoApi\\Facades\\Log');\n    }\n\n    /**\n     * Initialize the container.\n     */\n    protected function initializeContainer()\n    {\n        // Initialize the container builder\n        $builder = new ContainerBuilder();\n\n        // Build the container\n        $this->container = $builder->build();\n    }\n\n    /**\n     * Initialize the proxy manager.\n     */\n    protected function initializeProxyManager()\n    {\n        // Initialize the proxy manager\n        $this->proxyManager = new ProxyManager($this);\n\n        // Add the facades\n        $this->addFacades();\n\n        $this->proxyManager->enable(ProxyManager::ROOT_NAMESPACE_ANY);\n    }\n\n    /**\n     * Returns the container.\n     *\n     * @return Container\n     */\n    public function container()\n    {\n        return $this->container;\n    }\n\n    /**\n     * Initialize the service providers.\n     */\n    protected function initializeServiceProviders()\n    {\n        // Iterate through the list of service providers\n        foreach ($this->serviceProviders as $serviceProvider) {\n\n            // Register the service provider\n            $serviceProvider->register();\n        }\n    }\n\n    /**\n     * Initialize the logger.\n     */\n    protected function initializeLogger()\n    {\n        // Add the logger instance to the container\n        $this->container->set('log', new NullLogger());\n    }\n\n}\n"
  },
  {
    "path": "src/Providers/PokemonGoApiServiceProvider.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Providers;\n\nuse NicklasW\\PkmGoApi\\Api\\PokemonGoApi;\n\nclass PokemonGoApiServiceProvider extends ServiceProvider {\n\n    /**\n     * Register the service provider.\n     *\n     * @return mixed\n     */\n    public function register()\n    {\n        // Create the PokemonGoApi instance\n        $this->app->container()->set('PokemonGoApi', new PokemonGoApi());\n    }\n\n}"
  },
  {
    "path": "src/Providers/RequestHandlerServiceProvider.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Providers;\n\nuse NicklasW\\PkmGoApi\\Authentication\\Manager;\nuse NicklasW\\PkmGoApi\\Facades\\Log;\nuse NicklasW\\PkmGoApi\\Handlers\\RequestHandler;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\nuse NicklasW\\PkmGoApi\\Requests\\Envelops\\Factory as EnvelopeFactory;\n\nclass RequestHandlerServiceProvider extends ServiceProvider {\n\n    /**\n     * RequestHandlerServiceProvider constructor.\n     *\n     * @param ApplicationKernel $app\n     */\n    public function __construct($app)\n    {\n        parent::__construct($app);\n    }\n\n    /**\n     * Register the service provider.\n     *\n     * @return mixed\n     */\n    public function register()\n    {\n        // Create the RequestHandler instance\n        $this->app->container()->set('RequestHandler', new RequestHandler($this->app));\n    }\n\n}"
  },
  {
    "path": "src/Providers/ServiceProvider.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Providers;\n\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\n\nabstract class ServiceProvider {\n\n    /**\n     * @var ApplicationKernel\n     */\n    protected $app;\n\n    /**\n     * ServiceProvider constructor.\n     *\n     * @param ApplicationKernel $app\n     */\n    public function __construct($app)\n    {\n        $this->app = $app;\n    }\n\n    /**\n     * Register the service provider.\n     *\n     * @return mixed\n     */\n    abstract public function register();\n\n}"
  },
  {
    "path": "src/Requests/AuthenticateRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\n\nclass AuthenticateRequest extends Request\n{\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        // TODO: Implement getType() method.\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        // TODO: Implement getMessage() method.\n    }\n\n    /**\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    public function handleResponse($data)\n    {\n        // TODO: Implement handleResponse() method.\n    }\n}"
  },
  {
    "path": "src/Requests/CheckChallengeRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\CheckChallengeResponse;\n\nclass CheckChallengeRequest extends Request\n{\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::CHECK_CHALLENGE;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::CHECK_CHALLENGE;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        return new CheckChallengeResponse();\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the player response\n        $checkChallengeResponse = new CheckChallengeResponse();\n\n        // Unmarshall the response\n        $checkChallengeResponse->decode($requestData[0]);\n        $this->setData($checkChallengeResponse);\n    }\n}\n\n"
  },
  {
    "path": "src/Requests/Envelops/AuthInfoEnvelope.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Requests\\Envelops;\n\nclass AuthInfoEnvelope {\n\n\n    \n\n\n\n\n\n}"
  },
  {
    "path": "src/Requests/Envelops/Factory.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests\\Envelops;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse NicklasW\\PkmGoApi\\Authentication\\AccessToken;\nuse POGOProtos\\Networking\\Envelopes\\RequestEnvelope_AuthInfo;\nuse POGOProtos\\Networking\\Envelopes\\RequestEnvelope_AuthInfo_JWT;\n\nclass Factory {\n\n    /**\n     * @var string AuthInfo type\n     */\n    public static $TYPE_AUTHINFO = 'authinfo';\n\n    /**\n     * Envelope factory.\n     *\n     * @param string $type\n     * @param array  ...$parameters\n     * @return Message|null\n     */\n    public function create($type, ...$parameters)\n    {\n        $envelope = null;\n\n        switch ($type) {\n            case self::$TYPE_AUTHINFO:\n                // Create Auth Info envelope\n                $envelope = $this->authInfoEnvelope(...$parameters);\n\n                break;\n\n        }\n\n        return $envelope;\n    }\n\n    /**\n     * Creates AuthInfoEnvelope.\n     *\n     * @param string $type\n     * @param AccessToken $token\n     * @return RequestEnvelope_AuthInfo\n     */\n    protected function authInfoEnvelope($type, $token)\n    {\n        $authInfoJWT = new RequestEnvelope_AuthInfo_JWT();\n        $authInfoJWT->setContents($token->getToken());\n        $authInfoJWT->setUnknown2(59);\n\n        $authInfoEnvelope = new RequestEnvelope_AuthInfo();\n        $authInfoEnvelope->setProvider($type);\n        $authInfoEnvelope->setToken($authInfoJWT);\n\n        return $authInfoEnvelope;\n    }\n\n}\n"
  },
  {
    "path": "src/Requests/EvolvePokemonRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\EvolvePokemonMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\EvolvePokemonResponse;\n\nclass EvolvePokemonRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::EVOLVE_POKEMON;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @var int\n     */\n    protected $pokemonId;\n\n    /**\n     * TransferPokemonRequest constructor.\n     *\n     * @param integer $pokemonId\n     */\n    public function __construct($pokemonId)\n    {\n        $this->pokemonId = $pokemonId;\n    }\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::EVOLVE_POKEMON;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        $evolvePokemonMessage = new EvolvePokemonMessage();\n        $evolvePokemonMessage->setPokemonId($this->pokemonId);\n\n        return $evolvePokemonMessage;\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return EvolvePokemonResponse\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the evolve pokemon response\n        $evolvePokemonResponse = new EvolvePokemonResponse();\n\n        // Unmarshall the response\n        $evolvePokemonResponse->decode($requestData[0]);\n\n        $this->setData($evolvePokemonResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/FortSearchRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse NicklasW\\PkmGoApi\\Facades\\App;\nuse NicklasW\\PkmGoApi\\Kernels\\ApplicationKernel;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\FortSearchMessage;\nuse POGOProtos\\Networking\\Requests\\Messages\\GetMapObjectsMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\FortSearchResponse;\n\nclass FortSearchRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::FORT_SEARCH;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @var float\n     */\n    protected $latitude;\n\n    /**\n     * @var float\n     */\n    protected $longitude;\n\n    /**\n     * @var string\n     */\n    protected $id;\n\n    /**\n     * FortSearchRequest constructor.\n     *\n     * @param string $id\n     * @param double $latitude\n     * @param double $longitude\n     */\n    public function __construct($id, $latitude, $longitude)\n    {\n        $this->id = $id;\n        $this->latitude = $latitude;\n        $this->longitude = $longitude;\n    }\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::FORT_SEARCH;;\n    }\n\n    /**\n     * @return GetMapObjectsMessage\n     */\n    public function getMessage()\n    {\n        $message = new FortSearchMessage();\n\n        $message->setFortId($this->id);\n        $message->setFortLatitude($this->latitude);\n        $message->setFortLongitude($this->longitude);\n\n        $message->setPlayerLatitude($this->getCurrentLatitude());\n        $message->setPlayerLongitude($this->getCurrentLongitude());\n\n        return $message;\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the fort search response\n        $fortSearchResponse = new FortSearchResponse();\n\n        // Unmarshall the response\n        $fortSearchResponse->decode($requestData[0]);\n\n        $this->setData($fortSearchResponse);\n    }\n\n    /**\n     * Returns the current latitude of the player.\n     *\n     * @return float\n     */\n    protected function getCurrentLatitude()\n    {\n        return $this->getApplication()->getLatitude();\n    }\n\n    /**\n     * Returns the current longitude of the player.\n     *\n     * @return float\n     */\n    protected function getCurrentLongitude()\n    {\n        return $this->getApplication()->getLongitude();\n    }\n\n    /**\n     * Returns the application.\n     *\n     * @return ApplicationKernel\n     */\n    protected function getApplication()\n    {\n        return App::getInstance();\n    }\n\n}"
  },
  {
    "path": "src/Requests/GetInventoryRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\GetInventoryMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\GetInventoryResponse;\n\nclass GetInventoryRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::GET_INVENTORY;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::GET_INVENTORY;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        return new GetInventoryMessage();\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the inventory response\n        $inventoryResponse = new GetInventoryResponse();\n\n        // Unmarshall the response\n        $inventoryResponse->decode($requestData[0]);\n\n        $this->setData($inventoryResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/GetJournalRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\SfidaActionLogResponse;\n\nclass GetJournalRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::SFIDA_ACTION_LOG;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::SFIDA_ACTION_LOG;;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        return new SfidaActionLogResponse();\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the sfida action log response\n        $sfidaActionResponse = new SfidaActionLogResponse();\n\n        // Unmarshall the response\n        $sfidaActionResponse->decode($requestData[0]);\n\n        $this->setData($sfidaActionResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/GetMapResourcesRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\GetMapObjectsMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\GetMapObjectsResponse;\n\nclass GetMapResourcesRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::GET_MAP_OBJECTS;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @var float\n     */\n    protected $latitude;\n\n    /**\n     * @var float\n     */\n    protected $longitude;\n\n    /**\n     * @var array\n     */\n    protected $cellIds;\n\n    /**\n     * GetMapResourcesRequest constructor.\n     *\n     * @param double $latitude\n     * @param double $longitude\n     * @param array  $cellIds\n     */\n    public function __construct($latitude, $longitude, $cellIds)\n    {\n        $this->latitude = $latitude;\n        $this->longitude = $longitude;\n        $this->cellIds = $cellIds;\n    }\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::GET_MAP_OBJECTS;;\n    }\n\n    /**\n     * @return GetMapObjectsMessage\n     */\n    public function getMessage()\n    {\n        $message = new GetMapObjectsMessage();\n\n        $message->setLatitude($this->latitude);\n        $message->setLongitude($this->longitude);\n\n        foreach ($this->cellIds as $cellId) {\n            $message->addCellId($cellId);\n            $message->addSinceTimestampMs(0);\n        }\n\n        return $message;\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturnsArray();\n\n        // Initialize the map objects response\n        $mapObjectsResponse = new GetMapObjectsResponse();\n\n        // Unmarshall the response\n        $mapObjectsResponse->read($requestData[0]);\n\n        $this->setData($mapObjectsResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/GetPlayerRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\GetPlayerMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\GetPlayerResponse;\n\nclass GetPlayerRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::GET_PLAYER;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::GET_PLAYER;;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        return new GetPlayerMessage();\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the player response\n        $playerResponse = new GetPlayerResponse();\n\n        // Unmarshall the response\n        $playerResponse->decode($requestData[0]);\n\n        $this->setData($playerResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/RecycleInventoryItemRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\RecycleInventoryItemMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\RecycleInventoryItemResponse;\n\nclass RecycleInventoryItemRequest extends Request\n{\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::RECYCLE_INVENTORY_ITEM;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @var int\n     */\n    protected $itemId;\n\n    /**\n     * @var int\n     */\n    protected $itemCount;\n\n    /**\n     * RecycleInventoryItemRequest constructor.\n     *\n     * @param integer $itemId\n     * @param integer $count\n     */\n    public function __construct($itemId, $count)\n    {\n        $this->itemId = $itemId;\n        $this->itemCount = $count;\n    }\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::RECYCLE_INVENTORY_ITEM;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        $recycleInventoryItemMessage = new RecycleInventoryItemMessage();\n        $recycleInventoryItemMessage->setItemId($this->itemId);\n        $recycleInventoryItemMessage->setCount($this->itemCount);\n\n        return $recycleInventoryItemMessage;\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return RecycleInventoryItemResponse\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the rename pokemon response\n        $recycleInventoryItemResponse = new RecycleInventoryItemResponse();\n\n        // Unmarshall the response\n        $recycleInventoryItemResponse->decode($requestData[0]);\n\n        $this->setData($recycleInventoryItemResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/RenamePokemonRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\NicknamePokemonMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\NicknamePokemonResponse;\n\nclass RenamePokemonRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::NICKNAME_POKEMON;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @var int\n     */\n    protected $pokemonId;\n\n    /**\n     * @var string\n     */\n    protected $name;\n\n    /**\n     * TransferPokemonRequest constructor.\n     *\n     * @param integer $pokemonId\n     * @param string $name\n     */\n    public function __construct($pokemonId, $name)\n    {\n        $this->pokemonId = $pokemonId;\n        $this->name = $name;\n    }\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::NICKNAME_POKEMON;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        $nicknamePokemonMessage = new NicknamePokemonMessage();\n        $nicknamePokemonMessage->setPokemonId($this->pokemonId);\n        $nicknamePokemonMessage->setNickname($this->name);\n\n        return $nicknamePokemonMessage;\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return NicknamePokemonResponse\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the rename pokemon response\n        $nicknamePokemonResponse = new NicknamePokemonResponse();\n\n        // Unmarshall the response\n        $nicknamePokemonResponse->decode($requestData[0]);\n\n        $this->setData($nicknamePokemonResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/Request.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\n\nabstract class Request {\n\n    /**\n     * @var mixed The response\n     */\n    protected $data;\n\n    /**\n     * @return int\n     */\n    abstract public function getType();\n\n    /**\n     * @return Message\n     */\n    abstract public function getMessage();\n\n    /**\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    abstract public function handleResponse($data);\n\n    /**\n     * @return mixed\n     */\n    public function getData()\n    {\n        return $this->data;\n    }\n\n    /**\n     * @param mixed $data\n     */\n    public function setData($data)\n    {\n        $this->data = $data;\n    }\n\n}"
  },
  {
    "path": "src/Requests/SetFavoritePokemonRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\SetFavoritePokemonMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\SetFavoritePokemonResponse;\n\nclass SetFavoritePokemonRequest extends Request\n{\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::SET_FAVORITE_POKEMON;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @var int\n     */\n    protected $pokemonId;\n\n    /**\n     * @var boolean\n     */\n    protected $favorite;\n\n    /**\n     * TransferPokemonRequest constructor.\n     *\n     * @param integer $pokemonId\n     * @param boolean $favorite\n     */\n    public function __construct($pokemonId, $favorite)\n    {\n        $this->pokemonId = $pokemonId;\n        $this->favorite = $favorite;\n    }\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::SET_FAVORITE_POKEMON;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        $setFavoritePokemonMessage = new SetFavoritePokemonMessage();\n        $setFavoritePokemonMessage->setPokemonId($this->pokemonId);\n        $setFavoritePokemonMessage->setIsFavorite($this->favorite);\n\n        return $setFavoritePokemonMessage;\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return SetFavoritePokemonResponse\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the rename pokemon response\n        $setFavoritePokemonResponse = new SetFavoritePokemonResponse();\n\n        // Unmarshall the response\n        $setFavoritePokemonResponse->decode($requestData[0]);\n\n        $this->setData($setFavoritePokemonResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/TransferPokemonRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\ReleasePokemonMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\ReleasePokemonResponse;\n\nclass TransferPokemonRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::RELEASE_POKEMON;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @var int\n     */\n    protected $pokemonId;\n\n    /**\n     * TransferPokemonRequest constructor.\n     *\n     * @param integer $pokemonId\n     */\n    public function __construct($pokemonId)\n    {\n        $this->pokemonId = $pokemonId;\n    }\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::RELEASE_POKEMON;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        $releasePokemonMessage =  new ReleasePokemonMessage();\n        $releasePokemonMessage->setPokemonId($this->pokemonId);\n\n        return $releasePokemonMessage;\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the release pokemon response\n        $releasePokemonResponse = new ReleasePokemonResponse();\n\n        // Unmarshall the response\n        $releasePokemonResponse->decode($requestData[0]);\n\n        $this->setData($releasePokemonResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/UpgradePokemonRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\UpgradePokemonMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\UpgradePokemonResponse;\n\nclass UpgradePokemonRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::UPGRADE_POKEMON;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @var int\n     */\n    protected $pokemonId;\n\n    /**\n     * UpgradePokemonRequest constructor.\n     *\n     * @param integer $pokemonId\n     */\n    public function __construct($pokemonId)\n    {\n        $this->pokemonId = $pokemonId;\n    }\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::UPGRADE_POKEMON;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        $upgradePokemonMessage =  new UpgradePokemonMessage();\n        $upgradePokemonMessage->setPokemonId($this->pokemonId);\n\n        return $upgradePokemonMessage;\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the release pokemon response\n        $upgradePokemonResponse = new UpgradePokemonResponse();\n\n        // Unmarshall the response\n        $upgradePokemonResponse->decode($requestData[0]);\n\n        $this->setData($upgradePokemonResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/UseIncenseRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\UseIncenseMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\UseIncenseResponse;\n\nclass UseIncenseRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::USE_INCENSE;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @var int\n     */\n    protected $itemId;\n\n    /**\n     * UseIncenseRequest constructor.\n     *\n     * @param integer $itemId\n     */\n    public function __construct($itemId)\n    {\n        $this->itemId = $itemId;\n    }\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::USE_INCENSE;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        $useIncenseMessage = new UseIncenseMessage();\n        $useIncenseMessage->setIncenseType($this->itemId);\n\n        return $useIncenseMessage;\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return UseIncenseResponse\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the rename pokemon response\n        $useIncenseResponse = new UseIncenseResponse();\n\n        // Unmarshall the response\n        $useIncenseResponse->decode($requestData[0]);\n\n        $this->setData($useIncenseResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/UseItemXpBoostRequest.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\UseItemXpBoostMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\UseItemXpBoostResponse;\n\nclass UseItemXpBoostRequest extends Request {\n\n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::USE_ITEM_XP_BOOST;\n\n    /**\n     * @var Message The request message\n     */\n    protected $message;\n\n    /**\n     * @var int\n     */\n    protected $itemId;\n\n    /**\n     * UseItemXpBoostRequest constructor.\n     *\n     * @param integer $itemId\n     */\n    public function __construct($itemId)\n    {\n        $this->itemId = $itemId;\n    }\n\n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::USE_ITEM_XP_BOOST;\n    }\n\n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        $useItemXpBoostMessage = new UseItemXpBoostMessage();\n        $useItemXpBoostMessage->setItemId($this->itemId);\n\n        return $useItemXpBoostMessage;\n    }\n\n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return UseItemXpBoostResponse\n     */\n    public function handleResponse($data)\n    {\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n\n        // Initialize the rename pokemon response\n        $useItemXpBoostResponse = new UseItemXpBoostResponse();\n\n        // Unmarshall the response\n        $useItemXpBoostResponse->decode($requestData[0]);\n\n        $this->setData($useItemXpBoostResponse);\n    }\n}"
  },
  {
    "path": "src/Requests/VerifyChallengeRequest.php",
    "content": "<?php\nnamespace NicklasW\\PkmGoApi\\Requests;\n\nuse Google\\Protobuf\\Internal\\Message;\nuse POGOProtos\\Networking\\Envelopes\\ResponseEnvelope;\nuse POGOProtos\\Networking\\Requests\\Messages\\VerifyChallengeMessage;\nuse POGOProtos\\Networking\\Requests\\RequestType;\nuse POGOProtos\\Networking\\Responses\\VerifyChallengeResponse;\n\nclass VerifyChallengeRequest extends Request {\n    \n    /**\n     * @var integer The request type\n     */\n    protected $type = RequestType::VERIFY_CHALLENGE;\n    \n    /**\n     * @var Message The request message\n     */\n    protected $message;\n    \n    /**\n     * @var string\n     */\n    protected $token;\n    \n    /**\n     * VerifyChallengeRequest constructor.\n     *\n     * @param string $token\n     */\n    public function __construct($token)\n    {\n        $this->token = $token;\n    }\n    \n    /**\n     * @return int\n     */\n    public function getType()\n    {\n        return RequestType::VERIFY_CHALLENGE;\n    }\n    \n    /**\n     * @return Message\n     */\n    public function getMessage()\n    {\n        $verifyChallengeMessage = new VerifyChallengeMessage();\n        $verifyChallengeMessage->setToken($this->token);\n        \n        return $verifyChallengeMessage;\n    }\n    \n    /**\n     * Handles the request data.\n     *\n     * @param ResponseEnvelope $data\n     * @return mixed\n     */\n    public function handleResponse($data)\n    {\n        // DEBUG - dump response object\n        //var_dump($data);\n        // DEBUG - check status code of response for error handling, but error can return both 1 and 2 - not sure why?\n        //echo \"StatusCode: \" . $data->getStatusCode();\n        \n        // Initialize the VerifyChallenge response\n        $verifyChallengeResponse = new VerifyChallengeResponse();\n\n        // Retrieve the specific request data\n        $requestData = $data->getReturns();\n        if ($requestData) {\n            // Unmarshall the response\n            $verifyChallengeResponse->decode($requestData[0]);\n        }else {\n            // HACK to instansiate a valid VerifyChallengeResponse object when $requestData == NULL - sets success to \"0\";\n            $verifyChallengeResponse->setSuccess(true);\n        }\n\n        $this->setData($verifyChallengeResponse);\n    }\n}\n"
  },
  {
    "path": "src/Services/Request/CheckChallengeRequestService.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Services\\Request;\n\nuse NicklasW\\PkmGoApi\\Handlers\\Exception;\nuse NicklasW\\PkmGoApi\\Requests\\CheckChallengeRequest;\nuse NicklasW\\PkmGoApi\\Services\\RequestService;\nuse POGOProtos\\Networking\\Responses\\CheckChallengeResponse;\n\nclass CheckChallengeRequestService extends RequestService {\n\n    /**\n     * Returns the CheckChallengeRequest metadata.\n     *\n     * @throws Exception\n     * @returns CheckChallengeResponse\n     */\n    public function checkChallenge()\n    {\n        $checkChallengeRequest = new CheckChallengeRequest();\n\n        $this->requestHandler()->handle($checkChallengeRequest);\n\n        return $checkChallengeRequest->getData();\n    }\n}\n\n"
  },
  {
    "path": "src/Services/Request/InventoryRequestService.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Services\\Request;\n\nuse NicklasW\\PkmGoApi\\Requests\\GetInventoryRequest;\nuse NicklasW\\PkmGoApi\\Requests\\RecycleInventoryItemRequest;\nuse NicklasW\\PkmGoApi\\Requests\\UseIncenseRequest;\nuse NicklasW\\PkmGoApi\\Requests\\UseItemXpBoostRequest;\nuse NicklasW\\PkmGoApi\\Services\\RequestService;\n\nuse POGOProtos\\Networking\\Responses\\GetInventoryResponse;\nuse POGOProtos\\Networking\\Responses\\RecycleInventoryItemResponse;\nuse POGOProtos\\Networking\\Responses\\UseIncenseResponse;\nuse POGOProtos\\Networking\\Responses\\UseItemXpBoostResponse;\n\nclass InventoryRequestService extends RequestService {\n\n    /**\n     * Returns the inventory.\n     *\n     * @return GetInventoryResponse\n     */\n    public function getInventory()\n    {\n        $inventoryRequest = new GetInventoryRequest();\n\n        $this->requestHandler()->handle($inventoryRequest);\n\n        return $inventoryRequest->getData();\n    }\n\n    /**\n     * Recycle item.\n     *\n     * @param integer $itemId\n     * @param int  $count\n     * @return RecycleInventoryItemResponse\n     */\n    public function recycle($itemId, $count)\n    {\n        $recycleInventoryItemRequest = new RecycleInventoryItemRequest($itemId, $count);\n\n        $this->requestHandler()->handle($recycleInventoryItemRequest);\n\n        return $recycleInventoryItemRequest->getData();\n    }\n\n    /**\n     * Use incense item.\n     *\n     * @param integer $itemId\n     * @return UseIncenseResponse\n     */\n    public function useIncense($itemId)\n    {\n        $useIncenseRequest = new UseIncenseRequest($itemId);\n\n        $this->requestHandler()->handle($useIncenseRequest);\n\n        return $useIncenseRequest->getData();\n    }\n\n    /**\n     * Use xp boost item.\n     *\n     * @param integer $itemId\n     * @return UseItemXpBoostResponse\n     */\n    public function useItemXpBoost($itemId)\n    {\n        $useItemXpBoostRequest = new UseItemXpBoostRequest($itemId);\n\n        $this->requestHandler()->handle($useItemXpBoostRequest);\n\n        return $useItemXpBoostRequest->getData();\n    }\n}"
  },
  {
    "path": "src/Services/Request/JournalRequestService.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Services\\Request;\n\nuse NicklasW\\PkmGoApi\\Handlers\\Exception;\nuse NicklasW\\PkmGoApi\\Requests\\GetJournalRequest;\nuse NicklasW\\PkmGoApi\\Services\\RequestService;\nuse POGOProtos\\Networking\\Responses\\SfidaActionLogResponse;\n\nclass JournalRequestService extends RequestService {\n\n    /**\n     * Returns the player metadata.\n     *\n     * @throws Exception\n     * @returns SfidaActionLogResponse\n     */\n    public function getJournal()\n    {\n        $journalRequest = new GetJournalRequest();\n\n        $this->requestHandler()->handle($journalRequest);\n\n        return $journalRequest->getData();\n    }\n\n}"
  },
  {
    "path": "src/Services/Request/MapRequestService.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Services\\Request;\n\nuse NicklasW\\PkmGoApi\\Handlers\\RequestHandler\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Requests\\GetMapResourcesRequest;\nuse NicklasW\\PkmGoApi\\Services\\RequestService;\nuse POGOProtos\\Networking\\Responses\\GetMapObjectsResponse;\n\nclass MapRequestService extends RequestService {\n\n    /**\n     * Returns the map resources.\n     *\n     * @param double $latitude\n     * @param double $longitude\n     * @param array  $mapCellIds\n     * @return GetMapObjectsResponse\n     * @throws \\Exception\n     * @throws AuthenticationException\n     */\n    public function getResources($latitude, $longitude, $mapCellIds)\n    {\n        $mapResourcesRequest = new GetMapResourcesRequest($latitude, $longitude, $mapCellIds);\n\n        $this->requestHandler()->handle($mapResourcesRequest);\n\n        return $mapResourcesRequest->getData();\n    }\n\n}"
  },
  {
    "path": "src/Services/Request/PlayerRequestService.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Services\\Request;\n\nuse NicklasW\\PkmGoApi\\Handlers\\Exception;\nuse NicklasW\\PkmGoApi\\Requests\\GetPlayerRequest;\nuse NicklasW\\PkmGoApi\\Services\\RequestService;\nuse POGOProtos\\Networking\\Responses\\GetPlayerResponse;\n\nclass PlayerRequestService extends RequestService {\n\n    /**\n     * Returns the player metadata.\n     *\n     * @throws Exception\n     * @returns GetPlayerResponse\n     */\n    public function getPlayer()\n    {\n        $playerRequest = new GetPlayerRequest();\n\n        $this->requestHandler()->handle($playerRequest);\n\n        return $playerRequest->getData();\n    }\n\n}"
  },
  {
    "path": "src/Services/Request/PokemonRequestService.php",
    "content": "<?php\n\n\nnamespace NicklasW\\PkmGoApi\\Services\\Request;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Handlers\\RequestHandler\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Requests\\EvolvePokemonRequest;\nuse NicklasW\\PkmGoApi\\Requests\\RenamePokemonRequest;\nuse NicklasW\\PkmGoApi\\Requests\\SetFavoritePokemonRequest;\nuse NicklasW\\PkmGoApi\\Requests\\TransferPokemonRequest;\nuse NicklasW\\PkmGoApi\\Requests\\UpgradePokemonRequest;\nuse NicklasW\\PkmGoApi\\Services\\RequestService;\nuse POGOProtos\\Networking\\Responses\\EvolvePokemonResponse;\nuse POGOProtos\\Networking\\Responses\\NicknamePokemonResponse;\nuse POGOProtos\\Networking\\Responses\\ReleasePokemonResponse;\nuse POGOProtos\\Networking\\Responses\\SetFavoritePokemonResponse;\nuse POGOProtos\\Networking\\Responses\\UpgradePokemonResponse;\n\nclass PokemonRequestService extends RequestService {\n\n    /**\n     * Transfer a pokemon.\n     *\n     * @param integer $pokemonId\n     * @return ReleasePokemonResponse\n     * @throws AuthenticationException\n     * @throws Exception\n     */\n    public function transfer($pokemonId)\n    {\n        $transferPokemonRequest = new TransferPokemonRequest($pokemonId);\n\n        $this->requestHandler()->handle($transferPokemonRequest);\n\n        return $transferPokemonRequest->getData();\n    }\n\n    /**\n     * Renames a pokemon.\n     *\n     * @param integer $pokemonId\n     * @param string  $name\n     * @return NicknamePokemonResponse\n     */\n    public function rename($pokemonId, $name)\n    {\n        $renamePokemonRequest = new RenamePokemonRequest($pokemonId, $name);\n\n        $this->requestHandler()->handle($renamePokemonRequest);\n\n        return $renamePokemonRequest->getData();\n    }\n\n    /**\n     * Evolves the pokemon.\n     *\n     * @param integer $pokemonId\n     * @return EvolvePokemonResponse\n     * @throws AuthenticationException\n     * @throws Exception\n     */\n    public function envolve($pokemonId)\n    {\n        $evolvePokemonRequest = new EvolvePokemonRequest($pokemonId);\n\n        $this->requestHandler()->handle($evolvePokemonRequest);\n\n        return $evolvePokemonRequest->getData();\n    }\n\n    /**\n     * Upgrade the pokemon.\n     *\n     * @param integer $pokemonId\n     * @return UpgradePokemonResponse\n     * @throws AuthenticationException\n     * @throws Exception\n     */\n    public function upgrade($pokemonId)\n    {\n        $upgradePokemonRequest = new UpgradePokemonRequest($pokemonId);\n\n        $this->requestHandler()->handle($upgradePokemonRequest);\n\n        return $upgradePokemonRequest->getData();\n    }\n\n    /**\n     * Set pokemon favorite.\n     *\n     * @param integer $pokemonId\n     * @param boolean $fav\n     * @return SetFavoritePokemonResponse\n     * @throws AuthenticationException\n     * @throws Exception\n     */\n    public function favorite($pokemonId, $fav)\n    {\n        $setFavoritePokemonRequest = new SetFavoritePokemonRequest($pokemonId, $fav);\n\n        $this->requestHandler()->handle($setFavoritePokemonRequest);\n\n        return $setFavoritePokemonRequest->getData();\n    }\n}"
  },
  {
    "path": "src/Services/Request/PokestopRequestService.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Services\\Request;\n\nuse Exception;\nuse NicklasW\\PkmGoApi\\Handlers\\RequestHandler\\Exceptions\\AuthenticationException;\nuse NicklasW\\PkmGoApi\\Requests\\FortSearchRequest;\nuse NicklasW\\PkmGoApi\\Requests\\GetMapResourcesRequest;\nuse NicklasW\\PkmGoApi\\Services\\RequestService;\nuse POGOProtos\\Networking\\Responses\\FortSearchResponse;\nuse POGOProtos\\Networking\\Responses\\GetMapObjectsResponse;\n\n/**\n * Class PokestopRequestService\n *\n * @package NicklasW\\PkmGoApi\\Services\\Request\n */\nclass PokestopRequestService extends RequestService {\n\n    /**\n     * Spin a pokestop.\n     *\n     * @param $id\n     * @param $latitude\n     * @param $longitude\n     * @return FortSearchResponse\n     * @throws AuthenticationException\n     * @throws Exception\n     */\n    public function spin($id, $latitude, $longitude)\n    {\n        $fortSearchRequest = new FortSearchRequest($id, $latitude, $longitude);\n\n        $this->requestHandler()->handle($fortSearchRequest);\n\n        return $fortSearchRequest->getData();\n    }\n\n}"
  },
  {
    "path": "src/Services/RequestService.php",
    "content": "<?php\n\nnamespace NicklasW\\PkmGoApi\\Services;\n\nuse DI\\Container;\nuse NicklasW\\PkmGoApi\\Facades\\App;\nuse NicklasW\\PkmGoApi\\Handlers\\RequestHandler;\n\nclass RequestService {\n\n    /**\n     * Returns the request handler.\n     *\n     * @return RequestHandler\n     * @throws \\DI\\NotFoundException\n     */\n    public function requestHandler()\n    {\n        return $this->getContainer()->get('RequestHandler');\n    }\n\n    /**\n     * Returns the container.\n     *\n     * @return Container\n     */\n    protected function getContainer()\n    {\n        return App::container();\n    }\n\n}"
  },
  {
    "path": "tests/Api/Pokemon/PokemonTest.php",
    "content": "<?php\n/**\n * @author DrDelay <info@vi0lation.de>\n */\n\nnamespace NicklasW\\PkmGoApi\\Test\\Api\\Pokemon;\n\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\CandyItem;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\PokemonItem;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Inventory\\Stats;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile\\Currencies;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Data\\Profile\\Currency;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Inventory;\nuse NicklasW\\PkmGoApi\\Api\\Player\\Profile;\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Data\\PokemonMetaRegistry;\nuse NicklasW\\PkmGoApi\\Api\\Pokemon\\Pokemon;\nuse POGOProtos\\Enums\\PokemonId;\n\nclass PokemonTest extends \\PHPUnit_Framework_TestCase\n{\n    const UPGRADE_TEST_LEVEL = 30;\n\n    /**\n     * Get a Pokemon mock with overwritten getCandies method.\n     *\n     * @param PokemonItem $pokemonItem\n     * @param CandyItem   $candyItem\n     *\n     * @return Pokemon|\\PHPUnit_Framework_MockObject_MockObject\n     */\n    protected function buildCandyMockedPokemon(PokemonItem $pokemonItem, CandyItem $candyItem)\n    {\n        $stub = $this->getMockBuilder(Pokemon::class)\n            ->setConstructorArgs([$pokemonItem])\n            ->setMethods(['getCandies'])\n            ->getMock();\n\n        $stub->method('getCandies')->willReturn($candyItem);\n\n        return $stub;\n    }\n\n    /**\n     * Get a Pokemon mock with overwritten methods for getting player level, stardust and candy.\n     *\n     * @param PokemonItem $pokemonItem\n     * @param int         $level\n     * @param Currency    $stardust\n     * @param CandyItem   $candyItem\n     *\n     * @return Pokemon|\\PHPUnit_Framework_MockObject_MockObject\n     */\n    protected function buildLevelStardustCandyMockedPokemon(PokemonItem $pokemonItem, $level, Currency $stardust, CandyItem $candyItem)\n    {\n        $stub = $this->getMockBuilder(Pokemon::class)\n            ->setConstructorArgs([$pokemonItem])\n            ->setMethods([\n                'inventory',\n                'profile',\n                'getCandies',\n            ])\n            ->getMock();\n\n        $statsStub = $this->getMockBuilder(Stats::class)\n            ->disableOriginalConstructor()\n            ->setMethods(['getLevel'])\n            ->getMock();\n        $statsStub->method('getLevel')->willReturn($level);\n        $inventoryStub = $this->getMockBuilder(Inventory::class)\n            ->disableOriginalConstructor()\n            ->setMethods(['getStats'])\n            ->getMock();\n        $inventoryStub->method('getStats')->willReturn($statsStub);\n\n        $currenciesStub = $this->getMockBuilder(Currencies::class)\n            ->disableOriginalConstructor()\n            ->setMethods(['getStardust'])\n            ->getMock();\n        $currenciesStub->method('getStardust')->willReturn($stardust);\n        $profileStub = $this->getMockBuilder(Profile::class)\n            ->disableOriginalConstructor()\n            ->setMethods(['getCurrencies'])\n            ->getMock();\n        $profileStub->method('getCurrencies')->willReturn($currenciesStub);\n\n        $stub->method('inventory')->willReturn($inventoryStub);\n        $stub->method('profile')->willReturn($profileStub);\n        $stub->method('getCandies')->willReturn($candyItem);\n\n        return $stub;\n    }\n\n    /**\n     * Tests that the deployment status of a Pokemon is identified correctly.\n     *\n     * @param PokemonItem $pokemonItem\n     * @param bool        $deploymentStatus\n     *\n     * @dataProvider providerDeployedPokemon\n     */\n    public function testIsDeployed(PokemonItem $pokemonItem, $deploymentStatus)\n    {\n        $pokemon = new Pokemon($pokemonItem);\n        $this->assertSame($deploymentStatus, $pokemon->isDeployed());\n    }\n\n    /**\n     * Provides a set of Test-PokemonItems for checking their deployment to a fort.\n     *\n     * @return array\n     */\n    public function providerDeployedPokemon()\n    {\n        $deployedTo20 = new PokemonItem();\n        $deployedTo20->setDeployedFortId(20);\n        yield [$deployedTo20, true];\n\n        $undeployed = new PokemonItem();\n        yield [$undeployed, false];\n    }\n\n    /**\n     * Tests that evolvability of a Pokemon is identified correctly.\n     *\n     * @param Pokemon $pokemon\n     * @param bool    $evolvability\n     *\n     * @dataProvider providerEvolvePokemon\n     */\n    public function testCanEvolve(Pokemon $pokemon, $evolvability)\n    {\n        $this->assertSame($evolvability, $pokemon->canEvolve());\n    }\n\n    /**\n     * Provides a set of Test-Pokemons for checking their evolvability.\n     *\n     * @return array\n     */\n    public function providerEvolvePokemon()\n    {\n        $deployedTo20 = new PokemonItem();\n        $deployedTo20->setDeployedFortId(20);\n        yield [new Pokemon($deployedTo20), false];\n\n        $venusaur = new PokemonItem();\n        $venusaur->setPokemonId(PokemonId::VENUSAUR);\n        yield [new Pokemon($venusaur), false];\n\n        $bulbasaur = new PokemonItem();\n        $bulbasaur->setPokemonId(PokemonId::BULBASAUR);\n\n        $noCandy = new CandyItem();\n        $noCandy->setCandy(0);\n        yield [$this->buildCandyMockedPokemon($bulbasaur, $noCandy), false];\n\n        $bulbasaurMeta = PokemonMetaRegistry::getByPokemonId(PokemonId::BULBASAUR);\n        $enoughCandy = new CandyItem();\n        $enoughCandy->setCandy($bulbasaurMeta->getCandyToEvolve() * 3);\n        yield [$this->buildCandyMockedPokemon($bulbasaur, $enoughCandy), true];\n    }\n\n    /**\n     * Tests that upgradeability of a Pokemon is identified correctly.\n     *\n     * @param Pokemon $pokemon\n     * @param bool    $upgradeability\n     *\n     * @dataProvider providerUpgradePokemon\n     */\n    public function testCanUpgrade(Pokemon $pokemon, $upgradeability)\n    {\n        $this->assertSame($upgradeability, $pokemon->canUpgrade());\n    }\n\n    /**\n     * Provides a set of Test-Pokemons for checking their upgradeability.\n     *\n     * @return array\n     */\n    public function providerUpgradePokemon()\n    {\n        $deployedTo20 = new PokemonItem();\n        $deployedTo20->setDeployedFortId(20);\n        yield [new Pokemon($deployedTo20), false];\n\n        $abraMeta = PokemonMetaRegistry::getByPokemonId(PokemonId::ABRA);\n        $abra = new PokemonItem();\n        $abra->setPokemonId(PokemonId::ABRA);\n        $abraOnSteroids = clone $abra;\n        $abraOnSteroids->setCp(PHP_INT_MAX);\n\n        $noStardust = new Currency();\n        $noStardust->setAmount(0);\n        $muchStardust = new Currency();\n        $muchStardust->setAmount(PHP_INT_MAX);\n        $noCandy = new CandyItem();\n        $noCandy->setCandy(0);\n        $enoughCandy = new CandyItem();\n        $enoughCandy->setCandy($abraMeta->getCandyToEvolve() * 3);\n\n        yield [$this->buildLevelStardustCandyMockedPokemon($abraOnSteroids, 1, $muchStardust, $enoughCandy), false];\n\n        yield [$this->buildLevelStardustCandyMockedPokemon($abra, static::UPGRADE_TEST_LEVEL, $muchStardust, $noCandy), false];\n        yield [$this->buildLevelStardustCandyMockedPokemon($abra, static::UPGRADE_TEST_LEVEL, $noStardust, $enoughCandy), false];\n\n        yield [$this->buildLevelStardustCandyMockedPokemon($abra, static::UPGRADE_TEST_LEVEL, $muchStardust, $enoughCandy), true];\n    }\n}\n"
  }
]