@Override
    protected void makeBottomSide() {
        // Reset the maximum X-coordinate so the infix block can resize if you remove blocks within it
        maxX = 0;

        //start bottom-right
        setEndPoint(gpBottom, botLeftCorner, topLeftCorner, true);

        //curve down and right
        BlockShapeUtil.cornerTo(gpBottom, botLeftCorner, botRightCorner, blockCornerRadius);



        /// BOTTOM SOCKETS
        //for each socket in the iterator
        int socketCounter = 0; //need to use this to determine which socket we're on
        for (BlockConnector curSocket : block.getSockets()) {

            //if bottom socket
            if (curSocket.getPositionType() == BlockConnector.PositionType.BOTTOM) {

                //move away from bottom left corner
                if (socketCounter > 0) {
                    gpBottom.lineTo(
                            (float) gpBottom.getCurrentPoint().getX() + BOTTOM_SOCKET_MIDDLE_SPACER,
                            (float) gpBottom.getCurrentPoint().getY());
                } else {
                    gpBottom.lineTo(
                            (float) gpBottom.getCurrentPoint().getX() + BOTTOM_SOCKET_SIDE_SPACER,
                            (float) gpBottom.getCurrentPoint().getY());
                }


                //move down so bevel doesn't screw up from connecting infinitely sharp corner
                // as occurs from a curved port
                BlockShapeUtil.lineToRelative(gpBottom, 0, -0.1f);

                //////////////////////
                //begin drawing socket
                //////////////////////

                if (curSocket.getBlockID() == Block.NULL) {
                    //draw first socket - up left side
                    Point2D leftSocket = BCS.addDataSocketUp(gpBottom, curSocket.getKind(), true);
                    rb.updateSocketPoint(curSocket, leftSocket);
                    //System.out.println("socket poitn: "+rb.getSocketPoint(curSocket));

                    //System.out.println("socket poitn leftsocket: "+leftSocket);

                    //draw left standard empty socket space - top side
                    gpBottom.lineTo(
                            (float) gpBottom.getCurrentPoint().getX() + BOTTOM_SOCKET_SIDE_SPACER,
                            (float) gpBottom.getCurrentPoint().getY());


                    //draw first socket - down right side
                    BCS.addDataSocket(gpBottom, curSocket.getKind(), false);
                    //rb.updateSocketPoint(curSocket, rightSocket);
                } else { //there is a connected block
                    Block connectedBlock = rb.getWorkspace().getEnv().getBlock(curSocket.getBlockID());
                    RenderableBlock connectedRBlock = rb.getWorkspace().getEnv().getRenderableBlock(curSocket.getBlockID());

                    //calculate and update the new socket point
                    //update the socket point of this cursocket which should now adopt the plug socket point of its
                    //connected block since we're also adopting the left side of its shape

                    //Use coordinates when the zoom level is 1.0 to calculate socket point
                    double unzoomX = connectedRBlock.getSocketPixelPoint(connectedBlock.getPlug()).getX() / connectedRBlock.getZoom();
                    double unzoomY = connectedRBlock.getSocketPixelPoint(connectedBlock.getPlug()).getY() / connectedRBlock.getZoom();
                    Point2D connectedBlockSocketPoint = new Point2D.Double(unzoomX, unzoomY);
                    Point2D currentPoint = gpBottom.getCurrentPoint();
                    double newX = connectedBlockSocketPoint.getX() + Math.abs(connectedBlockSocketPoint.getX() - currentPoint.getX());
                    double newY = connectedBlockSocketPoint.getY() + Math.abs(connectedRBlock.getBlockHeight() / connectedRBlock.getZoom() - currentPoint.getY());
                    rb.updateSocketPoint(curSocket, new Point2D.Double(newX, newY));


                    BlockShape connectedBlockShape = rb.getWorkspace().getEnv().getRenderableBlock(curSocket.getBlockID()).getBlockShape();
                    //append left side of connected block
                    appendPath(gpBottom, connectedBlockShape.getLeftSide(), false);




                    //append right side of connected block (more complicated)
                    if (connectedBlock.getNumSockets() == 0 || connectedBlock.isInfix()) {
//                      append top side of connected block
                        appendPath(gpBottom, connectedBlockShape.getTopSide(), false);
                        appendPath(gpBottom, connectedBlockShape.getRightSide(), false);
                    } else {
                        //iterate through the sockets of the connected block, checking if 
                        //it has blocks connected to them
                        appendRightSidePath(gpBottom, connectedBlock, connectedBlockShape);
                    }

                    // Updates the maximum X-coordinate and sets the current point to maxX 
                    if (maxX < (float) gpBottom.getCurrentPoint().getX()) {
                        maxX = (float) gpBottom.getCurrentPoint().getX();
                    }
                    gpBottom.lineTo(maxX, (float) gpBottom.getCurrentPoint().getY());


                }


                //bump down so bevel doesn't screw up
                BlockShapeUtil.lineToRelative(gpBottom, 0, 0.1f);

                //System.out.println("gpbottom starting point: "+gpBottom.getCurrentPoint());

                //// draw RIGHT to create divider ////
                if (socketCounter < block.getNumSockets() - 1) {
                    gpBottom.lineTo( //need to add the width of the block label.  warning: this assumes that there is only one block label
                            (float) gpBottom.getCurrentPoint().getX() + BOTTOM_SOCKET_MIDDLE_SPACER + rb.accomodateLabelsWidth(),
                            (float) gpBottom.getCurrentPoint().getY());
                } else {
                    gpBottom.lineTo(
                            (float) gpBottom.getCurrentPoint().getX() + BOTTOM_SOCKET_SIDE_SPACER,
                            (float) gpBottom.getCurrentPoint().getY());
                }

                socketCounter++;
            }
        }


        //curve right and up
        BlockShapeUtil.cornerTo(gpBottom, botRightCorner, topRightCorner, blockCornerRadius);

        //end bottom
        setEndPoint(gpBottom, botRightCorner, topRightCorner, false);
    }