function _breedWith(uint256 _matronId, uint256 _sireId) internal {
        require(_matronId > 1);
        require(_sireId > 1);
        
        Dog storage sire = dogs[_sireId];
        Dog storage matron = dogs[_matronId];

        require(sire.variation == 0);
        require(matron.variation == 0);

        if (matron.generation > 0) {
            var(,,openBlock,,,,,,) = lottery.getCLottery();
            if (matron.birthTime < openBlock) {
                require(lottery.checkLottery(matron.genes) == 100);
            }
        }

        matron.siringWithId = uint32(_sireId);

        _triggerCooldown(sire);
        _triggerCooldown(matron);

        delete sireAllowedToAddress[_matronId];
        delete sireAllowedToAddress[_sireId];

        pregnantDogs++;

        cfoAddress.transfer(autoBirthFee);

        address owner = getOwner(0);
        if(owner != address(0)){
            _sendMoney(owner, creationProfit);
        }
        owner = getOwner(1);
        if(owner != address(0)){
            _sendMoney(owner, creationProfit);
        }

        if (matron.generation > 0) {
            owner = getOwner(matron.gen0);
            if(owner != address(0)){
                _sendMoney(owner, gen0Profit);
            }
        }

        Pregnant(dogIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock, sire.cooldownEndBlock, matron.cooldownIndex, sire.cooldownIndex);
    }