From 26dca46471caea7465dc4419b7728028982aac77 Mon Sep 17 00:00:00 2001 From: mhsjlw Date: Thu, 16 Jun 2016 07:11:22 -0400 Subject: [PATCH] more encryption stuff, lots of progress --- examples/server.js | 2 +- jwt.js | 25 -------- package.json | 4 +- src/createServer.js | 147 +++++++++++++++++++++++++++++++++++--------- 4 files changed, 122 insertions(+), 56 deletions(-) delete mode 100644 jwt.js diff --git a/examples/server.js b/examples/server.js index 35ed57c..9773f2c 100644 --- a/examples/server.js +++ b/examples/server.js @@ -11,7 +11,7 @@ if(process.argv.length !=4) { var server = pmp.createServer({ host: process.argv[2], port: parseInt(process.argv[3]), - name: 'MCPE;Minecraft: PE Server;70 70;0.14.3;0;20' + name: 'MCPE;Minecraft: PE Server;81 81;0.15.0;0;20' }); server.on('connection', function(client) { diff --git a/jwt.js b/jwt.js deleted file mode 100644 index 7d14499..0000000 --- a/jwt.js +++ /dev/null @@ -1,25 +0,0 @@ -var jwt = require('jwt-simple'); -var example = { - "chain": { - "chain": [ - "eyJ4NXUiOiJNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRThFTGtpeHlMY3dsWnJ5VVFjdTFUdlBPbUkyQjd2WDgzbmRuV1JVYVhtNzR3RmZhNWZcL2x3UU5UZnJMVkhhMlBtZW5wR0k2SmhJTVVKYVdacmptTWo5ME5vS05GU05CdUtkbThyWWlYc2ZhejNLMzZ4XC8xVTI2SHBHMFp4S1wvVjFWIiwiYWxnIjoiRVMzODQifQ.eyJuYmYiOjE0NjA4OTYzMzcsInJhbmRvbU5vbmNlIjo3MzI2MDA4MDM2OTAzODU5NzM0LCJpc3MiOiJSZWFsbXNBdXRob3JpemF0aW9uIiwiZXhwIjoxNDYwOTgyNzk3LCJpYXQiOjE0NjA4OTYzOTcsImNlcnRpZmljYXRlQXV0aG9yaXR5Ijp0cnVlLCJpZGVudGl0eVB1YmxpY0tleSI6Ik1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFQlJ1MEd5VUFkYkZjd1wvUU1vNmFBTGFaZHJTeVNkZFwva1F2OXFHOHlHSWxnc0orVStNMVVpZWtjaDFPc3NHdXlFZW1oSWR1OUZWYklJanRWKzY4bXVkc0orSE1MdGYrMDJTYVk0elBtXC9iR3RURkRIUDBRK2FoUmhvVWRiNVptaFwvIn0.J9vCSKZOH6ZuO_rMv3Tlo0Z7nAnXI44rdlL4FyXcWfdTHG3HlHywos0WLWnMnlxP_Ex2co2M21CSyIhIFM6EvugemsuEZIQpz3WTAmUlaEoaNT7dgGFbqGUn9tr6S1MD", - "eyJ4NXUiOiJNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRUJSdTBHeVVBZGJGY3dcL1FNbzZhQUxhWmRyU3lTZGRcL2tRdjlxRzh5R0lsZ3NKK1UrTTFVaWVrY2gxT3NzR3V5RWVtaElkdTlGVmJJSWp0Vis2OG11ZHNKK0hNTHRmKzAyU2FZNHpQbVwvYkd0VEZESFAwUSthaFJob1VkYjVabWhcLyIsImFsZyI6IkVTMzg0In0.eyJuYmYiOjE0NjA4OTYzMzcsImV4dHJhRGF0YSI6eyJpZGVudGl0eSI6Ijk4YjBjYmNmLWU5MWUtMzAwNC05NjUyLWFlZDkyZjhlMjU2ZCIsImRpc3BsYXlOYW1lIjoieWF3a2F0IiwiWFVJRCI6IjI1MzU0Mzc2MTMzNTc1MzUifSwicmFuZG9tTm9uY2UiOi0zMzg4NzY3NzYzMDEyODY5NTg3LCJpc3MiOiJSZWFsbXNBdXRob3JpemF0aW9uIiwiZXhwIjoxNDYwOTgyNzk3LCJpYXQiOjE0NjA4OTYzOTcsImlkZW50aXR5UHVibGljS2V5IjoiTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVERUtuZXFFdmNxVXFxRk1NMUhNMUE0eldqSkMrSThZK2FLekc1ZGwrNndOT0hIUTRObUcyUEVYUkpZaHVqeW9kRkgrd08wZEVyNEdNMVdvYVdvZzh4c1lRNm1RSkFDMGVWcEJNOTZzcFVCMWVNTjU2K0J3bEo0SDNReDRUQXZBcyJ9.gmAdOsTXU68QIqWweaU9FBuSyhNHcGI2hslrP0AQtVqGHyfPIhm54aUesZSj9mLGIIJTx_I50wijDlsj_lFExb3W3UQV0BDWCsYNBoJ5Kb9AX5O11onqtGbNynCVufJB" - ] - }, - "clientData": "eyJhbGciOiJFUzM4NCIsIng1dSI6Ik1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFREVLbmVxRXZjcVVxcUZNTTFITTFBNHpXakpDK0k4WSthS3pHNWRsKzZ3Tk9ISFE0Tm1HMlBFWFJKWWh1anlvZEZIK3dPMGRFcjRHTTFXb2FXb2c4eHNZUTZtUUpBQzBlVnBCTTk2c3BVQjFlTU41NitCd2xKNEgzUXg0VEF2QXMifQo,.eyJDbGllbnRSYW5kb21JZCI6MTM2NTg2NDYwOCwiU2VydmVyQWRkcmVzcyI6IjE5Mi4xNjguMS41NjoxOTEzMiIsIlNraW5EYXRhIjoiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGxtVWYvNVpsSC8rV05QLy9sbVVmLzVabEgvK1dOUC8vbG1VZi81WTAvLzlpQU12L1lnREwvMklBeS85aUFNdi9ZZ0RMLzJJQXkvOWlBTXYvWWdETC9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBNVkwLy8rV1pSLy9salQvLzVabEgvK1daUi8vY2t6ei81WmxILytpZFRQL1lnREwvMklBeS82cUpYditxaVY3L3FvbGUvNnFKWHYvWWdETC8ySUF5L3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFPV1pSLy9ja3p6LzZKMU0vK1daUi8vbGpULy8zSk04LytXTlAvL2xtVWYvMklBeS82cUpYditjZTFEL25IdFEvNXg3VVArY2UxRC9xb2xlLzlpQU12OEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURsalQvLzNKTTgvK2lkVFAvbG1VZi81WmxILytXWlIvL2xqVC8vM0pNOC85aUFNditxaVY3L25IdFEvNXg3VVArY2UxRC9uSHRRLzZxSlh2L1lnREwvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTVZMC8vK1dOUC8vb25Vei81WTAvLytXWlIvL2xqVC8vNkoxTS85eVRQUC9meHFQL3FvbGUvNXg3VVArY2UxRC9uSHRRLzV4N1VQK3FpVjcvMklBeS93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT1daUi8vbGpULy81WmxILytXTlAvL2NrenovNVpsSC8raWRUUC9vblV6LzM4YWovNnFKWHYrY2UxRC9uSHRRLzV4N1VQK2NlMUQvcW9sZS85aUFNdjhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEY2t6ei81WTAvLytXTlAvL2xtVWYvNVpsSC8rV1pSLy9salQvLzZKMU0vOS9Hby8rcWlWNy9xb2xlLzZxSlh2K3FpVjcvcW9sZS82cUpYdi9ZZ0RML0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE2SjFNLytXWlIvL2xqVC8vNkoxTS8raWRUUC9salQvLzZKMU0vOXlUUFAvZnhxUC8zOGFqLzkvR28vL2Z4cVAvMzhhai85L0dvLy9meHFQLzM4YWovd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGxtVWYvNVkwLy8raWRUUC9sbVVmLzZKMU0vK2lkVFAvb25Vei81WTAvLytXWlIvL2xqVC8vNVpsSC8rV05QLy9salQvLzVabEgvK1dOUC8vbG1VZi81WmxILytXTlAvL2xtVWYvNVkwLy8rV1pSLy9salQvLzZKMU0vK1daUi8vbGpULy81WmxILytXTlAvL2xtVWYvNVkwLy8rV1pSLy9vblV6LzVZMC8vd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBNVkwLy8rV1pSLy9sbVVmLzVZMC8vK1daUi8vbGpULy81WTAvLytXWlIvL2xqVC8vNVpsSC8rV05QLy9sbVVmLzNKTTgvK1daUi8vbG1VZi81WTAvLytXWlIvL29uVXovNkoxTS8raWRUUC9salQvLzVabEgvK1dOUC8vbG1VZi82SjFNLytpZFRQL2xtVWYvNVkwLy8raWRUUC9vblV6LzVZMC8vK1daUi84QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFPaWRUUC9vblV6LzVZMC8vK1daUi8vbGpULy81WmxILytpZFRQL2xtVWYvNVpsSC8rV05QLy9sbVVmLzNKTTgvK3ZUcy8vcjA3UC81WmxILytXTlAvL29uVXovNVkwLy8rV05QLy9salQvLzZKMU0vK1daUi8vbGpULy82SjFNLytpZFRQL29uVXovNVkwLy8raWRUUC9sbVVmLzZKMU0vK1dOUC8vbG1VZi9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURsbVVmLzNKTTgvK1daUi8vbG1VZi82SjFNLzl5VFBQL2NrenovNVpsSC85eVRQUC9ja3p6LzNKTTgvK3ZUcy8veTJyci81TXVwLytUTHFmL2xtVWYvNVpsSC8rV1pSLy9ja3p6LzVabEgvK1dOUC8vb25Vei82SjFNLytXWlIvL2xqVC8vNkoxTS8rV05QLy9vblV6LzVabEgvK1dOUC8vbG1VZi81WTAvL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTNKTTgvK1daUi8vbG1VZi81WmxILzl5VFBQL3IwN1AvNjlPei85eVRQUC9reTZuLysvdjcveU5pSlAveTJyci84dDNDL3lOaUpQLzcrL3YvNU11cC85eVRQUC9salQvLzVabEgvK1daUi8vbG1VZi81WTAvLytXWlIvL2xqVC8vNVpsSC8rV05QLy9sbVVmLzVabEgvK2lkVFAvbG1VZi81WmxILytpZFRQOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTnlUUFAvbGpULy82SjFNLzl5VFBQL3IwN1AvOHQzQy8vTGF1di95MnJyLzd0YTIvKy9adS8veTJyci84dDNDLy9MYXV2L3kyNzMvN3RlNS8vTGF1di9yMDdQLzNKTTgvK1daUi8vbGpULy81WmxILytXWlIvL29uVXovNVkwLy8rV05QLy9vblV6LzVabEgvK1dOUC8vbGpULy82SjFNLytXWlIvL2xtVWYvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEbGpULy81WmxILytpZFRQL2xtVWYvNjlPei8vTGF1di95M2NMLzh0M0MvL0xhdXYveTNjTC84dHE2LysrN3NmL3Z1N0gvOHRxNi8vTGF1di9yMDdQLzh0M0MvK3ZUcy8vY2t6ei81WTAvLytXWlIvL2xqVC8vNVpsSC8raWRUUC9salQvLzVZMC8vK1dOUC8vbG1VZi82SjFNLytXWlIvL2xtVWYvNVkwLy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE1WmxILytXTlAvL2xtVWYvNjlPei8rdlRzLy95M2NMLzh0cTYvL0xhdXYveTJyci84dHE2Ly9MZHd2L3kycnIvOHRxNi8vTGR3di95M2NMLzh0cTYvK3ZUcy8vY2t6ei81WTAvLytXWlIvL2xtVWYvNVkwLy8rV1pSLy9salQvLzVabEgvK1dOUC8vb25Vei81WmxILytXWlIvL2NrenovNVkwLy8raWRUUDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJrUVN6L1pFRXMvMlJCTFA5a1FTei9LQ2dvL3lnb0tQOG9LQ2ovS0Nnby93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZXJWMy80YUhZZi9ZZ0RMLzJJQXkvOWlBTXYvWWdETC82SjFNLytXWlIvOW9SVEQvYUVVdy8yaEZNUDlvUlREL2FFVXcvMmhGTVA5b1JURC9hRVV3L3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFlcTkzLzNxdmQvOTZyM2YvMkxxVS8rdlRzLy9ZdXBUL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVpFRXMvMlJCTFA5a1FTei9aRUVzL3lnb0tQOG9LQ2ovS0Nnby95Z29LUDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFIcTFkLytHaDJIL2hvZGgvNGFIWWYrR2gySC8ySUF5LytXWlIvL29uVXovYUVVdy8yaEZNUDlvUlREL2FFVXcvMmhGTVA5b1JURC9hRVV3LzJoRk1QOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUhxdmQvOTZ0WGYvZXE5My85aTZsUC9yMDdQLzJMcVUvd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR1JCTFA5a1FTei9aRUVzLzJSQkxQOG9LQ2ovS0Nnby95Z29LUDhvS0NqL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUI2dFhmL2hvZGgvNGFIWWYvZnhxUC8zOGFqLzRhSFlmL2xtVWYvNkoxTS8yaEZNUDlvUlREL2FFVXcvMmhGTVA5b1JURC9hRVV3LzJoRk1QOW9SVEQvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQjZyM2YvZXJWMy8zcXZkLy9yMDdQLzJMcVUvK3ZUcy84QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCa1FTei9aRUVzLzJSQkxQOWtRU3ovS0Nnby95Z29LUDhvS0NqL0tDZ28vd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWVyVjMvNGFIWWYvcjA3UC84dHE2Ly9MYXV2L2xtVWYvNVpsSC8rV05QLzlvUlREL2FFVXcvMmhGTVA5b1JURC9hRVV3LzJoRk1QOW9SVEQvYUVVdy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZXE5My8zcXZkLzk2cjNmLzY5T3ovOWk2bFAvcjA3UC9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUI2cjNmL2VyVjMvM3ExZC85NnIzZi9hRVV3LzNsVlBmK0FXa0QvYlVvei8yaEZNUDlrUVN6L2FFVXcvMlJCTFArTXZvci9qTDZLLzMyeWV2OTlzbnIvZXJWMy8zcTFkLzk2dFhmL2VxOTMvNHkraXYrR2gySC82OU96Ly9MYXV2L3kycnIvNkoxTS8raWRUUC9salQvLzZKMU0vK2lkVFAvbG1VZi82SjFNLytpZFRQL29uVXovNVpsSC8rV05QLy9sbVVmLzVabEgvNEcxZi8rTHVvai9lcTkzLzNxMWQvOTZyM2YvZXE5My80eStpditMdW9qL2ZiSjYvM3F2ZC85NnRYZi9lclYzLzNxdmQvK0x1b2ovakw2Sy80dTZpUDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVpFRXMvM3F2ZC85NnIzZi9hRVV3LzNKT052OTVWVDMvZVZVOS8yaEZNUDlrUVN6L2FFVXcvMmhGTVA5a1FTei9iMHcxLzRCYVFQK0FXa0QvY2s0Mi8zcTFkLzk2dFhmL2VxOTMvM3F2ZC8rTXZvci9pb3RtLyt2VHMvL3kycnIvOHRxNi8vTGF1di9sbVVmLzZKMU0vK1daUi8vbG1VZi9lcTkzLzNxdmQvL2xtVWYvNVkwLy8rV05QLy9sbVVmL2diVi8vNEcxZi8rTHVvai9pN3FJLzNxdmQvOTZyM2YvZXE5My8zcTFkLytMdW9qL2ZiSjYvNHkraXY5NnRYZi9lclYzLzNxdmQvOTZyM2YvaTdxSS80dTZpUCtNdm9yL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR1JCTFA5b1JURC9aRUVzLzJoRk1QOXZURFgvZ0ZwQS8yaEZNUDl5VGpiL1pFRXMvMmhGTVA5a1FTei9hRVV3LzI5TU5mK0FXa0QvZVZVOS8zSk9Odjk2cjNmL2VyVjMvM3F2ZC85NnIzZi9qTDZLLzMyeWV2K01qV2ovNjlPei8rdlRzLy9salQvLzVabEgvK2lkVFA5NnIzZi9lcTkzLzNxdmQvOTZ0WGYvZ2JWLy80RzFmLytCdFgvL2diVi8vNHkraXYrTHVvai9pN3FJLzR1NmlQOTZyM2YvZXJWMy8zcTFkLzk2dFhmL2k3cUkvNHkraXYrTHVvai9lcTkzLzNxMWQvOTZ0WGYvZXE5My80eStpditMdW9qL2pMNksvd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCa1FTei9aRUVzLzJSQkxQOW9SVEQvYUVVdy8yaEZNUDk1VlQzL2NrNDIvMlJCTFA5b1JURC9aRUVzLzJoRk1QOXZURFgvZ0ZwQS8zbFZQZjl5VGpiL2VxOTMvM3ExZC85NnIzZi9lcTkzLzNldmRmK012b3Ivakw2Sy80eU5hUCtNaldqLzVabEgvK2lkVFA5OXNuci9lclYzLzNxMWQvOTZyM2YvZXJWMy80eStpditMdW9qL2pMNksvNHU2aVArTHVvai9pN3FJLzMyeWV2K0x1b2ovZ0lKYS80ZUpZditIaVdML2dJSmEvNGFIWWYrUGtHdi9ob2RoLzRDQ1d2K0hpV0wvaDRsaS80Q0NXditHaDJIL2o1QnIvNGFIWWY4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFaRUVzLzJSQkxQOWtRU3ovWkVFcy8yOU1OZitHWGtiL2hsNUcvMjlNTmY5a1FTei9aRUVzLzJSQkxQOWtRU3ovYUVVdy8yaEZNUDlvUlREL2FFVXcvM3F2ZC85NnRYZi9lclYzLzNxMWQvOTNyM1gvakw2Sy80eStpdjk5c25yL2pMNksvK2lkVFA5OXRIci9pN3FJLzNxdmQvOTZyM2YvZXE5My8zcTFkLytNdm9yL2k3cUkvNHkraXYrTHVvai9pN3FJLzR5K2l2K012b3Ivakw2Sy8rVEpxUC9reWFqLzVNbW8vK1RKcVAvcjA3UC82OU96Lyt2VHMvL2t5YWovNU1tby8rVEpxUC9reWFqLzY5T3ovK3ZUcy8vcjA3UC9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQURzN08vODdPenYvT3pzNy8yUkJMUDlvUlREL2VGUTgvM2hVUFA5b1JURC9aRUVzL3pzN08vODdPenYvT3pzNy8wWkdSdjlHUmtiL1JrWkcvMFpHUnY5NnIzZi9lclYzLzNxdmQvOTZ0WGYvZmJKNi80eStpditMdW9qL2pMNksvNHU2aVArTXZvci9pN3FJLzR1NmlQOTZyM2YvZXE5My8zcXZkLzk2cjNmL2k3cUkvMzJ5ZXYrTXZvci9pN3FJLzR1NmlQK012b3IvaTdxSS80eStpdi9reWFqLzVNbW8vK3ZUcy8vcjA3UC84dHE2Ly9MYXV2L3IwN1AvNjlPei8rdlRzLy9reWFqLzY5T3ovL0xhdXYvcjA3UC84dHE2L3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkpTVW4vU1VsSi8wbEpTZjg3T3p2L1dscGEvMTFkWGY5ZFhWMy9XbHBhL3pzN08vOUpTVW4vU1VsSi8wbEpTZjlOVFUzL1YxZFgvMWRYVi85TlRVMy9lcTkzLzNxMWQvOTZyM2YvZXJWMy80eStpditNdm9yL2ZiSjYvNHkraXYrTHVvai9qTDZLLzR1NmlQK012b3IvZXE5My8zcTFkLzk2cjNmL2VxOTMvNHU2aVArTXZvci9qTDZLLzR1NmlQK012b3IvZmJKNi80eStpditNdm9yLzVNbW8vK3ZUcy8vcjA3UC82OU96Ly9MYXV2L3kycnIvNmRDdi8rdlRzLy9zMUxqLzVNdXEvK3pVdVAveTJyci84dHE2Ly9MZHd2OEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBU1VsSi8wbEpTZjlKU1VuL1NVbEovMkZoWWY5cmEydi9hMnRyLzJGaFlmOUpTVW4vU1VsSi8wbEpTZjlKU1VuL1RVMU4vMWRYVi85WFYxZi9UVTFOLzNxMWQvOTZ0WGYvZXJWMy8zcTFkLytNdm9yL2pMNksvM2V2ZGYrTXZvci9mYko2LzR5K2l2K012b3Ivakw2Sy8zcXZkLzk2dFhmL2VyVjMvM3ExZC8rTXZvci9qTDZLLzR5K2l2OTlzbnIvakw2Sy8zMnllditNdm9yL2pMNksvK3pVdVAvcjA3UC83TlM0Lyt2VHMvL3AwYlAvOHRxNi8vTGF1di92MmIzLzdOUzQvK1hMcmYvdjJyLy84dHE2Ly9MYXV2L3AwYlAvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFbEpTZjlKU1VuL096czcvMGxKU2Y5aFlXSC9hMnRyLzJ0cmEvOWhZV0gvU1VsSi96czdPLzlKU1VuL1NVbEovMDFOVGY5WFYxZi9WMWRYLzAxTlRmOFlPQmIvR2o4Wi94ZzRGdjhhUHhuL1Q0Qk0vNHkraXY5M3IzWC9qTDZLLzNldmRmK012b3Ivakw2Sy8wK0FUUDhhUHhuL0dqOFoveGc0RnY4YVB4bi9UNEJNLzR5K2l2K012b3IvZDdCMC80eStpdjkzcjNYL2pMNksvMCtBVFAvczFMai83TlM0Lyt6VXVQL3MxTGovNmRHei8vTGR3di95M2NMLzdOUzQvKy9hdi8vczFMai83TlM0Ly9MZHd2L3kzY0wvOHQzQy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJOVFUzL1RVMU4vMUpTVXY4N096di9XbHBhLzJOalkvOWpZMlAvV2xwYS96czdPLzlTVWxML1RVMU4vMDFOVGY5S1Nrci9VRkJRLzFCUVVQOUtTa3IvZXJWMy8zcXZkLzk2dFhmL2VxOTMveGc0RnY4WU9CYi9HRGdXL3hvL0dmOGFQeG4vR0RnVy94ZzRGdjhhUHhuL2VxOTMvM3F2ZC85NnRYZi9lclYzL3hvL0dmOFlPQmIvR0RnVy94by9HZjhhUHhuL0dEZ1cveG8vR2Y4YVB4bi83TlM0Lyt6VXVQL3Yyci8vNzlxLy8vTGR3di95M2NMLzh0L0kvK3pVdVAvdjJyLy83TlM0Lyt6VXVQL3kzOGovOHQzQy8rclV1UDhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVRVMU4vMDFOVGY5U1VsTC9YRnhjLzJGaFlmOXJhMnYvYTJ0ci8yRmhZZjljWEZ6L1VsSlMvMDFOVGY5TlRVMy9Ta3BLLzFCUVVQOVFVRkQvU2twSy8zcTFkLzk2cjNmL2VyVjMvM3F2ZC8rTHVvai9qTDZLLzR1NmlQK012b3IvZmJKNi80dTZpUCtMdW9qL2pMNksvM3F2ZC85NnIzZi9lclYzLzNxdmQvK0x1b2ovakw2Sy80eStpdjk5c25yL2pMNksvNHU2aVArTHVvai9qTDZLLysvYXYvL3Yyci8vN05TNC8rL2F2Ly95MzhqLzh0L0kvL0xkd3YvdjJyLy83OXEvLysvYXYvL3MxTGovOHQvSS8vTGR3di95M2NML0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDgvUC84L1B6Ly9QejgvLzF4Y1hQOWpZMlAvY0hCdy8zQndjUDlqWTJQL1hGeGMvejgvUC84L1B6Ly9QejgvLzBoSVNQOU1URXovVEV4TS8waElTUDk2cjNmL2VyVjMvM3ExZC85NnIzZi9pN3FJLzJoRk1QOTFVRGovZFZBNC8zVlFPUDkxVURqL2FFVXcvNHU2aVA5NnRYZi9lcTkzLzNxMWQvOTZyM2YvaTdxSS80eStpditNdm9yL2pMNksvNHkraXYrTXZvci9qTDZLLzR1NmlQL3MxTGovNzltOS8relV1UC92MnIvLzh0L0kvL0xkd3YveTNjTC83TlM0Lyt6VXVQL3Yyci8vN05TNC8vTGZ5UC95M2NMLzh0M0Mvd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCa1FTei9aRUVzLzJSQkxQOWtRU3ovS0Nnby95Z29LUDhvS0NqL0tDZ28vd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTZKMU0vM3ExZC85NnIzZi8yTHFVLyt2VHMvL1l1cFQvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFaRUVzLzJSQkxQOWtRU3ovWkVFcy95Z29LUDhvS0NqL0tDZ28veWdvS1A4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT1daUi8vb25Vei9lcTkzLzlpNmxQL3IwN1AvMkxxVS93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdSQkxQOWtRU3ovWkVFcy8yUkJMUDhvS0NqL0tDZ28veWdvS1A4b0tDai9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEbG1VZi81WTAvLzNxdmQvL3IwN1AvMkxxVS8rdlRzLzhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQmtRU3ovWkVFcy8yUkJMUDlrUVN6L0tDZ28veWdvS1A4b0tDai9LQ2dvL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE1WTAvLzNxMWQvOTZyM2YvNjlPei85aTZsUC9yMDdQL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCb1JURC9aRUVzLzJoRk1QOWtRU3ovYlVvei80QmFRUDk1VlQzL2FFVXcvMmhGTVA5a1FTei9hRVV3LzJSQkxQOXZURFgvZmJKNi80eStpditNdm9yL2VxOTMvM3ExZC85NnIzZi81WmxILytXTlAvK0x1b2ovaTdxSS8zcXZkLzk2cjNmL2VxOTMvM3F2ZC8rTHVvai9qTDZLLytXTlAvOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFaRUVzLzJoRk1QOWtRU3ovYUVVdy8yaEZNUDk1VlQzL2VWVTkvM0pPTnY5a1FTei9hRVV3LzJoRk1QOWtRU3ovYjB3MS80QmFRUCtBV2tEL2NrNDIvM3F2ZC85NnIzZi9lcTkzLytpZFRQL2xtVWYvaTdxSS80dTZpUDk2cjNmL2VyVjMvM3F2ZC85NnIzZi9pN3FJLzR1NmlQK012b3IvQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdSQkxQOW9SVEQvWkVFcy8yaEZNUDl5VGpiL2FFVXcvNEJhUVA5dlREWC9aRUVzLzJoRk1QOWtRU3ovYUVVdy8yOU1OZitBV2tEL2VWVTkvM0pPTnY5NnIzZi9lclYzLzNxMWQvOTZ0WGYvaTdxSS80eStpdjk5c25yL2VxOTMvM3ExZC85NnRYZi9lcTkzLzR5K2l2K0x1b2ovakw2Sy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQmtRU3ovWkVFcy8yUkJMUDlvUlREL2NrNDIvM2xWUGY5b1JURC9hRVV3LzJSQkxQOW9SVEQvWkVFcy8yaEZNUDl2VERYL2dGcEEvM2xWUGY5eVRqYi9nSUphLzRlSll2K0hpV0wvZ0lKYS80YUhZZitQa0d2L2hvZGgvNENDV3YrSGlXTC9oNGxpLzRDQ1d2K0doMkgvajVCci80YUhZZjhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWkVFcy8yUkJMUDlrUVN6L1pFRXMvMjlNTmYrR1hrYi9obDVHLzI5TU5mOWtRU3ovWkVFcy8yUkJMUDlrUVN6L2FFVXcvMmhGTVA5b1JURC9hRVV3LytUSnFQL2t5YWovNU1tby8rVEpxUC9yMDdQLzY5T3ovK3ZUcy8va3lhai81TW1vLytUSnFQL2t5YWovNjlPei8rdlRzLy9yMDdQL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEczdPLzg3T3p2L096czcvMlJCTFA5b1JURC9lRlE4LzNoVVBQOW9SVEQvWkVFcy96czdPLzg3T3p2L096czcvMFpHUnY5R1JrYi9Sa1pHLzBaR1J2L2t5YWovNU1tby8rdlRzLy9yMDdQLzh0cTYvL0xhdXYvcjA3UC82OU96Lyt2VHMvL2t5YWovNjlPei8vTGF1di9yMDdQLzh0cTYvd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJKU1VuL1NVbEovMGxKU2Y4N096di9XbHBhLzExZFhmOWRYVjMvV2xwYS96czdPLzlKU1VuL1NVbEovMGxKU2Y5TlRVMy9WMWRYLzFkWFYvOU5UVTMvNU1tby8rdlRzLy9yMDdQLzY5T3ovL0xhdXYveTJyci84dHE2Lyt2VHMvL3MxTGovNjlPei8relV1UC95MnJyLzh0cTYvL0xkd3Y4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVNVbEovMGxKU2Y5SlNVbi9TVWxKLzJGaFlmOXJhMnYvYTJ0ci8yRmhZZjlKU1VuL1NVbEovMGxKU2Y5SlNVbi9UVTFOLzFkWFYvOVhWMWYvVFUxTi8relV1UC9yMDdQLzdOUzQvKy9admYvcDBiUC84dHE2Ly9MYXV2L3IwN1AvN05TNC8rWExyZi9zMUxqLzh0cTYvL0xhdXYveTNjTC9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRWxKU2Y5SlNVbi9PenM3LzBsSlNmOWhZV0gvYTJ0ci8ydHJhLzloWVdIL1NVbEovenM3Ty85SlNVbi9TVWxKLzAxTlRmOVhWMWYvVjFkWC8wMU5UZi9zMUxqLzdOUzQvK3pVdVAvczFMai82ZEd6Ly9MZHd2L3kzY0wvN05TNC8relV1UC9zMUxqLzdOUzQvK25Scy8veTNjTC84dDNDL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCTlRVMy9UVTFOLzFKU1V2ODdPenYvV2xwYS8yTmpZLzlqWTJQL1dscGEvenM3Ty85U1VsTC9UVTFOLzAxTlRmOUtTa3IvVUZCUS8xQlFVUDlLU2tyLzdOUzQvK3pVdVAvdjJyLy83TlM0Ly9MZHd2L3kzY0wvNmRHei8relV1UC9zMUxqLzc5cS8vK3pVdVAveTNjTC84dDNDLy9MZHd2OEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFUVTFOLzAxTlRmOVNVbEwvWEZ4Yy8yRmhZZjlyYTJ2L2EydHIvMkZoWWY5Y1hGei9VbEpTLzAxTlRmOU5UVTMvU2twSy8xQlFVUDlRVUZEL1NrcEsvKy9hdi8vczFMai83OXEvLyt6VXVQL3kzY0wvOHQvSS8vTGR3di92MnIvLzdOUzQvK3pVdVAvdjJyLy84dDNDLy9MZnlQL3kzOGovQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQ4L1AvOC9Qei8vUHo4Ly8xeGNYUDlqWTJQL2NIQncvM0J3Y1A5alkyUC9YRnhjL3o4L1AvOC9Qei8vUHo4Ly8waElTUDlNVEV6L1RFeE0vMGhJU1AvdjJyLy82OU96Lyt6VXVQL3MxTGovOHQvSS8vTGR3di95M2NMLzdOUzQvKy9hdi8vczFMai83TlM0Ly9MZHd2L3kzOGovOHQvSS93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPT0iLCJTa2luSWQiOiJTdGFuZGFyZF9BbGV4In0K.gN2HJV9_WW1hvVj-gGKGJsCGEafIiGnTFgKRUKF2CqhiQk4dgB1dHFnZOglDN4VtW397jIPgs92ppMkyfZf8-09XQ87_o_eC1nvuscmBXt6Bn2UZQP_VYFqh_eCAXvCP" -} - - -var clientData = example.clientData; -var chain1 = example.chain.chain[0]; -var chain2 = example.chain.chain[1]; -var secret = 'MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8ELkixyLcwlZryUQcu1TvPOmI2B7vX83ndnWRUaXm74wFfa5f/lwQNTfrLVHa2PmenpGI6JhIMUJaWZrjmMj90NoKNFSNBuKdm8rYiXsfaz3K36x/1U26HpG0ZxK/V1V'; - -var decode1 = jwt.decode(chain1, secret, 'ES384'); -var nextKey1 = decode1.identityPublicKey; - -var decode2 = jwt.decode(chain2, nextKey1, 'ES384'); -var nextKey2 = decode2.identityPublicKey; - -var clientDecode = jwt.decode(clientData, nextKey1, 'ES384'); -console.log(clientDecode); diff --git a/package.json b/package.json index 1d4c196..8835beb 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,12 @@ ], "license": "MIT", "dependencies": { + "asn1": "^0.2.3", + "bn.js": "^4.11.4", "jwt-simple": "^0.5.0", "prismarine-nbt": "^1.0.0", "protodef": "^1.2.0", - "raknet": "^1.7.3", + "raknet": "^1.7.4", "uuid-1345": "^0.99.6" }, "devDependencies": {}, diff --git a/src/createServer.js b/src/createServer.js index 6b8d5b8..845da65 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -4,14 +4,33 @@ const zlib = require('zlib'); const ProtoDef = require('protodef').ProtoDef; const jwt = require('jwt-simple'); const crypto = require('crypto'); +const Ber = require('asn1').Ber; +// const BN = require('bn.js'); + const batchProto = new ProtoDef(); batchProto.addTypes(require("./datatypes/minecraft")); -batchProto.addType("insideBatch",["endOfArray",{"type":["buffer",{"countType":"i32"}]}]); +batchProto.addType("insideBatch", ["endOfArray", { + "type": ["buffer", { + "countType": "i32" + }] +}]); const dataProto = new ProtoDef(); -dataProto.addType("data_chain", [ "container", [ { "name":"chain", "type":[ "pstring", { "countType":"li32" } ] }, { "name":"clientData", "type":[ "pstring", { "countType":"li32" } ] } ] ]); +dataProto.addType("data_chain", ["container", [{ + "name": "chain", + "type": ["pstring", { + "countType": "li32" + }] +}, { + "name": "clientData", + "type": ["pstring", { + "countType": "li32" + }] +}]]); -const secret = 'MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8ELkixyLcwlZryUQcu1TvPOmI2B7vX83ndnWRUaXm74wFfa5f/lwQNTfrLVHa2PmenpGI6JhIMUJaWZrjmMj90NoKNFSNBuKdm8rYiXsfaz3K36x/1U26HpG0ZxK/V1V'; +const PUBLIC_KEY = 'MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8ELkixyLcwlZryUQcu1TvPOmI2B7vX83ndnWRUaXm74wFfa5f/lwQNTfrLVHa2PmenpGI6JhIMUJaWZrjmMj90NoKNFSNBuKdm8rYiXsfaz3K36x/1U26HpG0ZxK/V1V'; +var encryptionEnabled = false; +var sendCounter = 0; function createServer(options) { options = options || {}; @@ -22,8 +41,8 @@ function createServer(options) { 19132; var host = options.host || '0.0.0.0'; - options.customPackets=require("../data/protocol"); - options.customTypes=require("./datatypes/minecraft"); + options.customPackets = require("../data/protocol"); + options.customTypes = require("./datatypes/minecraft"); var server = raknet.createServer(options); server.name = options.name || "Minecraft Server"; @@ -31,8 +50,8 @@ function createServer(options) { server.maxPlayers = options['max-players'] || 20; server.playerCount = 0; - server.on("connection", function (client) { - client.on("mcpe",packet => client.emit(packet.name,packet.params)); + server.on("connection", function(client) { + client.on("mcpe", packet => client.emit(packet.name, packet.params)); client.on("game_login", packet => { var body = packet.body; @@ -44,7 +63,7 @@ function createServer(options) { var chain1 = parsed.data.chain.chain[0]; var chain2 = parsed.data.chain.chain[1].replace('\n', ''); - var decode1 = jwt.decode(chain1, secret, 'ES384'); + var decode1 = jwt.decode(chain1, PUBLIC_KEY, 'ES384'); var nextKey1 = decode1.identityPublicKey; var decode2 = jwt.decode(chain2, nextKey1, 'ES384'); @@ -57,41 +76,111 @@ function createServer(options) { client.identity = decode2.extraData.identity; client.displayName = decode2.extraData.displayName; client.XUID = decode2.extraData.XUID; - client.emit('login', {displayName: client.displayName, randomId: client.randomId, skinData: client.skinData, skinId: client.skinId, identity: client.identity, XUID: client.XUID}) - client.ecdh = crypto.createECDH('secp192k1'); - // console.log(nextKey2); - // client.secret = client.ecdh.computeSecret(nextKey2, 'base64'); - // console.log(client.edch.getPublicKey('base64')); + var reader = new Ber.Reader(new Buffer(nextKey2, "base64")); + reader.readSequence(); + reader.readSequence(); + reader.readOID(); + reader.readOID(); + var pubKey = new Buffer(reader.readString(Ber.BitString, true)).slice(1); + var ec = crypto.createECDH('secp384r1'); + ec.generateKeys(); + client.sharedSecret = ec.computeSecret(pubKey); + + client.secretKeyBytes = crypto.createHash('sha256').update(client.sharedSecret + "SO SECRET VERY SECURE").digest('binary'); + // console.log(client.secretKeyBytes.length); => 32 client.writeMCPE('server_to_client_handshake', { - publicKey: client.edch.getPublicKey('base64'), - serverToken: "SO SECRET VERY SECURE" + publicKey: ec.getPublicKey('base64'), + serverToken: "SO SECRET VERY SECURE" // obviously, this is super secure (it's not, change it) + }); + + encryptionEnabled = true; + customPackets['types']['encapsulated_packet'][1][1]['type'][1]['fields']['mcpe']='restBuffer'; client.encapsulatedPacketParser.proto.addTypes(merge(require('raknet').protocol,customPackets).types); + + client.emit('login', { + displayName: client.displayName, + randomId: client.randomId, + skinData: client.skinData, + skinId: client.skinId, + identity: client.identity, + XUID: client.XUID }); }); - client.writeMCPE = (name,packet) => { - client.writeEncapsulated("mcpe",{ - name:name, - params:packet - }); + client.writeMCPE = (name, packet) => { + if (!encryptionEnabled) { + client.writeEncapsulated("mcpe", { + name: name, + params: packet + }); + } else { + sendCounter += 1; + // sendCounter.add(1); + // client.writeEncapsulated("mcpe", { + // name: name, + // params: packet + // }); + } }; - client.writeBatch=function(packets) { - const payload=zlib.deflateSync(batchProto.createPacketBuffer("insideBatch", - packets.map(packet => - client.encapsulatedPacketSerializer.createPacketBuffer(packet).slice(1)))); - client.writeMCPE("batch",{ - payload:payload - }); + + client.writeBatch = function(packets) { + if (!encryptionEnabled) { + const payload = zlib.deflateSync(batchProto.createPacketBuffer("insideBatch", + packets.map(packet => + client.encapsulatedPacketSerializer.createPacketBuffer(packet).slice(1)))); + + client.writeMCPE("batch", { + payload: payload + }); + } else { + sendCounter += 1; + // sendCounter.add(1); + // const payload = zlib.deflateSync(batchProto.createPacketBuffer("insideBatch", + // packets.map(packet => + // client.encapsulatedPacketSerializer.createPacketBuffer(packet).slice(1)))); + // + // client.writeMCPE("batch", { + // payload: payload + // }); + } }; client.on('batch', function(packet) { var buf = zlib.inflateSync(packet.payload); - var packets=batchProto.parsePacketBuffer("insideBatch",buf).data; - packets.forEach(packet => client.readEncapsulatedPacket(Buffer.concat([new Buffer([0xfe]),packet]))); + var packets = batchProto.parsePacketBuffer("insideBatch", buf).data; + if (!encryptionEnabled) { + packets.forEach(packet => client.readEncapsulatedPacket(Buffer.concat([new Buffer([0xfe]), packet]))); + } else { + sendCounter += 1; + // sendCounter.add(1); + // packets.forEach(packet => client.readEncapsulatedPacket(Buffer.concat([new Buffer([0xfe]),packet]))); + } }); }); return server; } module.exports = createServer; + +// http://stackoverflow.com/questions/19236327/nodejs-sha256-password-encryption +var AES = {}; + +AES.decrypt = function(cryptkey, iv, encryptdata) { + encryptdata = new Buffer(encryptdata, 'base64').toString('binary'); + + var decipher = crypto.createDecipheriv('aes-256-cbc', cryptkey, iv), + decoded = decipher.update(encryptdata, 'binary', 'utf8'); + + decoded += decipher.final('utf8'); + return decoded; +} + +AES.encrypt = function(cryptkey, iv, cleardata) { + var encipher = crypto.createCipheriv('aes-256-cbc', cryptkey, iv), + encryptdata = encipher.update(cleardata, 'utf8', 'binary'); + + encryptdata += encipher.final('binary'); + encode_encryptdata = new Buffer(encryptdata, 'binary').toString('base64'); + return encode_encryptdata; +}