From 658a24c025ea07ae94bdc179eca281bffa9235bc Mon Sep 17 00:00:00 2001 From: murat Date: Mon, 13 Jan 2025 23:59:00 +0300 Subject: [PATCH] clipboard patch --- patches/st-clipboard-0.8.3.diff | 12 + st | Bin 0 -> 105568 bytes st.o | Bin 0 -> 78600 bytes x.c | 1 + x.c.orig | 2108 +++++++++++++++++++++++++++++++ x.o | Bin 0 -> 75600 bytes 6 files changed, 2121 insertions(+) create mode 100644 patches/st-clipboard-0.8.3.diff create mode 100755 st create mode 100644 st.o create mode 100644 x.c.orig create mode 100644 x.o diff --git a/patches/st-clipboard-0.8.3.diff b/patches/st-clipboard-0.8.3.diff new file mode 100644 index 0000000..c1e0e9e --- /dev/null +++ b/patches/st-clipboard-0.8.3.diff @@ -0,0 +1,12 @@ +diff --git a/x.c b/x.c +index e5f1737..5cabd60 100644 +--- a/x.c ++++ b/x.c +@@ -673,6 +673,7 @@ setsel(char *str, Time t) + XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); + if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) + selclear(); ++ clipcopy(NULL); + } + + void diff --git a/st b/st new file mode 100755 index 0000000000000000000000000000000000000000..42af17bd70dc978a0d84c99260cfd178ee3a0eef GIT binary patch literal 105568 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 R{6$wuPWpZ>`p{i!{~v*CM{@uG literal 0 HcmV?d00001 diff --git a/st.o b/st.o new file mode 100644 index 0000000000000000000000000000000000000000..f92b5941daac29b8d650fd586aa51493a2f44a2b GIT binary patch literal 78600 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 K=knhlrvDcMP(GRf literal 0 HcmV?d00001 diff --git a/x.c b/x.c index d73152b..d78e261 100644 --- a/x.c +++ b/x.c @@ -686,6 +686,7 @@ setsel(char *str, Time t) XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) selclear(); + clipcopy(NULL); } void diff --git a/x.c.orig b/x.c.orig new file mode 100644 index 0000000..d73152b --- /dev/null +++ b/x.c.orig @@ -0,0 +1,2108 @@ +/* See LICENSE for license details. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char *argv0; +#include "arg.h" +#include "st.h" +#include "win.h" + +/* types used in config.h */ +typedef struct { + uint mod; + KeySym keysym; + void (*func)(const Arg *); + const Arg arg; +} Shortcut; + +typedef struct { + uint mod; + uint button; + void (*func)(const Arg *); + const Arg arg; + uint release; +} MouseShortcut; + +typedef struct { + KeySym k; + uint mask; + char *s; + /* three-valued logic variables: 0 indifferent, 1 on, -1 off */ + signed char appkey; /* application keypad */ + signed char appcursor; /* application cursor */ +} Key; + +/* X modifiers */ +#define XK_ANY_MOD UINT_MAX +#define XK_NO_MOD 0 +#define XK_SWITCH_MOD (1<<13|1<<14) + +/* function definitions used in config.h */ +static void clipcopy(const Arg *); +static void clippaste(const Arg *); +static void numlock(const Arg *); +static void selpaste(const Arg *); +static void zoom(const Arg *); +static void zoomabs(const Arg *); +static void zoomreset(const Arg *); +static void ttysend(const Arg *); + +/* config.h for applying patches and the configuration. */ +#include "config.h" + +/* XEMBED messages */ +#define XEMBED_FOCUS_IN 4 +#define XEMBED_FOCUS_OUT 5 + +/* macros */ +#define IS_SET(flag) ((win.mode & (flag)) != 0) +#define TRUERED(x) (((x) & 0xff0000) >> 8) +#define TRUEGREEN(x) (((x) & 0xff00)) +#define TRUEBLUE(x) (((x) & 0xff) << 8) + +typedef XftDraw *Draw; +typedef XftColor Color; +typedef XftGlyphFontSpec GlyphFontSpec; + +/* Purely graphic info */ +typedef struct { + int tw, th; /* tty width and height */ + int w, h; /* window width and height */ + int ch; /* char height */ + int cw; /* char width */ + int mode; /* window state/mode flags */ + int cursor; /* cursor style */ +} TermWindow; + +typedef struct { + Display *dpy; + Colormap cmap; + Window win; + Drawable buf; + GlyphFontSpec *specbuf; /* font spec buffer used for rendering */ + Atom xembed, wmdeletewin, netwmname, netwmiconname, netwmpid; + struct { + XIM xim; + XIC xic; + XPoint spot; + XVaNestedList spotlist; + } ime; + Draw draw; + Visual *vis; + XSetWindowAttributes attrs; + int scr; + int isfixed; /* is fixed geometry? */ + int l, t; /* left and top offset */ + int gm; /* geometry mask */ +} XWindow; + +typedef struct { + Atom xtarget; + char *primary, *clipboard; + struct timespec tclick1; + struct timespec tclick2; +} XSelection; + +/* Font structure */ +#define Font Font_ +typedef struct { + int height; + int width; + int ascent; + int descent; + int badslant; + int badweight; + short lbearing; + short rbearing; + XftFont *match; + FcFontSet *set; + FcPattern *pattern; +} Font; + +/* Drawing Context */ +typedef struct { + Color *col; + size_t collen; + Font font, bfont, ifont, ibfont; + GC gc; +} DC; + +static inline ushort sixd_to_16bit(int); +static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int); +static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int); +static void xdrawglyph(Glyph, int, int); +static void xclear(int, int, int, int); +static int xgeommasktogravity(int); +static int ximopen(Display *); +static void ximinstantiate(Display *, XPointer, XPointer); +static void ximdestroy(XIM, XPointer, XPointer); +static int xicdestroy(XIC, XPointer, XPointer); +static void xinit(int, int); +static void cresize(int, int); +static void xresize(int, int); +static void xhints(void); +static int xloadcolor(int, const char *, Color *); +static int xloadfont(Font *, FcPattern *); +static void xloadfonts(const char *, double); +static void xunloadfont(Font *); +static void xunloadfonts(void); +static void xsetenv(void); +static void xseturgency(int); +static int evcol(XEvent *); +static int evrow(XEvent *); + +static void expose(XEvent *); +static void visibility(XEvent *); +static void unmap(XEvent *); +static void kpress(XEvent *); +static void cmessage(XEvent *); +static void resize(XEvent *); +static void focus(XEvent *); +static uint buttonmask(uint); +static int mouseaction(XEvent *, uint); +static void brelease(XEvent *); +static void bpress(XEvent *); +static void bmotion(XEvent *); +static void propnotify(XEvent *); +static void selnotify(XEvent *); +static void selclear_(XEvent *); +static void selrequest(XEvent *); +static void setsel(char *, Time); +static void mousesel(XEvent *, int); +static void mousereport(XEvent *); +static char *kmap(KeySym, uint); +static int match(uint, uint); + +static void run(void); +static void usage(void); + +static void (*handler[LASTEvent])(XEvent *) = { + [KeyPress] = kpress, + [ClientMessage] = cmessage, + [ConfigureNotify] = resize, + [VisibilityNotify] = visibility, + [UnmapNotify] = unmap, + [Expose] = expose, + [FocusIn] = focus, + [FocusOut] = focus, + [MotionNotify] = bmotion, + [ButtonPress] = bpress, + [ButtonRelease] = brelease, +/* + * Uncomment if you want the selection to disappear when you select something + * different in another window. + */ +/* [SelectionClear] = selclear_, */ + [SelectionNotify] = selnotify, +/* + * PropertyNotify is only turned on when there is some INCR transfer happening + * for the selection retrieval. + */ + [PropertyNotify] = propnotify, + [SelectionRequest] = selrequest, +}; + +/* Globals */ +static DC dc; +static XWindow xw; +static XSelection xsel; +static TermWindow win; + +/* Font Ring Cache */ +enum { + FRC_NORMAL, + FRC_ITALIC, + FRC_BOLD, + FRC_ITALICBOLD +}; + +typedef struct { + XftFont *font; + int flags; + Rune unicodep; +} Fontcache; + +/* Fontcache is an array now. A new font will be appended to the array. */ +static Fontcache *frc = NULL; +static int frclen = 0; +static int frccap = 0; +static char *usedfont = NULL; +static double usedfontsize = 0; +static double defaultfontsize = 0; + +static char *opt_class = NULL; +static char **opt_cmd = NULL; +static char *opt_embed = NULL; +static char *opt_font = NULL; +static char *opt_io = NULL; +static char *opt_line = NULL; +static char *opt_name = NULL; +static char *opt_title = NULL; + +static uint buttons; /* bit field of pressed buttons */ + +void +clipcopy(const Arg *dummy) +{ + Atom clipboard; + + free(xsel.clipboard); + xsel.clipboard = NULL; + + if (xsel.primary != NULL) { + xsel.clipboard = xstrdup(xsel.primary); + clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); + XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); + } +} + +void +clippaste(const Arg *dummy) +{ + Atom clipboard; + + clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); + XConvertSelection(xw.dpy, clipboard, xsel.xtarget, clipboard, + xw.win, CurrentTime); +} + +void +selpaste(const Arg *dummy) +{ + XConvertSelection(xw.dpy, XA_PRIMARY, xsel.xtarget, XA_PRIMARY, + xw.win, CurrentTime); +} + +void +numlock(const Arg *dummy) +{ + win.mode ^= MODE_NUMLOCK; +} + +void +zoom(const Arg *arg) +{ + Arg larg; + + larg.f = usedfontsize + arg->f; + zoomabs(&larg); +} + +void +zoomabs(const Arg *arg) +{ + xunloadfonts(); + xloadfonts(usedfont, arg->f); + cresize(0, 0); + redraw(); + xhints(); +} + +void +zoomreset(const Arg *arg) +{ + Arg larg; + + if (defaultfontsize > 0) { + larg.f = defaultfontsize; + zoomabs(&larg); + } +} + +void +ttysend(const Arg *arg) +{ + ttywrite(arg->s, strlen(arg->s), 1); +} + +int +evcol(XEvent *e) +{ + int x = e->xbutton.x - borderpx; + LIMIT(x, 0, win.tw - 1); + return x / win.cw; +} + +int +evrow(XEvent *e) +{ + int y = e->xbutton.y - borderpx; + LIMIT(y, 0, win.th - 1); + return y / win.ch; +} + +void +mousesel(XEvent *e, int done) +{ + int type, seltype = SEL_REGULAR; + uint state = e->xbutton.state & ~(Button1Mask | forcemousemod); + + for (type = 1; type < LEN(selmasks); ++type) { + if (match(selmasks[type], state)) { + seltype = type; + break; + } + } + selextend(evcol(e), evrow(e), seltype, done); + if (done) + setsel(getsel(), e->xbutton.time); +} + +void +mousereport(XEvent *e) +{ + int len, btn, code; + int x = evcol(e), y = evrow(e); + int state = e->xbutton.state; + char buf[40]; + static int ox, oy; + + if (e->type == MotionNotify) { + if (x == ox && y == oy) + return; + if (!IS_SET(MODE_MOUSEMOTION) && !IS_SET(MODE_MOUSEMANY)) + return; + /* MODE_MOUSEMOTION: no reporting if no button is pressed */ + if (IS_SET(MODE_MOUSEMOTION) && buttons == 0) + return; + /* Set btn to lowest-numbered pressed button, or 12 if no + * buttons are pressed. */ + for (btn = 1; btn <= 11 && !(buttons & (1<<(btn-1))); btn++) + ; + code = 32; + } else { + btn = e->xbutton.button; + /* Only buttons 1 through 11 can be encoded */ + if (btn < 1 || btn > 11) + return; + if (e->type == ButtonRelease) { + /* MODE_MOUSEX10: no button release reporting */ + if (IS_SET(MODE_MOUSEX10)) + return; + /* Don't send release events for the scroll wheel */ + if (btn == 4 || btn == 5) + return; + } + code = 0; + } + + ox = x; + oy = y; + + /* Encode btn into code. If no button is pressed for a motion event in + * MODE_MOUSEMANY, then encode it as a release. */ + if ((!IS_SET(MODE_MOUSESGR) && e->type == ButtonRelease) || btn == 12) + code += 3; + else if (btn >= 8) + code += 128 + btn - 8; + else if (btn >= 4) + code += 64 + btn - 4; + else + code += btn - 1; + + if (!IS_SET(MODE_MOUSEX10)) { + code += ((state & ShiftMask ) ? 4 : 0) + + ((state & Mod1Mask ) ? 8 : 0) /* meta key: alt */ + + ((state & ControlMask) ? 16 : 0); + } + + if (IS_SET(MODE_MOUSESGR)) { + len = snprintf(buf, sizeof(buf), "\033[<%d;%d;%d%c", + code, x+1, y+1, + e->type == ButtonRelease ? 'm' : 'M'); + } else if (x < 223 && y < 223) { + len = snprintf(buf, sizeof(buf), "\033[M%c%c%c", + 32+code, 32+x+1, 32+y+1); + } else { + return; + } + + ttywrite(buf, len, 0); +} + +uint +buttonmask(uint button) +{ + return button == Button1 ? Button1Mask + : button == Button2 ? Button2Mask + : button == Button3 ? Button3Mask + : button == Button4 ? Button4Mask + : button == Button5 ? Button5Mask + : 0; +} + +int +mouseaction(XEvent *e, uint release) +{ + MouseShortcut *ms; + + /* ignore Buttonmask for Button - it's set on release */ + uint state = e->xbutton.state & ~buttonmask(e->xbutton.button); + + for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) { + if (ms->release == release && + ms->button == e->xbutton.button && + (match(ms->mod, state) || /* exact or forced */ + match(ms->mod, state & ~forcemousemod))) { + ms->func(&(ms->arg)); + return 1; + } + } + + return 0; +} + +void +bpress(XEvent *e) +{ + int btn = e->xbutton.button; + struct timespec now; + int snap; + + if (1 <= btn && btn <= 11) + buttons |= 1 << (btn-1); + + if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { + mousereport(e); + return; + } + + if (mouseaction(e, 0)) + return; + + if (btn == Button1) { + /* + * If the user clicks below predefined timeouts specific + * snapping behaviour is exposed. + */ + clock_gettime(CLOCK_MONOTONIC, &now); + if (TIMEDIFF(now, xsel.tclick2) <= tripleclicktimeout) { + snap = SNAP_LINE; + } else if (TIMEDIFF(now, xsel.tclick1) <= doubleclicktimeout) { + snap = SNAP_WORD; + } else { + snap = 0; + } + xsel.tclick2 = xsel.tclick1; + xsel.tclick1 = now; + + selstart(evcol(e), evrow(e), snap); + } +} + +void +propnotify(XEvent *e) +{ + XPropertyEvent *xpev; + Atom clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); + + xpev = &e->xproperty; + if (xpev->state == PropertyNewValue && + (xpev->atom == XA_PRIMARY || + xpev->atom == clipboard)) { + selnotify(e); + } +} + +void +selnotify(XEvent *e) +{ + ulong nitems, ofs, rem; + int format; + uchar *data, *last, *repl; + Atom type, incratom, property = None; + + incratom = XInternAtom(xw.dpy, "INCR", 0); + + ofs = 0; + if (e->type == SelectionNotify) + property = e->xselection.property; + else if (e->type == PropertyNotify) + property = e->xproperty.atom; + + if (property == None) + return; + + do { + if (XGetWindowProperty(xw.dpy, xw.win, property, ofs, + BUFSIZ/4, False, AnyPropertyType, + &type, &format, &nitems, &rem, + &data)) { + fprintf(stderr, "Clipboard allocation failed\n"); + return; + } + + if (e->type == PropertyNotify && nitems == 0 && rem == 0) { + /* + * If there is some PropertyNotify with no data, then + * this is the signal of the selection owner that all + * data has been transferred. We won't need to receive + * PropertyNotify events anymore. + */ + MODBIT(xw.attrs.event_mask, 0, PropertyChangeMask); + XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, + &xw.attrs); + } + + if (type == incratom) { + /* + * Activate the PropertyNotify events so we receive + * when the selection owner does send us the next + * chunk of data. + */ + MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask); + XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, + &xw.attrs); + + /* + * Deleting the property is the transfer start signal. + */ + XDeleteProperty(xw.dpy, xw.win, (int)property); + continue; + } + + /* + * As seen in getsel: + * Line endings are inconsistent in the terminal and GUI world + * copy and pasting. When receiving some selection data, + * replace all '\n' with '\r'. + * FIXME: Fix the computer world. + */ + repl = data; + last = data + nitems * format / 8; + while ((repl = memchr(repl, '\n', last - repl))) { + *repl++ = '\r'; + } + + if (IS_SET(MODE_BRCKTPASTE) && ofs == 0) + ttywrite("\033[200~", 6, 0); + ttywrite((char *)data, nitems * format / 8, 1); + if (IS_SET(MODE_BRCKTPASTE) && rem == 0) + ttywrite("\033[201~", 6, 0); + XFree(data); + /* number of 32-bit chunks returned */ + ofs += nitems * format / 32; + } while (rem > 0); + + /* + * Deleting the property again tells the selection owner to send the + * next data chunk in the property. + */ + XDeleteProperty(xw.dpy, xw.win, (int)property); +} + +void +xclipcopy(void) +{ + clipcopy(NULL); +} + +void +selclear_(XEvent *e) +{ + selclear(); +} + +void +selrequest(XEvent *e) +{ + XSelectionRequestEvent *xsre; + XSelectionEvent xev; + Atom xa_targets, string, clipboard; + char *seltext; + + xsre = (XSelectionRequestEvent *) e; + xev.type = SelectionNotify; + xev.requestor = xsre->requestor; + xev.selection = xsre->selection; + xev.target = xsre->target; + xev.time = xsre->time; + if (xsre->property == None) + xsre->property = xsre->target; + + /* reject */ + xev.property = None; + + xa_targets = XInternAtom(xw.dpy, "TARGETS", 0); + if (xsre->target == xa_targets) { + /* respond with the supported type */ + string = xsel.xtarget; + XChangeProperty(xsre->display, xsre->requestor, xsre->property, + XA_ATOM, 32, PropModeReplace, + (uchar *) &string, 1); + xev.property = xsre->property; + } else if (xsre->target == xsel.xtarget || xsre->target == XA_STRING) { + /* + * xith XA_STRING non ascii characters may be incorrect in the + * requestor. It is not our problem, use utf8. + */ + clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); + if (xsre->selection == XA_PRIMARY) { + seltext = xsel.primary; + } else if (xsre->selection == clipboard) { + seltext = xsel.clipboard; + } else { + fprintf(stderr, + "Unhandled clipboard selection 0x%lx\n", + xsre->selection); + return; + } + if (seltext != NULL) { + XChangeProperty(xsre->display, xsre->requestor, + xsre->property, xsre->target, + 8, PropModeReplace, + (uchar *)seltext, strlen(seltext)); + xev.property = xsre->property; + } + } + + /* all done, send a notification to the listener */ + if (!XSendEvent(xsre->display, xsre->requestor, 1, 0, (XEvent *) &xev)) + fprintf(stderr, "Error sending SelectionNotify event\n"); +} + +void +setsel(char *str, Time t) +{ + if (!str) + return; + + free(xsel.primary); + xsel.primary = str; + + XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); + if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) + selclear(); +} + +void +xsetsel(char *str) +{ + setsel(str, CurrentTime); +} + +void +brelease(XEvent *e) +{ + int btn = e->xbutton.button; + + if (1 <= btn && btn <= 11) + buttons &= ~(1 << (btn-1)); + + if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { + mousereport(e); + return; + } + + if (mouseaction(e, 1)) + return; + if (btn == Button1) + mousesel(e, 1); +} + +void +bmotion(XEvent *e) +{ + if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { + mousereport(e); + return; + } + + mousesel(e, 0); +} + +void +cresize(int width, int height) +{ + int col, row; + + if (width != 0) + win.w = width; + if (height != 0) + win.h = height; + + col = (win.w - 2 * borderpx) / win.cw; + row = (win.h - 2 * borderpx) / win.ch; + col = MAX(1, col); + row = MAX(1, row); + + tresize(col, row); + xresize(col, row); + ttyresize(win.tw, win.th); +} + +void +xresize(int col, int row) +{ + win.tw = col * win.cw; + win.th = row * win.ch; + + XFreePixmap(xw.dpy, xw.buf); + xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, + DefaultDepth(xw.dpy, xw.scr)); + XftDrawChange(xw.draw, xw.buf); + xclear(0, 0, win.w, win.h); + + /* resize to new width */ + xw.specbuf = xrealloc(xw.specbuf, col * sizeof(GlyphFontSpec)); +} + +ushort +sixd_to_16bit(int x) +{ + return x == 0 ? 0 : 0x3737 + 0x2828 * x; +} + +int +xloadcolor(int i, const char *name, Color *ncolor) +{ + XRenderColor color = { .alpha = 0xffff }; + + if (!name) { + if (BETWEEN(i, 16, 255)) { /* 256 color */ + if (i < 6*6*6+16) { /* same colors as xterm */ + color.red = sixd_to_16bit( ((i-16)/36)%6 ); + color.green = sixd_to_16bit( ((i-16)/6) %6 ); + color.blue = sixd_to_16bit( ((i-16)/1) %6 ); + } else { /* greyscale */ + color.red = 0x0808 + 0x0a0a * (i - (6*6*6+16)); + color.green = color.blue = color.red; + } + return XftColorAllocValue(xw.dpy, xw.vis, + xw.cmap, &color, ncolor); + } else + name = colorname[i]; + } + + return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor); +} + +void +xloadcols(void) +{ + int i; + static int loaded; + Color *cp; + + if (loaded) { + for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) + XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); + } else { + dc.collen = MAX(LEN(colorname), 256); + dc.col = xmalloc(dc.collen * sizeof(Color)); + } + + for (i = 0; i < dc.collen; i++) + if (!xloadcolor(i, NULL, &dc.col[i])) { + if (colorname[i]) + die("could not allocate color '%s'\n", colorname[i]); + else + die("could not allocate color %d\n", i); + } + loaded = 1; +} + +int +xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b) +{ + if (!BETWEEN(x, 0, dc.collen - 1)) + return 1; + + *r = dc.col[x].color.red >> 8; + *g = dc.col[x].color.green >> 8; + *b = dc.col[x].color.blue >> 8; + + return 0; +} + +int +xsetcolorname(int x, const char *name) +{ + Color ncolor; + + if (!BETWEEN(x, 0, dc.collen - 1)) + return 1; + + if (!xloadcolor(x, name, &ncolor)) + return 1; + + XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]); + dc.col[x] = ncolor; + + return 0; +} + +/* + * Absolute coordinates. + */ +void +xclear(int x1, int y1, int x2, int y2) +{ + XftDrawRect(xw.draw, + &dc.col[IS_SET(MODE_REVERSE)? defaultfg : defaultbg], + x1, y1, x2-x1, y2-y1); +} + +void +xhints(void) +{ + XClassHint class = {opt_name ? opt_name : termname, + opt_class ? opt_class : termname}; + XWMHints wm = {.flags = InputHint, .input = 1}; + XSizeHints *sizeh; + + sizeh = XAllocSizeHints(); + + sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize; + sizeh->height = win.h; + sizeh->width = win.w; + sizeh->height_inc = win.ch; + sizeh->width_inc = win.cw; + sizeh->base_height = 2 * borderpx; + sizeh->base_width = 2 * borderpx; + sizeh->min_height = win.ch + 2 * borderpx; + sizeh->min_width = win.cw + 2 * borderpx; + if (xw.isfixed) { + sizeh->flags |= PMaxSize; + sizeh->min_width = sizeh->max_width = win.w; + sizeh->min_height = sizeh->max_height = win.h; + } + if (xw.gm & (XValue|YValue)) { + sizeh->flags |= USPosition | PWinGravity; + sizeh->x = xw.l; + sizeh->y = xw.t; + sizeh->win_gravity = xgeommasktogravity(xw.gm); + } + + XSetWMProperties(xw.dpy, xw.win, NULL, NULL, NULL, 0, sizeh, &wm, + &class); + XFree(sizeh); +} + +int +xgeommasktogravity(int mask) +{ + switch (mask & (XNegative|YNegative)) { + case 0: + return NorthWestGravity; + case XNegative: + return NorthEastGravity; + case YNegative: + return SouthWestGravity; + } + + return SouthEastGravity; +} + +int +xloadfont(Font *f, FcPattern *pattern) +{ + FcPattern *configured; + FcPattern *match; + FcResult result; + XGlyphInfo extents; + int wantattr, haveattr; + + /* + * Manually configure instead of calling XftMatchFont + * so that we can use the configured pattern for + * "missing glyph" lookups. + */ + configured = FcPatternDuplicate(pattern); + if (!configured) + return 1; + + FcConfigSubstitute(NULL, configured, FcMatchPattern); + XftDefaultSubstitute(xw.dpy, xw.scr, configured); + + match = FcFontMatch(NULL, configured, &result); + if (!match) { + FcPatternDestroy(configured); + return 1; + } + + if (!(f->match = XftFontOpenPattern(xw.dpy, match))) { + FcPatternDestroy(configured); + FcPatternDestroy(match); + return 1; + } + + if ((XftPatternGetInteger(pattern, "slant", 0, &wantattr) == + XftResultMatch)) { + /* + * Check if xft was unable to find a font with the appropriate + * slant but gave us one anyway. Try to mitigate. + */ + if ((XftPatternGetInteger(f->match->pattern, "slant", 0, + &haveattr) != XftResultMatch) || haveattr < wantattr) { + f->badslant = 1; + fputs("font slant does not match\n", stderr); + } + } + + if ((XftPatternGetInteger(pattern, "weight", 0, &wantattr) == + XftResultMatch)) { + if ((XftPatternGetInteger(f->match->pattern, "weight", 0, + &haveattr) != XftResultMatch) || haveattr != wantattr) { + f->badweight = 1; + fputs("font weight does not match\n", stderr); + } + } + + XftTextExtentsUtf8(xw.dpy, f->match, + (const FcChar8 *) ascii_printable, + strlen(ascii_printable), &extents); + + f->set = NULL; + f->pattern = configured; + + f->ascent = f->match->ascent; + f->descent = f->match->descent; + f->lbearing = 0; + f->rbearing = f->match->max_advance_width; + + f->height = f->ascent + f->descent; + f->width = DIVCEIL(extents.xOff, strlen(ascii_printable)); + + return 0; +} + +void +xloadfonts(const char *fontstr, double fontsize) +{ + FcPattern *pattern; + double fontval; + + if (fontstr[0] == '-') + pattern = XftXlfdParse(fontstr, False, False); + else + pattern = FcNameParse((const FcChar8 *)fontstr); + + if (!pattern) + die("can't open font %s\n", fontstr); + + if (fontsize > 1) { + FcPatternDel(pattern, FC_PIXEL_SIZE); + FcPatternDel(pattern, FC_SIZE); + FcPatternAddDouble(pattern, FC_PIXEL_SIZE, (double)fontsize); + usedfontsize = fontsize; + } else { + if (FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == + FcResultMatch) { + usedfontsize = fontval; + } else if (FcPatternGetDouble(pattern, FC_SIZE, 0, &fontval) == + FcResultMatch) { + usedfontsize = -1; + } else { + /* + * Default font size is 12, if none given. This is to + * have a known usedfontsize value. + */ + FcPatternAddDouble(pattern, FC_PIXEL_SIZE, 12); + usedfontsize = 12; + } + defaultfontsize = usedfontsize; + } + + if (xloadfont(&dc.font, pattern)) + die("can't open font %s\n", fontstr); + + if (usedfontsize < 0) { + FcPatternGetDouble(dc.font.match->pattern, + FC_PIXEL_SIZE, 0, &fontval); + usedfontsize = fontval; + if (fontsize == 0) + defaultfontsize = fontval; + } + + /* Setting character width and height. */ + win.cw = ceilf(dc.font.width * cwscale); + win.ch = ceilf(dc.font.height * chscale); + + FcPatternDel(pattern, FC_SLANT); + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); + if (xloadfont(&dc.ifont, pattern)) + die("can't open font %s\n", fontstr); + + FcPatternDel(pattern, FC_WEIGHT); + FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); + if (xloadfont(&dc.ibfont, pattern)) + die("can't open font %s\n", fontstr); + + FcPatternDel(pattern, FC_SLANT); + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); + if (xloadfont(&dc.bfont, pattern)) + die("can't open font %s\n", fontstr); + + FcPatternDestroy(pattern); +} + +void +xunloadfont(Font *f) +{ + XftFontClose(xw.dpy, f->match); + FcPatternDestroy(f->pattern); + if (f->set) + FcFontSetDestroy(f->set); +} + +void +xunloadfonts(void) +{ + /* Free the loaded fonts in the font cache. */ + while (frclen > 0) + XftFontClose(xw.dpy, frc[--frclen].font); + + xunloadfont(&dc.font); + xunloadfont(&dc.bfont); + xunloadfont(&dc.ifont); + xunloadfont(&dc.ibfont); +} + +int +ximopen(Display *dpy) +{ + XIMCallback imdestroy = { .client_data = NULL, .callback = ximdestroy }; + XICCallback icdestroy = { .client_data = NULL, .callback = xicdestroy }; + + xw.ime.xim = XOpenIM(xw.dpy, NULL, NULL, NULL); + if (xw.ime.xim == NULL) + return 0; + + if (XSetIMValues(xw.ime.xim, XNDestroyCallback, &imdestroy, NULL)) + fprintf(stderr, "XSetIMValues: " + "Could not set XNDestroyCallback.\n"); + + xw.ime.spotlist = XVaCreateNestedList(0, XNSpotLocation, &xw.ime.spot, + NULL); + + if (xw.ime.xic == NULL) { + xw.ime.xic = XCreateIC(xw.ime.xim, XNInputStyle, + XIMPreeditNothing | XIMStatusNothing, + XNClientWindow, xw.win, + XNDestroyCallback, &icdestroy, + NULL); + } + if (xw.ime.xic == NULL) + fprintf(stderr, "XCreateIC: Could not create input context.\n"); + + return 1; +} + +void +ximinstantiate(Display *dpy, XPointer client, XPointer call) +{ + if (ximopen(dpy)) + XUnregisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, + ximinstantiate, NULL); +} + +void +ximdestroy(XIM xim, XPointer client, XPointer call) +{ + xw.ime.xim = NULL; + XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, + ximinstantiate, NULL); + XFree(xw.ime.spotlist); +} + +int +xicdestroy(XIC xim, XPointer client, XPointer call) +{ + xw.ime.xic = NULL; + return 1; +} + +void +xinit(int cols, int rows) +{ + XGCValues gcvalues; + Cursor cursor; + Window parent, root; + pid_t thispid = getpid(); + XColor xmousefg, xmousebg; + + if (!(xw.dpy = XOpenDisplay(NULL))) + die("can't open display\n"); + xw.scr = XDefaultScreen(xw.dpy); + xw.vis = XDefaultVisual(xw.dpy, xw.scr); + + /* font */ + if (!FcInit()) + die("could not init fontconfig.\n"); + + usedfont = (opt_font == NULL)? font : opt_font; + xloadfonts(usedfont, 0); + + /* colors */ + xw.cmap = XDefaultColormap(xw.dpy, xw.scr); + xloadcols(); + + /* adjust fixed window geometry */ + win.w = 2 * borderpx + cols * win.cw; + win.h = 2 * borderpx + rows * win.ch; + if (xw.gm & XNegative) + xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2; + if (xw.gm & YNegative) + xw.t += DisplayHeight(xw.dpy, xw.scr) - win.h - 2; + + /* Events */ + xw.attrs.background_pixel = dc.col[defaultbg].pixel; + xw.attrs.border_pixel = dc.col[defaultbg].pixel; + xw.attrs.bit_gravity = NorthWestGravity; + xw.attrs.event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask + | ExposureMask | VisibilityChangeMask | StructureNotifyMask + | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; + xw.attrs.colormap = xw.cmap; + + root = XRootWindow(xw.dpy, xw.scr); + if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) + parent = root; + xw.win = XCreateWindow(xw.dpy, root, xw.l, xw.t, + win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, + xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity + | CWEventMask | CWColormap, &xw.attrs); + if (parent != root) + XReparentWindow(xw.dpy, xw.win, parent, xw.l, xw.t); + + memset(&gcvalues, 0, sizeof(gcvalues)); + gcvalues.graphics_exposures = False; + dc.gc = XCreateGC(xw.dpy, xw.win, GCGraphicsExposures, + &gcvalues); + xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, + DefaultDepth(xw.dpy, xw.scr)); + XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); + XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); + + /* font spec buffer */ + xw.specbuf = xmalloc(cols * sizeof(GlyphFontSpec)); + + /* Xft rendering context */ + xw.draw = XftDrawCreate(xw.dpy, xw.buf, xw.vis, xw.cmap); + + /* input methods */ + if (!ximopen(xw.dpy)) { + XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, + ximinstantiate, NULL); + } + + /* white cursor, black outline */ + cursor = XCreateFontCursor(xw.dpy, mouseshape); + XDefineCursor(xw.dpy, xw.win, cursor); + + if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) { + xmousefg.red = 0xffff; + xmousefg.green = 0xffff; + xmousefg.blue = 0xffff; + } + + if (XParseColor(xw.dpy, xw.cmap, colorname[mousebg], &xmousebg) == 0) { + xmousebg.red = 0x0000; + xmousebg.green = 0x0000; + xmousebg.blue = 0x0000; + } + + XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg); + + xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); + xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); + xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False); + xw.netwmiconname = XInternAtom(xw.dpy, "_NET_WM_ICON_NAME", False); + XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1); + + xw.netwmpid = XInternAtom(xw.dpy, "_NET_WM_PID", False); + XChangeProperty(xw.dpy, xw.win, xw.netwmpid, XA_CARDINAL, 32, + PropModeReplace, (uchar *)&thispid, 1); + + win.mode = MODE_NUMLOCK; + resettitle(); + xhints(); + XMapWindow(xw.dpy, xw.win); + XSync(xw.dpy, False); + + clock_gettime(CLOCK_MONOTONIC, &xsel.tclick1); + clock_gettime(CLOCK_MONOTONIC, &xsel.tclick2); + xsel.primary = NULL; + xsel.clipboard = NULL; + xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0); + if (xsel.xtarget == None) + xsel.xtarget = XA_STRING; +} + +int +xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) +{ + float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp; + ushort mode, prevmode = USHRT_MAX; + Font *font = &dc.font; + int frcflags = FRC_NORMAL; + float runewidth = win.cw; + Rune rune; + FT_UInt glyphidx; + FcResult fcres; + FcPattern *fcpattern, *fontpattern; + FcFontSet *fcsets[] = { NULL }; + FcCharSet *fccharset; + int i, f, numspecs = 0; + + for (i = 0, xp = winx, yp = winy + font->ascent; i < len; ++i) { + /* Fetch rune and mode for current glyph. */ + rune = glyphs[i].u; + mode = glyphs[i].mode; + + /* Skip dummy wide-character spacing. */ + if (mode == ATTR_WDUMMY) + continue; + + /* Determine font for glyph if different from previous glyph. */ + if (prevmode != mode) { + prevmode = mode; + font = &dc.font; + frcflags = FRC_NORMAL; + runewidth = win.cw * ((mode & ATTR_WIDE) ? 2.0f : 1.0f); + if ((mode & ATTR_ITALIC) && (mode & ATTR_BOLD)) { + font = &dc.ibfont; + frcflags = FRC_ITALICBOLD; + } else if (mode & ATTR_ITALIC) { + font = &dc.ifont; + frcflags = FRC_ITALIC; + } else if (mode & ATTR_BOLD) { + font = &dc.bfont; + frcflags = FRC_BOLD; + } + yp = winy + font->ascent; + } + + /* Lookup character index with default font. */ + glyphidx = XftCharIndex(xw.dpy, font->match, rune); + if (glyphidx) { + specs[numspecs].font = font->match; + specs[numspecs].glyph = glyphidx; + specs[numspecs].x = (short)xp; + specs[numspecs].y = (short)yp; + xp += runewidth; + numspecs++; + continue; + } + + /* Fallback on font cache, search the font cache for match. */ + for (f = 0; f < frclen; f++) { + glyphidx = XftCharIndex(xw.dpy, frc[f].font, rune); + /* Everything correct. */ + if (glyphidx && frc[f].flags == frcflags) + break; + /* We got a default font for a not found glyph. */ + if (!glyphidx && frc[f].flags == frcflags + && frc[f].unicodep == rune) { + break; + } + } + + /* Nothing was found. Use fontconfig to find matching font. */ + if (f >= frclen) { + if (!font->set) + font->set = FcFontSort(0, font->pattern, + 1, 0, &fcres); + fcsets[0] = font->set; + + /* + * Nothing was found in the cache. Now use + * some dozen of Fontconfig calls to get the + * font for one single character. + * + * Xft and fontconfig are design failures. + */ + fcpattern = FcPatternDuplicate(font->pattern); + fccharset = FcCharSetCreate(); + + FcCharSetAddChar(fccharset, rune); + FcPatternAddCharSet(fcpattern, FC_CHARSET, + fccharset); + FcPatternAddBool(fcpattern, FC_SCALABLE, 1); + + FcConfigSubstitute(0, fcpattern, + FcMatchPattern); + FcDefaultSubstitute(fcpattern); + + fontpattern = FcFontSetMatch(0, fcsets, 1, + fcpattern, &fcres); + + /* Allocate memory for the new cache entry. */ + if (frclen >= frccap) { + frccap += 16; + frc = xrealloc(frc, frccap * sizeof(Fontcache)); + } + + frc[frclen].font = XftFontOpenPattern(xw.dpy, + fontpattern); + if (!frc[frclen].font) + die("XftFontOpenPattern failed seeking fallback font: %s\n", + strerror(errno)); + frc[frclen].flags = frcflags; + frc[frclen].unicodep = rune; + + glyphidx = XftCharIndex(xw.dpy, frc[frclen].font, rune); + + f = frclen; + frclen++; + + FcPatternDestroy(fcpattern); + FcCharSetDestroy(fccharset); + } + + specs[numspecs].font = frc[f].font; + specs[numspecs].glyph = glyphidx; + specs[numspecs].x = (short)xp; + specs[numspecs].y = (short)yp; + xp += runewidth; + numspecs++; + } + + return numspecs; +} + +void +xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) +{ + int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); + int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, + width = charlen * win.cw; + Color *fg, *bg, *temp, revfg, revbg, truefg, truebg; + XRenderColor colfg, colbg; + XRectangle r; + + /* Fallback on color display for attributes not supported by the font */ + if (base.mode & ATTR_ITALIC && base.mode & ATTR_BOLD) { + if (dc.ibfont.badslant || dc.ibfont.badweight) + base.fg = defaultattr; + } else if ((base.mode & ATTR_ITALIC && dc.ifont.badslant) || + (base.mode & ATTR_BOLD && dc.bfont.badweight)) { + base.fg = defaultattr; + } + + if (IS_TRUECOL(base.fg)) { + colfg.alpha = 0xffff; + colfg.red = TRUERED(base.fg); + colfg.green = TRUEGREEN(base.fg); + colfg.blue = TRUEBLUE(base.fg); + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &truefg); + fg = &truefg; + } else { + fg = &dc.col[base.fg]; + } + + if (IS_TRUECOL(base.bg)) { + colbg.alpha = 0xffff; + colbg.green = TRUEGREEN(base.bg); + colbg.red = TRUERED(base.bg); + colbg.blue = TRUEBLUE(base.bg); + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &truebg); + bg = &truebg; + } else { + bg = &dc.col[base.bg]; + } + + /* Change basic system colors [0-7] to bright system colors [8-15] */ + if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7)) + fg = &dc.col[base.fg + 8]; + + if (IS_SET(MODE_REVERSE)) { + if (fg == &dc.col[defaultfg]) { + fg = &dc.col[defaultbg]; + } else { + colfg.red = ~fg->color.red; + colfg.green = ~fg->color.green; + colfg.blue = ~fg->color.blue; + colfg.alpha = fg->color.alpha; + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, + &revfg); + fg = &revfg; + } + + if (bg == &dc.col[defaultbg]) { + bg = &dc.col[defaultfg]; + } else { + colbg.red = ~bg->color.red; + colbg.green = ~bg->color.green; + colbg.blue = ~bg->color.blue; + colbg.alpha = bg->color.alpha; + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, + &revbg); + bg = &revbg; + } + } + + if ((base.mode & ATTR_BOLD_FAINT) == ATTR_FAINT) { + colfg.red = fg->color.red / 2; + colfg.green = fg->color.green / 2; + colfg.blue = fg->color.blue / 2; + colfg.alpha = fg->color.alpha; + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &revfg); + fg = &revfg; + } + + if (base.mode & ATTR_REVERSE) { + temp = fg; + fg = bg; + bg = temp; + } + + if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK) + fg = bg; + + if (base.mode & ATTR_INVISIBLE) + fg = bg; + + /* Intelligent cleaning up of the borders. */ + if (x == 0) { + xclear(0, (y == 0)? 0 : winy, borderpx, + winy + win.ch + + ((winy + win.ch >= borderpx + win.th)? win.h : 0)); + } + if (winx + width >= borderpx + win.tw) { + xclear(winx + width, (y == 0)? 0 : winy, win.w, + ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); + } + if (y == 0) + xclear(winx, 0, winx + width, borderpx); + if (winy + win.ch >= borderpx + win.th) + xclear(winx, winy + win.ch, winx + width, win.h); + + /* Clean up the region we want to draw to. */ + XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); + + /* Set the clip region because Xft is sometimes dirty. */ + r.x = 0; + r.y = 0; + r.height = win.ch; + r.width = width; + XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); + + /* Render the glyphs. */ + XftDrawGlyphFontSpec(xw.draw, fg, specs, len); + + /* Render underline and strikethrough. */ + if (base.mode & ATTR_UNDERLINE) { + XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent * chscale + 1, + width, 1); + } + + if (base.mode & ATTR_STRUCK) { + XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chscale / 3, + width, 1); + } + + /* Reset clip to none. */ + XftDrawSetClip(xw.draw, 0); +} + +void +xdrawglyph(Glyph g, int x, int y) +{ + int numspecs; + XftGlyphFontSpec spec; + + numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y); + xdrawglyphfontspecs(&spec, g, numspecs, x, y); +} + +void +xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) +{ + Color drawcol; + + /* remove the old cursor */ + if (selected(ox, oy)) + og.mode ^= ATTR_REVERSE; + xdrawglyph(og, ox, oy); + + if (IS_SET(MODE_HIDE)) + return; + + /* + * Select the right color for the right mode. + */ + g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE; + + if (IS_SET(MODE_REVERSE)) { + g.mode |= ATTR_REVERSE; + g.bg = defaultfg; + if (selected(cx, cy)) { + drawcol = dc.col[defaultcs]; + g.fg = defaultrcs; + } else { + drawcol = dc.col[defaultrcs]; + g.fg = defaultcs; + } + } else { + if (selected(cx, cy)) { + g.fg = defaultfg; + g.bg = defaultrcs; + } else { + g.fg = defaultbg; + g.bg = defaultcs; + } + drawcol = dc.col[g.bg]; + } + + /* draw the new one */ + if (IS_SET(MODE_FOCUSED)) { + switch (win.cursor) { + case 7: /* st extension */ + g.u = 0x2603; /* snowman (U+2603) */ + /* FALLTHROUGH */ + case 0: /* Blinking Block */ + case 1: /* Blinking Block (Default) */ + case 2: /* Steady Block */ + xdrawglyph(g, cx, cy); + break; + case 3: /* Blinking Underline */ + case 4: /* Steady Underline */ + XftDrawRect(xw.draw, &drawcol, + borderpx + cx * win.cw, + borderpx + (cy + 1) * win.ch - \ + cursorthickness, + win.cw, cursorthickness); + break; + case 5: /* Blinking bar */ + case 6: /* Steady bar */ + XftDrawRect(xw.draw, &drawcol, + borderpx + cx * win.cw, + borderpx + cy * win.ch, + cursorthickness, win.ch); + break; + } + } else { + XftDrawRect(xw.draw, &drawcol, + borderpx + cx * win.cw, + borderpx + cy * win.ch, + win.cw - 1, 1); + XftDrawRect(xw.draw, &drawcol, + borderpx + cx * win.cw, + borderpx + cy * win.ch, + 1, win.ch - 1); + XftDrawRect(xw.draw, &drawcol, + borderpx + (cx + 1) * win.cw - 1, + borderpx + cy * win.ch, + 1, win.ch - 1); + XftDrawRect(xw.draw, &drawcol, + borderpx + cx * win.cw, + borderpx + (cy + 1) * win.ch - 1, + win.cw, 1); + } +} + +void +xsetenv(void) +{ + char buf[sizeof(long) * 8 + 1]; + + snprintf(buf, sizeof(buf), "%lu", xw.win); + setenv("WINDOWID", buf, 1); +} + +void +xseticontitle(char *p) +{ + XTextProperty prop; + DEFAULT(p, opt_title); + + if (p[0] == '\0') + p = opt_title; + + if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, + &prop) != Success) + return; + XSetWMIconName(xw.dpy, xw.win, &prop); + XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmiconname); + XFree(prop.value); +} + +void +xsettitle(char *p) +{ + XTextProperty prop; + DEFAULT(p, opt_title); + + if (p[0] == '\0') + p = opt_title; + + if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, + &prop) != Success) + return; + XSetWMName(xw.dpy, xw.win, &prop); + XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname); + XFree(prop.value); +} + +int +xstartdraw(void) +{ + return IS_SET(MODE_VISIBLE); +} + +void +xdrawline(Line line, int x1, int y1, int x2) +{ + int i, x, ox, numspecs; + Glyph base, new; + XftGlyphFontSpec *specs = xw.specbuf; + + numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1); + i = ox = 0; + for (x = x1; x < x2 && i < numspecs; x++) { + new = line[x]; + if (new.mode == ATTR_WDUMMY) + continue; + if (selected(x, y1)) + new.mode ^= ATTR_REVERSE; + if (i > 0 && ATTRCMP(base, new)) { + xdrawglyphfontspecs(specs, base, i, ox, y1); + specs += i; + numspecs -= i; + i = 0; + } + if (i == 0) { + ox = x; + base = new; + } + i++; + } + if (i > 0) + xdrawglyphfontspecs(specs, base, i, ox, y1); +} + +void +xfinishdraw(void) +{ + XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w, + win.h, 0, 0); + XSetForeground(xw.dpy, dc.gc, + dc.col[IS_SET(MODE_REVERSE)? + defaultfg : defaultbg].pixel); +} + +void +xximspot(int x, int y) +{ + if (xw.ime.xic == NULL) + return; + + xw.ime.spot.x = borderpx + x * win.cw; + xw.ime.spot.y = borderpx + (y + 1) * win.ch; + + XSetICValues(xw.ime.xic, XNPreeditAttributes, xw.ime.spotlist, NULL); +} + +void +expose(XEvent *ev) +{ + redraw(); +} + +void +visibility(XEvent *ev) +{ + XVisibilityEvent *e = &ev->xvisibility; + + MODBIT(win.mode, e->state != VisibilityFullyObscured, MODE_VISIBLE); +} + +void +unmap(XEvent *ev) +{ + win.mode &= ~MODE_VISIBLE; +} + +void +xsetpointermotion(int set) +{ + MODBIT(xw.attrs.event_mask, set, PointerMotionMask); + XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); +} + +void +xsetmode(int set, unsigned int flags) +{ + int mode = win.mode; + MODBIT(win.mode, set, flags); + if ((win.mode & MODE_REVERSE) != (mode & MODE_REVERSE)) + redraw(); +} + +int +xsetcursor(int cursor) +{ + if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */ + return 1; + win.cursor = cursor; + return 0; +} + +void +xseturgency(int add) +{ + XWMHints *h = XGetWMHints(xw.dpy, xw.win); + + MODBIT(h->flags, add, XUrgencyHint); + XSetWMHints(xw.dpy, xw.win, h); + XFree(h); +} + +void +xbell(void) +{ + if (!(IS_SET(MODE_FOCUSED))) + xseturgency(1); + if (bellvolume) + XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL); +} + +void +focus(XEvent *ev) +{ + XFocusChangeEvent *e = &ev->xfocus; + + if (e->mode == NotifyGrab) + return; + + if (ev->type == FocusIn) { + if (xw.ime.xic) + XSetICFocus(xw.ime.xic); + win.mode |= MODE_FOCUSED; + xseturgency(0); + if (IS_SET(MODE_FOCUS)) + ttywrite("\033[I", 3, 0); + } else { + if (xw.ime.xic) + XUnsetICFocus(xw.ime.xic); + win.mode &= ~MODE_FOCUSED; + if (IS_SET(MODE_FOCUS)) + ttywrite("\033[O", 3, 0); + } +} + +int +match(uint mask, uint state) +{ + return mask == XK_ANY_MOD || mask == (state & ~ignoremod); +} + +char* +kmap(KeySym k, uint state) +{ + Key *kp; + int i; + + /* Check for mapped keys out of X11 function keys. */ + for (i = 0; i < LEN(mappedkeys); i++) { + if (mappedkeys[i] == k) + break; + } + if (i == LEN(mappedkeys)) { + if ((k & 0xFFFF) < 0xFD00) + return NULL; + } + + for (kp = key; kp < key + LEN(key); kp++) { + if (kp->k != k) + continue; + + if (!match(kp->mask, state)) + continue; + + if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0) + continue; + if (IS_SET(MODE_NUMLOCK) && kp->appkey == 2) + continue; + + if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0) + continue; + + return kp->s; + } + + return NULL; +} + +void +kpress(XEvent *ev) +{ + XKeyEvent *e = &ev->xkey; + KeySym ksym = NoSymbol; + char buf[64], *customkey; + int len; + Rune c; + Status status; + Shortcut *bp; + + if (IS_SET(MODE_KBDLOCK)) + return; + + if (xw.ime.xic) { + len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); + if (status == XBufferOverflow) + return; + } else { + len = XLookupString(e, buf, sizeof buf, &ksym, NULL); + } + /* 1. shortcuts */ + for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { + if (ksym == bp->keysym && match(bp->mod, e->state)) { + bp->func(&(bp->arg)); + return; + } + } + + /* 2. custom keys from config.h */ + if ((customkey = kmap(ksym, e->state))) { + ttywrite(customkey, strlen(customkey), 1); + return; + } + + /* 3. composed string from input method */ + if (len == 0) + return; + if (len == 1 && e->state & Mod1Mask) { + if (IS_SET(MODE_8BIT)) { + if (*buf < 0177) { + c = *buf | 0x80; + len = utf8encode(c, buf); + } + } else { + buf[1] = buf[0]; + buf[0] = '\033'; + len = 2; + } + } + ttywrite(buf, len, 1); +} + +void +cmessage(XEvent *e) +{ + /* + * See xembed specs + * http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html + */ + if (e->xclient.message_type == xw.xembed && e->xclient.format == 32) { + if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) { + win.mode |= MODE_FOCUSED; + xseturgency(0); + } else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { + win.mode &= ~MODE_FOCUSED; + } + } else if (e->xclient.data.l[0] == xw.wmdeletewin) { + ttyhangup(); + exit(0); + } +} + +void +resize(XEvent *e) +{ + if (e->xconfigure.width == win.w && e->xconfigure.height == win.h) + return; + + cresize(e->xconfigure.width, e->xconfigure.height); +} + +void +run(void) +{ + XEvent ev; + int w = win.w, h = win.h; + fd_set rfd; + int xfd = XConnectionNumber(xw.dpy), ttyfd, xev, drawing; + struct timespec seltv, *tv, now, lastblink, trigger; + double timeout; + + /* Waiting for window mapping */ + do { + XNextEvent(xw.dpy, &ev); + /* + * This XFilterEvent call is required because of XOpenIM. It + * does filter out the key event and some client message for + * the input method too. + */ + if (XFilterEvent(&ev, None)) + continue; + if (ev.type == ConfigureNotify) { + w = ev.xconfigure.width; + h = ev.xconfigure.height; + } + } while (ev.type != MapNotify); + + ttyfd = ttynew(opt_line, shell, opt_io, opt_cmd); + cresize(w, h); + + for (timeout = -1, drawing = 0, lastblink = (struct timespec){0};;) { + FD_ZERO(&rfd); + FD_SET(ttyfd, &rfd); + FD_SET(xfd, &rfd); + + if (XPending(xw.dpy)) + timeout = 0; /* existing events might not set xfd */ + + seltv.tv_sec = timeout / 1E3; + seltv.tv_nsec = 1E6 * (timeout - 1E3 * seltv.tv_sec); + tv = timeout >= 0 ? &seltv : NULL; + + if (pselect(MAX(xfd, ttyfd)+1, &rfd, NULL, NULL, tv, NULL) < 0) { + if (errno == EINTR) + continue; + die("select failed: %s\n", strerror(errno)); + } + clock_gettime(CLOCK_MONOTONIC, &now); + + if (FD_ISSET(ttyfd, &rfd)) + ttyread(); + + xev = 0; + while (XPending(xw.dpy)) { + xev = 1; + XNextEvent(xw.dpy, &ev); + if (XFilterEvent(&ev, None)) + continue; + if (handler[ev.type]) + (handler[ev.type])(&ev); + } + + /* + * To reduce flicker and tearing, when new content or event + * triggers drawing, we first wait a bit to ensure we got + * everything, and if nothing new arrives - we draw. + * We start with trying to wait minlatency ms. If more content + * arrives sooner, we retry with shorter and shorter periods, + * and eventually draw even without idle after maxlatency ms. + * Typically this results in low latency while interacting, + * maximum latency intervals during `cat huge.txt`, and perfect + * sync with periodic updates from animations/key-repeats/etc. + */ + if (FD_ISSET(ttyfd, &rfd) || xev) { + if (!drawing) { + trigger = now; + drawing = 1; + } + timeout = (maxlatency - TIMEDIFF(now, trigger)) \ + / maxlatency * minlatency; + if (timeout > 0) + continue; /* we have time, try to find idle */ + } + + /* idle detected or maxlatency exhausted -> draw */ + timeout = -1; + if (blinktimeout && tattrset(ATTR_BLINK)) { + timeout = blinktimeout - TIMEDIFF(now, lastblink); + if (timeout <= 0) { + if (-timeout > blinktimeout) /* start visible */ + win.mode |= MODE_BLINK; + win.mode ^= MODE_BLINK; + tsetdirtattr(ATTR_BLINK); + lastblink = now; + timeout = blinktimeout; + } + } + + draw(); + XFlush(xw.dpy); + drawing = 0; + } +} + +void +usage(void) +{ + die("usage: %s [-aiv] [-c class] [-f font] [-g geometry]" + " [-n name] [-o file]\n" + " [-T title] [-t title] [-w windowid]" + " [[-e] command [args ...]]\n" + " %s [-aiv] [-c class] [-f font] [-g geometry]" + " [-n name] [-o file]\n" + " [-T title] [-t title] [-w windowid] -l line" + " [stty_args ...]\n", argv0, argv0); +} + +int +main(int argc, char *argv[]) +{ + xw.l = xw.t = 0; + xw.isfixed = False; + xsetcursor(cursorshape); + + ARGBEGIN { + case 'a': + allowaltscreen = 0; + break; + case 'c': + opt_class = EARGF(usage()); + break; + case 'e': + if (argc > 0) + --argc, ++argv; + goto run; + case 'f': + opt_font = EARGF(usage()); + break; + case 'g': + xw.gm = XParseGeometry(EARGF(usage()), + &xw.l, &xw.t, &cols, &rows); + break; + case 'i': + xw.isfixed = 1; + break; + case 'o': + opt_io = EARGF(usage()); + break; + case 'l': + opt_line = EARGF(usage()); + break; + case 'n': + opt_name = EARGF(usage()); + break; + case 't': + case 'T': + opt_title = EARGF(usage()); + break; + case 'w': + opt_embed = EARGF(usage()); + break; + case 'v': + die("%s " VERSION "\n", argv0); + break; + default: + usage(); + } ARGEND; + +run: + if (argc > 0) /* eat all remaining arguments */ + opt_cmd = argv; + + if (!opt_title) + opt_title = (opt_line || !opt_cmd) ? "st" : opt_cmd[0]; + + setlocale(LC_CTYPE, ""); + XSetLocaleModifiers(""); + cols = MAX(cols, 1); + rows = MAX(rows, 1); + tnew(cols, rows); + xinit(cols, rows); + xsetenv(); + selinit(); + run(); + + return 0; +} diff --git a/x.o b/x.o new file mode 100644 index 0000000000000000000000000000000000000000..cc59704d1f2b921388854e7428863062dbfcb479 GIT binary patch literal 75600 zcmeIb33wLO_4q$ozyL9CP}HcXuNpNdOMrlhqUI$pFwp=hi$+BuWPwOX(&P;UL4>|Z zWg4TjwXOE+f|j4PRV!^>a8KA>YU5UM$2}paxB;&DpL6dy$;lyO+VAuK|DWggJRP0P z%;%na?z!i#b7z?M>PdN%V`E|*-eR0{o$f29j?)_Krr8E(JI6RjJFCZ8nOJ9Y{_xY=Iyoysy-Joy&Sk@A}EUWaiH4V;kexY5nQysVDMIa!NRYCjL3T@zos zC){{;*!wW-b+%3I?Cfl4u00GcqaXf&#;|ST$3rX9#Oq*51SxcbUlI~(aor++#!Y>L8WEQX=zOx&O8$=^)gc3qE|qTjk7!G9r#}=iloN6McZZS-?V&l!m!q+A=xo6 zn8NlB3~S}o*VxqaQsZ6k9e*FSzw$$8=jua9qP$3L+h zPf!6tBReqcvyk`Hux~!-UhzKjHo4vpvdUm}*xW7D@oJCu zyU>NCg08n03O<7hK9X86dY>)Uz9YBDsFRMeB=X6*>nm&Rc;O-yyY9f60+;!9V5@5D!5Db0Erf*>>Gfg>=h zkd*OM>He)wYy?v#$6efN^BH;)ltIsDnw7VE{|oyz^$XMw05zc}u{)UBv}8y2zOC_r zhOeLsg`R{ym03)n;T^*O8P@&+Tt13dQPb?5z;)~3BF~GYrj>f-sp%cZ-d)K9Y*?ZfNN6>AWVWwU0E!%C{3oGq5MN;$gn!>4h zuJ@{m+ARagSzlxsj|7@hK($+Bd+nC@;@voNn&*8etDx(}xkV;|+p-H}>}fO;vWO$z z!C_&qE+OnKOmrI|V?Am!xXc>hZH_k6;O#=yw%))q>m;a|P}`rkwLOfreUrD-y-}v$ z2-%Mfd-JghmYd4I^`OdMZYn>7ViAE#Z+H6--*t9EGfOufGQHnHKAN1?J_+hwv^m+1 zm2S~qx8*~qMy3u@AsQ#NH-nr3jhV!^9W+9>yQpI9w(|54TW^ z=0=g|=C;7^52P80C65q^<#>(a<}60)4_)E>yCXj^O@n zIAsY1ezSE_;K7eW(XBDIBlTVh1@1f0bagCt*3dg1iWO**_gpBt4Li$r*mrxMo2DBX zp1p5deB@AWfDLn@c|-e+i5y2LG6XX>2sCtD;S#GYfLfjSCtxv=**NNs?CkV5wd_v# z8;oqTQq#Om_T==IT`+2dQ-|j@6{pT~oAOfArh2>lhn)`7f6^AJtUm86SQ#&XMUEm>spYI1L8i4}!??X&V(pFAW&0<<}v$h24 zKQ|712qqKzTTxG1C;%4&?ZxTlBGFz9Hy24LG!nCu-FJ3+OV!QV9H_q@QVl$mLusbN zDWy0DPAR<%I5nw_cbn#<=3{EUs4|)Z- zOpXk)9!bazOnL)AHXbK6bk?2~_CAXBTA82?3Wz_3YdLO(&c>#@pG_mSE4*Ti%1#Gbc3zD?nA>6`=hS==`w9 z2{+A45N(HBLc=}?Z+{084L6h(D?SihT zVbIn8qGhyS3JE-nl?e*acoGY(Je`K|#VSw?{#?PXH~pPQ)~mHkch=Zfgn72)i}*q3Js?)Ar@|Rx{o8 zCcq3UlA7SX==}rwZaW5;$-wAl*ZUAVjpUHG!+YKgNqOE!ZOM=^uO;NQhp=J8Edkz| zV89z+!)*){Wm;Edg4P_}l8&`#vmJ`yrjSlx0!=r&-}iRA<85yEI5N_0bXGkZgJZq- zTCY+xy@=wi=Vp|C|A&rNbL-iCj~+53YF<;n*h3u0j;>gbdT9z`ECr35yKcx~w)AbT z_hk?Fq@a8D+st@dP1AH6J`U6mg>tkvvfd}%lN{IEeQ@9B!mLUP<$7CPoLV0M>s)VJ zk7nxS1Wi~6hCy!-FK?F7`Ise){7zp2M}vWRO{OVvJh!nXh;xrbuLWm%a!#>5Ck-{b z-lBB3ab~bF*2_s~JU`yMAhC3NP6~8YGZIU^na9NJ@Z!3(c`a_>Nto@sP2reMYv=yY zyqx%rMibPQ6mcW_9%_$nNwZxIOhe86n_XDxc!4kTdf-RV1F*UPK548=k)9wo)Fxpk zp9TGPpy^Yb>EtA1^KxwqedHK8w|D*a&fUan-v)yJf#UjyjN&0u@v*%sz77OU5?vJv z76!gA%?+&F(xXbj(!i?oMg;1kpwh_WjH%)EK)nY5#4BDZ4U953Jb|BI4=Ar`1f&Od z9xzX*hR}18j&Zh#;5^S1J9aOW@uQ(XfLhaly$|**kbvn`0@pMX>Anjc-fX9yvOj~a zi)dGs`jCxzq}UkObuE&;1NwAK_Fj_V`SVj?>dXH$`(WOYFm`)KFLqs+Z z`zl;hiKjJ{D=-Y!RH!PNdS!YEE{ygHtRmoUz2MV+xe0hjRz*(b^FVTZDy*U%@p)jd z@huli8yUq(Qez>tnE(HRc;k5=zO12?s1_ zLisfHyK1+EDL>Yi!-AKst+vyF6~YSWZcPmGqfH+id>nTRqd@;b-2z21&5mN4Zr$jm zieZY!4gq}saWsyKI1t*Kp+LhbG(Nf|bMqCD2Uwj`z9f&p$@N!%;>wuC?fV&=89mt<)-5N6G*X`BbrZLeiLGCTEPjb8Zq}u*aK>3$; zPoCJTSyR#?hjm|MM$R-P8NE6^Sli|{PRVwo2jU|E_}j1c1N-#h`;IrFrpCqEY01ic zot+&|8DDqLQ^YMkw9H)ZyB>uNjk8A&CngHHaI4iApBg=ILL@PIU})_*Qya@u(>nU$ zA#*Cs<%T~FZi69fMQTd>`A`mAd4~c$sL}PDMFtx1HVQJBDegy1=j{%HZXwVx1A|we zf(dkXJ_&=k$>$?Z0w!Z_%H*7;{bVCQin%j?x=N7%(i;|A3+@`viZO)-MGadHL z69XY_TW_IRy>Ba4Ok{wW621muZczm0^@00frVYy>ab_}&OG_yx63fG~3#_QX9pxsB z(iQ9$!E6R1V@KH1*3XUE%5o2YT<9X(p>+QpYN}v%{uNGF9Yj~a5+Sa99pn)3Y&wp{ zWzZ>vq7$HP*53-Jd0COvV4xnCJB=xB(HvvN9JHb%&W-uDy%WOhFxejsmb0lr(3kiG zoeV*}d$m0d6dI4rgekXQU5hTybZP@I9ZhqyHboL#Xor#5OJVBxcH0CPqdLAcHx`+o zLD$~4{qMoO%T|;;?0sDQ2{-2CHx7z^-9J*?xO|p(plNAm^oN0gYp~ymehq8Hrpp)s znR7fd1W+HefAvQWbQt7bV`!);FQzVf;E=%ecY^e!ra3Va5OqRB3)4mpHmeCZb z$4R5rw0~RjDp*#j$451=sFmEks8#3#d+ zd*Oy>Y7=1bGI}7fc8@2_^~g{N2sC^Qksc1hpO7&)+7btAaoLVjd)&mPj0WJ2w>P>g zJ`~-R5E{@N{V+Kcvo{>m($E>G$AzrWD%;=fiZ(BHy^pZJ%MUl59}{kx6hqG^pGX6_ z?g0z#VQ{P}+6Uq$NmI1Cao-DZY~$WcOTZ1gpc-_%Vm%b{J`1gW$Jn_w`e}T$GiJ%- zy=Bq+I%HZ^pdRa2`(jWL61i=k17P*{Z$V;#>z9GV>Tm4%VmObsKnMI0WadQ3%!$2c z<_WCg?V~`NDrn;gU7fbK%{FM7hF@xLZQ(gk&l*?&&;FppIsr4>IK`~N!(G)BxCzH$ zuyG1h*)S~8HD2VpupkK!4zA92YGE}1x^sx*s;3iG+E34)r3aTKP)&dJ7H6<|$hN5A{EYG}{k3{!Vai%x{bT|1Qt-df|s zXTBkH8!rHlbz6}?o6}F|J?S5y`28kU?fp=)2$BUSr>uU@c4#V6JtLY>zQ{_a~j5wD1*aHI8}$=N+pqr zZTsGWwu4WB-fr6lr`~q29iEv$9Fx0-k82OdywGiujoPu@ZM>A9H^AKct+vu#*oM(b z`%T43X?C1Q|9w;PVf$n zJY+orcLXqn?wUQq{To&um|bE~8E3o;>)#!(!n&RrOiXdQjrOT4IDV6Rh8g7G34a^Z zJDjV3?gmbWr{7Og2%x7BJ^gv$@2|hcsM^E&)^BvyWS@z zSM8rcIh(T{Q`)*7GlGS9vk4wUb+*}M2O1K<@i6ff4K>?snw1I*WO=DWu+1KWXc4t$%M4yyDV| z@^w4m5l*B(oW@4}0nSTwBI5!N<{aJJc1V45?W53>zzr^}dlg^@0mW=QqsG|wc@Vg2 z`O!|`w&sqfLintsJ`0d7$N0!;fd}C(Y{J!cI$)e1c%nIR6+O{Lueak107h(0IQ7JB zAbu>=h6Jq4?VoV0i{V!6 zUnF^C?X!*dnB|3V{DBR==k2T!U(-c}g&VCgv(YQvF*K30Z2k;IbY}oUdnH2n)mFi-Jo|g+Rwc-D} zyY3XB-gvDbZ3?t8GujESwEPjSaf&w2ZMwmDP25Ak5({o_v^fE%TYGbhw&e|2v1K0K zaSp+EaT44Cd2lH_jCYDf&~SMD5f=@gg?@Yoj0?kCcz}Ra%ZqoI_2cARXrqMXs7_GM6qtQ@#C=nmTfZ@w#mBnayS;CBUf%=kG>BB@UFl$10lI5lObW_0x|}2bV-*D z={;;PBYkt14Vl&kYguojG^CH^yYg9+ZeUbP%`vw0gm>XF@X&S`Zo2CV$SoPT+ROoP zb%tKgg|lu`t$pA@xEml}W|H|Gx4=CTy_`A7c3@c-O^Cp3bWcL#(h1PDFUJMrC`>6g zW4~>C+lJ}%5u=m4HpjSUABWd9qj3ojUtx?h zjmzW_`h*FPOXw3`&TY(i17FU4oJW<8P4?L`wrZXT**CizI_oaLw{UIt^O~~l+Iw!+ zf$Fht%SZ7P08@_40c-k;t3hjG#nqu}VvMCwhogIfJt_*^C787!NGZiFdYdA-P5Cw@ zH|w>UBk{=t-UJLWkF{#?&O3;!WAC<=y@+dGR>2DqcyANlu7h&1@6r57@!0&psYhu=iXTSYnuGYVej_bZ-#efSt56@X+gEbTAKIh<^m?ekZQ?x+k`} z19rljih14-(0L|9?i1UNdz;^wxNB9Q;Vqcb1sLyi-**S=Q>cOeOZVbE*m!GLV;0Won*_)z?}3Gm#$V$f4rs*~__}6ys)737fk{6WA@l^Mh5r_yyNN(*kP-|#cGepksK=-K*8b>$ z{#P%B#mB()|G>;1h+R1^Y(v0HL*V5@dc_Xjx@&8i9cyn-%-b!pX|~^i3Qfc4Js;%4 zcAOG4G%q`?{ihHCmq8mA!bu*yIM>r*ai^lgw&b>a2*ur&H()RLqN`Xz7@eew^%FGM z+ui2Et#12app{ld5rg$l!Q0d{A@0h@Mx4a=$j58wUegWYD_BFq-q)0Wi0y3(-1l;H z6Zl{b+@hJKfG{*(HCLe67;y(i+8wyh_yr<{VI4MP+SQN8X_^gQr%14F>Jy2I2~6xR zB{-vkvi7NTaIDDex>1A0@#q$p`zH9u7^bOWZ<2jbD{Sa=17R};;#=zptIl(3;T>7y zC~TT=M+motcF7PI_3S#Q7&M{5K#$WS_46V1Z0K>ooA6FruP^S{y9&QRcm`rD?zr>+ zZo{n`qq}0{jSqB_A@3{rM+Y#CAL{)Bx;&UFQUilm^4+3srhzvNJ;d8FY_GS;`wYrD z&wHiq#(%;>Ue?Ef>wXPQ0A}IWHNp{YBZfnn}LbJ6GKpyjITl-a8JZu5jw;a*ZW)= z0K-W-RLfL+vHnPW6>_-EXehcR245YfNd$E%kjl_7_4eT1HX2*nU{1escfZ-Q?p<^2{hb?S6~P{ z4@(I&+zwamDG~P`~uAWeu2}nE1WB+Z_Bq;u4^$KtA@JG?PdC9s~^r2c=7pE>H%=5 zX&eHRlW|s4_hcEQ;h(_RegdRA;8j3-0UZLYOznXu{r4H^==RuByBZSR76Z^|f_J)0 z?ZSwuEIjw%*O#`-nHtXKQ6Vg=jORq6JK#3hruXAdZ;hE2^$1)2T;04_P|M=D|+PXt<47X?tHf@)epW(_3Dv_uxum z$ot;)z7V}`ed+;lB|Hc+)}vQ@J2U?R#ahuA*Ok*n38Co6G4Pxx!MqFj0z{_C@T$xa zfrd?R9e6N5rv8OM{ey76>YEYRH_rw*G3HS)#(~wf@vx}Sv3ONotW*2G8{KL&wy%M( zZZj|nG_07wgYn1I!-Jv6q2rIX&6;p>;F`PO6#l(pZc%)FUd*n}U9hfjOw1~H96Q); zoP<_Ih8Ytc!EMYohBr)u*3fZO+k-pkwg{G0Ru18KcyWkJOIvhj5vUJA z!nBeJ-J!iT0izwhd$%J}gPjHk!Ut?=*=pOcFA&~q%hgEa zJ*N@gHmY@E1f+}_P0%gZzuX-M)&}{XPSx5drkE2?G7{v@a(Az>3 zb4TvR{nA94F?84_+e(_ku|H5+)+gOlPk7n3tAtHh_e~Mqi3Qf341JG{M@kOvMc`q) zbtSkeP`?wVZDzV?Z#1!h@n0jMS09IBgS$Y+P|Fv&Z^>?-^n85bGqPEqnt=r%27eK(jVa-o5eu(4$ z8xgWGLh^qQA%GFy-U5GYZgl5xkb~a(7G(eOA4IqpBV5%LftrwBE^N<2u?s=0eH5HQ zm)E`&kK|=uuSn!_x&s5Lax}aUX>%K6JKp1kAIwVoeiOZW_-j7~vP#eVn)=!r9X^IerAwzy;r_)?{?wEefT#>&=3!9G*s!S z{dN6ox_|Fkfk~EHx9k;QA?M(fVDz@4@UPlUL$uGqdW`+OL@W9hS50hPVq;`YRi;2wEjh_6_~bI)EB!85yLZioj5!^+SR_^)7K2@Vg( z*uzk)W4O9Y|6Jcc9`sWf?{s^BDLlnH_@D8Z{;=np3(_P1p9b5f;=Y;jPa7T?n+jrI z4jIxl9}R;0A2#ob9qbyOfW+D*y0+`F><$()Lqm@uw6n(Urvv<&F3xzYt5`L-x%<@D zdZ;fjGs zX3U&5`@)L~F23Z_IhS2NcV6NAqT-U$1q;irSX92aqO$6z)isgYB}?m;UAcV4RV$qo zNG%^z1Yg9#9t(Sdy+rzd&6bmwn?G@SXhzs6T3A?JQxb7%iVDjM=a-i_HRXjB5vR1W zA`&#G!Q#r2nqWm`B)GURQnYZOv$Uja!9tR-=Ld-t6;_-U3078>R0NHpQ)&h}Rb_Q0 zHL zY9liv%fPnWX*n~Tobs}&`IUv$#X*QmF@mLqW#uKs1D#_p9h08E(i}$PVZtfJXPf^| zDT1r1rxf9T&aBXkDU)W+1dfkAmT2*yPNpV>u6p2)q&99A=)HpQ}=aiaY`pB%2W8f85;fLa~nyT``Wl~{T zMH!?8jxMUKC@otsa-g%Ix^P)mx--8VJu3GPwPqYbHmQ;S(7v8&YU$PciI%^l=51~YJdRn)A{gc^x0!v zIN*-%nqCJdAvoe*4d)Z#hMJ=?%BsA#N>kdLPjKK%;V7r{Q&ITZdb zhP?vzO4zGl|0(P>u-C%A6!v8h4NQSd!C|aDWZ1(vdl+vIXWB!iJ&b{zV+4E1u!nK> zFy0={w1-T47=wO=2=>&?j zczYOY4;gTnj_n5$wTE%`Fy0=F6`0rkfymUli*^Jg3`!j=&+~5$d+Fi ziIh~s0B1&?U`tF=&C8HC`Mann&A#4rd3ADN|yyomOvdda=xS9X{Xej1`>H?^GmADSRI^NSy6db z*WiB6=rL!({GqI{ysWV1oJe(T$ytT9k;;W-6%lh~tc8cf;Mibw;nH9gRISWlMR{;U zNzuZ};D|EF6U-V$6xBp3tL6vCW@ekv_^${4>w*7z;J+UDuLu5f z5B!D}%wXB7=SJK&oFZ_zef%y|sQ3qkQ~ckNoDOGu{K6fI=NnE6Zt6q7UpVXc4JZA- z?L)s`IP3QfC;d0}q2Di@_4|gC{@;^+x)cRyPdQwd4-4MnV;_g#OyT%yliUb9e&K8n zhx0Y-(D8LRUvqpv`~Qa&u{`VNBZvFNzttx`>+=g|`#IdtKYrm_zqU{7*Wn!hHWKtp z-!ELp=WF&Gr_b?qIA3$Pwok{`;T-?ZB&fsT@v+(N?jyYEe;Lm9-P=d}zw{A)UmxKc z`UwAPAK`!NBmD1ugx}vs_yc`}KiEh3Lw$sA>?8c)KEh{EIM)}hpM2zSd}h6Q=Ti>({No!={`pBC{^4*x|8TgUe>mLFKOFAo9}f5P4~P5thr|8+ z;~P%?nc0VbINZ-a9PZ~I4)^m9hx_@5!~Oij;eP(%a6kX}hLeASKiI}fm!jp`(?iLB ze*WR`gVHBWMLzx~?D&PVJsht6tK;i%9ben0d4`K`Z-*e53Awu zYzFGc;ePdx!-FawUq0D~{T%LRKZpC-&*9mepgMB6pZy#jRPp$-xexm}+|Pav_p_hF zvpGR^?g6hcOe)ezb!#)o8vya35?Bj4h`#9Xs zzRi8u$KihVak!s-9PVcyhx^&Lr4Rc!+|ND^_p^_~{p{m#Kl`@!VIPP4*~j62_HnqM zeH`v*-?l#N<8VLwINZ-Z4)?Q?8c8KEhw_Bm7@|gul{9_|87UU+p9OwLZdM?<4$;KEmJZBmAvC!r$&A zd{-agIIrckR7Y&w-tg$xwon}7|5!N2_q%uJ_&*koGC#Iq`WU{*C!cIvp-(vH(=VL$ z`-QXZd>_(n>#FncoWuD(LWDml!}&h0JKUae{2U!X*BpLfAK@4KgmeCjeEh@uul5NK zcIn0ZW@p>Wy(Vvtlg8H&2LGJ0eq_jmH~%c#9;@vUBARQ*v&Zb~?Qs?B^O~J0Iq+&+ z+LURthXqGxj2ts^bZ|`in2hwS(e`aIEaxEXXfFuC_uFEck#YWF=$hA|hCmo@F;~uT zV(OA(j!iryVJ!$J12dnMg5w|*fDM^V#euKF*$r8k&Lt}#HkghmS5D_A3bu;QdE7y{ z8;BiEN7R28o#Q`MbtWbyUmrU$DdoDjiAlkx_=!nr*Y*n~rT@HtC@C{~NH{4w_Ti*V z0HLHb5CB1lFfl0s^SYPxEW%?rDLJ+@DPcIA;yw86el*@hULNa z8VdUW3#+gEt&54<9zU?REJ8}~jw0+kN#C}xOd|G^`(P~H0m6ez&Yx> z7X9<{xKL6s8Xr!|k1ZaU6a)f(0!M=t=%YClCkf+#k8;6BX>b}LZt4ic5Wb!wd~I~B zBUzVp#O5R=WWu@mE(aWcg5h9K6V``o(Vm~jL$OEufl+ZqF$0s*0D)m3VhqE$Uy{zl z;NRE!#LbSo<>0tM5KqTAu+`Y|&5r%Vl;OlAcXCqxRY}?({8d5^}1ljg-88t+h`$PYi- zE~;XG=~K#ai7`oalOgTNNo!zV3;T^R6O-1(lqFS}x|@de5;pU%;f&osHCAK*GhfVy zV=>ww%M(i=sUVazuQ(}xp)6U)=v+ZMkB4a17jvM7fIir7q_Ee>PhE9nRZQ&DLe(W? zZxPrYI|nX8VEpB90Xne%+C_T)2hN>oNy$~l>ex#$A*>5LFx`OXz1O4k*ph>)k+FXQ zwk_DO|G;vdN9BTb+W33 z#}DKj+!nKA7pu02{XrYWIq%=8CmUkoCPVelJh%%r{R`H~O#HWZu#Lb!ramk(Wrum6 zMPWf*cEPx#Vz@5_In2u{lEr_Pk9ql#`a30QZ=CVV{S@bPh~iw5lspYmMw^}`elv1o zQ|#~2C=6?(u$dSJ{qhnjD-4T21fkZ zGIwKN@Z&xVL(7P3`jNgq2r7nv&u}yUs+Q8sk1gv;GYDaseaIw(%p8(2FV@2~*25}d zm;5{R5Nv(zN9ti3=xZi@9-L#_F)j^GNlKfNlwJo-iHh0On>{3Z8Or9v*ndG%f+>HR z3|&AvmQf^A{uDM6!;0+~hIz{*ek5|(P&SX)aR{KV!FpK_r^U?C5xw;>Q<65s##O{6 zZH%3i)C?772kfmd!0v?OuGpm*dS$FnXaquIZ-u}q5S3(O;BqovZh$~E#(%?V8t;78 z>#R1;!O(-ZIEMxu6%+@W^oHFI%t5;_&QEZ|=a4ZVzYZ^83!1-QZlHenV>X`Ook8-Y7CR@>aXj&B=$fjEgJU@Azn(bHNhcD&i@2GW z(s>*YDs+v9X|Q9i@YBh-tuue^pE!pauwb!JXE5C>$^JzYhW9U+uV%W&J_ol%lK+6@ z%{84RMyg4X#oDRBCf( z{tN8y#E%Zx2xcA&r}&S+QT}@3X08fsEAd;17r-@c&%=)LUlDf=b(}YdAC46jHmo#IF5Lg;v-1U zx+83WnXker{@gq2pH6m~c_{D+q$gA9nM8b{;?qgbvne*9n8FK)r&B{Q^HK<#PyFFy zt)Q7l!YTfY8rrjuxS2x&Uj`iWn`*`3%x)`*2NlPkx6Tkj6D{tm)aQZE9^#44IyXt2gw14E>P7)}5An|M^f4Je) zcp;3_-An1VVh0YJnft-EXE|2Q(0;?vSzb3)0W^g9GrlrExaR{$+jx>7j0hv2zn~?youEHsU8TpyPVtIg0<; z@WEz{Oa|Hc*C9@ggmC^K>A6aA^9vX-ADFB7Cep94vxB(y^mC;DXDY%=h9{Wc!;?X; zk^HYDg!5g*aa@(#hs5uZ5YG3IeqPVwVEmeC?aGSKG@uo3hbOk zJSZWYXA@6Td@|_|sC4s4K3mDpAo-(|d;!V3O8#=6@HpN?sf2sJth#ye= z4d4g&&W`hr4{!J3U-@wSS<>G0AM3+Yfe(h>oTiywce;Y@b7&%{?c%7BEnJsqkQ!hd0wY56{bv z2i{vf8R^5%^WnKZe3}n0_2El=_*Fjq=RW)6^WkUu@QFTrx(}b{!x#GSh!6jn4`1uUfA7QZ@!=2o@GU<486W}B!LW&R51GANpodYJf9 zA3eYJ;dl7(zmxv0O8?_N@;gX=B`sL+`oW9D*AO?)o50pLiNA{r{;+xW;Isqp&HrEc z@K{I)%YD(AR>5VYXAtn-^rVpd4wAos;eYqxkNEIseE2Iq z{4F28$A^F8!v_xP-ET+x@RNP`7$2VP!)N&Lc|N?{hcEZxjXwOhKKync{zo7F7a#th z4{!G2&-w7zeE567vAsl8d->RK?ghJ_FMMbCAZLe~?+r?{^T1Zc4sSxwpe zvhuRXGN-m;abXpFBN0Al>nyIUttlxiGM}AYT(hvUI#N^{sd4Jy>v{HTh)!L3Wnr=X zPGVhAc}ZclQ(WZKEiPPCvY>of)k6G$YfV*2QH@ht4Z#(7z`Y2Ps4IqV+$pJU=9JV` zRo0YXT9Mjn_`YM&GO&4Zm(691%PMLj=4*QJ{YGO3Cgv2@6qS|Dt*VA^>X|S0c7@b{ z#U;hYAp42k(!$#ENY^#!#!vD(b@(;D8mF=x z9$Z~pVXas7>=71k6yVsC1yx zShtwO&_5-M=ffv9N9N^>!9QcO@NYW)8EvldPX_)OhkwT7pEL1KCjNm}QQ@zNGTMlb zHd3RF*k~g++C(00l#d>3A{qHHCh8ayYm5mUV?xIm`7uV%7^7#5(KE&*IL5>sYvPWz z23oUC+_5I^SQB@wi96QB9c$ud82Jn%pJC)PjC_XCmSJLL82JnnH^amlXXN2Sq>#~Z zR)eu&oY64OXc%YWjx({w84crXTq8Ns(qjyKxIo4DgMpbeE^+lW*b*H$?Nx$wEm z>WWYVN)A7!Ig>wKIelqGNwrfj>Or?{*HzuuXH-);`!ccZ6a)$c*f z=Q*9ZbD_-@Et*@jaM4`+wkLe4+BTyFC>@3dJp;ZG&2+w@Iq(tf+=}9oI%jebeHS!b zTUA~LpR+Cjgu!65{ibL4b*Q))L%QP-0MQ<7VkLBGpv8P8dS>nX8mO)Cv1veIYg!LB z8M+A2FxB*K2Y;`$TQhxi6g6A>x`EMw&AbjiIf~8#uas0*S5(f0bNh*IC>J1=;Cky6 z%pbI3^i5&Kf^zs2HU&(;|FZPp{DpQn(CTv2}`%@d@|O7f*BP(eeXg)3|E%jptvI*>p?d1SwqIeR1 zSeDgy$&|9l?1~yFnViXHxWMw~b7;fnd$918ktSdblY-B{u_3 z0anEPG8pxtE3#$7SGM|F&!I~=23T4FjRC)|TMMHIG?Zyr)2t^Zmz6^)*$aqMQL@yj z!puU)Qjl-I&TDlQ7CRC6(6ISLf5GJP+M0z9I3iM9R&B5YGm^5ZqRJ{5Cjq02c)DU5 zpy}>RBLdS+L#_i?(PRc9m@`vX%(SGawz>wIw6z2VKI-~lZiCv(@SDThf*_rfic94=dopd9;&Wn*qtCG;oI6zrq}lU7YgTN?+23D-(iNq)I4)KwX(RZw5+5W8V{Blc(bak*fGsG zY(MeuKyxu8#!Rb=FE1>ssV&5gBNx8=-z8*9$W*Htm6iOH2hcl3pwH)+;gYJzLaukV zp<$<3Ragzpimy!u?XVweOLE^;E33t+4; z{Q$HObEFcm=TM(vj$2bzSOmS5DWj$4tKpSZHO|t?>f&P1xET6rD2^qOvSKK?u1|Ku zFIrSrLh;r{7FWT$F?Pcv-o0#~YkDorgd^woW>P6!%b%tAI=aqP{2sb4P&}WWGgc^m zKV2{N;VXSOuiLPleCQ&;`pn#xS^gKVP`#mQu3TGzBh&&+H*1NEdQ9`sOvk}acdF!Z-Q%=lb3HIo&tmc|2}9-S-vebn&@9ZfN5=*g4(95x|Cr z+hJ#p&*O1p{X@y_bj7)yW(j@=#A7|v1jo~I$`?MT#|;m-rp@w~3;FeeuN53mx!=20 zaqh3070)31i!SxZ0Ea5p6%H!_@zSrYr!uPJQPya z_qiNruHx5NF=v_L*AoAQ;%kWCtT@a6S#i$qeZ+NsA5rqG2VQA08{5z6o=hC|+zC7T zEnV?v&uxO=EBIZ+ z*$?#)hTC5hXa79v!?!8Uer{Eq%j;$0=;yz{&UWH+Q{31dPItHBtp8iZS-yWlPdzMu ztm14>khrct_}mmXZBK>|KUe6v58`pYT*0x;F~36TVLLYq`M(PJmz6x1*L#Yyo;IQ9 zZ$i(fKJs4+dF&(EPJY!F{eyEQ<^$om6mICB%VB3eggDB}@hDet*>C?*=)pMLFFmIC zJrIW5F2(Og17O4FWVms8EhT;kJQtDtJ>pXp=W%M5;ygZHsyNr5dBoB7b+EG^u2k|o z9{tjX|4nfor(to(JH@e&BrJa~;V!U#Bb1`5HxB=WD!@XL}|Hz8(@{ zKm0;))W!DvQgOEDM#b5lTZn6WwkUa?&%doW*Pjm*Ux!YC?Q_NNve-F3(VnnBZzeuU zan?Uh@pU90Qk?bAR2+SWTczUnSnSj)zK-}cinIJ}it~JCJ#qA>oX>1j@~r1|#aYiT zq2~e6#pV8mkNg24|DcdhIn-u^{mlB0BaU`HB;@UHR~}r?f2H(ry}C(pu2;7T{p*DO z2bDb6^T!nDcKT1ju?*P{?+7m2>G&iNf{pXb?cyB8+5WKNY=16s^v^ojIo(Pn&-LwE z#d)52yWnyj_?Y0B2A4|w>^wOc zgkWR)S$`UF^xI>wvz?=qd@BKvUnRKI^MK&@3HdEP{8=BqhdAbUp3w7|keB%#O#c81xE$PYXmgkVFzZG)Zb)nMZ2e+-Mjj@z+{^ZG!B;w(Q|@pM!OTfX8OEOzE7 z&iYFgzlY=(3qB7R+h0c|BBEr z+r`^LUh3%(T>9-Rp-1{Ho*qbWdF4@k8zQ*0=V;CY*Ovp+8sT-rHL=$Cd@ z`p7TykzeB@|0^H)n+2Es*ydwwD~mI>Q4Pw078@C8C1_3%8ZM)8@X|5m|e ze*cf)sE6l`_XxgNq`Oh@3c;Tg9QClDpCXRzA40xW$D~@I`!h@&%N@hG{^Sbz=Y;$MC7%IdxK#`OPq=3NR|$^#i%}T1HG)g|2Z^I> zE9|Uin~=vazHj=c;_D#{x1EaLW3ls&;yj+lr&s~@1AgZKx1i$qJp{5I<@k5S=$gr`0 z{%$XwWFLMKakTRV*xAnEg1;#E#X?V&;PV7WUF?Svq30$ce~XZp?d30m|5V8TUFebR z>7J(aaJpj^=XB3foYOte zC*52n&wBC|XFaopo|lFF6@vdu@MTKR0}zJWAB6lXaLx7PPd@USguJZhM;vR^b=6O{ zf2iVY|B1xW|2svxRYJa6@LC}+?Q9hCH9~%^kNj;y9@Az!?^K-ayj$pzettmk+eNxt zg`SHAe^zizm-Rm{^xP!mrwoM)*ti}B&6VR!Rh%xJnTp>}^1oD^_1vO3%Riv_X{2Yf z;%UV9DbD)8Q=BfHMf4A2FkcbaxxQUV9DVbu;A;h!<^ETp2jj5*Cl%*>y{dQ+;^6kS z;;bk0cpHv(*22zqP9d)CyijmiALa|*Ec8?hF7x#&aZGoKkl!V^tUn(JJ+l5BQ1Xv~ zF5FU2ut(JK8tj~}X~em{vHVp+{&gY$KSEyC^E(8WcK%W5k#_z~$#1ddIa?IRxh8He z3q8$n&GsJMfDQR3*qNUcgbUcv_BUW>J~9Xwuxa`8f(9F2 z2d69_CXRaKxHe62Sx*)cNBtOw=bzO={!QSlzm7P|b3Kpx@Ea6o{kIawG~a@q^{-d* zJl}XgaZdLs!Iud=&k;xcvYx*~9PPgnc24(0;#xlcL=b`v`P;Cwe3jt41iywj`-kV5 z&nnLS*b9oY{3$1aQrK7zj~AmA=k{`r;@{cm&P3v9|2wd={TB)Oiv_=2aE!xxiiDn< zgnW&XXFIP_ob9Yvob`J`zqE6+l4rj?r8xWTgp|7@Ja$u~dQt%amuMiy5eu?z_TJblCuNPeE-yrx^LjM-QrT%9W=X|}QINS3Tan$ji z(BCQe?ScZwQJmZL<-}3{`>?a$mI?XUg5M_OKM?!_As-K%+k5|0-~u+Z zXBO26lXnuP@MH_A&!1%hn@ZK4<*m-@kPZs z-PaW7`}AFkuOmA@QhZ2^4fsTH_VX9S(aznlvz_1g$j8uxlgn!l=|56&_QO!c*>5K+ z&i!E;akQsH*fU1SbH1_^FDHA>6?(9*;(UdbJllD`;%w&v#fOsqa-sikLVt~q{4&MY zK^)w!R-DVdUg-ZA(5A-_=Yje^eucx!_+5j(s`X zbN(>6fQ|FT{+v!6?fC+BmY*x+uNJ&f@E+ru(1U$B>v=@TuM&KVkiS*%7X^P;@Q(%m zQt&Z%?rvTF7{B9Fm`sW3~R}1<0Gtf$F z=T~rKJ%fm&ow7chFSyiyq2NCgdMbqeeS+5tdFi(+h5UXY-zemxg8xo%)WhS#?LPcI zq5pu;^R$qc_P;DR>R%5#Zf`1nm&Nqs4Bhp74e>*V+Y>H#=Eo?0Ey<@U&h=^-akS+l z*txt$DS6g^mg4+8ce3LAymE%({2caj#rgSZwc;zt{zl?x=SE@YUzB_~$$uc^Zx`|d zMpyy%TZH5@h@*Zfzfj53w9~0pd?+e}ZJFY!#IIMJ-`D!B;t?9xZc&`e>ki^*Co(Rt zdzCz=yHRnrbBp5my2Q(Lx>}j{ptxyp7T3Oan_UXqo+X02O%BY>J(@Fzf_#{-{!;b_2KU-&iYRqWz*Mw z7^yhdpK*$F{h6RR*Pjq^^rx&pu9D|`T_)sZyLeLY7^t&cAAV4JaO}kGq;z}4eBA*% z%a0(A_DDTv3i()}f1=>Bo-Fp^s|1&N{y4fdgdw4=`K~A?O)-e|7S{`_5Vh3)_;%UtpBe* z`Zp?h*0WV{PWNraS^xV!`V+=le`2}F_M1kW%W=3BbFzH+#fo!(a=FlteG=EhYm|H< zgyD9b;;iS_LQg-T=l4o}0_j<=IP1S#an`><=}U?1DxBKYlszoYcC-#+)@ zhh<={yW0!fa};qb7wNZbCC~YqqB!fx6MFDBV%YwfNGj{`-wr9OqAp^L*pj@m2u+Bgch3#JS$`JoyX7*OUH3&a@{ipBQJalQbv) z9HBU`ZwytO{c|F5v=e>F{!df#Jf6a5f6T`A{M}wUXA6D@FxGRv;3f^S|0jyGJr@#3 z*+Ydrg+d;E!}==($2had4_7PB{gS8n9Fo65aqh2fRs3?2|Fh!7#Q!Sz&xM^&5JwyF z-@>!~FA8}K+d_KY^5GvSzJlaGQ=Hqy0ma$R-xJ3)UlMi>$b<{nxO~~3BNXTQpXS3e ziKG6FuycN=DtQdU?PA5bUfrztmz3W-702Hv!EJ-$dx$?l9PK#_7~8W$$ln5C%-`0OBqe^}b$!}7eZmXSE!LI>Xw)0J) zAAehb`3Hih2;L#|U{jn&>3-|OW6rVym|v7c!2KKdCx`j);}vK9!xU%z zXDiO{B~J3;7YL5NVSipIIF=2Mzw;EYCqFDu{08ES73c4y)G5yIzeN@2a{qu|% zoc%#@uAluTScADt84I%l_w& zN}l_lM-}J(XOrUVjrESRLve0L&neFRz)r>4&NqppZ)E@TzLMwuC-FRM0JkINhbzwd zQ;4JfQ$@QzLCN#|@2QHjo)L<(|0gQWesdLPzfD)1?Vm*)?d*V^>%*l=ehBr$g@U7Q zmM<3^b@BMVL~+jVRf=GLh;ye#|O>u5_?Zbob@*m*ZLpvk$+Oi4;S`4Bjm4ly6t&Ea7=^KeT6u(n~>9e z`dh@=|2U_?ZFjagm~vbTr!4=O;8OoS;#&XrN*?oo+klWgV!FSCo%JURF7+QlTf{Zka@d`(k4k>qD9&gF6maZGmv$g&?wh5WCD z{fh;c_E!r%vV2!4`EZQ2|7OM6&Oa#5cHTuC(|ldn^A{!0_qh)V`H?Z*`P!`HIo+of z=XC!m^o$aEUiXpTCFIkE{6|XuCF=&~Ga>)3$kzcS|31mbPP8ZJ2Pr>*cr0)XYla=S zA&T#?*hv-q24Gz7X9$jZ*bnK%k;(F%qU0YV{TC|Ee!fib--vW8h5lCsUn%5&D|l4M zj~0GjBlsA>$t=^K#KOf+0+=7%km1h#a{@xxn77$WCy|cKzohGA#T`f+w;}e>rHB2H zqWD!bj~}YIL-V<1i7!+#qTHidc`j!zDDtK(sQliRm9gS9wB~%;&sGt zRQ!8N_h!Xck^DNv7Z6{s_*ul0iDNUwy3W4~A5@%wN1odY%invV6--z1tBG^{WceAS zIA6&#pQrfs_z(j&E=Sf=YO%xqWRA}maNA%HrhCDB@$bLyQvBg#E!eAg-SHM2P(1x; z3-FmQZk+D3DfT)j_+UV{(lyT2al-@h-}S>Q_;=!pSIOZ&dta;=uvd zUJOP*e?dG=@o$NzE6#q%RGiB(*{bg<#~7?!u%+8W7w=CzU-3hUS1CT2_*%t}B)&oM zV~DpZemwELil0P0S^4c$;^~T?PCQ@nk;JPMA47bt;^T>LQ2Z?7t%{#Ze6QjYi6_$$ zgRy)k(=~q&iTPCG`AU8UT~{f7AziOkoPYmsgW`pB-KuyAUGG)AoUZNf%6InzKP8@y zi_5UF{dL6i6~BsjmE!fp*DCH2-=KIC@m9reAih`en}{dJ_q6j?;{3gCw*L;|`AYsz z#H$ql3-PszKR|qg;`}}IR>hwn`Mrv7BA!g`p6%R5JYDgpiRUZ+Eb%JExgM-loZqkB zp!iPG)2jFz#P=%R)qeZ;^#3lBPgk7VX};p`v;B&5dt9q{8_91_ocpC##rLrNigSBN zKBTAp``LcQe;}T(ct5I_Rf_Yv-&(~FC;1JEA49xVbGBdcp ze8oo*uTp$G@wJMdLwtkcVdAZdUqF1X;@rR>gT7*{e8@JIRSX?dS0&U2z^? z@)hUtrAl!gU)CyqEBRrA;yk{zD$e7}Ud4HQNj|iv{XD*;E6(FfzT%IPKdTgfoc*sj z&kr{!-k59)Gp09Wj@hZj3h_6-rr^GiX zzKnRQ;;V`8Roo+X6)-=O#d#9I}AocLbF zw-Qet($oHb5KmY9W#ajYzfQbL@%MgT-+p9Q_FZ?}5wv+pL zUe{#K{cS$2cQWVxuu5_6uhuHg{mBN!xxKe4&h2rp;@n>NyNGNL*XOijy6Y8Atx`_1 z*RJB1(7G;vw~+Plyk((}e3jrhH2s?D=NiE=UDm%=aFply%w2*@`3-`j{BKBqv*K}d zU%f-{3qhW@R>4tEfaLji<1xS3weauK(KNx#2gYI`ZRvDG#LwyxW5rDNe~bK{`R*xbv1lC(P+~ z$#E4=r|UV2&!+1t#Y^eBUh!+_`bNdCr|WwZzl*NFRGj_B&sW+04=Dfq-URcDDAThj zocVI%>^J5|(fE6 z#jm4zTL#V3F&OuCG#(cyemIR25yhtyze{m`PP9ewbn5Shlb<+Uem>w{& zXP!pkrDW5Zf9h1VWiL*IlrdH8EI&Br6u-=aYv6F4Pge`%S;kQL5u`}Bh8Ot zYu+1_sxn4qbX^wJM0#96B1M&p7vqn^kF2PSl#HA*ZT1NGDe$62biJUWc4U?Pz4~R8 zaLK~CrPYP-TkrpGY(Y?hT{ty|E|uAI_REP~$eaXwUOL!qVHcFG_<=huI6wm-|OIjAfM0?rxU1C$DfyD1yWQ%(BiJYSgp}6thaLG_;*PN z=hWSH(b2@RyNEs6`yCxAeat_0fja;A+6JaS26nk6gzeQ4s$ftSH$G0Ka~(f;z7cbN zt1`yvbNoVzuiWG`=h^t#)b8w+;{^GHjyMnMt^9Y9h3O*ysEX6)@?QoFZPDpFGzs2C z^Is4#Tab=?h`>p2=_k_*ZM>d<{>M3;PX9V!y`{g4CUUDVP;5bQj;9{%y`{e^#YPNL zd`$mP*me3h0z(m9e)FmU!p8FUs=NMSnz;QDc8q@*UWjeszZw62h|^pADvDnqbmA%7 z!^aki&+}py-$C(*GN2=-g&QBA7Uw2_{=84|CBt)$$NV)o!68yrbEl2sYrEKPj{iBF zpiUh>rN&CMsrs+ue+**1mA`}kSQs{b9*pIWQ%;W0^}n~YF`jdk`RlYEXOAfVJJ@x6 oH1D9c1FZG;@CUZEM0@1F+JAUY*=v0KN4T(2H)hW9kB