From mboxrd@z Thu Jan 1 00:00:00 1970 MIME-Version: 1.0 References: In-Reply-To: From: Mark Lee Smith Date: Fri, 27 May 2016 17:46:48 +0000 Message-ID: To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net> Content-Type: multipart/alternative; boundary=089e012285144671b40533d67e4b Subject: Re: [9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam Topicbox-Message-UUID: 94934fba-ead9-11e9-9d60-3106f5b1d025 --089e012285144671b40533d67e4b Content-Type: text/plain; charset=UTF-8 I modified my local copy of sam to start the plumber AND the name pipe. I've been using this for almost a week and it seems to work like a charm. This is with sam from plan9port. The relevant change as a pseudo-diff: (I've been playing with a number of other changes that showed up in the diff so I just copied this small part.) In samterm/io.c if(protodebug) print("hoststart\n"); hoststart(); if(protodebug) print("plumbstart\n"); + /* if(plumbstart() < 0){ if(protodebug) print("extstart\n"); extstart(); } + */ + plumbstart(); + extstart(); if(protodebug) print("initio done\n"); } All the best, Mark On Fri, 27 May 2016, 19:14 , wrote: > flselect() must be changed in samterm/flayer.c to get the double click > selection working ok. > > > Anyone has hacked sam to use both the plumber and the pipe? > > trebol. > > > diff -rpuN src/cmd/sam/cmd.c sam/cmd.c > --- src/cmd/sam/cmd.c 2016-04-18 19:07:22.000000000 +0100 > +++ sam/cmd.c 2016-05-25 23:56:34.040909362 +0100 > @@ -35,6 +35,8 @@ struct cmdtab cmdtab[]={ > '>', 0, 0, 0, 0, aDot, 0, linex, > plan9_cmd, > '<', 0, 0, 0, 0, aDot, 0, linex, > plan9_cmd, > '|', 0, 0, 0, 0, aDot, 0, linex, > plan9_cmd, > + '^', 0, 0, 0, 0, aDot, 0, linex, > plan9_cmd, > + '_', 0, 0, 0, 0, aDot, 0, linex, > plan9_cmd, > '=', 0, 0, 0, 0, aDot, 0, linex, > eq_cmd, > 'c'|0x100,0, 0, 0, 0, aNo, 0, wordx, > cd_cmd, > 0, 0, 0, 0, 0, 0, 0, 0 > @@ -76,7 +78,13 @@ inputc(void) > > Again: > nbuf = 0; > - if(downloaded){ > + if(cmdbufpos > cmdbuf.nc && cmdbuf.nc > 0){ > + cmdbufpos = 0; > + bufreset(&cmdbuf); > + } > + if(cmdbufpos < cmdbuf.nc && cmdbuf.nc > 0) > + bufread(&cmdbuf, cmdbufpos++, &r, 1); > + else if(downloaded){ > while(termoutp == terminp){ > cmdupdate(); > if(patset) > diff -rpuN src/cmd/sam/sam.h sam/sam.h > --- src/cmd/sam/sam.h 2016-04-18 19:07:22.000000000 +0100 > +++ sam/sam.h 2016-05-25 23:45:05.652931784 +0100 > @@ -369,6 +369,8 @@ extern int quitok; > extern Address addr; > extern Buffer snarfbuf; > extern Buffer plan9buf; > +extern Buffer cmdbuf; > +extern int cmdbufpos; > extern List file; > extern List tempfile; > extern File *cmd; > diff -rpuN src/cmd/sam/shell.c sam/shell.c > --- src/cmd/sam/shell.c 2016-04-18 19:07:22.000000000 +0100 > +++ sam/shell.c 2016-05-25 23:46:25.262692361 +0100 > @@ -6,6 +6,8 @@ extern jmp_buf mainloop; > char errfile[64]; > String plan9cmd; /* null terminated */ > Buffer plan9buf; > +Buffer cmdbuf; > +int cmdbufpos; > void checkerrs(void); > > void > @@ -40,7 +42,7 @@ plan9(File *f, int type, String *s, int > } > if(type!='!' && pipe(pipe1)==-1) > error(Epipe); > - if(type=='|') > + if(type=='|' || type=='_') > snarf(f, addr.r.p1, addr.r.p2, &plan9buf, 1); > if((pid=fork()) == 0){ > setname(f); > @@ -61,14 +63,14 @@ plan9(File *f, int type, String *s, int > } > } > if(type != '!') { > - if(type=='<' || type=='|') > - dup(pipe1[1], 1); > - else if(type == '>') > + if(type == '>') > dup(pipe1[0], 0); > + else > + dup(pipe1[1], 1); > close(pipe1[0]); > close(pipe1[1]); > } > - if(type == '|'){ > + if(type == '|' || type == '_'){ > if(pipe(pipe2) == -1) > exits("pipe"); > if((pid = fork())==0){ > @@ -100,7 +102,7 @@ plan9(File *f, int type, String *s, int > close(pipe2[0]); > close(pipe2[1]); > } > - if(type=='<'){ > + if(type=='<' || type=='^'){ > close(0); /* so it won't read from terminal > */ > open("/dev/null", 0); > } > @@ -128,9 +130,14 @@ plan9(File *f, int type, String *s, int > writeio(f); > bpipeok = 0; > closeio((Posn)-1); > + }else if(type == '^' || type == '_'){ > + int nulls; > + close(pipe1[1]); > + bufload(&cmdbuf, cmdbufpos, pipe1[0], &nulls); > + close(pipe1[0]); > } > retcode = waitfor(pid); > - if(type=='|' || type=='<') > + if(type=='|' || type=='<' || type=='_' || type=='^') > if(retcode!=0) > warn(Wbadstatus); > if(downloaded) > diff -rpuN src/cmd/samterm/main.c samterm/main.c > --- src/cmd/samterm/main.c 2016-04-18 19:07:22.000000000 +0100 > +++ samterm/main.c 2016-05-26 16:12:12.452556184 +0100 > @@ -23,11 +23,8 @@ long modified = 0; /* strange lookahead > char hostlock = 1; > char hasunlocked = 0; > int maxtab = 8; > -int chord; > int autoindent; > > -#define chording 0 /* code here for reference but it causes deadlocks > */ > - > void > notifyf(void *a, char *msg) > { > @@ -39,7 +36,7 @@ notifyf(void *a, char *msg) > void > threadmain(int argc, char *argv[]) > { > - int i, got, scr, w; > + int i, got, scr, chord, w; > Text *t; > Rectangle r; > Flayer *nwhich; > @@ -85,6 +82,7 @@ threadmain(int argc, char *argv[]) > > got = 0; > if(protodebug) print("loop\n"); > + chord = 0; > for(;;got = waitforio()){ > if(hasunlocked && RESIZED()) > resize(); > @@ -108,19 +106,32 @@ threadmain(int argc, char *argv[]) > continue; > } > nwhich = flwhich(mousep->xy); > - scr = which && ptinrect(mousep->xy, which->scroll); > + scr = which && (ptinrect(mousep->xy, > which->scroll) || > + mousep->buttons&(8|16)); > if(mousep->buttons) > flushtyping(1); > - if(chording && chord==1 && !mousep->buttons) > + if((mousep->buttons&1)==0) > chord = 0; > - if(chording && chord) > + if(chord && which && which==nwhich){ > chord |= mousep->buttons; > - else if(mousep->buttons&1){ > + t = (Text *)which->user1; > + if(!t->lock){ > + w = which-t->l; > + if(chord&2){ > + cut(t, w, 1, 1); > + chord &= ~2; > + } > + if(chord&4){ > + paste(t, w); > + chord &= ~4; > + } > + } > + }else if(mousep->buttons&(1|8)){ > if(nwhich){ > if(nwhich!=which) > current(nwhich); > else if(scr) > - scroll(which, 1); > + scroll(which, > (mousep->buttons&8) ? 4 : 1); > else{ > t=(Text *)which->user1; > if(flselect(which)){ > @@ -137,27 +148,14 @@ threadmain(int argc, char *argv[]) > scroll(which, 2); > else > menu2hit(); > - }else if((mousep->buttons&4)){ > + }else if(mousep->buttons&(4|16)){ > if(scr) > - scroll(which, 3); > + scroll(which, (mousep->buttons&16) > ? 5 : 3); > else > menu3hit(); > } > mouseunblock(); > } > - if(chording && chord){ > - t = (Text*)which->user1; > - if(!t->lock && !hostlock){ > - w = which-t->l; > - if(chord&2){ > - cut(t, w, 1, 1); > - chord &= ~2; > - }else if(chord&4){ > - paste(t, w); > - chord &= ~4; > - } > - } > - } > } > } > > @@ -497,6 +495,7 @@ flushtyping(int clearesc) > #define CUT (Kcmd+'x') > #define COPY (Kcmd+'c') > #define PASTE (Kcmd+'v') > +#define Kstx 0x02 > > int > nontypingkey(int c) > @@ -512,6 +511,7 @@ nontypingkey(int c) > case PAGEUP: > case RIGHTARROW: > case SCROLLKEY: > + case Kstx: > return 1; > } > if(c >= Kcmd) > @@ -669,6 +669,15 @@ type(Flayer *l, int res) /* what a blood > } > } > } > + }else if(c == Kstx){ > + t = &cmd; > + for(l=t->l; l->textfn==0; l++) > + ; > + current(l); > + flushtyping(0); > + a = t->rasp.nrunes; > + flsetselect(l, a, a); > + center(l, a); > }else{ > if(c==ESC && typeesc>=0){ > l->p0 = typeesc; > diff -rpuN src/cmd/samterm/scroll.c samterm/scroll.c > --- src/cmd/samterm/scroll.c 2016-04-18 19:07:22.000000000 +0100 > +++ samterm/scroll.c 2016-05-26 02:07:31.922977720 +0100 > @@ -115,7 +115,7 @@ scroll(Flayer *l, int but) > draw(scrback, Rect(0,0,Dx(l->scroll), Dy(l->scroll)), l->f.b, nil, > l->scroll.min); > do{ > oin = in; > - in = abs(x-mousep->xy.x)<=FLSCROLLWID(l)/2; > + in = (but > 3) || (but == 2) || > abs(x-mousep->xy.x)<=FLSCROLLWID(l)/2; > if(oin && !in) > scrunmark(l, r); > if(in){ > @@ -126,9 +126,7 @@ scroll(Flayer *l, int but) > my = s.min.y; > if(my >= s.max.y) > my = s.max.y; > - if(!eqpt(mousep->xy, Pt(x, my))) > - moveto(mousectl, Pt(x, my)); > - if(but == 1){ > + if(but == 1 || but == 4){ > p0 = l->origin-frcharofpt(&l->f, > Pt(s.max.x, my)); > rt = scrpos(l->scroll, p0, p0+l->f.nchars, > tot); > y = rt.min.y; > @@ -136,7 +134,7 @@ scroll(Flayer *l, int but) > y = my; > if(y > s.max.y-2) > y = s.max.y-2; > - }else if(but == 3){ > + }else if(but == 3 || but == 5){ > p0 = l->origin+frcharofpt(&l->f, > Pt(s.max.x, my)); > rt = scrpos(l->scroll, p0, p0+l->f.nchars, > tot); > y = rt.min.y; > @@ -147,19 +145,21 @@ scroll(Flayer *l, int but) > scrmark(l, r); > } > } > - }while(button(but)); > + }while(but <= 3 && button(but)); > if(in){ > h = s.max.y-s.min.y; > scrunmark(l, r); > p0 = 0; > - if(but == 1) > + if(but == 1 || but == 4){ > + but = 1; > p0 = (long)(my-s.min.y)/l->f.font->height+1; > - else if(but == 2){ > + }else if(but == 2){ > if(tot > 1024L*1024L) > p0 = ((tot>>10)*(y-s.min.y)/h)<<10; > else > p0 = tot*(y-s.min.y)/h; > - }else if(but == 3){ > + }else if(but == 3 || but == 5){ > + but = 3; > p0 = l->origin+frcharofpt(&l->f, Pt(s.max.x, my)); > if(p0 > tot) > p0 = tot; > diff -rpuN src/cmd/samterm/flayer.c samterm/flayer.c > --- src/cmd/samterm/flayer.c 2016-05-27 17:46:30.431425669 +0100 > +++ samterm/flayer.c 2016-04-18 19:07:22.000000000 +0100 > @@ -254,21 +254,18 @@ fldelete(Flayer *l, long p0, long p1) > int > flselect(Flayer *l) > { > - int ret; > if(l->visible!=All) > flupfront(l); > - frselect(&l->f, mousectl); > - ret = 0; > - if(l->f.p0==l->f.p1){ > - if(mousep->msec-l->click l->f.p0+l->origin==l->p0){ > - ret = 1; > + if(l->f.p0==l->f.p1) > + if(mousep->msec-l->click l->f.p0+l->origin==l->p0 && > + l->f.p0==frcharofpt(&l->f, mousep->xy)){ > l->click = 0; > - }else > - l->click = mousep->msec; > - }else > - l->click = 0; > + return 1; > + } > + l->click = mousep->msec; > + frselect(&l->f, mousectl); > l->p0 = l->f.p0+l->origin, l->p1 = l->f.p1+l->origin; > - return ret; > + return 0; > } > > void > > > --089e012285144671b40533d67e4b Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+SSBtb2RpZmllZCBteSBsb2NhbCBjb3B5IG9mIHNhbSB0byBzdGFydCB0 aGUgcGx1bWJlciBBTkQgdGhlIG5hbWUgcGlwZS4gSSYjMzk7dmUgYmVlbiB1c2luZyB0aGlzIGZv ciBhbG1vc3QgYSB3ZWVrIGFuZCBpdCBzZWVtcyB0byB3b3JrIGxpa2UgYSBjaGFybS48ZGl2Pjxz cGFuIHN0eWxlPSJsaW5lLWhlaWdodDoxLjUiPjxicj48L3NwYW4+PC9kaXY+PGRpdj5UaGlzIGlz IHdpdGggc2FtIGZyb20gcGxhbjlwb3J0LjxzcGFuIHN0eWxlPSJsaW5lLWhlaWdodDoxLjUiPjxi cj48L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0ibGluZS1oZWlnaHQ6MS41Ij48YnI+PC9z cGFuPjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImxpbmUtaGVpZ2h0OjEuNSI+VGhlIHJlbGV2YW50 IGNoYW5nZSBhcyBhIHBzZXVkby1kaWZmOiAoSSYjMzk7dmUgYmVlbiBwbGF5aW5nIHdpdGggYSBu dW1iZXIgb2Ygb3RoZXIgY2hhbmdlcyB0aGF0IHNob3dlZCB1cCBpbiB0aGUgZGlmZiBzbyBJIGp1 c3QgY29waWVkIHRoaXMgc21hbGwgcGFydC4pPC9zcGFuPjwvZGl2PjxkaXY+PGJyPjxkaXY+PGRp dj48ZGl2PkluIHNhbXRlcm0vaW8uYzwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGRpdj48ZGl2 PsKgIMKgIMKgIMKgIGlmKHByb3RvZGVidWcpIHByaW50KCZxdW90O2hvc3RzdGFydFxuJnF1b3Q7 KTs8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIGhvc3RzdGFydCgpOzwvZGl2PjxkaXY+wqAgwqAgwqAg wqAgaWYocHJvdG9kZWJ1ZykgcHJpbnQoJnF1b3Q7cGx1bWJzdGFydFxuJnF1b3Q7KTs8L2Rpdj48 ZGl2PisgwqAgwqAgwqAgLyo8L2Rpdj48ZGl2PsKgIMKgIMKgIMKgIGlmKHBsdW1ic3RhcnQoKSAm bHQ7IDApezwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYocHJvdG9kZWJ1Zykg cHJpbnQoJnF1b3Q7ZXh0c3RhcnRcbiZxdW90Oyk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBleHRzdGFydCgpOzwvZGl2PjxkaXY+wqAgwqAgwqAgwqAgfTwvZGl2PjxkaXY+KyDC oCDCoCDCoCAqLzwvZGl2PjxkaXY+KyDCoCDCoCDCoCBwbHVtYnN0YXJ0KCk7PC9kaXY+PGRpdj4r IMKgIMKgIMKgIGV4dHN0YXJ0KCk7PC9kaXY+PGRpdj7CoCDCoCDCoCDCoCBpZihwcm90b2RlYnVn KSBwcmludCgmcXVvdDtpbml0aW8gZG9uZVxuJnF1b3Q7KTs8L2Rpdj48ZGl2PsKgfTwvZGl2Pjwv ZGl2PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+QWxsIHRoZSBiZXN0LDwvZGl2PjxkaXY+PGJy PjwvZGl2PjxkaXY+TWFyazwvZGl2PjxkaXY+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48 ZGl2IGRpcj0ibHRyIj5PbiBGcmksIDI3IE1heSAyMDE2LCAxOToxNCAsICZsdDs8YSBocmVmPSJt YWlsdG86dHJlYm9sNTU1NTVAeWFuZGV4LnJ1IiB0YXJnZXQ9Il9ibGFuayI+dHJlYm9sNTU1NTVA eWFuZGV4LnJ1PC9hPiZndDsgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFp bF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAjY2NjIHNv bGlkO3BhZGRpbmctbGVmdDoxZXgiPmZsc2VsZWN0KCkgbXVzdCBiZSBjaGFuZ2VkIGluIHNhbXRl cm0vZmxheWVyLmMgdG8gZ2V0IHRoZSBkb3VibGUgY2xpY2s8YnI+DQpzZWxlY3Rpb24gd29ya2lu ZyBvay48YnI+DQo8YnI+DQo8YnI+DQpBbnlvbmUgaGFzIGhhY2tlZCBzYW0gdG8gdXNlIGJvdGgg dGhlIHBsdW1iZXIgYW5kIHRoZSBwaXBlPzxicj4NCjxicj4NCnRyZWJvbC48YnI+DQo8YnI+DQo8 YnI+DQpkaWZmIC1ycHVOIHNyYy9jbWQvc2FtL2NtZC5jIHNhbS9jbWQuYzxicj4NCi0tLSBzcmMv Y21kL3NhbS9jbWQuY8KgIMKgMjAxNi0wNC0xOCAxOTowNzoyMi4wMDAwMDAwMDAgKzAxMDA8YnI+ DQorKysgc2FtL2NtZC5jwqAgwqAyMDE2LTA1LTI1IDIzOjU2OjM0LjA0MDkwOTM2MiArMDEwMDxi cj4NCkBAIC0zNSw2ICszNSw4IEBAIHN0cnVjdCBjbWR0YWIgY21kdGFiW109ezxicj4NCsKgIMKg IMKgIMKgICYjMzk7Jmd0OyYjMzk7LMKgIMKgIDAswqAgwqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKg IMKgIDAswqAgwqAgwqAgYURvdCzCoCDCoDAswqAgwqAgwqAgbGluZXgswqAgcGxhbjlfY21kLDxi cj4NCsKgIMKgIMKgIMKgICYjMzk7Jmx0OyYjMzk7LMKgIMKgIDAswqAgwqAgwqAgMCzCoCDCoCDC oCAwLMKgIMKgIMKgIDAswqAgwqAgwqAgYURvdCzCoCDCoDAswqAgwqAgwqAgbGluZXgswqAgcGxh bjlfY21kLDxicj4NCsKgIMKgIMKgIMKgICYjMzk7fCYjMzk7LMKgIMKgIDAswqAgwqAgwqAgMCzC oCDCoCDCoCAwLMKgIMKgIMKgIDAswqAgwqAgwqAgYURvdCzCoCDCoDAswqAgwqAgwqAgbGluZXgs wqAgcGxhbjlfY21kLDxicj4NCivCoCDCoCDCoCDCoCYjMzk7XiYjMzk7LMKgIMKgIDAswqAgwqAg wqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIDAswqAgwqAgwqAgYURvdCzCoCDCoDAswqAgwqAgwqAg bGluZXgswqAgcGxhbjlfY21kLDxicj4NCivCoCDCoCDCoCDCoCYjMzk7XyYjMzk7LMKgIMKgIDAs wqAgwqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIDAswqAgwqAgwqAgYURvdCzCoCDCoDAswqAg wqAgwqAgbGluZXgswqAgcGxhbjlfY21kLDxicj4NCsKgIMKgIMKgIMKgICYjMzk7PSYjMzk7LMKg IMKgIDAswqAgwqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIDAswqAgwqAgwqAgYURvdCzCoCDC oDAswqAgwqAgwqAgbGluZXgswqAgZXFfY21kLDxicj4NCsKgIMKgIMKgIMKgICYjMzk7YyYjMzk7 fDB4MTAwLDAswqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIDAswqAgwqAgwqAgYU5vLMKgIMKg IDAswqAgwqAgwqAgd29yZHgswqAgY2RfY21kLDxicj4NCsKgIMKgIMKgIMKgIDAswqAgwqAgwqAg MCzCoCDCoCDCoCAwLMKgIMKgIMKgIDAswqAgwqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIDAs wqAgwqAgwqAgMDxicj4NCkBAIC03Niw3ICs3OCwxMyBAQCBpbnB1dGModm9pZCk8YnI+DQo8YnI+ DQrCoCDCoCDCoEFnYWluOjxicj4NCsKgIMKgIMKgIMKgIG5idWYgPSAwOzxicj4NCi3CoCDCoCDC oCDCoGlmKGRvd25sb2FkZWQpezxicj4NCivCoCDCoCDCoCDCoGlmKGNtZGJ1ZnBvcyAmZ3Q7IDxh IGhyZWY9Imh0dHA6Ly9jbWRidWYubmMiIHJlbD0ibm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsi PmNtZGJ1Zi5uYzwvYT4gJmFtcDsmYW1wOyA8YSBocmVmPSJodHRwOi8vY21kYnVmLm5jIiByZWw9 Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIj5jbWRidWYubmM8L2E+ICZndDsgMCl7PGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY21kYnVmcG9zID0gMDs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBidWZyZXNldCgmYW1wO2NtZGJ1Zik7PGJyPg0KK8KgIMKgIMKgIMKgfTxicj4N CivCoCDCoCDCoCDCoGlmKGNtZGJ1ZnBvcyAmbHQ7IDxhIGhyZWY9Imh0dHA6Ly9jbWRidWYubmMi IHJlbD0ibm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPmNtZGJ1Zi5uYzwvYT4gJmFtcDsmYW1w OyA8YSBocmVmPSJodHRwOi8vY21kYnVmLm5jIiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2Js YW5rIj5jbWRidWYubmM8L2E+ICZndDsgMCk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBi dWZyZWFkKCZhbXA7Y21kYnVmLCBjbWRidWZwb3MrKywgJmFtcDtyLCAxKTs8YnI+DQorwqAgwqAg wqAgwqBlbHNlIGlmKGRvd25sb2FkZWQpezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHdo aWxlKHRlcm1vdXRwID09IHRlcm1pbnApezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGNtZHVwZGF0ZSgpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGlmKHBhdHNldCk8YnI+DQpkaWZmIC1ycHVOIHNyYy9jbWQvc2FtL3NhbS5oIHNhbS9z YW0uaDxicj4NCi0tLSBzcmMvY21kL3NhbS9zYW0uaMKgIMKgMjAxNi0wNC0xOCAxOTowNzoyMi4w MDAwMDAwMDAgKzAxMDA8YnI+DQorKysgc2FtL3NhbS5owqAgwqAyMDE2LTA1LTI1IDIzOjQ1OjA1 LjY1MjkzMTc4NCArMDEwMDxicj4NCkBAIC0zNjksNiArMzY5LDggQEAgZXh0ZXJuIGludMKgIHF1 aXRvazs8YnI+DQrCoGV4dGVybiBBZGRyZXNzIGFkZHI7PGJyPg0KwqBleHRlcm4gQnVmZmVywqAg c25hcmZidWY7PGJyPg0KwqBleHRlcm4gQnVmZmVywqAgcGxhbjlidWY7PGJyPg0KK2V4dGVybiBC dWZmZXLCoCBjbWRidWY7PGJyPg0KK2V4dGVybiBpbnTCoCDCoCDCoGNtZGJ1ZnBvczs8YnI+DQrC oGV4dGVybiBMaXN0wqAgwqAgZmlsZTs8YnI+DQrCoGV4dGVybiBMaXN0wqAgwqAgdGVtcGZpbGU7 PGJyPg0KwqBleHRlcm4gRmlsZcKgIMKgICpjbWQ7PGJyPg0KZGlmZiAtcnB1TiBzcmMvY21kL3Nh bS9zaGVsbC5jIHNhbS9zaGVsbC5jPGJyPg0KLS0tIHNyYy9jbWQvc2FtL3NoZWxsLmMgMjAxNi0w NC0xOCAxOTowNzoyMi4wMDAwMDAwMDAgKzAxMDA8YnI+DQorKysgc2FtL3NoZWxsLmMgMjAxNi0w NS0yNSAyMzo0NjoyNS4yNjI2OTIzNjEgKzAxMDA8YnI+DQpAQCAtNiw2ICs2LDggQEAgZXh0ZXJu wqAgam1wX2J1ZiBtYWlubG9vcDs8YnI+DQrCoGNoYXLCoCDCoGVycmZpbGVbNjRdOzxicj4NCsKg U3RyaW5nIHBsYW45Y21kO8KgIMKgIMKgIMKgLyogbnVsbCB0ZXJtaW5hdGVkICovPGJyPg0KwqBC dWZmZXIgcGxhbjlidWY7PGJyPg0KK0J1ZmZlciBjbWRidWY7PGJyPg0KK2ludMKgIMKgIGNtZGJ1 ZnBvczs8YnI+DQrCoHZvaWTCoCDCoGNoZWNrZXJycyh2b2lkKTs8YnI+DQo8YnI+DQrCoHZvaWQ8 YnI+DQpAQCAtNDAsNyArNDIsNyBAQCBwbGFuOShGaWxlICpmLCBpbnQgdHlwZSwgU3RyaW5nICpz LCBpbnQ8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAgwqAgwqAgaWYodHlwZSE9JiMzOTsh JiMzOTsgJmFtcDsmYW1wOyBwaXBlKHBpcGUxKT09LTEpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgZXJyb3IoRXBpcGUpOzxicj4NCi3CoCDCoCDCoCDCoGlmKHR5cGU9PSYjMzk7fCYjMzk7 KTxicj4NCivCoCDCoCDCoCDCoGlmKHR5cGU9PSYjMzk7fCYjMzk7IHx8IHR5cGU9PSYjMzk7XyYj Mzk7KTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNuYXJmKGYsIGFkZHIuci5wMSwgYWRk ci5yLnAyLCAmYW1wO3BsYW45YnVmLCAxKTs8YnI+DQrCoCDCoCDCoCDCoCBpZigocGlkPWZvcmso KSkgPT0gMCl7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2V0bmFtZShmKTs8YnI+DQpA QCAtNjEsMTQgKzYzLDE0IEBAIHBsYW45KEZpbGUgKmYsIGludCB0eXBlLCBTdHJpbmcgKnMsIGlu dDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYodHlwZSAh PSAmIzM5OyEmIzM5Oykgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGlmKHR5cGU9PSYjMzk7Jmx0OyYjMzk7IHx8IHR5cGU9PSYjMzk7fCYjMzk7KTxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGR1cChwaXBlMVsxXSwg MSk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZWxzZSBpZih0eXBl ID09ICYjMzk7Jmd0OyYjMzk7KTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmKHR5cGUgPT0gJiMzOTsmZ3Q7JiMzOTspPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZHVwKHBpcGUxWzBdLCAwKTs8YnI+DQorwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBlbHNlPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZHVwKHBpcGUxWzFdLCAxKTs8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjbG9zZShwaXBlMVswXSk7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY2xvc2UocGlwZTFbMV0pOzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZih0 eXBlID09ICYjMzk7fCYjMzk7KXs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZih0eXBl ID09ICYjMzk7fCYjMzk7IHx8IHR5cGUgPT0gJiMzOTtfJiMzOTspezxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKHBpcGUocGlwZTIpID09IC0xKTxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGV4aXRzKCZxdW90O3Bp cGUmcXVvdDspOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKChw aWQgPSBmb3JrKCkpPT0wKXs8YnI+DQpAQCAtMTAwLDcgKzEwMiw3IEBAIHBsYW45KEZpbGUgKmYs IGludCB0eXBlLCBTdHJpbmcgKnMsIGludDxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGNsb3NlKHBpcGUyWzBdKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBjbG9zZShwaXBlMlsxXSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg fTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmKHR5cGU9PSYjMzk7Jmx0OyYjMzk7KXs8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZih0eXBlPT0mIzM5OyZsdDsmIzM5OyB8fCB0 eXBlPT0mIzM5O14mIzM5Oyl7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgY2xvc2UoMCk7wqAgwqAgwqAgwqAvKiBzbyBpdCB3b24mIzM5O3QgcmVhZCBmcm9tIHRlcm1p bmFsICovPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgb3BlbigmcXVv dDsvZGV2L251bGwmcXVvdDssIDApOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+ DQpAQCAtMTI4LDkgKzEzMCwxNCBAQCBwbGFuOShGaWxlICpmLCBpbnQgdHlwZSwgU3RyaW5nICpz LCBpbnQ8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB3cml0ZWlvKGYpOzxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIGJwaXBlb2sgPSAwOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIGNsb3NlaW8oKFBvc24pLTEpOzxicj4NCivCoCDCoCDCoCDCoH1lbHNlIGlmKHR5cGUgPT0g JiMzOTteJiMzOTsgfHwgdHlwZSA9PSAmIzM5O18mIzM5Oyl7PGJyPg0KK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgaW50IG51bGxzOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNsb3NlKHBp cGUxWzFdKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBidWZsb2FkKCZhbXA7Y21kYnVm LCBjbWRidWZwb3MsIHBpcGUxWzBdLCAmYW1wO251bGxzKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBjbG9zZShwaXBlMVswXSk7PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKg IMKgIHJldGNvZGUgPSB3YWl0Zm9yKHBpZCk7PGJyPg0KLcKgIMKgIMKgIMKgaWYodHlwZT09JiMz OTt8JiMzOTsgfHwgdHlwZT09JiMzOTsmbHQ7JiMzOTspPGJyPg0KK8KgIMKgIMKgIMKgaWYodHlw ZT09JiMzOTt8JiMzOTsgfHwgdHlwZT09JiMzOTsmbHQ7JiMzOTsgfHwgdHlwZT09JiMzOTtfJiMz OTsgfHwgdHlwZT09JiMzOTteJiMzOTspPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYo cmV0Y29kZSE9MCk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB3YXJu KFdiYWRzdGF0dXMpOzxicj4NCsKgIMKgIMKgIMKgIGlmKGRvd25sb2FkZWQpPGJyPg0KZGlmZiAt cnB1TiBzcmMvY21kL3NhbXRlcm0vbWFpbi5jIHNhbXRlcm0vbWFpbi5jPGJyPg0KLS0tIHNyYy9j bWQvc2FtdGVybS9tYWluLmPCoCDCoCDCoCAyMDE2LTA0LTE4IDE5OjA3OjIyLjAwMDAwMDAwMCAr MDEwMDxicj4NCisrKyBzYW10ZXJtL21haW4uY8KgIMKgIMKgIDIwMTYtMDUtMjYgMTY6MTI6MTIu NDUyNTU2MTg0ICswMTAwPGJyPg0KQEAgLTIzLDExICsyMyw4IEBAIGxvbmcgbW9kaWZpZWQgPSAw O8KgIMKgIMKgIMKgIMKgIMKgLyogc3RyYW5nZSBsb29rYWhlYWQ8YnI+DQrCoGNoYXLCoCDCoGhv c3Rsb2NrID0gMTs8YnI+DQrCoGNoYXLCoCDCoGhhc3VubG9ja2VkID0gMDs8YnI+DQrCoGludMKg IMKgIG1heHRhYiA9IDg7PGJyPg0KLWludMKgIMKgIGNob3JkOzxicj4NCsKgaW50wqAgwqAgYXV0 b2luZGVudDs8YnI+DQo8YnI+DQotI2RlZmluZSBjaG9yZGluZyAwwqAgwqAgwqAvKiBjb2RlIGhl cmUgZm9yIHJlZmVyZW5jZSBidXQgaXQgY2F1c2VzIGRlYWRsb2NrcyAqLzxicj4NCi08YnI+DQrC oHZvaWQ8YnI+DQrCoG5vdGlmeWYodm9pZCAqYSwgY2hhciAqbXNnKTxicj4NCsKgezxicj4NCkBA IC0zOSw3ICszNiw3IEBAIG5vdGlmeWYodm9pZCAqYSwgY2hhciAqbXNnKTxicj4NCsKgdm9pZDxi cj4NCsKgdGhyZWFkbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKTxicj4NCsKgezxicj4NCi3C oCDCoCDCoCDCoGludCBpLCBnb3QsIHNjciwgdzs8YnI+DQorwqAgwqAgwqAgwqBpbnQgaSwgZ290 LCBzY3IsIGNob3JkLCB3Ozxicj4NCsKgIMKgIMKgIMKgIFRleHQgKnQ7PGJyPg0KwqAgwqAgwqAg wqAgUmVjdGFuZ2xlIHI7PGJyPg0KwqAgwqAgwqAgwqAgRmxheWVyICpud2hpY2g7PGJyPg0KQEAg LTg1LDYgKzgyLDcgQEAgdGhyZWFkbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKTxicj4NCjxi cj4NCsKgIMKgIMKgIMKgIGdvdCA9IDA7PGJyPg0KwqAgwqAgwqAgwqAgaWYocHJvdG9kZWJ1Zykg cHJpbnQoJnF1b3Q7bG9vcFxuJnF1b3Q7KTs8YnI+DQorwqAgwqAgwqAgwqBjaG9yZCA9IDA7PGJy Pg0KwqAgwqAgwqAgwqAgZm9yKDs7Z290ID0gd2FpdGZvcmlvKCkpezxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIGlmKGhhc3VubG9ja2VkICZhbXA7JmFtcDsgUkVTSVpFRCgpKTxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJlc2l6ZSgpOzxicj4NCkBAIC0xMDgs MTkgKzEwNiwzMiBAQCB0aHJlYWRtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY29udGludWU7PGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG53aGljaCA9IGZsd2hpY2gobW91c2VwLSZndDt4eSk7 PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2NyID0gd2hpY2ggJmFt cDsmYW1wOyBwdGlucmVjdChtb3VzZXAtJmd0O3h5LCB3aGljaC0mZ3Q7c2Nyb2xsKTs8YnI+DQor wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzY3IgPSB3aGljaCAmYW1wOyZhbXA7 IChwdGlucmVjdChtb3VzZXAtJmd0O3h5LCB3aGljaC0mZ3Q7c2Nyb2xsKSB8fDxicj4NCivCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1vdXNlcC0mZ3Q7YnV0 dG9ucyZhbXA7KDh8MTYpKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBpZihtb3VzZXAtJmd0O2J1dHRvbnMpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgZmx1c2h0eXBpbmcoMSk7PGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYoY2hvcmRpbmcgJmFtcDsmYW1wOyBjaG9yZD09MSAmYW1w OyZhbXA7ICFtb3VzZXAtJmd0O2J1dHRvbnMpPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgaWYoKG1vdXNlcC0mZ3Q7YnV0dG9ucyZhbXA7MSk9PTApPGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY2hvcmQgPSAwOzxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmKGNob3JkaW5nICZhbXA7JmFt cDsgY2hvcmQpPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYoY2hv cmQgJmFtcDsmYW1wOyB3aGljaCAmYW1wOyZhbXA7IHdoaWNoPT1ud2hpY2gpezxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNob3JkIHw9IG1vdXNl cC0mZ3Q7YnV0dG9uczs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBl bHNlIGlmKG1vdXNlcC0mZ3Q7YnV0dG9ucyZhbXA7MSl7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdCA9IChUZXh0ICopd2hpY2gtJmd0O3VzZXIx Ozxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlm KCF0LSZndDtsb2NrKXs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB3ID0gd2hpY2gtdC0mZ3Q7bDs8YnI+DQorwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZihjaG9y ZCZhbXA7Mil7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY3V0KHQsIHcsIDEsIDEpOzxicj4NCivCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGNob3JkICZhbXA7PSB+Mjs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYoY2hvcmQmYW1w OzQpezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHBhc3RlKHQsIHcpOzxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGNob3JkICZhbXA7PSB+NDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoH1lbHNlIGlmKG1vdXNlcC0mZ3Q7YnV0dG9ucyZhbXA7KDF8OCkpezxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKG53aGljaCl7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgaWYobndoaWNoIT13aGljaCk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjdXJyZW50KG53 aGljaCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgZWxzZSBpZihzY3IpPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2Nyb2xsKHdo aWNoLCAxKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzY3JvbGwod2hpY2gsIChtb3VzZXAtJmd0O2J1 dHRvbnMmYW1wOzgpID8gNCA6IDEpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVsc2V7PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg dD0oVGV4dCAqKXdoaWNoLSZndDt1c2VyMTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihmbHNlbGVj dCh3aGljaCkpezxicj4NCkBAIC0xMzcsMjcgKzE0OCwxNCBAQCB0aHJlYWRtYWluKGludCBhcmdj LCBjaGFyICphcmd2W10pPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2Nyb2xsKHdoaWNoLCAyKTs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlbHNlPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbWVudTJo aXQoKTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9ZWxzZSBpZigo bW91c2VwLSZndDtidXR0b25zJmFtcDs0KSl7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgfWVsc2UgaWYobW91c2VwLSZndDtidXR0b25zJmFtcDsoNHwxNikpezxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKHNjcik8 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBzY3JvbGwod2hpY2gsIDMpOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNjcm9sbCh3aGljaCwgKG1vdXNlcC0m Z3Q7YnV0dG9ucyZhbXA7MTYpID8gNSA6IDMpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVsc2U8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtZW51M2hpdCgpOzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBtb3VzZXVuYmxvY2soKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCB9PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYoY2hvcmRpbmcgJmFtcDsm YW1wOyBjaG9yZCl7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdCA9 IChUZXh0Kil3aGljaC0mZ3Q7dXNlcjE7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgaWYoIXQtJmd0O2xvY2sgJmFtcDsmYW1wOyAhaG9zdGxvY2spezxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHcgPSB3aGljaC10LSZn dDtsOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGlmKGNob3JkJmFtcDsyKXs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjdXQodCwgdywgMSwgMSk7PGJyPg0KLcKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2hvcmQg JmFtcDs9IH4yOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoH1lbHNlIGlmKGNob3JkJmFtcDs0KXs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwYXN0ZSh0LCB3KTs8YnI+DQot wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBjaG9yZCAmYW1wOz0gfjQ7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgfTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oH08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4N CsKgfTxicj4NCjxicj4NCkBAIC00OTcsNiArNDk1LDcgQEAgZmx1c2h0eXBpbmcoaW50IGNsZWFy ZXNjKTxicj4NCsKgI2RlZmluZcKgIMKgIMKgIMKgIENVVMKgIMKgIMKgKEtjbWQrJiMzOTt4JiMz OTspPGJyPg0KwqAjZGVmaW5lwqAgwqAgwqAgwqAgQ09QWcKgIMKgIChLY21kKyYjMzk7YyYjMzk7 KTxicj4NCsKgI2RlZmluZcKgIMKgIMKgIMKgIFBBU1RFwqAgwqAoS2NtZCsmIzM5O3YmIzM5Oyk8 YnI+DQorI2RlZmluZcKgIMKgIMKgIMKgIEtzdHjCoCDCoCAweDAyPGJyPg0KPGJyPg0KwqBpbnQ8 YnI+DQrCoG5vbnR5cGluZ2tleShpbnQgYyk8YnI+DQpAQCAtNTEyLDYgKzUxMSw3IEBAIG5vbnR5 cGluZ2tleShpbnQgYyk8YnI+DQrCoCDCoCDCoCDCoCBjYXNlIFBBR0VVUDo8YnI+DQrCoCDCoCDC oCDCoCBjYXNlIFJJR0hUQVJST1c6PGJyPg0KwqAgwqAgwqAgwqAgY2FzZSBTQ1JPTExLRVk6PGJy Pg0KK8KgIMKgIMKgIMKgY2FzZSBLc3R4Ojxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHJl dHVybiAxOzxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQrCoCDCoCDCoCDCoCBpZihjICZndDs9IEtj bWQpPGJyPg0KQEAgLTY2OSw2ICs2NjksMTUgQEAgdHlwZShGbGF5ZXIgKmwsIGludCByZXMpwqAg wqAvKiB3aGF0IGEgYmxvb2Q8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg fTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQorwqAgwqAgwqAgwqB9ZWxzZSBp ZihjID09IEtzdHgpezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHQgPSAmYW1wO2NtZDs8 YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmb3IobD10LSZndDtsOyBsLSZndDt0ZXh0Zm49 PTA7IGwrKyk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7PGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY3VycmVudChsKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBmbHVzaHR5cGluZygwKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBhID0g dC0mZ3Q7cmFzcC5ucnVuZXM7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZmxzZXRzZWxl Y3QobCwgYSwgYSk7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY2VudGVyKGwsIGEpOzxi cj4NCsKgIMKgIMKgIMKgIH1lbHNlezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKGM9 PUVTQyAmYW1wOyZhbXA7IHR5cGVlc2MmZ3Q7PTApezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGwtJmd0O3AwID0gdHlwZWVzYzs8YnI+DQpkaWZmIC1ycHVOIHNyYy9j bWQvc2FtdGVybS9zY3JvbGwuYyBzYW10ZXJtL3Njcm9sbC5jPGJyPg0KLS0tIHNyYy9jbWQvc2Ft dGVybS9zY3JvbGwuY8KgIMKgIDIwMTYtMDQtMTggMTk6MDc6MjIuMDAwMDAwMDAwICswMTAwPGJy Pg0KKysrIHNhbXRlcm0vc2Nyb2xsLmPCoCDCoCAyMDE2LTA1LTI2IDAyOjA3OjMxLjkyMjk3Nzcy MCArMDEwMDxicj4NCkBAIC0xMTUsNyArMTE1LDcgQEAgc2Nyb2xsKEZsYXllciAqbCwgaW50IGJ1 dCk8YnI+DQrCoCDCoCDCoCDCoCBkcmF3KHNjcmJhY2ssIFJlY3QoMCwwLER4KGwtJmd0O3Njcm9s bCksIER5KGwtJmd0O3Njcm9sbCkpLCBsLSZndDtmLmIsIG5pbCwgbC0mZ3Q7c2Nyb2xsLm1pbik7 PGJyPg0KwqAgwqAgwqAgwqAgZG97PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgb2luID0g aW47PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaW4gPSBhYnMoeC1tb3VzZXAtJmd0O3h5 LngpJmx0Oz1GTFNDUk9MTFdJRChsKS8yOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlu ID0gKGJ1dCAmZ3Q7IDMpIHx8IChidXQgPT0gMikgfHwgYWJzKHgtbW91c2VwLSZndDt4eS54KSZs dDs9RkxTQ1JPTExXSUQobCkvMjs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihvaW4g JmFtcDsmYW1wOyAhaW4pPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg c2NydW5tYXJrKGwsIHIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKGluKXs8YnI+ DQpAQCAtMTI2LDkgKzEyNiw3IEBAIHNjcm9sbChGbGF5ZXIgKmwsIGludCBidXQpPGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbXkgPSBzLm1pbi55 Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKG15ICZndDs9IHMu bWF4LnkpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgbXkgPSBzLm1heC55Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGlmKCFlcXB0KG1vdXNlcC0mZ3Q7eHksIFB0KHgsIG15KSkpPGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgbW92ZXRvKG1vdXNlY3RsLCBQdCh4LCBt eSkpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmKGJ1dCA9PSAx KXs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZihidXQgPT0gMSB8 fCBidXQgPT0gNCl7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgcDAgPSBsLSZndDtvcmlnaW4tZnJjaGFyb2ZwdCgmYW1wO2wtJmd0O2YsIFB0KHMu bWF4LngsIG15KSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgcnQgPSBzY3Jwb3MobC0mZ3Q7c2Nyb2xsLCBwMCwgcDArbC0mZ3Q7Zi5uY2hhcnMs IHRvdCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgeSA9IHJ0Lm1pbi55Ozxicj4NCkBAIC0xMzYsNyArMTM0LDcgQEAgc2Nyb2xsKEZsYXllciAq bCwgaW50IGJ1dCk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCB5ID0gbXk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgaWYoeSAmZ3Q7IHMubWF4LnktMik8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB5ID0gcy5tYXgueS0yOzxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH1lbHNlIGlmKGJ1dCA9PSAz KXs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9ZWxzZSBpZihidXQg PT0gMyB8fCBidXQgPT0gNSl7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgcDAgPSBsLSZndDtvcmlnaW4rZnJjaGFyb2ZwdCgmYW1wO2wtJmd0O2Ys IFB0KHMubWF4LngsIG15KSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgcnQgPSBzY3Jwb3MobC0mZ3Q7c2Nyb2xsLCBwMCwgcDArbC0mZ3Q7Zi5u Y2hhcnMsIHRvdCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgeSA9IHJ0Lm1pbi55Ozxicj4NCkBAIC0xNDcsMTkgKzE0NSwyMSBAQCBzY3JvbGwo RmxheWVyICpsLCBpbnQgYnV0KTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHNjcm1hcmsobCwgcik7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQotwqAg wqAgwqAgwqB9d2hpbGUoYnV0dG9uKGJ1dCkpOzxicj4NCivCoCDCoCDCoCDCoH13aGlsZShidXQg Jmx0Oz0gMyAmYW1wOyZhbXA7IGJ1dHRvbihidXQpKTs8YnI+DQrCoCDCoCDCoCDCoCBpZihpbil7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaCA9IHMubWF4Lnktcy5taW4ueTs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzY3J1bm1hcmsobCwgcik7PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgcDAgPSAwOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmKGJ1dCA9 PSAxKTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmKGJ1dCA9PSAxIHx8IGJ1dCA9PSA0 KXs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBidXQgPSAxOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHAwID0gKGxvbmcpKG15LXMubWlu LnkpL2wtJmd0O2YuZm9udC0mZ3Q7aGVpZ2h0KzE7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgZWxzZSBpZihidXQgPT0gMil7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfWVsc2Ug aWYoYnV0ID09IDIpezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlm KHRvdCAmZ3Q7IDEwMjRMKjEwMjRMKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIHAwID0gKCh0b3QmZ3Q7Jmd0OzEwKSooeS1zLm1pbi55KS9oKSZs dDsmbHQ7MTA7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZWxzZTxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHAwID0g dG90Kih5LXMubWluLnkpL2g7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfWVsc2UgaWYo YnV0ID09IDMpezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH1lbHNlIGlmKGJ1dCA9PSAz IHx8IGJ1dCA9PSA1KXs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBi dXQgPSAzOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHAwID0gbC0m Z3Q7b3JpZ2luK2ZyY2hhcm9mcHQoJmFtcDtsLSZndDtmLCBQdChzLm1heC54LCBteSkpOzxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKHAwICZndDsgdG90KTxicj4N CsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHAwID0gdG90 Ozxicj4NCmRpZmYgLXJwdU4gc3JjL2NtZC9zYW10ZXJtL2ZsYXllci5jIHNhbXRlcm0vZmxheWVy LmM8YnI+DQotLS0gc3JjL2NtZC9zYW10ZXJtL2ZsYXllci5jwqAgwqAgMjAxNi0wNS0yNyAxNzo0 NjozMC40MzE0MjU2NjkgKzAxMDA8YnI+DQorKysgc2FtdGVybS9mbGF5ZXIuY8KgIMKgIDIwMTYt MDQtMTggMTk6MDc6MjIuMDAwMDAwMDAwICswMTAwPGJyPg0KQEAgLTI1NCwyMSArMjU0LDE4IEBA IGZsZGVsZXRlKEZsYXllciAqbCwgbG9uZyBwMCwgbG9uZyBwMSk8YnI+DQrCoGludDxicj4NCsKg ZmxzZWxlY3QoRmxheWVyICpsKTxicj4NCsKgezxicj4NCi3CoCDCoCDCoCDCoGludCByZXQ7PGJy Pg0KwqAgwqAgwqAgwqAgaWYobC0mZ3Q7dmlzaWJsZSE9QWxsKTxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGZsdXBmcm9udChsKTs8YnI+DQotwqAgwqAgwqAgwqBmcnNlbGVjdCgmYW1wO2wt Jmd0O2YsIG1vdXNlY3RsKTs8YnI+DQotwqAgwqAgwqAgwqByZXQgPSAwOzxicj4NCi3CoCDCoCDC oCDCoGlmKGwtJmd0O2YucDA9PWwtJmd0O2YucDEpezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGlmKG1vdXNlcC0mZ3Q7bXNlYy1sLSZndDtjbGljayZsdDtDbGlja3RpbWUgJmFtcDsmYW1w OyBsLSZndDtmLnAwK2wtJmd0O29yaWdpbj09bC0mZ3Q7cDApezxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJldCA9IDE7PGJyPg0KK8KgIMKgIMKgIMKgaWYobC0mZ3Q7 Zi5wMD09bC0mZ3Q7Zi5wMSk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZihtb3VzZXAt Jmd0O21zZWMtbC0mZ3Q7Y2xpY2smbHQ7Q2xpY2t0aW1lICZhbXA7JmFtcDsgbC0mZ3Q7Zi5wMCts LSZndDtvcmlnaW49PWwtJmd0O3AwICZhbXA7JmFtcDs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBsLSZndDtmLnAwPT1mcmNoYXJvZnB0KCZhbXA7bC0mZ3Q7ZiwgbW91 c2VwLSZndDt4eSkpezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGwt Jmd0O2NsaWNrID0gMDs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9ZWxzZTxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGwtJmd0O2NsaWNrID0gbW91c2VwLSZn dDttc2VjOzxicj4NCi3CoCDCoCDCoCDCoH1lbHNlPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgbC0mZ3Q7Y2xpY2sgPSAwOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHJldHVybiAxOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQorwqAgwqAg wqAgwqBsLSZndDtjbGljayA9IG1vdXNlcC0mZ3Q7bXNlYzs8YnI+DQorwqAgwqAgwqAgwqBmcnNl bGVjdCgmYW1wO2wtJmd0O2YsIG1vdXNlY3RsKTs8YnI+DQrCoCDCoCDCoCDCoCBsLSZndDtwMCA9 IGwtJmd0O2YucDArbC0mZ3Q7b3JpZ2luLCBsLSZndDtwMSA9IGwtJmd0O2YucDErbC0mZ3Q7b3Jp Z2luOzxicj4NCi3CoCDCoCDCoCDCoHJldHVybiByZXQ7PGJyPg0KK8KgIMKgIMKgIMKgcmV0dXJu IDA7PGJyPg0KwqB9PGJyPg0KPGJyPg0KwqB2b2lkPGJyPg0KPGJyPg0KPGJyPg0KPC9ibG9ja3F1 b3RlPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pg0K --089e012285144671b40533d67e4b--