func: function finalize(uint _maxIt) public {
          require(now >= endTime);
          require(!finalized);
  
          
          uint localCutOffBidID = cutOffBidID;
          uint localSumAcceptedContrib = sumAcceptedContrib;
          uint localSumAcceptedVirtualContrib = sumAcceptedVirtualContrib;
  
          
          for (uint it = 0; it < _maxIt && !finalized; ++it) {
              Bid storage bid = bids[localCutOffBidID];
              if (bid.contrib+localSumAcceptedContrib < bid.maxValuation) { 
                  localSumAcceptedContrib        += bid.contrib;
                  localSumAcceptedVirtualContrib += bid.contrib + (bid.contrib * bid.bonus) / BONUS_DIVISOR;
                  localCutOffBidID = bid.prev; 
              } else { 
                  finalized = true;
                  uint contribCutOff = bid.maxValuation >= localSumAcceptedContrib ? bid.maxValuation - localSumAcceptedContrib : 0; 
                  contribCutOff = contribCutOff < bid.contrib ? contribCutOff : bid.contrib; 
                  bid.contributor.send(bid.contrib-contribCutOff); 
                  bid.contrib = contribCutOff; 
                  localSumAcceptedContrib += bid.contrib;
                  localSumAcceptedVirtualContrib += bid.contrib + (bid.contrib * bid.bonus) / BONUS_DIVISOR;
                  beneficiary.send(localSumAcceptedContrib); 
              }
          }
  
          
          cutOffBidID = localCutOffBidID;
          sumAcceptedContrib = localSumAcceptedContrib;
          sumAcceptedVirtualContrib = localSumAcceptedVirtualContrib;
      }