def endpoint(ctx:str=default) -> PIL.Image.Image: # returns base64 image
ctx = json.loads(ctx)
n = len(ctx); ncols = math.ceil(n**0.5); nrows = math.ceil(n/ncols)
fig, axes = plt.subplots(nrows, ncols, figsize=(ncols*5, nrows*4))
if nrows*ncols == 1: axes = [axes]
if axes | cli.shape() | cli.shape(0) > 1: axes = axes.flatten()
for i, [ax, es] in enumerate(zip(axes, ctx)):
plt.sca(ax)
for e in es:
e0 = e[0] # big switch
if e0 == "plot": ax.plot(e[1], e[2])
elif e0 == "title": ax.set_title(e[1])
elif e0 == "xscale": ax.set_xscale(e[1])
elif e0 == "yscale": ax.set_xscale(e[1])
elif e0 == "xlabel": ax.set_xlabel(e[1])
elif e0 == "ylabel": ax.set_ylabel(e[1])
elif e0 == "grid": ax.grid(e[1])
elif e0 == "legend":
kws = {}
if len(e) >= 2: kws["framealpha"] = e[2]
if e[1]: ax.legend(e[1], **kws)
else: ax.legend(**kws)
axes[i+1:] | cli.op().remove().all() | cli.deref(); plt.tight_layout()
with lock: im = fig | cli.toImg()
return im; #return im | cli.toBytes() | aS(base64.b64encode) | op().decode()