// Path: src/com/kk/binding/converter/IValueConverter.java
// public interface IValueConverter {
//     public Object converter(Object source) throws Exception;
// }
// 
// Path: src/com/kk/binding/property/INotifyPropertyChanged.java
// public interface INotifyPropertyChanged {
// 	public void setPropertyChangedListener(IPropertyChanged listener);
// }
// 
// Path: src/com/kk/binding/property/IPropertyChanged.java
// public interface IPropertyChanged {
// 	public void propertyChanged(Object sender, PropertyChangedEventArgs args);
// }
// 
// Path: src/com/kk/binding/property/PropertyChangedEventArgs.java
// public class PropertyChangedEventArgs {
// 	private String propertyName;
// 	private Object oldValue;
// 	private Object newValue;
// 
// 	public PropertyChangedEventArgs(String propertyName) {
// 		this.propertyName = propertyName;
// 	}
// 
// 	public PropertyChangedEventArgs(String propertyName, Object oldValue, Object newValue) {
// 		this.propertyName = propertyName;
// 		this.oldValue = oldValue;
// 		this.newValue = newValue;
// 	}
// 
// 	/**
// 	 * @return the propertyName
// 	 */
// 	public String getName() {
// 		return propertyName;
// 	}
// 
// 	/**
// 	 * @return the oldValue
// 	 */
// 	public Object getOldValue() {
// 		return oldValue;
// 	}
// 
// 	/**
// 	 * @return the newValue
// 	 */
// 	public Object getNewValue() {
// 		return newValue;
// 	}
// }
// 
// Path: src/com/kk/binding/util/BindLog.java
// public class BindLog {
//     private static boolean inDesignMode = false;
//     private static StringBuilder fullLog;
//     private static boolean logOpen = true;
// 
//     public static void d(String tag, String log) {
//         if (inDesignMode) {
//             designLog(tag, log);
//         } else if (logOpen) {
//             Log.d(tag, log);
//         }
//     }
// 
//     public static void i(String tag, String log) {
//         if (inDesignMode) {
//             designLog(tag, log);
//         } else if (logOpen) {
//             Log.i(tag, log);
//         }
//     }
// 
//     public static void v(String tag, String log) {
//         if (inDesignMode) {
//             designLog(tag, log);
//         } else if (logOpen) {
//             Log.v(tag, log);
//         }
//     }
// 
//     public static void e(String tag, String log) {
//         if (inDesignMode) {
//             designLog(tag, log);
//         } else if (logOpen) {
//             Log.e(tag, log);
//         }
//     }
// 
//     public static void w(String tag, String log) {
//         if (inDesignMode) {
//             designLog(tag, log);
//         } else if (logOpen) {
//             Log.w(tag, log);
//         }
//     }
// 
//     private static void designLog(String tag, String log) {
//         if (fullLog != null) {
//             fullLog.append("\nTAG: ").append(tag).append(" ");
//             fullLog.append(log);
//             fullLog.append("\n");
//         }
//     }
// 
//     public static void throwDesignLog() {
//         if (inDesignMode) {
//             throw new RuntimeException(fullLog != null ? fullLog.toString() : null);
//         }
//     }
// 
//     public static void setInDesignMode(boolean inDesignMode) {
//         BindLog.inDesignMode = inDesignMode;
//         if (inDesignMode) {
//             fullLog = new StringBuilder(1024 * 10);
//         }
//     }
// 
//     public static boolean isInDesignMode() {
//         return inDesignMode;
//     }
// 
//     public static void setBindLogOpen(boolean open) {
//         logOpen = open;
//     }
// 
//     public static boolean isLogOpen() {
//         return logOpen;
//     }
// }
// 
// Path: src/com/kk/binding/util/StringUtil.java
// public class StringUtil {
//     public static boolean isNullOrEmpty(String str) {
//         return str == null || str.isEmpty();
//     }
// 
//     public static boolean compare(String str1, String str2) {
//         return (str1 == null || str2 == null) ? str1 == str2 : str1.equals(str2);
//     }
// }


import com.kk.binding.converter.IValueConverter;
import com.kk.binding.property.INotifyPropertyChanged;
import com.kk.binding.property.IPropertyChanged;
import com.kk.binding.property.PropertyChangedEventArgs;
import com.kk.binding.util.BindLog;
import com.kk.binding.util.StringUtil;

        this.dpo = dpo;
    }

    public DependencyProperty getDependencyProperty() {
        return dp;
    }

    public DependencyObject getDependencyObject() {
        return dpo;
    }

    public void setDataContext(Object dataContext) {
        if (this.dataContext != dataContext) {
            BindLog.d(TAG, "OnBindDataContextChanged:\n"
                    + "\n propertyName = " + dp.getPropertyName()
                    + "\n path = " + path
                    + "\n oldDataContext = " + this.dataContext
                    + "\n newDataContext = " + dataContext);

            // unregister old
            if (this.dataContext instanceof INotifyPropertyChanged) {
                ((INotifyPropertyChanged) this.dataContext).setPropertyChangedListener(null);
            }
            this.dataContext = dataContext;
            // register new
            if (this.dataContext instanceof INotifyPropertyChanged) {
                ((INotifyPropertyChanged) this.dataContext).setPropertyChangedListener(new IPropertyChanged() {

                    @Override
                    public void propertyChanged(Object sender, PropertyChangedEventArgs args) {

// Path: src/com/kk/binding/converter/IValueConverter.java
// public interface IValueConverter {
//     public Object converter(Object source) throws Exception;
// }
// 
// Path: src/com/kk/binding/property/INotifyPropertyChanged.java
// public interface INotifyPropertyChanged {
// 	public void setPropertyChangedListener(IPropertyChanged listener);
// }
// 
// Path: src/com/kk/binding/property/IPropertyChanged.java
// public interface IPropertyChanged {
// 	public void propertyChanged(Object sender, PropertyChangedEventArgs args);
// }
// 
// Path: src/com/kk/binding/property/PropertyChangedEventArgs.java
// public class PropertyChangedEventArgs {
// 	private String propertyName;
// 	private Object oldValue;
// 	private Object newValue;
// 
// 	public PropertyChangedEventArgs(String propertyName) {
// 		this.propertyName = propertyName;
// 	}
// 
// 	public PropertyChangedEventArgs(String propertyName, Object oldValue, Object newValue) {
// 		this.propertyName = propertyName;
// 		this.oldValue = oldValue;
// 		this.newValue = newValue;
// 	}
// 
// 	/**
// 	 * @return the propertyName
// 	 */
// 	public String getName() {
// 		return propertyName;
// 	}
// 
// 	/**
// 	 * @return the oldValue
// 	 */
// 	public Object getOldValue() {
// 		return oldValue;
// 	}
// 
// 	/**
// 	 * @return the newValue
// 	 */
// 	public Object getNewValue() {
// 		return newValue;
// 	}
// }
// 
// Path: src/com/kk/binding/util/BindLog.java
// public class BindLog {
//     private static boolean inDesignMode = false;
//     private static StringBuilder fullLog;
//     private static boolean logOpen = true;
// 
//     public static void d(String tag, String log) {
//         if (inDesignMode) {
//             designLog(tag, log);
//         } else if (logOpen) {
//             Log.d(tag, log);
//         }
//     }
// 
//     public static void i(String tag, String log) {
//         if (inDesignMode) {
//             designLog(tag, log);
//         } else if (logOpen) {
//             Log.i(tag, log);
//         }
//     }
// 
//     public static void v(String tag, String log) {
//         if (inDesignMode) {
//             designLog(tag, log);
//         } else if (logOpen) {
//             Log.v(tag, log);
//         }
//     }
// 
//     public static void e(String tag, String log) {
//         if (inDesignMode) {
//             designLog(tag, log);
//         } else if (logOpen) {
//             Log.e(tag, log);
//         }
//     }
// 
//     public static void w(String tag, String log) {
//         if (inDesignMode) {
//             designLog(tag, log);
//         } else if (logOpen) {
//             Log.w(tag, log);
//         }
//     }
// 
//     private static void designLog(String tag, String log) {
//         if (fullLog != null) {
//             fullLog.append("\nTAG: ").append(tag).append(" ");
//             fullLog.append(log);
//             fullLog.append("\n");
//         }
//     }
// 
//     public static void throwDesignLog() {
//         if (inDesignMode) {
//             throw new RuntimeException(fullLog != null ? fullLog.toString() : null);
//         }
//     }
// 
//     public static void setInDesignMode(boolean inDesignMode) {
//         BindLog.inDesignMode = inDesignMode;
//         if (inDesignMode) {
//             fullLog = new StringBuilder(1024 * 10);
//         }
//     }
// 
//     public static boolean isInDesignMode() {
//         return inDesignMode;
//     }
// 
//     public static void setBindLogOpen(boolean open) {
//         logOpen = open;
//     }
// 
//     public static boolean isLogOpen() {
//         return logOpen;
//     }
// }
// 
// Path: src/com/kk/binding/util/StringUtil.java
// public class StringUtil {
//     public static boolean isNullOrEmpty(String str) {
//         return str == null || str.isEmpty();
//     }
// 
//     public static boolean compare(String str1, String str2) {
//         return (str1 == null || str2 == null) ? str1 == str2 : str1.equals(str2);
//     }
// }


// Path: src/com/kk/binding/kernel/Binding.java
import com.kk.binding.converter.IValueConverter;
import com.kk.binding.property.INotifyPropertyChanged;
import com.kk.binding.property.IPropertyChanged;
import com.kk.binding.property.PropertyChangedEventArgs;
import com.kk.binding.util.BindLog;
import com.kk.binding.util.StringUtil;

        this.dpo = dpo;
    }

    public DependencyProperty getDependencyProperty() {
        return dp;
    }

    public DependencyObject getDependencyObject() {
        return dpo;
    }

    public void setDataContext(Object dataContext) {
        if (this.dataContext != dataContext) {
            BindLog.d(TAG, "OnBindDataContextChanged:\n"
                    + "\n propertyName = " + dp.getPropertyName()
                    + "\n path = " + path
                    + "\n oldDataContext = " + this.dataContext
                    + "\n newDataContext = " + dataContext);

            // unregister old
            if (this.dataContext instanceof INotifyPropertyChanged) {
                ((INotifyPropertyChanged) this.dataContext).setPropertyChangedListener(null);
            }
            this.dataContext = dataContext;
            // register new
            if (this.dataContext instanceof INotifyPropertyChanged) {
                ((INotifyPropertyChanged) this.dataContext).setPropertyChangedListener(new IPropertyChanged() {

                    @Override
                    public void propertyChanged(Object sender, PropertyChangedEventArgs args) {

                        if (StringUtil.compare(path, args.getName())) {
