public unsafe override void Unity_NamedDeserialize(int depth)
    {
        byte[] var_0_cp_0;
        int    var_0_cp_1;

        if (depth <= 7)
        {
            if (this.source == null)
            {
                this.source = new PropertyReference();
            }
            PropertyReference           arg_3F_0 = this.source;
            ISerializedNamedStateReader arg_37_0 = SerializedNamedStateReader.Instance;
            var_0_cp_0 = $FieldNamesStorage.$RuntimeNames;
            var_0_cp_1 = 0;
            arg_37_0.BeginMetaGroup(&var_0_cp_0[var_0_cp_1] + 1563);
            arg_3F_0.Unity_NamedDeserialize(depth + 1);
            SerializedNamedStateReader.Instance.EndMetaGroup();
        }
        if (depth <= 7)
        {
            if (this.target == null)
            {
                this.target = new PropertyReference();
            }
            PropertyReference arg_82_0 = this.target;
            SerializedNamedStateReader.Instance.BeginMetaGroup(&var_0_cp_0[var_0_cp_1] + 265);
            arg_82_0.Unity_NamedDeserialize(depth + 1);
            SerializedNamedStateReader.Instance.EndMetaGroup();
        }
        this.direction = (PropertyBinding.Direction)SerializedNamedStateReader.Instance.ReadInt32(&var_0_cp_0[var_0_cp_1] + 1639);
        this.update    = (PropertyBinding.UpdateCondition)SerializedNamedStateReader.Instance.ReadInt32(&var_0_cp_0[var_0_cp_1] + 2265);
        this.editMode  = SerializedNamedStateReader.Instance.ReadBoolean(&var_0_cp_0[var_0_cp_1] + 2272);
        SerializedNamedStateReader.Instance.Align();
    }
 public override void Unity_Deserialize(int depth)
 {
     if (depth <= 7)
     {
         if (this.source == null)
         {
             this.source = new PropertyReference();
         }
         this.source.Unity_Deserialize(depth + 1);
     }
     if (depth <= 7)
     {
         if (this.target == null)
         {
             this.target = new PropertyReference();
         }
         this.target.Unity_Deserialize(depth + 1);
     }
     this.direction = (PropertyBinding.Direction)SerializedStateReader.Instance.ReadInt32();
     this.update    = (PropertyBinding.UpdateCondition)SerializedStateReader.Instance.ReadInt32();
     this.editMode  = SerializedStateReader.Instance.ReadBoolean();
     SerializedStateReader.Instance.Align();
 }
    public override void OnInspectorGUI()
    {
        PropertyBinding pb = target as PropertyBinding;

        NGUIEditorTools.SetLabelWidth(80f);

        serializedObject.Update();

        if (pb.direction == PropertyBinding.Direction.TargetUpdatesSource && pb.target != null)
        {
            PropertyReferenceDrawer.filter = pb.target.GetPropertyType();
        }

        GUILayout.Space(3f);
        PropertyBinding.Direction dir = (target as PropertyBinding).direction;

        PropertyReferenceDrawer.mustRead = (dir == PropertyBinding.Direction.SourceUpdatesTarget ||
                                            dir == PropertyBinding.Direction.BiDirectional);
        PropertyReferenceDrawer.mustWrite = (dir == PropertyBinding.Direction.TargetUpdatesSource ||
                                             dir == PropertyBinding.Direction.BiDirectional);

        NGUIEditorTools.DrawProperty(serializedObject, "source");

        if (pb.direction == PropertyBinding.Direction.SourceUpdatesTarget && pb.source != null)
        {
            PropertyReferenceDrawer.filter = pb.source.GetPropertyType();
        }

        if (pb.source.target != null)
        {
            GUILayout.Space(-18f);

            if (pb.direction == PropertyBinding.Direction.TargetUpdatesSource)
            {
                GUILayout.Label("   \u25B2");                 // Up
            }
            else if (pb.direction == PropertyBinding.Direction.SourceUpdatesTarget)
            {
                GUILayout.Label("   \u25BC");                 // Down
            }
            else
            {
                GUILayout.Label("  \u25B2\u25BC");
            }
        }

        GUILayout.Space(1f);

        PropertyReferenceDrawer.mustRead = (dir == PropertyBinding.Direction.TargetUpdatesSource ||
                                            dir == PropertyBinding.Direction.BiDirectional);
        PropertyReferenceDrawer.mustWrite = (dir == PropertyBinding.Direction.SourceUpdatesTarget ||
                                             dir == PropertyBinding.Direction.BiDirectional);

        NGUIEditorTools.DrawProperty(serializedObject, "target");

        PropertyReferenceDrawer.mustRead  = false;
        PropertyReferenceDrawer.mustWrite = false;
        PropertyReferenceDrawer.filter    = typeof(void);

        GUILayout.Space(1f);
        NGUIEditorTools.DrawPaddedProperty(serializedObject, "direction");
        NGUIEditorTools.DrawPaddedProperty(serializedObject, "update");
        GUILayout.BeginHorizontal();
        NGUIEditorTools.DrawProperty(" ", serializedObject, "editMode", GUILayout.Width(100f));
        GUILayout.Label("Update in Edit Mode");
        GUILayout.EndHorizontal();

        if (!serializedObject.isEditingMultipleObjects)
        {
            if (pb.source != null && pb.target != null && pb.source.GetPropertyType() != pb.target.GetPropertyType())
            {
                if (pb.direction == PropertyBinding.Direction.BiDirectional)
                {
                    EditorGUILayout.HelpBox("Bi-Directional updates require both Source and Target to reference values of the same type.", MessageType.Error);
                }
                else if (pb.direction == PropertyBinding.Direction.SourceUpdatesTarget)
                {
                    if (!PropertyReference.Convert(pb.source.Get(), pb.target.GetPropertyType()))
                    {
                        EditorGUILayout.HelpBox("Unable to convert " + pb.source.GetPropertyType() + " to " + pb.target.GetPropertyType(), MessageType.Error);
                    }
                }
                else if (!PropertyReference.Convert(pb.target.Get(), pb.source.GetPropertyType()))
                {
                    EditorGUILayout.HelpBox("Unable to convert " + pb.target.GetPropertyType() + " to " + pb.source.GetPropertyType(), MessageType.Error);
                }
            }
        }
        serializedObject.ApplyModifiedProperties();
    }