function ContributeWithSender (bool reuseCashInHarware,uint8 freezeCoeff,address sender) {
        if (msg.value == 0 || freezeCoeff>100 ||ContributedAmount + msg.value > ContributedLimit)
        {
            sender.send(msg.value);
            return;
        }
        
        uint16 userId = GetUserIdByAddress(sender);
        if (userId == 65535)
        {
            userId = UsersLength;
            Users[userId].Address = sender;
            UsersLength ++;
        }
        
        uint cashFreezed = ((msg.value/100)*freezeCoeff);
        ContributeInternal(
            userId,
            msg.value - cashFreezed,
            cashFreezed,
            reuseCashInHarware
            );
        FreezedCash += cashFreezed;
        ContributedAmount += msg.value;
        
        OutputAddress.send(msg.value - cashFreezed);
    }