def METHOD_NAME(m=None, height="600px", **kwargs):
    from types import SimpleNamespace
    from ipyleaflet import DrawControl, FullScreenControl, Map, WidgetControl
    from ipywidgets.widgets import HTML, Button, Layout
    state = SimpleNamespace(selection=None, bounds=None, done=False)
    btn_done = Button(description="done", layout=Layout(width="5em"))
    btn_done.style.button_color = "green"
    btn_done.disabled = True
    html_info = HTML(layout=Layout(flex="1 0 20em", width="20em", height="3em"))
    def update_info(txt):
        html_info.value = '<pre style="color:grey">' + txt + "</pre>"
    def render_bounds(bounds):
        (lat1, lon1), (lat2, lon2) = bounds
        txt = f"lat: [{lat1:.{4}f}, {lat2:.{4}f}]\nlon: [{lon1:.{4}f}, {lon2:.{4}f}]"
        update_info(txt)
    if m is None:
        m = Map(**kwargs) if len(kwargs) else Map(zoom=2)
        m.scroll_wheel_zoom = True
        m.layout.height = height
    else:
        render_bounds(m.bounds)
    widgets = [
        WidgetControl(widget=btn_done, position="topright"),
        WidgetControl(widget=html_info, position="bottomleft"),
    ]
    for w in widgets:
        m.add(w)
    draw = DrawControl()
    draw.circle = {}
    draw.polyline = {}
    draw.circlemarker = {}
    shape_opts = {"fillColor": "#fca45d", "color": "#000000", "fillOpacity": 0.1}
    draw.rectangle = {"shapeOptions": shape_opts, "metric": ["km", "m"]}
    poly_opts = {"shapeOptions": dict(**shape_opts)}
    poly_opts["shapeOptions"]["original"] = dict(**shape_opts)
    poly_opts["shapeOptions"]["editing"] = dict(**shape_opts)
    draw.polygon = poly_opts
    draw.edit = True
    draw.remove = True
    m.add(draw)
    m.add(FullScreenControl())
    def on_done(btn):
        state.done = True
        btn_done.disabled = True
        m.remove(draw)
        for w in widgets:
            m.remove(w)
    def bounds_handler(event):
        bounds = event["new"]
        render_bounds(bounds)
        (lat1, lon1), (lat2, lon2) = bounds
        state.bounds = dict(lat=(lat1, lat2), lon=(lon1, lon2))
    def on_draw(event):
        v = event["new"]
        action = event["name"]
        if action == "last_draw":
            state.selection = v["geometry"]
        elif action == "last_action" and v == "deleted":
            state.selection = None
        btn_done.disabled = state.selection is None
    draw.observe(on_draw)
    m.observe(bounds_handler, ("bounds",))
    btn_done.on_click(on_done)
    return m, state