diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java b/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java
index 6d26805..e979f0c 100644
--- a/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java
@@ -6,6 +6,8 @@ import com.alterdekim.hearthhack.component.TcpConnection;
 import com.alterdekim.hearthhack.util.*;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.Optional;
@@ -23,7 +25,11 @@ public class GameUtilitiesProcessor extends Processor {
                 .stream()
                 .filter(a -> a.hasName() && a.getName().equals("p"))
                 .findFirst();
-        if( !at.isPresent() ) return null;
+        Optional<Protocol.Attribute> at1 = request.getAttributeList()
+                .stream()
+                .filter(a -> a.hasName() && a.getName().equals("r"))
+                .findFirst();
+        if(at.isEmpty()) return null;
         byte[] b = at.get().getValue().getBlobValue().toByteArray();
         ClientRequestBody requestBody = null;
         try {
@@ -31,6 +37,7 @@ public class GameUtilitiesProcessor extends Processor {
         } catch (InvalidProtocolBufferException e) {
             log.error(e.getMessage());
         }
+        if(at1.isPresent() && requestBody != null) requestBody.setRoute(at1.get().getValue().getIntValue());
         return requestBody;
     }
 
@@ -39,20 +46,14 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void processProfileProgress( int token, TcpConnection conn ) throws Exception {
-        // ProfileProgress
-        byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702");
-        Protocol.Header header = Processor.generateResponse(b.length, token, 0, 0);
-        conn.send(new BattleNetPacket(header, b));
-
-        Protocol.GenericResponse gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(201)
-                .setRequestSubId(11)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
+        Protocol.ProfileProgress profileProgress = Protocol.ProfileProgress.newBuilder()
+                .setProgress(6)
+                .setBestForge(0)
                 .build();
 
-        Protocol.Notification n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
+        Protocol.Notification n = generateNotification(233, profileProgress.toByteString(), profileProgress.getSerializedSize());
 
-        header = Protocol.Header.newBuilder()
+        Protocol.Header header = Protocol.Header.newBuilder()
                 .setServiceId(4)
                 .setMethodId(1)
                 .setToken(conn.nextToken())
@@ -62,21 +63,24 @@ public class GameUtilitiesProcessor extends Processor {
                 .build();
 
         conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
 
-        Protocol.ProfileProgress profileProgress = Protocol.ProfileProgress.newBuilder()
-                .setProgress(6)
-                .setBestForge(0)
+    private void processAvailableFeatures( TcpConnection conn ) throws Exception {
+        log.info("Guardian");
+        Protocol.GuardianVars guardianVars = Protocol.GuardianVars.newBuilder()
+                .setShowUserUi(1)
+                .setClientOptionsUpdateIntervalSeconds(300)
                 .build();
 
-        n = generateNotification(233, profileProgress.toByteString(), profileProgress.getSerializedSize());
+        Protocol.Notification n = generateNotification(264, guardianVars.toByteString(), guardianVars.getSerializedSize());
 
-        header = Protocol.Header.newBuilder()
+        Protocol.Header header = Protocol.Header.newBuilder()
                 .setServiceId(4)
                 .setMethodId(1)
                 .setToken(conn.nextToken())
+                .setStatus(0)
                 .setObjectId(0)
                 .setSize(n.getSerializedSize())
-                .setStatus(0)
                 .build();
 
         conn.send(new BattleNetPacket(header, n.toByteArray()));
@@ -106,85 +110,6 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void processDeckList(int token, TcpConnection conn) throws Exception {
-        byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702");
-        Protocol.Header header = Processor.generateResponse(b.length, token, 0, 0);
-        conn.send(new BattleNetPacket(header, b));
-
-        Protocol.GenericResponse gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(237)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
-                .build();
-
-        Protocol.Notification n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
-        gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(201)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
-                .setRequestSubId(2)
-                .build();
-
-        n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
-        gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(201)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
-                .setRequestSubId(3)
-                .build();
-
-        n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
-        gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(201)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
-                .setRequestSubId(15)
-                .build();
-
-        n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
         Protocol.DeckList deckList = Protocol.DeckList.newBuilder()
                 .addDecks(Protocol.DeckInfo.newBuilder()
                         .setId(794851023L)
@@ -238,9 +163,9 @@ public class GameUtilitiesProcessor extends Processor {
                         .setSourceType(Protocol.DeckSourceType.DECK_SOURCE_TYPE_UNKNOWN))
                 .build();
 
-        n = generateNotification(202, deckList.toByteString(), deckList.getSerializedSize());
+        Protocol.Notification n = generateNotification(202, deckList.toByteString(), deckList.getSerializedSize());
 
-        header = Protocol.Header.newBuilder()
+        Protocol.Header header = Protocol.Header.newBuilder()
                 .setServiceId(4)
                 .setMethodId(1)
                 .setToken(conn.nextToken())
@@ -253,72 +178,11 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void processBoosters(int token, TcpConnection conn) throws Exception {
-        byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702");
-        Protocol.Header header = Processor.generateResponse(b.length, token, 0, 0);
-        conn.send(new BattleNetPacket(header, b));
-
-        Protocol.GenericResponse gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(201)
-                .setRequestSubId(17)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
-                .build();
-
-        Protocol.Notification n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
-        gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(201)
-                .setRequestSubId(14)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
-                .build();
-
-        n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
-        gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(201)
-                .setRequestSubId(6)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
-                .build();
-
-        n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
         //Protocol.BoosterList boosterList = Protocol.BoosterList.newBuilder().build();
 
-        n = generateEmptyNotification(224);
+        Protocol.Notification n = generateEmptyNotification(224);
 
-        header = Protocol.Header.newBuilder()
+        Protocol.Header header = Protocol.Header.newBuilder()
                 .setServiceId(4)
                 .setMethodId(1)
                 .setToken(conn.nextToken())
@@ -947,6 +811,7 @@ public class GameUtilitiesProcessor extends Processor {
                 case CARD_BACKS -> processCardBacks(conn);
                 case ACCOUNT_LICENSES -> processAccountLicensesInfo(conn);
                 case NOTICES -> processProfileNotices(conn);
+                case FEATURES -> processAvailableFeatures(conn);
                 default -> log.warn("Unknown generic request: {}", req);
             }
         } catch (Exception e) {
@@ -955,30 +820,45 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void parseRequestNetCacheObjectList(int token, ClientRequestBody body, TcpConnection conn) throws InvalidProtocolBufferException {
-        log.info("parseRequestNetCacheObjectList");
         Protocol.GenericRequestList genericRequestList = Protocol.GenericRequestList.parseFrom(body.getBody());
         genericRequestList.getRequestsList().forEach(gr -> this.parseGenericRequest(token, gr, conn));
     }
 
-    private void parseSubscriptionRequest(BattleNetPacket packet, TcpConnection conn) throws Exception {
-        log.info("parseSubscriptionRequest: got");
-        Protocol.Header header = Processor.generateResponse(37, packet.getHeader().getToken(), 0, 0);
-        conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318BB020A180A0570726F746F120F320D084918AC0220002800300F4078")));
+    private void parseSubscriptionRequest(ClientRequestBody body, int token, TcpConnection conn) throws Exception {
+        //body.getRoute()
+        Protocol.UtilSubscribeResponse response = Protocol.UtilSubscribeResponse.newBuilder()
+                .setRoute((int) (Math.random() * 100d))
+                .setKeepAliveSecs(300)
+                .setMaxResubscribeAttempts(0)
+                .setPendingResponseTimeout(0)
+                .setPendingSubscribeTimeout(15)
+                .setRequestMaxWaitSecs(120)
+                .build();
+        Protocol.ClientResponse clResponse = Protocol.ClientResponse.newBuilder()
+                .addAttribute(Protocol.Attribute.newBuilder()
+                        .setName("id")
+                        .setValue(Protocol.Variant.newBuilder()
+                                .setIntValue(315)
+                        ))
+                .addAttribute(Protocol.Attribute.newBuilder()
+                        .setName("proto")
+                        .setValue(Protocol.Variant.newBuilder()
+                                .setBlobValue(response.toByteString())
+                        ))
+                .build();
+
+        Protocol.Header header = Processor.generateResponse(clResponse.getSerializedSize(), token, 0, 0);
+        conn.send(new BattleNetPacket(header, clResponse.toByteArray()));
     }
 
     private void parseGetAssetsVersion(BattleNetPacket packet, TcpConnection conn) throws Exception {
-        log.info("parseGetAssetsVersion: got");
-        Protocol.Header header = Processor.generateResponse(29, packet.getHeader().getToken(), 0, 0);
-
-        conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110AF02")));
-
         Protocol.AssetsVersionResponse assetsVersionResponse = Protocol.AssetsVersionResponse.newBuilder()
                 .setVersion(11046)
                 .build();
 
         Protocol.Notification n = generateNotification(304, assetsVersionResponse.toByteString(), assetsVersionResponse.getSerializedSize());
 
-        header = Protocol.Header.newBuilder()
+        Protocol.Header header = Protocol.Header.newBuilder()
                 .setServiceId(4)
                 .setMethodId(1)
                 .setToken(conn.nextToken())
@@ -991,41 +871,32 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void parseCheckAccountLicenses(BattleNetPacket packet, TcpConnection conn) throws Exception {
-        log.info("parseCheckAccountLicenses: got");
-        // CheckAccountLicensesResponse
-        Protocol.Header header = Processor.generateResponse(29, packet.getHeader().getToken(), 0, 0);
-        conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F120732050801108B02")));
-
-        Protocol.GenericResponse gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(267)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
+        Protocol.CheckAccountLicensesResponse response = Protocol.CheckAccountLicensesResponse.newBuilder()
+                .setSuccess(true)
                 .build();
 
-        Protocol.Notification n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
+        Protocol.Notification n = generateNotification(330, response.toByteString(), response.getSerializedSize());
 
-        header = Protocol.Header.newBuilder()
+        Protocol.Header header = Protocol.Header.newBuilder()
                 .setServiceId(4)
                 .setMethodId(1)
                 .setToken(conn.nextToken())
+                .setStatus(0)
                 .setObjectId(0)
                 .setSize(n.getSerializedSize())
-                .setStatus(0)
                 .build();
 
         conn.send(new BattleNetPacket(header, n.toByteArray()));
     }
 
     private void parseUpdateLogin(BattleNetPacket packet, TcpConnection conn) throws Exception {
-        log.info("parseUpdateLogin: got");
         //Protocol.UpdateLogin updateLogin = Protocol.UpdateLogin.parseFrom(body.getBody());
-        Protocol.Header header = Processor.generateResponse(29, packet.getHeader().getToken(), 0, 0);
-        conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110CD01")));
 
         Protocol.UpdateLoginComplete updateLoginComplete = Protocol.UpdateLoginComplete.newBuilder().build();
 
         Protocol.Notification n = generateNotification(307, updateLoginComplete.toByteString(), updateLoginComplete.getSerializedSize());
 
-        header = Protocol.Header.newBuilder()
+        Protocol.Header header = Protocol.Header.newBuilder()
                 .setServiceId(4)
                 .setMethodId(1)
                 .setToken(conn.nextToken())
@@ -1038,54 +909,13 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void parseCheckGameLicenses(BattleNetPacket packet, TcpConnection conn) throws Exception {
-        // CheckGameLicensesResponse
-        log.info("parseCheckGameLicenses: got");
-        Protocol.Header header = Processor.generateResponse(29, packet.getHeader().getToken(), 0, 0);
-        conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F120732050801109402")));
-
-        Protocol.GenericResponse gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(205)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
-                .build();
-
-        Protocol.Notification n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
-        gr = Protocol.GenericResponse.newBuilder()
-                .setRequestId(276)
-                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
-                .build();
-
-        n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
         Protocol.CheckGameLicensesResponse checkGameLicensesResponse = Protocol.CheckGameLicensesResponse.newBuilder()
                 .setSuccess(true)
                 .build();
 
-        n = generateNotification(331, checkGameLicensesResponse.toByteString(), checkGameLicensesResponse.getSerializedSize());
+        Protocol.Notification n = generateNotification(331, checkGameLicensesResponse.toByteString(), checkGameLicensesResponse.getSerializedSize());
 
-        header = Protocol.Header.newBuilder()
+        Protocol.Header header = Protocol.Header.newBuilder()
                 .setServiceId(4)
                 .setMethodId(1)
                 .setToken(conn.nextToken())
@@ -1099,17 +929,76 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void parseGetAdventureProgress(BattleNetPacket packet, TcpConnection conn) throws Exception {
-        log.info("parseGetAdventureProgress: got");
-        byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110B102");
-        Protocol.Header header = Processor.generateResponse(b.length, packet.getHeader().getToken(), 0, 0);
-        conn.send(new BattleNetPacket(header, b));
-
        /* Protocol.AdventureProgressResponse progressResponse = Protocol.AdventureProgressResponse.newBuilder()
                 .build();*/
 
        // Protocol.Notification n = generateNotification(306, progressResponse.toByteString(), progressResponse.getSerializedSize());
         Protocol.Notification n = generateEmptyNotification(306);
 
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
+
+    private void parseGetBattlePayConfig(TcpConnection conn) throws Exception {
+        /*Protocol.BattlePayConfigResponse configResponse = Protocol.BattlePayConfigResponse.newBuilder()
+                .setCurrency(4)
+                .setUnavailable(false)
+                .build();
+
+        Protocol.Notification n = generateNotification(238, configResponse.toByteString(), configResponse.getSerializedSize());*/
+
+        byte[] b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318EE0122E34F0A0C667261676D656E745F30303012D24F32CF4F0AB4010A14393931303030313530323130303030373233383211A4703D0AD7A3FC3F1A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E6172656E6170617373222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E6172656E61706173732A060802100018013A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E6172656E61706173730AB1010A1439393130303031353033313030303037323338331185EB51B81E8505401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657232222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572322A060801100118023A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572320AB1010A143939313030303135303431303030303732333834117B14AE47E1FA21401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657237222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572372A060801100118073A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572370AB4010A143939313030303135303531303030303732333835113D0AD7A370FD31401A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F737465723135222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657231352A0608011001180F3A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657231350AB4010A143939313030303135303631303030303732333836111F85EB51B87E46401A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F737465723430222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657234302A060801100118283A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657234300AC5010A1439393130303031383038303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030312A0608031001180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030315A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031383039303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030322A0608031002180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030325A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031383130303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030332A0608031003180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030335A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031383131303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030342A0608031004180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030345A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AE2010A1439393130303031383132303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030312A060803100118012A060803100318012A060803100218012A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030315A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ADA010A1439393130303031383133303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030322A060803100318012A060803100218012A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030325A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AD2010A1439393130303031383134303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030332A060803100318012A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030335A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031393232303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303035222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030352A0608031005180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030355A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACA010A1439393130303031393233303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030342A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030345A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AB6010A143939323030303139323332303030303032313633117B14AE47E1FA21401A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030312228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030312A070806108C1618012A060805101A18013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030314A066C61756E63680AB6010A143939323030303139323632303030303032313636117B14AE47E1FA21401A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030332228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030332A070806108D1618012A060805101B18013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030334A066C61756E63680AB6010A143939323030303139333232303030303032313732117B14AE47E1FA21401A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030322228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030322A070806108A1618012A060805101918013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030324A066C61756E63680A270A143939323030303334353632303030303033373536111F85EB51B87E4F402A0608011001183C0ACB010A1439393230303033343539323030303030333735391A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657232222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572322A060801100918023A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572325A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACB010A1439393230303033343632323030303030333736321A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657237222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572372A060801100918073A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572375A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACE010A1439393230303033343635323030303030333736351A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657231352230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657231352A0608011009180F3A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657231355A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACE010A1439393230303033343638323030303030333736381A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657234302230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657234302A060801100918283A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657234305A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650A380A1439393230303033343731323030303030333737312A0608011009183C5A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A14393932303031313935323230303030313330343411F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030312A0608041006180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030314A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313935353230303030313330343711F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030322A0608041007180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030324A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313935383230303030313330353011F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030332A0608041008180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030334A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313936313230303030313330353311F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030342A0608041009180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030344A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313936343230303030313330353611F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303035222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030352A060804100A180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030354A0F62726D5F6E6F726D616C5F73616C650AE2010A143939323030313139363732303030303133303539113D0AD7A370FD35401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030312A060804100618012A060804100718012A060804100818012A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030314A0F62726D5F6E6F726D616C5F73616C650ADA010A143939323030313139373032303030303133303632113D0AD7A370FD31401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030322A060804100718012A060804100818012A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030324A0F62726D5F6E6F726D616C5F73616C650AD2010A143939323030313139373332303030303133303635117B14AE47E1FA2B401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030332A060804100818012A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030334A0F62726D5F6E6F726D616C5F73616C650ACA010A143939323030313139373632303030303133303638117B14AE47E1FA21401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030342A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030344A0F62726D5F6E6F726D616C5F73616C650AEA010A143939323030313139373932303030303133303731113D0AD7A370FD35401A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E413030324230303170222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303031702A060804100618012A060804100718012A060804100818012A060804100918012A060804100A18012A060805101218013A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303031704A0C62726D5F7072655F73616C650AD6010A143939323030313539383732303030303137343537111F85EB51B87E46401A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F737465723530702231636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F737465723530702A060805101F18012A060801100A18323A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F737465723530704A0C7467745F7072655F73616C650ACB010A1439393330303030313836333030303030303138361185EB51B81E8505401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657232222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572322A060801100A18023A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572324A0F7467745F6E6F726D616C5F73616C650ACB010A143939333030303031383733303030303030313837117B14AE47E1FA21401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657237222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572372A060801100A18073A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572374A0F7467745F6E6F726D616C5F73616C650ACE010A143939333030303031383833303030303030313838113D0AD7A370FD31401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657231352230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657231352A060801100A180F3A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657231354A0F7467745F6E6F726D616C5F73616C650ACE010A143939333030303031393033303030303030313930111F85EB51B87E46401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657234302230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657234302A060801100A18283A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657234304A0F7467745F6E6F726D616C5F73616C650A380A143939333030303031393133303030303030313931111F85EB51B87E4F402A060801100A183C4A0F7467745F6E6F726D616C5F73616C650AC0010A143939333030303333303233303030303032353736117B14AE47E1FA21401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303342303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030332A060807100D18012A060807100E18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030334A056C6F655F310ABB010A14393933303030333330373330303030303235353911F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030312A060807100B180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030314A056C6F655F310ABB010A14393933303030333330383330303030303235363311F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030322A060807100C180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030324A056C6F655F310ABB010A14393933303030333330393330303030303235383411F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030332A060807100D180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030334A056C6F655F310ABB010A14393933303030333331303330303030303235383511F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030342A060807100E180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030344A056C6F655F310AD0010A143939333030303333313133303030303032353836113D0AD7A370FD31401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303342303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030312A060807100B18012A060807100C18012A060807100D18012A060807100E18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030314A056C6F655F310AC8010A143939333030303333313233303030303032353837117B14AE47E1FA2B401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303342303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030322A060807100C18012A060807100D18012A060807100E18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030324A056C6F655F310ACD010A143939333030303434313633303030303034303032113D0AD7A370FD31401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657231352230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657231352A060801100B180F3A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657231354A0E6F675F6E6F726D616C5F73616C650ACD010A143939333030303434313733303030303034303033111F85EB51B87E46401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657234302230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657234302A060801100B18283A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657234304A0E6F675F6E6F726D616C5F73616C650A370A143939333030303434313833303030303034313034111F85EB51B87E4F402A060801100B183C4A0E6F675F6E6F726D616C5F73616C650AD9010A143939333030303434373033303030303034303838111F85EB51B87E46401A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F737465723530702231636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F737465723530702A060801100B18322A060805102D18013A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F737465723530704A0F6F675F7072655F70757263686173650ACA010A1439393330303034343737333030303030343039351185EB51B81E8505401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657232222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572322A060801100B18023A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572324A0E6F675F6E6F726D616C5F73616C650ACA010A143939333030303434373833303030303034303936117B14AE47E1FA21401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657237222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572372A060801100B18073A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572374A0E6F675F6E6F726D616C5F73616C650ABA010A1439393330303035303434333030303030343636351A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030342228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030342A08080610CDB10218013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030344A186170706C655F636861726974795F70726F6D6F5F323031365002100428D80432040864100132150864100A1A0F7467745F6E6F726D616C5F73616C6532140864100B1A0E6F675F6E6F726D616C5F73616C6538960122130A0C6D6573736167655F73697A65120318CF4F2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(b.length) // n.getSerializedSize()
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, b)); // n.toByteArray()
+    }
+
+    private void parseGetAchieves(int token, TcpConnection conn) throws Exception {
+        //Protocol.GetAchieves getAchieves = Protocol.GetAchieves.parseFrom(body.getBody());
+        // Achieves
+
+        byte[] b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318FC0122A82F0A0C667261676D656E745F30303012972F32942F0A28080210011801200130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A28080310011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A31080F100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A310818100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A31083E100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A31083F100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A28084110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A31084F100218FFFFFFFFFFFFFFFFFF01280130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A28086110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A2908D80110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A2908D90110011801280130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A130801100018FFFFFFFFFFFFFFFFFF01280148010A130804100018FFFFFFFFFFFFFFFFFF01280148010A130805100018FFFFFFFFFFFFFFFFFF01280148010A130806100018FFFFFFFFFFFFFFFFFF01280148010A130807100018FFFFFFFFFFFFFFFFFF01280148010A130808100018FFFFFFFFFFFFFFFFFF01280148010A130809100018FFFFFFFFFFFFFFFFFF01280148010A13080A100018FFFFFFFFFFFFFFFFFF01280148010A13080D100018FFFFFFFFFFFFFFFFFF01280148010A13080E100018FFFFFFFFFFFFFFFFFF01280148010A130810100018FFFFFFFFFFFFFFFFFF01280148010A130811100018FFFFFFFFFFFFFFFFFF01280148010A130812100018FFFFFFFFFFFFFFFFFF01280148010A130813100018FFFFFFFFFFFFFFFFFF01280148010A130814100018FFFFFFFFFFFFFFFFFF01280148010A130815100018FFFFFFFFFFFFFFFFFF01280148010A130816100018FFFFFFFFFFFFFFFFFF01280148010A130817100018FFFFFFFFFFFFFFFFFF01280148010A130819100018FFFFFFFFFFFFFFFFFF01280148010A13081A100018FFFFFFFFFFFFFFFFFF01280148010A13081B100018FFFFFFFFFFFFFFFFFF01280148010A13081C100018FFFFFFFFFFFFFFFFFF01280148010A13081D100018FFFFFFFFFFFFFFFFFF01280148010A13081E100018FFFFFFFFFFFFFFFFFF01280148010A130837100018FFFFFFFFFFFFFFFFFF01280148010A130839100018FFFFFFFFFFFFFFFFFF01280148010A13083A100018FFFFFFFFFFFFFFFFFF01280148010A13083B100018FFFFFFFFFFFFFFFFFF01280148010A13083C100018FFFFFFFFFFFFFFFFFF01280148010A13083D100018FFFFFFFFFFFFFFFFFF01280148010A130842100018FFFFFFFFFFFFFFFFFF01280148010A130843100018FFFFFFFFFFFFFFFFFF01280148010A130844100018FFFFFFFFFFFFFFFFFF01280148010A130846100018FFFFFFFFFFFFFFFFFF01280148010A130847100018FFFFFFFFFFFFFFFFFF01280148010A130848100018FFFFFFFFFFFFFFFFFF01280148010A130849100018FFFFFFFFFFFFFFFFFF01280148010A13084A100018FFFFFFFFFFFFFFFFFF01280148010A13084B100018FFFFFFFFFFFFFFFFFF01280148010A13084C100018FFFFFFFFFFFFFFFFFF01280148010A13084D100018FFFFFFFFFFFFFFFFFF01280148010A13084E100018FFFFFFFFFFFFFFFFFF01280148010A130850100018FFFFFFFFFFFFFFFFFF01280148010A130851100018FFFFFFFFFFFFFFFFFF01280148010A130852100018FFFFFFFFFFFFFFFFFF01280148010A130853100018FFFFFFFFFFFFFFFFFF01280148010A130854100018FFFFFFFFFFFFFFFFFF01280148010A130855100018FFFFFFFFFFFFFFFFFF01280148010A130856100018FFFFFFFFFFFFFFFFFF01280148010A130857100018FFFFFFFFFFFFFFFFFF01280148010A130858100018FFFFFFFFFFFFFFFFFF01280148010A130859100018FFFFFFFFFFFFFFFFFF01280148010A13085A100018FFFFFFFFFFFFFFFFFF01280148010A13085B100018FFFFFFFFFFFFFFFFFF01280148010A13085C100018FFFFFFFFFFFFFFFFFF01280148010A13085D100018FFFFFFFFFFFFFFFFFF01280148010A13085E100018FFFFFFFFFFFFFFFFFF01280148010A13085F100018FFFFFFFFFFFFFFFFFF01280148010A130860100018FFFFFFFFFFFFFFFFFF01280148010A130862100018FFFFFFFFFFFFFFFFFF01280148010A130863100018FFFFFFFFFFFFFFFFFF01280148010A130864100018FFFFFFFFFFFFFFFFFF01280148010A130865100018FFFFFFFFFFFFFFFFFF01280148010A130866100018FFFFFFFFFFFFFFFFFF01280148010A130867100018FFFFFFFFFFFFFFFFFF01280148010A130868100018FFFFFFFFFFFFFFFFFF01280148010A130869100018FFFFFFFFFFFFFFFFFF01280148010A13086A100018FFFFFFFFFFFFFFFFFF01280148010A13086B100018FFFFFFFFFFFFFFFFFF01280148010A13086C100018FFFFFFFFFFFFFFFFFF01280148010A13086D100018FFFFFFFFFFFFFFFFFF01280148010A13086E100018FFFFFFFFFFFFFFFFFF01280148010A130870100018FFFFFFFFFFFFFFFFFF01280148010A130871100018FFFFFFFFFFFFFFFFFF01280148010A130872100018FFFFFFFFFFFFFFFFFF01280148010A130873100018FFFFFFFFFFFFFFFFFF01280148010A130874100018FFFFFFFFFFFFFFFFFF01280148010A130875100018FFFFFFFFFFFFFFFFFF01280148010A130876100018FFFFFFFFFFFFFFFFFF01280148010A130877100018FFFFFFFFFFFFFFFFFF01280148010A130878100018FFFFFFFFFFFFFFFFFF01280148010A130879100018FFFFFFFFFFFFFFFFFF01280148010A13087F100018FFFFFFFFFFFFFFFFFF01280148010A14088001100018FFFFFFFFFFFFFFFFFF01280148010A14088101100018FFFFFFFFFFFFFFFFFF01280148010A14088201100018FFFFFFFFFFFFFFFFFF01280148010A14088301100018FFFFFFFFFFFFFFFFFF01280148010A14088401100018FFFFFFFFFFFFFFFFFF01280148010A14088501100018FFFFFFFFFFFFFFFFFF01280148010A14088601100018FFFFFFFFFFFFFFFFFF01280148010A14088701100018FFFFFFFFFFFFFFFFFF01280148010A14088801100018FFFFFFFFFFFFFFFFFF01280148010A14088901100018FFFFFFFFFFFFFFFFFF01280148010A14088A01100018FFFFFFFFFFFFFFFFFF01280148010A14088B01100018FFFFFFFFFFFFFFFFFF01280148010A14088C01100018FFFFFFFFFFFFFFFFFF01280148010A14088D01100018FFFFFFFFFFFFFFFFFF01280148010A14088E01100018FFFFFFFFFFFFFFFFFF01280148010A14088F01100018FFFFFFFFFFFFFFFFFF01280148010A14089001100018FFFFFFFFFFFFFFFFFF01280148010A14089101100018FFFFFFFFFFFFFFFFFF01280148010A14089201100018FFFFFFFFFFFFFFFFFF01280148010A14089301100018FFFFFFFFFFFFFFFFFF01280148010A14089401100018FFFFFFFFFFFFFFFFFF01280148010A14089501100018FFFFFFFFFFFFFFFFFF01280148010A14089601100018FFFFFFFFFFFFFFFFFF01280148010A14089701100018FFFFFFFFFFFFFFFFFF01280148010A14089801100018FFFFFFFFFFFFFFFFFF01280148010A14089901100018FFFFFFFFFFFFFFFFFF01280148010A14089A01100018FFFFFFFFFFFFFFFFFF01280148010A14089B01100018FFFFFFFFFFFFFFFFFF01280148010A14089C01100018FFFFFFFFFFFFFFFFFF01280148010A14089D01100018FFFFFFFFFFFFFFFFFF01280148010A14089E01100018FFFFFFFFFFFFFFFFFF01280148010A14089F01100018FFFFFFFFFFFFFFFFFF01280148010A1408A001100018FFFFFFFFFFFFFFFFFF01280148010A1408A101100018FFFFFFFFFFFFFFFFFF01280148010A1408A201100018FFFFFFFFFFFFFFFFFF01280148010A1408A301100018FFFFFFFFFFFFFFFFFF01280148010A1408A401100018FFFFFFFFFFFFFFFFFF01280148010A1408A501100018FFFFFFFFFFFFFFFFFF01280148010A1408A601100018FFFFFFFFFFFFFFFFFF01280148010A1408A701100018FFFFFFFFFFFFFFFFFF01280148010A1408A801100018FFFFFFFFFFFFFFFFFF01280148010A1408A901100018FFFFFFFFFFFFFFFFFF01280148010A1408AA01100018FFFFFFFFFFFFFFFFFF01280148010A1408AB01100018FFFFFFFFFFFFFFFFFF01280148010A1408AC01100018FFFFFFFFFFFFFFFFFF01280148010A1408AD01100018FFFFFFFFFFFFFFFFFF01280148010A1408AE01100018FFFFFFFFFFFFFFFFFF01280148010A1408AF01100018FFFFFFFFFFFFFFFFFF01280148010A1408B001100018FFFFFFFFFFFFFFFFFF01280148010A1408B101100018FFFFFFFFFFFFFFFFFF01280148010A1408B201100018FFFFFFFFFFFFFFFFFF01280148010A1408B301100018FFFFFFFFFFFFFFFFFF01280148010A1408B401100018FFFFFFFFFFFFFFFFFF01280148010A1408B501100018FFFFFFFFFFFFFFFFFF01280148010A1408B601100018FFFFFFFFFFFFFFFFFF01280148010A1408B701100018FFFFFFFFFFFFFFFFFF01280148010A1408B801100018FFFFFFFFFFFFFFFFFF01280148010A1408B901100018FFFFFFFFFFFFFFFFFF01280148010A1408BA01100018FFFFFFFFFFFFFFFFFF01280148010A1408BB01100018FFFFFFFFFFFFFFFFFF01280148010A1408BC01100018FFFFFFFFFFFFFFFFFF01280148010A1408BD01100018FFFFFFFFFFFFFFFFFF01280148010A1408BE01100018FFFFFFFFFFFFFFFFFF01280148010A1408BF01100018FFFFFFFFFFFFFFFFFF01280148010A1408C001100018FFFFFFFFFFFFFFFFFF01280148010A1408C101100018FFFFFFFFFFFFFFFFFF01280148010A1408C201100018FFFFFFFFFFFFFFFFFF01280148010A1408C301100018FFFFFFFFFFFFFFFFFF01280148010A1408C401100018FFFFFFFFFFFFFFFFFF01280148010A1408C501100018FFFFFFFFFFFFFFFFFF01280148010A1408C601100018FFFFFFFFFFFFFFFFFF01280148010A1408C701100018FFFFFFFFFFFFFFFFFF01280148010A1408C801100018FFFFFFFFFFFFFFFFFF01280148010A1408C901100018FFFFFFFFFFFFFFFFFF01280148010A1408CA01100018FFFFFFFFFFFFFFFFFF01280148010A1408CB01100018FFFFFFFFFFFFFFFFFF01280148010A1408CD01100018FFFFFFFFFFFFFFFFFF01280148010A1408CE01100018FFFFFFFFFFFFFFFFFF01280148010A1408CF01100018FFFFFFFFFFFFFFFFFF01280148010A1408D001100018FFFFFFFFFFFFFFFFFF01280148010A1408D101100018FFFFFFFFFFFFFFFFFF01280148010A1408D201100018FFFFFFFFFFFFFFFFFF01280148010A1408D301100018FFFFFFFFFFFFFFFFFF01280148010A1408D401100018FFFFFFFFFFFFFFFFFF01280148010A1408D501100018FFFFFFFFFFFFFFFFFF01280148010A1408D701100018FFFFFFFFFFFFFFFFFF01280148010A1408DA01100018FFFFFFFFFFFFFFFFFF01280148010A1408DC01100018FFFFFFFFFFFFFFFFFF01280148010A1408DD01100018FFFFFFFFFFFFFFFFFF01280148010A1408E801100018FFFFFFFFFFFFFFFFFF01280148010A1408E901100018FFFFFFFFFFFFFFFFFF01280148010A1408EA01100018FFFFFFFFFFFFFFFFFF01280148010A1408EB01100018FFFFFFFFFFFFFFFFFF01280148010A1408EC01100018FFFFFFFFFFFFFFFFFF01280148010A1408ED01100018FFFFFFFFFFFFFFFFFF01280148010A1408EE01100018FFFFFFFFFFFFFFFFFF01280148010A1408EF01100018FFFFFFFFFFFFFFFFFF01280148010A14088402100018FFFFFFFFFFFFFFFFFF01280148010A14088502100018FFFFFFFFFFFFFFFFFF01280148010A14088602100018FFFFFFFFFFFFFFFFFF01280148010A14088702100018FFFFFFFFFFFFFFFFFF01280148010A14088802100018FFFFFFFFFFFFFFFFFF01280148010A14088902100018FFFFFFFFFFFFFFFFFF01280148010A14088A02100018FFFFFFFFFFFFFFFFFF01280148010A14088B02100018FFFFFFFFFFFFFFFFFF01280148010A14088C02100018FFFFFFFFFFFFFFFFFF01280148010A14088D02100018FFFFFFFFFFFFFFFFFF01280148010A14088E02100018FFFFFFFFFFFFFFFFFF01280148010A14088F02100018FFFFFFFFFFFFFFFFFF01280148010A14089002100018FFFFFFFFFFFFFFFFFF01280148010A14089102100018FFFFFFFFFFFFFFFFFF01280148010A14089202100018FFFFFFFFFFFFFFFFFF01280148010A14089302100018FFFFFFFFFFFFFFFFFF01280148010A14089402100018FFFFFFFFFFFFFFFFFF01280148010A14089502100018FFFFFFFFFFFFFFFFFF01280148010A14089602100018FFFFFFFFFFFFFFFFFF01280148010A14089702100018FFFFFFFFFFFFFFFFFF01280148010A14089802100018FFFFFFFFFFFFFFFFFF01280148010A14089902100018FFFFFFFFFFFFFFFFFF01280148010A14089A02100018FFFFFFFFFFFFFFFFFF01280148010A14089B02100018FFFFFFFFFFFFFFFFFF01280148010A14089C02100018FFFFFFFFFFFFFFFFFF01280148010A1408A102100018FFFFFFFFFFFFFFFFFF01280148010A1408A202100018FFFFFFFFFFFFFFFFFF01280148010A1408A302100018FFFFFFFFFFFFFFFFFF01280148010A1408A402100018FFFFFFFFFFFFFFFFFF01280148010A1408A502100018FFFFFFFFFFFFFFFFFF01280148010A1408A602100018FFFFFFFFFFFFFFFFFF01280148010A1408A702100018FFFFFFFFFFFFFFFFFF01280148010A1408A802100018FFFFFFFFFFFFFFFFFF01280148010A1408A902100018FFFFFFFFFFFFFFFFFF01280148010A1408AA02100018FFFFFFFFFFFFFFFFFF01280148010A1408AB02100018FFFFFFFFFFFFFFFFFF01280148010A1408AC02100018FFFFFFFFFFFFFFFFFF01280148010A1408AD02100018FFFFFFFFFFFFFFFFFF01280148010A1408AE02100018FFFFFFFFFFFFFFFFFF01280148010A1408AF02100018FFFFFFFFFFFFFFFFFF01280148010A1408B002100018FFFFFFFFFFFFFFFFFF01280148010A1408B102100018FFFFFFFFFFFFFFFFFF01280148010A1408B202100018FFFFFFFFFFFFFFFFFF01280148010A1408B302100018FFFFFFFFFFFFFFFFFF01280148010A1408B402100018FFFFFFFFFFFFFFFFFF01280148010A1408B502100018FFFFFFFFFFFFFFFFFF01280148010A1408B602100018FFFFFFFFFFFFFFFFFF01280148010A1408B702100018FFFFFFFFFFFFFFFFFF01280148010A1408B802100018FFFFFFFFFFFFFFFFFF01280148010A1408B902100018FFFFFFFFFFFFFFFFFF01280148010A1408BA02100018FFFFFFFFFFFFFFFFFF01280148010A1408BB02100018FFFFFFFFFFFFFFFFFF01280148010A1408BC02100018FFFFFFFFFFFFFFFFFF01280148010A1408BD02100018FFFFFFFFFFFFFFFFFF01280148010A1408BE02100018FFFFFFFFFFFFFFFFFF01280148010A1408BF02100018FFFFFFFFFFFFFFFFFF01280148010A1408C002100018FFFFFFFFFFFFFFFFFF01280148010A1408C102100018FFFFFFFFFFFFFFFFFF01280148010A1408C202100018FFFFFFFFFFFFFFFFFF01280148010A1408C302100018FFFFFFFFFFFFFFFFFF01280148010A1408C402100018FFFFFFFFFFFFFFFFFF01280148010A1408C502100018FFFFFFFFFFFFFFFFFF01280148010A1408C602100018FFFFFFFFFFFFFFFFFF01280148010A1408C702100018FFFFFFFFFFFFFFFFFF01280148010A1408C802100018FFFFFFFFFFFFFFFFFF01280148010A1408C902100018FFFFFFFFFFFFFFFFFF01280148010A1408CA02100018FFFFFFFFFFFFFFFFFF01280148010A1408CB02100018FFFFFFFFFFFFFFFFFF01280148010A1408CC02100018FFFFFFFFFFFFFFFFFF01280148010A1408CD02100018FFFFFFFFFFFFFFFFFF01280148010A1408CE02100018FFFFFFFFFFFFFFFFFF01280148010A1408CF02100018FFFFFFFFFFFFFFFFFF01280148010A1408D002100018FFFFFFFFFFFFFFFFFF01280148010A1408D102100018FFFFFFFFFFFFFFFFFF01280148010A1408D202100018FFFFFFFFFFFFFFFFFF012801480122130A0C6D6573736167655F73697A65120318942F2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(b.length)
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, b));
+    }
+
+    private void parseGetBattlePayStatus(int token, TcpConnection conn) throws Exception {
+        byte[] b = Util.hexStringToByteArray("0A090A02696412031889020A0F0A0570726F746F1206320408002001");
+        Protocol.Header header = Processor.generateResponse(b.length, token, 0, 0);
+        conn.send(new BattleNetPacket(header, b));
+
+        Protocol.BattlePayStatusResponse response = Protocol.BattlePayStatusResponse.newBuilder()
+                .setStatus(Protocol.BattlePayStatusResponse.PurchaseState.PS_READY)
+                .setBattlePayAvailable(true)
+                .build();
+
+        Protocol.Notification n = generateNotification(265, response.toByteString(), response.getSerializedSize());
+
         header = Protocol.Header.newBuilder()
                 .setServiceId(4)
                 .setMethodId(1)
@@ -1122,41 +1011,9 @@ public class GameUtilitiesProcessor extends Processor {
         conn.send(new BattleNetPacket(header, n.toByteArray()));
     }
 
-    private void parseGetBattlePayConfig(ClientRequestBody body) {
-        log.info("parseGetBattlePayConfig: got");
-    }
-
-    private void parseGetAchieves(int token, ClientRequestBody body, TcpConnection conn) throws Exception {
-        Protocol.GetAchieves getAchieves = Protocol.GetAchieves.parseFrom(body.getBody());
-        log.info("parseGetAchieves: {}", getAchieves);
-
-        byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110FD01");
-
-        Protocol.Header header = Processor.generateResponse(b.length, token, 0, 0);
-
-        conn.send(new BattleNetPacket(header, b));
-        // Achieves
-        b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318FC0122A82F0A0C667261676D656E745F30303012972F32942F0A28080210011801200130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A28080310011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A31080F100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A310818100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A31083E100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A31083F100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A28084110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A31084F100218FFFFFFFFFFFFFFFFFF01280130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A28086110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A2908D80110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A2908D90110011801280130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A130801100018FFFFFFFFFFFFFFFFFF01280148010A130804100018FFFFFFFFFFFFFFFFFF01280148010A130805100018FFFFFFFFFFFFFFFFFF01280148010A130806100018FFFFFFFFFFFFFFFFFF01280148010A130807100018FFFFFFFFFFFFFFFFFF01280148010A130808100018FFFFFFFFFFFFFFFFFF01280148010A130809100018FFFFFFFFFFFFFFFFFF01280148010A13080A100018FFFFFFFFFFFFFFFFFF01280148010A13080D100018FFFFFFFFFFFFFFFFFF01280148010A13080E100018FFFFFFFFFFFFFFFFFF01280148010A130810100018FFFFFFFFFFFFFFFFFF01280148010A130811100018FFFFFFFFFFFFFFFFFF01280148010A130812100018FFFFFFFFFFFFFFFFFF01280148010A130813100018FFFFFFFFFFFFFFFFFF01280148010A130814100018FFFFFFFFFFFFFFFFFF01280148010A130815100018FFFFFFFFFFFFFFFFFF01280148010A130816100018FFFFFFFFFFFFFFFFFF01280148010A130817100018FFFFFFFFFFFFFFFFFF01280148010A130819100018FFFFFFFFFFFFFFFFFF01280148010A13081A100018FFFFFFFFFFFFFFFFFF01280148010A13081B100018FFFFFFFFFFFFFFFFFF01280148010A13081C100018FFFFFFFFFFFFFFFFFF01280148010A13081D100018FFFFFFFFFFFFFFFFFF01280148010A13081E100018FFFFFFFFFFFFFFFFFF01280148010A130837100018FFFFFFFFFFFFFFFFFF01280148010A130839100018FFFFFFFFFFFFFFFFFF01280148010A13083A100018FFFFFFFFFFFFFFFFFF01280148010A13083B100018FFFFFFFFFFFFFFFFFF01280148010A13083C100018FFFFFFFFFFFFFFFFFF01280148010A13083D100018FFFFFFFFFFFFFFFFFF01280148010A130842100018FFFFFFFFFFFFFFFFFF01280148010A130843100018FFFFFFFFFFFFFFFFFF01280148010A130844100018FFFFFFFFFFFFFFFFFF01280148010A130846100018FFFFFFFFFFFFFFFFFF01280148010A130847100018FFFFFFFFFFFFFFFFFF01280148010A130848100018FFFFFFFFFFFFFFFFFF01280148010A130849100018FFFFFFFFFFFFFFFFFF01280148010A13084A100018FFFFFFFFFFFFFFFFFF01280148010A13084B100018FFFFFFFFFFFFFFFFFF01280148010A13084C100018FFFFFFFFFFFFFFFFFF01280148010A13084D100018FFFFFFFFFFFFFFFFFF01280148010A13084E100018FFFFFFFFFFFFFFFFFF01280148010A130850100018FFFFFFFFFFFFFFFFFF01280148010A130851100018FFFFFFFFFFFFFFFFFF01280148010A130852100018FFFFFFFFFFFFFFFFFF01280148010A130853100018FFFFFFFFFFFFFFFFFF01280148010A130854100018FFFFFFFFFFFFFFFFFF01280148010A130855100018FFFFFFFFFFFFFFFFFF01280148010A130856100018FFFFFFFFFFFFFFFFFF01280148010A130857100018FFFFFFFFFFFFFFFFFF01280148010A130858100018FFFFFFFFFFFFFFFFFF01280148010A130859100018FFFFFFFFFFFFFFFFFF01280148010A13085A100018FFFFFFFFFFFFFFFFFF01280148010A13085B100018FFFFFFFFFFFFFFFFFF01280148010A13085C100018FFFFFFFFFFFFFFFFFF01280148010A13085D100018FFFFFFFFFFFFFFFFFF01280148010A13085E100018FFFFFFFFFFFFFFFFFF01280148010A13085F100018FFFFFFFFFFFFFFFFFF01280148010A130860100018FFFFFFFFFFFFFFFFFF01280148010A130862100018FFFFFFFFFFFFFFFFFF01280148010A130863100018FFFFFFFFFFFFFFFFFF01280148010A130864100018FFFFFFFFFFFFFFFFFF01280148010A130865100018FFFFFFFFFFFFFFFFFF01280148010A130866100018FFFFFFFFFFFFFFFFFF01280148010A130867100018FFFFFFFFFFFFFFFFFF01280148010A130868100018FFFFFFFFFFFFFFFFFF01280148010A130869100018FFFFFFFFFFFFFFFFFF01280148010A13086A100018FFFFFFFFFFFFFFFFFF01280148010A13086B100018FFFFFFFFFFFFFFFFFF01280148010A13086C100018FFFFFFFFFFFFFFFFFF01280148010A13086D100018FFFFFFFFFFFFFFFFFF01280148010A13086E100018FFFFFFFFFFFFFFFFFF01280148010A130870100018FFFFFFFFFFFFFFFFFF01280148010A130871100018FFFFFFFFFFFFFFFFFF01280148010A130872100018FFFFFFFFFFFFFFFFFF01280148010A130873100018FFFFFFFFFFFFFFFFFF01280148010A130874100018FFFFFFFFFFFFFFFFFF01280148010A130875100018FFFFFFFFFFFFFFFFFF01280148010A130876100018FFFFFFFFFFFFFFFFFF01280148010A130877100018FFFFFFFFFFFFFFFFFF01280148010A130878100018FFFFFFFFFFFFFFFFFF01280148010A130879100018FFFFFFFFFFFFFFFFFF01280148010A13087F100018FFFFFFFFFFFFFFFFFF01280148010A14088001100018FFFFFFFFFFFFFFFFFF01280148010A14088101100018FFFFFFFFFFFFFFFFFF01280148010A14088201100018FFFFFFFFFFFFFFFFFF01280148010A14088301100018FFFFFFFFFFFFFFFFFF01280148010A14088401100018FFFFFFFFFFFFFFFFFF01280148010A14088501100018FFFFFFFFFFFFFFFFFF01280148010A14088601100018FFFFFFFFFFFFFFFFFF01280148010A14088701100018FFFFFFFFFFFFFFFFFF01280148010A14088801100018FFFFFFFFFFFFFFFFFF01280148010A14088901100018FFFFFFFFFFFFFFFFFF01280148010A14088A01100018FFFFFFFFFFFFFFFFFF01280148010A14088B01100018FFFFFFFFFFFFFFFFFF01280148010A14088C01100018FFFFFFFFFFFFFFFFFF01280148010A14088D01100018FFFFFFFFFFFFFFFFFF01280148010A14088E01100018FFFFFFFFFFFFFFFFFF01280148010A14088F01100018FFFFFFFFFFFFFFFFFF01280148010A14089001100018FFFFFFFFFFFFFFFFFF01280148010A14089101100018FFFFFFFFFFFFFFFFFF01280148010A14089201100018FFFFFFFFFFFFFFFFFF01280148010A14089301100018FFFFFFFFFFFFFFFFFF01280148010A14089401100018FFFFFFFFFFFFFFFFFF01280148010A14089501100018FFFFFFFFFFFFFFFFFF01280148010A14089601100018FFFFFFFFFFFFFFFFFF01280148010A14089701100018FFFFFFFFFFFFFFFFFF01280148010A14089801100018FFFFFFFFFFFFFFFFFF01280148010A14089901100018FFFFFFFFFFFFFFFFFF01280148010A14089A01100018FFFFFFFFFFFFFFFFFF01280148010A14089B01100018FFFFFFFFFFFFFFFFFF01280148010A14089C01100018FFFFFFFFFFFFFFFFFF01280148010A14089D01100018FFFFFFFFFFFFFFFFFF01280148010A14089E01100018FFFFFFFFFFFFFFFFFF01280148010A14089F01100018FFFFFFFFFFFFFFFFFF01280148010A1408A001100018FFFFFFFFFFFFFFFFFF01280148010A1408A101100018FFFFFFFFFFFFFFFFFF01280148010A1408A201100018FFFFFFFFFFFFFFFFFF01280148010A1408A301100018FFFFFFFFFFFFFFFFFF01280148010A1408A401100018FFFFFFFFFFFFFFFFFF01280148010A1408A501100018FFFFFFFFFFFFFFFFFF01280148010A1408A601100018FFFFFFFFFFFFFFFFFF01280148010A1408A701100018FFFFFFFFFFFFFFFFFF01280148010A1408A801100018FFFFFFFFFFFFFFFFFF01280148010A1408A901100018FFFFFFFFFFFFFFFFFF01280148010A1408AA01100018FFFFFFFFFFFFFFFFFF01280148010A1408AB01100018FFFFFFFFFFFFFFFFFF01280148010A1408AC01100018FFFFFFFFFFFFFFFFFF01280148010A1408AD01100018FFFFFFFFFFFFFFFFFF01280148010A1408AE01100018FFFFFFFFFFFFFFFFFF01280148010A1408AF01100018FFFFFFFFFFFFFFFFFF01280148010A1408B001100018FFFFFFFFFFFFFFFFFF01280148010A1408B101100018FFFFFFFFFFFFFFFFFF01280148010A1408B201100018FFFFFFFFFFFFFFFFFF01280148010A1408B301100018FFFFFFFFFFFFFFFFFF01280148010A1408B401100018FFFFFFFFFFFFFFFFFF01280148010A1408B501100018FFFFFFFFFFFFFFFFFF01280148010A1408B601100018FFFFFFFFFFFFFFFFFF01280148010A1408B701100018FFFFFFFFFFFFFFFFFF01280148010A1408B801100018FFFFFFFFFFFFFFFFFF01280148010A1408B901100018FFFFFFFFFFFFFFFFFF01280148010A1408BA01100018FFFFFFFFFFFFFFFFFF01280148010A1408BB01100018FFFFFFFFFFFFFFFFFF01280148010A1408BC01100018FFFFFFFFFFFFFFFFFF01280148010A1408BD01100018FFFFFFFFFFFFFFFFFF01280148010A1408BE01100018FFFFFFFFFFFFFFFFFF01280148010A1408BF01100018FFFFFFFFFFFFFFFFFF01280148010A1408C001100018FFFFFFFFFFFFFFFFFF01280148010A1408C101100018FFFFFFFFFFFFFFFFFF01280148010A1408C201100018FFFFFFFFFFFFFFFFFF01280148010A1408C301100018FFFFFFFFFFFFFFFFFF01280148010A1408C401100018FFFFFFFFFFFFFFFFFF01280148010A1408C501100018FFFFFFFFFFFFFFFFFF01280148010A1408C601100018FFFFFFFFFFFFFFFFFF01280148010A1408C701100018FFFFFFFFFFFFFFFFFF01280148010A1408C801100018FFFFFFFFFFFFFFFFFF01280148010A1408C901100018FFFFFFFFFFFFFFFFFF01280148010A1408CA01100018FFFFFFFFFFFFFFFFFF01280148010A1408CB01100018FFFFFFFFFFFFFFFFFF01280148010A1408CD01100018FFFFFFFFFFFFFFFFFF01280148010A1408CE01100018FFFFFFFFFFFFFFFFFF01280148010A1408CF01100018FFFFFFFFFFFFFFFFFF01280148010A1408D001100018FFFFFFFFFFFFFFFFFF01280148010A1408D101100018FFFFFFFFFFFFFFFFFF01280148010A1408D201100018FFFFFFFFFFFFFFFFFF01280148010A1408D301100018FFFFFFFFFFFFFFFFFF01280148010A1408D401100018FFFFFFFFFFFFFFFFFF01280148010A1408D501100018FFFFFFFFFFFFFFFFFF01280148010A1408D701100018FFFFFFFFFFFFFFFFFF01280148010A1408DA01100018FFFFFFFFFFFFFFFFFF01280148010A1408DC01100018FFFFFFFFFFFFFFFFFF01280148010A1408DD01100018FFFFFFFFFFFFFFFFFF01280148010A1408E801100018FFFFFFFFFFFFFFFFFF01280148010A1408E901100018FFFFFFFFFFFFFFFFFF01280148010A1408EA01100018FFFFFFFFFFFFFFFFFF01280148010A1408EB01100018FFFFFFFFFFFFFFFFFF01280148010A1408EC01100018FFFFFFFFFFFFFFFFFF01280148010A1408ED01100018FFFFFFFFFFFFFFFFFF01280148010A1408EE01100018FFFFFFFFFFFFFFFFFF01280148010A1408EF01100018FFFFFFFFFFFFFFFFFF01280148010A14088402100018FFFFFFFFFFFFFFFFFF01280148010A14088502100018FFFFFFFFFFFFFFFFFF01280148010A14088602100018FFFFFFFFFFFFFFFFFF01280148010A14088702100018FFFFFFFFFFFFFFFFFF01280148010A14088802100018FFFFFFFFFFFFFFFFFF01280148010A14088902100018FFFFFFFFFFFFFFFFFF01280148010A14088A02100018FFFFFFFFFFFFFFFFFF01280148010A14088B02100018FFFFFFFFFFFFFFFFFF01280148010A14088C02100018FFFFFFFFFFFFFFFFFF01280148010A14088D02100018FFFFFFFFFFFFFFFFFF01280148010A14088E02100018FFFFFFFFFFFFFFFFFF01280148010A14088F02100018FFFFFFFFFFFFFFFFFF01280148010A14089002100018FFFFFFFFFFFFFFFFFF01280148010A14089102100018FFFFFFFFFFFFFFFFFF01280148010A14089202100018FFFFFFFFFFFFFFFFFF01280148010A14089302100018FFFFFFFFFFFFFFFFFF01280148010A14089402100018FFFFFFFFFFFFFFFFFF01280148010A14089502100018FFFFFFFFFFFFFFFFFF01280148010A14089602100018FFFFFFFFFFFFFFFFFF01280148010A14089702100018FFFFFFFFFFFFFFFFFF01280148010A14089802100018FFFFFFFFFFFFFFFFFF01280148010A14089902100018FFFFFFFFFFFFFFFFFF01280148010A14089A02100018FFFFFFFFFFFFFFFFFF01280148010A14089B02100018FFFFFFFFFFFFFFFFFF01280148010A14089C02100018FFFFFFFFFFFFFFFFFF01280148010A1408A102100018FFFFFFFFFFFFFFFFFF01280148010A1408A202100018FFFFFFFFFFFFFFFFFF01280148010A1408A302100018FFFFFFFFFFFFFFFFFF01280148010A1408A402100018FFFFFFFFFFFFFFFFFF01280148010A1408A502100018FFFFFFFFFFFFFFFFFF01280148010A1408A602100018FFFFFFFFFFFFFFFFFF01280148010A1408A702100018FFFFFFFFFFFFFFFFFF01280148010A1408A802100018FFFFFFFFFFFFFFFFFF01280148010A1408A902100018FFFFFFFFFFFFFFFFFF01280148010A1408AA02100018FFFFFFFFFFFFFFFFFF01280148010A1408AB02100018FFFFFFFFFFFFFFFFFF01280148010A1408AC02100018FFFFFFFFFFFFFFFFFF01280148010A1408AD02100018FFFFFFFFFFFFFFFFFF01280148010A1408AE02100018FFFFFFFFFFFFFFFFFF01280148010A1408AF02100018FFFFFFFFFFFFFFFFFF01280148010A1408B002100018FFFFFFFFFFFFFFFFFF01280148010A1408B102100018FFFFFFFFFFFFFFFFFF01280148010A1408B202100018FFFFFFFFFFFFFFFFFF01280148010A1408B302100018FFFFFFFFFFFFFFFFFF01280148010A1408B402100018FFFFFFFFFFFFFFFFFF01280148010A1408B502100018FFFFFFFFFFFFFFFFFF01280148010A1408B602100018FFFFFFFFFFFFFFFFFF01280148010A1408B702100018FFFFFFFFFFFFFFFFFF01280148010A1408B802100018FFFFFFFFFFFFFFFFFF01280148010A1408B902100018FFFFFFFFFFFFFFFFFF01280148010A1408BA02100018FFFFFFFFFFFFFFFFFF01280148010A1408BB02100018FFFFFFFFFFFFFFFFFF01280148010A1408BC02100018FFFFFFFFFFFFFFFFFF01280148010A1408BD02100018FFFFFFFFFFFFFFFFFF01280148010A1408BE02100018FFFFFFFFFFFFFFFFFF01280148010A1408BF02100018FFFFFFFFFFFFFFFFFF01280148010A1408C002100018FFFFFFFFFFFFFFFFFF01280148010A1408C102100018FFFFFFFFFFFFFFFFFF01280148010A1408C202100018FFFFFFFFFFFFFFFFFF01280148010A1408C302100018FFFFFFFFFFFFFFFFFF01280148010A1408C402100018FFFFFFFFFFFFFFFFFF01280148010A1408C502100018FFFFFFFFFFFFFFFFFF01280148010A1408C602100018FFFFFFFFFFFFFFFFFF01280148010A1408C702100018FFFFFFFFFFFFFFFFFF01280148010A1408C802100018FFFFFFFFFFFFFFFFFF01280148010A1408C902100018FFFFFFFFFFFFFFFFFF01280148010A1408CA02100018FFFFFFFFFFFFFFFFFF01280148010A1408CB02100018FFFFFFFFFFFFFFFFFF01280148010A1408CC02100018FFFFFFFFFFFFFFFFFF01280148010A1408CD02100018FFFFFFFFFFFFFFFFFF01280148010A1408CE02100018FFFFFFFFFFFFFFFFFF01280148010A1408CF02100018FFFFFFFFFFFFFFFFFF01280148010A1408D002100018FFFFFFFFFFFFFFFFFF01280148010A1408D102100018FFFFFFFFFFFFFFFFFF01280148010A1408D202100018FFFFFFFFFFFFFFFFFF012801480122130A0C6D6573736167655F73697A65120318942F2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(b.length)
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, b));
-    }
-
-    private void parseGetBattlePayStatus(ClientRequestBody body) {
-        log.info("parseGetBattlePayStatus: got");
-    }
-
     private void parseSetOptions(ClientRequestBody body) throws InvalidProtocolBufferException {
         Protocol.SetOptions setOptions = Protocol.SetOptions.parseFrom(body.getBody());
-        log.info("parseSetOptions: {}", setOptions);
+        log.info("parseSetOptions: got");
     }
 
     private void parseSendUnsubcribeRequest(ClientRequestBody body) {
@@ -1221,215 +1078,103 @@ public class GameUtilitiesProcessor extends Processor {
                 .build();
     }
 
+    private Protocol.GenericResponse.Builder generateGenericResponse(int type) {
+        return Protocol.GenericResponse.newBuilder()
+                .setRequestId(type)
+                .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS);
+    }
+
+    private void generateBasicNotification(int type, TcpConnection conn) throws Exception {
+        sendNotificationWithResponse(generateGenericResponse(type).build(), conn);
+    }
+
+    private void generateNotificationWithSubId(int type, int subId, TcpConnection conn) throws Exception {
+        sendNotificationWithResponse(generateGenericResponse(type).setRequestSubId(subId).build(), conn);
+    }
+
+    private void sendNotificationWithResponse(Protocol.GenericResponse gr, TcpConnection conn) throws Exception {
+        Protocol.Notification n = generateNotification(326, gr.toByteString(), gr.getSerializedSize());
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
+
+    private void generateBunchOfNotificationsWithSubId(int type, ClientRequestBody body, TcpConnection conn) throws InvalidProtocolBufferException {
+        Protocol.GenericRequestList genericRequestList = Protocol.GenericRequestList.parseFrom(body.getBody());
+        genericRequestList.getRequestsList().forEach(gr -> {
+            try {
+                this.generateNotificationWithSubId(type, gr.getRequestSubId(), conn);
+            } catch (Exception e) {
+                log.error(e.getMessage());
+            }
+        });
+    }
+
     private void processClientRequest(BattleNetPacket packet, TcpConnection conn) throws Exception {
         Protocol.ClientRequest cr = Protocol.ClientRequest.parseFrom(packet.getBody());
 
-        var p = parseClientRequest(cr);
-
-        //log.info("processClientRequest: {}, token={}", p, packet.getHeader().getToken());
-        log.info("processClientRequest: token={}", packet.getHeader().getToken());
+        ClientRequestBody p = parseClientRequest(cr);
         int type = p != null ? p.getType() : 0;
         switch(type) {
             case 201 -> parseRequestNetCacheObject(packet.getHeader().getToken(), p, conn);
             case 327 -> parseRequestNetCacheObjectList(packet.getHeader().getToken(), p, conn);
-            case 314 -> parseSubscriptionRequest(packet, conn);
+            case 314 -> parseSubscriptionRequest(p, packet.getHeader().getToken(), conn);
             case 303 -> parseGetAssetsVersion(packet, conn);
             case 267 -> parseCheckAccountLicenses(packet, conn);
             case 205 -> parseUpdateLogin(packet, conn);
             case 276 -> parseCheckGameLicenses(packet, conn);
             case 305 -> parseGetAdventureProgress(packet, conn);
-            case 237 -> parseGetBattlePayConfig(p);
-            case 253 -> parseGetAchieves(packet.getHeader().getToken(), p, conn);
-            case 255 -> parseGetBattlePayStatus(p);
+            case 237 -> parseGetBattlePayConfig(conn);
+            case 253 -> parseGetAchieves(packet.getHeader().getToken(), conn);
+            case 255 -> parseGetBattlePayStatus(packet.getHeader().getToken(), conn);
             case 239 -> parseSetOptions(p);
             case 329 -> parseSendUnsubcribeRequest(p);
             default -> log.warn("Unknown ClientRequest type #{}", p.getType());
         }
 
-        if( packet.getHeader().getToken() == 17 ) {
-            Protocol.Header header = Processor.generateResponse(Util.hexStringToByteArray("0A090A026964120318BB020A180A0570726F746F120F320D081E18AC0220002800300F4078").length, packet.getHeader().getToken(), 0, 0);
 
-            conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318BB020A180A0570726F746F120F320D081E18AC0220002800300F4078")));
-        } else if( packet.getHeader().getToken() == 24 ) {
-
-            byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702");
-
-            Protocol.Header header = Processor.generateResponse(b.length, packet.getHeader().getToken(), 0, 0);
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180422120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
+        if( type != 314 && type != 255 ) {
+            Protocol.GenericResponse genericResponse = Protocol.GenericResponse
+                    .newBuilder()
+                    .setRequestId(type)
+                    .setResultCode(Protocol.GenericResponse.Result.RESULT_REQUEST_IN_PROCESS)
                     .build();
 
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181722120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
+            Protocol.ClientResponse clResponse = Protocol.ClientResponse.newBuilder()
+                    .addAttribute(Protocol.Attribute.newBuilder()
+                            .setName("id")
+                            .setValue(Protocol.Variant.newBuilder()
+                                    .setIntValue(326)
+                            ))
+                    .addAttribute(Protocol.Attribute.newBuilder()
+                            .setName("proto")
+                            .setValue(Protocol.Variant.newBuilder()
+                                    .setBlobValue(genericResponse.toByteString())
+                            ))
                     .build();
 
-            conn.send(new BattleNetPacket(header, b));
+            Protocol.Header header = Processor.generateResponse(clResponse.getSerializedSize(), packet.getHeader().getToken(), 0, 0);
+            conn.send(new BattleNetPacket(header, clResponse.toByteArray()));
+        }
 
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181322120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
+        switch(type) {
+            case 201 -> generateNotificationWithSubId(type, Protocol.UtilGenericRequest.parseFrom(p.getBody()).getRequestSubId(), conn);
+            case 327 -> generateBunchOfNotificationsWithSubId(type, p, conn);
+            default -> generateBasicNotification(type, conn);
+        }
 
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180822120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181422120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181B22120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180722120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181C22120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181522120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-        } else if( packet.getHeader().getToken() == 25 ) {
-            byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110ED01");
-
-            Protocol.Header header = Processor.generateResponse(b.length, packet.getHeader().getToken(), 0, 0);
-
-            conn.send(new BattleNetPacket(header, b));
-        } else if( packet.getHeader().getToken() == 27 ) {
-           // Achieves
-        } else if( packet.getHeader().getToken() == 28 ) {
-            byte[] b = Util.hexStringToByteArray("0A090A02696412031889020A0F0A0570726F746F1206320408002001");
-
-            Protocol.Header header = Processor.generateResponse(b.length, packet.getHeader().getToken(), 0, 0);
-
-            conn.send(new BattleNetPacket(header, b));
-
-            Protocol.GuardianVars guardianVars = Protocol.GuardianVars.newBuilder()
-                    .setShowUserUi(1)
-                    .setClientOptionsUpdateIntervalSeconds(300)
-                    .build();
-
-            Protocol.Notification n = generateNotification(264, guardianVars.toByteString(), guardianVars.getSerializedSize());
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setStatus(0)
-                    .setObjectId(0)
-                    .setSize(n.getSerializedSize())
-                    .build();
-
-            conn.send(new BattleNetPacket(header, n.toByteArray()));
-        } else if( packet.getHeader().getToken() == 29 ) {
-            byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702");
-
-            Protocol.Header header = Processor.generateResponse(29, packet.getHeader().getToken(), 0, 0);
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901180C22120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-        } else if( packet.getHeader().getToken() == 30 ) {
+        if( packet.getHeader().getToken() == 28 ) {
             Protocol.Header header = Processor.generateResponse(0, packet.getHeader().getToken(), 0, 0);
 
-            conn.send(new BattleNetPacket(header, new byte[0]));
+          //  conn.send(new BattleNetPacket(header, new byte[0]));
 
             byte[] b = Util.hexStringToByteArray("1252AA064F0A12094743545702000002116739AB040000000012190A170A0A08CE840110021809200012091884B6DAFCCEBDCC02121E0A1C0A0A08CE8401100218082000120E3A0C0D4743545715746174731804");
 
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java b/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java
index 0939300..fcba44f 100644
--- a/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/PresenceProcessor.java
@@ -45,7 +45,8 @@ public class PresenceProcessor extends Processor {
                     // FIRST
                     /*Protocol.AddNotification addNotification = Protocol.AddNotification.parseFrom(Util.hexStringToByteArray("1A71AA066E0A120900000000000000011193710E1A0000000012190A170A0A08CE84011001180620001209189AB1D8B499BCCC02121A0A180A0A08CE8401100118012000120A2A086A6F686E20626F6E12210A1F0A0A08CE840110011804200012112A0F517569726B794F7263233239363838"));
                     System.out.println(addNotification);*/
-                    System.out.println(Util.bytesToHex(bb));
+
+                    //System.out.println(Util.bytesToHex(bb));
 
                     conn.send(new BattleNetPacket(header, bb));
 
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/BattlePayConfig.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/BattlePayConfig.java
new file mode 100644
index 0000000..dc239ad
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/BattlePayConfig.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class BattlePayConfig extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 237;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/CheckAccountLicenses.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/CheckAccountLicenses.java
new file mode 100644
index 0000000..12e08a9
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/CheckAccountLicenses.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class CheckAccountLicenses extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 267;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/CheckGameLicenses.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/CheckGameLicenses.java
new file mode 100644
index 0000000..bf78c2a
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/CheckGameLicenses.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class CheckGameLicenses extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 276;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/ClientRequestParser.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/ClientRequestParser.java
new file mode 100644
index 0000000..7fabec6
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/ClientRequestParser.java
@@ -0,0 +1,14 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+public abstract class ClientRequestParser {
+
+    public abstract void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn);
+
+    public abstract int getId();
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetAchieves.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetAchieves.java
new file mode 100644
index 0000000..c0b3648
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetAchieves.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class GetAchieves extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 253;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetAdventureProgress.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetAdventureProgress.java
new file mode 100644
index 0000000..f4796f9
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetAdventureProgress.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class GetAdventureProgress extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 305;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetAssetsVersion.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetAssetsVersion.java
new file mode 100644
index 0000000..a3f894f
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetAssetsVersion.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class GetAssetsVersion extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 303;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetBattlePayStatus.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetBattlePayStatus.java
new file mode 100644
index 0000000..213f238
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/GetBattlePayStatus.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class GetBattlePayStatus extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 255;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/NetCacheObject.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/NetCacheObject.java
new file mode 100644
index 0000000..b665135
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/NetCacheObject.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class NetCacheObject extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 201;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/NetCacheObjectList.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/NetCacheObjectList.java
new file mode 100644
index 0000000..19b7e4f
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/NetCacheObjectList.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class NetCacheObjectList extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 327;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/SendUnsubcribeRequest.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/SendUnsubcribeRequest.java
new file mode 100644
index 0000000..a9aacec
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/SendUnsubcribeRequest.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class SendUnsubcribeRequest extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 329;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/SetOptions.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/SetOptions.java
new file mode 100644
index 0000000..74e55eb
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/SetOptions.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class SetOptions extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 239;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/SubscriptionRequest.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/SubscriptionRequest.java
new file mode 100644
index 0000000..e176776
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/SubscriptionRequest.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class SubscriptionRequest extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 314;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/UpdateLogin.java b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/UpdateLogin.java
new file mode 100644
index 0000000..abb95d1
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/client/request/UpdateLogin.java
@@ -0,0 +1,17 @@
+package com.alterdekim.hearthhack.component.processor.client.request;
+
+import com.alterdekim.hearthhack.component.TcpConnection;
+import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.ClientRequestBody;
+
+public class UpdateLogin extends ClientRequestParser {
+    @Override
+    public void parse(BattleNetPacket packet, ClientRequestBody body, TcpConnection conn) {
+
+    }
+
+    @Override
+    public int getId() {
+        return 205;
+    }
+}
diff --git a/src/main/java/com/alterdekim/hearthhack/util/ClientRequestBody.java b/src/main/java/com/alterdekim/hearthhack/util/ClientRequestBody.java
index 0bbf96b..b7f1d42 100644
--- a/src/main/java/com/alterdekim/hearthhack/util/ClientRequestBody.java
+++ b/src/main/java/com/alterdekim/hearthhack/util/ClientRequestBody.java
@@ -8,4 +8,5 @@ public class ClientRequestBody {
     private int sendCount;
     private byte[] body;
     private int type;
+    private long route;
 }
\ No newline at end of file
diff --git a/src/main/java/com/alterdekim/hearthhack/util/PegasusPacket.java b/src/main/java/com/alterdekim/hearthhack/util/PegasusPacket.java
index 6772666..cf68bb2 100644
--- a/src/main/java/com/alterdekim/hearthhack/util/PegasusPacket.java
+++ b/src/main/java/com/alterdekim/hearthhack/util/PegasusPacket.java
@@ -79,7 +79,7 @@ public class PegasusPacket {
         return num2;
     }
 
-    /*public byte[] Encode() {
+   /* public byte[] Encode() {
         if (this.body instanceof GeneratedMessageV3) {
             GeneratedMessageV3 protoBuf = (GeneratedMessageV3) this.body;
             this.size = (int) protoBuf.GetSerializedSize();
diff --git a/src/main/java/com/alterdekim/hearthhack/util/Util.java b/src/main/java/com/alterdekim/hearthhack/util/Util.java
index d6955f2..40176e8 100644
--- a/src/main/java/com/alterdekim/hearthhack/util/Util.java
+++ b/src/main/java/com/alterdekim/hearthhack/util/Util.java
@@ -1,7 +1,6 @@
 package com.alterdekim.hearthhack.util;
 
-import com.google.protobuf.MessageOrBuilder;
-import com.google.protobuf.util.JsonFormat;
+import lombok.extern.slf4j.Slf4j;
 import org.bouncycastle.cert.X509CertificateHolder;
 import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
@@ -14,13 +13,13 @@ import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder;
 
 import javax.net.ssl.*;
 import java.io.FileReader;
-import java.io.IOException;
 import java.security.KeyPair;
 import java.security.KeyStore;
 import java.security.Security;
 import java.security.cert.Certificate;
 import java.security.cert.X509Certificate;
 
+@Slf4j
 public class Util {
 
     private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
@@ -139,7 +138,14 @@ public class Util {
         return s.length() % 2 == 0 ? s : "0" + s;
     }
 
-    public static String prototoJson(MessageOrBuilder messageOrBuilder) throws IOException {
-        return JsonFormat.printer().print(messageOrBuilder);
+    public static void setTimeout(Runnable runnable, int delay) {
+        new Thread(() -> {
+            try {
+                Thread.sleep(delay);
+                runnable.run();
+            } catch (Exception e){
+                log.error(e.getMessage());
+            }
+        }).start();
     }
 }
diff --git a/src/main/proto/bnet/protocol/protocol.proto b/src/main/proto/bnet/protocol/protocol.proto
index 8fbd476..9c83285 100644
--- a/src/main/proto/bnet/protocol/protocol.proto
+++ b/src/main/proto/bnet/protocol/protocol.proto
@@ -3038,4 +3038,139 @@ message RewardChest {
 	optional RewardBag bag3 = 3;
 	optional RewardBag bag4 = 4;
 	optional RewardBag bag5 = 5;
+}
+
+// ref: PegasusUtil.BattlePayConfigResponse
+message BattlePayConfigResponse {
+	// ref: PegasusUtil.BattlePayConfigResponse/PacketID
+	enum PacketID {
+		ID = 238;
+	}
+
+	repeated Bundle bundles = 1;
+	optional int32 currency = 2;
+	optional bool unavailable = 4;
+	optional int32 secs_before_auto_cancel = 5;
+	repeated GoldCostBooster gold_cost_boosters = 6;
+	optional int64 gold_cost_arena = 7;
+}
+
+// ref: PegasusUtil.GoldCostBooster
+message GoldCostBooster {
+	required int64 cost = 1;
+	required int32 pack_type = 2;
+	optional string buy_with_gold_event_name = 3;
+}
+
+// ref: PegasusUtil.Bundle
+message Bundle {
+	required string id = 1;
+	optional double cost = 2;
+	optional string apple_id = 3;
+	optional string google_play_id = 4;
+	repeated BundleItem items = 5;
+	optional int64 gold_cost = 6;
+	optional string amazon_id = 7;
+	optional string product_event_name = 9;
+	repeated BattlePayProvider exclusive_providers = 10;
+	optional string real_money_product_event_name = 11;
+}
+
+// ref: PegasusUtil.BundleItem
+message BundleItem {
+	required ProductType product_type = 1;
+	required int32 data = 2;
+	required int32 quantity = 3;
+}
+
+// ref: PegasusUtil.ProductType
+enum ProductType {
+	PRODUCT_TYPE_UNKNOWN = 0;
+	PRODUCT_TYPE_BOOSTER = 1;
+	PRODUCT_TYPE_DRAFT = 2;
+	PRODUCT_TYPE_NAXX = 3;
+	PRODUCT_TYPE_BRM = 4;
+	PRODUCT_TYPE_CARD_BACK = 5;
+	PRODUCT_TYPE_HERO = 6;
+	PRODUCT_TYPE_LOE = 7;
+}
+
+// ref: PegasusShared.BattlePayProvider
+enum BattlePayProvider {
+	BP_PROVIDER_BLIZZARD = 1;
+	BP_PROVIDER_APPLE = 2;
+	BP_PROVIDER_GOOGLE_PLAY = 3;
+	BP_PROVIDER_AMAZON = 4;
+}
+
+// ref: PegasusUtil.BattlePayStatusResponse
+message BattlePayStatusResponse {
+	// ref: PegasusUtil.BattlePayStatusResponse/PacketID
+	enum PacketID {
+		ID = 265;
+	}
+
+	// ref: PegasusUtil.BattlePayStatusResponse/PurchaseState
+	enum PurchaseState {
+		PS_READY = 0;
+		PS_CHECK_RESULTS = 1;
+		PS_ERROR = 2;
+	}
+
+	required PurchaseState status = 1;
+	optional string product_id = 2;
+	optional PurchaseError purchase_error = 3;
+	required bool battle_pay_available = 4;
+	optional int64 transaction_id = 5;
+	optional string third_party_id = 6;
+	optional int32 currency = 7;
+	optional BattlePayProvider provider = 8 [default = BP_PROVIDER_BLIZZARD];
+}
+
+// ref: PegasusUtil.PurchaseError
+message PurchaseError {
+	// ref: PegasusUtil.PurchaseError/Error
+	enum Error {
+		E_UNKNOWN = -1;
+		E_SUCCESS = 0;
+		E_STILL_IN_PROGRESS = 1;
+		E_INVALID_BNET = 2;
+		E_SERVICE_NA = 3;
+		E_PURCHASE_IN_PROGRESS = 4;
+		E_DATABASE = 5;
+		E_INVALID_QUANTITY = 6;
+		E_DUPLICATE_LICENSE = 7;
+		E_REQUEST_NOT_SENT = 8;
+		E_NO_ACTIVE_BPAY = 9;
+		E_FAILED_RISK = 10;
+		E_CANCELED = 11;
+		E_WAIT_MOP = 12;
+		E_WAIT_CLIENT_CONFIRM = 13;
+		E_WAIT_CLIENT_RISK = 14;
+		E_PRODUCT_NA = 15;
+		E_RISK_TIMEOUT = 16;
+		E_PRODUCT_ALREADY_OWNED = 17;
+		E_WAIT_THIRD_PARTY_RECEIPT = 18;
+		E_PRODUCT_EVENT_HAS_ENDED = 19;
+		E_BP_GENERIC_FAIL = 100;
+		E_BP_INVALID_CC_EXPIRY = 101;
+		E_BP_RISK_ERROR = 102;
+		E_BP_NO_VALID_PAYMENT = 103;
+		E_BP_PAYMENT_AUTH = 104;
+		E_BP_PROVIDER_DENIED = 105;
+		E_BP_PURCHASE_BAN = 106;
+		E_BP_SPENDING_LIMIT = 107;
+		E_BP_PARENTAL_CONTROL = 108;
+		E_BP_THROTTLED = 109;
+		E_BP_THIRD_PARTY_BAD_RECEIPT = 110;
+		E_BP_THIRD_PARTY_RECEIPT_USED = 111;
+		E_BP_PRODUCT_UNIQUENESS_VIOLATED = 112;
+		E_BP_REGION_IS_DOWN = 113;
+		E_BP_GENERIC_FAIL_RETRY_CONTACT_CS_IF_PERSISTS = 115;
+		E_BP_CHALLENGE_ID_FAILED_VERIFICATION = 116;
+	}
+
+	required Error error = 1;
+	optional string purchase_in_progress = 2;
+	optional string error_code = 3;
 }
\ No newline at end of file