diff --git a/group13/2729382520/L5/datastructure/less5/Stack.java b/group13/2729382520/L5/datastructure/less5/Stack.java
new file mode 100644
index 0000000000..2bf939fd7c
--- /dev/null
+++ b/group13/2729382520/L5/datastructure/less5/Stack.java
@@ -0,0 +1,39 @@
+package io.github.vxzh.datastructure.less5;
+
+import java.util.ArrayList;
+
+public class Stack {
+
+    private ArrayList elementData;
+
+    public Stack() {
+        this.elementData = new ArrayList();
+    }
+
+    public int size() {
+        return elementData.size();
+    }
+
+    public boolean isEmpty() {
+        return elementData.size() == 0;
+    }
+
+    public void push(Object o) {
+        elementData.add(o);
+    }
+
+    public Object pop() {
+        if (isEmpty())
+            throw new RuntimeException("EmptyStackException");
+        Object obj = peek();
+        elementData.remove(elementData.size() - 1);
+        return obj;
+    }
+
+    public Object peek() {
+        if (isEmpty())
+            throw new RuntimeException("EmptyStackException");
+        return elementData.get(elementData.size() - 1);
+    }
+
+}
\ No newline at end of file
diff --git a/group13/2729382520/L5/datastructure/less5/StackUtil.java b/group13/2729382520/L5/datastructure/less5/StackUtil.java
new file mode 100644
index 0000000000..c2232eeb39
--- /dev/null
+++ b/group13/2729382520/L5/datastructure/less5/StackUtil.java
@@ -0,0 +1,120 @@
+package io.github.vxzh.datastructure.less5;
+
+
+public class StackUtil {
+
+    public static void main(String[] args) {
+        String s = "(9[O{er}P]0)";
+        System.out.println(isValidPairs(s));
+    }
+
+    /**
+     * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+     * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+     */
+    public static void reverse(Stack s) {
+        Stack stack = s;
+        s = new Stack();
+        while (!stack.isEmpty()) {
+            s.push(stack.pop());
+        }
+    }
+
+    /**
+     * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+     *
+     * @param o
+     */
+    public static void remove(Stack s, Object o) {
+        Stack stack = s;
+        s = new Stack();
+        while (!stack.isEmpty()) {
+            Object obj = stack.pop();
+            if (obj != o) {
+                s.push(obj);
+            }
+        }
+
+    }
+
+    /**
+     * 从栈顶取得len个元素, 原来的栈中元素保持不变
+     * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+     *
+     * @param len
+     * @return
+     */
+    public static Object[] getTop(Stack s, int len) {
+        if (len > s.size()) {
+            Object[] arr = new Object[s.size()];
+            int i = 0;
+            while (!s.isEmpty()) {
+                arr[i] = s.pop();
+                i++;
+            }
+            for (int j = 0; j < arr.length; j++) {
+                s.push(arr[j]);
+            }
+            return arr;
+        } else {
+            Object[] arr = new Object[len];
+            int i = 0;
+            while (!s.isEmpty()) {
+                arr[i] = s.pop();
+                i++;
+            }
+            for (int j = 0; j < arr.length; j++) {
+                s.push(arr[j]);
+            }
+            return arr;
+        }
+    }
+
+    /**
+     * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+     * 使用堆栈检查字符串s中的括号是不是成对出现的。
+     * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+     * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+     *
+     * @param s
+     * @return
+     */
+    public static boolean isValidPairs(String s) {
+        char[] arr = s.toCharArray();
+        Stack st1 = new Stack();
+        Stack st2 = new Stack();
+        for (int i = 0; i < arr.length; i++) {
+            st1.push(arr[i]);
+        }
+        for (int i = arr.length - 1; i >= 0; i--) {
+            st2.push(arr[i]);
+        }
+
+        while (!st1.isEmpty()) {
+
+            char ch1 = (char) st1.pop();
+            char ch2 = (char) st2.pop();
+            switch (ch1) {
+                case '{':
+                    if (ch2 != '}') {
+                        return false;
+                    }
+                    break;
+                case '[':
+                    if (ch2 != ']') {
+                        return false;
+                    }
+                    break;
+                case '(':
+                    if (ch2 != ')') {
+                        return false;
+                    }
+                    break;
+            }
+        }
+
+        return true;
+    }
+
+
+}
\ No newline at end of file
diff --git a/group13/2729382520/L5/jvm/clz/AccessFlag.java b/group13/2729382520/L5/jvm/clz/AccessFlag.java
new file mode 100755
index 0000000000..4c3a3c8900
--- /dev/null
+++ b/group13/2729382520/L5/jvm/clz/AccessFlag.java
@@ -0,0 +1,26 @@
+package io.github.vxzh.jvm.clz;
+
+public class AccessFlag {
+    private int flagValue;
+
+    public AccessFlag(int value) {
+        this.flagValue = value;
+    }
+
+    public int getFlagValue() {
+        return flagValue;
+    }
+
+    public void setFlagValue(int flag) {
+        this.flagValue = flag;
+    }
+
+    public boolean isPublicClass() {
+        return (this.flagValue & 0x0001) != 0;
+    }
+
+    public boolean isFinalClass() {
+        return (this.flagValue & 0x0010) != 0;
+    }
+
+}
\ No newline at end of file
diff --git a/group13/2729382520/L5/jvm/clz/ClassFile.java b/group13/2729382520/L5/jvm/clz/ClassFile.java
new file mode 100755
index 0000000000..1d7011545b
--- /dev/null
+++ b/group13/2729382520/L5/jvm/clz/ClassFile.java
@@ -0,0 +1,80 @@
+package io.github.vxzh.jvm.clz;
+
+import io.github.vxzh.jvm.constant.ClassInfo;
+
+public class ClassFile {
+
+    private int minorVersion;
+    private int majorVersion;
+
+    private AccessFlag accessFlag;
+    private ClassIndex clzIndex;
+    private ConstantPool pool;
+
+
+    public ClassIndex getClzIndex() {
+        return clzIndex;
+    }
+
+    public AccessFlag getAccessFlag() {
+        return accessFlag;
+    }
+
+    public void setAccessFlag(AccessFlag accessFlag) {
+        this.accessFlag = accessFlag;
+    }
+
+
+    public ConstantPool getConstantPool() {
+        return pool;
+    }
+
+    public int getMinorVersion() {
+        return minorVersion;
+    }
+
+    public void setMinorVersion(int minorVersion) {
+        this.minorVersion = minorVersion;
+    }
+
+    public int getMajorVersion() {
+        return majorVersion;
+    }
+
+    public void setMajorVersion(int majorVersion) {
+        this.majorVersion = majorVersion;
+    }
+
+    public void setConstPool(ConstantPool pool) {
+        this.pool = pool;
+
+    }
+
+    public void setClassIndex(ClassIndex clzIndex) {
+        this.clzIndex = clzIndex;
+    }
+
+
+    public void print() {
+
+        if (this.accessFlag.isPublicClass()) {
+            System.out.println("Access flag : public  ");
+        }
+        System.out.println("Class Name:" + getClassName());
+
+        System.out.println("Super Class Name:" + getSuperClassName());
+
+
+    }
+
+    private String getClassName() {
+        int thisClassIndex = this.clzIndex.getThisClassIndex();
+        ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex);
+        return thisClass.getClassName();
+    }
+
+    private String getSuperClassName() {
+        ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
+        return superClass.getClassName();
+    }
+}
diff --git a/group13/2729382520/L5/jvm/clz/ClassIndex.java b/group13/2729382520/L5/jvm/clz/ClassIndex.java
new file mode 100755
index 0000000000..4500959430
--- /dev/null
+++ b/group13/2729382520/L5/jvm/clz/ClassIndex.java
@@ -0,0 +1,22 @@
+package io.github.vxzh.jvm.clz;
+
+public class ClassIndex {
+    private int thisClassIndex;
+    private int superClassIndex;
+
+    public int getThisClassIndex() {
+        return thisClassIndex;
+    }
+
+    public void setThisClassIndex(int thisClassIndex) {
+        this.thisClassIndex = thisClassIndex;
+    }
+
+    public int getSuperClassIndex() {
+        return superClassIndex;
+    }
+
+    public void setSuperClassIndex(int superClassIndex) {
+        this.superClassIndex = superClassIndex;
+    }
+}
\ No newline at end of file
diff --git a/group13/2729382520/L5/jvm/clz/ConstantPool.java b/group13/2729382520/L5/jvm/clz/ConstantPool.java
new file mode 100755
index 0000000000..b96e330020
--- /dev/null
+++ b/group13/2729382520/L5/jvm/clz/ConstantPool.java
@@ -0,0 +1,35 @@
+package io.github.vxzh.jvm.clz;
+
+import io.github.vxzh.jvm.constant.ConstantInfo;
+import io.github.vxzh.jvm.constant.UTF8Info;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConstantPool {
+
+    private List<ConstantInfo> constantInfos = new ArrayList<ConstantInfo>();
+
+
+    public ConstantPool() {
+
+    }
+
+    public void addConstantInfo(ConstantInfo info) {
+
+        this.constantInfos.add(info);
+
+    }
+
+    public ConstantInfo getConstantInfo(int index) {
+        return this.constantInfos.get(index);
+    }
+
+    public String getUTF8String(int index) {
+        return ((UTF8Info) this.constantInfos.get(index)).getValue();
+    }
+
+    public Object getSize() {
+        return this.constantInfos.size() - 1;
+    }
+}
diff --git a/group13/2729382520/L5/jvm/constant/ClassInfo.java b/group13/2729382520/L5/jvm/constant/ClassInfo.java
new file mode 100755
index 0000000000..c9586ee16c
--- /dev/null
+++ b/group13/2729382520/L5/jvm/constant/ClassInfo.java
@@ -0,0 +1,30 @@
+package io.github.vxzh.jvm.constant;
+
+import io.github.vxzh.jvm.clz.ConstantPool;
+
+public class ClassInfo extends ConstantInfo {
+    private int tag = ConstantInfo.CONSTANT_CLASS_INFO;
+    private int nameIndex;
+
+    public ClassInfo(ConstantPool pool) {
+        super(pool);
+    }
+
+    public int getNameIndex() {
+        return nameIndex;
+    }
+
+    public void setNameIndex(int nameIndex) {
+        this.nameIndex = nameIndex;
+    }
+
+    public int getTag() {
+        return tag;
+    }
+
+    public String getClassName() {
+        int index = getNameIndex();
+        UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index);
+        return utf8Info.getValue();
+    }
+}
diff --git a/group13/2729382520/L5/jvm/constant/ConstantInfo.java b/group13/2729382520/L5/jvm/constant/ConstantInfo.java
new file mode 100755
index 0000000000..0f3d63685c
--- /dev/null
+++ b/group13/2729382520/L5/jvm/constant/ConstantInfo.java
@@ -0,0 +1,42 @@
+package io.github.vxzh.jvm.constant;
+
+import io.github.vxzh.jvm.clz.ConstantPool;
+
+public abstract class ConstantInfo {
+
+    public static final int CONSTANT_UTF8_INFO = 1;//
+    public static final int CONSTANT_INTEGER_INFO = 3;
+    public static final int CONSTANT_FLOAT_INFO = 4;//
+    public static final int CONSTANT_LONG_INFO = 5;
+    public static final int CONSTANT_DOUBLE_INFO = 6;
+    public static final int CONSTANT_CLASS_INFO = 7;//
+    public static final int CONSTANT_STRING_INFO = 8;//
+    public static final int CONSTANT_FIELDREF_INFO = 9;//
+    public static final int CONSTANT_METHODREF_INFO = 10;//
+    public static final int CONSTANT_INTERFACEMETHODREF_INFO = 11;
+    public static final int CONSTANT_NAMEANDTYPE_INFO = 12;//
+    public static final int CONSTANT_METHODHANDLE_INFO = 15;
+    public static final int CONSTANT_METHODTYPE_INFO = 16;
+    public static final int CONSTANT_INVOKEDYNAMIC_INFO = 18;
+
+    protected ConstantPool constantPool;
+
+    public ConstantInfo() {
+
+    }
+
+    public ConstantInfo(ConstantPool pool) {
+        this.constantPool = pool;
+    }
+
+    public abstract int getTag();
+
+    public ConstantPool getConstantPool() {
+        return constantPool;
+    }
+
+    public ConstantInfo getConstantInfo(int index) {
+        return this.constantPool.getConstantInfo(index);
+    }
+
+}
diff --git a/group13/2729382520/L5/jvm/constant/FieldRefInfo.java b/group13/2729382520/L5/jvm/constant/FieldRefInfo.java
new file mode 100755
index 0000000000..f39bc87b72
--- /dev/null
+++ b/group13/2729382520/L5/jvm/constant/FieldRefInfo.java
@@ -0,0 +1,60 @@
+package io.github.vxzh.jvm.constant;
+
+import io.github.vxzh.jvm.clz.ConstantPool;
+
+public class FieldRefInfo extends ConstantInfo {
+    private int tag = ConstantInfo.CONSTANT_FIELDREF_INFO;
+    private int classInfoIndex;
+    private int nameAndTypeIndex;
+
+    public FieldRefInfo(ConstantPool pool) {
+        super(pool);
+    }
+
+    public int getTag() {
+        return tag;
+    }
+
+    public int getClassInfoIndex() {
+        return classInfoIndex;
+    }
+
+    public void setClassInfoIndex(int classInfoIndex) {
+        this.classInfoIndex = classInfoIndex;
+    }
+
+    public int getNameAndTypeIndex() {
+        return nameAndTypeIndex;
+    }
+
+    public void setNameAndTypeIndex(int nameAndTypeIndex) {
+        this.nameAndTypeIndex = nameAndTypeIndex;
+    }
+
+    public String toString() {
+
+        NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
+
+        return getClassName() + " : " + typeInfo.getName() + ":" + typeInfo.getTypeInfo() + "]";
+    }
+
+    public String getClassName() {
+
+        ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+
+        UTF8Info utf8Info = (UTF8Info) this.getConstantInfo(classInfo.getNameIndex());
+
+        return utf8Info.getValue();
+
+    }
+
+    public String getFieldName() {
+        NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
+        return typeInfo.getName();
+    }
+
+    public String getFieldType() {
+        NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
+        return typeInfo.getTypeInfo();
+    }
+}
diff --git a/group13/2729382520/L5/jvm/constant/MethodRefInfo.java b/group13/2729382520/L5/jvm/constant/MethodRefInfo.java
new file mode 100755
index 0000000000..46535b7769
--- /dev/null
+++ b/group13/2729382520/L5/jvm/constant/MethodRefInfo.java
@@ -0,0 +1,60 @@
+package io.github.vxzh.jvm.constant;
+
+import io.github.vxzh.jvm.clz.ConstantPool;
+
+public class MethodRefInfo extends ConstantInfo {
+
+    private int tag = ConstantInfo.CONSTANT_METHODREF_INFO;
+
+    private int classInfoIndex;
+    private int nameAndTypeIndex;
+
+    public MethodRefInfo(ConstantPool pool) {
+        super(pool);
+    }
+
+    public int getTag() {
+        return tag;
+    }
+
+    public int getClassInfoIndex() {
+        return classInfoIndex;
+    }
+
+    public void setClassInfoIndex(int classInfoIndex) {
+        this.classInfoIndex = classInfoIndex;
+    }
+
+    public int getNameAndTypeIndex() {
+        return nameAndTypeIndex;
+    }
+
+    public void setNameAndTypeIndex(int nameAndTypeIndex) {
+        this.nameAndTypeIndex = nameAndTypeIndex;
+    }
+
+    public String toString() {
+
+        return getClassName() + " : " + this.getMethodName() + " : " + this.getParamAndReturnType();
+    }
+
+    public String getClassName() {
+        ConstantPool pool = this.getConstantPool();
+        ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(this.getClassInfoIndex());
+        return clzInfo.getClassName();
+    }
+
+    public String getMethodName() {
+        ConstantPool pool = this.getConstantPool();
+        NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex());
+        return typeInfo.getName();
+    }
+
+    public String getParamAndReturnType() {
+        ConstantPool pool = this.getConstantPool();
+        NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex());
+        return typeInfo.getTypeInfo();
+    }
+
+
+}
diff --git a/group13/2729382520/L5/jvm/constant/NameAndTypeInfo.java b/group13/2729382520/L5/jvm/constant/NameAndTypeInfo.java
new file mode 100755
index 0000000000..a081902eac
--- /dev/null
+++ b/group13/2729382520/L5/jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,51 @@
+package io.github.vxzh.jvm.constant;
+
+import io.github.vxzh.jvm.clz.ConstantPool;
+
+public class NameAndTypeInfo extends ConstantInfo {
+    public int tag = ConstantInfo.CONSTANT_NAMEANDTYPE_INFO;
+
+    private int nameIndex;
+    private int descriptorIndex;
+
+    public NameAndTypeInfo(ConstantPool pool) {
+        super(pool);
+    }
+
+    public int getNameIndex() {
+        return nameIndex;
+    }
+
+    public void setNameIndex(int nameIndex) {
+        this.nameIndex = nameIndex;
+    }
+
+    public int getDescriptorIndex() {
+        return descriptorIndex;
+    }
+
+    public void setDescriptorIndex(int descriptorIndex) {
+        this.descriptorIndex = descriptorIndex;
+    }
+
+    public int getTag() {
+        return tag;
+    }
+
+
+    public String getName() {
+        ConstantPool pool = this.getConstantPool();
+        UTF8Info utf8Info1 = (UTF8Info) pool.getConstantInfo(nameIndex);
+        return utf8Info1.getValue();
+    }
+
+    public String getTypeInfo() {
+        ConstantPool pool = this.getConstantPool();
+        UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(descriptorIndex);
+        return utf8Info2.getValue();
+    }
+
+    public String toString() {
+        return "(" + getName() + "," + getTypeInfo() + ")";
+    }
+}
diff --git a/group13/2729382520/L5/jvm/constant/NullConstantInfo.java b/group13/2729382520/L5/jvm/constant/NullConstantInfo.java
new file mode 100755
index 0000000000..1d1d8394f9
--- /dev/null
+++ b/group13/2729382520/L5/jvm/constant/NullConstantInfo.java
@@ -0,0 +1,14 @@
+package io.github.vxzh.jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo {
+
+    public NullConstantInfo() {
+
+    }
+
+    @Override
+    public int getTag() {
+        return -1;
+    }
+
+}
diff --git a/group13/2729382520/L5/jvm/constant/StringInfo.java b/group13/2729382520/L5/jvm/constant/StringInfo.java
new file mode 100755
index 0000000000..e5175eed4a
--- /dev/null
+++ b/group13/2729382520/L5/jvm/constant/StringInfo.java
@@ -0,0 +1,30 @@
+package io.github.vxzh.jvm.constant;
+
+import io.github.vxzh.jvm.clz.ConstantPool;
+
+public class StringInfo extends ConstantInfo {
+    private int tag = ConstantInfo.CONSTANT_STRING_INFO;
+    private int index;
+
+    public StringInfo(ConstantPool pool) {
+        super(pool);
+    }
+
+    public int getTag() {
+        return tag;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
+
+    public String toString() {
+        return this.getConstantPool().getUTF8String(index);
+    }
+
+}
diff --git a/group13/2729382520/L5/jvm/constant/UTF8Info.java b/group13/2729382520/L5/jvm/constant/UTF8Info.java
new file mode 100755
index 0000000000..e1fb81006b
--- /dev/null
+++ b/group13/2729382520/L5/jvm/constant/UTF8Info.java
@@ -0,0 +1,40 @@
+package io.github.vxzh.jvm.constant;
+
+import io.github.vxzh.jvm.clz.ConstantPool;
+
+public class UTF8Info extends ConstantInfo {
+    private int tag = ConstantInfo.CONSTANT_UTF8_INFO;
+    private int length;
+    private String value;
+
+    public UTF8Info(ConstantPool pool) {
+        super(pool);
+    }
+
+    public int getLength() {
+        return length;
+    }
+
+    public void setLength(int length) {
+        this.length = length;
+    }
+
+    public int getTag() {
+        return tag;
+    }
+
+    @Override
+    public String toString() {
+        return "UTF8Info [tag=" + tag + ", length=" + length + ", value=" + value + ")]";
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+
+}
diff --git a/group13/2729382520/L5/jvm/loader/ByteCodeIterator.java b/group13/2729382520/L5/jvm/loader/ByteCodeIterator.java
new file mode 100644
index 0000000000..2b3fd9b896
--- /dev/null
+++ b/group13/2729382520/L5/jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,41 @@
+package io.github.vxzh.jvm.loader;
+
+import io.github.vxzh.jvm.util.Util;
+
+import java.util.Arrays;
+
+public class ByteCodeIterator {
+    private int pos = 0;
+    private byte[] code;
+
+    public ByteCodeIterator(byte[] code) {
+        this.code = code;
+    }
+
+    public String nextU4ToHexString() {
+        byte[] bytes = nextBytes(4);
+        return Util.byteToHexString(bytes);
+    }
+
+    public int nextU2ToInt() {
+        byte[] bytes = nextBytes(2);
+        return Util.byteToInt(bytes);
+    }
+
+    public int nextU1ToInt() {
+        byte[] bytes = nextBytes(1);
+        return Util.byteToInt(bytes);
+    }
+
+    public String nextBytesToString(int len) {
+        byte[] bytes = nextBytes(len);
+        return new String(bytes);
+    }
+
+    private byte[] nextBytes(int len) {
+        byte[] bytes = Arrays.copyOfRange(code, pos, pos+len);
+        pos += len;
+        return bytes;
+    }
+
+}
\ No newline at end of file
diff --git a/group13/2729382520/L5/jvm/loader/ClassFileLoader.java b/group13/2729382520/L5/jvm/loader/ClassFileLoader.java
new file mode 100755
index 0000000000..c10a6ad295
--- /dev/null
+++ b/group13/2729382520/L5/jvm/loader/ClassFileLoader.java
@@ -0,0 +1,108 @@
+package io.github.vxzh.jvm.loader;
+
+import io.github.vxzh.jvm.clz.ClassFile;
+import org.apache.commons.io.IOUtils;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class ClassFileLoader {
+
+    private static final int BUFFER_MAX_SIZE = 1024;
+    private List<String> clzPaths = new ArrayList<String>();
+
+    public byte[] readBinaryCode(String className) {
+
+        className = className.replaceAll("\\.", "/");
+        File file = findFile(className);
+        if (file == null) {
+            return new byte[0];
+        }
+
+        FileInputStream fis = null;
+        ByteArrayOutputStream bos = null;
+        try {
+            fis = new FileInputStream(file);
+            bos = new ByteArrayOutputStream();
+            byte buffer[] = new byte[BUFFER_MAX_SIZE];
+            int len = -1;
+            while ((len = fis.read(buffer)) != -1) {
+                bos.write(buffer, 0, len);
+            }
+            return bos.toByteArray();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (fis != null)
+                    fis.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+            try {
+                if (bos != null)
+                    bos.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return null;
+    }
+
+    public void addClassPath(String path) {
+        if (this.clzPaths.contains(path)) {
+            return;
+        }
+        clzPaths.add(path);
+    }
+
+    public String getClassPath() {
+
+        StringBuilder builder = new StringBuilder();
+        for (String path : clzPaths) {
+            builder.append(path).append(";");
+        }
+
+        return builder.toString().substring(0, builder.toString().length() - 1);
+    }
+
+    private File findFile(String className) {
+        for (String path : clzPaths) {
+            String filePath = path + "/" + className + ".class";
+            File file = new File(filePath);
+            if (file.exists()) {
+                return file;
+            }
+        }
+        return null;
+    }
+
+    private byte[] loadClassFile(String clzFileName) {
+
+        File f = new File(clzFileName);
+
+        try {
+
+            return IOUtils.toByteArray(new FileInputStream(f));
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public ClassFile loadClass(String className) {
+        byte[] codes = this.readBinaryCode(className);
+        ClassFileParser parser = new ClassFileParser();
+        return parser.parse(codes);
+
+    }
+
+
+}
\ No newline at end of file
diff --git a/group13/2729382520/L5/jvm/loader/ClassFileParser.java b/group13/2729382520/L5/jvm/loader/ClassFileParser.java
new file mode 100644
index 0000000000..378d1b68e8
--- /dev/null
+++ b/group13/2729382520/L5/jvm/loader/ClassFileParser.java
@@ -0,0 +1,99 @@
+package io.github.vxzh.jvm.loader;
+
+import io.github.vxzh.jvm.clz.AccessFlag;
+import io.github.vxzh.jvm.clz.ClassFile;
+import io.github.vxzh.jvm.clz.ClassIndex;
+import io.github.vxzh.jvm.clz.ConstantPool;
+import io.github.vxzh.jvm.constant.*;
+
+
+public class ClassFileParser {
+
+    public ClassFile parse(byte[] codes) {
+
+        ByteCodeIterator byteCodeIterator = new ByteCodeIterator(codes);
+        String magicNumber = byteCodeIterator.nextU4ToHexString();
+        if (!"cafebabe".equals(magicNumber))
+            throw new RuntimeException("This is not a Java Class file!");
+
+        ClassFile classFile = new ClassFile();
+        int minorVersion = byteCodeIterator.nextU2ToInt();
+        classFile.setMinorVersion(minorVersion);
+        int majorVersion = byteCodeIterator.nextU2ToInt();
+        classFile.setMajorVersion(majorVersion);
+
+        classFile.setConstPool(this.parseConstantPool(byteCodeIterator));
+        classFile.setAccessFlag(this.parseAccessFlag(byteCodeIterator));
+        classFile.setClassIndex(this.parseClassInfex(byteCodeIterator));
+
+        return classFile;
+    }
+
+    private AccessFlag parseAccessFlag(ByteCodeIterator iterator) {
+        return new AccessFlag(iterator.nextU2ToInt());
+    }
+
+    private ClassIndex parseClassInfex(ByteCodeIterator iterator) {
+        ClassIndex classIndex = new ClassIndex();
+        classIndex.setThisClassIndex(iterator.nextU2ToInt());
+        classIndex.setSuperClassIndex(iterator.nextU2ToInt());
+        return classIndex;
+    }
+
+    private ConstantPool parseConstantPool(ByteCodeIterator iterator) {
+
+        int constantCount = iterator.nextU2ToInt();
+        ConstantPool constantPool = new ConstantPool();
+        constantPool.addConstantInfo(new NullConstantInfo());
+        for (int i = 0; i < constantCount; i++) {
+            int tag = iterator.nextU1ToInt();
+            switch (tag) {
+                case ConstantInfo.CONSTANT_CLASS_INFO:
+                    ClassInfo classInfo = new ClassInfo(constantPool);
+                    classInfo.setNameIndex(iterator.nextU2ToInt());
+                    constantPool.addConstantInfo(classInfo);
+                    System.out.println("classInfo " + classInfo.getNameIndex());
+                    break;
+                case ConstantInfo.CONSTANT_UTF8_INFO:
+                    UTF8Info utf8Info = new UTF8Info(constantPool);
+                    utf8Info.setLength(iterator.nextU2ToInt());
+                    utf8Info.setValue(iterator.nextBytesToString(utf8Info.getLength()));
+                    constantPool.addConstantInfo(utf8Info);
+                    System.out.println("utf-8 " + utf8Info.getValue());
+                    break;
+                case ConstantInfo.CONSTANT_METHODREF_INFO:
+                    MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool);
+                    methodRefInfo.setClassInfoIndex(iterator.nextU2ToInt());
+                    methodRefInfo.setNameAndTypeIndex(iterator.nextU2ToInt());
+                    constantPool.addConstantInfo(methodRefInfo);
+                    System.out.println("method ref " + methodRefInfo.getClassInfoIndex() + " " + methodRefInfo.getNameAndTypeIndex());
+                    break;
+                case ConstantInfo.CONSTANT_NAMEANDTYPE_INFO:
+                    NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool);
+                    nameAndTypeInfo.setNameIndex(iterator.nextU2ToInt());
+                    nameAndTypeInfo.setDescriptorIndex(iterator.nextU2ToInt());
+                    constantPool.addConstantInfo(nameAndTypeInfo);
+                    System.out.println("name and type " + nameAndTypeInfo.getNameIndex() + " " + nameAndTypeInfo.getDescriptorIndex());
+                    break;
+                case ConstantInfo.CONSTANT_FIELDREF_INFO:
+                    FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool);
+                    fieldRefInfo.setClassInfoIndex(iterator.nextU2ToInt());
+                    fieldRefInfo.setNameAndTypeIndex(iterator.nextU2ToInt());
+                    constantPool.addConstantInfo(fieldRefInfo);
+                    System.out.println("field ref " + fieldRefInfo.getClassInfoIndex() + " " + fieldRefInfo.getNameAndTypeIndex());
+                    break;
+                case ConstantInfo.CONSTANT_STRING_INFO:
+                    StringInfo stringInfo = new StringInfo(constantPool);
+                    stringInfo.setIndex(iterator.nextU2ToInt());
+                    constantPool.addConstantInfo(stringInfo);
+                    System.out.println("string " + stringInfo.getIndex());
+                    break;
+                default:
+                    //throw new RuntimeException("the constant Pool tag "+tag+" has not been implement yet！");
+            }
+        }
+        return constantPool;
+    }
+
+
+}
diff --git a/group13/2729382520/L5/jvm/test/ClassFileloaderTest.java b/group13/2729382520/L5/jvm/test/ClassFileloaderTest.java
new file mode 100755
index 0000000000..9223e0f7ad
--- /dev/null
+++ b/group13/2729382520/L5/jvm/test/ClassFileloaderTest.java
@@ -0,0 +1,188 @@
+package io.github.vxzh.jvm.test;
+
+import io.github.vxzh.jvm.clz.ClassFile;
+import io.github.vxzh.jvm.clz.ClassIndex;
+import io.github.vxzh.jvm.clz.ConstantPool;
+import io.github.vxzh.jvm.constant.*;
+import io.github.vxzh.jvm.loader.ClassFileLoader;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ClassFileloaderTest {
+
+
+    private static final String FULL_QUALIFIED_CLASS_NAME = "io/github/vxzh/jvm/test/EmployeeV1.java";
+    static String path1 = "/Users/xuxiaoqing/Workspace/test";
+    static String path2 = "/Users/xuxiaoqing/Documents/demo";
+
+    static ClassFile clzFile = null;
+
+    static {
+        ClassFileLoader loader = new ClassFileLoader();
+        loader.addClassPath(path1);
+        String className = "io.github.vxzh.jvm.test.EmployeeV1";
+
+        clzFile = loader.loadClass(className);
+        //clzFile.print();
+    }
+
+
+    @Before
+    public void setUp() throws Exception {
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testClassPath() {
+
+        ClassFileLoader loader = new ClassFileLoader();
+        loader.addClassPath(path1);
+        loader.addClassPath(path2);
+
+        String clzPath = loader.getClassPath();
+
+        Assert.assertEquals(path1 + ";" + path2, clzPath);
+
+    }
+
+    @Test
+    public void testClassFileLength() {
+
+        ClassFileLoader loader = new ClassFileLoader();
+        loader.addClassPath(path1);
+
+        String className = "io.github.vxzh.jvm.test.EmployeeV1";
+
+        byte[] byteCodes = loader.readBinaryCode(className);
+
+        // 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
+        Assert.assertEquals(1056, byteCodes.length);
+
+    }
+
+
+    @Test
+    public void testMagicNumber() {
+        ClassFileLoader loader = new ClassFileLoader();
+        loader.addClassPath(path1);
+        String className = "io.github.vxzh.jvm.test.EmployeeV1";
+        byte[] byteCodes = loader.readBinaryCode(className);
+        byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]};
+
+
+        String acctualValue = this.byteToHexString(codes);
+
+        Assert.assertEquals("cafebabe", acctualValue);
+    }
+
+
+    private String byteToHexString(byte[] codes) {
+        StringBuffer buffer = new StringBuffer();
+        for (int i = 0; i < codes.length; i++) {
+            byte b = codes[i];
+            int value = b & 0xFF;
+            String strHex = Integer.toHexString(value);
+            if (strHex.length() < 2) {
+                strHex = "0" + strHex;
+            }
+            buffer.append(strHex);
+        }
+        return buffer.toString();
+    }
+
+    @Test
+    public void testVersion() {
+
+        Assert.assertEquals(0, clzFile.getMinorVersion());
+        Assert.assertEquals(52, clzFile.getMajorVersion());
+
+    }
+
+    @Test
+    public void testConstantPool() {
+
+
+        ConstantPool pool = clzFile.getConstantPool();
+
+        Assert.assertEquals(53, pool.getSize());
+
+        {
+            ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
+            Assert.assertEquals(2, clzInfo.getNameIndex());
+
+            UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
+            Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue());
+        }
+        {
+            ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
+            Assert.assertEquals(4, clzInfo.getNameIndex());
+
+            UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
+            Assert.assertEquals("java/lang/Object", utf8Info.getValue());
+        }
+        {
+            UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
+            Assert.assertEquals("name", utf8Info.getValue());
+
+            utf8Info = (UTF8Info) pool.getConstantInfo(6);
+            Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
+
+            utf8Info = (UTF8Info) pool.getConstantInfo(7);
+            Assert.assertEquals("age", utf8Info.getValue());
+
+            utf8Info = (UTF8Info) pool.getConstantInfo(8);
+            Assert.assertEquals("I", utf8Info.getValue());
+
+            utf8Info = (UTF8Info) pool.getConstantInfo(9);
+            Assert.assertEquals("<init>", utf8Info.getValue());
+
+            utf8Info = (UTF8Info) pool.getConstantInfo(10);
+            Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+
+            utf8Info = (UTF8Info) pool.getConstantInfo(11);
+            Assert.assertEquals("Code", utf8Info.getValue());
+        }
+
+        {
+            MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(12);
+            Assert.assertEquals(3, methodRef.getClassInfoIndex());
+            Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+        }
+
+        {
+            NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+            Assert.assertEquals(9, nameAndType.getNameIndex());
+            Assert.assertEquals(14, nameAndType.getDescriptorIndex());
+        }
+        //抽查几个吧
+        {
+            MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(45);
+            Assert.assertEquals(1, methodRef.getClassInfoIndex());
+            Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+        }
+
+        {
+            UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+            Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+        }
+    }
+
+    @Test
+    public void testClassIndex() {
+
+        ClassIndex clzIndex = clzFile.getClzIndex();
+        ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+        ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+
+
+        Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+        Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+    }
+
+
+}
\ No newline at end of file
diff --git a/group13/2729382520/L5/jvm/test/EmployeeV1.java b/group13/2729382520/L5/jvm/test/EmployeeV1.java
new file mode 100755
index 0000000000..87e05ff033
--- /dev/null
+++ b/group13/2729382520/L5/jvm/test/EmployeeV1.java
@@ -0,0 +1,29 @@
+package io.github.vxzh.jvm.test;
+
+public class EmployeeV1 {
+
+    private String name;
+    private int age;
+
+    public EmployeeV1(String name, int age) {
+        this.name = name;
+        this.age = age;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setAge(int age) {
+        this.age = age;
+    }
+
+    public void sayHello() {
+        System.out.println("Hello , this is class Employee ");
+    }
+
+    public static void main(String[] args) {
+        EmployeeV1 p = new EmployeeV1("Andy", 29);
+        p.sayHello();
+    }
+}
\ No newline at end of file
diff --git a/group13/2729382520/L5/jvm/util/Util.java b/group13/2729382520/L5/jvm/util/Util.java
new file mode 100644
index 0000000000..9a659ef3eb
--- /dev/null
+++ b/group13/2729382520/L5/jvm/util/Util.java
@@ -0,0 +1,23 @@
+package io.github.vxzh.jvm.util;
+
+public class Util {
+    public static int byteToInt(byte[] codes) {
+        String s1 = byteToHexString(codes);
+        return Integer.valueOf(s1, 16).intValue();
+    }
+
+
+    public static String byteToHexString(byte[] codes) {
+        StringBuffer buffer = new StringBuffer();
+        for (int i = 0; i < codes.length; i++) {
+            byte b = codes[i];
+            int value = b & 0xFF;
+            String strHex = Integer.toHexString(value);
+            if (strHex.length() < 2) {
+                strHex = "0" + strHex;
+            }
+            buffer.append(strHex);
+        }
+        return buffer.toString();
+    }
+}
\ No newline at end of file
diff --git a/group13/2931408816/.gradle/3.1/taskArtifacts/cache.properties.lock b/group13/2931408816/.gradle/3.1/taskArtifacts/cache.properties.lock
index e526851619..3c3d84d35b 100644
Binary files a/group13/2931408816/.gradle/3.1/taskArtifacts/cache.properties.lock and b/group13/2931408816/.gradle/3.1/taskArtifacts/cache.properties.lock differ
diff --git a/group13/2931408816/.gradle/3.1/taskArtifacts/fileHashes.bin b/group13/2931408816/.gradle/3.1/taskArtifacts/fileHashes.bin
index df74348046..12cab10b96 100644
Binary files a/group13/2931408816/.gradle/3.1/taskArtifacts/fileHashes.bin and b/group13/2931408816/.gradle/3.1/taskArtifacts/fileHashes.bin differ
diff --git a/group13/2931408816/.gradle/3.1/taskArtifacts/fileSnapshots.bin b/group13/2931408816/.gradle/3.1/taskArtifacts/fileSnapshots.bin
index d65e698bbc..09cd2629f8 100644
Binary files a/group13/2931408816/.gradle/3.1/taskArtifacts/fileSnapshots.bin and b/group13/2931408816/.gradle/3.1/taskArtifacts/fileSnapshots.bin differ
diff --git a/group13/2931408816/.gradle/3.1/taskArtifacts/taskArtifacts.bin b/group13/2931408816/.gradle/3.1/taskArtifacts/taskArtifacts.bin
index 69a7010d72..3c70119c9f 100644
Binary files a/group13/2931408816/.gradle/3.1/taskArtifacts/taskArtifacts.bin and b/group13/2931408816/.gradle/3.1/taskArtifacts/taskArtifacts.bin differ
diff --git a/group13/2931408816/.idea/compiler.xml b/group13/2931408816/.idea/compiler.xml
index 3d1b215f42..602f0772b0 100644
--- a/group13/2931408816/.idea/compiler.xml
+++ b/group13/2931408816/.idea/compiler.xml
@@ -10,6 +10,10 @@
       <module name="lesson2_test" target="1.8" />
       <module name="lesson3_main" target="1.8" />
       <module name="lesson3_test" target="1.8" />
+      <module name="lesson4_main" target="1.8" />
+      <module name="lesson4_test" target="1.8" />
+      <module name="lesson5_main" target="1.8" />
+      <module name="lesson5_test" target="1.8" />
     </bytecodeTargetLevel>
   </component>
 </project>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/gradle.xml b/group13/2931408816/.idea/gradle.xml
index 4a7350459a..246a806334 100644
--- a/group13/2931408816/.idea/gradle.xml
+++ b/group13/2931408816/.idea/gradle.xml
@@ -13,6 +13,8 @@
             <option value="$PROJECT_DIR$/lesson1" />
             <option value="$PROJECT_DIR$/lesson2" />
             <option value="$PROJECT_DIR$/lesson3" />
+            <option value="$PROJECT_DIR$/lesson4" />
+            <option value="$PROJECT_DIR$/lesson5" />
           </set>
         </option>
       </GradleProjectSettings>
diff --git a/group13/2931408816/.idea/modules.xml b/group13/2931408816/.idea/modules.xml
index b8bbae7f40..762aea64c1 100644
--- a/group13/2931408816/.idea/modules.xml
+++ b/group13/2931408816/.idea/modules.xml
@@ -3,7 +3,7 @@
   <component name="ProjectModuleManager">
     <modules>
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/2931408816.iml" filepath="$PROJECT_DIR$/.idea/modules/2931408816.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson3/2931408816-lesson3.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson3/2931408816-lesson3.iml" group="lesson3" />
+      <module fileurl="file://D:\src\java\study\coding2017\group13\2931408816\.idea\modules\lesson3\2931408816-lesson3.iml" filepath="D:\src\java\study\coding2017\group13\2931408816\.idea\modules\lesson3\2931408816-lesson3.iml" group="lesson3" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/2931408816_main.iml" filepath="$PROJECT_DIR$/.idea/modules/2931408816_main.iml" group="2931408816" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/2931408816_test.iml" filepath="$PROJECT_DIR$/.idea/modules/2931408816_test.iml" group="2931408816" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson1/lesson1.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson1/lesson1.iml" group="lesson1" />
@@ -12,9 +12,16 @@
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson2/lesson2.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson2/lesson2.iml" group="lesson2" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson2/lesson2_main.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson2/lesson2_main.iml" group="lesson2" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson2/lesson2_test.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson2/lesson2_test.iml" group="lesson2" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson3.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson3.iml" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson3/lesson3.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson3/lesson3.iml" group="lesson3" />
+      <module fileurl="file://D:\src\java\study\coding2017\group13\2931408816\.idea\modules\lesson3.iml" filepath="D:\src\java\study\coding2017\group13\2931408816\.idea\modules\lesson3.iml" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson3/lesson3_main.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson3/lesson3_main.iml" group="lesson3" />
       <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson3/lesson3_test.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson3/lesson3_test.iml" group="lesson3" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson4.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson4.iml" group="lesson4" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson4/lesson4_main.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson4/lesson4_main.iml" group="lesson4" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson4/lesson4_test.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson4/lesson4_test.iml" group="lesson4" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson5.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson5.iml" group="lesson5" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson5/lesson5_main.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson5/lesson5_main.iml" group="lesson5" />
+      <module fileurl="file://$PROJECT_DIR$/.idea/modules/lesson5/lesson5_test.iml" filepath="$PROJECT_DIR$/.idea/modules/lesson5/lesson5_test.iml" group="lesson5" />
     </modules>
   </component>
 </project>
\ No newline at end of file
diff --git a/group13/2931408816/.idea/workspace.xml b/group13/2931408816/.idea/workspace.xml
index 5491e4d0a1..38a332457d 100644
--- a/group13/2931408816/.idea/workspace.xml
+++ b/group13/2931408816/.idea/workspace.xml
@@ -11,6 +11,10 @@
     <ignored path="$PROJECT_DIR$/lesson2/build/" />
     <ignored path="$PROJECT_DIR$/lesson3/.gradle/" />
     <ignored path="$PROJECT_DIR$/lesson3/build/" />
+    <ignored path="$PROJECT_DIR$/lesson4/.gradle/" />
+    <ignored path="$PROJECT_DIR$/lesson4/build/" />
+    <ignored path="$PROJECT_DIR$/lesson5/.gradle/" />
+    <ignored path="$PROJECT_DIR$/lesson5/build/" />
     <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
     <option name="TRACKING_ENABLED" value="true" />
     <option name="SHOW_DIALOG" value="false" />
@@ -39,6 +43,9 @@
         <task path="$PROJECT_DIR$/lesson2">
           <activation />
         </task>
+        <task path="$PROJECT_DIR$/lesson4">
+          <activation />
+        </task>
         <projects_view>
           <tree_state>
             <PATH>
@@ -51,69 +58,75 @@
                 <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ProjectNode" />
               </PATH_ELEMENT>
             </PATH>
+            <PATH>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ExternalProjectsStructure$RootNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ProjectNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ModuleNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="Tasks" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.TasksNode" />
+              </PATH_ELEMENT>
+            </PATH>
+            <PATH>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ExternalProjectsStructure$RootNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ProjectNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ModuleNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="Tasks" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.TasksNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="build" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.TasksNode$1" />
+              </PATH_ELEMENT>
+            </PATH>
+            <PATH>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ExternalProjectsStructure$RootNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ProjectNode" />
+              </PATH_ELEMENT>
+              <PATH_ELEMENT>
+                <option name="myItemId" value="2931408816" />
+                <option name="myItemType" value="com.intellij.openapi.externalSystem.view.ModuleNode" />
+              </PATH_ELEMENT>
+            </PATH>
           </tree_state>
         </projects_view>
       </state>
     </system>
   </component>
   <component name="FileEditorManager">
-    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file leaf-file-name="FileDownloader.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/FileDownloader.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="253">
-              <caret line="55" column="38" lean-forward="false" selection-start-line="55" selection-start-column="38" selection-end-line="55" selection-end-column="38" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="ConnectionManagerImpl.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionManagerImpl.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="184">
-              <caret line="23" column="67" lean-forward="false" selection-start-line="23" selection-start-column="67" selection-end-line="23" selection-end-column="67" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="ConnectionImpl.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionImpl.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="-416">
-              <caret line="58" column="26" lean-forward="true" selection-start-line="58" selection-start-column="26" selection-end-line="58" selection-end-column="26" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="FileUtil.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/FileUtil.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="299">
-              <caret line="25" column="26" lean-forward="false" selection-start-line="25" selection-start-column="26" selection-end-line="25" selection-end-column="26" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="FileDownloaderTest.java" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/lesson3/src/test/java/cn/net/pikachu/download/FileDownloaderTest.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="460">
-              <caret line="34" column="41" lean-forward="false" selection-start-line="34" selection-start-column="41" selection-end-line="34" selection-end-column="41" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="DownloadThread.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/DownloadThread.java">
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="375">
+      <file leaf-file-name="main.kt" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/main/kotlin/main.kt">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="483">
-              <caret line="27" column="31" lean-forward="true" selection-start-line="27" selection-start-column="31" selection-end-line="27" selection-end-column="31" />
-              <folding />
+            <state relative-caret-position="161">
+              <caret line="9" column="32" lean-forward="false" selection-start-line="9" selection-start-column="32" selection-end-line="9" selection-end-column="32" />
+              <folding>
+                <element signature="n#!!doc;n#main#0" expanded="false" />
+              </folding>
             </state>
           </provider>
         </entry>
@@ -123,8 +136,8 @@
   <component name="FileTemplateManagerImpl">
     <option name="RECENT_TEMPLATES">
       <list>
-        <option value="Kotlin File" />
         <option value="Class" />
+        <option value="Kotlin File" />
       </list>
     </option>
   </component>
@@ -357,6 +370,116 @@
             <conf name="classpath" scriptClasspath="true" />
           </extensions>
         </project>
+        <project path="$PROJECT_DIR$/lesson4">
+          <extensions parent="$PROJECT_DIR$">
+            <ext name="ext" type="org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension" />
+            <ext name="defaultArtifacts" type="org.gradle.api.internal.plugins.DefaultArtifactPublicationSet" />
+            <ext name="reporting" type="org.gradle.api.reporting.ReportingExtension" />
+            <ext name="kotlin" type="org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension" />
+            <ext name="kapt" type="org.jetbrains.kotlin.gradle.plugin.KaptExtension" />
+            <prop name="kotlin_version" />
+            <task name="components" type="org.gradle.api.reporting.components.ComponentReport">Displays the components produced by project ':lesson4'. [incubating]&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="buildDependents">Assembles and tests this project and all projects that depend on it.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="projects" type="org.gradle.api.tasks.diagnostics.ProjectReportTask">Displays the sub-projects of project ':lesson4'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="idea">Generates IDEA project files (IML, IPR, IWS)&lt;p&gt;&lt;i&gt;Task group: IDE&lt;i&gt;</task>
+            <task name="classes">Assembles main classes.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="buildEnvironment" type="org.gradle.api.tasks.diagnostics.BuildEnvironmentReportTask">Displays all buildscript dependencies declared in project ':lesson4'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="cleanIdeaModule" type="org.gradle.api.tasks.Delete">&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="testClasses">Assembles test classes.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="javadoc" type="org.gradle.api.tasks.javadoc.Javadoc">Generates Javadoc API documentation for the main source code.&lt;p&gt;&lt;i&gt;Task group: documentation&lt;i&gt;</task>
+            <task name="jar" type="org.gradle.api.tasks.bundling.Jar">Assembles a jar archive containing the main classes.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="model" type="org.gradle.api.reporting.model.ModelReport">Displays the configuration model of project ':lesson4'. [incubating]&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="copyMainKotlinClasses" type="org.jetbrains.kotlin.gradle.tasks.SyncOutputTask">&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="ideaModule" type="org.gradle.plugins.ide.idea.GenerateIdeaModule">Generates IDEA module files (IML)&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="processResources" type="org.gradle.language.jvm.tasks.ProcessResources">Processes main resources.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="tasks" type="org.gradle.api.tasks.diagnostics.TaskReportTask">Displays the tasks runnable from project ':lesson4'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="cleanIdea">Cleans IDEA project files (IML, IPR)&lt;p&gt;&lt;i&gt;Task group: IDE&lt;i&gt;</task>
+            <task name="copyTestKotlinClasses" type="org.jetbrains.kotlin.gradle.tasks.SyncOutputTask">&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="test" type="org.gradle.api.tasks.testing.Test">Runs the unit tests.&lt;p&gt;&lt;i&gt;Task group: verification&lt;i&gt;</task>
+            <task name="compileJava" type="org.gradle.api.tasks.compile.JavaCompile">Compiles main Java source.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="compileTestKotlin" type="org.jetbrains.kotlin.gradle.tasks.KotlinCompile">Compiles the source set 'test'.kotlin.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="dependencyInsight" type="org.gradle.api.tasks.diagnostics.DependencyInsightReportTask">Displays the insight into a specific dependency in project ':lesson4'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="check">Runs all checks.&lt;p&gt;&lt;i&gt;Task group: verification&lt;i&gt;</task>
+            <task name="assemble">Assembles the outputs of this project.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="clean" type="org.gradle.api.tasks.Delete">Deletes the build directory.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="compileTestJava" type="org.gradle.api.tasks.compile.JavaCompile">Compiles test Java source.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="dependencies" type="org.gradle.api.tasks.diagnostics.DependencyReportTask">Displays all dependencies declared in project ':lesson4'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="processTestResources" type="org.gradle.language.jvm.tasks.ProcessResources">Processes test resources.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="help" type="org.gradle.configuration.Help">Displays a help message.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="compileKotlin" type="org.jetbrains.kotlin.gradle.tasks.KotlinCompile">Compiles the source set 'main'.kotlin.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="build">Assembles and tests this project.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="buildNeeded">Assembles and tests this project and all projects it depends on.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="properties" type="org.gradle.api.tasks.diagnostics.PropertyReportTask">Displays the properties of project ':lesson4'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <conf name="archives">Configuration for archive artifacts.</conf>
+            <conf name="compile" visible="false">Dependencies for source set 'main'.</conf>
+            <conf name="compileClasspath" visible="false">Compile classpath for source set 'main'.</conf>
+            <conf name="compileOnly" visible="false">Compile dependencies for source set 'main'.</conf>
+            <conf name="default">Configuration for default artifacts.</conf>
+            <conf name="kapt" />
+            <conf name="kaptTest" />
+            <conf name="runtime" visible="false">Runtime dependencies for source set 'main'.</conf>
+            <conf name="testCompile" visible="false">Dependencies for source set 'test'.</conf>
+            <conf name="testCompileClasspath" visible="false">Compile classpath for source set 'test'.</conf>
+            <conf name="testCompileOnly" visible="false">Compile dependencies for source set 'test'.</conf>
+            <conf name="testRuntime" visible="false">Runtime dependencies for source set 'test'.</conf>
+            <conf name="classpath" scriptClasspath="true" />
+          </extensions>
+        </project>
+        <project path="$PROJECT_DIR$/lesson5">
+          <extensions parent="$PROJECT_DIR$">
+            <ext name="ext" type="org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension" />
+            <ext name="defaultArtifacts" type="org.gradle.api.internal.plugins.DefaultArtifactPublicationSet" />
+            <ext name="reporting" type="org.gradle.api.reporting.ReportingExtension" />
+            <ext name="kotlin" type="org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension" />
+            <ext name="kapt" type="org.jetbrains.kotlin.gradle.plugin.KaptExtension" />
+            <prop name="kotlin_version" />
+            <task name="components" type="org.gradle.api.reporting.components.ComponentReport">Displays the components produced by project ':lesson5'. [incubating]&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="buildDependents">Assembles and tests this project and all projects that depend on it.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="projects" type="org.gradle.api.tasks.diagnostics.ProjectReportTask">Displays the sub-projects of project ':lesson5'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="idea">Generates IDEA project files (IML, IPR, IWS)&lt;p&gt;&lt;i&gt;Task group: IDE&lt;i&gt;</task>
+            <task name="classes">Assembles main classes.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="buildEnvironment" type="org.gradle.api.tasks.diagnostics.BuildEnvironmentReportTask">Displays all buildscript dependencies declared in project ':lesson5'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="cleanIdeaModule" type="org.gradle.api.tasks.Delete">&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="testClasses">Assembles test classes.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="javadoc" type="org.gradle.api.tasks.javadoc.Javadoc">Generates Javadoc API documentation for the main source code.&lt;p&gt;&lt;i&gt;Task group: documentation&lt;i&gt;</task>
+            <task name="jar" type="org.gradle.api.tasks.bundling.Jar">Assembles a jar archive containing the main classes.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="model" type="org.gradle.api.reporting.model.ModelReport">Displays the configuration model of project ':lesson5'. [incubating]&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="copyMainKotlinClasses" type="org.jetbrains.kotlin.gradle.tasks.SyncOutputTask">&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="ideaModule" type="org.gradle.plugins.ide.idea.GenerateIdeaModule">Generates IDEA module files (IML)&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="processResources" type="org.gradle.language.jvm.tasks.ProcessResources">Processes main resources.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="tasks" type="org.gradle.api.tasks.diagnostics.TaskReportTask">Displays the tasks runnable from project ':lesson5'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="cleanIdea">Cleans IDEA project files (IML, IPR)&lt;p&gt;&lt;i&gt;Task group: IDE&lt;i&gt;</task>
+            <task name="copyTestKotlinClasses" type="org.jetbrains.kotlin.gradle.tasks.SyncOutputTask">&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="test" type="org.gradle.api.tasks.testing.Test">Runs the unit tests.&lt;p&gt;&lt;i&gt;Task group: verification&lt;i&gt;</task>
+            <task name="compileJava" type="org.gradle.api.tasks.compile.JavaCompile">Compiles main Java source.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="compileTestKotlin" type="org.jetbrains.kotlin.gradle.tasks.KotlinCompile">Compiles the source set 'test'.kotlin.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="dependencyInsight" type="org.gradle.api.tasks.diagnostics.DependencyInsightReportTask">Displays the insight into a specific dependency in project ':lesson5'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="check">Runs all checks.&lt;p&gt;&lt;i&gt;Task group: verification&lt;i&gt;</task>
+            <task name="assemble">Assembles the outputs of this project.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="clean" type="org.gradle.api.tasks.Delete">Deletes the build directory.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="compileTestJava" type="org.gradle.api.tasks.compile.JavaCompile">Compiles test Java source.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="dependencies" type="org.gradle.api.tasks.diagnostics.DependencyReportTask">Displays all dependencies declared in project ':lesson5'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="processTestResources" type="org.gradle.language.jvm.tasks.ProcessResources">Processes test resources.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="help" type="org.gradle.configuration.Help">Displays a help message.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <task name="compileKotlin" type="org.jetbrains.kotlin.gradle.tasks.KotlinCompile">Compiles the source set 'main'.kotlin.&lt;p&gt;&lt;i&gt;Task group: other&lt;i&gt;</task>
+            <task name="build">Assembles and tests this project.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="buildNeeded">Assembles and tests this project and all projects it depends on.&lt;p&gt;&lt;i&gt;Task group: build&lt;i&gt;</task>
+            <task name="properties" type="org.gradle.api.tasks.diagnostics.PropertyReportTask">Displays the properties of project ':lesson5'.&lt;p&gt;&lt;i&gt;Task group: help&lt;i&gt;</task>
+            <conf name="archives">Configuration for archive artifacts.</conf>
+            <conf name="compile" visible="false">Dependencies for source set 'main'.</conf>
+            <conf name="compileClasspath" visible="false">Compile classpath for source set 'main'.</conf>
+            <conf name="compileOnly" visible="false">Compile dependencies for source set 'main'.</conf>
+            <conf name="default">Configuration for default artifacts.</conf>
+            <conf name="kapt" />
+            <conf name="kaptTest" />
+            <conf name="runtime" visible="false">Runtime dependencies for source set 'main'.</conf>
+            <conf name="testCompile" visible="false">Dependencies for source set 'test'.</conf>
+            <conf name="testCompileClasspath" visible="false">Compile classpath for source set 'test'.</conf>
+            <conf name="testCompileOnly" visible="false">Compile dependencies for source set 'test'.</conf>
+            <conf name="testRuntime" visible="false">Runtime dependencies for source set 'test'.</conf>
+            <conf name="classpath" scriptClasspath="true" />
+          </extensions>
+        </project>
       </sub-project>
     </project>
   </component>
@@ -382,6 +505,14 @@
           </key>
           <value>
             <list>
+              <ExternalProjectPojo>
+                <option name="name" value=":lesson4" />
+                <option name="path" value="$PROJECT_DIR$/lesson4" />
+              </ExternalProjectPojo>
+              <ExternalProjectPojo>
+                <option name="name" value=":lesson5" />
+                <option name="path" value="$PROJECT_DIR$/lesson5" />
+              </ExternalProjectPojo>
               <ExternalProjectPojo>
                 <option name="name" value="2931408816" />
                 <option name="path" value="$PROJECT_DIR$" />
@@ -991,95 +1122,385 @@
             </list>
           </value>
         </entry>
-      </map>
-    </option>
-    <option name="modificationStamps">
-      <map>
-        <entry key="$PROJECT_DIR$" value="8935821309455" />
-        <entry key="$PROJECT_DIR$/lesson3/build.gradle" value="2522245911" />
-        <entry key="$PROJECT_DIR$/settings.gradle" value="3306979944" />
-        <entry key="$PROJECT_DIR$/../../../../src/gradle/study/basic" value="2976922707460" />
-      </map>
-    </option>
-    <option name="projectBuildClasspath">
-      <map>
-        <entry key="$PROJECT_DIR$">
+        <entry key="$PROJECT_DIR$/lesson4">
           <value>
-            <ExternalProjectBuildClasspathPojo>
-              <option name="modulesBuildClasspath">
-                <map>
-                  <entry key="$PROJECT_DIR$">
-                    <value>
-                      <ExternalModuleBuildClasspathPojo>
-                        <option name="entries">
-                          <list>
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/55a44cd7418e572dbc92263e019f1c168ea2b94c/kotlin-android-extensions-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/8db6949a924ad553fb7f6f103b66780c4d3e59c5/kotlin-android-extensions-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/38258f24943796a4b3f046e74f9ee40ce7196aff/kotlin-gradle-plugin-api-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/9b524344b9fb22dbe45e5047fa98b22d54301c2d/kotlin-gradle-plugin-api-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/dc31610e8195ca75891325591c8b1a2f4d9ac54a/kotlin-compiler-embeddable-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/782efe747ea43b08fa3d2c3184e83173934a7acb/kotlin-compiler-embeddable-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/d9c3aec59194fa1a969139dc794da6329935fc00/kotlin-compiler-runner-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/5798574aa3d0895427389d57fbb1996a23e74036/kotlin-compiler-runner-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/94be1d871c8cf8b118df0958232676605ffb3840/kotlin-annotation-processing-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/a53b076cf2e66c838189ddd69a0eccdaa05e43a5/kotlin-annotation-processing-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
-                          </list>
-                        </option>
-                        <option name="path" value="$PROJECT_DIR$" />
-                      </ExternalModuleBuildClasspathPojo>
-                    </value>
-                  </entry>
-                  <entry key="$PROJECT_DIR$/lesson1">
-                    <value>
-                      <ExternalModuleBuildClasspathPojo>
-                        <option name="entries">
-                          <list>
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/55a44cd7418e572dbc92263e019f1c168ea2b94c/kotlin-android-extensions-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/8db6949a924ad553fb7f6f103b66780c4d3e59c5/kotlin-android-extensions-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/38258f24943796a4b3f046e74f9ee40ce7196aff/kotlin-gradle-plugin-api-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/9b524344b9fb22dbe45e5047fa98b22d54301c2d/kotlin-gradle-plugin-api-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/dc31610e8195ca75891325591c8b1a2f4d9ac54a/kotlin-compiler-embeddable-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/782efe747ea43b08fa3d2c3184e83173934a7acb/kotlin-compiler-embeddable-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/d9c3aec59194fa1a969139dc794da6329935fc00/kotlin-compiler-runner-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/5798574aa3d0895427389d57fbb1996a23e74036/kotlin-compiler-runner-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/94be1d871c8cf8b118df0958232676605ffb3840/kotlin-annotation-processing-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/a53b076cf2e66c838189ddd69a0eccdaa05e43a5/kotlin-annotation-processing-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
-                          </list>
-                        </option>
-                        <option name="path" value="$PROJECT_DIR$/lesson1" />
-                      </ExternalModuleBuildClasspathPojo>
-                    </value>
-                  </entry>
-                  <entry key="$PROJECT_DIR$/lesson2">
-                    <value>
-                      <ExternalModuleBuildClasspathPojo>
-                        <option name="entries">
-                          <list>
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
-                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
+            <list>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the components produced by project ':lesson4'. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="components" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project and all projects that depend on it." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="buildDependents" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the sub-projects of project ':lesson4'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="projects" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles main classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="classes" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays all buildscript dependencies declared in project ':lesson4'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="buildEnvironment" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles test classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="testClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Generates Javadoc API documentation for the main source code." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="javadoc" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles a jar archive containing the main classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="jar" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the configuration model of project ':lesson4'. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="model" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="copyMainKotlinClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Processes main resources." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="processResources" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the tasks runnable from project ':lesson4'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="tasks" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="copyTestKotlinClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Runs the unit tests." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="test" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles main Java source." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="compileJava" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles the source set 'test'.kotlin." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="compileTestKotlin" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the insight into a specific dependency in project ':lesson4'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="dependencyInsight" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Runs all checks." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="check" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles the outputs of this project." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="assemble" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Deletes the build directory." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="clean" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles test Java source." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="compileTestJava" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays all dependencies declared in project ':lesson4'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="dependencies" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Processes test resources." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="processTestResources" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays a help message." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="help" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles the source set 'main'.kotlin." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="compileKotlin" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="build" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project and all projects it depends on." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="buildNeeded" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the properties of project ':lesson4'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson4" />
+                <option name="name" value="properties" />
+              </ExternalTaskPojo>
+            </list>
+          </value>
+        </entry>
+        <entry key="$PROJECT_DIR$/lesson5">
+          <value>
+            <list>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the components produced by project ':lesson5'. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="components" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project and all projects that depend on it." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="buildDependents" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the sub-projects of project ':lesson5'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="projects" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles main classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="classes" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays all buildscript dependencies declared in project ':lesson5'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="buildEnvironment" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles test classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="testClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Generates Javadoc API documentation for the main source code." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="javadoc" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles a jar archive containing the main classes." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="jar" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the configuration model of project ':lesson5'. [incubating]" />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="model" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="copyMainKotlinClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Processes main resources." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="processResources" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the tasks runnable from project ':lesson5'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="tasks" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="copyTestKotlinClasses" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Runs the unit tests." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="test" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles main Java source." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="compileJava" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles the source set 'test'.kotlin." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="compileTestKotlin" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the insight into a specific dependency in project ':lesson5'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="dependencyInsight" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Runs all checks." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="check" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles the outputs of this project." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="assemble" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Deletes the build directory." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="clean" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles test Java source." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="compileTestJava" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays all dependencies declared in project ':lesson5'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="dependencies" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Processes test resources." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="processTestResources" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays a help message." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="help" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Compiles the source set 'main'.kotlin." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="compileKotlin" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="build" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Assembles and tests this project and all projects it depends on." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="buildNeeded" />
+              </ExternalTaskPojo>
+              <ExternalTaskPojo>
+                <option name="description" value="Displays the properties of project ':lesson5'." />
+                <option name="linkedExternalProjectPath" value="$PROJECT_DIR$/lesson5" />
+                <option name="name" value="properties" />
+              </ExternalTaskPojo>
+            </list>
+          </value>
+        </entry>
+      </map>
+    </option>
+    <option name="modificationStamps">
+      <map>
+        <entry key="$PROJECT_DIR$/../../../../src/gradle/study/basic" value="2976922707460" />
+        <entry key="$PROJECT_DIR$" value="11929251576666" />
+        <entry key="$PROJECT_DIR$/lesson3/build.gradle" value="2522245911" />
+        <entry key="$PROJECT_DIR$/lesson4/build.gradle" value="2051916822" />
+        <entry key="$PROJECT_DIR$/lesson5/build.gradle" value="775741262" />
+        <entry key="$PROJECT_DIR$/settings.gradle" value="4236108516" />
+      </map>
+    </option>
+    <option name="projectBuildClasspath">
+      <map>
+        <entry key="$PROJECT_DIR$">
+          <value>
+            <ExternalProjectBuildClasspathPojo>
+              <option name="modulesBuildClasspath">
+                <map>
+                  <entry key="$PROJECT_DIR$">
+                    <value>
+                      <ExternalModuleBuildClasspathPojo>
+                        <option name="entries">
+                          <list>
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/55a44cd7418e572dbc92263e019f1c168ea2b94c/kotlin-android-extensions-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/8db6949a924ad553fb7f6f103b66780c4d3e59c5/kotlin-android-extensions-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/38258f24943796a4b3f046e74f9ee40ce7196aff/kotlin-gradle-plugin-api-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/9b524344b9fb22dbe45e5047fa98b22d54301c2d/kotlin-gradle-plugin-api-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/dc31610e8195ca75891325591c8b1a2f4d9ac54a/kotlin-compiler-embeddable-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/782efe747ea43b08fa3d2c3184e83173934a7acb/kotlin-compiler-embeddable-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/d9c3aec59194fa1a969139dc794da6329935fc00/kotlin-compiler-runner-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/5798574aa3d0895427389d57fbb1996a23e74036/kotlin-compiler-runner-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/94be1d871c8cf8b118df0958232676605ffb3840/kotlin-annotation-processing-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/a53b076cf2e66c838189ddd69a0eccdaa05e43a5/kotlin-annotation-processing-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
+                          </list>
+                        </option>
+                        <option name="path" value="$PROJECT_DIR$" />
+                      </ExternalModuleBuildClasspathPojo>
+                    </value>
+                  </entry>
+                  <entry key="$PROJECT_DIR$/lesson1">
+                    <value>
+                      <ExternalModuleBuildClasspathPojo>
+                        <option name="entries">
+                          <list>
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/55a44cd7418e572dbc92263e019f1c168ea2b94c/kotlin-android-extensions-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/8db6949a924ad553fb7f6f103b66780c4d3e59c5/kotlin-android-extensions-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/38258f24943796a4b3f046e74f9ee40ce7196aff/kotlin-gradle-plugin-api-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/9b524344b9fb22dbe45e5047fa98b22d54301c2d/kotlin-gradle-plugin-api-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/dc31610e8195ca75891325591c8b1a2f4d9ac54a/kotlin-compiler-embeddable-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/782efe747ea43b08fa3d2c3184e83173934a7acb/kotlin-compiler-embeddable-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/d9c3aec59194fa1a969139dc794da6329935fc00/kotlin-compiler-runner-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/5798574aa3d0895427389d57fbb1996a23e74036/kotlin-compiler-runner-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/94be1d871c8cf8b118df0958232676605ffb3840/kotlin-annotation-processing-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/a53b076cf2e66c838189ddd69a0eccdaa05e43a5/kotlin-annotation-processing-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
+                          </list>
+                        </option>
+                        <option name="path" value="$PROJECT_DIR$/lesson1" />
+                      </ExternalModuleBuildClasspathPojo>
+                    </value>
+                  </entry>
+                  <entry key="$PROJECT_DIR$/lesson2">
+                    <value>
+                      <ExternalModuleBuildClasspathPojo>
+                        <option name="entries">
+                          <list>
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
                             <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" />
                             <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar" />
                             <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar" />
@@ -1132,6 +1553,96 @@
                       </ExternalModuleBuildClasspathPojo>
                     </value>
                   </entry>
+                  <entry key="$PROJECT_DIR$/lesson4">
+                    <value>
+                      <ExternalModuleBuildClasspathPojo>
+                        <option name="entries">
+                          <list>
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/55a44cd7418e572dbc92263e019f1c168ea2b94c/kotlin-android-extensions-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/8db6949a924ad553fb7f6f103b66780c4d3e59c5/kotlin-android-extensions-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/38258f24943796a4b3f046e74f9ee40ce7196aff/kotlin-gradle-plugin-api-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/9b524344b9fb22dbe45e5047fa98b22d54301c2d/kotlin-gradle-plugin-api-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/dc31610e8195ca75891325591c8b1a2f4d9ac54a/kotlin-compiler-embeddable-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/782efe747ea43b08fa3d2c3184e83173934a7acb/kotlin-compiler-embeddable-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/d9c3aec59194fa1a969139dc794da6329935fc00/kotlin-compiler-runner-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/5798574aa3d0895427389d57fbb1996a23e74036/kotlin-compiler-runner-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/94be1d871c8cf8b118df0958232676605ffb3840/kotlin-annotation-processing-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/a53b076cf2e66c838189ddd69a0eccdaa05e43a5/kotlin-annotation-processing-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.1/e742de8adf25f631b39f74e2d6fd00cd9cdd609e/kotlin-gradle-plugin-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.1/5e3d99580c70b67a07cd70481943362e4b29d8d3/kotlin-gradle-plugin-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.1/a287944d92875a1f3c2161e5cddaede7720913d1/kotlin-stdlib-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.1/98e484e67f913e934559f7f55f0c94be5593f03c/kotlin-stdlib-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.1/2c0ad82587d187f78c4063fa7867ed3c4dfa54ca/kotlin-android-extensions-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.1/56cfcc61bc91638ea52d13ce90b565f50be3d6f5/kotlin-android-extensions-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.1/e48aafb092d4c3ddd6927f38f9f17f7117e1ef47/kotlin-gradle-plugin-api-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.1/9083de2c98801f1fe058b6280234265269c1cad0/kotlin-gradle-plugin-api-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.1/b84662e33f8f44d33265e964f1329ce5644af35c/kotlin-compiler-embeddable-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.1/d975091bb224a04b3717505a55875608642cc8d3/kotlin-compiler-embeddable-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.1/764b45d92a761810b29580aeae2fac3d614f9bf/kotlin-compiler-runner-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.1/cad5c437ac58f7245673a6c4fd73a656dd259b26/kotlin-compiler-runner-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.1/2756d002e8d1d1aa0d5a49e7c895b87514083fab/kotlin-annotation-processing-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.1/9f7312cea58b39ce82368261cd227758df78eb32/kotlin-annotation-processing-1.1.1.jar" />
+                          </list>
+                        </option>
+                        <option name="path" value="$PROJECT_DIR$/lesson4" />
+                      </ExternalModuleBuildClasspathPojo>
+                    </value>
+                  </entry>
+                  <entry key="$PROJECT_DIR$/lesson5">
+                    <value>
+                      <ExternalModuleBuildClasspathPojo>
+                        <option name="entries">
+                          <list>
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/446b2c92de7fc40adc0f0e46a6168b0274b8ab90/kotlin-gradle-plugin-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.0/19c8cb57a76c3469bff20662ab6dd6b0018da380/kotlin-gradle-plugin-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/f2d8698c46d1167ff24b06a840a87d91a02db891/commons-io-2.4-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/67313d715fbf0ea4fd0bdb69217fb77f807a8ce5/commons-lang-2.6-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/3303374103edd7cee62bf3539c40aa193d1c4767/kotlin-stdlib-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.0/96a07041a11a09cf578892932d7511e1e11e3b6c/kotlin-stdlib-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/55a44cd7418e572dbc92263e019f1c168ea2b94c/kotlin-android-extensions-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.0/8db6949a924ad553fb7f6f103b66780c4d3e59c5/kotlin-android-extensions-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/38258f24943796a4b3f046e74f9ee40ce7196aff/kotlin-gradle-plugin-api-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.0/9b524344b9fb22dbe45e5047fa98b22d54301c2d/kotlin-gradle-plugin-api-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/dc31610e8195ca75891325591c8b1a2f4d9ac54a/kotlin-compiler-embeddable-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.0/782efe747ea43b08fa3d2c3184e83173934a7acb/kotlin-compiler-embeddable-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/d9c3aec59194fa1a969139dc794da6329935fc00/kotlin-compiler-runner-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.0/5798574aa3d0895427389d57fbb1996a23e74036/kotlin-compiler-runner-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/94be1d871c8cf8b118df0958232676605ffb3840/kotlin-annotation-processing-1.1.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.0/a53b076cf2e66c838189ddd69a0eccdaa05e43a5/kotlin-annotation-processing-1.1.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/5991ca87ef1fb5544943d9abc5a9a37583fabe03/annotations-13.0-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.1/e742de8adf25f631b39f74e2d6fd00cd9cdd609e/kotlin-gradle-plugin-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin/1.1.1/5e3d99580c70b67a07cd70481943362e4b29d8d3/kotlin-gradle-plugin-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.1/a287944d92875a1f3c2161e5cddaede7720913d1/kotlin-stdlib-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.1.1/98e484e67f913e934559f7f55f0c94be5593f03c/kotlin-stdlib-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.1/2c0ad82587d187f78c4063fa7867ed3c4dfa54ca/kotlin-android-extensions-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.1.1/56cfcc61bc91638ea52d13ce90b565f50be3d6f5/kotlin-android-extensions-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.1/e48aafb092d4c3ddd6927f38f9f17f7117e1ef47/kotlin-gradle-plugin-api-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-gradle-plugin-api/1.1.1/9083de2c98801f1fe058b6280234265269c1cad0/kotlin-gradle-plugin-api-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.1/b84662e33f8f44d33265e964f1329ce5644af35c/kotlin-compiler-embeddable-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.1.1/d975091bb224a04b3717505a55875608642cc8d3/kotlin-compiler-embeddable-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.1/764b45d92a761810b29580aeae2fac3d614f9bf/kotlin-compiler-runner-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-runner/1.1.1/cad5c437ac58f7245673a6c4fd73a656dd259b26/kotlin-compiler-runner-1.1.1.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.1/2756d002e8d1d1aa0d5a49e7c895b87514083fab/kotlin-annotation-processing-1.1.1-sources.jar" />
+                            <option value="D:/jar/gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-annotation-processing/1.1.1/9f7312cea58b39ce82368261cd227758df78eb32/kotlin-annotation-processing-1.1.1.jar" />
+                          </list>
+                        </option>
+                        <option name="path" value="$PROJECT_DIR$/lesson5" />
+                      </ExternalModuleBuildClasspathPojo>
+                    </value>
+                  </entry>
                 </map>
               </option>
               <option name="name" value="2931408816" />
@@ -1311,189 +1822,73 @@
         <option value="$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionImpl.java" />
         <option value="$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/FileUtil.java" />
         <option value="$PROJECT_DIR$/lesson3/src/test/java/cn/net/pikachu/download/FileDownloaderTest.java" />
+        <option value="$PROJECT_DIR$/lesson4/src/test/java/com/coderising/jvm/loader/ClassFileloaderTest.java" />
+        <option value="$PROJECT_DIR$/lesson4/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java" />
+        <option value="$PROJECT_DIR$/lesson4/src/main/java/com/coderising/download/FileDownloaderTest.java" />
+        <option value="$PROJECT_DIR$/lesson4/src/main/java/com/coding/basic/linklist/LRUPageFrame.java" />
+        <option value="$PROJECT_DIR$/lesson5/src/main/java/java/lang/String.java" />
+        <option value="$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java" />
+        <option value="$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java" />
+        <option value="$PROJECT_DIR$/lesson5/src/test/java/com/coderising/jvm/loader/ClassFileLoader.java" />
+        <option value="$PROJECT_DIR$/lesson5/build.gradle" />
+        <option value="$PROJECT_DIR$/lesson5/src/main/java/com/coding/basic/stack/Stack.java" />
+        <option value="$PROJECT_DIR$/lesson5/src/test/java/com/coding/basic/stack/StackUtilTest.java" />
+        <option value="$PROJECT_DIR$/lesson5/src/main/java/com/coding/basic/stack/StackUtil.java" />
+        <option value="$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java" />
+        <option value="$PROJECT_DIR$/lesson5/build/classes/main/com/coderising/jvm/test/EmployeeV1.class" />
+        <option value="$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileParser.java" />
+        <option value="$PROJECT_DIR$/lesson5/src/test/java/com/coderising/jvm/loader/test/ClassFileloaderTest.java" />
+        <option value="$PROJECT_DIR$/src/main/kotlin/main.kt" />
       </list>
     </option>
-  </component>
-  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
-  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
-  <component name="JsGulpfileManager">
-    <detection-done>true</detection-done>
-    <sorting>DEFINITION_ORDER</sorting>
-  </component>
-  <component name="ProjectFrameBounds">
-    <option name="x" value="-9" />
-    <option name="y" value="-9" />
-    <option name="width" value="1938" />
-    <option name="height" value="1048" />
-  </component>
-  <component name="ProjectInspectionProfilesVisibleTreeState">
-    <entry key="Project Default">
-      <profile-state>
-        <expanded-state>
-          <State>
-            <id />
-          </State>
-          <State>
-            <id>Android &gt; Lint &gt; Internationalization</id>
-          </State>
-          <State>
-            <id>Internationalization issues</id>
-          </State>
-        </expanded-state>
-      </profile-state>
-    </entry>
-  </component>
-  <component name="ProjectView">
-    <navigator currentView="ProjectPane" proportions="" version="1">
-      <flattenPackages />
-      <showMembers />
-      <showModules />
-      <showLibraryContents />
-      <hideEmptyPackages />
-      <abbreviatePackageNames />
-      <autoscrollToSource />
-      <autoscrollFromSource />
-      <sortByType />
-      <manualOrder />
-      <foldersAlwaysOnTop value="true" />
-    </navigator>
-    <panes>
-      <pane id="Scratches" />
-      <pane id="Scope" />
-      <pane id="ProjectPane">
-        <subPane>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="lesson3" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="lesson3" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="src" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="test" />
-              <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="lesson3" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="src" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="test" />
-              <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="java" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="pikachu" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="download" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="lesson3" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="src" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="test" />
-              <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="java" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="pikachu" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="2931408816" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="lesson3" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="src" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="main" />
-              <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
+  </component>
+  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsGulpfileManager">
+    <detection-done>true</detection-done>
+    <sorting>DEFINITION_ORDER</sorting>
+  </component>
+  <component name="ProjectFrameBounds">
+    <option name="x" value="-9" />
+    <option name="y" value="-9" />
+    <option name="width" value="1938" />
+    <option name="height" value="1048" />
+  </component>
+  <component name="ProjectInspectionProfilesVisibleTreeState">
+    <entry key="Project Default">
+      <profile-state>
+        <expanded-state>
+          <State>
+            <id />
+          </State>
+          <State>
+            <id>Android &gt; Lint &gt; Internationalization</id>
+          </State>
+          <State>
+            <id>Internationalization issues</id>
+          </State>
+        </expanded-state>
+      </profile-state>
+    </entry>
+  </component>
+  <component name="ProjectView">
+    <navigator currentView="ProjectPane" proportions="" version="1">
+      <flattenPackages />
+      <showMembers />
+      <showModules />
+      <showLibraryContents />
+      <hideEmptyPackages />
+      <abbreviatePackageNames />
+      <autoscrollToSource />
+      <autoscrollFromSource />
+      <sortByType />
+      <manualOrder />
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="PackagesPane" />
+      <pane id="ProjectPane">
+        <subPane>
           <PATH>
             <PATH_ELEMENT>
               <option name="myItemId" value="2931408816" />
@@ -1503,30 +1898,6 @@
               <option name="myItemId" value="2931408816" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="lesson3" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="src" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="main" />
-              <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="java" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="pikachu" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="download" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
           </PATH>
           <PATH>
             <PATH_ELEMENT>
@@ -1537,34 +1908,10 @@
               <option name="myItemId" value="2931408816" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="lesson3" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
             <PATH_ELEMENT>
               <option name="myItemId" value="src" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="main" />
-              <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="java" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="pikachu" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="download" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="impl" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
           </PATH>
           <PATH>
             <PATH_ELEMENT>
@@ -1575,10 +1922,6 @@
               <option name="myItemId" value="2931408816" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="lesson3" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
             <PATH_ELEMENT>
               <option name="myItemId" value="src" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
@@ -1587,26 +1930,19 @@
               <option name="myItemId" value="main" />
               <option name="myItemType" value="org.jetbrains.plugins.gradle.projectView.GradleTreeStructureProvider$GradleSourceSetDirectoryNode" />
             </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="java" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="pikachu" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
           </PATH>
         </subPane>
       </pane>
-      <pane id="PackagesPane" />
+      <pane id="Scratches" />
+      <pane id="Scope" />
     </panes>
   </component>
   <component name="PropertiesComponent">
-    <property name="settings.editor.selected.configurable" value="copyright" />
+    <property name="settings.editor.selected.configurable" value="preferences.externalTools" />
     <property name="WebServerToolWindowFactoryState" value="false" />
     <property name="aspect.path.notification.shown" value="true" />
     <property name="js.eslint.eslintPackage" value="" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/../../../../../kotlin/study/mypetstore" />
     <property name="node.js.path.for.package.jscs" value="project" />
     <property name="nodejs_interpreter_path" value="E:/dev-tools/nvm/v7.2.0/node" />
     <property name="node.js.selected.package.jscs" value="" />
@@ -1631,44 +1967,24 @@
       </list>
     </option>
   </component>
-  <component name="RunManager" selected="JUnit.FileDownloaderTest.testDownload">
-    <configuration default="false" name="Main (1)" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
-        <pattern>
-          <option name="PATTERN" value="cn.net.pikachu.download.impl.test.*" />
-          <option name="ENABLED" value="true" />
-        </pattern>
-      </extension>
-      <option name="MAIN_CLASS_NAME" value="cn.net.pikachu.download.impl.test.Main" />
-      <option name="VM_PARAMETERS" />
-      <option name="PROGRAM_PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="ENABLE_SWING_INSPECTOR" value="false" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <module name="lesson3_main" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="false" name="FileDownloaderTest.testDownload" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+  <component name="RunManager" selected="Kotlin.MainKt">
+    <configuration default="false" name="ClassFileloaderTest" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
         <pattern>
-          <option name="PATTERN" value="cn.net.pikachu.download.*" />
+          <option name="PATTERN" value="com.coderising.jvm.loader.test.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
-      <module name="lesson3_test" />
+      <module name="lesson5_test" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
       <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PACKAGE_NAME" value="cn.net.pikachu.download" />
-      <option name="MAIN_CLASS_NAME" value="cn.net.pikachu.download.FileDownloaderTest" />
-      <option name="METHOD_NAME" value="testDownload" />
-      <option name="TEST_OBJECT" value="method" />
+      <option name="PACKAGE_NAME" value="com.coderising.jvm.loader.test" />
+      <option name="MAIN_CLASS_NAME" value="com.coderising.jvm.loader.test.ClassFileloaderTest" />
+      <option name="METHOD_NAME" />
+      <option name="TEST_OBJECT" value="class" />
       <option name="VM_PARAMETERS" value="-ea" />
       <option name="PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/lesson3" />
+      <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/lesson5" />
       <option name="ENV_VARIABLES" />
       <option name="PASS_PARENT_ENVS" value="true" />
       <option name="TEST_SEARCH_SCOPE">
@@ -1678,23 +1994,23 @@
       <patterns />
       <method />
     </configuration>
-    <configuration default="false" name="FileDownloaderTest" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+    <configuration default="false" name="ClassFileloaderTest.testClassPath" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
         <pattern>
-          <option name="PATTERN" value="cn.net.pikachu.download.*" />
+          <option name="PATTERN" value="com.coderising.jvm.loader.test.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
-      <module name="lesson3_test" />
+      <module name="lesson5_test" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
       <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PACKAGE_NAME" value="cn.net.pikachu.download" />
-      <option name="MAIN_CLASS_NAME" value="cn.net.pikachu.download.FileDownloaderTest" />
-      <option name="METHOD_NAME" />
-      <option name="TEST_OBJECT" value="class" />
+      <option name="PACKAGE_NAME" value="com.coderising.jvm.loader.test" />
+      <option name="MAIN_CLASS_NAME" value="com.coderising.jvm.loader.test.ClassFileloaderTest" />
+      <option name="METHOD_NAME" value="testClassPath" />
+      <option name="TEST_OBJECT" value="method" />
       <option name="VM_PARAMETERS" value="-ea" />
       <option name="PARAMETERS" />
-      <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/lesson3" />
+      <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/lesson5" />
       <option name="ENV_VARIABLES" />
       <option name="PASS_PARENT_ENVS" value="true" />
       <option name="TEST_SEARCH_SCOPE">
@@ -1704,14 +2020,14 @@
       <patterns />
       <method />
     </configuration>
-    <configuration default="false" name="DownloadFileWithThreadPool" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+    <configuration default="false" name="ClassFileParser" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea">
         <pattern>
-          <option name="PATTERN" value="cn.net.pikachu.download.impl.test.*" />
+          <option name="PATTERN" value="com.coderising.jvm.loader.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
-      <option name="MAIN_CLASS_NAME" value="cn.net.pikachu.download.impl.test.DownloadFileWithThreadPool" />
+      <option name="MAIN_CLASS_NAME" value="com.coderising.jvm.loader.ClassFileParser" />
       <option name="VM_PARAMETERS" />
       <option name="PROGRAM_PARAMETERS" />
       <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
@@ -1720,10 +2036,28 @@
       <option name="ENABLE_SWING_INSPECTOR" value="false" />
       <option name="ENV_VARIABLES" />
       <option name="PASS_PARENT_ENVS" value="true" />
-      <module name="lesson3_main" />
+      <module name="lesson5_main" />
       <envs />
       <method />
     </configuration>
+    <configuration default="false" name="2931408816 [clean]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
+      <ExternalSystemSettings>
+        <option name="executionName" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="externalSystemIdString" value="GRADLE" />
+        <option name="scriptParameters" />
+        <option name="taskDescriptions">
+          <list />
+        </option>
+        <option name="taskNames">
+          <list>
+            <option value="clean" />
+          </list>
+        </option>
+        <option name="vmOptions" />
+      </ExternalSystemSettings>
+      <method />
+    </configuration>
     <configuration default="false" name="MainKt" type="JetRunConfigurationType" factoryName="Kotlin" temporary="true" nameIsGenerated="true">
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
       <option name="MAIN_CLASS_NAME" value="MainKt" />
@@ -1733,7 +2067,7 @@
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
       <option name="ALTERNATIVE_JRE_PATH" />
       <option name="PASS_PARENT_ENVS" value="true" />
-      <module name="lesson3_main" />
+      <module name="2931408816_main" />
       <envs />
       <method />
     </configuration>
@@ -2150,19 +2484,19 @@
       <method />
     </configuration>
     <list size="5">
-      <item index="0" class="java.lang.String" itemvalue="Application.Main (1)" />
-      <item index="1" class="java.lang.String" itemvalue="JUnit.FileDownloaderTest.testDownload" />
-      <item index="2" class="java.lang.String" itemvalue="JUnit.FileDownloaderTest" />
-      <item index="3" class="java.lang.String" itemvalue="Application.DownloadFileWithThreadPool" />
+      <item index="0" class="java.lang.String" itemvalue="JUnit.ClassFileloaderTest" />
+      <item index="1" class="java.lang.String" itemvalue="JUnit.ClassFileloaderTest.testClassPath" />
+      <item index="2" class="java.lang.String" itemvalue="Application.ClassFileParser" />
+      <item index="3" class="java.lang.String" itemvalue="Gradle.2931408816 [clean]" />
       <item index="4" class="java.lang.String" itemvalue="Kotlin.MainKt" />
     </list>
     <recent_temporary>
       <list size="5">
-        <item index="0" class="java.lang.String" itemvalue="JUnit.FileDownloaderTest.testDownload" />
-        <item index="1" class="java.lang.String" itemvalue="Kotlin.MainKt" />
-        <item index="2" class="java.lang.String" itemvalue="Application.DownloadFileWithThreadPool" />
-        <item index="3" class="java.lang.String" itemvalue="JUnit.FileDownloaderTest" />
-        <item index="4" class="java.lang.String" itemvalue="Application.Main (1)" />
+        <item index="0" class="java.lang.String" itemvalue="Kotlin.MainKt" />
+        <item index="1" class="java.lang.String" itemvalue="JUnit.ClassFileloaderTest" />
+        <item index="2" class="java.lang.String" itemvalue="Application.ClassFileParser" />
+        <item index="3" class="java.lang.String" itemvalue="Gradle.2931408816 [clean]" />
+        <item index="4" class="java.lang.String" itemvalue="JUnit.ClassFileloaderTest.testClassPath" />
       </list>
     </recent_temporary>
   </component>
@@ -2185,43 +2519,52 @@
       <workItem from="1489368000173" duration="1580000" />
       <workItem from="1489391209444" duration="8133000" />
       <workItem from="1489460871957" duration="1255000" />
+      <workItem from="1491007286971" duration="4927000" />
+      <workItem from="1491572097285" duration="1755000" />
+      <workItem from="1491575467049" duration="2654000" />
+      <workItem from="1491637655203" duration="5776000" />
+      <workItem from="1491650536561" duration="1535000" />
+      <workItem from="1491701452638" duration="8089000" />
+      <workItem from="1491719529088" duration="2220000" />
+      <workItem from="1491743704287" duration="602000" />
+      <workItem from="1491764494419" duration="380000" />
     </task>
     <servers />
   </component>
   <component name="TestHistory">
-    <history-entry file="FileDownloaderTest_testDownload - 2017.03.14 at 11h 20m 36s.xml">
-      <configuration name="FileDownloaderTest.testDownload" configurationId="JUnit" />
+    <history-entry file="ClassFileloaderTest - 2017.04.09 at 10h 31m 27s.xml">
+      <configuration name="ClassFileloaderTest" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="FileDownloaderTest_testDownload - 2017.03.14 at 11h 22m 35s.xml">
-      <configuration name="FileDownloaderTest.testDownload" configurationId="JUnit" />
+    <history-entry file="ClassFileloaderTest - 2017.04.09 at 10h 32m 16s.xml">
+      <configuration name="ClassFileloaderTest" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="FileDownloaderTest_testDownload - 2017.03.14 at 11h 22m 53s.xml">
-      <configuration name="FileDownloaderTest.testDownload" configurationId="JUnit" />
+    <history-entry file="ClassFileloaderTest - 2017.04.09 at 10h 38m 01s.xml">
+      <configuration name="ClassFileloaderTest" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="FileDownloaderTest_testDownload - 2017.03.14 at 11h 24m 41s.xml">
-      <configuration name="FileDownloaderTest.testDownload" configurationId="JUnit" />
+    <history-entry file="ClassFileloaderTest - 2017.04.09 at 10h 39m 59s.xml">
+      <configuration name="ClassFileloaderTest" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="FileDownloaderTest_testDownload - 2017.03.14 at 11h 25m 51s.xml">
-      <configuration name="FileDownloaderTest.testDownload" configurationId="JUnit" />
+    <history-entry file="ClassFileloaderTest - 2017.04.09 at 10h 40m 32s.xml">
+      <configuration name="ClassFileloaderTest" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="FileDownloaderTest_testDownload - 2017.03.14 at 11h 26m 35s.xml">
-      <configuration name="FileDownloaderTest.testDownload" configurationId="JUnit" />
+    <history-entry file="ClassFileloaderTest - 2017.04.09 at 11h 39m 29s.xml">
+      <configuration name="ClassFileloaderTest" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="FileDownloaderTest_testDownload - 2017.03.14 at 11h 27m 48s.xml">
-      <configuration name="FileDownloaderTest.testDownload" configurationId="JUnit" />
+    <history-entry file="ClassFileloaderTest_testClassPath - 2017.04.09 at 10h 31m 22s.xml">
+      <configuration name="ClassFileloaderTest.testClassPath" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="FileDownloaderTest_testDownload - 2017.03.14 at 11h 27m 54s.xml">
-      <configuration name="FileDownloaderTest.testDownload" configurationId="JUnit" />
+    <history-entry file="ClassFileloaderTest_testClassPath - 2017.04.09 at 10h 40m 38s.xml">
+      <configuration name="ClassFileloaderTest.testClassPath" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="FileDownloaderTest_testDownload - 2017.03.14 at 11h 28m 57s.xml">
-      <configuration name="FileDownloaderTest.testDownload" configurationId="JUnit" />
+    <history-entry file="ClassFileloaderTest_testMagicNumber - 2017.04.09 at 10h 25m 09s.xml">
+      <configuration name="ClassFileloaderTest.testMagicNumber" configurationId="JUnit" />
     </history-entry>
-    <history-entry file="FileDownloaderTest_testDownload - 2017.03.14 at 11h 29m 05s.xml">
-      <configuration name="FileDownloaderTest.testDownload" configurationId="JUnit" />
+    <history-entry file="ClassFileloaderTest_testMagicNumber - 2017.04.09 at 10h 30m 11s.xml">
+      <configuration name="ClassFileloaderTest.testMagicNumber" configurationId="JUnit" />
     </history-entry>
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="32115000" />
+    <option name="totallyTimeSpent" value="60053000" />
   </component>
   <component name="TodoView">
     <todo-panel id="selected-file">
@@ -2234,32 +2577,31 @@
   </component>
   <component name="ToolWindowManager">
     <frame x="-9" y="-9" width="1938" height="1048" extended-state="6" />
-    <editor active="true" />
     <layout>
       <window_info id="Palette" 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="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32993197" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
       <window_info id="Nl-Palette" 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="2" 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.32879817" sideWeight="0.5" order="7" 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.32842582" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Palette&#9;" 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="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="2" 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.33" sideWeight="0.5" order="7" side_tool="true" 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.3295583" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
       <window_info id="Maven Projects" 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="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32879817" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.3204983" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
       <window_info id="Properties" 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="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32993197" sideWeight="0.5" order="7" 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="2" side_tool="false" content_ui="tabs" />
       <window_info id="Designer" 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="2" side_tool="false" 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.27736053" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32027897" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
       <window_info id="Database" 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="Gradle" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3299356" sideWeight="0.5" order="3" 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.32886267" 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="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="UI Designer" 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="2" side_tool="false" content_ui="tabs" />
       <window_info id="Theme Preview" 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="Favorites" 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="2" side_tool="true" content_ui="tabs" />
-      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.39909297" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.398641" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
       <window_info id="Message" 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="0" side_tool="false" content_ui="tabs" />
       <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
@@ -2289,10 +2631,32 @@
           <properties />
           <option name="timeStamp" value="3" />
         </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/lesson5/src/main/java/com/coding/basic/stack/StackUtil.java</url>
+          <line>131</line>
+          <properties />
+          <option name="timeStamp" value="7" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/lesson5/build/classes/main/com/coderising/jvm/clz/AccessFlag.class</url>
+          <line>1</line>
+          <properties />
+          <option name="timeStamp" value="11" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileParser.java</url>
+          <line>49</line>
+          <properties />
+          <option name="timeStamp" value="12" />
+        </line-breakpoint>
       </breakpoints>
-      <option name="time" value="4" />
+      <option name="time" value="13" />
     </breakpoint-manager>
-    <watches-manager />
+    <watches-manager>
+      <configuration name="Application">
+        <watch expression="classFile" />
+      </configuration>
+    </watches-manager>
   </component>
   <component name="antWorkspaceConfiguration">
     <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
@@ -2301,393 +2665,354 @@
   <component name="editorHistoryManager">
     <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/FileDownloader.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1449">
-          <caret line="63" column="35" lean-forward="false" selection-start-line="63" selection-start-column="35" selection-end-line="63" selection-end-column="35" />
-          <folding />
+        <state relative-caret-position="1012">
+          <caret line="55" column="38" lean-forward="false" selection-start-line="55" selection-start-column="38" selection-end-line="55" selection-end-column="38" />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/DownloadThread.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="644">
-          <caret line="33" column="21" lean-forward="false" selection-start-line="33" selection-start-column="21" selection-end-line="33" selection-end-column="21" />
-          <folding />
+        <state relative-caret-position="483">
+          <caret line="27" column="31" lean-forward="false" selection-start-line="27" selection-start-column="31" selection-end-line="27" selection-end-column="31" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionManagerImpl.java">
+    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionImpl.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="322">
-          <caret line="14" column="20" lean-forward="true" selection-start-line="14" selection-start-column="20" selection-end-line="14" selection-end-column="20" />
-          <folding />
+        <state relative-caret-position="1127">
+          <caret line="58" column="26" lean-forward="false" selection-start-line="58" selection-start-column="26" selection-end-line="58" selection-end-column="26" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/basic/LinkedList.java">
+    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/FileUtil.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="4370">
-          <caret line="190" column="5" lean-forward="false" selection-start-line="190" selection-start-column="5" selection-end-line="190" selection-end-column="5" />
-          <folding>
-            <element signature="imports" expanded="true" />
-            <element signature="class#Itr#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#next#0;class#Itr#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#add#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#add#1;class#LinkedList#0" expanded="false" />
-            <element signature="method#addFirst#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#removeFirst#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#removeLast#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#toString#0;class#LinkedList#0" expanded="false" />
-          </folding>
+        <state relative-caret-position="437">
+          <caret line="25" column="26" lean-forward="false" selection-start-line="25" selection-start-column="26" selection-end-line="25" selection-end-column="26" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/settings.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson3/src/test/java/cn/net/pikachu/download/FileDownloaderTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="391">
-          <caret line="17" column="31" lean-forward="false" selection-start-line="17" selection-start-column="31" selection-end-line="17" selection-end-column="31" />
-          <folding />
+        <state relative-caret-position="460">
+          <caret line="34" column="41" lean-forward="false" selection-start-line="34" selection-start-column="41" selection-end-line="34" selection-end-column="41" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/build.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson4/build.gradle">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="391">
-          <caret line="17" column="25" lean-forward="false" selection-start-line="17" selection-start-column="25" selection-end-line="17" selection-end-column="25" />
-          <folding />
+        <state relative-caret-position="414">
+          <caret line="18" column="0" lean-forward="false" selection-start-line="18" selection-start-column="0" selection-end-line="18" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/basic/LinkedList.java">
+    <entry file="file://$PROJECT_DIR$/lesson4/src/main/java/com/coderising/jvm/test/EmployeeV1.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding>
-            <element signature="imports" expanded="true" />
-            <element signature="class#Itr#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#next#0;class#Itr#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#add#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#add#1;class#LinkedList#0" expanded="false" />
-            <element signature="method#addFirst#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#removeFirst#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#removeLast#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#toString#0;class#LinkedList#0" expanded="false" />
-          </folding>
+        <state relative-caret-position="46">
+          <caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson2/build.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson4/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="621">
-          <caret line="27" column="80" lean-forward="false" selection-start-line="27" selection-start-column="80" selection-end-line="27" selection-end-column="80" />
+        <state relative-caret-position="176">
+          <caret line="20" column="18" lean-forward="false" selection-start-line="20" selection-start-column="18" selection-end-line="20" selection-end-column="18" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/build.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson4/src/test/java/com/coderising/jvm/loader/ClassFileloaderTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="391">
-          <caret line="17" column="25" lean-forward="false" selection-start-line="17" selection-start-column="25" selection-end-line="17" selection-end-column="25" />
-          <folding />
+        <state relative-caret-position="345">
+          <caret line="26" column="45" lean-forward="false" selection-start-line="26" selection-start-column="45" selection-end-line="26" selection-end-column="45" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson2/src/test/java/cn/net/pikachu/array/StrutsTest.java">
+    <entry file="file://$PROJECT_DIR$/lesson4/src/main/java/com/coding/basic/linklist/LinkedList.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="115">
-          <caret line="11" column="0" lean-forward="false" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+        <state relative-caret-position="92">
+          <caret line="5" column="13" lean-forward="false" selection-start-line="5" selection-start-column="13" selection-end-line="5" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson2/src/main/java/cn/net/pikachu/array/ArrayUtil.java">
+    <entry file="file://$PROJECT_DIR$/lesson4/src/main/java/com/coderising/download/FileDownloaderTest.java" />
+    <entry file="file://$PROJECT_DIR$/lesson4/src/main/java/com/coderising/litestruts/StrutsTest.java" />
+    <entry file="file://$PROJECT_DIR$/lesson4/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="368">
-          <caret line="18" column="42" lean-forward="true" selection-start-line="18" selection-start-column="42" selection-end-line="18" selection-end-column="42" />
+        <state relative-caret-position="437">
+          <caret line="19" column="39" lean-forward="false" selection-start-line="19" selection-start-column="39" selection-end-line="19" selection-end-column="39" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson2/src/main/java/cn/net/pikachu/litestruts/Struts.java">
+    <entry file="file://$PROJECT_DIR$/lesson4/src/main/java/com/coding/basic/linklist/LRUPageFrame.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="460">
-          <caret line="28" column="8" lean-forward="true" selection-start-line="28" selection-start-column="8" selection-end-line="28" selection-end-column="8" />
+        <state relative-caret-position="459">
+          <caret line="88" column="29" lean-forward="false" selection-start-line="88" selection-start-column="29" selection-end-line="88" selection-end-column="29" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson2/build.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/litestruts/StrutsTest.java" />
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/java/lang/String.java" />
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="567">
-          <caret line="27" column="80" lean-forward="false" selection-start-line="27" selection-start-column="80" selection-end-line="27" selection-end-column="80" />
+        <state relative-caret-position="-308">
+          <caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/build.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="357">
-          <caret line="17" column="25" lean-forward="false" selection-start-line="17" selection-start-column="25" selection-end-line="17" selection-end-column="25" />
-          <folding />
+        <state relative-caret-position="46">
+          <caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson2/src/test/java/cn/net/pikachu/array/StrutsTest.java">
+    <entry file="file://$PROJECT_DIR$/lesson1/src/main/java/cn/net/pikachu/basic/Stack.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        <state relative-caret-position="69">
+          <caret line="3" column="0" lean-forward="true" selection-start-line="3" selection-start-column="0" selection-end-line="3" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson2/build.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/basic/Stack.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        <state relative-caret-position="46">
+          <caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson1/build.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java" />
+    <entry file="file://$PROJECT_DIR$/build.gradle">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="105">
-          <caret line="5" column="0" lean-forward="false" selection-start-line="5" selection-start-column="0" selection-end-line="5" selection-end-column="0" />
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" 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$/lesson2/build.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coding/basic/array/ArrayList.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="621">
-          <caret line="27" column="80" lean-forward="false" selection-start-line="27" selection-start-column="80" selection-end-line="27" selection-end-column="80" />
+        <state relative-caret-position="276">
+          <caret line="13" column="0" lean-forward="false" selection-start-line="13" selection-start-column="0" selection-end-line="13" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson2/src/test/java/cn/net/pikachu/array/StrutsTest.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coding/basic/stack/Stack.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="115">
-          <caret line="11" column="0" lean-forward="false" selection-start-line="11" selection-start-column="0" selection-end-line="11" selection-end-column="0" />
+        <state relative-caret-position="391">
+          <caret line="17" column="34" lean-forward="true" selection-start-line="17" selection-start-column="34" selection-end-line="17" selection-end-column="34" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson2/src/main/java/cn/net/pikachu/array/ArrayUtil.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/test/java/com/coding/basic/stack/StackUtilTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="368">
-          <caret line="18" column="42" lean-forward="false" selection-start-line="18" selection-start-column="42" selection-end-line="18" selection-end-column="42" />
+        <state relative-caret-position="276">
+          <caret line="15" column="37" lean-forward="false" selection-start-line="15" selection-start-column="37" selection-end-line="15" selection-end-column="37" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson2/src/main/java/cn/net/pikachu/litestruts/Struts.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coding/basic/stack/StackUtil.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-1260">
-          <caret line="28" column="8" lean-forward="false" selection-start-line="28" selection-start-column="8" selection-end-line="28" selection-end-column="8" />
+        <state relative-caret-position="253">
+          <caret line="16" column="25" lean-forward="false" selection-start-line="16" selection-start-column="25" selection-end-line="16" selection-end-column="25" />
+          <folding>
+            <element signature="method#isValidPairs#0;class#StackUtil#0" expanded="false" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/basic/ArrayList.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/test/EmployeeV1.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        <state relative-caret-position="-50">
+          <caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson1/src/main/java/cn/net/pikachu/basic/LinkedList.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/constant/ClassInfo.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="115">
-          <caret line="5" column="0" lean-forward="true" selection-start-line="5" selection-start-column="0" selection-end-line="159" selection-end-column="5" />
+        <state relative-caret-position="46">
+          <caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/test/cn/net/pikachu/basic/LinkedListTest.java" />
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/FileDownloaderTest.java" />
-    <entry file="file://$PROJECT_DIR$/build.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/constant/UTF8Info.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="90">
-          <caret line="14" column="20" lean-forward="false" selection-start-line="14" selection-start-column="20" selection-end-line="14" selection-end-column="20" />
-          <folding />
+        <state relative-caret-position="46">
+          <caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/gradlew.bat">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        <state relative-caret-position="23">
+          <caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/settings.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson5/build/classes/main/com/coderising/jvm/test/EmployeeV1.class">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="207">
-          <caret line="17" column="31" lean-forward="false" selection-start-line="17" selection-start-column="31" selection-end-line="17" selection-end-column="31" />
-          <folding />
+        <state relative-caret-position="-188">
+          <caret line="6" column="0" lean-forward="true" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/basic/test/main.kt">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/util/Util.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="460">
-          <caret line="20" column="14" lean-forward="false" selection-start-line="20" selection-start-column="14" selection-end-line="20" selection-end-column="14" />
+        <state relative-caret-position="92">
+          <caret line="4" column="0" lean-forward="false" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/test/java/cn/net/pikachu/basic/LinkedListTest.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/constant/StringInfo.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="221">
-          <caret line="242" column="0" lean-forward="true" selection-start-line="242" selection-start-column="0" selection-end-line="246" selection-end-column="21" />
+        <state relative-caret-position="368">
+          <caret line="26" column="0" lean-forward="false" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/basic/LinkedList.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/constant/ConstantPool.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1655">
-          <caret line="300" column="27" lean-forward="false" selection-start-line="300" selection-start-column="27" selection-end-line="300" selection-end-column="27" />
-          <folding>
-            <element signature="imports" expanded="true" />
-            <element signature="class#Itr#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#next#0;class#Itr#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#add#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#add#1;class#LinkedList#0" expanded="false" />
-            <element signature="method#addFirst#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#removeFirst#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#removeLast#0;class#LinkedList#0" expanded="false" />
-            <element signature="method#toString#0;class#LinkedList#0" expanded="false" />
-          </folding>
+        <state relative-caret-position="292">
+          <caret line="19" column="49" lean-forward="false" selection-start-line="19" selection-start-column="49" selection-end-line="19" selection-end-column="49" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/api/ConnectionException.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/clz/ClassIndex.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="46">
-          <caret line="2" column="13" lean-forward="false" selection-start-line="2" selection-start-column="13" selection-end-line="2" selection-end-column="13" />
+        <state relative-caret-position="69">
+          <caret line="3" column="26" lean-forward="true" selection-start-line="3" selection-start-column="26" selection-end-line="3" selection-end-column="26" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/build.gradle">
+    <entry file="file://$PROJECT_DIR$/lesson5/build/classes/main/com/coderising/jvm/clz/ClassFile.class">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="633">
-          <caret line="30" column="0" lean-forward="true" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="-1080">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/okhttp/Main.java" />
-    <entry file="jar://E:/Program Files/Java/jdk1.8.0_111/src.zip!/java/io/InputStream.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/build/classes/main/com/coderising/jvm/clz/AccessFlag.class">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1083">
-          <caret line="160" column="15" lean-forward="false" selection-start-line="160" selection-start-column="15" selection-end-line="160" selection-end-column="15" />
-          <folding />
+        <state relative-caret-position="92">
+          <caret line="4" column="0" lean-forward="true" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="0" />
+          <folding>
+            <element signature="e#0#589#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/api/DownloadListener.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/test/Main.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="46">
-          <caret line="2" column="17" lean-forward="false" selection-start-line="2" selection-start-column="17" selection-end-line="2" selection-end-column="17" />
+        <state relative-caret-position="115">
+          <caret line="5" column="19" lean-forward="true" selection-start-line="5" selection-start-column="19" selection-end-line="5" selection-end-column="19" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/example/Downloader.java" />
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/api/ConnectionManager.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/constant/ConstantInfo.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="184">
-          <caret line="8" column="22" lean-forward="false" selection-start-line="8" selection-start-column="22" selection-end-line="8" selection-end-column="22" />
+        <state relative-caret-position="368">
+          <caret line="16" column="0" lean-forward="false" selection-start-line="16" selection-start-column="0" selection-end-line="16" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="jar://E:/Program Files/Java/jdk1.8.0_111/src.zip!/java/io/RandomAccessFile.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-366">
-          <caret line="151" column="43" lean-forward="true" selection-start-line="151" selection-start-column="43" selection-end-line="151" selection-end-column="43" />
-          <folding />
+        <state relative-caret-position="230">
+          <caret line="10" column="0" lean-forward="false" selection-start-line="10" selection-start-column="0" selection-end-line="10" selection-end-column="0" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/api/Connection.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="184">
-          <caret line="11" column="18" lean-forward="false" selection-start-line="11" selection-start-column="18" selection-end-line="11" selection-end-column="18" />
+        <state relative-caret-position="368">
+          <caret line="18" column="0" lean-forward="false" selection-start-line="18" selection-start-column="0" selection-end-line="18" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/impl/test/Main.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/clz/AccessFlag.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="299">
-          <caret line="15" column="1" lean-forward="true" selection-start-line="15" selection-start-column="1" selection-end-line="15" selection-end-column="1" />
+        <state relative-caret-position="276">
+          <caret line="18" column="0" lean-forward="false" selection-start-line="18" selection-start-column="0" selection-end-line="18" selection-end-column="0" />
+          <folding>
+            <element signature="e#342#343#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/impl/test/DownloadWithRange.java">
+    <entry file="jar://E:/Program Files/Java/jdk1.8.0_111/src.zip!/java/lang/Object.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="416">
-          <caret line="48" column="60" lean-forward="false" selection-start-line="48" selection-start-column="60" selection-end-line="48" selection-end-column="60" />
+        <state relative-caret-position="299">
+          <caret line="36" column="0" lean-forward="false" selection-start-line="36" selection-start-column="0" selection-end-line="36" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/impl/test/DownloadFileWithThreadPool.java">
+    <entry file="jar://E:/Program Files/Java/jdk1.8.0_111/src.zip!/java/lang/AbstractStringBuilder.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="215">
-          <caret line="36" column="43" lean-forward="true" selection-start-line="36" selection-start-column="43" selection-end-line="36" selection-end-column="43" />
+        <state relative-caret-position="989">
+          <caret line="67" column="0" lean-forward="false" selection-start-line="67" selection-start-column="0" selection-end-line="67" selection-end-column="0" />
           <folding>
-            <element signature="imports" expanded="true" />
+            <element signature="e#1369#1370#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/kotlin/main.kt">
+    <entry file="jar://E:/Program Files/Java/jdk1.8.0_111/src.zip!/java/lang/StringBuilder.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="449">
-          <caret line="29" column="49" lean-forward="false" selection-start-line="29" selection-start-column="49" selection-end-line="29" selection-end-column="49" />
+        <state relative-caret-position="1495">
+          <caret line="88" column="0" lean-forward="false" selection-start-line="88" selection-start-column="0" selection-end-line="88" selection-end-column="0" />
           <folding>
-            <element signature="e#0#100#0" expanded="true" />
-            <element signature="n#!!doc;n#main#0" expanded="false" />
+            <element signature="e#2896#2897#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/LogUtil.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/clz/ClassFile.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="161">
-          <caret line="7" column="102" lean-forward="false" selection-start-line="7" selection-start-column="102" selection-end-line="7" selection-end-column="102" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionManagerImpl.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="184">
-          <caret line="23" column="67" lean-forward="false" selection-start-line="23" selection-start-column="67" selection-end-line="23" selection-end-column="67" />
+        <state relative-caret-position="1081">
+          <caret line="66" column="63" lean-forward="false" selection-start-line="66" selection-start-column="63" selection-end-line="66" selection-end-column="63" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/FileDownloader.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="253">
-          <caret line="55" column="38" lean-forward="false" selection-start-line="55" selection-start-column="38" selection-end-line="55" selection-end-column="38" />
+        <state relative-caret-position="1449">
+          <caret line="76" column="0" lean-forward="false" selection-start-line="76" selection-start-column="0" selection-end-line="76" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/DownloadThread.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileParser.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="483">
-          <caret line="27" column="31" lean-forward="true" selection-start-line="27" selection-start-column="31" selection-end-line="27" selection-end-column="31" />
+        <state relative-caret-position="851">
+          <caret line="51" column="24" lean-forward="false" selection-start-line="51" selection-start-column="24" selection-end-line="51" selection-end-column="24" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/impl/ConnectionImpl.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/src/test/java/com/coderising/jvm/loader/test/ClassFileloaderTest.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-416">
-          <caret line="58" column="26" lean-forward="true" selection-start-line="58" selection-start-column="26" selection-end-line="58" selection-end-column="26" />
+        <state relative-caret-position="2553">
+          <caret line="123" column="48" lean-forward="false" selection-start-line="123" selection-start-column="48" selection-end-line="123" selection-end-column="48" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/main/java/cn/net/pikachu/download/FileUtil.java">
+    <entry file="file://$PROJECT_DIR$/lesson5/build.gradle">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="299">
-          <caret line="25" column="26" lean-forward="false" selection-start-line="25" selection-start-column="26" selection-end-line="25" selection-end-column="26" />
+        <state relative-caret-position="680">
+          <caret line="31" column="0" lean-forward="false" selection-start-line="31" selection-start-column="0" selection-end-line="31" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lesson3/src/test/java/cn/net/pikachu/download/FileDownloaderTest.java">
+    <entry file="file://$PROJECT_DIR$/src/main/kotlin/main.kt">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="460">
-          <caret line="34" column="41" lean-forward="false" selection-start-line="34" selection-start-column="41" selection-end-line="34" selection-end-column="41" />
-          <folding />
+        <state relative-caret-position="161">
+          <caret line="9" column="32" lean-forward="false" selection-start-line="9" selection-start-column="32" selection-end-line="9" selection-end-column="32" />
+          <folding>
+            <element signature="n#!!doc;n#main#0" expanded="false" />
+          </folding>
         </state>
       </provider>
     </entry>
diff --git a/group13/2931408816/lesson4/src/main/java/com/coding/basic/BinaryTreeNode.java b/group13/2931408816/lesson4/src/main/java/com/coding/basic/BinaryTreeNode.java~CoderXLoong_master
similarity index 100%
rename from group13/2931408816/lesson4/src/main/java/com/coding/basic/BinaryTreeNode.java
rename to group13/2931408816/lesson4/src/main/java/com/coding/basic/BinaryTreeNode.java~CoderXLoong_master
diff --git a/group13/2931408816/lesson4/src/main/java/com/coding/basic/BinaryTreeNode.java~HEAD b/group13/2931408816/lesson4/src/main/java/com/coding/basic/BinaryTreeNode.java~HEAD
new file mode 100644
index 0000000000..d7ac820192
--- /dev/null
+++ b/group13/2931408816/lesson4/src/main/java/com/coding/basic/BinaryTreeNode.java~HEAD
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group13/2931408816/lesson4/src/main/java/com/coding/basic/Iterator.java b/group13/2931408816/lesson4/src/main/java/com/coding/basic/Iterator.java~CoderXLoong_master
similarity index 100%
rename from group13/2931408816/lesson4/src/main/java/com/coding/basic/Iterator.java
rename to group13/2931408816/lesson4/src/main/java/com/coding/basic/Iterator.java~CoderXLoong_master
diff --git a/group13/2931408816/lesson4/src/main/java/com/coding/basic/Iterator.java~HEAD b/group13/2931408816/lesson4/src/main/java/com/coding/basic/Iterator.java~HEAD
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/group13/2931408816/lesson4/src/main/java/com/coding/basic/Iterator.java~HEAD
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group13/2931408816/lesson4/src/main/java/com/coding/basic/List.java b/group13/2931408816/lesson4/src/main/java/com/coding/basic/List.java~CoderXLoong_master
similarity index 100%
rename from group13/2931408816/lesson4/src/main/java/com/coding/basic/List.java
rename to group13/2931408816/lesson4/src/main/java/com/coding/basic/List.java~CoderXLoong_master
diff --git a/group13/2931408816/lesson4/src/main/java/com/coding/basic/List.java~HEAD b/group13/2931408816/lesson4/src/main/java/com/coding/basic/List.java~HEAD
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/group13/2931408816/lesson4/src/main/java/com/coding/basic/List.java~HEAD
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group13/2931408816/lesson4/src/main/java/com/coding/basic/Stack.java b/group13/2931408816/lesson4/src/main/java/com/coding/basic/Stack.java~CoderXLoong_master
similarity index 100%
rename from group13/2931408816/lesson4/src/main/java/com/coding/basic/Stack.java
rename to group13/2931408816/lesson4/src/main/java/com/coding/basic/Stack.java~CoderXLoong_master
diff --git a/group13/2931408816/lesson4/src/main/java/com/coding/basic/Stack.java~HEAD b/group13/2931408816/lesson4/src/main/java/com/coding/basic/Stack.java~HEAD
new file mode 100644
index 0000000000..459ec560b4
--- /dev/null
+++ b/group13/2931408816/lesson4/src/main/java/com/coding/basic/Stack.java~HEAD
@@ -0,0 +1,24 @@
+package com.coding.basic;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group13/2931408816/lesson5/build.gradle b/group13/2931408816/lesson5/build.gradle
new file mode 100644
index 0000000000..3d1b2e47df
--- /dev/null
+++ b/group13/2931408816/lesson5/build.gradle
@@ -0,0 +1,31 @@
+
+buildscript {
+    ext.kotlin_version = '1.1.1'
+
+    repositories {
+        mavenCentral()
+    }
+    dependencies {
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+    }
+}
+
+apply plugin: 'java'
+apply plugin: 'kotlin'
+
+sourceCompatibility = 1.8
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
+    // https://mvnrepository.com/artifact/commons-io/commons-io
+    compile group: 'commons-io', name: 'commons-io', version: '2.5'
+
+    // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
+    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5'
+
+    testCompile group: 'junit', name: 'junit', version: '4.12'
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/clz/AccessFlag.java
new file mode 100644
index 0000000000..faae056835
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/clz/AccessFlag.java
@@ -0,0 +1,25 @@
+package com.coderising.jvm.clz;
+
+public class AccessFlag {
+	private int flagValue;
+
+	public AccessFlag(int value) {
+		this.flagValue = value;
+	}
+
+	public int getFlagValue() {
+		return flagValue;
+	}
+
+	public void setFlagValue(int flag) {
+		this.flagValue = flag;
+	}
+	
+	public boolean isPublicClass(){
+		return (this.flagValue & 0x0001) != 0;
+	}
+	public boolean isFinalClass(){
+		return (this.flagValue & 0x0010) != 0;
+	}
+	
+}
\ No newline at end of file
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/clz/ClassFile.java
new file mode 100644
index 0000000000..650ca8375d
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/clz/ClassFile.java
@@ -0,0 +1,75 @@
+package com.coderising.jvm.clz;
+
+import com.coderising.jvm.constant.ClassInfo;
+import com.coderising.jvm.constant.ConstantPool;
+
+public class ClassFile {
+	
+	private int minorVersion;
+	private int majorVersion;
+	
+	private AccessFlag accessFlag;
+	private ClassIndex clzIndex;
+	private ConstantPool pool;
+	
+	
+	public ClassIndex getClzIndex() {
+		return clzIndex;
+	}
+	public AccessFlag getAccessFlag() {
+		return accessFlag;
+	}
+	public void setAccessFlag(AccessFlag accessFlag) {
+		this.accessFlag = accessFlag;
+	}
+	
+	
+	
+	public ConstantPool getConstantPool() {		
+		return pool;
+	}
+	public int getMinorVersion() {
+		return minorVersion;
+	}
+	public void setMinorVersion(int minorVersion) {
+		this.minorVersion = minorVersion;
+	}
+	public int getMajorVersion() {
+		return majorVersion;
+	}
+	public void setMajorVersion(int majorVersion) {
+		this.majorVersion = majorVersion;
+	}
+	public void setConstPool(ConstantPool pool) {
+		this.pool = pool;
+		
+	}
+	public void setClassIndex(ClassIndex clzIndex) {
+		this.clzIndex = clzIndex;		
+	}
+	
+	
+	
+	
+	public void print(){
+		
+		if(this.accessFlag.isPublicClass()){
+			System.out.println("Access flag : public  ");
+		}
+		System.out.println("Class Name:"+ getClassName());
+		
+		System.out.println("Super Class Name:"+ getSuperClassName());
+		
+		
+	}
+	
+	private String getClassName(){
+		int thisClassIndex = this.clzIndex.getThisClassIndex();
+		ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex);
+		return thisClass.getClassName();
+	}
+	private String getSuperClassName(){
+		ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
+		return superClass.getClassName();
+	}
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/clz/ClassIndex.java
new file mode 100644
index 0000000000..e424f284b3
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/clz/ClassIndex.java
@@ -0,0 +1,19 @@
+package com.coderising.jvm.clz;
+
+public class ClassIndex {
+	private int thisClassIndex;
+	private int superClassIndex;
+	
+	public int getThisClassIndex() {
+		return thisClassIndex;
+	}
+	public void setThisClassIndex(int thisClassIndex) {
+		this.thisClassIndex = thisClassIndex;
+	}
+	public int getSuperClassIndex() {
+		return superClassIndex;
+	}
+	public void setSuperClassIndex(int superClassIndex) {
+		this.superClassIndex = superClassIndex;
+	}
+}
\ No newline at end of file
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/ClassInfo.java
new file mode 100644
index 0000000000..aea9048ea4
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/ClassInfo.java
@@ -0,0 +1,24 @@
+package com.coderising.jvm.constant;
+
+public class ClassInfo extends ConstantInfo {
+	private int type = ConstantInfo.CLASS_INFO;
+	private int utf8Index ;
+	public ClassInfo(ConstantPool pool) {
+		super(pool);
+	}
+	public int getUtf8Index() {
+		return utf8Index;
+	}
+	public void setUtf8Index(int utf8Index) {
+		this.utf8Index = utf8Index;
+	}
+	public int getType() {
+		return type;
+	}
+	
+	public String getClassName() {		
+		int index = getUtf8Index();
+		UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index);
+		return utf8Info.getValue();		
+	}
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/ConstantInfo.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
new file mode 100644
index 0000000000..466b072244
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
@@ -0,0 +1,29 @@
+package com.coderising.jvm.constant;
+
+public abstract class ConstantInfo {
+	public static final int UTF8_INFO = 1;
+	public static final int FLOAT_INFO = 4;
+	public static final int CLASS_INFO = 7;
+	public static final int STRING_INFO = 8;
+	public static final int FIELD_INFO = 9;
+	public static final int METHOD_INFO = 10;
+	public static final int NAME_AND_TYPE_INFO = 12;
+	protected ConstantPool constantPool;
+	
+	public ConstantInfo(){
+		
+	}
+	
+	public ConstantInfo(ConstantPool pool) {
+		this.constantPool = pool;
+	}
+	public abstract int getType();
+	
+	public ConstantPool getConstantPool() {
+		return constantPool;
+	}
+	public ConstantInfo getConstantInfo(int index){
+		return this.constantPool.getConstantInfo(index);
+	}
+	
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/ConstantPool.java
new file mode 100644
index 0000000000..86c0445695
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/ConstantPool.java
@@ -0,0 +1,29 @@
+package com.coderising.jvm.constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConstantPool {
+	
+	private List<ConstantInfo> constantInfos = new ArrayList<ConstantInfo>();
+	
+	
+	public ConstantPool(){
+		
+	}
+	public void addConstantInfo(ConstantInfo info){
+		
+		this.constantInfos.add(info);
+		
+	}
+	
+	public ConstantInfo getConstantInfo(int index){
+		return this.constantInfos.get(index);
+	}
+	public String getUTF8String(int index){
+		return ((UTF8Info)this.constantInfos.get(index)).getValue();
+	}
+	public Object getSize() {		
+		return this.constantInfos.size() -1;
+	}
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
new file mode 100644
index 0000000000..65475e194c
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
@@ -0,0 +1,54 @@
+package com.coderising.jvm.constant;
+
+public class FieldRefInfo extends ConstantInfo{
+	private int type = ConstantInfo.FIELD_INFO;
+	private int classInfoIndex;
+	private int nameAndTypeIndex;
+	
+	public FieldRefInfo(ConstantPool pool) {
+		super(pool);
+	}
+	public int getType() {
+		return type;
+	}
+	
+	public int getClassInfoIndex() {
+		return classInfoIndex;
+	}
+	public void setClassInfoIndex(int classInfoIndex) {
+		this.classInfoIndex = classInfoIndex;
+	}
+	public int getNameAndTypeIndex() {
+		return nameAndTypeIndex;
+	}
+	public void setNameAndTypeIndex(int nameAndTypeIndex) {
+		this.nameAndTypeIndex = nameAndTypeIndex;
+	}
+	
+	public String toString(){
+		
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+		
+		return getClassName() +" : "+  typeInfo.getName() + ":" + typeInfo.getTypeInfo() +"]";
+	}
+	
+	public String getClassName(){
+		
+		ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+		
+		UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index());
+		
+		return utf8Info.getValue();
+		
+	}
+	
+	public String getFieldName(){
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getName();		
+	}
+	
+	public String getFieldType(){
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getTypeInfo();	
+	}
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
new file mode 100644
index 0000000000..7f05870020
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
@@ -0,0 +1,55 @@
+package com.coderising.jvm.constant;
+
+public class MethodRefInfo extends ConstantInfo {
+	
+	private int type = ConstantInfo.METHOD_INFO;
+	
+	private int classInfoIndex;	
+	private int nameAndTypeIndex;
+	
+	public MethodRefInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getType() {
+		return type;
+	}
+	
+	public int getClassInfoIndex() {
+		return classInfoIndex;
+	}
+	public void setClassInfoIndex(int classInfoIndex) {
+		this.classInfoIndex = classInfoIndex;
+	}
+	public int getNameAndTypeIndex() {
+		return nameAndTypeIndex;
+	}
+	public void setNameAndTypeIndex(int nameAndTypeIndex) {
+		this.nameAndTypeIndex = nameAndTypeIndex;
+	}
+	
+	public String toString(){
+	
+		return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ;
+	}
+	public String getClassName(){
+		ConstantPool pool = this.getConstantPool();		
+		ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex());
+		return clzInfo.getClassName();
+	}
+	
+	public String getMethodName(){
+		ConstantPool pool = this.getConstantPool();
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getName();
+	}
+	
+	public String getParamAndReturnType(){
+		ConstantPool pool = this.getConstantPool();
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getTypeInfo();
+	}
+	
+	
+	
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
new file mode 100644
index 0000000000..402f9dec86
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,45 @@
+package com.coderising.jvm.constant;
+
+public class NameAndTypeInfo extends ConstantInfo{
+	public  int type = ConstantInfo.NAME_AND_TYPE_INFO;
+	
+	private int index1;
+	private int index2;
+	
+	public NameAndTypeInfo(ConstantPool pool) {
+		super(pool);
+	}
+	
+	public int getIndex1() {
+		return index1;
+	}
+	public void setIndex1(int index1) {
+		this.index1 = index1;
+	}
+	public int getIndex2() {
+		return index2;
+	}
+	public void setIndex2(int index2) {
+		this.index2 = index2;
+	}
+	public int getType() {
+		return type;
+	}
+	
+	
+	public String getName(){
+		ConstantPool pool = this.getConstantPool();
+		UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1);
+		return utf8Info1.getValue();
+	}
+	
+	public String getTypeInfo(){
+		ConstantPool pool = this.getConstantPool();
+		UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2);
+		return utf8Info2.getValue();
+	}
+	
+	public String toString(){
+		return "(" + getName() + "," + getTypeInfo()+")";
+	}
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
new file mode 100644
index 0000000000..936736016f
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
@@ -0,0 +1,13 @@
+package com.coderising.jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo {
+
+	public NullConstantInfo(){
+		
+	}
+	@Override
+	public int getType() {		
+		return -1;
+	}
+	
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/StringInfo.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/StringInfo.java
new file mode 100644
index 0000000000..f1f8eb4ed4
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/StringInfo.java
@@ -0,0 +1,26 @@
+package com.coderising.jvm.constant;
+
+public class StringInfo extends ConstantInfo{
+	private int type = ConstantInfo.STRING_INFO;
+	private int index;
+	public StringInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getType() {
+		return type;
+	}
+	
+	public int getIndex() {
+		return index;
+	}
+	public void setIndex(int index) {
+		this.index = index;
+	}
+
+	
+	public String toString(){
+		return this.getConstantPool().getUTF8String(index);
+	}
+	
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/UTF8Info.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/UTF8Info.java
new file mode 100644
index 0000000000..5cac9f04f7
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/constant/UTF8Info.java
@@ -0,0 +1,32 @@
+package com.coderising.jvm.constant;
+
+public class UTF8Info extends ConstantInfo{
+	private int type = ConstantInfo.UTF8_INFO;
+	private int length ;
+	private String value;
+	public UTF8Info(ConstantPool pool) {
+		super(pool);
+	}
+	public int getLength() {
+		return length;
+	}
+	public void setLength(int length) {
+		this.length = length;
+	}
+	public int getType() {
+		return type;
+	}
+	@Override
+	public String toString() {
+		return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]";
+	}
+	public String getValue() {
+		return value;
+	}
+	public void setValue(String value) {
+		this.value = value;
+	}
+	
+	
+
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
new file mode 100644
index 0000000000..cb50f5fa55
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,37 @@
+package com.coderising.jvm.loader;
+
+import com.coderising.jvm.util.Util;
+
+public class ByteCodeIterator {
+    private int pos = 0;
+    private byte[] code;
+
+    public ByteCodeIterator(byte[] code) {
+        this.code = code;
+    }
+
+    public String nextU4ToHexString(){
+        byte[] bytes=nextByte(4);
+        return Util.byteToHexString(bytes);
+    }
+    public int nextU2ToInt(){
+        byte[] bytes = nextByte(2);
+        return Util.byteToInt(bytes);
+    }
+    public int nextU1ToInt(){
+        byte[] bytes = nextByte(1);
+        return Util.byteToInt(bytes);
+    }
+    public String nextToString(int len){
+        byte[] bytes = nextByte(len);
+        return new String(bytes);
+    }
+    private byte[] nextByte(int len){
+        byte[] bytes = new byte[len];
+        for (int i = 0; i < bytes.length; i++) {
+            bytes[i]=code[pos+i];
+        }
+        pos+=len;
+        return bytes;
+    }
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
new file mode 100644
index 0000000000..497e88e188
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
@@ -0,0 +1,140 @@
+package com.coderising.jvm.loader;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import com.coderising.jvm.clz.ClassFile;
+
+
+
+
+
+public class ClassFileLoader {
+
+	private List<String> clzPaths = new ArrayList<String>();
+	
+	public byte[] readBinaryCode(String className) {
+		
+		className = className.replace('.', File.separatorChar) +".class";
+		
+		for(String path : this.clzPaths){
+			
+			String clzFileName = path + File.separatorChar + className;
+			byte[] codes = loadClassFile(clzFileName);
+			if(codes != null){
+				return codes;
+			}			
+		}
+		
+		return null;
+		
+		
+		
+	}
+	
+	private byte[] loadClassFile(String clzFileName) {
+		
+		File f = new File(clzFileName);
+		
+		try {
+		
+			return IOUtils.toByteArray(new FileInputStream(f));
+			
+		} catch (IOException e) {			
+			e.printStackTrace();
+			return null;
+		}
+	}
+	
+	
+	
+	public void addClassPath(String path) {
+		if(this.clzPaths.contains(path)){
+			return;
+		}
+		
+		this.clzPaths.add(path);
+		
+	}
+	
+	
+	
+	public String getClassPath(){
+		return StringUtils.join(this.clzPaths,";");
+	}
+
+	public ClassFile loadClass(String className) {
+		byte[] codes = this.readBinaryCode(className);
+		ClassFileParser parser = new ClassFileParser();
+		return parser.parse(codes);
+		
+	}
+	
+	
+	
+	// ------------------------------backup------------------------
+    public String getClassPath_V1(){
+		
+		StringBuffer buffer = new StringBuffer();
+		for(int i=0;i<this.clzPaths.size();i++){
+			buffer.append(this.clzPaths.get(i));
+			if(i<this.clzPaths.size()-1){
+				buffer.append(";");
+			}
+		}
+		return buffer.toString();
+	}
+	
+	private byte[] loadClassFile_V1(String clzFileName) {
+		
+		BufferedInputStream bis = null;
+		
+		try {
+			
+			File f = new File(clzFileName);
+			
+						
+			bis = new BufferedInputStream(new FileInputStream(f));
+			
+			ByteArrayOutputStream bos = new ByteArrayOutputStream();
+			
+			
+			byte[] buffer = new byte[1024];
+			int length = -1;
+			
+			while((length = bis.read(buffer)) != -1){
+				bos.write(buffer, 0, length);				
+			}
+			
+			byte [] codes = bos.toByteArray();
+			
+			return codes;
+			
+		} catch(IOException e){
+			e.printStackTrace();
+			
+		} finally{
+			if(bis != null){
+				try {
+					bis.close();
+				} catch (IOException e) {					
+					e.printStackTrace();
+				}
+			}
+		}
+		return null;
+		
+	}
+
+
+	
+
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
new file mode 100644
index 0000000000..ee00216e0a
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
@@ -0,0 +1,177 @@
+package com.coderising.jvm.loader;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Objects;
+
+import com.coderising.jvm.clz.AccessFlag;
+import com.coderising.jvm.clz.ClassFile;
+import com.coderising.jvm.clz.ClassIndex;
+import com.coderising.jvm.constant.ClassInfo;
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.constant.FieldRefInfo;
+import com.coderising.jvm.constant.MethodRefInfo;
+import com.coderising.jvm.constant.NameAndTypeInfo;
+import com.coderising.jvm.constant.NullConstantInfo;
+import com.coderising.jvm.constant.StringInfo;
+import com.coderising.jvm.constant.UTF8Info;
+import com.coderising.jvm.util.Util;
+
+public class ClassFileParser {
+    private final int CONSTANT_CLASS = 7;
+    private final int CONSTANT_FIELD_REF = 9;
+    private final int CONSTANT_METHOD_REF = 10;                // 0A
+    private final int CONSTANT_INTERFACE_METHOD_REF = 11;
+    private final int CONSTANT_STRING = 8;
+    private final int CONSTANT_INTEGER = 3;
+    private final int CONSTANT_FLOAT = 4;
+    private final int CONSTANT_LONG = 5;
+    private final int CONSTANT_DOUBLE = 6;
+    private final int CONSTANT_NAME_AND_TYPE = 12;            // 0C
+    private final int CONSTANT_UTF8 = 1;
+    private final int CONSTANT_METHOD_HANDLE = 15;
+    private final int CONSTANT_METHOD_TYPE = 16;
+    private final int CONSTANT_INVOKE_DYNAMIC = 18;
+
+    public ClassFile parse(byte[] codes) {
+
+        // 读 Magic Number
+        ByteCodeIterator it = new ByteCodeIterator(codes);
+        String magicNumber = it.nextU4ToHexString();
+        if (!Objects.equals("cafebabe", magicNumber)) {
+            throw new RuntimeException("这不是一个Java字节码文件");
+        }
+
+        ClassFile classFile = new ClassFile();
+        // 读 次版本号
+        int minorVersion = it.nextU2ToInt();
+        classFile.setMinorVersion(minorVersion);
+        // 读 主版本号
+        int majorVersion = it.nextU2ToInt();
+        classFile.setMajorVersion(majorVersion);
+        classFile.setConstPool(parseConstantPool(it));
+        classFile.setAccessFlag(parseAccessFlag(it));
+        classFile.setClassIndex(parseClassInfex(it));
+        return classFile;
+    }
+
+    private AccessFlag parseAccessFlag(ByteCodeIterator iter) {
+
+        return new AccessFlag(iter.nextU2ToInt());
+    }
+
+    private ClassIndex parseClassInfex(ByteCodeIterator iter) {
+        ClassIndex classIndex = new ClassIndex();
+        classIndex.setThisClassIndex(iter.nextU2ToInt());
+        classIndex.setSuperClassIndex(iter.nextU2ToInt());
+        return classIndex;
+
+    }
+
+    private ConstantPool parseConstantPool(ByteCodeIterator it) {
+
+        // 读 常量池个数
+        int count = it.nextU2ToInt();
+        ConstantPool constantPool = new ConstantPool();
+        constantPool.addConstantInfo(new NullConstantInfo());
+        for (int i = 0; i < count; i++) {
+            int tag = it.nextU1ToInt();
+            switch (tag) {
+                case CONSTANT_CLASS:
+                    ClassInfo classInfo = new ClassInfo(constantPool);
+                    classInfo.setUtf8Index(it.nextU2ToInt());
+                    constantPool.addConstantInfo(classInfo);
+                    System.out.println("classInfo "+classInfo.getUtf8Index());
+                    break;
+                case CONSTANT_UTF8:
+                    UTF8Info utf8Info = new UTF8Info(constantPool);
+                    utf8Info.setLength(it.nextU2ToInt());
+                    utf8Info.setValue(it.nextToString(utf8Info.getLength()));
+                    constantPool.addConstantInfo(utf8Info);
+                    System.out.println("utf-8 "+utf8Info.getValue());
+                    break;
+                case CONSTANT_METHOD_REF:
+                    MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool);
+                    methodRefInfo.setClassInfoIndex(it.nextU2ToInt());
+                    methodRefInfo.setNameAndTypeIndex(it.nextU2ToInt());
+                    constantPool.addConstantInfo(methodRefInfo);
+                    System.out.println("method ref "+methodRefInfo.getClassInfoIndex()+" "+methodRefInfo.getNameAndTypeIndex());
+                    break;
+                case CONSTANT_NAME_AND_TYPE:
+                    NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool);
+                    nameAndTypeInfo.setIndex1(it.nextU2ToInt());
+                    nameAndTypeInfo.setIndex2(it.nextU2ToInt());
+                    constantPool.addConstantInfo(nameAndTypeInfo);
+                    System.out.println("name and type "+nameAndTypeInfo.getIndex1()+" "+nameAndTypeInfo.getIndex2());
+                    break;
+                case CONSTANT_FIELD_REF:
+                    FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool);
+                    fieldRefInfo.setClassInfoIndex(it.nextU2ToInt());
+                    fieldRefInfo.setNameAndTypeIndex(it.nextU2ToInt());
+                    constantPool.addConstantInfo(fieldRefInfo);
+                    System.out.println("field ref "+fieldRefInfo.getClassInfoIndex()+" "+fieldRefInfo.getNameAndTypeIndex());
+                    break;
+                case CONSTANT_STRING:
+                    StringInfo stringInfo = new StringInfo(constantPool);
+                    stringInfo.setIndex(it.nextU2ToInt());
+                    constantPool.addConstantInfo(stringInfo);
+                    System.out.println("string "+stringInfo.getIndex());
+                    break;
+                default:
+//                    throw new RuntimeException("还不支持的tag " + tag);
+            }
+        }
+        return constantPool;
+    }
+
+    public static void main(String[] args) {
+        String path1 = "D:\\src\\java\\study\\coding2017\\group13\\2931408816\\lesson5\\build\\classes\\main";
+        ClassFileLoader loader = new ClassFileLoader();
+        loader.addClassPath(path1);
+        String className = "com.coderising.jvm.test.Main";
+        ClassFile clzFile = null;
+        clzFile = loader.loadClass(className);
+        clzFile.print();
+    }
+}
+/*
+Classfile /D:/src/java/study/coding2017/group13/2931408816/lesson5/build/classes/main/com/coderising/jvm/test/Main.class
+  Last modified 2017-4-9; size 285 bytes
+  MD5 checksum a159f82f5c9fecafdde2333579a3db3b
+  Compiled from "Main.java"
+public class com.coderising.jvm.test.Main
+  minor version: 0
+  major version: 52
+  flags: ACC_PUBLIC, ACC_SUPER
+Constant pool:
+   #1 = Methodref          #3.#13         // java/lang/Object."<init>":()V
+   #2 = Class              #14            // com/coderising/jvm/test/Main
+   #3 = Class              #15            // java/lang/Object
+   #4 = Utf8               <init>
+   #5 = Utf8               ()V
+   #6 = Utf8               Code
+   #7 = Utf8               LineNumberTable
+   #8 = Utf8               LocalVariableTable
+   #9 = Utf8               this
+  #10 = Utf8               Lcom/coderising/jvm/test/Main;
+  #11 = Utf8               SourceFile
+  #12 = Utf8               Main.java
+  #13 = NameAndType        #4:#5          // "<init>":()V
+  #14 = Utf8               com/coderising/jvm/test/Main
+  #15 = Utf8               java/lang/Object
+{
+  public com.coderising.jvm.test.Main();
+    descriptor: ()V
+    flags: ACC_PUBLIC
+    Code:
+      stack=1, locals=1, args_size=1
+         0: aload_0
+         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
+         4: return
+      LineNumberTable:
+        line 6: 0
+      LocalVariableTable:
+        Start  Length  Slot  Name   Signature
+            0       5     0  this   Lcom/coderising/jvm/test/Main;
+}
+SourceFile: "Main.java"
+ */
\ No newline at end of file
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/test/EmployeeV1.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/test/EmployeeV1.java
new file mode 100644
index 0000000000..12e3d7efdd
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/test/EmployeeV1.java
@@ -0,0 +1,28 @@
+package com.coderising.jvm.test;
+
+public class EmployeeV1 {
+	
+	
+	private String name;
+    private int age;
+    
+    public EmployeeV1(String name, int age) {
+        this.name = name;
+        this.age = age;        
+    }    
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    public void setAge(int age){
+    	this.age = age;
+    }
+    public void sayHello() {        
+    	System.out.println("Hello , this is class Employee ");    	
+    }
+    public static void main(String[] args){
+    	EmployeeV1 p = new EmployeeV1("Andy",29);
+    	p.sayHello();    
+    	
+    }
+}
\ No newline at end of file
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/test/Main.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/test/Main.java
new file mode 100644
index 0000000000..45601d76ff
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/test/Main.java
@@ -0,0 +1,7 @@
+package com.coderising.jvm.test;
+
+/**
+ * Created by pikachu on 2017/4/9.
+ */
+public class Main {
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/util/Util.java b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/util/Util.java
new file mode 100644
index 0000000000..0c4cc8c57c
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coderising/jvm/util/Util.java
@@ -0,0 +1,24 @@
+package com.coderising.jvm.util;
+
+public class Util {
+	public static int byteToInt(byte[] codes){
+    	String s1 = byteToHexString(codes);
+    	return Integer.valueOf(s1, 16).intValue();
+    }
+    
+    
+    
+	public static String byteToHexString(byte[] codes ){
+		StringBuffer buffer = new StringBuffer();
+		for(int i=0;i<codes.length;i++){
+			byte b = codes[i];
+			int value = b & 0xFF;
+			String strHex = Integer.toHexString(value);
+			if(strHex.length()< 2){
+				strHex = "0" + strHex;
+			}		
+			buffer.append(strHex);
+		}
+		return buffer.toString();
+	}
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coding/basic/BinaryTreeNode.java b/group13/2931408816/lesson5/src/main/java/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..d7ac820192
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coding/basic/Iterator.java b/group13/2931408816/lesson5/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coding/basic/List.java b/group13/2931408816/lesson5/src/main/java/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coding/basic/Queue.java b/group13/2931408816/lesson5/src/main/java/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..36e516e266
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coding/basic/Queue.java
@@ -0,0 +1,19 @@
+package com.coding.basic;
+
+public class Queue {
+	
+	public void enQueue(Object o){		
+	}
+	
+	public Object deQueue(){
+		return null;
+	}
+	
+	public boolean isEmpty(){
+		return false;
+	}
+	
+	public int size(){
+		return -1;
+	}
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coding/basic/array/ArrayList.java b/group13/2931408816/lesson5/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 0000000000..4576c016af
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,35 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coding/basic/array/ArrayUtil.java b/group13/2931408816/lesson5/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 0000000000..45740e6d57
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coding/basic/stack/Stack.java b/group13/2931408816/lesson5/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 0000000000..12a71d0282
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,35 @@
+package com.coding.basic.stack;
+
+
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+
+	public void push(Object o){
+		elementData.add(o);
+	}
+
+	public Object pop(){
+		if (isEmpty()){
+			throw new NoSuchElementException();
+		}
+		return elementData.remove(elementData.size()-1);
+	}
+
+	public Object peek(){
+		return elementData.get(elementData.size()-1);
+	}
+	public boolean isEmpty(){
+		return elementData.size()==0;
+	}
+	public int size(){
+		return elementData.size();
+	}
+
+	@Override
+	public String toString() {
+		return elementData.toString();
+	}
+}
diff --git a/group13/2931408816/lesson5/src/main/java/com/coding/basic/stack/StackUtil.java b/group13/2931408816/lesson5/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..cb36f289b9
--- /dev/null
+++ b/group13/2931408816/lesson5/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,134 @@
+package com.coding.basic.stack;
+
+import java.util.NoSuchElementException;
+
+public class StackUtil {
+	
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack s) {
+		Stack a = new Stack();
+
+		while (!s.isEmpty()){
+			Object o = s.pop();
+			int count =0;
+			while (!a.isEmpty()){
+				s.push(a.pop());
+				count++;
+			}
+			a.push(o);
+			for (int i = 0; i < count; i++) {
+				a.push(s.pop());
+			}
+		}
+		while (!a.isEmpty()){
+			s.push(a.pop());
+		}
+	}
+
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		Stack stack = new Stack();
+		boolean flag = false;
+		while (!s.isEmpty()){
+			Object t = s.pop();
+			if (t.equals(o)){
+				flag=true;
+				break;
+			}
+			stack.push(t);
+		}
+		while (!stack.isEmpty()){
+			s.push(stack.pop());
+		}
+		if (!flag){
+			throw new NoSuchElementException(o.toString());
+		}
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) {
+		if (s.size()<len){
+			throw new IndexOutOfBoundsException(len+"");
+		}
+		Object[] objects = new Object[len];
+		Stack stack = new Stack();
+		for (int i = 0; i < len; i++) {
+			Object t = s.pop();
+			stack.push(t);
+			objects[i]=t;
+		}
+		while (!stack.isEmpty()){
+			s.push(stack.pop());
+		}
+		return objects;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		Stack stack = new Stack();
+		String string = "([{}])";
+		String stringLeft = "([{";
+		for (int i = 0; i < s.length(); i++) {
+			char ch = s.charAt(i);
+			if (string.indexOf(ch)>=0){
+				if(stringLeft.indexOf(ch)>=0){
+					stack.push(Character.valueOf(ch));
+				}else {
+					Character top = (Character) stack.peek();
+					switch (top){
+						case '{':
+							if (ch == '}'){
+								stack.pop();
+							}else {
+								return false;
+							}
+							break;
+						case '[':
+							if (ch==']'){
+								stack.pop();
+							}else {
+								return false;
+							}
+							break;
+						case '(':
+							if (ch==')'){
+								stack.pop();
+							}else {
+								return false;
+							}
+							break;
+					}
+				}
+			}
+		}
+		return true;
+	}
+
+	public static void main(String[] args) {
+
+		Stack stack = new Stack();
+		for (int i = 0; i < 5; i++) {
+			stack.push(i+1);
+		}
+		StackUtil.reverse(stack);
+	}
+}
diff --git a/group13/2931408816/lesson5/src/test/java/com/coderising/jvm/loader/test/ClassFileloaderTest.java b/group13/2931408816/lesson5/src/test/java/com/coderising/jvm/loader/test/ClassFileloaderTest.java
new file mode 100644
index 0000000000..1c6c111f03
--- /dev/null
+++ b/group13/2931408816/lesson5/src/test/java/com/coderising/jvm/loader/test/ClassFileloaderTest.java
@@ -0,0 +1,197 @@
+package com.coderising.jvm.loader.test;
+
+import org.junit.After;
+import  org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.jvm.clz.ClassFile;
+import com.coderising.jvm.clz.ClassIndex;
+import com.coderising.jvm.constant.ClassInfo;
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.constant.MethodRefInfo;
+import com.coderising.jvm.constant.NameAndTypeInfo;
+import com.coderising.jvm.constant.UTF8Info;
+import com.coderising.jvm.loader.ClassFileLoader;
+
+
+
+
+
+public class ClassFileloaderTest {
+	
+	private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1";
+	
+	static String path1 = "D:\\src\\java\\study\\coding2017\\group13\\2931408816\\lesson5\\build\\classes\\main";
+	static String path2 = "C:\temp";
+	
+	static ClassFile clzFile = null;
+	static {
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		String className = "com.coderising.jvm.test.EmployeeV1";
+		
+		clzFile = loader.loadClass(className);
+//		clzFile.print();
+	}
+	
+	@Before
+	public void setUp() throws Exception {		 
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+	
+	@Test
+	public void testClassPath(){		
+		
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		loader.addClassPath(path2);
+		
+		String clzPath = loader.getClassPath();
+		
+		Assert.assertEquals(path1+";"+path2,clzPath);
+		
+	}
+	
+	@Test
+	public void testClassFileLength() {		
+		
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		
+		String className = "com.coderising.jvm.test.EmployeeV1";
+		
+		byte[] byteCodes = loader.readBinaryCode(className);
+		
+		// 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
+		Assert.assertEquals(1056, byteCodes.length);
+		
+	}
+	
+	
+    @Test	
+	public void testMagicNumber(){
+    	ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		String className = "com.coderising.jvm.test.EmployeeV1";
+		byte[] byteCodes = loader.readBinaryCode(className);
+		byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
+		
+		
+		String acctualValue = this.byteToHexString(codes);
+		
+		Assert.assertEquals("cafebabe", acctualValue);
+	}
+    
+    
+    
+   	private String byteToHexString(byte[] codes ){
+   		StringBuffer buffer = new StringBuffer();
+   		for(int i=0;i<codes.length;i++){
+   			byte b = codes[i];
+   			int value = b & 0xFF;
+   			String strHex = Integer.toHexString(value);
+   			if(strHex.length()< 2){
+   				strHex = "0" + strHex;
+   			}		
+   			buffer.append(strHex);
+   		}
+   		return buffer.toString();
+   	}
+    
+    /**
+     * ----------------------------------------------------------------------
+     */
+    
+    
+    @Test
+    public void testVersion(){    			
+		
+		Assert.assertEquals(0, clzFile.getMinorVersion());
+		Assert.assertEquals(52, clzFile.getMajorVersion());
+		
+    }
+    
+    @Test
+    public void testConstantPool(){
+    	
+
+		ConstantPool pool = clzFile.getConstantPool();
+		
+		Assert.assertEquals(53, pool.getSize());
+	
+		{
+			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
+			Assert.assertEquals(2, clzInfo.getUtf8Index());
+			
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
+			Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue());
+		}
+		{
+			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
+			Assert.assertEquals(4, clzInfo.getUtf8Index());
+			
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
+			Assert.assertEquals("java/lang/Object", utf8Info.getValue());
+		}
+		{
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
+			Assert.assertEquals("name", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(6);
+			Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(7);
+			Assert.assertEquals("age", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(8);
+			Assert.assertEquals("I", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(9);
+			Assert.assertEquals("<init>", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(10);
+			Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(11);
+			Assert.assertEquals("Code", utf8Info.getValue());
+		}
+		
+		{
+			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(12);
+			Assert.assertEquals(3, methodRef.getClassInfoIndex());
+			Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+		}
+		
+		{
+			NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+			Assert.assertEquals(9, nameAndType.getIndex1());
+			Assert.assertEquals(14, nameAndType.getIndex2());
+		}
+		//抽查几个吧
+		{
+			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45);
+			Assert.assertEquals(1, methodRef.getClassInfoIndex());
+			Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+		}
+		
+		{
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+			Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+		}
+    }
+    @Test
+    public void testClassIndex(){
+    	
+    	ClassIndex clzIndex = clzFile.getClzIndex();
+    	ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+    	ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+    	
+    	
+    	Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+    	Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+    }
+}
diff --git a/group13/2931408816/lesson5/src/test/java/com/coding/basic/stack/StackUtilTest.java b/group13/2931408816/lesson5/src/test/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..b39281b245
--- /dev/null
+++ b/group13/2931408816/lesson5/src/test/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,61 @@
+package com.coding.basic.stack;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Collections;
+
+/**
+ * Created by pikachu on 2017/4/7.
+ */
+public class StackUtilTest {
+    // public static void reverse(Stack s)
+    @Test
+    public void testReverse(){
+        Stack stack = new Stack();
+        for (int i = 0; i < 5; i++) {
+            stack.push(i+1);
+        }
+        Assert.assertEquals("[1, 2, 3, 4, 5]",stack.toString());
+        StackUtil.reverse(stack);
+        Assert.assertEquals("[5, 4, 3, 2, 1]",stack.toString());
+    }
+    // public static void remove(Stack s,Object o)
+    @Test
+    public void testRemove(){
+        Stack stack = new Stack();
+        for (int i = 0; i < 6; i++) {
+            stack.push(i);
+        }
+        StackUtil.remove(stack,0);
+        Assert.assertEquals("[1, 2, 3, 4, 5]", stack.toString());
+
+        StackUtil.remove(stack,3);
+        Assert.assertEquals("[1, 2, 4, 5]", stack.toString());
+
+        StackUtil.remove(stack,5);
+        Assert.assertEquals("[1, 2, 4]", stack.toString());
+    }
+    // public static Object[] getTop(Stack s,int len)
+    @Test
+    public void testGetTop(){
+        Stack stack = new Stack();
+        for (int i = 0; i < 10; i++) {
+            stack.push(i);
+        }
+        Object[] objects = StackUtil.getTop(stack,2);
+        Assert.assertArrayEquals(new Object[]{9,8},objects);
+    }
+    // public static boolean isValidPairs(String s)
+
+    /**
+     *
+     * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+     * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+     */
+    @Test
+    public void testIsValidPairs(){
+       Assert.assertTrue( StackUtil.isValidPairs("([e{d}f])"));
+       Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+    }
+}
diff --git a/group13/2931408816/settings.gradle b/group13/2931408816/settings.gradle
index e28c5f17d9..639272767b 100644
--- a/group13/2931408816/settings.gradle
+++ b/group13/2931408816/settings.gradle
@@ -20,4 +20,5 @@ include 'lesson1'
 include 'lesson2'
 include 'lesson3'
 include 'lesson4'
+include 'lesson5'
 
diff --git a/group13/2931408816/src/main/kotlin/main.kt b/group13/2931408816/src/main/kotlin/main.kt
new file mode 100644
index 0000000000..c3df289e2d
--- /dev/null
+++ b/group13/2931408816/src/main/kotlin/main.kt
@@ -0,0 +1,13 @@
+/**
+ * Created by pikachu on 2017/4/10.
+ */
+
+fun main(args: Array<String>) {
+    (1..25).forEach {
+        if(it<10)
+        println("group0${it}/")
+        else{
+            println("group${it}/")
+        }
+    }
+}
\ No newline at end of file
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/basic/stack/MyStack.java b/group13/413007522/lesson05/src/main/java/cn/xl/basic/stack/MyStack.java
new file mode 100644
index 0000000000..8987537b09
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/basic/stack/MyStack.java
@@ -0,0 +1,124 @@
+package cn.xl.basic.stack;
+
+import java.util.Arrays;
+import java.util.EmptyStackException;
+
+/**
+ * Stack��һ������ȳ���last in first out��LIFO���Ķ�ջ��
+ * ��Vector��Ļ�������չ5����������
+ * @author XIAOLONG
+ *
+ */
+public class MyStack {
+
+	private int elementCount;
+
+	private Object[] elementData = new Object[5];
+
+	/**
+	 * �޲ι��췽��������һ����ջ
+	 * 
+	 */
+	public MyStack(){
+
+	}
+
+
+	/**
+	 * Ԫ����ջ
+	 * @param item
+	 * @return ��ջԪ��
+	 */
+	public synchronized Object push(Object item){
+
+		ensureCapacity(elementCount+1);
+		elementData[elementCount] = item;
+		elementCount ++;
+		return item;
+	}
+
+	/**
+	 * ��ջ��Ԫ���Ƴ��������ظ�Ԫ��
+	 * @return  ջ��Ԫ��
+	 */
+	public synchronized Object pop(){
+		Object    obj;
+
+		obj = peek();
+		elementCount --;
+		elementData[elementCount] = null;
+
+		return obj;
+	}
+
+	/**
+	 * �鿴ջ��Ԫ��
+	 * 
+	 * @return ջ��Ԫ��
+	 * @throws ���ջΪ�� �� �׳� EmptyStackException�쳣  .
+	 */
+	public synchronized Object peek(){
+		int len = elementCount;
+
+		if(len == 0)
+			throw new EmptyStackException();
+
+		return  elementData[len - 1];
+
+	}
+
+	/**
+	 * ���ջ�Ƿ�Ϊ��
+	 * 
+	 * @return True or false
+	 */
+	public boolean isEmpty(){
+
+		return elementCount == 0;
+	}
+
+	/**
+	 * ��ѯռջ�Ƿ����ĳԪ��
+	 * @param  ��ѯԪ��
+	 * @return ���Ԫ�ش��ڷ���Ԫ������λ�ã�ջ��Ԫ��λ��Ϊ1����
+	 *         �����Ԫ����ջ�����ظ����򷵻ؾ���ջ�������Ԫ��λ�ã�
+	 *         �����Ԫ����ջ�в����ڣ��򷵻� -1 ��
+	 */
+	public synchronized int search(Object o){
+
+		if(o == null){
+			for(int i = elementCount -1;i >= 0; i--){
+				if(elementData[i] == null){
+					return elementCount - i;
+				}
+			}
+		}else{
+			for(int i = elementCount -1;i >= 0; i-- ){
+				if(o.equals(elementData[i])){
+					return elementCount - i;
+				}
+			}
+		}
+
+		return -1;
+	}
+
+	/**
+	 * ��չ��������������������һ��
+	 * @param ��ǰջ������С����size
+	 */
+	private void ensureCapacity(int minCapacity){
+		int oldCapacity = elementData.length;
+		if(minCapacity > oldCapacity){
+			int newCapacity = oldCapacity << 1;
+			elementData = Arrays.copyOf(elementData, newCapacity);
+		}
+	}
+
+	public static void main(String[] args){
+		
+		
+		
+	}
+
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/basic/stack/StackUtil.java b/group13/413007522/lesson05/src/main/java/cn/xl/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..ca686ab19b
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/basic/stack/StackUtil.java
@@ -0,0 +1,190 @@
+package cn.xl.basic.stack;
+
+
+public class StackUtil {
+
+
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用MyStack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(MyStack s) {
+
+		if(s == null || s.isEmpty()){
+			return ;
+		}
+
+		MyStack ns =  new MyStack();
+		Object o = s.pop();
+		int count = 0;
+		while(!s.isEmpty()){
+			ns.push(s.pop()); 
+			count ++;
+		}
+		s.push(o);
+
+		while(!ns.isEmpty()){
+			s.push(ns.pop());
+		}
+
+		for(int i = 0; i < count - 1 ;i++){
+			o = s.pop();
+			for(int j = 0; j < count - 1 - i ;j++){
+				ns.push(s.pop()); 
+			}
+			s.push(o);
+			while(!ns.isEmpty()){
+				s.push(ns.pop());
+			}
+		}
+
+		//组员写的 ，不错
+		/*MyStack a = new MyStack();
+
+		while (!s.isEmpty()){
+			Object o = s.pop();
+			int count =0;
+			while (!a.isEmpty()){
+				s.push(a.pop());
+				count++;
+			}
+			a.push(o);
+			for (int i = 0; i < count; i++) {
+				a.push(s.pop());
+			}
+		}
+		while (!a.isEmpty()){
+			s.push(a.pop());
+		}
+
+       return s;*/
+	}
+
+	/**
+	 * 删除栈中的某个元素 注意：只能使用MyStack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(MyStack s,Object o) {
+
+		if(s == null || s.isEmpty()){
+			return ;
+		}
+
+		MyStack ms =  new MyStack();
+		Object obj = null;
+		while(!s.isEmpty()){
+			obj = s.pop();
+			if(obj == null){
+				if(o == null){
+					continue;
+				}else{
+					ms.push(obj);
+				}
+			}else{
+				if(obj.equals(o)|| obj.toString().equals(o)){
+					continue;
+				}else{
+					ms.push(obj);
+				}
+			}
+		}
+
+		while(!ms.isEmpty()){
+			s.push(ms.pop());
+		}
+
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用MyStack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(MyStack s,int len) {
+		MyStack ns =  new MyStack();
+		int count = 0;
+		Object[] o = new Object[len];
+		while(!s.isEmpty()){
+			ns.push(s.pop());
+			count++;
+		}
+		int n = 0;
+		for(int i = 0; i < count - len;i++){
+			if(i < count - len){
+				s.push(ns.pop());
+			}else{
+				o[n] = ns.pop();
+				n++;
+			}
+		}
+
+		return o;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+
+		if(s == null || "".equals(s)){
+			return true;
+		}
+		char[]  b = s.toCharArray();
+		MyStack ms = new MyStack();
+		String str = null;
+		for(int i = 0; i < b.length ; i++){
+			str = String.valueOf(b[i]);
+			if("(".equals(str)){
+				ms.push(b[i]);
+			}else if(")".equals(str)){
+				if(!popObj(ms,"("))return false;
+			}else if("[".equals(str)){
+				ms.push(b[i]);
+			}else if("]".equals(str)){
+				if(!popObj(ms,"["))return false;
+			}else if("{".equals(str)){
+				ms.push(b[i]);
+			}else if("}".equals(str)){
+				if(!popObj(ms,"{"))return false;
+			}
+		}
+		if(ms.isEmpty()){
+			return true;
+		}
+		return false;
+	}
+
+
+	private static boolean popObj(MyStack s,Object o) {
+
+		MyStack ms =  new MyStack();
+		Object obj = null;
+		while(!s.isEmpty()){
+			obj = s.pop();
+			if(obj.equals(o)||obj.toString().equals(o)){
+				while(!ms.isEmpty()){
+					s.push(ms.pop());
+				}
+				return true;
+			}else{
+				ms.push(obj);
+			}
+		}
+		return false;
+	}
+
+
+
+	public static void main(String[] args){
+
+
+
+	}
+
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/basic/stack/StackUtilTest.java b/group13/413007522/lesson05/src/main/java/cn/xl/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..c7e4e6a51f
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/basic/stack/StackUtilTest.java
@@ -0,0 +1,84 @@
+package cn.xl.basic.stack;
+
+import org.junit.Test;
+
+import junit.framework.Assert;
+
+public class StackUtilTest {
+
+
+	@Test
+	public void reverse(){
+		MyStack s = new MyStack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		s.push(6);
+		s.push(7);
+		s.push(8);
+		s.push(9);
+		s.push(10);
+		s.push(11);
+		/*MyStack my = StackUtil.reverse(s);
+		while(!my.isEmpty()){
+			System.out.println(my.pop());
+		}*/
+	}
+	
+	
+	@Test
+	public void getTop(){
+		MyStack s = new MyStack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		s.push(6);
+		s.push(7);
+		s.push(8);
+		s.push(9);
+		s.push(10);
+		s.push(11);
+		
+		Object[] o = StackUtil.getTop(s,5);
+		
+		Assert.assertEquals(5, o.length);
+		
+		/*while(!s.isEmpty()){
+			System.out.println(s.pop());
+		}*/
+	}
+	
+	@Test
+	public void remove(){
+		
+		MyStack s = new MyStack();
+		s.push(1);
+		s.push(2);
+		s.push(4);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		s.push(6);
+	
+		
+		StackUtil.remove(s, 4);
+		while(!s.isEmpty()){
+			System.out.println(s.pop());
+		}
+		
+	}
+	
+	
+	@Test
+	public void isValidPairs(){
+		
+		Assert.assertEquals(true, StackUtil.isValidPairs("([e[{{}}df]])"));
+		
+		
+	}
+
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/clz/AccessFlag.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/clz/AccessFlag.java
new file mode 100644
index 0000000000..26d209563c
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/clz/AccessFlag.java
@@ -0,0 +1,25 @@
+package cn.xl.jvm.clz;
+
+public class AccessFlag {
+	private int flagValue;
+
+	public AccessFlag(int value) {
+		this.flagValue = value;
+	}
+
+	public int getFlagValue() {
+		return flagValue;
+	}
+
+	public void setFlagValue(int flag) {
+		this.flagValue = flag;
+	}
+	
+	public boolean isPublicClass(){
+		return (this.flagValue & 0x0001) != 0;
+	}
+	public boolean isFinalClass(){
+		return (this.flagValue & 0x0010) != 0;
+	}
+	
+}
\ No newline at end of file
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/clz/ClassFile.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/clz/ClassFile.java
new file mode 100644
index 0000000000..384afe2efe
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/clz/ClassFile.java
@@ -0,0 +1,75 @@
+package cn.xl.jvm.clz;
+
+import cn.xl.jvm.constant.ClassInfo;
+import cn.xl.jvm.constant.ConstantPool;
+
+public class ClassFile {
+	
+	private int minorVersion;
+	private int majorVersion;
+	
+	private AccessFlag accessFlag;
+	private ClassIndex clzIndex;
+	private ConstantPool pool;
+	
+	
+	public ClassIndex getClzIndex() {
+		return clzIndex;
+	}
+	public AccessFlag getAccessFlag() {
+		return accessFlag;
+	}
+	public void setAccessFlag(AccessFlag accessFlag) {
+		this.accessFlag = accessFlag;
+	}
+	
+	
+	
+	public ConstantPool getConstantPool() {		
+		return pool;
+	}
+	public int getMinorVersion() {
+		return minorVersion;
+	}
+	public void setMinorVersion(int minorVersion) {
+		this.minorVersion = minorVersion;
+	}
+	public int getMajorVersion() {
+		return majorVersion;
+	}
+	public void setMajorVersion(int majorVersion) {
+		this.majorVersion = majorVersion;
+	}
+	public void setConstPool(ConstantPool pool) {
+		this.pool = pool;
+		
+	}
+	public void setClassIndex(ClassIndex clzIndex) {
+		this.clzIndex = clzIndex;		
+	}
+	
+	
+	
+	
+	public void print(){
+		
+		/*if(this.accessFlag.isPublicClass()){
+			System.out.println("Access flag : public  ");
+		}
+		System.out.println("Class Name:"+ getClassName());
+		
+		System.out.println("Super Class Name:"+ getSuperClassName());
+		*/
+		
+	}
+	
+	private String getClassName(){
+		int thisClassIndex = this.clzIndex.getThisClassIndex();
+		ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex);
+		return thisClass.getClassName();
+	}
+	private String getSuperClassName(){
+		ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
+		return superClass.getClassName();
+	}
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/clz/ClassIndex.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/clz/ClassIndex.java
new file mode 100644
index 0000000000..3f7b12dcdf
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/clz/ClassIndex.java
@@ -0,0 +1,19 @@
+package cn.xl.jvm.clz;
+
+public class ClassIndex {
+	private int thisClassIndex;
+	private int superClassIndex;
+	
+	public int getThisClassIndex() {
+		return thisClassIndex;
+	}
+	public void setThisClassIndex(int thisClassIndex) {
+		this.thisClassIndex = thisClassIndex;
+	}
+	public int getSuperClassIndex() {
+		return superClassIndex;
+	}
+	public void setSuperClassIndex(int superClassIndex) {
+		this.superClassIndex = superClassIndex;
+	}
+}
\ No newline at end of file
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/ClassInfo.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/ClassInfo.java
new file mode 100644
index 0000000000..a57c7f31b4
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/ClassInfo.java
@@ -0,0 +1,24 @@
+package cn.xl.jvm.constant;
+
+public class ClassInfo extends ConstantInfo {
+	private int type = ConstantInfo.CLASS_INFO;
+	private int utf8Index ;
+	public ClassInfo(ConstantPool pool) {
+		super(pool);
+	}
+	public int getUtf8Index() {
+		return utf8Index;
+	}
+	public void setUtf8Index(int utf8Index) {
+		this.utf8Index = utf8Index;
+	}
+	public int getType() {
+		return type;
+	}
+	
+	public String getClassName() {		
+		int index = getUtf8Index();
+		UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index);
+		return utf8Info.getValue();		
+	}
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/ConstantInfo.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/ConstantInfo.java
new file mode 100644
index 0000000000..146329cdf1
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/ConstantInfo.java
@@ -0,0 +1,29 @@
+package cn.xl.jvm.constant;
+
+public abstract class ConstantInfo {
+	public static final int UTF8_INFO = 1;
+	public static final int FLOAT_INFO = 4;
+	public static final int CLASS_INFO = 7;
+	public static final int STRING_INFO = 8;
+	public static final int FIELD_INFO = 9;
+	public static final int METHOD_INFO = 10;
+	public static final int NAME_AND_TYPE_INFO = 12;
+	protected ConstantPool constantPool;
+	
+	public ConstantInfo(){
+		
+	}
+	
+	public ConstantInfo(ConstantPool pool) {
+		this.constantPool = pool;
+	}
+	public abstract int getType();
+	
+	public ConstantPool getConstantPool() {
+		return constantPool;
+	}
+	public ConstantInfo getConstantInfo(int index){
+		return this.constantPool.getConstantInfo(index);
+	}
+	
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/ConstantPool.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/ConstantPool.java
new file mode 100644
index 0000000000..45c0b54c57
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/ConstantPool.java
@@ -0,0 +1,29 @@
+package cn.xl.jvm.constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConstantPool {
+	
+	private List<ConstantInfo> constantInfos = new ArrayList<ConstantInfo>();
+	
+	
+	public ConstantPool(){
+		
+	}
+	public void addConstantInfo(ConstantInfo info){
+		
+		this.constantInfos.add(info);
+		
+	}
+	
+	public ConstantInfo getConstantInfo(int index){
+		return this.constantInfos.get(index);
+	}
+	public String getUTF8String(int index){
+		return ((UTF8Info)this.constantInfos.get(index)).getValue();
+	}
+	public Object getSize() {		
+		return this.constantInfos.size() -1;
+	}
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/FieldRefInfo.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/FieldRefInfo.java
new file mode 100644
index 0000000000..6764edb21d
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/FieldRefInfo.java
@@ -0,0 +1,54 @@
+package cn.xl.jvm.constant;
+
+public class FieldRefInfo extends ConstantInfo{
+	private int type = ConstantInfo.FIELD_INFO;
+	private int classInfoIndex;
+	private int nameAndTypeIndex;
+	
+	public FieldRefInfo(ConstantPool pool) {
+		super(pool);
+	}
+	public int getType() {
+		return type;
+	}
+	
+	public int getClassInfoIndex() {
+		return classInfoIndex;
+	}
+	public void setClassInfoIndex(int classInfoIndex) {
+		this.classInfoIndex = classInfoIndex;
+	}
+	public int getNameAndTypeIndex() {
+		return nameAndTypeIndex;
+	}
+	public void setNameAndTypeIndex(int nameAndTypeIndex) {
+		this.nameAndTypeIndex = nameAndTypeIndex;
+	}
+	
+	public String toString(){
+		
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+		
+		return getClassName() +" : "+  typeInfo.getName() + ":" + typeInfo.getTypeInfo() +"]";
+	}
+	
+	public String getClassName(){
+		
+		ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+		
+		UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index());
+		
+		return utf8Info.getValue();
+		
+	}
+	
+	public String getFieldName(){
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getName();		
+	}
+	
+	public String getFieldType(){
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getTypeInfo();	
+	}
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/MethodRefInfo.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/MethodRefInfo.java
new file mode 100644
index 0000000000..0340d77b52
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/MethodRefInfo.java
@@ -0,0 +1,55 @@
+package cn.xl.jvm.constant;
+
+public class MethodRefInfo extends ConstantInfo {
+	
+	private int type = ConstantInfo.METHOD_INFO;
+	
+	private int classInfoIndex;	
+	private int nameAndTypeIndex;
+	
+	public MethodRefInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getType() {
+		return type;
+	}
+	
+	public int getClassInfoIndex() {
+		return classInfoIndex;
+	}
+	public void setClassInfoIndex(int classInfoIndex) {
+		this.classInfoIndex = classInfoIndex;
+	}
+	public int getNameAndTypeIndex() {
+		return nameAndTypeIndex;
+	}
+	public void setNameAndTypeIndex(int nameAndTypeIndex) {
+		this.nameAndTypeIndex = nameAndTypeIndex;
+	}
+	
+	public String toString(){
+	
+		return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ;
+	}
+	public String getClassName(){
+		ConstantPool pool = this.getConstantPool();		
+		ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex());
+		return clzInfo.getClassName();
+	}
+	
+	public String getMethodName(){
+		ConstantPool pool = this.getConstantPool();
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getName();
+	}
+	
+	public String getParamAndReturnType(){
+		ConstantPool pool = this.getConstantPool();
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getTypeInfo();
+	}
+	
+	
+	
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/NameAndTypeInfo.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/NameAndTypeInfo.java
new file mode 100644
index 0000000000..5a13ce1a38
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,45 @@
+package cn.xl.jvm.constant;
+
+public class NameAndTypeInfo extends ConstantInfo{
+	public  int type = ConstantInfo.NAME_AND_TYPE_INFO;
+	
+	private int index1;
+	private int index2;
+	
+	public NameAndTypeInfo(ConstantPool pool) {
+		super(pool);
+	}
+	
+	public int getIndex1() {
+		return index1;
+	}
+	public void setIndex1(int index1) {
+		this.index1 = index1;
+	}
+	public int getIndex2() {
+		return index2;
+	}
+	public void setIndex2(int index2) {
+		this.index2 = index2;
+	}
+	public int getType() {
+		return type;
+	}
+	
+	
+	public String getName(){
+		ConstantPool pool = this.getConstantPool();
+		UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1);
+		return utf8Info1.getValue();
+	}
+	
+	public String getTypeInfo(){
+		ConstantPool pool = this.getConstantPool();
+		UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2);
+		return utf8Info2.getValue();
+	}
+	
+	public String toString(){
+		return "(" + getName() + "," + getTypeInfo()+")";
+	}
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/NullConstantInfo.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/NullConstantInfo.java
new file mode 100644
index 0000000000..85b23e1862
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/NullConstantInfo.java
@@ -0,0 +1,13 @@
+package cn.xl.jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo {
+
+	public NullConstantInfo(){
+		
+	}
+	@Override
+	public int getType() {		
+		return -1;
+	}
+	
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/StringInfo.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/StringInfo.java
new file mode 100644
index 0000000000..df8c0586f2
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/StringInfo.java
@@ -0,0 +1,26 @@
+package cn.xl.jvm.constant;
+
+public class StringInfo extends ConstantInfo{
+	private int type = ConstantInfo.STRING_INFO;
+	private int index;
+	public StringInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getType() {
+		return type;
+	}
+	
+	public int getIndex() {
+		return index;
+	}
+	public void setIndex(int index) {
+		this.index = index;
+	}
+
+	
+	public String toString(){
+		return this.getConstantPool().getUTF8String(index);
+	}
+	
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/UTF8Info.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/UTF8Info.java
new file mode 100644
index 0000000000..83ba9153cc
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/constant/UTF8Info.java
@@ -0,0 +1,32 @@
+package cn.xl.jvm.constant;
+
+public class UTF8Info extends ConstantInfo{
+	private int type = ConstantInfo.UTF8_INFO;
+	private int length ;
+	private String value;
+	public UTF8Info(ConstantPool pool) {
+		super(pool);
+	}
+	public int getLength() {
+		return length;
+	}
+	public void setLength(int length) {
+		this.length = length;
+	}
+	public int getType() {
+		return type;
+	}
+	@Override
+	public String toString() {
+		return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]";
+	}
+	public String getValue() {
+		return value;
+	}
+	public void setValue(String value) {
+		this.value = value;
+	}
+	
+	
+
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/ByteCodeIterator.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/ByteCodeIterator.java
new file mode 100644
index 0000000000..41ecfe5411
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,83 @@
+package cn.xl.jvm.loader;
+
+import java.util.Arrays;
+
+import cn.xl.jvm.util.Util;
+
+public class ByteCodeIterator {
+
+	private  byte[] bt;
+
+	private  int size;
+
+	public   int pos = 0;
+
+	public ByteCodeIterator(byte[] b){
+
+		if(b != null){
+			this.bt = b;
+			this.size = b.length;
+		}
+	}
+
+	public boolean hasNext(){
+		if(pos < size){
+			return true;
+		}else{
+			return false;
+		}
+	}
+
+	public Object next(){
+		if(bt != null && pos < size){
+			return bt[pos++];
+		}else{
+			return -1;
+		}
+	}
+
+	public byte[] nextLenBytes(int len){
+
+		if(pos+len >= size){
+			throw new ArrayIndexOutOfBoundsException();
+		}
+
+		byte[] b = Arrays.copyOfRange(bt, pos, pos+len);
+		pos = pos+len;
+
+		return b;
+	}
+
+	public int nextU1ToInt(){
+
+		return Util.byteToInt(new byte[]{bt[pos++]});
+	}
+
+	public int nextU2ToInt(){
+
+		return Util.byteToInt(new byte[]{bt[pos++],bt[pos++]});
+	}
+
+	public int nextU4ToInt(){
+
+		return Util.byteToInt(new byte[]{bt[pos++],bt[pos++],bt[pos++],bt[pos++]});
+	}
+
+
+	public String nextU4ToHexString(){
+
+		return Util.byteToHexString(new byte[]{bt[pos++],bt[pos++],bt[pos++],bt[pos++]});
+	}
+
+
+	public static void main(String[] args){
+
+		byte[] codes = new byte[]{1,2,3,4,5,6,7};
+
+		byte[] b = Arrays.copyOfRange(codes, 0, 3);
+
+		for(int i = 0; i < b.length; i++){
+			System.out.println(b[i]);
+		}
+	}
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/ClassFileLoader.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/ClassFileLoader.java
new file mode 100644
index 0000000000..4c3917a6ab
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/ClassFileLoader.java
@@ -0,0 +1,115 @@
+package cn.xl.jvm.loader;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import cn.xl.jvm.clz.ClassFile;
+
+
+
+public class ClassFileLoader {
+
+	private List<String> clzPaths = new ArrayList<String>();
+
+
+	public byte[] readBinaryCode(String className) {
+
+		className = className.replace('.', File.separatorChar) +".class";
+
+		for(String path : this.clzPaths){
+
+			String clzFileName = path + File.separatorChar + className;
+			byte[] codes = loadClassFile(clzFileName);
+			if(codes != null){
+				return codes;
+			}			
+		}
+
+		return null;
+	}
+
+	
+	public ClassFile loadClass(String className){
+		
+		byte[] codes = readBinaryCode(className);
+		
+		ClassFileParser  classFileParser = new ClassFileParser();
+		ClassFile classFile = classFileParser.parse(codes);
+		
+		return classFile;
+		
+	}
+	
+	
+	
+
+	private byte[] loadClassFile(String clzFileName){
+
+		try {
+			File f = new File(clzFileName);
+
+			return IOUtils.toByteArray(new FileInputStream(f));
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+			return null;
+		} catch (IOException e) {
+			e.printStackTrace();
+			return null;
+		}
+		
+		/*InputStream in = null;
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		try {
+			// 一次读一个字节
+			in = new FileInputStream(file);
+			int tempbyte;
+			while ((tempbyte = in.read()) != -1) {
+				baos.write(tempbyte);
+			}
+			in.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+			return null;
+		}
+		return baos.toByteArray();	*/
+
+	}
+
+
+
+	public void addClassPath(String path) {
+		if(this.clzPaths.contains(path)){
+			return;
+		}
+		clzPaths.add(path);
+	}
+
+
+
+	public String getClassPath(){
+		/*StringBuffer sbf = new StringBuffer();
+		if(clzPaths.size() >= 1){
+			sbf.append(clzPaths.get(0));
+		}
+		for(int i = 1; i < clzPaths.size(); i++){
+			sbf.append(";");
+			sbf.append(clzPaths.get(i));
+		}
+		return sbf.toString();
+		*/
+
+		
+		return StringUtils.join(this.clzPaths, ";");
+
+	}
+
+
+
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/ClassFileParser.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/ClassFileParser.java
new file mode 100644
index 0000000000..4f34da4d86
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/ClassFileParser.java
@@ -0,0 +1,126 @@
+package cn.xl.jvm.loader;
+
+import java.io.UnsupportedEncodingException;
+
+import cn.xl.jvm.clz.AccessFlag;
+import cn.xl.jvm.clz.ClassFile;
+import cn.xl.jvm.clz.ClassIndex;
+import cn.xl.jvm.constant.ClassInfo;
+import cn.xl.jvm.constant.ConstantPool;
+import cn.xl.jvm.constant.FieldRefInfo;
+import cn.xl.jvm.constant.MethodRefInfo;
+import cn.xl.jvm.constant.NameAndTypeInfo;
+import cn.xl.jvm.constant.NullConstantInfo;
+import cn.xl.jvm.constant.StringInfo;
+import cn.xl.jvm.constant.UTF8Info;
+
+public class ClassFileParser {
+
+	public ClassFile parse(byte[] codes) {
+
+		ClassFile classFile = new ClassFile();
+		
+		ByteCodeIterator iter = new ByteCodeIterator(codes);
+		
+		if(!"cafebabe".equals(iter.nextU4ToHexString())){
+			return null;
+		}
+		classFile.setMinorVersion(iter.nextU2ToInt());
+		classFile.setMajorVersion(iter.nextU2ToInt());
+		classFile.setAccessFlag(this.parseAccessFlag(iter));
+		classFile.setClassIndex(this.parseClassIndex(iter));
+		classFile.setConstPool(this.parseConstantPool(iter));
+		
+		
+		return classFile;
+	}
+
+
+
+	private AccessFlag parseAccessFlag(ByteCodeIterator iter) {
+
+		/*AccessFlag accessFlag = new AccessFlag(iter.nextU2ToInt());
+		
+		return accessFlag;*/
+		return null;
+	}
+
+	private ClassIndex parseClassIndex(ByteCodeIterator iter) {
+
+		return null;
+
+	}
+
+	private ConstantPool parseConstantPool(ByteCodeIterator iter) {
+
+		int constantCount = iter.nextU2ToInt();
+		System.out.println("constantPool count："+constantCount);
+
+		ConstantPool constantPool = new ConstantPool();
+		constantPool.addConstantInfo(new NullConstantInfo());
+
+		for(int i = 0; i < constantCount; i++){
+			int tag = iter.nextU1ToInt();
+			if(tag == 7){
+				
+				int utf8Index = iter.nextU2ToInt();
+				ClassInfo classInfo = new ClassInfo(constantPool);
+				classInfo.setUtf8Index(utf8Index);
+				constantPool.addConstantInfo(classInfo);
+			}else if(tag == 1){
+				
+				int length = iter.nextU2ToInt();
+				UTF8Info utf8Info = new UTF8Info(constantPool);
+				utf8Info.setLength(length);
+				byte[] b = iter.nextLenBytes(length);
+				String strValue = null;
+				try {
+					strValue = new String(b,"UTF-8");
+				} catch (UnsupportedEncodingException e) {
+					e.printStackTrace();
+				}
+				
+				utf8Info.setValue(strValue);
+				constantPool.addConstantInfo(utf8Info);
+			}else if(tag == 8){
+				
+				int index = iter.nextU2ToInt();
+				StringInfo stringInfo = new StringInfo(constantPool);
+				stringInfo.setIndex(index);
+				constantPool.addConstantInfo(stringInfo);
+			}else if(tag == 9){
+				
+				int classInfoindex = iter.nextU2ToInt();
+				int nameTypeIndex = iter.nextU2ToInt();
+				FieldRefInfo filedRefInfo = new FieldRefInfo(constantPool);
+				filedRefInfo.setClassInfoIndex(classInfoindex);
+				filedRefInfo.setNameAndTypeIndex(nameTypeIndex);
+				constantPool.addConstantInfo(filedRefInfo);
+			}else if(tag == 10){
+				
+				int classInfoindex = iter.nextU2ToInt();
+				int nameTypeIndex = iter.nextU2ToInt();
+				MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool);
+				methodRefInfo.setClassInfoIndex(classInfoindex);
+				methodRefInfo.setNameAndTypeIndex(nameTypeIndex);
+				constantPool.addConstantInfo(methodRefInfo);
+			}else if(tag == 12){
+				
+				int nameIndex = iter.nextU2ToInt();
+				int descIndex = iter.nextU2ToInt();
+				NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool);
+				nameAndTypeInfo.setIndex1(nameIndex);
+				nameAndTypeInfo.setIndex2(descIndex);
+				constantPool.addConstantInfo(nameAndTypeInfo);
+			}else{
+				//throw new RuntimeException("the constant Pool tag "+tag+" has not been implement yet！");
+			}
+
+		}
+
+		return constantPool;
+	}
+
+
+
+}
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/EmployeeV1.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/EmployeeV1.java
new file mode 100644
index 0000000000..93642d6066
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/loader/EmployeeV1.java
@@ -0,0 +1,28 @@
+package cn.xl.jvm.loader;
+
+public class EmployeeV1 {
+	
+	
+	private String name;
+    private int age;
+    
+    public EmployeeV1(String name, int age) {
+        this.name = name;
+        this.age = age;        
+    }    
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    public void setAge(int age){
+    	this.age = age;
+    }
+    public void sayHello() {        
+    	System.out.println("Hello , this is class Employee ");    	
+    }
+    public static void main(String[] args){
+    	EmployeeV1 p = new EmployeeV1("Andy",29);
+    	p.sayHello();    
+    	
+    }
+}
\ No newline at end of file
diff --git a/group13/413007522/lesson05/src/main/java/cn/xl/jvm/util/Util.java b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/util/Util.java
new file mode 100644
index 0000000000..32e0200220
--- /dev/null
+++ b/group13/413007522/lesson05/src/main/java/cn/xl/jvm/util/Util.java
@@ -0,0 +1,43 @@
+package cn.xl.jvm.util;
+
+import java.math.BigDecimal;
+
+public class Util {
+	public static int byteToInt(byte[] codes){
+		String s1 = byteToHexString(codes);
+		return Integer.valueOf(s1, 16).intValue();
+	}
+
+	public static BigDecimal byteToFloat(byte[] codes){
+		String s1 = byteToHexString(codes);
+		int bits = Integer.valueOf(s1, 16).intValue();
+		int s = ((bits >> 31) == 0) ? 1 : -1;
+		int e = ((bits >> 23) & 0xff);
+		int m =(e == 0) ?(bits & 0x7fffff) << 1 :(bits & 0x7fffff) | 0x800000;
+		
+		double f = Math.pow(2, e-150);
+		
+		BigDecimal bs = new BigDecimal(Double.toString(s));
+		BigDecimal bm = new BigDecimal(Double.toString(m));
+		BigDecimal bf = new BigDecimal(Double.toString(f));
+		
+		return bs.multiply(bm).multiply(bf);
+		
+		
+		
+	}
+
+	public static String byteToHexString(byte[] codes ){
+		StringBuffer buffer = new StringBuffer();
+		for(int i=0;i<codes.length;i++){
+			byte b = codes[i];
+			int value = b & 0xFF;
+			String strHex = Integer.toHexString(value);
+			if(strHex.length()< 2){
+				strHex = "0" + strHex;
+			}		
+			buffer.append(strHex);
+		}
+		return buffer.toString();
+	}
+}
diff --git a/group13/413007522/lesson05/src/test/java/jvm/loader/ByteCodeInteratorTest.java b/group13/413007522/lesson05/src/test/java/jvm/loader/ByteCodeInteratorTest.java
new file mode 100644
index 0000000000..c38d4ce742
--- /dev/null
+++ b/group13/413007522/lesson05/src/test/java/jvm/loader/ByteCodeInteratorTest.java
@@ -0,0 +1,28 @@
+package jvm.loader;
+
+import org.junit.Test;
+
+import cn.xl.jvm.loader.ByteCodeIterator;
+
+public class ByteCodeInteratorTest {
+
+	@Test
+	public void iter(){
+		byte[] b = new byte[8];
+		b[0] = 'C';
+		b[1] = 'A';
+		b[2] = 'F';
+		b[3] = 'E';
+		b[4] = 'B';
+		b[5] = 'A';
+		b[6] = 'B';
+		b[7] = 'E';
+		
+		ByteCodeIterator bcit = new ByteCodeIterator(b);
+		
+		while(bcit.hasNext()){
+			System.out.println(bcit.next());
+		}
+		
+	}
+}
diff --git a/group13/413007522/lesson05/src/test/java/jvm/loader/ClassFileloaderTest.java b/group13/413007522/lesson05/src/test/java/jvm/loader/ClassFileloaderTest.java
new file mode 100644
index 0000000000..795d69e596
--- /dev/null
+++ b/group13/413007522/lesson05/src/test/java/jvm/loader/ClassFileloaderTest.java
@@ -0,0 +1,205 @@
+package jvm.loader;
+
+import org.junit.After;
+import  org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import cn.xl.jvm.clz.ClassFile;
+import cn.xl.jvm.clz.ClassIndex;
+import cn.xl.jvm.constant.ClassInfo;
+import cn.xl.jvm.constant.ConstantPool;
+import cn.xl.jvm.constant.MethodRefInfo;
+import cn.xl.jvm.constant.NameAndTypeInfo;
+import cn.xl.jvm.constant.UTF8Info;
+import cn.xl.jvm.loader.ClassFileLoader;
+import cn.xl.jvm.loader.ClassFileParser;
+
+
+
+
+
+
+public class ClassFileloaderTest {
+
+	private static final String FULL_QUALIFIED_CLASS_NAME = "cn/xl/jvm/loader/EmployeeV1";
+
+
+	static String path1 = "D:/trainingworkspace/lesson01/target/classes";
+	static String path2 = "D://??";
+
+	static ClassFile clzFile = null;
+	static {
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		String className = "cn.xl.jvm.loader.EmployeeV1";
+		clzFile = loader.loadClass(className);
+		clzFile.print();
+	}
+
+	@Before
+	public void setUp() throws Exception {		 
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	/*@Test
+	public void testClassPath(){		
+
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		loader.addClassPath(path2);
+
+		String clzPath = loader.getClassPath();
+
+		Assert.assertEquals(path1+";"+path2,clzPath);
+
+	}
+
+	@Test
+	public void testClassFileLength() {		
+
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+
+		String className = "cn.xl.jvm.loader.EmployeeV1";
+
+		byte[] byteCodes = loader.readBinaryCode(className);
+
+		// 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
+		Assert.assertEquals(1042, byteCodes.length);
+
+	}
+
+
+	@Test	
+	public void testMagicNumber(){
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		String className = "cn.xl.jvm.loader.EmployeeV1";
+		byte[] byteCodes = loader.readBinaryCode(className);
+		byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
+
+		String acctualValue = this.byteToHexString(codes);
+		
+		Assert.assertEquals("cafebabe", acctualValue);
+	}
+
+
+
+
+
+
+	private String byteToHexString(byte[] codes ){
+		StringBuffer buffer = new StringBuffer();
+		for(int i=0;i<codes.length;i++){
+			byte b = codes[i];
+			int value = b & 0xFF;
+			String strHex = Integer.toHexString(value);
+			if(strHex.length()< 2){
+				strHex = "0" + strHex;
+			}		
+			buffer.append(strHex);
+		}
+		return buffer.toString();
+	}*/
+
+
+
+	/**
+	 * ----------------------------------------------------------------------
+	 */
+
+
+	@Test
+	public void testVersion(){    			
+
+		Assert.assertEquals(0, clzFile.getMinorVersion());
+		Assert.assertEquals(52, clzFile.getMajorVersion());
+
+	}
+
+	@Test
+	public void testConstantPool(){
+
+
+		ConstantPool pool = clzFile.getConstantPool();
+
+		Assert.assertEquals(53, pool.getSize());
+
+		{
+			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
+			Assert.assertEquals(2, clzInfo.getUtf8Index());
+
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
+			Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue());
+		}
+		{
+			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
+			Assert.assertEquals(4, clzInfo.getUtf8Index());
+
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
+			Assert.assertEquals("java/lang/Object", utf8Info.getValue());
+		}
+		{
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
+			Assert.assertEquals("name", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(6);
+			Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(7);
+			Assert.assertEquals("age", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(8);
+			Assert.assertEquals("I", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(9);
+			Assert.assertEquals("<init>", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(10);
+			Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(11);
+			Assert.assertEquals("Code", utf8Info.getValue());
+		}
+
+		{
+			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(12);
+			Assert.assertEquals(3, methodRef.getClassInfoIndex());
+			Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+		}
+
+		{
+			NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+			Assert.assertEquals(9, nameAndType.getIndex1());
+			Assert.assertEquals(14, nameAndType.getIndex2());
+		}
+		//抽查几个吧
+		{
+			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45);
+			Assert.assertEquals(1, methodRef.getClassInfoIndex());
+			Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+		}
+
+		{
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+			Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+		}
+	}
+	@Test
+	public void testClassIndex(){
+
+		/*ClassIndex clzIndex = clzFile.getClzIndex();
+		ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+		ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+
+
+		Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+		Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());*/
+	}
+
+
+}
