# Re: Removing constant-able macros inside of the loop

**URL:** <https://www.ruby-forum.com/t/re-removing-constant-able-macros-inside-of-the-loop/176367>\
**Category:** Development\
**Created:** [September 29, 2009, 6:07pm UTC](https://www.ruby-forum.com/t/re-removing-constant-able-macros-inside-of-the-loop/176367 "2009-09-29T18:07:54Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Masahiro\_Kanai\_SCan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/a88e4f/32.png) [@Masahiro\_Kanai\_SCan](https://www.ruby-forum.com/u/Masahiro_Kanai_SCan)\
**Post date:** [September 29, 2009, 6:07pm UTC](https://www.ruby-forum.com/t/re-removing-constant-able-macros-inside-of-the-loop/176367/1 "2009-09-29T18:07:54Z")

</div>

e$B6b0f$G$9!#e(B

2009e$BG/e(B9e$B7ne(B29e$BF|e(B10:08 Yukihiro M.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> |e$BBP1~$,2DG=$G$7$?!#e(B(e$B4{$KBP1~$5$l$F$^$7$?!#e(B)  
> |  
> |  
> |e$B=$@58e$N%Q%C%A$O!"0J2\<$NDL$j$G$9!#e(B
> 
> e$B;n$7$F$\_$h$&$H;W$$$^$9$,!“;DG0$J$,$ie(Bfolde$B$5$l$F$$$F%Q%C%A$,2ue(B  
> e$B$l$F$^$9!#;d$,\<j$G=$@5$9$k$3$H$O$b$A$m$s2DG=$G$9$,!”:#8e$N$?e(B  
> e$B$a$K$b!“$\<$Re(Bfolde$B$7$J$$$h$&$K$7$F:FEj9F$7$F$$$?$@$1$k$H$”$j$,e(B  
> e$B$?$$$G$9!#e(B

e$B?=$7Lu$“$j$^$;$s$G$7$?!#e(B  
e$B@\_Dj$r3NG’$7$F!”:FE:IU$7$^$7$?!#e(B

> e$B$“$H!“e(BChangeLoge$B%(%s%H%j$b$$$?$@$1$k$H$9$4$/$h$$$G$9$,!”$3$Ae(B  
> e$B$i$OI,?$G$O$”$j$^$;$s!#e(B

e$B2a5n$Ne(BChangeLoge$B$d!"0J2\<$N%Z!\<%8$Ne(BChangeLoge$B$N9`L$r;29M$K$7$J$,$i=q$$$F$\_$^$7$?!#e(B

[http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=CommitterHowto](http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=CommitterHowto)  
e$B@[$$J8\>O$G$9$,!&!&!&e(B

- array.c (rb\_ary\_{times, shuffle\_bang, sample}):  
removing constant-able macros inside of the loop. a patch from  
Masahiro Kanai (CanI) at [ruby-dev:number]. It was found out  
and fixed at Security and Programming camp 2009.

- string.c (rb\_str\_{times, split\_m}): ditto.

- struct.c (rb\_struct\_{getmember, set, aref\_id, aset\_id},  
{make, inspect}_struct, recursive_{equal, hash, eql}): ditto.

e$B%Q%C%A$O!"0J2\<$G$9!#e(B

— array.c (revision 25052)  
+++ array.c (working copy)  
@@ -2708,8 +2708,8 @@  
static VALUE  
rb\_ary\_times(VALUE ary, VALUE times)  
{

- VALUE ary2, tmp;
- long i, len;

- VALUE ary2, tmp, \*ptr, \*ptr2;

- long i, t, len;

- for (i=0; i\<len; i+=RARRAY\_LEN(ary)) {
- MEMCPY(RARRAY\_PTR(ary2)+i, RARRAY\_PTR(ary), VALUE, RARRAY\_LEN(ary));

- ptr = RARRAY\_PTR(ary);

- ptr2 = RARRAY\_PTR(ary2);

- t = RARRAY\_LEN(ary);

- for (i=0; i\<len; i+=t) {

- MEMCPY(ptr2+i, ptr, VALUE, t);  
}  
out:  
OBJ\_INFECT(ary2, ary);  
@@ -3491,14 +3494,16 @@  
static VALUE  
rb\_ary\_shuffle\_bang(VALUE ary)  
{

- VALUE \*ptr;  
long i = RARRAY\_LEN(ary);

- ptr = RARRAY\_PTR(ary);  
while (i) {  
long j = (long)(rb\_genrand\_real()\*i);

- VALUE tmp = RARRAY\_PTR(ary)[–i];
- RARRAY\_PTR(ary)[i] = RARRAY\_PTR(ary)[j];
- RARRAY\_PTR(ary)[j] = tmp;

- VALUE tmp = ptr[–i];
- ptr[i] = ptr[j];
- ptr[j] = tmp;  
}  
return ary;  
}  
@@ -3576,6 +3581,7 @@  
return rb\_ary\_new3(3, ptr[i], ptr[j], ptr[k]);  
}  
if ((size\_t)n \< sizeof(idx)/sizeof(idx[0])) {
- VALUE \*ptr\_result;  
long sorted[sizeof(idx)/sizeof(idx[0])];  
sorted[0] = idx[0] = (long)(rb\_genrand\_real()\*len);  
for (i=1; i\<n; i++) {  
@@ -3588,18 +3594,21 @@  
sorted[j] = idx[i] = k;  
}  
result = rb\_ary\_new2(n);
- ptr\_result = RARRAY\_PTR(result);  
for (i=0; i\<n; i++) {

- 

```
RARRAY_PTR(result)[i] = RARRAY_PTR(ary)[idx[i]];

```

- 

```
ptr_result[i] = ptr[idx[i]];

```

}  
}  
else {
- VALUE \*ptr\_result;  
result = rb\_ary\_new4(len, ptr);
- ptr\_result = RARRAY\_PTR(result);  
RB\_GC\_GUARD(ary);  
for (i=0; i\<n; i++) {  
j = (long)(rb\_genrand\_real()\*(len-i)) + i;

- 

```
nv = RARRAY_PTR(result)[j];

```

- 

```
RARRAY_PTR(result)[j] = RARRAY_PTR(result)[i];

```

- 

```
RARRAY_PTR(result)[i] = nv;

```

- 

```
nv = ptr_result[j];

```

- 

```
ptr_result[j] = ptr_result[i];

```

- 

```
ptr_result[i] = nv;

```

}  
}  
ARY\_SET\_LEN(result, n);  
— string.c (revision 25052)  
+++ string.c (working copy)  
@@ -1159,6 +1159,7 @@  
{  
VALUE str2;  
long n, len;

- char \*ptr2;

- ptr2 = RSTRING\_PTR(str2);  
if (len) {  
n = RSTRING\_LEN(str);

- 

```
   memcpy(RSTRING_PTR(str2), RSTRING_PTR(str), n);

```

- 

```
   memcpy(ptr2, RSTRING_PTR(str), n);
   while (n <= len/2) {

```

- 

```
       memcpy(RSTRING_PTR(str2) + n, RSTRING_PTR(str2), n);

```

- 

```
       memcpy(ptr2 + n, ptr2, n);
       n *= 2;
   }

```

- 

```
   memcpy(RSTRING_PTR(str2) + n, RSTRING_PTR(str2), len-n);

```

- 

```
   memcpy(ptr2 + n, ptr2, len-n);

```

}

- RSTRING\_PTR(str2)[RSTRING\_LEN(str2)] = ‘\0’;

- ptr2[RSTRING\_LEN(str2)] = ‘\0’;  
OBJ\_INFECT(str2, str);  
rb\_enc\_cr\_str\_copy\_for\_substr(str2, str);

@@ -5701,6 +5703,7 @@  
}  
else if (split\_type == string) {  
char \*ptr = RSTRING\_PTR(str);

- char \*temp = ptr;  
char \*eptr = RSTRING\_END(str);  
char \*sptr = RSTRING\_PTR(spat);  
long slen = RSTRING\_LEN(spat);  
@@ -5720,13 +5723,15 @@  
ptr = t;  
continue;  
}

- 

```
rb_ary_push(result, rb_str_subseq(str, ptr - RSTRING_PTR(str), 

```

end));

- 

```
rb_ary_push(result, rb_str_subseq(str, ptr - temp, end));
ptr += end + slen;
if (!NIL_P(limit) && lim <= ++i) break;

```

}

- beg = ptr - RSTRING\_PTR(str);

- beg = ptr - temp;  
}  
else {
- char \*ptr = RSTRING\_PTR(str);
- long len = RSTRING\_LEN(str);  
long start = beg;  
long idx;  
int last\_null = 0;  
@@ -5735,22 +5740,22 @@  
while ((end = rb\_reg\_search(spat, str, start, 0)) \>= 0) {  
regs = RMATCH\_REGS(rb\_backref\_get());  
if (start == end && BEG(0) == END(0)) {

- if (!RSTRING\_PTR(str)) {

- if (!ptr) {  
rb\_ary\_push(result, rb\_str\_new(“”, 0));  
break;  
}  
else if (last\_null == 1) {  
rb\_ary\_push(result, rb\_str\_subseq(str, beg,

- 

```
       rb_enc_fast_mbclen(RSTRING_PTR(str)+beg,

```

- 

```
     RSTRING_END(str),

```

- 

```
       rb_enc_fast_mbclen(ptr+beg,

```

- 

```
     ptr+len,
     enc)));
 beg = start;

```

}  
else {

- 

```
               if (RSTRING_PTR(str)+start == RSTRING_END(str))

```

- 

```
               if (ptr+start == ptr+len)
                   start++;
               else

```

- 

```
                   start +=

```

rb\_enc\_fast\_mbclen(RSTRING\_PTR(str)+start,RSTRING\_END(str),enc);

- 

```
                   start += 

```

rb\_enc\_fast\_mbclen(ptr+start,ptr+len,enc);  
last\_null = 1;  
continue;  
}  
— struct.c (revision 25052)  
+++ struct.c (working copy)  
@@ -98,14 +98,17 @@  
VALUE  
rb\_struct\_getmember(VALUE obj, ID id)  
{

- VALUE members, slot;
- long i;

- VALUE members, slot, \*ptr, \*ptr\_members;

- long i, len;

- ptr = RSTRUCT\_PTR(obj);  
members = rb\_struct\_members(obj);

- ptr\_members = RARRAY\_PTR(members);  
slot = ID2SYM(id);

- for (i=0; i\<RARRAY\_LEN(members); i++) {
- if (RARRAY\_PTR(members)[i] == slot) {
- 

```
return RSTRUCT_PTR(obj)[i];

```

- len = RARRAY\_LEN(members);
- for (i=0; i\<len; i++) {
- if (ptr\_members[i] == slot) {
- 

```
return ptr[i];

```

}  
}  
rb\_name\_error(id, “%s is not struct member”, rb\_id2name(id));  
@@ -156,15 +159,18 @@  
static VALUE  
rb\_struct\_set(VALUE obj, VALUE val)  
{

- VALUE members, slot;
- long i;

- VALUE members, slot, \*ptr, \*ptr\_members;

- long i, len;

- ptr\_members = RARRAY\_PTR(members);

- len = RARRAY\_LEN(members);  
rb\_struct\_modify(obj);

- for (i=0; i\<RARRAY\_LEN(members); i++) {
- slot = RARRAY\_PTR(members)[i];

- ptr = RSTRUCT\_PTR(obj);
- for (i=0; i\<len; i++) {
- slot = ptr\_members[i];  
if (rb\_id\_attrset(SYM2ID(slot)) == rb\_frame\_this\_func()) {

- 

```
return RSTRUCT_PTR(obj)[i] = val;

```

- 

```
return ptr[i] = val;

```

}  
}  
rb\_name\_error(rb\_frame\_this\_func(), “`%s’ is not a struct member”,  
@@ -175,9 +181,9 @@  
static VALUE  
make\_struct(VALUE name, VALUE members, VALUE klass)  
{

- VALUE nstr;

- VALUE nstr, \*ptr\_members;  
ID id;

- long i;

- long i, len;

- for (i=0; i\< RARRAY\_LEN(members); i++) {
- ID id = SYM2ID(RARRAY\_PTR(members)[i]);

- ptr\_members = RARRAY\_PTR(members);
- len = RARRAY\_LEN(members);
- for (i=0; i\< len; i++) {
- ID id = SYM2ID(ptr\_members[i]);  
if (rb\_is\_local\_id(id) || rb\_is\_const\_id(id)) {  
if (i \< N\_REF\_FUNC) {  
rb\_define\_method\_id(nstr, id, ref\_func[i], 0);  
@@ -498,7 +506,8 @@  
{  
VALUE cname = rb\_class\_name(rb\_obj\_class(s));  
VALUE members, str = rb\_str\_new2("#\<struct ");

- long i;

- VALUE \*ptr, \*ptr\_members;

- long i, len;  
char first = RSTRING\_PTR(cname)[0];

- for (i=0; i\<RSTRUCT\_LEN(s); i++) {

- ptr\_members = RARRAY\_PTR(members);
- ptr = RSTRUCT\_PTR(s);
- len = RSTRUCT\_LEN(s);
- for (i=0; i\<len; i++) {  
VALUE slot;  
ID id;

@@ -519,7 +531,7 @@  
else if (first != ‘#’) {  
rb\_str\_cat2(str, " ");  
}

- slot = RARRAY\_PTR(members)[i];

- slot = ptr\_members[i];  
id = SYM2ID(slot);  
if (rb\_is\_local\_id(id) || rb\_is\_const\_id(id)) {  
rb\_str\_append(str, rb\_id2str(id));  
@@ -528,7 +540,7 @@  
rb\_str\_append(str, rb\_inspect(slot));  
}  
rb\_str\_cat2(str, “=”);

- rb\_str\_append(str, rb\_inspect(RSTRUCT\_PTR(s)[i]));

- rb\_str\_append(str, rb\_inspect(ptr[i]));  
}  
rb\_str\_cat2(str, “\>”);  
OBJ\_INFECT(str, s);  
@@ -588,14 +600,16 @@  
static VALUE  
rb\_struct\_aref\_id(VALUE s, ID id)  
{

- VALUE members;

- VALUE \*ptr, members, \*ptr\_members;  
long i, len;

- ptr = RSTRUCT\_PTR(s);  
members = rb\_struct\_members(s);

- ptr\_members = RARRAY\_PTR(members);  
len = RARRAY\_LEN(members);  
for (i=0; i\<len; i++) {

- if (SYM2ID(RARRAY\_PTR(members)[i]) == id) {
- 

```
return RSTRUCT_PTR(s)[i];

```

- if (SYM2ID(ptr\_members[i]) == id) {
- 

```
return ptr[i];

```

}  
}  
rb\_name\_error(id, “no member ‘%s’ in struct”, rb\_id2name(id));  
@@ -644,19 +658,21 @@  
static VALUE  
rb\_struct\_aset\_id(VALUE s, ID id, VALUE val)  
{

- VALUE members;

- VALUE members, \*ptr, \*ptr\_members;  
long i, len;

- rb\_struct\_modify(s);  
len = RARRAY\_LEN(members);
- if (RSTRUCT\_LEN(s) != RARRAY\_LEN(members)) {

- rb\_struct\_modify(s);
- if (RSTRUCT\_LEN(s) != len) {  
rb\_raise(rb\_eTypeError, “struct size differs (%ld required %ld  
given)”,

- RARRAY\_LEN(members), RSTRUCT\_LEN(s));

- len, RSTRUCT\_LEN(s));  
}
- ptr = RSTRUCT\_PTR(s);
- ptr\_members = RARRAY\_PTR(members);  
for (i=0; i\<len; i++) {

- if (SYM2ID(RARRAY\_PTR(members)[i]) == id) {
- 

```
RSTRUCT_PTR(s)[i] = val;

```

- if (SYM2ID(ptr\_members[i]) == id) {
- 

```
ptr[i] = val;
return val;

```

}  
}  
@@ -771,11 +787,15 @@  
static VALUE  
recursive\_equal(VALUE s, VALUE s2, int recur)  
{

- long i;

- VALUE \*ptr, \*ptr2;

- long i, len;

- for (i=0; i\<RSTRUCT\_LEN(s); i++) {
- if (!rb\_equal(RSTRUCT\_PTR(s)[i], RSTRUCT\_PTR(s2)[i])) return Qfalse;

- ptr = RSTRUCT\_PTR(s);
- ptr2 = RSTRUCT\_PTR(s2);
- len = RSTRUCT\_LEN(s);
- for (i=0; i\<len; i++) {
- if (!rb\_equal(ptr[i], ptr2[i])) return Qfalse;  
}  
return Qtrue;  
}  
@@ -813,14 +833,16 @@  
static VALUE  
recursive\_hash(VALUE s, VALUE dummy, int recur)  
{

- long i;

- long i, len;  
st\_index\_t h;

- VALUE n;

- VALUE n, \*ptr;

- for (i = 0; i \< RSTRUCT\_LEN(s); i++) {
- 

```
n = rb_hash(RSTRUCT_PTR(s)[i]);

```

- ptr = RSTRUCT\_PTR(s);
- len = RSTRUCT\_LEN(s);
- for (i = 0; i \< len; i++) {
- 

```
n = rb_hash(ptr[i]);
h = rb_hash_uint(h, NUM2LONG(n));

```

}  
}  
@@ -844,11 +866,15 @@  
static VALUE  
recursive\_eql(VALUE s, VALUE s2, int recur)  
{

- long i;

- VALUE \*ptr, \*ptr2;

- long i, len;

- for (i=0; i\<RSTRUCT\_LEN(s); i++) {
- if (!rb\_eql(RSTRUCT\_PTR(s)[i], RSTRUCT\_PTR(s2)[i])) return Qfalse;

- ptr = RSTRUCT\_PTR(s);
- ptr2 = RSTRUCT\_PTR(s2);
- len = RSTRUCT\_LEN(s);
- for (i=0; i\<len; i++) {
- if (!rb\_eql(ptr[i], ptr2[i])) return Qfalse;  
}  
return Qtrue;  
}

---

<div class="post-metadata">

**Author:** ![Masahiro\_Kanai\_SCan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/a88e4f/32.png) [@Masahiro\_Kanai\_SCan](https://www.ruby-forum.com/u/Masahiro_Kanai_SCan)\
**Post date:** [October 5, 2009, 4:53pm UTC](https://www.ruby-forum.com/t/re-removing-constant-able-macros-inside-of-the-loop/176367/2 "2009-10-05T16:53:24Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

e$BHt9T5!$NCf$G$9!#EE8;$,;H$($k$N$G2wE,!#e(B

In message “Re: [ruby-dev:39415] Re: Removing constant-able macros  
inside of the loop.”  
on Fri, 2 Oct 2009 00:53:34 +0900, “Masahiro Kanai (CanI)”  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|e$B$"$l$+$i!“MM!9$JJ}K!$r;n$7$^$7$?$,!”$I$&$b$&$^$/Aw?.$G$-$J$$$h$&$J$N$G!"e(B  
|patche$B$NJ8;zNs$re(Bbase64e$B%(%s%3!\<%I$7$?J8;zNs$H!"e(B  
|e$B%Q%C%A$r:$;$?30It%5%$%H$Ne(BURLe$B$rAw$j$^$9!#e(B

e$B$U!\<$`!"$J$s$G@^$jJV$7$A$c$&$s$G$7$g$&$M!#$\*8\_$$$K$H$C$FLLE]e(B  
e$B$J$N$GD\>$;$k$H$h$$$G$9$M!#2a5n$N7P83$+$i$@$He(Btext/plaine$B$H$7$Fe(B  
e$B%Q%C%A$rE:IU%U%!%$%k$K$9$k$H$&$^$/$$$C$?$j$7$^$9!#e(B

|e$B$h$m$7$/$\*4j$$$$$?$7$^$9!#e(B

e$B\<h$j9~$\_$^$7$?!#e(B

---

<div class="post-metadata">

**Author:** ![Masahiro\_Kanai\_SCan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/a88e4f/32.png) [@Masahiro\_Kanai\_SCan](https://www.ruby-forum.com/u/Masahiro_Kanai_SCan)\
**Post date:** [October 1, 2009, 5:54pm UTC](https://www.ruby-forum.com/t/re-removing-constant-able-macros-inside-of-the-loop/176367/3 "2009-10-01T17:54:17Z")

</div>

e$B6b0f$G$9!#e(B

2009e$BG/e(B9e$B7ne(B30e$BF|e(B1:04 Masahiro Kanai (CanI)  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$B@\_Dj$r3NG’$7$F!":FE:IU$7$^$7$?!#e(B

e$B?=$7Lu$"$j$^$;$s!#e(B  
e$B@hF|!“AwIU$7$?%Q%C%A$G$9$,!”:F$Se(Bfolde$B$5$l$F$$$k$3$H$r3NG’$7$^$7$?!#e(B  
e$B$3$A$i$N%a!\<%i!\<$NAw?.:Q%a!\<%k$N9`L$G$O!"e(Bfolde$B$5$l$F$$$J$+$C$?$?$a!"e(B  
e$BL}CG$7$F$$$^$7$?!#e(B

e$B$"$l$+$i!“MM!9$JJ}K!$r;n$7$^$7$?$,!”$I$&$b$&$^$/Aw?.$G$-$J$$$h$&$J$N$G!"e(B  
patche$B$NJ8;zNs$re(Bbase64e$B%(%s%3!\<%I$7$?J8;zNs$H!"e(B  
e$B%Q%C%A$r:$;$?30It%5%$%H$Ne(BURLe$B$rAw$j$^$9!#e(B

e$B$h$m$7$/$\*4j$$$$$?$7$^$9!#e(B

[http://www.friendpaste.com/4x9n0ORQbUxewOQsvnRUcj](http://www.friendpaste.com/4x9n0ORQbUxewOQsvnRUcj)

Ci0tLSBhcnJheS5jCShyZXZpc2lvbiAyNTA1MikKKysrIGFycmF5LmMJKHdvcmtpbmcgY2  
9weSkKQEAgLTI3MDgsOCArMjcwOCw4IEBACiBzdGF0aWMgVkFMVUUKIHJiX2FyeV90aW1l  
cyhWQUxVRSBhcnksIFZBTFVFIHRpbWVzKQogewotICAgIFZBTFVFIGFyeTIsIHRtcDsKLS  
AgICBsb25nIGksIGxlbjsKKyAgICBWQUxVRSBhcnkyLCB0bXAsICpwdHIsICpwdHIyOwor  
ICAgIGxvbmcgaSwgdCwgbGVuOwoKICAgICB0bXAgPSByYl9jaGVja19zdHJpbmdfdHlwZS  
h0aW1lcyk7CiAgICAgaWYgKCFOSUxfUCh0bXApKSB7CkBAIC0yNzMyLDggKzI3MzIsMTEg  
QEAKICAgICBhcnkyID0gYXJ5X25ldyhyYl9vYmpfY2xhc3MoYXJ5KSwgbGVuKTsKICAgIC  
BBUllfU0VUX0xFTihhcnkyLCBsZW4pOwoKLSAgICBmb3IgKGk9MDsgaTxsZW47IGkrPVJB  
UlJBWV9MRU4oYXJ5KSkgewotCU1FTUNQWShSQVJSQVlfUFRSKGFyeTIpK2ksIFJBUlJBWV  
9QVFIoYXJ5KSwgVkFMVUUsIFJBUlJBWV9MRU4oYXJ5KSk7CisgICAgcHRyID0gUkFSUkFZ  
X1BUUihhcnkpOworICAgIHB0cjIgPSBSQVJSQVlfUFRSKGFyeTIpOworICAgIHQgPSBSQV  
JSQVlfTEVOKGFyeSk7CisgICAgZm9yIChpPTA7IGk8bGVuOyBpKz10KSB7CisJTUVNQ1BZ  
KHB0cjIraSwgcHRyLCBWQUxVRSwgdCk7CiAgICAgfQogICBvdXQ6CiAgICAgT0JKX0lORk  
VDVChhcnkyLCBhcnkpOwpAQCAtMzQ5MSwxNCArMzQ5NCwxNiBAQAogc3RhdGljIFZBTFVF  
CiByYl9hcnlfc2h1ZmZsZV9iYW5nKFZBTFVFIGFyeSkKIHsKKyAgICBWQUxVRSAqcHRyOw  
ogICAgIGxvbmcgaSA9IFJBUlJBWV9MRU4oYXJ5KTsKCiAgICAgcmJfYXJ5X21vZGlmeShh  
cnkpOworICAgIHB0ciA9IFJBUlJBWV9QVFIoYXJ5KTsKICAgICB3aGlsZSAoaSkgewogCW  
xvbmcgaiA9IChsb25nKShyYl9nZW5yYW5kX3JlYWwoKSppKTsKLQlWQUxVRSB0bXAgPSBS  
QVJSQVlfUFRSKGFyeSlbLS1pXTsKLQlSQVJSQVlfUFRSKGFyeSlbaV0gPSBSQVJSQVlfUF  
RSKGFyeSlbal07Ci0JUkFSUkFZX1BUUihhcnkpW2pdID0gdG1wOworCVZBTFVFIHRtcCA9  
IHB0clstLWldOworCXB0cltpXSA9IHB0cltqXTsKKwlwdHJbal0gPSB0bXA7CiAgICAgfQ  
ogICAgIHJldHVybiBhcnk7CiB9CkBAIC0zNTc2LDYgKzM1ODEsNyBAQAogCXJldHVybiBy  
Yl9hcnlfbmV3MygzLCBwdHJbaV0sIHB0cltqXSwgcHRyW2tdKTsKICAgICB9CiAgICAgaW  
YgKChzaXplX3QpbiA8IHNpemVvZihpZHgpL3NpemVvZihpZHhbMF0pKSB7CisJVkFMVUUg  
KnB0cl9yZXN1bHQ7CiAJbG9uZyBzb3J0ZWRbc2l6ZW9mKGlkeCkvc2l6ZW9mKGlkeFswXS  
ldOwogCXNvcnRlZFswXSA9IGlkeFswXSA9IChsb25nKShyYl9nZW5yYW5kX3JlYWwoKSps  
ZW4pOwogCWZvciAoaT0xOyBpPG47IGkrKykgewpAQCAtMzU4OCwxOCArMzU5NCwyMSBAQA  
ogCSAgICBzb3J0ZWRbal0gPSBpZHhbaV0gPSBrOwogCX0KIAlyZXN1bHQgPSByYl9hcnlf  
bmV3MihuKTsKKwlwdHJfcmVzdWx0ID0gUkFSUkFZX1BUUihyZXN1bHQpOwogCWZvciAoaT  
0wOyBpPG47IGkrKykgewotCSAgICBSQVJSQVlfUFRSKHJlc3VsdClbaV0gPSBSQVJSQVlf  
UFRSKGFyeSlbaWR4W2ldXTsKKwkgICAgcHRyX3Jlc3VsdFtpXSA9IHB0cltpZHhbaV1dOw  
ogCX0KICAgICB9CiAgICAgZWxzZSB7CisJVkFMVUUgKnB0cl9yZXN1bHQ7CiAJcmVzdWx0  
ID0gcmJfYXJ5X25ldzQobGVuLCBwdHIpOworCXB0cl9yZXN1bHQgPSBSQVJSQVlfUFRSKH  
Jlc3VsdCk7CiAJUkJfR0NfR1VBUkQoYXJ5KTsKIAlmb3IgKGk9MDsgaTxuOyBpKyspIHsK  
IAkgICAgaiA9IChsb25nKShyYl9nZW5yYW5kX3JlYWwoKSoobGVuLWkpKSArIGk7Ci0JIC  
AgIG52ID0gUkFSUkFZX1BUUihyZXN1bHQpW2pdOwotCSAgICBSQVJSQVlfUFRSKHJlc3Vs  
dClbal0gPSBSQVJSQVlfUFRSKHJlc3VsdClbaV07Ci0JICAgIFJBUlJBWV9QVFIocmVzdW  
x0KVtpXSA9IG52OworCSAgICBudiA9IHB0cl9yZXN1bHRbal07CisJICAgIHB0cl9yZXN1  
bHRbal0gPSBwdHJfcmVzdWx0W2ldOworCSAgICBwdHJfcmVzdWx0W2ldID0gbnY7CiAJfQ  
ogICAgIH0KICAgICBBUllfU0VUX0xFTihyZXN1bHQsIG4pOwotLS0gc3RyaW5nLmMJKHJl  
dmlzaW9uIDI1MDUyKQorKysgc3RyaW5nLmMJKHdvcmtpbmcgY29weSkKQEAgLTExNTksNi  
ArMTE1OSw3IEBACiB7CiAgICAgVkFMVUUgc3RyMjsKICAgICBsb25nIG4sIGxlbjsKKyAg  
ICBjaGFyICpwdHIyOwoKICAgICBsZW4gPSBOVU0yTE9ORyh0aW1lcyk7CiAgICAgaWYgKG  
xlbiA8IDApIHsKQEAgLTExNjksMTYgKzExNzAsMTcgQEAKICAgICB9CgogICAgIHN0cjIg  
PSByYl9zdHJfbmV3NShzdHIsIDAsIGxlbiAqPSBSU1RSSU5HX0xFTihzdHIpKTsKKyAgIC  
BwdHIyID0gUlNUUklOR19QVFIoc3RyMik7CiAgICAgaWYgKGxlbikgewogICAgICAgICBu  
ID0gUlNUUklOR19MRU4oc3RyKTsKLSAgICAgICAgbWVtY3B5KFJTVFJJTkdfUFRSKHN0cj  
IpLCBSU1RSSU5HX1BUUihzdHIpLCBuKTsKKyAgICAgICAgbWVtY3B5KHB0cjIsIFJTVFJJ  
TkdfUFRSKHN0ciksIG4pOwogICAgICAgICB3aGlsZSAobiA8PSBsZW4vMikgewotICAgIC  
AgICAgICAgbWVtY3B5KFJTVFJJTkdfUFRSKHN0cjIpICsgbiwgUlNUUklOR19QVFIoc3Ry  
MiksIG4pOworICAgICAgICAgICAgbWVtY3B5KHB0cjIgKyBuLCBwdHIyLCBuKTsKICAgIC  
AgICAgICAgIG4gKj0gMjsKICAgICAgICAgfQotICAgICAgICBtZW1jcHkoUlNUUklOR19Q  
VFIoc3RyMikgKyBuLCBSU1RSSU5HX1BUUihzdHIyKSwgbGVuLW4pOworICAgICAgICBtZW  
1jcHkocHRyMiArIG4sIHB0cjIsIGxlbi1uKTsKICAgICB9Ci0gICAgUlNUUklOR19QVFIo  
c3RyMilbUlNUUklOR19MRU4oc3RyMildID0gJ1wwJzsKKyAgICBwdHIyW1JTVFJJTkdfTE  
VOKHN0cjIpXSA9ICdcMCc7CiAgICAgT0JKX0lORkVDVChzdHIyLCBzdHIpOwogICAgIHJi  
X2VuY19jcl9zdHJfY29weV9mb3Jfc3Vic3RyKHN0cjIsIHN0cik7CgpAQCAtNTcwMSw2IC  
s1NzAzLDcgQEAKICAgICB9CiAgICAgZWxzZSBpZiAoc3BsaXRfdHlwZSA9PSBzdHJpbmcp  
IHsKIAljaGFyICpwdHIgPSBSU1RSSU5HX1BUUihzdHIpOworCWNoYXIgKnRlbXAgPSBwdH  
I7CiAJY2hhciAqZXB0ciA9IFJTVFJJTkdfRU5EKHN0cik7CiAJY2hhciAqc3B0ciA9IFJT  
VFJJTkdfUFRSKHNwYXQpOwogCWxvbmcgc2xlbiA9IFJTVFJJTkdfTEVOKHNwYXQpOwpAQC  
AtNTcyMCwxMyArNTcyMywxNSBAQAogCQlwdHIgPSB0OwogCQljb250aW51ZTsKIAkgICAg  
fQotCSAgICByYl9hcnlfcHVzaChyZXN1bHQsIHJiX3N0cl9zdWJzZXEoc3RyLCBwdHIgLS  
BSU1RSSU5HX1BUUihzdHIpLCBlbmQpKTsKKwkgICAgcmJfYXJ5X3B1c2gocmVzdWx0LCBy  
Yl9zdHJfc3Vic2VxKHN0ciwgcHRyIC0gdGVtcCwgZW5kKSk7CiAJICAgIHB0ciArPSBlbm  
QgKyBzbGVuOwogCSAgICBpZiAoIU5JTF9QKGxpbWl0KSAmJiBsaW0gPD0gKytpKSBicmVh  
azsKIAl9Ci0JYmVnID0gcHRyIC0gUlNUUklOR19QVFIoc3RyKTsKKwliZWcgPSBwdHIgLS  
B0ZW1wOwogICAgIH0KICAgICBlbHNlIHsKKwljaGFyICpwdHIgPSBSU1RSSU5HX1BUUihz  
dHIpOworCWxvbmcgbGVuID0gUlNUUklOR19MRU4oc3RyKTsKIAlsb25nIHN0YXJ0ID0gYm  
VnOwogCWxvbmcgaWR4OwogCWludCBsYXN0X251bGwgPSAwOwpAQCAtNTczNSwyMiArNTc0  
MCwyMiBAQAogCXdoaWxlICgoZW5kID0gcmJfcmVnX3NlYXJjaChzcGF0LCBzdHIsIHN0YX  
J0LCAwKSkgPj0gMCkgewogCSAgICByZWdzID0gUk1BVENIX1JFR1MocmJfYmFja3JlZl9n  
ZXQoKSk7CiAJICAgIGlmIChzdGFydCA9PSBlbmQgJiYgQkVHKDApID09IEVORCgwKSkgew  
otCQlpZiAoIVJTVFJJTkdfUFRSKHN0cikpIHsKKwkJaWYgKCFwdHIpIHsKIAkJICAgIHJi  
X2FyeV9wdXNoKHJlc3VsdCwgcmJfc3RyX25ldygiIiwgMCkpOwogCQkgICAgYnJlYWs7Ci  
AJCX0KIAkJZWxzZSBpZiAobGFzdF9udWxsID09IDEpIHsKIAkJICAgIHJiX2FyeV9wdXNo  
KHJlc3VsdCwgcmJfc3RyX3N1YnNlcShzdHIsIGJlZywKLQkJCQkJCSAgICAgIHJiX2VuY1  
9mYXN0X21iY2xlbihSU1RSSU5HX1BUUihzdHIpK2JlZywKLQkJCQkJCQkJCSBSU1RSSU5H  
X0VORChzdHIpLAorCQkJCQkJICAgICAgcmJfZW5jX2Zhc3RfbWJjbGVuKHB0citiZWcsCi  
sJCQkJCQkJCQkgcHRyK2xlbiwKIAkJCQkJCQkJCSBlbmMpKSk7CiAJCSAgICBiZWcgPSBz  
dGFydDsKIAkJfQogCQllbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJTVFJJTk  
dfUFRSKHN0cikrc3RhcnQgPT0gUlNUUklOR19FTkQoc3RyKSkKKyAgICAgICAgICAgICAg  
ICAgICAgaWYgKHB0citzdGFydCA9PSBwdHIrbGVuKQogICAgICAgICAgICAgICAgICAgIC  
AgICAgc3RhcnQrKzsKICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg  
ICAgICAgICAgICAgc3RhcnQgKz0gcmJfZW5jX2Zhc3RfbWJjbGVuKFJTVFJJTkdfUFRSKH  
N0cikrc3RhcnQsUlNUUklOR19FTkQoc3RyKSxlbmMpOworICAgICAgICAgICAgICAgICAg  
ICAgICAgc3RhcnQgKz0gcmJfZW5jX2Zhc3RfbWJjbGVuKHB0citzdGFydCxwdHIrbGVuLG  
VuYyk7CiAJCSAgICBsYXN0X251bGwgPSAxOwogCQkgICAgY29udGludWU7CiAJCX0KLS0t  
IHN0cnVjdC5jCShyZXZpc2lvbiAyNTA1MikKKysrIHN0cnVjdC5jCSh3b3JraW5nIGNvcH  
kpCkBAIC05OCwxNCArOTgsMTcgQEAKIFZBTFVFCiByYl9zdHJ1Y3RfZ2V0bWVtYmVyKFZB  
TFVFIG9iaiwgSUQgaWQpCiB7Ci0gICAgVkFMVUUgbWVtYmVycywgc2xvdDsKLSAgICBsb2  
5nIGk7CisgICAgVkFMVUUgbWVtYmVycywgc2xvdCwgKnB0ciwgKnB0cl9tZW1iZXJzOwor  
ICAgIGxvbmcgaSwgbGVuOwoKKyAgICBwdHIgPSBSU1RSVUNUX1BUUihvYmopOwogICAgIG  
1lbWJlcnMgPSByYl9zdHJ1Y3RfbWVtYmVycyhvYmopOworICAgIHB0cl9tZW1iZXJzID0g  
UkFSUkFZX1BUUihtZW1iZXJzKTsKICAgICBzbG90ID0gSUQyU1lNKGlkKTsKLSAgICBmb3  
IgKGk9MDsgaTxSQVJSQVlfTEVOKG1lbWJlcnMpOyBpKyspIHsKLQlpZiAoUkFSUkFZX1BU  
UihtZW1iZXJzKVtpXSA9PSBzbG90KSB7Ci0JICAgIHJldHVybiBSU1RSVUNUX1BUUihvYm  
opW2ldOworICAgIGxlbiA9IFJBUlJBWV9MRU4obWVtYmVycyk7CisgICAgZm9yIChpPTA7  
IGk8bGVuOyBpKyspIHsKKwlpZiAocHRyX21lbWJlcnNbaV0gPT0gc2xvdCkgeworCSAgIC  
ByZXR1cm4gcHRyW2ldOwogCX0KICAgICB9CiAgICAgcmJfbmFtZV9lcnJvcihpZCwgIiVz  
IGlzIG5vdCBzdHJ1Y3QgbWVtYmVyIiwgcmJfaWQybmFtZShpZCkpOwpAQCAtMTU2LDE1IC  
sxNTksMTggQEAKIHN0YXRpYyBWQUxVRQogcmJfc3RydWN0X3NldChWQUxVRSBvYmosIFZB  
TFVFIHZhbCkKIHsKLSAgICBWQUxVRSBtZW1iZXJzLCBzbG90OwotICAgIGxvbmcgaTsKKy  
AgICBWQUxVRSBtZW1iZXJzLCBzbG90LCAqcHRyLCAqcHRyX21lbWJlcnM7CisgICAgbG9u  
ZyBpLCBsZW47CgogICAgIG1lbWJlcnMgPSByYl9zdHJ1Y3RfbWVtYmVycyhvYmopOworIC  
AgIHB0cl9tZW1iZXJzID0gUkFSUkFZX1BUUihtZW1iZXJzKTsKKyAgICBsZW4gPSBSQVJS  
QVlfTEVOKG1lbWJlcnMpOwogICAgIHJiX3N0cnVjdF9tb2RpZnkob2JqKTsKLSAgICBmb3  
IgKGk9MDsgaTxSQVJSQVlfTEVOKG1lbWJlcnMpOyBpKyspIHsKLQlzbG90ID0gUkFSUkFZ  
X1BUUihtZW1iZXJzKVtpXTsKKyAgICBwdHIgPSBSU1RSVUNUX1BUUihvYmopOworICAgIG  
ZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJc2xvdCA9IHB0cl9tZW1iZXJzW2ldOwogCWlm  
IChyYl9pZF9hdHRyc2V0KFNZTTJJRChzbG90KSkgPT0gcmJfZnJhbWVfdGhpc19mdW5jKC  
kpIHsKLQkgICAgcmV0dXJuIFJTVFJVQ1RfUFRSKG9iailbaV0gPSB2YWw7CisJICAgIHJl  
dHVybiBwdHJbaV0gPSB2YWw7CiAJfQogICAgIH0KICAgICByYl9uYW1lX2Vycm9yKHJiX2  
ZyYW1lX3RoaXNfZnVuYygpLCAiYCVzJyBpcyBub3QgYSBzdHJ1Y3QgbWVtYmVyIiwKQEAg  
LTE3NSw5ICsxODEsOSBAQAogc3RhdGljIFZBTFVFCiBtYWtlX3N0cnVjdChWQUxVRSBuYW  
1lLCBWQUxVRSBtZW1iZXJzLCBWQUxVRSBrbGFzcykKIHsKLSAgICBWQUxVRSBuc3RyOwor  
ICAgIFZBTFVFIG5zdHIsICpwdHJfbWVtYmVyczsKICAgICBJRCBpZDsKLSAgICBsb25nIG  
k7CisgICAgbG9uZyBpLCBsZW47CgogICAgIE9CSl9GUkVFWkUobWVtYmVycyk7CiAgICAg  
aWYgKE5JTF9QKG5hbWUpKSB7CkBAIC0yMDQsOCArMjEwLDEwIEBACiAgICAgcmJfZGVmaW  
5lX3NpbmdsZXRvbl9tZXRob2QobnN0ciwgIm5ldyIsIHJiX2NsYXNzX25ld19pbnN0YW5j  
ZSwgLTEpOwogICAgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKG5zdHIsICJbXSIsIH  
JiX2NsYXNzX25ld19pbnN0YW5jZSwgLTEpOwogICAgIHJiX2RlZmluZV9zaW5nbGV0b25f  
bWV0aG9kKG5zdHIsICJtZW1iZXJzIiwgcmJfc3RydWN0X3NfbWVtYmVyc19tLCAwKTsKLS  
AgICBmb3IgKGk9MDsgaTwgUkFSUkFZX0xFTihtZW1iZXJzKTsgaSsrKSB7Ci0JSUQgaWQg  
PSBTWU0ySUQoUkFSUkFZX1BUUihtZW1iZXJzKVtpXSk7CisgICAgcHRyX21lbWJlcnMgPS  
BSQVJSQVlfUFRSKG1lbWJlcnMpOworICAgIGxlbiA9IFJBUlJBWV9MRU4obWVtYmVycyk7  
CisgICAgZm9yIChpPTA7IGk8IGxlbjsgaSsrKSB7CisJSUQgaWQgPSBTWU0ySUQocHRyX2  
1lbWJlcnNbaV0pOwogCWlmIChyYl9pc19sb2NhbF9pZChpZCkgfHwgcmJfaXNfY29uc3Rf  
aWQoaWQpKSB7CiAJICAgIGlmIChpIDwgTl9SRUZfRlVOQykgewogCQlyYl9kZWZpbmVfbW  
V0aG9kX2lkKG5zdHIsIGlkLCByZWZfZnVuY1tpXSwgMCk7CkBAIC00OTgsNyArNTA2LDgg  
QEAKIHsKICAgICBWQUxVRSBjbmFtZSA9IHJiX2NsYXNzX25hbWUocmJfb2JqX2NsYXNzKH  
MpKTsKICAgICBWQUxVRSBtZW1iZXJzLCBzdHIgPSByYl9zdHJfbmV3MigiIzxzdHJ1Y3Qg  
Iik7Ci0gICAgbG9uZyBpOworICAgIFZBTFVFICpwdHIsICpwdHJfbWVtYmVyczsKKyAgIC  
Bsb25nIGksIGxlbjsKICAgICBjaGFyIGZpcnN0ID0gUlNUUklOR19QVFIoY25hbWUpWzBd  
OwoKICAgICBpZiAocmVjdXIgfHwgZmlyc3QgIT0gJyMnKSB7CkBAIC01MDksNyArNTE4LD  
EwIEBACiAgICAgfQoKICAgICBtZW1iZXJzID0gcmJfc3RydWN0X21lbWJlcnMocyk7Ci0g  
ICAgZm9yIChpPTA7IGk8UlNUUlVDVF9MRU4ocyk7IGkrKykgeworICAgIHB0cl9tZW1iZX  
JzID0gUkFSUkFZX1BUUihtZW1iZXJzKTsKKyAgICBwdHIgPSBSU1RSVUNUX1BUUihzKTsK  
KyAgICBsZW4gPSBSU1RSVUNUX0xFTihzKTsKKyAgICBmb3IgKGk9MDsgaTxsZW47IGkrKy  
kgewogCVZBTFVFIHNsb3Q7CiAJSUQgaWQ7CgpAQCAtNTE5LDcgKzUzMSw3IEBACiAJZWxz  
ZSBpZiAoZmlyc3QgIT0gJyMnKSB7CiAJICAgIHJiX3N0cl9jYXQyKHN0ciwgIiAiKTsKIA  
l9Ci0Jc2xvdCA9IFJBUlJBWV9QVFIobWVtYmVycylbaV07CisJc2xvdCA9IHB0cl9tZW1i  
ZXJzW2ldOwogCWlkID0gU1lNMklEKHNsb3QpOwogCWlmIChyYl9pc19sb2NhbF9pZChpZC  
kgfHwgcmJfaXNfY29uc3RfaWQoaWQpKSB7CiAJICAgIHJiX3N0cl9hcHBlbmQoc3RyLCBy  
Yl9pZDJzdHIoaWQpKTsKQEAgLTUyOCw3ICs1NDAsNyBAQAogCSAgICByYl9zdHJfYXBwZW  
5kKHN0ciwgcmJfaW5zcGVjdChzbG90KSk7CiAJfQogCXJiX3N0cl9jYXQyKHN0ciwgIj0i  
KTsKLQlyYl9zdHJfYXBwZW5kKHN0ciwgcmJfaW5zcGVjdChSU1RSVUNUX1BUUihzKVtpXS  
kpOworCXJiX3N0cl9hcHBlbmQoc3RyLCByYl9pbnNwZWN0KHB0cltpXSkpOwogICAgIH0K  
ICAgICByYl9zdHJfY2F0MihzdHIsICI+Iik7CiAgICAgT0JKX0lORkVDVChzdHIsIHMpOw  
pAQCAtNTg4LDE0ICs2MDAsMTYgQEAKIHN0YXRpYyBWQUxVRQogcmJfc3RydWN0X2FyZWZf  
aWQoVkFMVUUgcywgSUQgaWQpCiB7Ci0gICAgVkFMVUUgbWVtYmVyczsKKyAgICBWQUxVRS  
AqcHRyLCBtZW1iZXJzLCAqcHRyX21lbWJlcnM7CiAgICAgbG9uZyBpLCBsZW47CgorICAg  
IHB0ciA9IFJTVFJVQ1RfUFRSKHMpOwogICAgIG1lbWJlcnMgPSByYl9zdHJ1Y3RfbWVtYm  
VycyhzKTsKKyAgICBwdHJfbWVtYmVycyA9IFJBUlJBWV9QVFIobWVtYmVycyk7CiAgICAg  
bGVuID0gUkFSUkFZX0xFTihtZW1iZXJzKTsKICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKy  
kgewotCWlmIChTWU0ySUQoUkFSUkFZX1BUUihtZW1iZXJzKVtpXSkgPT0gaWQpIHsKLQkg  
ICAgcmV0dXJuIFJTVFJVQ1RfUFRSKHMpW2ldOworCWlmIChTWU0ySUQocHRyX21lbWJlcn  
NbaV0pID09IGlkKSB7CisJICAgIHJldHVybiBwdHJbaV07CiAJfQogICAgIH0KICAgICBy  
Yl9uYW1lX2Vycm9yKGlkLCAibm8gbWVtYmVyICclcycgaW4gc3RydWN0IiwgcmJfaWQybm  
FtZShpZCkpOwpAQCAtNjQ0LDE5ICs2NTgsMjEgQEAKIHN0YXRpYyBWQUxVRQogcmJfc3Ry  
dWN0X2FzZXRfaWQoVkFMVUUgcywgSUQgaWQsIFZBTFVFIHZhbCkKIHsKLSAgICBWQUxVRS  
BtZW1iZXJzOworICAgIFZBTFVFIG1lbWJlcnMsICpwdHIsICpwdHJfbWVtYmVyczsKICAg  
ICBsb25nIGksIGxlbjsKCiAgICAgbWVtYmVycyA9IHJiX3N0cnVjdF9tZW1iZXJzKHMpOw  
otICAgIHJiX3N0cnVjdF9tb2RpZnkocyk7CiAgICAgbGVuID0gUkFSUkFZX0xFTihtZW1i  
ZXJzKTsKLSAgICBpZiAoUlNUUlVDVF9MRU4ocykgIT0gUkFSUkFZX0xFTihtZW1iZXJzKS  
kgeworICAgIHJiX3N0cnVjdF9tb2RpZnkocyk7CisgICAgaWYgKFJTVFJVQ1RfTEVOKHMp  
ICE9IGxlbikgewogCXJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJzdHJ1Y3Qgc2l6ZSBkaW  
ZmZXJzICglbGQgcmVxdWlyZWQgJWxkIGdpdmVuKSIsCi0JCSBSQVJSQVlfTEVOKG1lbWJl  
cnMpLCBSU1RSVUNUX0xFTihzKSk7CisJCSBsZW4sIFJTVFJVQ1RfTEVOKHMpKTsKICAgIC  
B9CisgICAgcHRyID0gUlNUUlVDVF9QVFIocyk7CisgICAgcHRyX21lbWJlcnMgPSBSQVJS  
QVlfUFRSKG1lbWJlcnMpOwogICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKSB7Ci0JaWYgKF  
NZTTJJRChSQVJSQVlfUFRSKG1lbWJlcnMpW2ldKSA9PSBpZCkgewotCSAgICBSU1RSVUNU  
X1BUUihzKVtpXSA9IHZhbDsKKwlpZiAoU1lNMklEKHB0cl9tZW1iZXJzW2ldKSA9PSBpZC  
kgeworCSAgICBwdHJbaV0gPSB2YWw7CiAJICAgIHJldHVybiB2YWw7CiAJfQogICAgIH0K  
QEAgLTc3MSwxMSArNzg3LDE1IEBACiBzdGF0aWMgVkFMVUUKIHJlY3Vyc2l2ZV9lcXVhbC  
hWQUxVRSBzLCBWQUxVRSBzMiwgaW50IHJlY3VyKQogewotICAgIGxvbmcgaTsKKyAgICBW  
QUxVRSAqcHRyLCAqcHRyMjsKKyAgICBsb25nIGksIGxlbjsKCiAgICAgaWYgKHJlY3VyKS  
ByZXR1cm4gUXRydWU7IC8qIFN1YnRsZSEgKi8KLSAgICBmb3IgKGk9MDsgaTxSU1RSVUNU  
X0xFTihzKTsgaSsrKSB7Ci0JaWYgKCFyYl9lcXVhbChSU1RSVUNUX1BUUihzKVtpXSwgUl  
NUUlVDVF9QVFIoczIpW2ldKSkgcmV0dXJuIFFmYWxzZTsKKyAgICBwdHIgPSBSU1RSVUNU  
X1BUUihzKTsKKyAgICBwdHIyID0gUlNUUlVDVF9QVFIoczIpOworICAgIGxlbiA9IFJTVF  
JVQ1RfTEVOKHMpOworICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJaWYgKCFyYl9l  
cXVhbChwdHJbaV0sIHB0cjJbaV0pKSByZXR1cm4gUWZhbHNlOwogICAgIH0KICAgICByZX  
R1cm4gUXRydWU7CiB9CkBAIC04MTMsMTQgKzgzMywxNiBAQAogc3RhdGljIFZBTFVFCiBy  
ZWN1cnNpdmVfaGFzaChWQUxVRSBzLCBWQUxVRSBkdW1teSwgaW50IHJlY3VyKQogewotIC  
AgIGxvbmcgaTsKKyAgICBsb25nIGksIGxlbjsKICAgICBzdF9pbmRleF90IGg7Ci0gICAg  
VkFMVUUgbjsKKyAgICBWQUxVRSBuLCAqcHRyOwoKICAgICBoID0gcmJfaGFzaF9zdGFydC  
hyYl9oYXNoKHJiX29ial9jbGFzcyhzKSkpOwogICAgIGlmICghcmVjdXIpIHsKLQlmb3Ig  
KGkgPSAwOyBpIDwgUlNUUlVDVF9MRU4ocyk7IGkrKykgewotCSAgICBuID0gcmJfaGFzaC  
hSU1RSVUNUX1BUUihzKVtpXSk7CisJcHRyID0gUlNUUlVDVF9QVFIocyk7CisJbGVuID0g  
UlNUUlVDVF9MRU4ocyk7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJICAgIG  
4gPSByYl9oYXNoKHB0cltpXSk7CiAJICAgIGggPSByYl9oYXNoX3VpbnQoaCwgTlVNMkxP  
TkcobikpOwogCX0KICAgICB9CkBAIC04NDQsMTEgKzg2NiwxNSBAQAogc3RhdGljIFZBTF  
VFCiByZWN1cnNpdmVfZXFsKFZBTFVFIHMsIFZBTFVFIHMyLCBpbnQgcmVjdXIpCiB7Ci0g  
ICAgbG9uZyBpOworICAgIFZBTFVFICpwdHIsICpwdHIyOworICAgIGxvbmcgaSwgbGVuOw  
oKICAgICBpZiAocmVjdXIpIHJldHVybiBRdHJ1ZTsgLyogU3VidGxlISAqLwotICAgIGZv  
ciAoaT0wOyBpPFJTVFJVQ1RfTEVOKHMpOyBpKyspIHsKLQlpZiAoIXJiX2VxbChSU1RSVU  
NUX1BUUihzKVtpXSwgUlNUUlVDVF9QVFIoczIpW2ldKSkgcmV0dXJuIFFmYWxzZTsKKyAg  
ICBwdHIgPSBSU1RSVUNUX1BUUihzKTsKKyAgICBwdHIyID0gUlNUUlVDVF9QVFIoczIpOw  
orICAgIGxlbiA9IFJTVFJVQ1RfTEVOKHMpOworICAgIGZvciAoaT0wOyBpPGxlbjsgaSsr  
KSB7CisJaWYgKCFyYl9lcWwocHRyW2ldLCBwdHIyW2ldKSkgcmV0dXJuIFFmYWxzZTsKIC  
AgICB9CiAgICAgcmV0dXJuIFF0cnVlOwogfQo=
