Changing encryption in the phone app of the fourth benchmark from AES-ECB to AES...
authorrtrimana <rtrimana@uci.edu>
Tue, 10 Oct 2017 17:54:52 +0000 (10:54 -0700)
committerrtrimana <rtrimana@uci.edu>
Tue, 10 Oct 2017 17:54:52 +0000 (10:54 -0700)
benchmarks/other/PhoneInterface/Control/.idea/misc.xml
benchmarks/other/PhoneInterface/Control/app/src/main/java/com/example/ali/control/MainActivity.java
benchmarks/other/PhoneInterface/Control/app/src/main/java/iotcloud/Abort.java
benchmarks/other/PhoneInterface/Control/app/src/main/java/iotcloud/CloudComm.java
benchmarks/other/PhoneInterface/Control/app/src/main/java/iotcloud/Slot.java
benchmarks/other/PhoneInterface/Control/app/src/main/java/iotcloud/Table.java
benchmarks/other/PhoneInterface/Control/app/src/main/java/iotcloud/TableStatus.java
others/lede-gui/.idea/misc.xml
others/lede-gui/.idea/workspace.xml
others/lede-gui/lede-gui.iml

index fbb6828..5d19981 100644 (file)
@@ -37,7 +37,7 @@
     <ConfirmationsSetting value="0" id="Add" />
     <ConfirmationsSetting value="0" id="Remove" />
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   <component name="ProjectType">
index c1fb208..a2b0c6a 100644 (file)
@@ -102,19 +102,20 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
 
-            try {
-                Log.e("Ali::::", "Here1");
-                t1 = new Table(CLOUD_SERVER, PASSWORD, LOCAL_MACHINE_ID, LISTENING_PORT, MainActivity.this);
-                Log.e("Ali::::", "Here2");
-                t1.rebuild(); // update
-                Log.e("Ali::::", "Here3");
-
-            } catch (Exception e) {
-
-                StringWriter sw = new StringWriter();
-                PrintWriter pw = new PrintWriter(sw);
-                e.printStackTrace(pw);
-                Log.e("ALI::::", sw.toString());
+        try {
+            Log.e("Ali::::", "Here1");
+            t1 = new Table(CLOUD_SERVER, PASSWORD, LOCAL_MACHINE_ID, LISTENING_PORT, MainActivity.this);
+            Log.e("Ali::::", "Here2");
+            //t1.initTable();
+            t1.rebuild(); // update
+            Log.e("Ali::::", "Here3");
+
+        } catch (Exception e) {
+
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            e.printStackTrace(pw);
+            Log.e("ALI::::", sw.toString());
 
         }
         // TextViews
index f053faf..7cafe43 100644 (file)
@@ -103,8 +103,10 @@ class Abort extends Entry {
                bb.putLong(arbitratorLocalSequenceNumber);
        }
 
-       //public int getSize() { return (6 * Long.BYTES) + Byte.BYTES; }
-       public int getSize() { return (6 * Long.SIZE/8) + (Byte.SIZE/8); }
+       public int getSize() {
+               //return (6 * Long.BYTES) + Byte.BYTES;
+               return (6 * Long.SIZE/8) + Byte.SIZE/8;
+       }
 
        public byte getType() {
                return Entry.TypeAbort;
index 4f51e5c..e78cae5 100644 (file)
@@ -13,6 +13,8 @@ import org.spongycastle.crypto.digests.SHA256Digest;
 import org.spongycastle.crypto.params.KeyParameter;
 import org.spongycastle.crypto.PBEParametersGenerator;
 import android.content.*;
+import java.nio.ByteBuffer;
+
 
 /**
  * This class provides a communication API to the webserver.  It also
@@ -25,13 +27,13 @@ import android.content.*;
 class CloudComm {
        private static final int SALT_SIZE = 8;
        private static final int TIMEOUT_MILLIS = 2000; // 100
+       public static final int IV_SIZE = 16;
 
        /** Sets the size for the HMAC. */
        static final int HMAC_SIZE = 32;
 
        private String baseurl;
-       private Cipher encryptCipher;
-       private Cipher decryptCipher;
+       private SecretKeySpec key;
        private Mac mac;
        private String password;
        private SecureRandom random;
@@ -272,6 +274,9 @@ class CloudComm {
                initCrypt();
        }
 
+       /**
+        * Inits the HMAC generator.
+        */
        /**
         * Inits the HMAC generator.
         */
@@ -282,20 +287,17 @@ class CloudComm {
                }
 
                try {
-                       SecretKeySpec key = initKey();
+                       key = initKey();
                        password = null; // drop password
                        mac = Mac.getInstance("HmacSHA256");
                        mac.init(key);
-                       encryptCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
-                       encryptCipher.init(Cipher.ENCRYPT_MODE, key);
-                       decryptCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
-                       decryptCipher.init(Cipher.DECRYPT_MODE, key);
                } catch (Exception e) {
                        e.printStackTrace();
                        throw new Error("Failed To Initialize Ciphers");
                }
        }
 
+
        /*
         * Builds the URL for the given request.
         */
@@ -467,6 +469,67 @@ class CloudComm {
                }
        }
 
+
+       private byte[] createIV(long machineId, long localSequenceNumber) {
+               ByteBuffer buffer = ByteBuffer.allocate(IV_SIZE);
+               buffer.putLong(machineId);
+               long localSequenceNumberShifted = localSequenceNumber << 16;
+               buffer.putLong(localSequenceNumberShifted);
+               return buffer.array();
+
+       }
+
+       private byte[] encryptSlotAndPrependIV(byte[] rawData, byte[] ivBytes) {
+               try {
+                       ivBytes = new byte[IV_SIZE];
+                       IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
+                       //Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
+                       // We no longer need PKCS5Padding for CTR mode
+                       // There was a bug that the crypto library for Android that adds 16 more bytes into
+                       // the existing 2048 bytes after HMAC is calculated so that this causes HMAC mismatch
+                       // on the Java side that is expecting exactly 2048 bytes of padding.
+                       Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
+                       cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
+
+                       byte[] encryptedBytes = cipher.doFinal(rawData);
+                       byte[] bytes = new byte[encryptedBytes.length + IV_SIZE];
+                       System.arraycopy(ivBytes, 0, bytes, 0, ivBytes.length);
+                       System.arraycopy(encryptedBytes, 0, bytes, IV_SIZE, encryptedBytes.length);
+
+                       return bytes;
+
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       throw new Error("Failed To Encrypt");
+               }
+       }
+
+
+       private byte[] stripIVAndDecryptSlot(byte[] rawData) {
+               try {
+                       byte[] ivBytes = new byte[IV_SIZE];
+                       byte[] encryptedBytes = new byte[rawData.length - IV_SIZE];
+                       System.arraycopy(rawData, 0, ivBytes, 0, IV_SIZE);
+                       System.arraycopy(rawData, IV_SIZE, encryptedBytes, 0 , encryptedBytes.length);
+
+                       IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
+
+                       //Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
+                       // We no longer need PKCS5Padding for CTR mode
+                       // There was a bug that the crypto library for Android that adds 16 more bytes into
+                       // the existing 2048 bytes after HMAC is calculated so that this causes HMAC mismatch
+                       // on the Java side that is expecting exactly 2048 bytes of padding.
+                       Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
+                       cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
+
+                       return cipher.doFinal(encryptedBytes);
+
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       throw new Error("Failed To Decrypt");
+               }
+       }
+
        /*
         * API for putting a slot into the queue.  Returns null on success.
         * On failure, the server will send slots with newer sequence
@@ -484,12 +547,19 @@ class CloudComm {
                                }
                                initCrypt();
                        }
-
                        long sequencenumber = slot.getSequenceNumber();
-                       byte[] bytes = slot.encode(mac);
-                       bytes = encryptCipher.doFinal(bytes);
+                       byte[] slotBytes = slot.encode(mac);
+                       // slotBytes = encryptCipher.doFinal(slotBytes);
+
+                       // byte[] iVBytes = slot.getSlotCryptIV();
+
+                       // byte[] bytes = new byte[slotBytes.length + IV_SIZE];
+                       // System.arraycopy(iVBytes, 0, bytes, 0, iVBytes.length);
+                       // System.arraycopy(slotBytes, 0, bytes, IV_SIZE, slotBytes.length);
 
 
+                       byte[] bytes = encryptSlotAndPrependIV(slotBytes, slot.getSlotCryptIV());
+
 
 
                        url = buildRequest(true, sequencenumber, max);
@@ -640,10 +710,15 @@ class CloudComm {
 
                for (int i = 0; i < numberofslots; i++) {
 
-                       byte[] data = new byte[sizesofslots[i]];
-                       dis.readFully(data);
+                       byte[] rawData = new byte[sizesofslots[i]];
+                       dis.readFully(rawData);
+
+
+                       // byte[] data = new byte[rawData.length - IV_SIZE];
+                       // System.arraycopy(rawData, IV_SIZE, data, 0, data.length);
 
-                       data = decryptCipher.doFinal(data);
+
+                       byte[] data = stripIVAndDecryptSlot(rawData);
 
                        slots[i] = Slot.decode(table, data, mac);
 
@@ -653,7 +728,7 @@ class CloudComm {
                return slots;
        }
 
-       public byte[] sendLocalData(byte[] sendData, String host, int port) {
+       public byte[] sendLocalData(byte[] sendData, long localSequenceNumber, String host, int port) {
 
                if (salt == null) {
                        return null;
@@ -670,7 +745,12 @@ class CloudComm {
 
                        // Encrypt the data for sending
                        // byte[] encryptedData = encryptCipher.doFinal(totalData);
-                       byte[] encryptedData = encryptCipher.doFinal(totalData);
+//                     byte[] encryptedData = encryptCipher.doFinal(totalData);
+
+                       byte[] iv = createIV(table.getMachineId(), table.getLocalSequenceNumber());
+                       byte[] encryptedData = encryptSlotAndPrependIV(totalData, iv);
+
+
 
                        // Open a TCP socket connection to a local device
                        Socket socket = new Socket(host, port);
@@ -691,7 +771,8 @@ class CloudComm {
 
                        timer.endTime();
 
-                       returnData = decryptCipher.doFinal(returnData);
+//                     returnData = decryptCipher.doFinal(returnData);
+                       returnData = stripIVAndDecryptSlot(returnData);
 
                        // We are done with this socket
                        socket.close();
@@ -708,15 +789,9 @@ class CloudComm {
                        System.arraycopy(returnData, 0, returnData2, 0, returnData2.length);
 
                        return returnData2;
-               } catch (SocketTimeoutException e) {
-
-               } catch (BadPaddingException e) {
-
-               } catch (IllegalBlockSizeException e) {
-
-               } catch (UnknownHostException e) {
-
-               } catch (IOException e) {
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       // throw new Error("Local comms failure...");
 
                }
 
@@ -754,7 +829,9 @@ class CloudComm {
                                timer.endTime();
 
                                // Decrypt the data
-                               readData = decryptCipher.doFinal(readData);
+//                             readData = decryptCipher.doFinal(readData);
+                               readData = stripIVAndDecryptSlot(readData);
+
 
                                mac.update(readData, 0, readData.length - HMAC_SIZE);
                                byte[] genmac = mac.doFinal();
@@ -778,7 +855,9 @@ class CloudComm {
                                System.arraycopy(realmac, 0, totalData, sendData.length, realmac.length);
 
                                // Encrypt the data for sending
-                               byte[] encryptedData = encryptCipher.doFinal(totalData);
+//                             byte[] encryptedData = encryptCipher.doFinal(totalData);
+                               byte[] iv = createIV(table.getMachineId(), table.getLocalSequenceNumber());
+                               byte[] encryptedData = encryptSlotAndPrependIV(totalData, iv);
 
 
                                timer.startTime();
@@ -789,15 +868,9 @@ class CloudComm {
 
                                // close the socket
                                socket.close();
-                       } catch (SocketTimeoutException e) {
-
-                       } catch (BadPaddingException e) {
-
-                       } catch (IllegalBlockSizeException e) {
-
-                       } catch (UnknownHostException e) {
-
-                       } catch (IOException e) {
+                       } catch (Exception e) {
+                               e.printStackTrace();
+                               // throw new Error("Local comms failure...");
 
                        }
                }
index ded02ab..740de9c 100644 (file)
@@ -36,7 +36,9 @@ class Slot implements Liveness {
        /** Reference to Table */
        private Table table;
 
-       Slot(Table _table, long _seqnum, long _machineid, byte[] _prevhmac, byte[] _hmac) {
+       private long localSequenceNumber;
+
+       Slot(Table _table, long _seqnum, long _machineid, byte[] _prevhmac, byte[] _hmac, long _localSequenceNumber) {
                seqnum = _seqnum;
                machineid = _machineid;
                prevhmac = _prevhmac;
@@ -46,14 +48,15 @@ class Slot implements Liveness {
                seqnumlive = true;
                freespace = SLOT_SIZE - getBaseSize();
                table = _table;
+               localSequenceNumber = _localSequenceNumber;
        }
 
-       Slot(Table _table, long _seqnum, long _machineid, byte[] _prevhmac) {
-               this(_table, _seqnum, _machineid, _prevhmac, null);
+       Slot(Table _table, long _seqnum, long _machineid, byte[] _prevhmac, long _localSequenceNumber) {
+               this(_table, _seqnum, _machineid, _prevhmac, null, _localSequenceNumber);
        }
 
-       Slot(Table _table, long _seqnum, long _machineid) {
-               this(_table, _seqnum, _machineid, new byte[HMAC_SIZE], null);
+       Slot(Table _table, long _seqnum, long _machineid, long _localSequenceNumber) {
+               this(_table, _seqnum, _machineid, new byte[HMAC_SIZE], null, _localSequenceNumber);
        }
 
        byte[] getHMAC() {
@@ -112,7 +115,7 @@ class Slot implements Liveness {
                long seqnum = bb.getLong();
                long machineid = bb.getLong();
                int numentries = bb.getInt();
-               Slot slot = new Slot(table, seqnum, machineid, prevhmac, hmac);
+               Slot slot = new Slot(table, seqnum, machineid, prevhmac, hmac, -1);
 
                for (int i = 0; i < numentries; i++) {
                        slot.addShallowEntry(Entry.decode(slot, bb));
@@ -217,6 +220,14 @@ class Slot implements Liveness {
                return livecount > 0;
        }
 
+       public byte[] getSlotCryptIV() {
+               ByteBuffer buffer = ByteBuffer.allocate(CloudComm.IV_SIZE);
+               buffer.putLong(machineid);
+               long localSequenceNumberShift = localSequenceNumber << 16;
+               buffer.putLong(localSequenceNumberShift);
+               return buffer.array();
+       }
+
        public String toString() {
                return "<" + getSequenceNumber() + ">";
        }
index b9c3461..4007923 100644 (file)
@@ -45,6 +45,8 @@ final public class Table {
        private long oldestLiveSlotSequenceNumver = 0;  // Smallest sequence number of the slot with a live entry
        private long localMachineId = 0; // Machine ID of this client device
        private long sequenceNumber = 0; // Largest sequence number a client has received
+       private long localSequenceNumber = 0;
+
        // private int smallestTableStatusSeen = -1; // Smallest Table Status that was seen in the latest slots sent from the server
        // private int largestTableStatusSeen = -1; // Largest Table Status that was seen in the latest slots sent from the server
        private long localTransactionSequenceNumber = 0; // Local sequence number counter for transactions
@@ -167,14 +169,34 @@ final public class Table {
 
                int livec = 0;
                int deadc = 0;
+
+               int casdasd = 0;
+
+               int liveslo = 0;
+
                for (long i = o; i < (n + 1); i++) {
                        Slot s = buffer.getSlot(i);
 
+
+                       if (s.isLive()) {
+                               liveslo++;
+                       }
+
                        Vector<Entry> entries = s.getEntries();
 
                        for (Entry e : entries) {
                                if (e.isLive()) {
                                        int type = e.getType();
+
+
+                                       if (type == 6) {
+                                               RejectedMessage rej = (RejectedMessage)e;
+                                               casdasd++;
+
+                                               System.out.println(rej.getMachineID());
+                                       }
+
+
                                        types[type] = types[type] + 1;
                                        num++;
                                        livec++;
@@ -188,6 +210,8 @@ final public class Table {
                        System.out.println(i + "    " + types[i]);
                }
                System.out.println("Live count:   " + livec);
+               System.out.println("Live Slot count:   " + liveslo);
+
                System.out.println("Dead count:   " + deadc);
                System.out.println("Old:   " + o);
                System.out.println("New:   " + n);
@@ -221,7 +245,8 @@ final public class Table {
                cloud.initSecurity();
 
                // Create the first insertion into the block chain which is the table status
-               Slot s = new Slot(this, 1, localMachineId);
+               Slot s = new Slot(this, 1, localMachineId, localSequenceNumber);
+               localSequenceNumber++;
                TableStatus status = new TableStatus(s, numberOfSlots);
                s.addEntry(status);
                Slot[] array = cloud.putSlot(s, numberOfSlots);
@@ -245,6 +270,9 @@ final public class Table {
                // Just pull the latest slots from the server
                Slot[] newslots = cloud.getSlots(sequenceNumber + 1);
                validateAndUpdate(newslots, true);
+               sendToServer(null);
+               updateLiveTransactionsAndStatus();
+
        }
 
        // public String toString() {
@@ -382,6 +410,7 @@ final public class Table {
                        }
 
                        NewKey newKey = new NewKey(null, keyName, machineId);
+
                        if (sendToServer(newKey)) {
                                // If successfully inserted
                                return true;
@@ -497,6 +526,10 @@ final public class Table {
                bufferResizeThreshold = resizeLower - 1 + random.nextInt(numberOfSlots - resizeLower);
        }
 
+       public long getLocalSequenceNumber() {
+               return localSequenceNumber;
+       }
+
 
        boolean lastInsertedNewKey = false;
 
@@ -690,9 +723,11 @@ final public class Table {
                }
 
 
+
                try {
                        // While we have stuff that needs inserting into the block chain
                        while ((pendingTransactionQueue.size() > 0) || (pendingSendArbitrationRounds.size() > 0) || (newKey != null)) {
+
                                fromRetry = false;
 
                                if (hadPartialSendToServer) {
@@ -707,7 +742,8 @@ final public class Table {
                                }
 
                                // Create the slot
-                               Slot slot = new Slot(this, sequenceNumber + 1, localMachineId, buffer.getSlot(sequenceNumber).getHMAC());
+                               Slot slot = new Slot(this, sequenceNumber + 1, localMachineId, buffer.getSlot(sequenceNumber).getHMAC(), localSequenceNumber);
+                               localSequenceNumber++;
 
                                // Try to fill the slot with data
                                ThreeTuple<Boolean, Integer, Boolean> fillSlotsReturn = fillSlot(slot, false, newKey);
@@ -887,7 +923,7 @@ final public class Table {
 
                // Get the size of the send data
                //int sendDataSize = Integer.BYTES + Long.BYTES;
-               int sendDataSize = (Integer.SIZE + Long.SIZE)/8;
+               int sendDataSize = Integer.SIZE/8 + Long.SIZE/8;
 
                Long lastArbitrationDataLocalSequenceNumber = (long) - 1;
                if (lastArbitrationDataLocalSequenceNumberSeenFromArbitrator.get(machineId) != null) {
@@ -902,7 +938,8 @@ final public class Table {
                bbEncode.putInt(0);
 
                // Send by local
-               byte[] returnData = cloud.sendLocalData(sendData, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+               byte[] returnData = cloud.sendLocalData(sendData, localSequenceNumber, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+               localSequenceNumber++;
 
                if (returnData == null) {
                        // Could not contact server
@@ -941,7 +978,7 @@ final public class Table {
 
                // Get the size of the send data
                //int sendDataSize = Integer.BYTES + Long.BYTES;
-               int sendDataSize = (Integer.SIZE + Long.SIZE)/8;
+               int sendDataSize = Integer.SIZE/8 + Long.SIZE/8;
                for (TransactionPart part : transaction.getParts().values()) {
                        sendDataSize += part.getSize();
                }
@@ -964,7 +1001,8 @@ final public class Table {
 
 
                // Send by local
-               byte[] returnData = cloud.sendLocalData(sendData, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+               byte[] returnData = cloud.sendLocalData(sendData, localSequenceNumber, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+               localSequenceNumber++;
 
                if (returnData == null) {
                        // Could not contact server
@@ -1119,6 +1157,8 @@ final public class Table {
                        entry.encode(bbEncode);
                }
 
+
+               localSequenceNumber++;
                return returnData;
        }
 
@@ -1189,9 +1229,12 @@ final public class Table {
         * Returns false if a resize was needed
         */
        private ThreeTuple<Boolean, Integer, Boolean> fillSlot(Slot slot, boolean resize, NewKey newKeyEntry) {
+
+
                int newSize = 0;
                if (liveSlotCount > bufferResizeThreshold) {
                        resize = true; //Resize is forced
+
                }
 
                if (resize) {
@@ -1220,6 +1263,7 @@ final public class Table {
                if (newKeyEntry != null) {
                        newKeyEntry.setSlot(slot);
                        if (slot.hasSpace(newKeyEntry)) {
+
                                slot.addEntry(newKeyEntry);
                                inserted = true;
                        }
@@ -1448,6 +1492,7 @@ final public class Table {
                // Process each slots data
                for (Slot slot : newSlots) {
                        processSlot(indexer, slot, acceptUpdatesToLocal, machineSet);
+
                        updateExpectedSize();
                }
 
@@ -1521,20 +1566,30 @@ final public class Table {
        }
 
        private void initExpectedSize(long firstSequenceNumber, long numberOfSlots) {
-
+               // if (didFindTableStatus) {
+               // return;
+               // }
                long prevslots = firstSequenceNumber;
+
+
                if (didFindTableStatus) {
-//                     expectedsize = (prevslots < ((long) numberOfSlots)) ? (int) prevslots : expectedsize;
+                       // expectedsize = (prevslots < ((long) numberOfSlots)) ? (int) prevslots : expectedsize;
+                       // System.out.println("Here2: " + expectedsize + "    " + numberOfSlots + "   " + prevslots);
+
                } else {
                        expectedsize = (prevslots < ((long) numberOfSlots)) ? (int) prevslots : numberOfSlots;
+                       // System.out.println("Here: " + expectedsize);
                }
-               didFindTableStatus = true;
 
+               // System.out.println(numberOfSlots);
+
+               didFindTableStatus = true;
                currMaxSize = numberOfSlots;
        }
 
        private void updateExpectedSize() {
                expectedsize++;
+
                if (expectedsize > currMaxSize) {
                        expectedsize = currMaxSize;
                }
@@ -1572,6 +1627,7 @@ final public class Table {
                // Change the number of local slots to the new size
                numberOfSlots = (int)currMaxSize;
 
+
                // Recalculate the resize threshold since the size of the local buffer has changed
                setResizeThreshold();
        }
@@ -1695,11 +1751,11 @@ final public class Table {
 
                                // Create the abort
                                Abort newAbort = new Abort(null,
-                                                          transaction.getClientLocalSequenceNumber(),
-                                                          transaction.getSequenceNumber(),
-                                                          transaction.getMachineId(),
-                                                          transaction.getArbitrator(),
-                                                          localArbitrationSequenceNumber);
+                                               transaction.getClientLocalSequenceNumber(),
+                                               transaction.getSequenceNumber(),
+                                               transaction.getMachineId(),
+                                               transaction.getArbitrator(),
+                                               localArbitrationSequenceNumber);
                                localArbitrationSequenceNumber++;
 
                                generatedAborts.add(newAbort);
@@ -1832,11 +1888,11 @@ final public class Table {
 
                                // Create the abort
                                Abort newAbort = new Abort(null,
-                                                          transaction.getClientLocalSequenceNumber(),
-                                                          -1,
-                                                          transaction.getMachineId(),
-                                                          transaction.getArbitrator(),
-                                                          localArbitrationSequenceNumber);
+                                               transaction.getClientLocalSequenceNumber(),
+                                               -1,
+                                               transaction.getMachineId(),
+                                               transaction.getArbitrator(),
+                                               localArbitrationSequenceNumber);
                                localArbitrationSequenceNumber++;
 
                                addAbortSet.add(newAbort);
@@ -2289,36 +2345,36 @@ final public class Table {
                for (Entry entry : slot.getEntries()) {
                        switch (entry.getType()) {
 
-                       case Entry.TypeCommitPart:
-                               processEntry((CommitPart)entry);
-                               break;
+                               case Entry.TypeCommitPart:
+                                       processEntry((CommitPart)entry);
+                                       break;
 
-                       case Entry.TypeAbort:
-                               processEntry((Abort)entry);
-                               break;
+                               case Entry.TypeAbort:
+                                       processEntry((Abort)entry);
+                                       break;
 
-                       case Entry.TypeTransactionPart:
-                               processEntry((TransactionPart)entry);
-                               break;
+                               case Entry.TypeTransactionPart:
+                                       processEntry((TransactionPart)entry);
+                                       break;
 
-                       case Entry.TypeNewKey:
-                               processEntry((NewKey)entry);
-                               break;
+                               case Entry.TypeNewKey:
+                                       processEntry((NewKey)entry);
+                                       break;
 
-                       case Entry.TypeLastMessage:
-                               processEntry((LastMessage)entry, machineSet);
-                               break;
+                               case Entry.TypeLastMessage:
+                                       processEntry((LastMessage)entry, machineSet);
+                                       break;
 
-                       case Entry.TypeRejectedMessage:
-                               processEntry((RejectedMessage)entry, indexer);
-                               break;
+                               case Entry.TypeRejectedMessage:
+                                       processEntry((RejectedMessage)entry, indexer);
+                                       break;
 
-                       case Entry.TypeTableStatus:
-                               processEntry((TableStatus)entry, slot.getSequenceNumber());
-                               break;
+                               case Entry.TypeTableStatus:
+                                       processEntry((TableStatus)entry, slot.getSequenceNumber());
+                                       break;
 
-                       default:
-                               throw new Error("Unrecognized type: " + entry.getType());
+                               default:
+                                       throw new Error("Unrecognized type: " + entry.getType());
                        }
                }
        }
@@ -2690,7 +2746,7 @@ final public class Table {
                        Slot currSlot = newSlots[i];
                        Slot prevSlot = indexer.getSlot(currSlot.getSequenceNumber() - 1);
                        if (prevSlot != null &&
-                               !Arrays.equals(prevSlot.getHMAC(), currSlot.getPrevHMAC()))
+                                       !Arrays.equals(prevSlot.getHMAC(), currSlot.getPrevHMAC()))
                                throw new Error("Server Error: Invalid HMAC Chain" + currSlot + " " + prevSlot);
                }
        }
index 1124870..1bd6d8c 100644 (file)
@@ -33,7 +33,7 @@ class TableStatus extends Entry {
 
        int getSize() {
                //return Integer.BYTES+Byte.BYTES;
-               return (Integer.SIZE/8)+(Byte.SIZE/8);
+               return Integer.SIZE/8+Byte.SIZE/8;
        }
 
        byte getType() {
index b0a270f..7e15d9d 100644 (file)
@@ -27,7 +27,7 @@
       </value>
     </option>
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   <component name="ProjectType">
index 638cb81..ce9efb8 100644 (file)
       <file leaf-file-name="MainActivity.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/MainActivity.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="248">
+            <state relative-caret-position="1050">
               <caret line="81" column="31" selection-start-line="81" selection-start-column="8" selection-end-line="81" selection-end-column="31" />
-              <folding>
-                <element signature="e#4554#4612#0" expanded="true" />
-              </folding>
+              <folding />
             </state>
           </provider>
         </entry>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="RelationActivity.java" pinned="false" current-in-tab="true">
+      <file leaf-file-name="RelationActivity.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/RelationActivity.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="228">
+            <state relative-caret-position="443">
               <caret line="68" column="21" selection-start-line="68" selection-start-column="21" selection-end-line="68" selection-end-column="21" />
               <folding>
                 <element signature="imports" expanded="true" />
           </provider>
         </entry>
       </file>
+      <file leaf-file-name="build.gradle" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/build.gradle">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="377">
+              <caret line="40" column="53" selection-start-line="40" selection-start-column="53" selection-end-line="40" selection-end-column="53" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
       <file leaf-file-name="SSH_MySQL.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/SSH_MySQL.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="187">
+            <state relative-caret-position="1755">
               <caret line="147" column="58" selection-start-line="147" selection-start-column="35" selection-end-line="147" selection-end-column="58" />
               <folding />
             </state>
       <file leaf-file-name="DeleteDeviceActivity.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/DeleteDeviceActivity.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="-29">
+            <state relative-caret-position="450">
               <caret line="37" column="0" selection-start-line="37" selection-start-column="0" selection-end-line="38" selection-end-column="51" />
               <folding />
             </state>
       <foldersAlwaysOnTop value="true" />
     </navigator>
     <panes>
-      <pane id="PackagesPane" />
+      <pane id="Scope" />
+      <pane id="AndroidView">
+        <subPane />
+      </pane>
+      <pane id="Scratches" />
       <pane id="ProjectPane">
         <subPane>
           <PATH>
           </PATH>
         </subPane>
       </pane>
-      <pane id="AndroidView">
-        <subPane />
-      </pane>
-      <pane id="Scratches" />
-      <pane id="Scope" />
+      <pane id="PackagesPane" />
     </panes>
   </component>
   <component name="PropertiesComponent">
   </component>
   <component name="ToolWindowManager">
     <frame x="65" y="-4" width="1615" height="1054" extended-state="6" />
-    <editor active="false" />
+    <editor active="true" />
     <layout>
       <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32719547" sideWeight="0.49475157" order="6" side_tool="false" content_ui="tabs" />
       <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.28713968" sideWeight="0.44869342" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32786885" sideWeight="0.5022307" order="7" side_tool="true" content_ui="tabs" />
-      <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2827051" sideWeight="0.5532186" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.2974108" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25055432" sideWeight="0.5589548" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2827051" sideWeight="0.54811984" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25055432" sideWeight="0.5589548" order="2" side_tool="false" content_ui="tabs" />
       <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3292683" sideWeight="0.4901211" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Captures" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
       <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
-      <window_info id="Gradle Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2827051" sideWeight="0.4467814" order="7" side_tool="true" content_ui="tabs" />
+      <window_info id="Gradle Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2827051" sideWeight="0.4518802" order="7" side_tool="true" content_ui="tabs" />
       <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.22370937" sideWeight="0.4915254" order="0" side_tool="false" content_ui="combo" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.20066519" sideWeight="0.48757172" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Gradle" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32981715" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Android Model" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
       <window_info id="Assistant" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32950923" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
       <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.2974108" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.20066519" sideWeight="0.48757172" order="1" side_tool="false" content_ui="tabs" />
     </layout>
   </component>
   <component name="UnknownFeatures">
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/build.gradle">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="264">
-          <caret line="40" column="53" selection-start-line="40" selection-start-column="53" selection-end-line="40" selection-end-column="53" />
-        </state>
-      </provider>
-    </entry>
     <entry file="jar://$USER_HOME$/Android/Sdk/platforms/android-26/android.jar!/android/app/Activity.class">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="6245">
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/res/values/Constants.xml" />
     <entry file="file://$PROJECT_DIR$/src/main/res/values/constants.xml">
+      <provider selected="true" editor-type-id="android-designer2">
+        <state />
+      </provider>
       <provider editor-type-id="text-editor">
         <state relative-caret-position="0">
           <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
         </state>
       </provider>
-      <provider selected="true" editor-type-id="android-designer2">
-        <state />
-      </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/AddDeviceInfoActivity.java" />
     <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_add_device_info.xml" />
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_config.xml">
+      <provider editor-type-id="android-designer2">
+        <state />
+      </provider>
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="90">
           <caret line="6" column="51" selection-start-line="6" selection-start-column="37" selection-end-line="6" selection-end-column="51" />
           <folding />
         </state>
       </provider>
-      <provider editor-type-id="android-designer2">
-        <state />
-      </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/assets/add_comm.config">
       <provider selected="true" editor-type-id="text-editor">
     <entry file="file://$PROJECT_DIR$/src/main/res/layout/content_add_relation.xml" />
     <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_add_comm.xml" />
     <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_add_device.xml">
+      <provider editor-type-id="android-designer2">
+        <state />
+      </provider>
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="90">
           <caret line="6" column="54" selection-start-line="6" selection-start-column="54" selection-end-line="6" selection-end-column="54" />
           <folding />
         </state>
       </provider>
-      <provider editor-type-id="android-designer2">
-        <state />
-      </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/AddCommActivity.java" />
     <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/AddDeviceActivity.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="214">
           <caret line="51" column="47" selection-start-line="51" selection-start-column="47" selection-end-line="51" selection-end-column="47" />
-          <folding>
-            <element signature="e#1964#1978#0" expanded="false" />
-          </folding>
         </state>
       </provider>
     </entry>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_list.xml">
+      <provider editor-type-id="android-designer2">
+        <state />
+      </provider>
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="126">
           <caret line="21" column="36" selection-start-line="21" selection-start-column="36" selection-end-line="21" selection-end-column="36" />
           <folding />
         </state>
       </provider>
-      <provider editor-type-id="android-designer2">
-        <state />
-      </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_enroll_device.xml">
+      <provider selected="true" editor-type-id="android-designer2">
+        <state />
+      </provider>
       <provider editor-type-id="text-editor">
         <state relative-caret-position="120">
           <caret line="8" column="0" selection-start-line="8" selection-start-column="0" selection-end-line="8" selection-end-column="0" />
           <folding />
         </state>
       </provider>
-      <provider selected="true" editor-type-id="android-designer2">
-        <state />
-      </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/EnrollDeviceActivity.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="525">
           <caret line="51" column="12" selection-start-line="51" selection-start-column="8" selection-end-line="51" selection-end-column="12" />
-          <folding />
         </state>
       </provider>
     </entry>
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="495">
           <caret line="47" column="8" selection-start-line="47" selection-start-column="8" selection-end-line="47" selection-end-column="8" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/res/layout/content_relation.xml">
-      <provider selected="true" editor-type-id="android-designer2">
-        <state />
-      </provider>
-      <provider editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_add_relation.xml">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="606">
-          <caret line="92" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="92" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-      <provider editor-type-id="android-designer2">
-        <state />
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/AddRelationActivity.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="105">
-          <caret line="19" column="26" selection-start-line="19" selection-start-column="26" selection-end-line="19" selection-end-column="26" />
-          <folding />
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/res/layout/content_relation.xml" />
+    <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_add_relation.xml" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/AddRelationActivity.java" />
     <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/SSH.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="471">
           <caret line="124" column="30" selection-start-line="124" selection-start-column="30" selection-end-line="124" selection-end-column="30" />
-          <folding />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_delete_device.xml">
+      <provider selected="true" editor-type-id="android-designer2">
+        <state />
+      </provider>
       <provider editor-type-id="text-editor">
         <state relative-caret-position="212">
           <caret line="68" column="12" selection-start-line="68" selection-start-column="12" selection-end-line="68" selection-end-column="12" />
           <folding />
         </state>
       </provider>
-      <provider selected="true" editor-type-id="android-designer2">
-        <state />
-      </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/DeleteDeviceActivity.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-29">
+        <state relative-caret-position="450">
           <caret line="37" column="0" selection-start-line="37" selection-start-column="0" selection-end-line="38" selection-end-column="51" />
           <folding />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/res/layout/activity_main.xml">
+      <provider selected="true" editor-type-id="android-designer2">
+        <state />
+      </provider>
       <provider editor-type-id="text-editor">
         <state relative-caret-position="1980">
           <caret line="132" column="8" selection-start-line="132" selection-start-column="8" selection-end-line="132" selection-end-column="8" />
           <folding />
         </state>
       </provider>
-      <provider selected="true" editor-type-id="android-designer2">
-        <state />
-      </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/MainActivity.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="248">
+        <state relative-caret-position="1050">
           <caret line="81" column="31" selection-start-line="81" selection-start-column="8" selection-end-line="81" selection-end-column="31" />
-          <folding>
-            <element signature="e#4554#4612#0" expanded="true" />
-          </folding>
+          <folding />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/SSH_MySQL.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="187">
+        <state relative-caret-position="1755">
           <caret line="147" column="58" selection-start-line="147" selection-start-column="35" selection-end-line="147" selection-end-column="58" />
           <folding />
         </state>
     </entry>
     <entry file="file://$PROJECT_DIR$/src/main/java/com/example/lede2/RelationActivity.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="228">
+        <state relative-caret-position="443">
           <caret line="68" column="21" selection-start-line="68" selection-start-column="21" selection-end-line="68" selection-end-column="21" />
           <folding>
             <element signature="imports" expanded="true" />
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/build.gradle">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="377">
+          <caret line="40" column="53" selection-start-line="40" selection-start-column="53" selection-end-line="40" selection-end-column="53" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
   </component>
 </project>
\ No newline at end of file
index dcd85f5..288756d 100644 (file)
       <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
       <excludeFolder url="file://$MODULE_DIR$/build/android-profile" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-classes" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-resources" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/split-apk" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
       <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
-      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
     </content>
     <orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />