def METHOD_NAME(filename, transform_crs=True):
    """
    load up a generic shapefile into a FeatureCollection
    :param filename: string path of a zip file
    :param transform_crs: attempts to read the .prj file if any and convert to EPSG:4326
    :return: geojson.FeatureCollection
    """
    rv = open_shapefile(filename)
    rv = geojson.loads(geojson.dumps(rv.__geo_interface__))
    args = get_shapefile_args(filename)
    pf = None
    with zipfile.ZipFile(filename, 'r') as zsf:
        pf = pyproj.CRS.from_wkt(zsf.open(args['prj'], 'r').readline().decode('utf-8'))
    if not transform_crs:
        if pf.to_epsg() != '4326':
            warnings.warn('shapefile is using epsg:{0} not epsg:4326!'.format(pf.to_epsg()))
    else:
        if pf.to_epsg() != '4326':
            if int(pyproj.__version__[0]) < 2:
                Proj1 = pyproj.Proj(init='epsg:3857')
                Proj2 = pyproj.Proj(init='epsg:4326')
                transformer = functools.partial(
                    pyproj.transform,
                    Proj1,
                    Proj2)
            else:
                transformer = pyproj.Transformer.from_crs(
                    "epsg:{0}".format(pf.to_epsg()),
                    "epsg:4326",
                    always_xy=True
                )
            if hasattr(rv, 'bbox'):
                xx, yy = transformer.transform([rv.bbox[0],rv.bbox[2]],[rv.bbox[1],rv.bbox[3]])
                rv.bbox = [xx[0], yy[0], xx[1], yy[1]]
            for feature in rv.features:
                old_geo = shapely.geometry.shape(feature.geometry)
                #Geometries can be MultiPolygons or Polygons
                #Each needs to be converted to EPSG:4326
                new_geo = shapely.ops.transform(transformer.transform, old_geo)
                feature.geometry = geojson.loads(geojson.dumps(new_geo.__geo_interface__))
        return rv