function releaseVestedTokens(address _adr) changesToVestingFreezed(_adr) {
        VestingSchedule storage vestingSchedule = vestingMap[_adr];
        
        
        require(safeSub(vestingSchedule.amount, vestingSchedule.amountReleased) > 0);
        
        
        uint totalTime = block.timestamp - vestingSchedule.startAt;
        uint totalSteps = totalTime / vestingSchedule.step;

        
        require(vestingSchedule.cliff <= totalSteps);

        uint tokensPerStep = vestingSchedule.amount / vestingSchedule.duration;
        
        if(tokensPerStep * vestingSchedule.duration != vestingSchedule.amount) tokensPerStep++;

        uint totalReleasableAmount = safeMul(tokensPerStep, totalSteps);

        
        if(totalReleasableAmount > vestingSchedule.amount) totalReleasableAmount = vestingSchedule.amount;

        uint amountToRelease = safeSub(totalReleasableAmount, vestingSchedule.amountReleased);
        vestingSchedule.amountReleased = safeAdd(vestingSchedule.amountReleased, amountToRelease);

        
        ERC20 LALAToken = ERC20(LALATokenAddress);
        LALAToken.transfer(_adr, amountToRelease);
        
        totalUnreleasedTokens = safeSub(totalUnreleasedTokens, amountToRelease);
        VestedTokensReleased(_adr, amountToRelease);
    }