really hard , should review latter