Some thoughts

Evgeniy Shtrenyov <[email protected]> Sun, 13 Dec 2020 14:15:32 +0300
Newsgroups gmane.network.siproxd
Message-ID <20201213141532.5cec340b@shtren>
--MP_/tPp.QEg0g7a5HXMVYtA2CuH
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Hello,

I'm using siproxd for some years and I have some ideas about it. May be
some of them will be useful, may be not. May be I'm wrong somewhere. I
wrote some plugins to siproxd and I want to tell about some of them.
I'm using Internet Service Provider (ISP) with hard NAT, so I'm using
STUN plugin to fix addresses in connections with PBX. But because of
ISP NAT I've got another kinds of problems.

First problem is loosing NAT port for incoming traffic because of rare
exchange. This problem persists in SIP UDP traffic exchange between
siproxd and PBX where usual traffic is (re-)registration traffic with
some packets per minutes. Nearly 30-45 seconds after absence of packet
exchange ISP NAT "forgets" about traffic transferring between external
port and local port, so all incoming packet will be lost. This problem
causes loosing INVITE packets, loosing incoming calls. I wrote small
plugin called "plugin_keepalive" which just sends UDP packets with
"\r\n\r\n". RFC 5626 includes similar keep-alive for TCP, but not for
UDP, so this method is non-standart. But in practice I've seen phones
with this kind of keep-alive: Siemens Gigaset C610A DECT Base sends
these packets. As I remember some of servers answered with "\r\n" for
these packets (may be "ekiga" did that?). I've added such "pinging" for
local clients (telephones), because of firewalls. I've configured
firewall on internal interface for host with siproxd just for incoming
packet exchange with remembering state, but not outgouing. It's usefull
if someone hacks siproxd - it will not get permission to scan whole
network. But to keep firewall exchange state it is have to make any
exchange for some time. There is one problem with this plugin. I have
not found any way how to select only UDP servers/clients from siproxd
structures, excluding TCP. I have not worked with TCP client/servers at
all, but it looks like that this plugin will send UDP "pings" for all
defined hosts.

Second problem caused by ISP NAT is local call loops for RTP. When I'm
trying to call from one telephone to another, call goes to siproxd and
to SIP PBX. SIP PBX sends call to siproxd again and to called local
telephone. At first point of view it looks good. But STUN plugin and/or
SIP PBX changes RTP media IP address to external IP address (Internet
IP address), so siproxd have to send RTP traffic to external
IP-address. For example: siproxd have ISP LAN address 192.X.Y.Z and ISP
Internet address 1.2.3.4. After INVITE/OK exchange siproxd will have to
send all RTP data to 1.2.3.4 because SIP PBX told this address to
siproxd for exchange. But ISP NAT does not allow such forwarding when
sending packets to external NAT address (1.2.3.4) goes back to internal
NAT address (192.X.Y.Z). So all RTP packets are lost. So I wrote small
plugin called "plugin_fix_nat_call_loop", which changes media
IP-address in incoming INVITE/UPDATE/OK SDP packets from external NAT
IP address (got by STUN plugin for example) to local outbound
IP-address. It makes RTP loop for local calls on outbound interface, so
local calls RTP goes "properly" through siproxd. This is not beautiful
solution, but it helps.

In addition I wrote plugin which changes SDP username and session
name which is called "plugin_sdp_name". These fields sometimes are
useless for connections, but it shows SIP software/hardware, and I want
to hide that. :-)

These plugins may be are not good, may be there are some errors, but it
may be interesting for someone. May be just an ideas of these plugins
helps someone to write own plugin.

------

In addition I just want to tell some my thoughts about siproxd.
Yesterday I've built lastest release version 0.8.3 and I was badly
surprised: it allocates too much memory! Previous version 0.8.2
allocates ~4.5 megabytes, last version allocates ~18 megabytes. I'm
using old PC for router and SIP proxy tasks (Pentium 2 with 366MHz and
64 megabytes of RAM), so eating so much memory is unacceptable. I've
read changelog and reduced URLMAP_SIZE to 64 and RTPPROXY_SIZE to 64,
and... now it eats just 2.5 megabytes and it's wonderful! I do not need
such huge count of simultaneously connections, but there is no way to
change it without patching. Nothing says that just these values makes
siproxd so "hungry". I think that these values can be set by any
"user-friendly" way: parameter of "configure" or may be memory can be
allocated dynamically and these parameters can be moved to siproxd.conf.

Another thought is about blacklist plugin. I have not found any "proper"
way to disable that during building, just patching Makefile.in and/or
Makefile.am. I have not tried to use this plugin, may be it's good, but
it requires SQLite. I have no SQLite and do not want to build it. But
there is no check for SQLite presence during "configure" and no way to
exclude blacklist plugin from building. :-(

Third thought is about current version of "plugin_stripheader". It uses
"strndup" function. My old FreeBSD does not have such function. So...
I've wrote another "bad" patch for that
(plugin_stripheader_strndup.patch). May be strndup can be replaced to
any other function or can use rewritten strndup function (or may be
presence of strndup in system will be checked by "configure")? :-) 

And the last thought is about RTP, NAT and keep-alive. Because of NAT
there can be 2 possible problems with RTP. First problem is that NAT
ports are not controlled by SIP peers. So if peers want to exchange
RTP packets NAT ports have to be opened/forwarded. There is only one way
to open NAT ports: just send a packet. I'm not controlling ISP NAT, but
potentially such situation can persist: while making a call SIP PBX
may send RTP packet first for any reason. RTP packets will go to ISP NAT
potentially closed ports and potentially NAT can answer by ICMP for all
RTP packets from SIP PBX that port is closed. And... potentially SIP
PBX may be will not like that. So I think that when RTP proxy makes
relay it may send stub empty packets just to kick NAT. Other problem
with NAT is missing packet for some time and loosing RTP port on NAT.
So... I think that siproxd can send periodically empty packets just to
save activity for NAT. RTP clients should ignore these empty packets (I
hope :-) ). I've wrote small dirty patch (siproxd_keepalive.patch) to
send it. In addition: there is other problem with NAT: it can give
random ports for RTP. There is no external port checking for RTP
streams, but it can be done using STUN for example. STUN can send
packets for STUN server from all RTP ports and getting real RTP port
address; or sending packets to STUN can be done before making relay.
That is not a proper/good solution for all NATs. NAT is real pain,
but... Sometimes there is no good choise for ISP.

------
With Best Regards,
Evgeniy Shtrenyov

--MP_/tPp.QEg0g7a5HXMVYtA2CuH
Content-Type: application/octet-stream; name=plugin_fix_nat_call_loop.c
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=plugin_fix_nat_call_loop.c

LyogbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgPHBsdWdpbi5oPiAqLwojZGVmaW5l
IFBMVUdJTl9OQU1FCXBsdWdpbl9maXhfbmF0X2NhbGxfbG9vcAoKI2luY2x1ZGUgImNvbmZpZy5o
IgoKI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8
bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4K
CiNpbmNsdWRlIDxvc2lwcGFyc2VyMi9vc2lwX3BhcnNlci5oPgojaW5jbHVkZSA8b3NpcHBhcnNl
cjIvc2RwX21lc3NhZ2UuaD4KCiNpbmNsdWRlICJzaXByb3hkLmgiCiNpbmNsdWRlICJwbHVnaW5z
LmgiCiNpbmNsdWRlICJsb2cuaCIKCiNkZWZpbmUgWFNUUihYKSAjWAojZGVmaW5lIFNUUihYKSBY
U1RSKFgpCgoKc3RhdGljIGNoYXIgY29uc3QgaWRlbnRbXSA9ICIkSWQ6IHBsdWdpbl9maXhfbmF0
X2NhbGxfbG9vcC5jIDQ0MCAyMDEwLTAxLTA3IDExOjMwOjI3WiBldmdlbml5ICQiOwoKc3RhdGlj
IGNoYXIgbmFtZVtdID0gU1RSKFBMVUdJTl9OQU1FKTsKc3RhdGljIGNoYXIgZGVzY1tdID0gIlRo
aXMgcGx1Z2luIGZpeGVzIElQLWFkZHJlc3Mgb2YgcmVjZWl2ZWQgSU5WSVRFIG1lc3NhZ2VzIGZv
ciBsb29wIGNhbGxzIGluc2lkZSBOQVQiOwoKZXh0ZXJuIHN0cnVjdCBzaXByb3hkX2NvbmZpZyBj
b25maWd1cmF0aW9uOwoKc3RhdGljIGludCBwcm9jZXNzX3BhY2tldChpbnQgc3RhZ2UsIHNpcF90
aWNrZXRfdCAqdGlja2V0KTsKc3RhdGljIGludCBmaXhfc2RwX2FkZHJlc3Moc2RwX21lc3NhZ2Vf
dCAgKnNkcCk7CgovKiAKICogSW5pdGlhbGl6YXRpb24uCiAqIENhbGxlZCBvbmNlIHN1cmluZyBz
aXByb3hkIHN0YXJ0dXAuCiAqLwppbnQgIFBMVUdJTl9JTklUKHBsdWdpbl9kZWZfdCAqcGx1Z2lu
X2RlZikKewoJcGx1Z2luX2RlZi0+YXBpX3ZlcnNpb24gPSBTSVBST1hEX0FQSV9WRVJTSU9OOwoJ
CgkvKgoJKglOYW1lIGFuZCBkZXNjcmlwdGl2ZSB0ZXh0IG9mIHRoZSBwbHVnaW4KCSovCglwbHVn
aW5fZGVmLT5uYW1lID0gbmFtZTsKCXBsdWdpbl9kZWYtPmRlc2MgPSBkZXNjOwoJCglwbHVnaW5f
ZGVmLT5leGVfbWFzayA9IFBMVUdJTl9QUkVfUFJPWFk7CgoJSU5GTygiJXMgaXMgaW5pdGlhbGl6
ZWQiLCBuYW1lKTsKCXJldHVybiBTVFNfU1VDQ0VTUzsKfQoKLyoKICogUHJvY2Vzc2luZy4KICog
CiAqLwppbnQgIFBMVUdJTl9QUk9DRVNTKGludCBzdGFnZSwgc2lwX3RpY2tldF90ICp0aWNrZXQp
CnsKCWludCBzdHMgPSBTVFNfU1VDQ0VTUzsKCQoJaWYoc3RhZ2UgPT0gUExVR0lOX1BSRV9QUk9Y
WSkKCXsKCQlzdHMgPSBwcm9jZXNzX3BhY2tldChzdGFnZSwgdGlja2V0KTsKCX0KCQoJcmV0dXJu
IHN0czsKfQoKLyoKICogRGUtSW5pdGlhbGl6YXRpb24uCiAqIENhbGxlZCBkdXJpbmcgc2h1dGRv
d24gb2Ygc2lwcm94ZC4KICovCmludCAgUExVR0lOX0VORChwbHVnaW5fZGVmX3QgKnBsdWdpbl9k
ZWYpCnsKCUlORk8oIiVzIGVuZHMgaGVyZSIsIG5hbWUpOwoJcmV0dXJuIFNUU19TVUNDRVNTOwp9
CgpzdGF0aWMgaW50IHByb2Nlc3NfcGFja2V0KGludCBzdGFnZSwgc2lwX3RpY2tldF90ICp0aWNr
ZXQpCnsKCWludCBzdHMgPSBTVFNfRkFJTFVSRTsKCW9zaXBfYm9keV90ICpib2R5ID0gTlVMTDsK
CW9zaXBfbWVzc2FnZV90ICptc2cgPSB0aWNrZXQtPnNpcG1zZzsKCW9zaXBfY29udGVudF90eXBl
X3QgKmNvbnRlbnRfdHlwZSA9IE5VTEw7CglzZHBfbWVzc2FnZV90ICAqc2RwID0gTlVMTDsKCWlu
dCB0aWNrZXRfZGlyZWN0aW9uID0gdGlja2V0LT5kaXJlY3Rpb24sIGJ1ZmxlbjsKCWNoYXIgY2xl
bls4XSwgKmJ1ZmYgPSBOVUxMOwoJaW50IHJjOwoJCglpZihjb25maWd1cmF0aW9uLnJ0cF9wcm94
eV9lbmFibGUgPT0gMCkKCXsKCQlyZXR1cm4gU1RTX1NVQ0NFU1M7Cgl9CgkKCWlmKCEoKHRpY2tl
dC0+ZGlyZWN0aW9uID09IFJFUVRZUF9JTkNPTUlORwoJCSYmIChNU0dfSVNfSU5WSVRFKG1zZykg
fHwgTVNHX0lTX1VQREFURShtc2cpKSkKCQl8fCAodGlja2V0X2RpcmVjdGlvbiA9PSBSRVNUWVBf
SU5DT01JTkcKCQkmJiAoTVNHX0lTX1JFU1BPTlNFX0ZPUihtc2csICJJTlZJVEUiKQoJCXx8IE1T
R19JU19SRVNQT05TRV9GT1IobXNnLCAiVVBEQVRFIikpKSkpCgl7CgkJcmV0dXJuIFNUU19TVUND
RVNTOwoJfQoJCgkvKgoJKglDaGVja2luZyBmb3IgZGF0YSBjb250ZW50LXR5cGUKCSovCgljb250
ZW50X3R5cGUgPSBvc2lwX21lc3NhZ2VfZ2V0X2NvbnRlbnRfdHlwZShtc2cpOwoJaWYoY29udGVu
dF90eXBlID09IE5VTEwKCQl8fCBjb250ZW50X3R5cGUtPnR5cGUgPT0gTlVMTAoJCXx8IGNvbnRl
bnRfdHlwZS0+c3VidHlwZSA9PSBOVUxMCgkJfHwgc3RybmNtcChjb250ZW50X3R5cGUtPnR5cGUs
ICJhcHBsaWNhdGlvbiIsIHNpemVvZigiYXBwbGljYXRpb24iKSkgIT0gMAoJCXx8IHN0cm5jbXAo
Y29udGVudF90eXBlLT5zdWJ0eXBlLCAic2RwIiwgc2l6ZW9mKCJzZHAiKSkgIT0gMCkKCXsKCQly
ZXR1cm4gU1RTX1NVQ0NFU1M7Cgl9CgkKCXN0cyA9IG9zaXBfbWVzc2FnZV9nZXRfYm9keShtc2cs
IDAsICZib2R5KTsKCWlmKHN0cyAhPSAwKQoJewoJCURFQlVHQyhEQkNMQVNTX1BMVUdJTiwgIiVz
OiBubyBTRFAgZm91bmQgaW4gbWVzc2FnZSIsIG5hbWUpOwoJCXJldHVybiBTVFNfU1VDQ0VTUzsK
CX0KCQoJc3RzID0gc2lwX2JvZHlfdG9fc3RyKGJvZHksICZidWZmLCAmYnVmbGVuKTsKCWlmKHN0
cyAhPSAwKQoJewoJCUVSUk9SKCIlczogdW5hYmxlIHRvIHNpcF9ib2R5X3RvX3N0ciIsIG5hbWUp
OwoJCXJldHVybiBTVFNfRkFJTFVSRTsKCX0KCQoJc3RzID0gc2RwX21lc3NhZ2VfaW5pdCgmc2Rw
KTsKCXN0cyA9IHNkcF9tZXNzYWdlX3BhcnNlKHNkcCwgYnVmZik7Cglvc2lwX2ZyZWUoYnVmZik7
CgkKCWlmIChzdHMgIT0gMCkKCXsKCQlFUlJPUigiJXM6IHVuYWJsZSB0byBzZHBfbWVzc2FnZV9w
YXJzZSBib2R5IiwgbmFtZSk7CgkJc2RwX21lc3NhZ2VfZnJlZShzZHApOwoJCXJldHVybiBTVFNf
RkFJTFVSRTsKCX0KCQoJcmMgPSBmaXhfc2RwX2FkZHJlc3Moc2RwKTsKCQoJaWYocmMgIT0gU1RT
X1NVQ0NFU1MpCgl7CgkJc2RwX21lc3NhZ2VfZnJlZShzZHApOwoJCUVSUk9SKCIlczogdW5hYmxl
IHRvIGZpeCBTRFAgYWRkcmVzcyIsIG5hbWUpOwoJCXJldHVybiBTVFNfRkFJTFVSRTsKCX0KCQoJ
c3RzID0gb3NpcF9saXN0X3JlbW92ZSgmKG1zZy0+Ym9kaWVzKSwgMCk7Cglvc2lwX2JvZHlfZnJl
ZShib2R5KTsKCQoJLyoKCSoJRHVtcGluZyBuZXcgYm9keQoJKi8KCXNkcF9tZXNzYWdlX3RvX3N0
cihzZHAsICZidWZmKTsKCWJ1ZmxlbiA9IHN0cmxlbihidWZmKTsKCQoJLyoKCSoJRnJlZWluZyBT
RFAgc3RydWN0dXJlCgkqLwoJc2RwX21lc3NhZ2VfZnJlZShzZHApOwoJCgkvKgoJKglJbmNsdWRp
bmcgbmV3IGJvZHkKCSovCglzaXBfbWVzc2FnZV9zZXRfYm9keShtc2csIGJ1ZmYsIGJ1Zmxlbik7
CgkKCWlmKHN0cyAhPSAwKQoJewoJCUVSUk9SKCIlczogdW5hYmxlIHRvIHNpcF9tZXNzYWdlX3Nl
dF9ib2R5IGJvZHkiLCBuYW1lKTsKCX0KCQoJLyoKCSoJRnJlZWluZyBjb250ZW50IGxlbmd0aCBy
ZXNvdXJjZSBhbmQgaW5jbHVkaW5nIG5ldyBvbmUKCSovCglvc2lwX2NvbnRlbnRfbGVuZ3RoX2Zy
ZWUobXNnLT5jb250ZW50X2xlbmd0aCk7Cgltc2ctPmNvbnRlbnRfbGVuZ3RoID0gTlVMTDsKCXNw
cmludGYoY2xlbiwgIiVsZCIsIChsb25nKWJ1Zmxlbik7CglpZihvc2lwX21lc3NhZ2Vfc2V0X2Nv
bnRlbnRfbGVuZ3RoKG1zZywgY2xlbikgIT0gT1NJUF9TVUNDRVNTKQoJewoJCUVSUk9SKCIlczog
dW5hYmxlIHRvIHNldCBuZXcgY29udGVudCBsZW5ndGgiLCBuYW1lKTsKCQlyZXR1cm4gU1RTX0ZB
SUxVUkU7Cgl9CgkKCS8qCgkqCUZyZWVpbmcgbmV3IGJvZHkgc3RyaW5nCgkqLwoJb3NpcF9mcmVl
KGJ1ZmYpOwoJCglyZXR1cm4gU1RTX1NVQ0NFU1M7Cn0KCiNkZWZpbmUgU1RSTENQWShEU1QsIFNS
QywgQlNJWkUpIChzdHJuY3B5KChEU1QpLCAoU1JDKSwgKEJTSVpFKSksIChEU1QpWyhCU0laRSkg
LSAxXSA9ICdcMCcsIChEU1QpKQoKc3RhdGljIGludCBmaXhfc2RwX2FkZHJlc3Moc2RwX21lc3Nh
Z2VfdCAgKnNkcCkKewoJaW50IG1zZ19wb3J0OwoJaW50IGlwX21hdGNoLCBuZWVkX2FkZHJfZml4
aW5nOwoJY2hhciAqbmV3X2FkZHJfc3RyID0gTlVMTCwgKnNkcF9yZWN2X2FkZHJfc3RyID0gTlVM
TDsKCXN0cnVjdCBpbl9hZGRyIHplcm9zX3Npbiwgb3V0c2lkZV9zaW4sIGlmYWNlX3Npbiwgc2Rw
X3NpbjsKCWludCBtZWRpYV9zdHJlYW1fbm87CgljaGFyIG91dHNpZGVfYWRkcl9zdHJbMTZdLCBp
ZmFjZV9hZGRyX3N0clsxNl0sIHNkcF9hZGRyX3N0clsxNl07CgkKCW1lbXNldCgmemVyb3Nfc2lu
LCAwLCBzaXplb2YoemVyb3Nfc2luKSk7CgltZW1zZXQoJm91dHNpZGVfc2luLCAwLCBzaXplb2Yo
b3V0c2lkZV9zaW4pKTsKCW1lbXNldCgmaWZhY2Vfc2luLCAwLCBzaXplb2YoaWZhY2Vfc2luKSk7
CgltZW1zZXQoJnNkcF9zaW4sIDAsIHNpemVvZihzZHBfc2luKSk7CgkKCWlmKGNvbmZpZ3VyYXRp
b24ub3V0Ym91bmRfaG9zdCA9PSBOVUxMCgkJfHwgc3RybGVuKGNvbmZpZ3VyYXRpb24ub3V0Ym91
bmRfaG9zdCkgPT0gMCkKCXsKCQkvKgoJCSoJSWYgaG9zdG5hbWUgaXMgZW1wdHkgLSBubyB3YXkg
dG8gY2hlY2sgYWRkcmVzcwoJCSovCgkJcmV0dXJuIFNUU19TVUNDRVNTOwoJfQoJCglpZihzZHAt
Pm9fYWRkcnR5cGUgJiYgc2RwLT5vX2FkZHIgJiYgc3RyY21wKHNkcC0+b19hZGRydHlwZSwgIklQ
NCIpICE9IDApCgl7CgkJV0FSTigiJXM6IHVuc3VwcG9ydGVkIFNEUCBvcmlnaW4gYWRkcmVzcyB0
eXBlOiBbJXNdOyBvbmx5IElQNCBpcyBzdXBwb3J0ZWQuIiwKCQkJbmFtZSwgc2RwLT5vX2FkZHJ0
eXBlKTsKCQkKCQlyZXR1cm4gU1RTX1NVQ0NFU1M7Cgl9CgkKCWlmKHNkcC0+Y19jb25uZWN0aW9u
ID09IE5VTEwgfHwgc2RwLT5jX2Nvbm5lY3Rpb24tPmNfYWRkciA9PSBOVUxMKQoJewoJCS8qCgkJ
KglObyBuZWVkIHRvIGZpeCBhbnl0aGluZwoJCSovCgkJcmV0dXJuIFNUU19TVUNDRVNTOwoJfQoJ
CglpZihzZHAtPmNfY29ubmVjdGlvbi0+Y19hZGRydHlwZSAmJiBzdHJjbXAoc2RwLT5jX2Nvbm5l
Y3Rpb24tPmNfYWRkcnR5cGUsICJJUDQiKSAhPSAwKQoJewoJCVdBUk4oIiVzOiB1bnN1cHBvcnRl
ZCBTRFAgY29ubmVjdGlvbiBhZGRyZXNzIHR5cGU6IFslc107IG9ubHkgSVA0IGlzIHN1cHBvcnRl
ZC4iLAoJCQluYW1lLCBzZHAtPmNfY29ubmVjdGlvbi0+Y19hZGRydHlwZSk7Cgl9CgkKCXNkcF9y
ZWN2X2FkZHJfc3RyID0gc2RwLT5jX2Nvbm5lY3Rpb24tPmNfYWRkcjsKCQoJaWYodXRpbHNfaW5l
dF9hdG9uKHNkcF9yZWN2X2FkZHJfc3RyLCAmc2RwX3NpbikgPD0gMCkKCXsKCQlFUlJPUigiJXM6
IHVuYWJsZSB0byBwYXJzZSBTRFAgSVAgYWRkcmVzcyIsIG5hbWUpOwoJCQoJCXJldHVybiBTVFNf
RkFJTFVSRTsKCX0KCQoJaWYoZ2V0X2lwX2J5X2hvc3QoY29uZmlndXJhdGlvbi5vdXRib3VuZF9o
b3N0LCAmb3V0c2lkZV9zaW4pICE9IFNUU19TVUNDRVNTKQoJewoJCUVSUk9SKCIlczogdW5hYmxl
IHRvIGNvbnZlcnQgY29uZmlndXJlZCBvdXRib3VuZCBhZGRyZXNzIFslc10gdG8gSVAiLAoJCQlu
YW1lLCBjb25maWd1cmF0aW9uLm91dGJvdW5kX2hvc3QpOwoJCQoJCXJldHVybiBTVFNfRkFJTFVS
RTsKCX0KCQoJaWYoZ2V0X2ludGVyZmFjZV9yZWFsX2lwKElGX09VVEJPVU5ELCAmaWZhY2Vfc2lu
KSAhPSBTVFNfU1VDQ0VTUykKCXsKCQlFUlJPUigiJXM6IHVuYWJsZSB0byBnZXQgb3V0Ym91bmQg
aW50ZXJmYWNlIGFkZHJlc3MiLCBuYW1lKTsKCQkKCQlyZXR1cm4gU1RTX0ZBSUxVUkU7Cgl9CgkK
CVNUUkxDUFkoaWZhY2VfYWRkcl9zdHIsIHV0aWxzX2luZXRfbnRvYShpZmFjZV9zaW4pLCBzaXpl
b2YoaWZhY2VfYWRkcl9zdHIpKTsKCVNUUkxDUFkob3V0c2lkZV9hZGRyX3N0ciwgdXRpbHNfaW5l
dF9udG9hKG91dHNpZGVfc2luKSwgc2l6ZW9mKG91dHNpZGVfYWRkcl9zdHIpKTsKCVNUUkxDUFko
c2RwX2FkZHJfc3RyLCB1dGlsc19pbmV0X250b2Eoc2RwX3NpbiksIHNpemVvZihzZHBfYWRkcl9z
dHIpKTsKCQoJLyoKCSoJQ2hlY2tpbmcgZm9yIG91ciBJUCBhZGRyZXNzCgkqLwoJaXBfbWF0Y2gg
PSAwOwoJCgkvKgoJKglDb21wYXJlIHdpdGggMC4wLjAuMAoJKi8KCWlmKG1lbWNtcCgmc2RwX3Np
biwgJnplcm9zX3Npbiwgc2l6ZW9mKHNkcF9zaW4pKSA9PSAwKQoJewoJCS8qCgkJKglOb3QgYW4g
b3VyIGFkZHJlc3MKCQkqLwoJCWlwX21hdGNoID0gMDsKCX0KCWVsc2UgaWYobWVtY21wKCZzZHBf
c2luLCAmaWZhY2Vfc2luLCBzaXplb2Yoc2RwX3NpbikpID09IDApCgl7CgkJLyoKCQkqCU5vIG5l
ZWQgdG8gZml4LCBpdCdzIGFsbHJlYWR5IGV4dGVybmFsIGlmYWNlIGFkZHJlc3MKCQkqLwoJCWlw
X21hdGNoID0gMDsKCX0KCWVsc2UgaWYobWVtY21wKCZzZHBfc2luLCAmb3V0c2lkZV9zaW4sIHNp
emVvZihzZHBfc2luKSkgPT0gMCkKCXsKCQlpcF9tYXRjaCA9IDE7Cgl9CgkKCS8qCgkqCUNoZWNr
aW5nIGZvciBvdXIgcG9ydCByYW5nZQoJKi8KCW5lZWRfYWRkcl9maXhpbmcgPSAwOwoJaWYoaXBf
bWF0Y2ggIT0gMCkKCXsKCQlmb3IgKG1lZGlhX3N0cmVhbV9ubyA9IDA7CgkJCXNkcF9tZXNzYWdl
X21fcG9ydF9nZXQoc2RwLCBtZWRpYV9zdHJlYW1fbm8pICE9IE5VTEw7CgkJCW1lZGlhX3N0cmVh
bV9ubyArKykKCQl7CgkJCW1zZ19wb3J0ID0gYXRvaShzZHBfbWVzc2FnZV9tX3BvcnRfZ2V0KHNk
cCwgbWVkaWFfc3RyZWFtX25vKSk7CgkJCQoJCQlpZiAoKG1zZ19wb3J0ID49IGNvbmZpZ3VyYXRp
b24ucnRwX3BvcnRfbG93KSAmJiAobXNnX3BvcnQgPD0gY29uZmlndXJhdGlvbi5ydHBfcG9ydF9o
aWdoKSkKCQkJewoJCQkJbmVlZF9hZGRyX2ZpeGluZyA9IDE7CgkJCX0KCQkJCgkJCURFQlVHQyhE
QkNMQVNTX1BMVUdJTiwKCQkJCSIlczogbWVkaWEgcG9ydCBvZiBTRFAgcGFja2V0OiAlZDsgaXMg
cG9ydCBpbiBvdXIgcmFuZ2UgWyV1IDw9ICV1IDw9ICV1XTogJXMiLAoJCQkJbmFtZSwgbXNnX3Bv
cnQsIGNvbmZpZ3VyYXRpb24ucnRwX3BvcnRfbG93LCBtc2dfcG9ydCwgY29uZmlndXJhdGlvbi5y
dHBfcG9ydF9oaWdoLAoJCQkJbmVlZF9hZGRyX2ZpeGluZz8iWUVTIjoiTk8iKTsKCQkJCgkJCWlm
KG5lZWRfYWRkcl9maXhpbmcpCgkJCXsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoJCiAgICAgICAg
REVCVUdDKERCQ0xBU1NfUExVR0lOLAoJCSIlczogU0RQIGFkZHJlc3M6IFslc10sIGludGVyZmFj
ZSBhZGRyZXNzOiBbJXNdLCBcCm91dGJvdW5kIGFkZHJlc3M6IFslc107IHBvcnQgcmFuZ2UgbWF0
Y2hlczogJXMsIG5lZWQgZml4aW5nOiAlcyIsCgkJbmFtZSwKCQlzZHBfYWRkcl9zdHIsCgkJaWZh
Y2VfYWRkcl9zdHIsCgkJY29uZmlndXJhdGlvbi5vdXRib3VuZF9ob3N0LAoJCW5lZWRfYWRkcl9m
aXhpbmc/IllFUyI6KGlwX21hdGNoPyJOTyI6Ik5PVCBDSEVDS0VEIiksCgkJbmVlZF9hZGRyX2Zp
eGluZz8iWUVTIjoiTk8iKTsKCgkKCWlmKG5lZWRfYWRkcl9maXhpbmcpCgl7CgkJbmV3X2FkZHJf
c3RyID0gb3NpcF9tYWxsb2MoSE9TVE5BTUVfU0laRSk7CgkKCQlpZihuZXdfYWRkcl9zdHIgPT0g
TlVMTCkKCQl7CgkJCUVSUk9SKCIlczogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGhv
c3RuYW1lIiwgbmFtZSk7CgkJCgkJCXJldHVybiBTVFNfRkFJTFVSRTsKCQl9CgkJCgkJU1RSTENQ
WShuZXdfYWRkcl9zdHIsIGlmYWNlX2FkZHJfc3RyLCBIT1NUTkFNRV9TSVpFKTsKCQkKCQlERUJV
R0MoREJDTEFTU19QTFVHSU4sICIlczogZml4aW5nIFNEUCBhZGRyZXNzIGZyb20gWyVzXSB0byBb
JXNdIiwKCQkJIG5hbWUsIHNkcF9hZGRyX3N0ciwgbmV3X2FkZHJfc3RyKTsKCQkKCQlvc2lwX2Zy
ZWUoc2RwLT5jX2Nvbm5lY3Rpb24tPmNfYWRkcik7CgkJc2RwLT5jX2Nvbm5lY3Rpb24tPmNfYWRk
ciA9IG5ld19hZGRyX3N0cjsKCX0KCWVsc2UKCXsKCQlERUJVR0MoREJDTEFTU19QTFVHSU4sICIl
czogbm8gZml4aW5nOiBub3QgYW4gb3V0IHBvcnQiLCBuYW1lKTsKCX0KCQoJcmV0dXJuIFNUU19T
VUNDRVNTOwp9Cg==

--MP_/tPp.QEg0g7a5HXMVYtA2CuH
Content-Type: application/octet-stream; name=plugin_keepalive.c
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=plugin_keepalive.c

LyogbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgPHBsdWdpbi5oPiAqLwojZGVmaW5l
IFBMVUdJTl9OQU1FIHBsdWdpbl9rZWVwYWxpdmUKCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNs
dWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgPHN5cy90eXBlcy5o
PgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CgojaW5jbHVk
ZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgoK
I2luY2x1ZGUgPG9zaXBwYXJzZXIyL29zaXBfcGFyc2VyLmg+CiNpbmNsdWRlIDxvc2lwcGFyc2Vy
Mi9zZHBfbWVzc2FnZS5oPgoKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPG5ldGlu
ZXQvaW4uaD4KCiNpbmNsdWRlICJzaXByb3hkLmgiCiNpbmNsdWRlICJwbHVnaW5zLmgiCiNpbmNs
dWRlICJsb2cuaCIKCnN0YXRpYyBjaGFyIGNvbnN0IGlkZW50W10gPSAiJElkOiBwbHVnaW5fa2Vl
cGFsaXZlLmMsdiAxLjIgMjAxOS8wNy8yMSAyMDo1MToxMCBldmdlbml5IEV4cCBldmdlbml5ICQi
OwoKLyoKKglQbHVnLWluIGlkZW50aWZpY2F0aW9uCiovCnN0YXRpYyBjaGFyIG5hbWVbXSA9ICJw
bHVnaW5fa2VlcGFsaXZlIjsKc3RhdGljIGNoYXIgZGVzY1tdID0gIlNlbmRzIGtlZXBhbGl2ZSBw
YWNrZXRzIHRvIHNlcnZlcnMgYW5kIGxvY2FsIGNsaWVudHMgdG8gZml4IE5BVC9maXJld2FsbCB0
aW1lb3V0IHByb2JsZW1zIjsKCi8qCioJZ2xvYmFsIGNvbmZpZ3VyYXRpb24gc3RvcmFnZSAtIHJl
cXVpcmVkIGZvciBjb25maWcgZmlsZSBsb2NhdGlvbgoqLwpleHRlcm4gc3RydWN0IHNpcHJveGRf
Y29uZmlnIGNvbmZpZ3VyYXRpb247CgovKgoqCVRhYmxlIHRvIGhvbGQgdGhlIGNsaWVudCByZWdp
c3RyYXRpb25zCiovCmV4dGVybiBzdHJ1Y3QgdXJsbWFwX3MgdXJsbWFwW1VSTE1BUF9TSVpFXTsK
CnN0cnVjdCBwaW5nZWRfaG9zdAp7Cgljb25zdCBjaGFyICpob3N0OwoJaW50IHBvcnQ7CglzdHJ1
Y3QgaW5fYWRkciBhZGRyOwp9OwoKLyoKKglTdG9yYWdlIG9mIHBpbmdlZCBhZGRyZXNzIGZvciBl
eGNsdXNpb24gb2YgbXVsdGlwbGUgcGluZ2luZyBvZiB0aGUgc2FtZSBhZGRyZXNzCiovCnN0YXRp
YyBzdHJ1Y3QgcGluZ2VkX2hvc3Qgc2ltcGxlX3BpbmdlZF9ob3N0c1tVUkxNQVBfU0laRSAqIDJd
OwoKc3RhdGljIGludCBwaW5nX2J5X3NpbXBsZShpbnQgc3RhZ2UsIHNpcF90aWNrZXRfdCAqdGlj
a2V0KTsKc3RhdGljIGludCBwaW5nX2J5X3NpbXBsZV90aW1lcl9ldmVudChpbnQgc3RhZ2UsIHNp
cF90aWNrZXRfdCAqdGlja2V0KTsKc3RhdGljIGludCBwaW5nX2J5X3NpbXBsZV9pbmNvbWluZyhp
bnQgc3RhZ2UsIHNpcF90aWNrZXRfdCAqdGlja2V0KTsKc3RhdGljIGludCBzZW5kX3NpbXBsZV9w
aW5nKHN0cnVjdCBpbl9hZGRyICphZGRyLCB1bnNpZ25lZCBpbnQgcG9ydCk7CgovKgoqCXBsdWdp
biBjb25maWd1cmF0aW9uIHN0b3JhZ2UKKi8Kc3RhdGljIHN0cnVjdCBwbHVnaW5fY29uZmlnCnsK
CWludCBwZXJpb2Q7CglpbnQgcGluZ19sb2NhbDsKCWludCBwaW5nX3JlbW90ZTsKfSBwbHVnaW5f
Y2ZnOwoKLyoKKglJbnN0cnVjdGlvbnMgZm9yIGNvbmZpZyBwYXJzZXIKKi8Kc3RhdGljIGNmZ29w
dHNfdCBwbHVnaW5fY2ZnX29wdHNbXSA9IHsKCS8qCgkqCVBpbmcgcGVyaW9kIChkZWZhdWx0OiAx
MCkKCSovCgl7ICJwbHVnaW5fa2VlcGFsaXZlX3BlcmlvZCIsIFRZUF9JTlQ0LCAmcGx1Z2luX2Nm
Zy5wZXJpb2QsIHsxMCwgTlVMTH0gfSwKCQoJLyoKCSoJUGluZyBsb2NhbCBob3N0cyAoZGVmYXVs
dDogMCAtIE5PKQoJKgkwIC0gbm8KCSoJMSAtIHllcwoJKi8KCXsgInBsdWdpbl9rZWVwYWxpdmVf
bG9jYWwiLCBUWVBfSU5UNCwgJnBsdWdpbl9jZmcucGluZ19sb2NhbCwgezAsIE5VTEx9IH0sCgkK
CS8qCgkqCVBpbmcgcmVtb3RlIGhvc3RzIChkZWZhdWx0OiAxIC0gWUVTKQoJKgkwIC0gbm8KCSoJ
MSAtIHllcwoJKi8KCXsgInBsdWdpbl9rZWVwYWxpdmVfcmVtb3RlIiwgVFlQX0lOVDQsICZwbHVn
aW5fY2ZnLnBpbmdfcmVtb3RlLCB7MSwgTlVMTH0gfSwKCQoJezAsIDAsIDB9Cn07CgpzdGF0aWMg
dW5zaWduZWQgaW50IHBpbmdlZF9ob3N0c19nbG9iYWwgPSAwOwoKLyogCioJSW5pdGlhbGl6YXRp
b24uCioJQ2FsbGVkIG9uY2Ugc3VyaW5nIHNpcHJveGQgc3RhcnR1cC4KKi8KaW50IFBMVUdJTl9J
TklUKHBsdWdpbl9kZWZfdCAqcGx1Z2luX2RlZikKewoJLyoKCSoJQVBJIHZlcnNpb24gbnVtYmVy
IG9mIHNpcHJveGQgdGhhdCB0aGlzIHBsdWdpbiBpcyBidWlsdCBhZ2FpbnN0LgoJKglUaGlzIGNv
bnN0YW50IHdpbGwgY2hhbmdlIHdoZW5ldmVyIGNoYW5nZXMgdG8gdGhlIEFQSSBhcmUgbWFkZQoJ
Kgl0aGF0IHJlcXVpcmUgYWRhcHRpb25zIGluIHRoZSBwbHVnaW4uCgkqLwoJcGx1Z2luX2RlZi0+
YXBpX3ZlcnNpb24gPSBTSVBST1hEX0FQSV9WRVJTSU9OOwoJCgkvKgoJKglOYW1lIGFuZCBkZXNj
cmlwdGl2ZSB0ZXh0IG9mIHRoZSBwbHVnaW4KCSovCglwbHVnaW5fZGVmLT5uYW1lID0gbmFtZTsK
CXBsdWdpbl9kZWYtPmRlc2MgPSBkZXNjOwoKCS8qCgkqCUV4ZWN1dGlvbiBtYXNrIC0gZHVyaW5n
IHdoYXQgc3RhZ2VzIG9mIFNJUCBwcm9jZXNzaW5nIHNoYWxsCgkqCXRoZSBwbHVnaW4gYmUgY2Fs
bGVkLgoJKglVc2luZyBQTFVHSU5fUE9TVF9QUk9YWSwgYmVjYXVzZSBvZiB1c2VyLWFnZW50IG1v
ZGlmaWNhdGlvbnMKCSoJYnkgcHJveHkKCSovCgkKCXBsdWdpbl9kZWYtPmV4ZV9tYXNrID0gUExV
R0lOX1RJTUVSIHwgUExVR0lOX1BST0NFU1NfUkFXOwoJCgkvKgoJKglSZWFkIHRoZSBjb25maWcg
ZmlsZQoJKi8KCWlmKHJlYWRfY29uZmlnKGNvbmZpZ3VyYXRpb24uY29uZmlnZmlsZSwKCQkJY29u
ZmlndXJhdGlvbi5jb25maWdfc2VhcmNoLAoJCQlwbHVnaW5fY2ZnX29wdHMsIG5hbWUpID09IFNU
U19GQUlMVVJFKQoJewoJCUVSUk9SKCJQbHVnaW4gJyVzJzogY291bGQgbm90IGxvYWQgY29uZmln
IGZpbGUiLCBuYW1lKTsKCQlyZXR1cm4gU1RTX0ZBSUxVUkU7Cgl9CgkKCW1lbXNldChzaW1wbGVf
cGluZ2VkX2hvc3RzLCAwLCBzaXplb2Yoc2ltcGxlX3BpbmdlZF9ob3N0cykpOwoJCglJTkZPKCIl
cyBpcyBpbml0aWFsaXplZCIsIG5hbWUpOwoJcmV0dXJuIFNUU19TVUNDRVNTOwp9CgovKgoqCVBy
b2Nlc3NpbmcuCiovCmludCBQTFVHSU5fUFJPQ0VTUyhpbnQgc3RhZ2UsIHNpcF90aWNrZXRfdCAq
dGlja2V0KQp7CglpbnQgc3RzID0gU1RTX1NVQ0NFU1M7CgkKCXN0cyA9IHBpbmdfYnlfc2ltcGxl
KHN0YWdlLCB0aWNrZXQpOwoJCglyZXR1cm4gc3RzOwp9CgovKgoqCURlLUluaXRpYWxpemF0aW9u
LgoqCUNhbGxlZCBkdXJpbmcgc2h1dGRvd24gb2Ygc2lwcm94ZC4gR2l2ZXMgdGhlIHBsdWdpbiB0
aGUgY2hhbmNlCioJdG8gY2xlYW4gdXAgaXRzIG1lc3MgKGUuZy4gZHluYW1pYyBtZW1vcnkgYWxs
b2NhdGlvbiwgZGF0YWJhc2UKKgljb25uZWN0aW9ucywgd2hhdGV2ZXIgdGhlIHBsdWdpbiBtZXNz
ZXMgYXJvdW5kIHdpdGgpCiovCmludCBQTFVHSU5fRU5EKHBsdWdpbl9kZWZfdCAqcGx1Z2luX2Rl
ZikKewoJSU5GTygiJXMgZW5kcyBoZXJlIiwgbmFtZSk7CglyZXR1cm4gU1RTX1NVQ0NFU1M7Cn0K
Ci8qCioJU2VuZGluZyBzaW1wbGUgQ1IgTEYgQ1IgTEYgcGFja2V0cwoqLwpzdGF0aWMgaW50IHBp
bmdfYnlfc2ltcGxlKGludCBzdGFnZSwgc2lwX3RpY2tldF90ICp0aWNrZXQpCnsKCWludCBzdHMg
PSBTVFNfU1VDQ0VTUzsKCQoJc3dpdGNoKHN0YWdlKQoJewoJCWNhc2UgUExVR0lOX1RJTUVSOgoJ
CQlzdHMgPSBwaW5nX2J5X3NpbXBsZV90aW1lcl9ldmVudChzdGFnZSwgdGlja2V0KTsKCQlicmVh
azsKCQkKCQljYXNlIFBMVUdJTl9QUk9DRVNTX1JBVzoKCQkJc3RzID0gcGluZ19ieV9zaW1wbGVf
aW5jb21pbmcoc3RhZ2UsIHRpY2tldCk7CgkJYnJlYWs7CgkJCgkJZGVmYXVsdDoKCQkJCgkJYnJl
YWs7Cgl9CgkKCXJldHVybiBzdHM7Cn0KCiNkZWZpbmUgVFNfQ01QKGEsIGIsIENNUCkgXAoJKCgo
YSktPnR2X3NlYyA9PSAoYiktPnR2X3NlYyk/IFwKCSgoYSktPnR2X25zZWMgQ01QIChiKS0+dHZf
bnNlYyk6IFwKCSgoYSktPnR2X3NlYyBDTVAgKGIpLT50dl9zZWMpKQoKCgovKgoqCVNlbmRpbmcg
InNpbXBsZSIgcGluZ3M6IGp1c3Qgc2VuZCBhbiBVRFAgcGFja2V0CioJd2l0aG91dCBhbnkgaW50
ZXJlc3RpbmcgcGF5bG9hZAoqLwpzdGF0aWMgaW50IHBpbmdfYnlfc2ltcGxlX3RpbWVyX2V2ZW50
KGludCBzdGFnZSwgc2lwX3RpY2tldF90ICp0aWNrZXQpCnsKCXN0YXRpYyBzdHJ1Y3QgdGltZXNw
ZWMgdHNfbmV4dF9zZW5kaW5nID0gezAsIDB9OwoJc3RydWN0IHRpbWVzcGVjIHRzX25vdzsKCQoJ
aW50IHN0czsKCQoJdW5zaWduZWQgaW50IGksIGogPSAwOwoJdW5zaWduZWQgaW50IHBpbmdlZF9l
bmRfaWR4OwoJCglvc2lwX3VyaV90ICpwaW5nX3VybHNbMl0sICpwaW5nX3VybDsKCWludCBwaW5n
X3VybF9jb3VudCwgcGluZ191cmxfbnVtOwoJY2hhciAqc2lwX2hvc3QsICpzaXBfcG9ydCwgKnNp
cF9pcDsKCWludCBpc2lwX3BvcnQ7CglpbnQgZm91bmQgPSAwOwoJCglzdHJ1Y3QgaW5fYWRkciBw
aW5nX2FkZHI7CgkKCWlmKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHNfbm93KSkK
CXsKCQlFUlJPUigiJXM6IGNsb2NrX2dldHRpbWUgZmFpbGVkIiwgbmFtZSk7CgkJCgkJcmV0dXJu
IFNUU19TVUNDRVNTOwoJfQoJCgkvKgoJKglJcyB0aW1lciBkb25lPwoJKi8KCWlmKFRTX0NNUCgm
dHNfbm93LCAmdHNfbmV4dF9zZW5kaW5nLCA8KSkKCXsKCQlyZXR1cm4gU1RTX1NVQ0NFU1M7Cgl9
CgkKCW1lbWNweSgmdHNfbmV4dF9zZW5kaW5nLCAmdHNfbm93LCBzaXplb2Yoc3RydWN0IHRpbWVz
cGVjKSk7Cgl0c19uZXh0X3NlbmRpbmcudHZfc2VjICs9IHBsdWdpbl9jZmcucGVyaW9kOwoJCglw
aW5nZWRfZW5kX2lkeCA9IDA7CgkKCS8qCgkqCUxvb3AgdGhyb3VnaCBhbGwgVVJMcwoJKi8KCWZv
cihpID0gMDsgaSA8IFVSTE1BUF9TSVpFOyBpICsrKQoJewoJCS8qCgkJKglVc2luZyBvbmx5IGFj
dGl2ZSByZWNvcmRzCgkJKi8KCQlpZih1cmxtYXBbaV0uYWN0aXZlID09IDApCgkJewoJCQljb250
aW51ZTsKCQl9CgkJCgkJLyoKCQkqCVNlbGVjdGluZyBVUkxzIHRvIHBpbmcKCQkqLwoJCXBpbmdf
dXJsX2NvdW50ID0gMDsKCQkKCQlpZihwbHVnaW5fY2ZnLnBpbmdfbG9jYWwpCgkJewoJCQlwaW5n
X3VybHNbcGluZ191cmxfY291bnQgKytdID0gdXJsbWFwW2ldLnRydWVfdXJsOwoJCX0KCQkKCQlp
ZihwbHVnaW5fY2ZnLnBpbmdfcmVtb3RlKQoJCXsKCQkJcGluZ191cmxzW3BpbmdfdXJsX2NvdW50
ICsrXSA9IHVybG1hcFtpXS5yZWdfdXJsOwoJCX0KCQkKCQkKCQlmb3IocGluZ191cmxfbnVtID0g
MDsgcGluZ191cmxfbnVtIDwgcGluZ191cmxfY291bnQ7IHBpbmdfdXJsX251bSArKykKCQl7CgkJ
CS8qCgkJCSoJR2V0dGluZyBob3N0IG9mIFVSTAoJCQkqLwoJCQlwaW5nX3VybCA9IHBpbmdfdXJs
c1twaW5nX3VybF9udW1dOwoJCQkKCQkJc2lwX2hvc3QgPSBvc2lwX3VyaV9nZXRfaG9zdChwaW5n
X3VybCk7CgkJCXNpcF9wb3J0ID0gb3NpcF91cmlfZ2V0X3BvcnQocGluZ191cmwpOwoJCQkKCQkJ
aWYoc2lwX2hvc3QgPT0gTlVMTCkKCQkJewoJCQkJY29udGludWU7CgkJCX0KCQkJCgkJCWlmKHNp
cF9wb3J0KQoJCQl7CgkJCQlpc2lwX3BvcnQgPSBhdG9pKHNpcF9wb3J0KTsKCQkJfQoJCQllbHNl
CgkJCXsKCQkJCWlzaXBfcG9ydCA9IFNJUF9QT1JUOwoJCQl9CgkJCQoJCQkvKgoJCQkqCUNoZWNr
aW5nIGZvciBob3N0IGFsbHJlYWR5IGlzIHBpbmdlZCB3aXRob3V0IHJlc29sdXRpb24KCQkJKi8K
CQkJZm91bmQgPSAwOwoJCQlmb3IoaiA9IDA7IGogPCBwaW5nZWRfZW5kX2lkeDsgaiArKykKCQkJ
ewoJCQkJaWYoc3RyY21wKHNpcF9ob3N0LCBzaW1wbGVfcGluZ2VkX2hvc3RzW2pdLmhvc3QpID09
IDAKCQkJCQkmJiBpc2lwX3BvcnQgPT0gc2ltcGxlX3BpbmdlZF9ob3N0c1tqXS5wb3J0KQoJCQkJ
ewoJCQkJCWZvdW5kID0gMTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQkKCQkJLyoKCQkJKglJ
ZiBob3N0IGlzIHBpbmdlZCAtIHNraXBwaW5nIGl0CgkJCSovCgkJCWlmKGZvdW5kKQoJCQl7CgkJ
CQljb250aW51ZTsKCQkJfQoJCQkKCQkJbWVtc2V0KCZwaW5nX2FkZHIsIDAsIHNpemVvZihwaW5n
X2FkZHIpKTsKCQkJCgkJCS8qCgkJCSoJVHJ5aW5nIHRvIGNvbnZlcnQgYWRkcmVzcyB0byBJUCAv
IHJlc29sdmUKCQkJKi8KCQkJc3RzID0gZ2V0X2lwX2J5X2hvc3Qoc2lwX2hvc3QsICZwaW5nX2Fk
ZHIpOwoJCQlpZihzdHMgPT0gU1RTX0ZBSUxVUkUpCgkJCXsKCQkJCURFQlVHQyhEQkNMQVNTX1BM
VUdJTiwKCQkJCQkiJXM6IGNhbm5vdCByZXNvbHZlIFNJUCBhZGRyZXNzIFslc10iLCBuYW1lLCBz
aXBfaG9zdCk7CgkJCQljb250aW51ZTsKCQkJfQoJCQkKCQkJc2lwX2lwID0gdXRpbHNfaW5ldF9u
dG9hKHBpbmdfYWRkcik7CgkJCQoJCQkvKgoJCQkqCVdhcyBhbnkgcGFja2V0IGFsbHJlYWR5IHNl
bnQgdG8gdGhlIHNhbWUgSVAgYWRkcmVzcz8KCQkJKi8KCQkJZm91bmQgPSAwOwoJCQlmb3IoaiA9
IDA7IGogPCBwaW5nZWRfZW5kX2lkeDsgaiArKykKCQkJewoJCQkJaWYoaXNpcF9wb3J0ID09IHNp
bXBsZV9waW5nZWRfaG9zdHNbal0ucG9ydAoJCQkJCSYmIG1lbWNtcCgmcGluZ19hZGRyLCAmc2lt
cGxlX3BpbmdlZF9ob3N0c1tqXS5hZGRyLCBzaXplb2YocGluZ19hZGRyKSkgPT0gMCkKCQkJCXsK
CQkJCQlmb3VuZCA9IDE7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJCgkJCS8qCgkJCSoJSWYg
cGFja2V0IHdhcyBzZW50IHRvIHRoZSBzYW1lIElQIC0gc2tpcHBpbmcgaXQKCQkJKi8KCQkJaWYo
Zm91bmQpCgkJCXsKCQkJCURFQlVHQyhEQkNMQVNTX1BMVUdJTiwKCQkJCSIlczogc2tpcHBpbmcg
cGluZyB0byBbJXNdOiBwaW5nIHBhY2tldCB3YXMgYWxscmVhZHkgc2VudCB0byB0aGUgc2FtZSBh
ZGRyZXNzIFslczoldV0gZm9yIGhvc3Q6IFslc10iLAoJCQkJbmFtZSwgc2lwX2hvc3QsIHNpcF9p
cCwgaXNpcF9wb3J0LCBzaW1wbGVfcGluZ2VkX2hvc3RzW2pdLmhvc3QpOwoJCQkJCgkJCQljb250
aW51ZTsKCQkJfQoJCQkKCQkJLyoKCQkJKglTZW5kaW5nIHBhY2tldAoJCQkqLwoJCQlERUJVR0Mo
REJDTEFTU19QTFVHSU4sCgkJCQkiJXM6IHNlbmRpbmcgcGluZyBwYWNrZXQgdG8gWyVzOiVkXSwg
SVA6ICVzIC4uLiIsCgkJCQluYW1lLCBzaXBfaG9zdCwgaXNpcF9wb3J0LCBzaXBfaXApOwoJCQkK
CQkJc3RzID0gc2VuZF9zaW1wbGVfcGluZygmcGluZ19hZGRyLCBpc2lwX3BvcnQpOwoJCQkKCQkJ
aWYoc3RzID09IFNUU19TVUNDRVNTKQoJCQl7CgkJCQlERUJVR0MoREJDTEFTU19QTFVHSU4sICIl
czogc2VuZGluZyBwaW5nIHBhY2tldCB0byBbJXM6JWRdIGlzIGRvbmUhIiwKCQkJCQluYW1lLCBz
aXBfaG9zdCwgaXNpcF9wb3J0KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCVdBUk4oIiVzOiBVbmFi
bGUgdG8gc2VuZCBwaW5nIHBhY2tldCB0byBbJXM6JWRdISIsCgkJCQkJbmFtZSwgc2lwX2hvc3Qs
IGlzaXBfcG9ydCk7CgkJCX0KCQkJCgkJCS8qCgkJCSoJU2F2aW5nIGFkZHJlc3Mgb2YgcGluZ2Vk
IGhvc3QuCgkJCSoJUGluZyBzZW5kaW5nIGVycm9ycyBhcmUgaWdub3JlZCwgYmVjYXVzZSBvZiBw
cm9iYWJpbGl0eSBvZiByZXBlYXRpbmcgZXJyb3JzLgoJCQkqLwoJCQlzaW1wbGVfcGluZ2VkX2hv
c3RzW3BpbmdlZF9lbmRfaWR4XS5ob3N0ID0gc2lwX2hvc3Q7CgkJCXNpbXBsZV9waW5nZWRfaG9z
dHNbcGluZ2VkX2VuZF9pZHhdLnBvcnQgPSBpc2lwX3BvcnQ7CgkJCW1lbWNweSgmc2ltcGxlX3Bp
bmdlZF9ob3N0c1twaW5nZWRfZW5kX2lkeF0uYWRkciwgJnBpbmdfYWRkciwgc2l6ZW9mKHBpbmdf
YWRkcikpOwoJCQkKCQkJcGluZ2VkX2VuZF9pZHggKys7CgkJfQoJfQoJCglwaW5nZWRfaG9zdHNf
Z2xvYmFsID0gcGluZ2VkX2VuZF9pZHg7CgkKCXJldHVybiBTVFNfU1VDQ0VTUzsKfQoKLyoKKglT
ZW5kIFBJTkcgcGFja2V0CiovCnN0YXRpYyBpbnQgc2VuZF9zaW1wbGVfcGluZyhzdHJ1Y3QgaW5f
YWRkciAqYWRkciwgdW5zaWduZWQgaW50IHBvcnQpCnsKCWludCBzdHM7CgljaGFyIHBpbmdfcGF5
bG9hZFtdID0gIlxyXG5cclxuIjsgLyogUElORyBmcm9tIFJGQyA1NjI2ICh2aW9sYXRpb24pICov
CglzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBheWxvYWRfc2l6ZSA9IHNpemVvZihwaW5nX3Bh
eWxvYWQpIC0gMTsKCQoJc3RzID0gc2lwc29ja19zZW5kKCphZGRyLCBwb3J0LCBQUk9UT19VRFAs
IHBpbmdfcGF5bG9hZCwgcGF5bG9hZF9zaXplKTsKCQoJcmV0dXJuIHN0czsKfQoKLyoKKglEcm9w
cGluZyBQT05HIHBhY2tldHMKKi8Kc3RhdGljIGludCBwaW5nX2J5X3NpbXBsZV9pbmNvbWluZyhp
bnQgc3RhZ2UsIHNpcF90aWNrZXRfdCAqdGlja2V0KQp7CgljaGFyIHBvbmdfcGF5bG9hZFtdID0g
IlxyXG4iOyAvKiBQT05HIGZyb20gUkZDIDU2MjYgKHZpb2xhdGlvbikgKi8KCXN0YXRpYyBjb25z
dCB1bnNpZ25lZCBpbnQgcG9uZ19wYXlsb2FkX3NpemUgPSBzaXplb2YocG9uZ19wYXlsb2FkKSAt
IDE7CgljaGFyIHplcm9fcG9uZ19wYXlsb2FkW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07
CglzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHplcm9fcG9uZ19wYXlsb2FkX3NpemUgPSBzaXpl
b2YoemVyb19wb25nX3BheWxvYWQpOwoJY29uc3QgY2hhciAqaXA7Cgl1bnNpZ25lZCBpbnQgcG9y
dDsKCXVuc2lnbmVkIGludCBpOwoJaW50IGZvdW5kOwoJaW50IHN0cyA9IFNUU19TVUNDRVNTOwoJ
CgkvKgoJKglJZiB3ZSBnb3QgYSBQT05HIHBhY2tldAoJKi8KCWlmKCh0aWNrZXQtPnJhd19idWZm
ZXJfbGVuID09IHBvbmdfcGF5bG9hZF9zaXplCgkJJiYgIW1lbWNtcCh0aWNrZXQtPnJhd19idWZm
ZXIsIHBvbmdfcGF5bG9hZCwgcG9uZ19wYXlsb2FkX3NpemUpKQoJCXx8ICh0aWNrZXQtPnJhd19i
dWZmZXJfbGVuID09IHplcm9fcG9uZ19wYXlsb2FkX3NpemUKCQkmJiAhbWVtY21wKHRpY2tldC0+
cmF3X2J1ZmZlciwgemVyb19wb25nX3BheWxvYWQsIHplcm9fcG9uZ19wYXlsb2FkX3NpemUpKSkK
CXsKCQlpcCA9IHV0aWxzX2luZXRfbnRvYSh0aWNrZXQtPmZyb20uc2luX2FkZHIpOwoJCXBvcnQg
PSBudG9ocyh0aWNrZXQtPmZyb20uc2luX3BvcnQpOwoJCQoJCS8qCgkJKglUcnlpbmcgdG8gY2hl
Y2s6IHdhcyBpdCBzZW5kIGJ5IHBsdWdpbiBvciBub3QuLi4KCQkqLwoJCWZvdW5kID0gMDsKCQlm
b3IoaSA9IDA7IGkgPCBwaW5nZWRfaG9zdHNfZ2xvYmFsOyBpICsrKQoJCXsKCQkJaWYoc2ltcGxl
X3BpbmdlZF9ob3N0c1tpXS5wb3J0ID09IHBvcnQKCQkJCSYmICFtZW1jbXAoJnNpbXBsZV9waW5n
ZWRfaG9zdHNbaV0uYWRkciwgJnRpY2tldC0+ZnJvbS5zaW5fYWRkciwgc2l6ZW9mKHRpY2tldC0+
ZnJvbS5zaW5fYWRkcikpKQoJCQl7CgkJCQlmb3VuZCA9IDE7CgkJCQlicmVhazsKCQkJfQoJCX0K
CQkKCQkvKgoJCSoJVGhpcyBwYWNrZXQgaXMgbm90IGFuIG91ciBwYWNrZXQKCQkqLwoJCWlmKGZv
dW5kKQoJCXsKCQkJREVCVUdDKERCQ0xBU1NfUExVR0lOLCAiJXM6IGdvdCBQT05HIGZyb20gJXM6
JXU6IG5vdCBhbiBvdXIgcGFja2V0IiwKCQkJCW5hbWUsIGlwLCBwb3J0KTsKCQkJCgkJCXJldHVy
biBzdHM7CgkJfQoJCQoJCS8qCgkJKglSZW1vdmluZyBwaW5nZWQgYWRkcmVzcyBmcm9tIHBpbmdl
ZCBsaXN0CgkJKi8KCQltZW1zZXQoc2ltcGxlX3BpbmdlZF9ob3N0cyArIGksIDAsIHNpemVvZigq
c2ltcGxlX3BpbmdlZF9ob3N0cykpOwoJCQoJCURFQlVHQyhEQkNMQVNTX1BMVUdJTiwgIiVzOiBn
b3QgUE9ORyBwYWNrZXQgZnJvbSAlczoldSIsIG5hbWUsIGlwLCBwb3J0KTsKCQkKCQlyZXR1cm4g
U1RTX0ZBTFNFOwoJfQoJCglyZXR1cm4gc3RzOwp9Cg==

--MP_/tPp.QEg0g7a5HXMVYtA2CuH
Content-Type: application/octet-stream; name=plugin_sdp_name.c
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=plugin_sdp_name.c

LyogbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgPHBsdWdpbi5oPiAqLwojZGVmaW5l
IFBMVUdJTl9OQU1FIHBsdWdpbl9zZHBfbmFtZQoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1
ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKI2lu
Y2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8YXJw
YS9pbmV0Lmg+CgojaW5jbHVkZSA8b3NpcHBhcnNlcjIvb3NpcF9wYXJzZXIuaD4KI2luY2x1ZGUg
PG9zaXBwYXJzZXIyL3NkcF9tZXNzYWdlLmg+CgojaW5jbHVkZSAic2lwcm94ZC5oIgojaW5jbHVk
ZSAicGx1Z2lucy5oIgojaW5jbHVkZSAibG9nLmgiCgpzdGF0aWMgY2hhciBjb25zdCBpZGVudFtd
ID0gIiRJZDogcGx1Z2luX3NkcF9uYW1lLmMsdiAxLjIgMjAxOS8wNy8yMSAyMDo1MjoyMCBldmdl
bml5IEV4cCBldmdlbml5ICQiOwoKLyoKKglQbHVnLWluIGlkZW50aWZpY2F0aW9uCiovCnN0YXRp
YyBjaGFyIG5hbWVbXSA9ICJwbHVnaW5fc2RwX25hbWUiOwpzdGF0aWMgY2hhciBkZXNjW10gPSAi
Q2hhbmdlcyBzZXNzaW9uIG5hbWUgaW4gU0RQIjsKCi8qCioJZ2xvYmFsIGNvbmZpZ3VyYXRpb24g
c3RvcmFnZSAtIHJlcXVpcmVkIGZvciBjb25maWcgZmlsZSBsb2NhdGlvbgoqLwpleHRlcm4gc3Ry
dWN0IHNpcHJveGRfY29uZmlnIGNvbmZpZ3VyYXRpb247CgovKgoqCXBsdWdpbiBjb25maWd1cmF0
aW9uIHN0b3JhZ2UKKi8Kc3RhdGljIHN0cnVjdCBwbHVnaW5fY29uZmlnCnsKCWNoYXIgKm9fdXNl
cm5hbWU7CgljaGFyICpzOwoJaW50IHNfaXNfdXNlcl9hZ2VudDsKfSBwbHVnaW5fY2ZnOwoKLyoK
KglJbnN0cnVjdGlvbnMgZm9yIGNvbmZpZyBwYXJzZXIKKi8Kc3RhdGljIGNmZ29wdHNfdCBwbHVn
aW5fY2ZnX29wdHNbXSA9IHsKCS8qCgkqCVZhbHVlIG9mICJvPSIgcGFyYW1ldGVyIG9mIFNEUAoJ
Ki8KCXsgInBsdWdpbl9zZHBfbmFtZV9vX3VzZXJuYW1lIiwgVFlQX1NUUklORywgJnBsdWdpbl9j
Zmcub191c2VybmFtZSwgezAsIE5VTEx9IH0sCgkKCS8qCgkqCVZhbHVlIG9mICJzPSIgcGFyYW1l
dGVyIG9mIFNEUAoJKi8KCXsgInBsdWdpbl9zZHBfbmFtZV9zIiwgVFlQX1NUUklORywgJnBsdWdp
bl9jZmcucywgezAsIE5VTEx9IH0sCgkKCS8qCgkqCVNldCAicz0iIHRvIFVzZXItQWdlbnQgb2Yg
U0lQIHBhY2tldAoJKgkwIC0gZG9uJ3Qgc2V0CgkqCTEgLSBzZXQKCSovCgl7ICJwbHVnaW5fc2Rw
X25hbWVfc19pc191YSIsIFRZUF9JTlQ0LCAmcGx1Z2luX2NmZy5zX2lzX3VzZXJfYWdlbnQsIHsw
LCBOVUxMfX0sCgl7MCwgMCwgMH0KfTsKCnN0YXRpYyBpbnQgZml4X3N0cihjaGFyICpzdHIsIGlu
dCBhbGxvd2VkX3NwYWNlKTsKCi8qIAoqCUluaXRpYWxpemF0aW9uLgoqCUNhbGxlZCBvbmNlIHN1
cmluZyBzaXByb3hkIHN0YXJ0dXAuCiovCmludCBQTFVHSU5fSU5JVChwbHVnaW5fZGVmX3QgKnBs
dWdpbl9kZWYpCnsKCS8qCgkqCUFQSSB2ZXJzaW9uIG51bWJlciBvZiBzaXByb3hkIHRoYXQgdGhp
cyBwbHVnaW4gaXMgYnVpbHQgYWdhaW5zdC4KCSoJVGhpcyBjb25zdGFudCB3aWxsIGNoYW5nZSB3
aGVuZXZlciBjaGFuZ2VzIHRvIHRoZSBBUEkgYXJlIG1hZGUKCSoJdGhhdCByZXF1aXJlIGFkYXB0
aW9ucyBpbiB0aGUgcGx1Z2luLgoJKi8KCXBsdWdpbl9kZWYtPmFwaV92ZXJzaW9uID0gU0lQUk9Y
RF9BUElfVkVSU0lPTjsKCQoJLyoKCSoJTmFtZSBhbmQgZGVzY3JpcHRpdmUgdGV4dCBvZiB0aGUg
cGx1Z2luCgkqLwoJcGx1Z2luX2RlZi0+bmFtZSA9IG5hbWU7CglwbHVnaW5fZGVmLT5kZXNjID0g
ZGVzYzsKCgkvKgoJKglFeGVjdXRpb24gbWFzayAtIGR1cmluZyB3aGljaCBzdGFnZXMgb2YgU0lQ
IHByb2Nlc3NpbmcgdGhhdCBwbHVnaW4KCSoJc2hhbGwgYmUgY2FsbGVkLgoJKglVc2luZyBQTFVH
SU5fUE9TVF9QUk9YWSwgYmVjYXVzZSBvZiBzZXNzaW9uIG5hbWVzIG1vZGlmaWNhdGlvbnMKCSoJ
YnkgcHJveHkuCgkqLwoJcGx1Z2luX2RlZi0+ZXhlX21hc2sgPSBQTFVHSU5fUE9TVF9QUk9YWTsK
CQoJLyoKCSoJUmVhZCB0aGUgY29uZmlnIGZpbGUKCSovCglpZihyZWFkX2NvbmZpZyhjb25maWd1
cmF0aW9uLmNvbmZpZ2ZpbGUsCgkJCWNvbmZpZ3VyYXRpb24uY29uZmlnX3NlYXJjaCwKCQkJcGx1
Z2luX2NmZ19vcHRzLCBuYW1lKSA9PSBTVFNfRkFJTFVSRSkKCXsKCQlFUlJPUigiUGx1Z2luICcl
cyc6IGNvdWxkIG5vdCBsb2FkIGNvbmZpZyBmaWxlIiwgbmFtZSk7CgkJcmV0dXJuIFNUU19GQUlM
VVJFOwoJfQoJCglpZihwbHVnaW5fY2ZnLm9fdXNlcm5hbWUgJiYgZml4X3N0cihwbHVnaW5fY2Zn
Lm9fdXNlcm5hbWUsIDApKQoJewoJCVdBUk4oIiVzOiBvPSB1c2VybmFtZSBjb25zaXN0cyB1bmFj
Y2VwdGFibGUgc3ltYm9scywgaXQgd2FzIGZpeGVkIHRvIFslc10iLAoJCQluYW1lLCBwbHVnaW5f
Y2ZnLm9fdXNlcm5hbWUpOwoJfQoJCglpZihwbHVnaW5fY2ZnLnMgJiYgZml4X3N0cihwbHVnaW5f
Y2ZnLnMsIDEpKQoJewoJCVdBUk4oIiVzOiBzPSBzZXNzaW9uIG5hbWUgY29uc2lzdHMgdW5hY2Nl
cHRhYmxlIHN5bWJvbHMsIGl0IHdhcyBmaXhlZCB0byBbJXNdIiwKCQkJbmFtZSwgcGx1Z2luX2Nm
Zy5zKTsKCX0KCQoJSU5GTygiJXMgaXMgaW5pdGlhbGl6ZWQiLCBuYW1lKTsKCXJldHVybiBTVFNf
U1VDQ0VTUzsKfQoKc3RhdGljIGludCBmaXhfc3RyKGNoYXIgKnN0ciwgaW50IGFsbG93ZWRfc3Bh
Y2UpCnsKCWludCBjaGFuZ2VzID0gMDsKCWNoYXIgYzsKCQoJd2hpbGUoKnN0cikKCXsKCQljID0g
KnN0cjsKCQkKCQlpZighaXNhc2NpaShjKSB8fCAoIWlzZ3JhcGgoYykgJiYgKChhbGxvd2VkX3Nw
YWNlICYmICFpc3NwYWNlKGMpKSB8fCAhYWxsb3dlZF9zcGFjZSkpKQoJCXsKCQkJKnN0ciA9ICct
JzsKCQkJY2hhbmdlcyArKzsKCQl9CgkJCgkJc3RyICsrOwoJfQoJCglyZXR1cm4gY2hhbmdlczsK
fQoKLyoKKglQcm9jZXNzaW5nLgoqLwppbnQgUExVR0lOX1BST0NFU1MoaW50IHN0YWdlLCBzaXBf
dGlja2V0X3QgKnRpY2tldCkKewoJaW50IHN0czsKCWludCB0eXBlOwoJY2hhciAqYnVmZjsKCXNp
emVfdCBidWZsZW47Cglvc2lwX2JvZHlfdCAqYm9keTsKCXNkcF9tZXNzYWdlX3QgICpzZHA7Cglp
bnQgY29udGVudF9sZW5ndGg7Cglvc2lwX2NvbnRlbnRfdHlwZV90ICpjb250ZW50X3R5cGU7Cglj
aGFyIGNsZW5fYnVmWzhdOyAvKiBjb250ZW50IGxlbmd0aDogcHJvYmFibHkgbmV2ZXIgbW9yZSB0
aGFuIDcgZGlnaXRzICEqLwoJb3NpcF9oZWFkZXJfdCAqdWFfaGRyOwoJY2hhciAqb3JpZ19zZXNz
X25hbWUsICpuZXdfc2Vzc19uYW1lOwoJY2hhciAqb3JpZ19zZXNzX3VzZXJuYW1lLCAqc2Vzc19p
ZCwgKnNlc3NfdmVyc2lvbiwgKnNlc3NfbmV0dHlwZSwgKnNlc3NfYWRkcnR5cGUsICpzZXNzX2Fk
ZHI7CgljaGFyICpidWY7CgkKCQoJLyoKCSoJTW9kaWZ5aW5nIFNEUCBpbiBvdXRnb2luZyBtZXNz
YWdlcyBvbmx5CgkqLwoJdHlwZSA9IHRpY2tldC0+ZGlyZWN0aW9uOwoJaWYodHlwZSAhPSBSRVFU
WVBfT1VUR09JTkcgJiYgdHlwZSAhPSBSRVNUWVBfT1VUR09JTkcpCgl7CgkJcmV0dXJuIFNUU19T
VUNDRVNTOwoJfQoJCgkKCS8qCgkqCVNlbGVjdGluZyAicz0iIHZhbHVlCgkqLwoJbmV3X3Nlc3Nf
bmFtZSA9IE5VTEw7CglpZihwbHVnaW5fY2ZnLnMgIT0gTlVMTCkKCXsKCQlpZihzdHJsZW4ocGx1
Z2luX2NmZy5zKSA+IDApCgkJewoJCQluZXdfc2Vzc19uYW1lID0gcGx1Z2luX2NmZy5zOwoJCX0K
CQllbHNlCgkJewoJCQluZXdfc2Vzc19uYW1lID0gIiAiOwoJCX0KCX0KCWVsc2UgaWYocGx1Z2lu
X2NmZy5zX2lzX3VzZXJfYWdlbnQpCgl7CgkJb3NpcF9tZXNzYWdlX2dldF91c2VyX2FnZW50KHRp
Y2tldC0+c2lwbXNnLCAwLCAmdWFfaGRyKTsKCQkKCQlpZih1YV9oZHIpCgkJewoJCQluZXdfc2Vz
c19uYW1lID0gdWFfaGRyLT5odmFsdWU7CgkJfQoJfQoJCgkKCS8qCgkqCUNoZWNraW5nIGlmIG5v
dGhpbmcgdG8gZG8KCSovCglpZihwbHVnaW5fY2ZnLm9fdXNlcm5hbWUgPT0gTlVMTCAmJiBwbHVn
aW5fY2ZnLnMgPT0gTlVMTCkKCXsKCQlyZXR1cm4gU1RTX1NVQ0NFU1M7Cgl9CgkKCS8qCgkqCUNo
ZWNraW5nIHRoYXQgd2UgaGF2ZSB0aGUgZXhwZWN0ZWQgcGF5bG9hZCAiYXBwbGljYXRpb24vc2Rw
IgoJKi8KCgkvKiAKCSoJR2V0dGluZyBjb250ZW50IGxlbmd0aAoJKi8KCWNvbnRlbnRfbGVuZ3Ro
ID0gMDsKCWlmKHRpY2tldC0+c2lwbXNnICYmIHRpY2tldC0+c2lwbXNnLT5jb250ZW50X2xlbmd0
aCAKCQkmJiB0aWNrZXQtPnNpcG1zZy0+Y29udGVudF9sZW5ndGgtPnZhbHVlKQoJewoJCXN0cyA9
IHNzY2FuZih0aWNrZXQtPnNpcG1zZy0+Y29udGVudF9sZW5ndGgtPnZhbHVlLCAiJWkiLCAmY29u
dGVudF9sZW5ndGgpOwoJfQoKCS8qCgkqCUNoZWNraW5nIGlmIHdlIGhhdmUgYSBjb250ZW50IHR5
cGUgZGVmaW5lZCBhbmQgdGhhdCBwYXlsb2FkIGxlbmd0aCA+MAoJKi8KCWNvbnRlbnRfdHlwZSA9
IG9zaXBfbWVzc2FnZV9nZXRfY29udGVudF90eXBlKHRpY2tldC0+c2lwbXNnKTsKCWlmKGNvbnRl
bnRfbGVuZ3RoIDw9IDAgfHwgY29udGVudF90eXBlID09IE5VTEwKCQl8fCBjb250ZW50X3R5cGUt
PnR5cGUgPT0gTlVMTCB8fCBjb250ZW50X3R5cGUtPnN1YnR5cGUgPT0gTlVMTCkKCXsKCQlyZXR1
cm4gU1RTX1NVQ0NFU1M7Cgl9CgoJLyoKCSoJQ2hlY2tpbmcgY29udGVudCB0eXBlOiBpdCBtdXN0
IGJlICJhcHBsaWNhdGlvbi9zZHAiCgkqLwoJaWYoc3RybmNtcChjb250ZW50X3R5cGUtPnR5cGUs
ICJhcHBsaWNhdGlvbiIsIHNpemVvZigiYXBwbGljYXRpb24iKSkgIT0gMAoJCXx8IHN0cm5jbXAo
Y29udGVudF90eXBlLT5zdWJ0eXBlLCAic2RwIiwgc2l6ZW9mKCJzZHAiKSkgIT0gMCkKCXsKCQly
ZXR1cm4gU1RTX1NVQ0NFU1M7Cgl9CgoJLyoKCSoJUGFyc2luZyB0aGUgcGF5bG9hZAoJKglHZXR0
aW5nIGEgcG9pbnRlciB0byB0aGUgcGF5bG9hZCBvZiB0aGUgU0lQIHBhY2tldAoJKi8KCXN0cyA9
IG9zaXBfbWVzc2FnZV9nZXRfYm9keSh0aWNrZXQtPnNpcG1zZywgMCwgJmJvZHkpOwoJaWYoc3Rz
ICE9IDApCgl7CgkJREVCVUdDKERCQ0xBU1NfUExVR0lOLCAiJXM6IG5vIGJvZHkgZm91bmQgaW4g
U0RQIG1lc3NhZ2UiLCBuYW1lKTsKCQlyZXR1cm4gU1RTX1NVQ0NFU1M7Cgl9CgkKCS8qCgkqCUR1
bXBpbmcgaXQgaW50byBhIGJ1ZmZlcgoJKi8KCXN0cyA9IHNpcF9ib2R5X3RvX3N0cihib2R5LCAm
YnVmZiwgJmJ1Zmxlbik7CglpZihzdHMgIT0gMCkKCXsKCQlXQVJOKCIlczogdW5hYmxlIHRvIHNp
cF9ib2R5X3RvX3N0ciIsIG5hbWUpOwoJCXJldHVybiBTVFNfU1VDQ0VTUzsKCX0KCQoJLyoKCSoJ
QW5kIHBhcnNpbmcgaXQgaW50byBhbiBTRFAgc3RydWN0dXJlCgkqLwoJc3RzID0gc2RwX21lc3Nh
Z2VfaW5pdCgmc2RwKTsKCQoJc3RzID0gc2RwX21lc3NhZ2VfcGFyc2Uoc2RwLCBidWZmKTsKCQoJ
aWYoc3RzICE9IDApCgl7CgkJV0FSTigiJXM6IHVuYWJsZSB0byBzZHBfbWVzc2FnZV9wYXJzZSgp
IGJvZHkiLCBuYW1lKTsKCQkKCQlEVU1QX0JVRkZFUigtMSwgYnVmZiwgYnVmbGVuKTsKCQkKCQlv
c2lwX2ZyZWUoYnVmZik7CgkJCgkJYnVmZiA9IE5VTEw7CgkJCgkJc2RwX21lc3NhZ2VfZnJlZShz
ZHApOwoJCXJldHVybiBTVFNfU1VDQ0VTUzsKCX0KCQoJb3NpcF9mcmVlKGJ1ZmYpOwoJYnVmZiA9
IE5VTEw7CgoJCgkvKgoJKglTZXR0aW5nIG5ldyAicz0iIHZhbHVlIHRvIFNEUAoJKi8KCWlmKG5l
d19zZXNzX25hbWUgJiYgc3RybGVuKG5ld19zZXNzX25hbWUpID4gMCkKCXsKCQlvcmlnX3Nlc3Nf
bmFtZSA9IHNkcF9tZXNzYWdlX3NfbmFtZV9nZXQoc2RwKTsKCQkKCQlidWYgPSBvc2lwX3N0cmR1
cChuZXdfc2Vzc19uYW1lKTsKCQkKCQlpZihidWYpCgkJewoJCQlERUJVR0MoREJDTEFTU19QTFVH
SU4sICIlczogY2hhbmdpbmcgU0RQIHNlc3Npb24gbmFtZSBmcm9tIFslc10gdG8gWyVzXSIsCgkJ
CQluYW1lLCBvcmlnX3Nlc3NfbmFtZT9vcmlnX3Nlc3NfbmFtZToiIiwgbmV3X3Nlc3NfbmFtZSk7
CgkJCQoJCQlzZHBfbWVzc2FnZV9zX25hbWVfc2V0KHNkcCwgYnVmKTsKCQkJb3NpcF9mcmVlKG9y
aWdfc2Vzc19uYW1lKTsKCQl9CgkJZWxzZQoJCXsKCQkJRVJST1IoIiVzOiBhbGxvY2F0aW9uIGVy
cm9yIGZvciBuZXcgU0RQIHNlc3Npb24gbmFtZSIsIG5hbWUpOwoJCX0KCX0KCQoJLyoKCSoJU2V0
dGluZyBuZXcgIm89IiB2YWx1ZSB0byBTRFAKCSovCglpZihwbHVnaW5fY2ZnLm9fdXNlcm5hbWUg
JiYgc3RybGVuKHBsdWdpbl9jZmcub191c2VybmFtZSkgPiAwKQoJewoJCWJ1ZiA9IG9zaXBfc3Ry
ZHVwKHBsdWdpbl9jZmcub191c2VybmFtZSk7CgkJb3JpZ19zZXNzX3VzZXJuYW1lID0gc2RwX21l
c3NhZ2Vfb191c2VybmFtZV9nZXQoc2RwKTsKCQlzZXNzX2lkID0gc2RwX21lc3NhZ2Vfb19zZXNz
X2lkX2dldChzZHApOwoJCXNlc3NfdmVyc2lvbiA9IHNkcF9tZXNzYWdlX29fc2Vzc192ZXJzaW9u
X2dldChzZHApOwoJCXNlc3NfbmV0dHlwZSA9IHNkcF9tZXNzYWdlX29fbmV0dHlwZV9nZXQoc2Rw
KTsKCQlzZXNzX2FkZHJ0eXBlID0gc2RwX21lc3NhZ2Vfb19hZGRydHlwZV9nZXQoc2RwKTsKCQlz
ZXNzX2FkZHIgPSBzZHBfbWVzc2FnZV9vX2FkZHJfZ2V0KHNkcCk7CgkJCgkJaWYoYnVmKQoJCXsK
CQkJREVCVUdDKERCQ0xBU1NfUExVR0lOLCAiJXM6IGNoYW5naW5nIFNEUCBzZXNzaW9uIHVzZXJu
YW1lIGZyb20gWyVzXSB0byBbJXNdIiwKCQkJCW5hbWUsIG9yaWdfc2Vzc191c2VybmFtZT9vcmln
X3Nlc3NfdXNlcm5hbWU6IiIsIHBsdWdpbl9jZmcub191c2VybmFtZSk7CgkJCQoJCQlvc2lwX2Zy
ZWUob3JpZ19zZXNzX3VzZXJuYW1lKTsKCQkJc2RwX21lc3NhZ2Vfb19vcmlnaW5fc2V0KHNkcCwg
YnVmLCBzZXNzX2lkLCBzZXNzX3ZlcnNpb24sIHNlc3NfbmV0dHlwZSwgc2Vzc19hZGRydHlwZSwg
c2Vzc19hZGRyKTsKCQl9CgkJZWxzZQoJCXsKCQkJRVJST1IoIiVzOiBhbGxvY2F0aW9uIGVycm9y
IGZvciBuZXcgU0RQIHNlc3Npb24gdXNlcm5hbWUiLCBuYW1lKTsKCQl9Cgl9CgkKCS8qCgkqCVJl
cGxhY2luZyB0aGUgb3JpZ2luYWwgcGF5bG9hZCB3aXRoIHRoZSBuZXcgbW9kaWZpZWQgcGF5bG9h
ZAoJKglSZW1vdmluZyBvbGQgYm9keSBmcm9tIFNJUCBwYWNrZXQKCSovCglzdHMgPSBvc2lwX2xp
c3RfcmVtb3ZlKCYodGlja2V0LT5zaXBtc2ctPmJvZGllcyksIDApOwoJb3NpcF9ib2R5X2ZyZWUo
Ym9keSk7Cglib2R5ID0gTlVMTDsKCQoJLyoKCSoJRHVtcGluZyBuZXcgYm9keSB0byBidWZmZXIK
CSovCglzZHBfbWVzc2FnZV90b19zdHIoc2RwLCAmYnVmZik7CglidWZsZW4gPSBzdHJsZW4oYnVm
Zik7CgoJLyoKCSoJRnJlZWluZyBzZHAgc3RydWN0dXJlIChubyBsb25nZXIgbmVlZGVkKQoJKi8K
CXNkcF9tZXNzYWdlX2ZyZWUoc2RwKTsKCXNkcCA9IE5VTEw7CgoJLyoKCSoJUHV0dGluZyBuZXcg
Ym9keSBpbnRvIFNJUCBtZXNzYWdlCgkqLwoJc3RzID0gc2lwX21lc3NhZ2Vfc2V0X2JvZHkodGlj
a2V0LT5zaXBtc2csIGJ1ZmYsIGJ1Zmxlbik7CglpZihzdHMgIT0gMCkKCXsKCQlFUlJPUigiJXM6
IHVuYWJsZSB0byBzaXBfbWVzc2FnZV9zZXRfYm9keSBib2R5IiwgbmFtZSk7CgkJRFVNUF9CVUZG
RVIoLTEsIGJ1ZmYsIGJ1Zmxlbik7CgkJYnVmbGVuID0gMDsKCX0KCQoJLyoKCSoJRnJlZWluZyBi
dWZmZXIKCSovCglvc2lwX2ZyZWUoYnVmZik7CglidWZmID0gTlVMTDsKCgkKCS8qCgkqCVNldHRp
bmcgbmV3IGNvbnRlbnQgbGVuZ3RoCgkqCVJlbW92aW5nIG9sZCBjb250ZW50IGxlZ2h0IGZpZWxk
CgkqLwoJb3NpcF9jb250ZW50X2xlbmd0aF9mcmVlKHRpY2tldC0+c2lwbXNnLT5jb250ZW50X2xl
bmd0aCk7Cgl0aWNrZXQtPnNpcG1zZy0+Y29udGVudF9sZW5ndGggPSBOVUxMOwoJCgkvKgoJKglT
ZXR0aW5nIG5ldyBjb250ZW50IGxlbmd0aAoJKi8KCXNwcmludGYoY2xlbl9idWYsICIlbGQiLCAo
bG9uZylidWZsZW4pOwoJaWYob3NpcF9tZXNzYWdlX3NldF9jb250ZW50X2xlbmd0aCh0aWNrZXQt
PnNpcG1zZywgY2xlbl9idWYpICE9IE9TSVBfU1VDQ0VTUykKCXsKCQlFUlJPUigiJXM6IHVuYWJs
ZSB0byBzZXQgbmV3IGNvbnRlbnQgbGVuZ3RoIiwgbmFtZSk7CgkJcmV0dXJuIFNUU19GQUlMVVJF
OwoJfQoJCglyZXR1cm4gU1RTX1NVQ0NFU1M7Cn0KCi8qCioJRGUtSW5pdGlhbGl6YXRpb24uCioJ
Q2FsbGVkIGR1cmluZyBzaHV0ZG93biBvZiBzaXByb3hkLiBHaXZlcyB0aGUgcGx1Z2luIHRoZSBj
aGFuY2UKKgl0byBjbGVhbiB1cCBpdHMgbWVzcyAoZS5nLiBkeW5hbWljIG1lbW9yeSBhbGxvY2F0
aW9uLCBkYXRhYmFzZQoqCWNvbm5lY3Rpb25zLCB3aGF0ZXZlciB0aGUgcGx1Z2luIG1lc3NlcyBh
cm91bmQgd2l0aCkKKi8KaW50IFBMVUdJTl9FTkQocGx1Z2luX2RlZl90ICpwbHVnaW5fZGVmKQp7
CglJTkZPKCIlcyBlbmRzIGhlcmUiLCBuYW1lKTsKCXJldHVybiBTVFNfU1VDQ0VTUzsKfQo=

--MP_/tPp.QEg0g7a5HXMVYtA2CuH
Content-Type: application/octet-stream; name=plugin_striphader_strndup.patch
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=plugin_striphader_strndup.patch

LS0tIHNpcHJveGQtMC44LjMvc3JjL3BsdWdpbl9zdHJpcGhlYWRlci5jLm9yaWcJU2F0IERlYyAx
MiAxNDozNzozMiAyMDIwCisrKyBzaXByb3hkLTAuOC4zL3NyYy9wbHVnaW5fc3RyaXBoZWFkZXIu
YwlTYXQgRGVjIDEyIDE0OjQyOjE2IDIwMjAKQEAgLTg3LDYgKzg3LDI5IEBACiAgICByZXR1cm4g
U1RTX1NVQ0NFU1M7CiB9CiAKK3N0YXRpYyBjaGFyICpfc3RybmR1cChjb25zdCBjaGFyICpzLCBz
aXplX3QgbikKK3sKKyAgIHNpemVfdCBsZW4gPSBzdHJsZW4ocyk7CisgICBjaGFyICpidWY7Cisg
ICAKKyAgIGlmKGxlbiA+IG4pCisgICB7CisgICAgICAgbGVuID0gbjsKKyAgIH0KKyAgIAorICAg
YnVmID0gbWFsbG9jKGxlbiArIDEpOworICAgCisgICBpZihidWYgPT0gTlVMTCkKKyAgIHsKKyAg
ICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIAorICAgbWVtY3B5KGJ1ZiwgcywgbGVuKTsKKyAg
IGJ1ZltsZW5dID0gJ1wwJzsKKyAgIAorICAgcmV0dXJuIGJ1ZjsKK30KKwogLyoKICAqIFByb2Nl
c3NpbmcuCiAgKiAKQEAgLTEwNiw3ICsxMjksNyBAQAogICAgICAgICAgICAgIHBsdWdpbl9jZmcu
aGVhZGVyX3JlbW92ZS5zdHJpbmdbaV0sIGkpOwogICAgICAgaWYgKHN0cmNocihwbHVnaW5fY2Zn
LmhlYWRlcl9yZW1vdmUuc3RyaW5nW2ldLCc6JykpIHsKICAgICAgICAgICBpbnQgbGVuPXN0cmNo
cihwbHVnaW5fY2ZnLmhlYWRlcl9yZW1vdmUuc3RyaW5nW2ldLCc6JykgLSBwbHVnaW5fY2ZnLmhl
YWRlcl9yZW1vdmUuc3RyaW5nW2ldOwotICAgICAgICAgIGhlYWRlcl9yZW1vdmUgPSBzdHJuZHVw
KHBsdWdpbl9jZmcuaGVhZGVyX3JlbW92ZS5zdHJpbmdbaV0sIGxlbik7CisgICAgICAgICAgaGVh
ZGVyX3JlbW92ZSA9IF9zdHJuZHVwKHBsdWdpbl9jZmcuaGVhZGVyX3JlbW92ZS5zdHJpbmdbaV0s
IGxlbik7CiAgICAgICAgICAgaGVhZGVyX3JlbW92ZV9hcmdzID0gc3RyZHVwKHN0cmNocihwbHVn
aW5fY2ZnLmhlYWRlcl9yZW1vdmUuc3RyaW5nW2ldLCc6JykrMSk7CiAgICAgIH0gZWxzZSB7CiAg
ICAgICAgICAgaGVhZGVyX3JlbW92ZSA9IHN0cmR1cChwbHVnaW5fY2ZnLmhlYWRlcl9yZW1vdmUu
c3RyaW5nW2ldKTsK

--MP_/tPp.QEg0g7a5HXMVYtA2CuH
Content-Type: application/octet-stream; name=siproxd_keepalive.patch
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=siproxd_keepalive.patch

LS0tIHNpcHJveGQtMC44LjMvc3JjL3J0cHByb3h5X3JlbGF5LmMub3JpZwlGcmkgSnVuIDE3IDE5
OjE3OjE3IDIwMTEKKysrIHNpcHJveGQtMC44LjMvc3JjL3J0cHByb3h5X3JlbGF5LmMJRnJpIERl
YyAgNCAxMjozNzowMiAyMDIwCkBAIC03OCw2ICs3OCw4IEBACiBzdGF0aWMgdm9pZCAqcnRwcHJv
eHlfbWFpbih2b2lkICppKTsKIHN0YXRpYyB2b2lkIHJ0cHByb3h5X2tpbGwoIHZvaWQgKTsKIHN0
YXRpYyBpbnQgIHJ0cF9yZWNyZWF0ZV9mZHNldCh2b2lkKTsKK3N0YXRpYyB2b2lkIHJ0cF9zZW5k
X2tlZXBhbGl2ZSAoaW50IHJ0cF9wcm94eXRhYmxlX2lkeCk7CitzdGF0aWMgaW50IHNlbmRfa2Vl
cGFsaXZlX3BrdChpbnQgc29jaywgY29uc3Qgc3RydWN0IGluX2FkZHIgKmxvY2FsX2FkZHIsIGlu
dCBsb2NhbF9wb3J0LCBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqcmVtb3RlX2FkZHIsIGludCByZW1v
dGVfcG9ydCk7CiBzdGF0aWMgaW50ICBtYXRjaF9zb2NrZXQgKGludCBydHBfcHJveHl0YWJsZV9p
ZHgpOwogc3RhdGljIHZvaWQgZXJyb3JfaGFuZGxlciAoaW50IHJ0cF9wcm94eXRhYmxlX2lkeCwg
aW50IHNvY2tldF90eXBlKTsKIApAQCAtNDU0LDYgKzQ1NiwxMSBAQAogICAgICAgaWYgKGN1cnJl
bnRfdHYudHZfc2VjID4gbGFzdF90di50dl9zZWMpIHsKICAgICAgICAgIGxhc3RfdHYudHZfc2Vj
ID0gY3VycmVudF90di50dl9zZWMgKyAxMCA7CiAgICAgICAgICBmb3IgKGk9MDtpPFJUUFBST1hZ
X1NJWkU7IGkrKykgeworICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqVHJ5aW5nIHRv
IHNlbmQga2VlcC1hbGl2ZSBwYWNrZXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcnRw
X3NlbmRfa2VlcGFsaXZlKGkpOworICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAoIChydHBf
cHJveHl0YWJsZVtpXS5ydHBfcnhfc29jayAhPSAwKSAmJgogICAgICAgICAgICAgICAgICAoKHJ0
cF9wcm94eXRhYmxlW2ldLnRpbWVzdGFtcCtjb25maWd1cmF0aW9uLnJ0cF90aW1lb3V0KSA8IAog
ICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHYudHZfc2VjKSkgewpAQCAtNzk2LDEwICs4MDMs
MTggQEAKICAgIC8qIHRyeSB0byBmaW5kIHRoZSBtYXRjaGluZyBzb2NrZXQgZm9yIHJldHVybiBw
YXRoLiBUaGlzIGhhcyB0byBiZSBkb25lIGZvcgogICAgICogYm90aCBkaXJlY3Rpb25zLCB0aGUg
bmV3IHNvY2tldCBhbmQgaWYgb25lIGZvdW5kLCBpdCBtdXN0IGxpbmsgYmFjay4gKi8KICAgIGk9
bWF0Y2hfc29ja2V0KGZyZWVpZHgpOwotICAgaWYgKGk+PTAgJiYgaTxSVFBQUk9YWV9TSVpFKSBq
PW1hdGNoX3NvY2tldChpKTsKKyAgIGlmIChpPj0wICYmIGk8UlRQUFJPWFlfU0laRSkgeworICAg
ICAgaj1tYXRjaF9zb2NrZXQoaSk7CisgICAgICBydHBfc2VuZF9rZWVwYWxpdmUoaSk7CisgICB9
CiAKICAgIC8qIHByZXBhcmUgRkQgc2V0IGZvciBuZXh0IHNlbGVjdCBvcGVyYXRpb24gKi8KICAg
IHJ0cF9yZWNyZWF0ZV9mZHNldCgpOworICAgCisgICAvKgorICAgICogU2VuZGluZyBpbml0aWFs
IGtlZXAtYWxpdmUgcGFja2V0IHRvIGtpY2sgTkFUCisgICAgKi8KKyAgIHJ0cF9zZW5kX2tlZXBh
bGl2ZShmcmVlaWR4KTsKIAogICAgLyogd2FrZXVwL3NpZ25hbCBydHBfcHJveHl0aHJlYWQgZnJv
bSBzZWxlY3QoKSBoaWJlcm5hdGlvbiAqLwogICAgaWYgKCFwdGhyZWFkX2VxdWFsKHJ0cHByb3h5
X3RpZCwgcHRocmVhZF9zZWxmKCkpKQpAQCAtMTAzMiw2ICsxMDQ3LDYyIEBACiAgICByZXR1cm47
CiB9CiAKKy8qCisgKiBydHBfc2VuZF9rZWVwYWxpdmUKKyAqIEp1c3Qgc2VuZHMgZW1wdHkgUlRQ
L1JUQ1AgcGFja2V0cyB0byBraWNrLW9mZiBOQVQKKyAqLworc3RhdGljIHZvaWQgcnRwX3NlbmRf
a2VlcGFsaXZlIChpbnQgcnRwX3Byb3h5dGFibGVfaWR4KSB7CisgICBjb25zdCBydHBfcHJveHl0
YWJsZV90ICpzcmMsICpkc3Q7CisgICAKKyAgIGRzdCA9IHJ0cF9wcm94eXRhYmxlICsgcnRwX3By
b3h5dGFibGVfaWR4OworICAgCisgICBpZihkc3QtPm9wcG9zaXRlX2VudHJ5IDwgMSkKKyAgIHsK
KyAgICAgIHJldHVybjsKKyAgIH0KKworICAgc3JjID0gcnRwX3Byb3h5dGFibGUgKyBkc3QtPm9w
cG9zaXRlX2VudHJ5IC0gMTsKKyAgIAorICAgaWYoZHN0LT5ydHBfdHhfc29jayA+IDApIHsKKyAg
ICAgIHNlbmRfa2VlcGFsaXZlX3BrdChkc3QtPnJ0cF90eF9zb2NrLCAmc3JjLT5sb2NhbF9pcGFk
ZHIsIHNyYy0+bG9jYWxfcG9ydCwgJmRzdC0+cmVtb3RlX2lwYWRkciwgZHN0LT5yZW1vdGVfcG9y
dCk7CisgICB9CisgICAKKyAgIGlmKGRzdC0+cnRwX2Nvbl90eF9zb2NrID4gMCkgeworICAgICAg
c2VuZF9rZWVwYWxpdmVfcGt0KGRzdC0+cnRwX2Nvbl90eF9zb2NrLCAmc3JjLT5sb2NhbF9pcGFk
ZHIsIHNyYy0+bG9jYWxfcG9ydCArIDEsICZkc3QtPnJlbW90ZV9pcGFkZHIsIGRzdC0+cmVtb3Rl
X3BvcnQgKyAxKTsKKyAgIH0KKyAgIAorfQorCisjZGVmaW5lIFNUUkxDUFkoRFNULCBTUkMsIEJV
RlNJWkUpIChzdHJuY3B5KChEU1QpLCAoU1JDKSwgKEJVRlNJWkUpKSwgKERTVClbKEJVRlNJWkUp
IC0gMV0gPSAnXDAnLCAoRFNUKSkKKworLyoKKyAqIHNlbmRfa2VlcGFsaXZlX3BrdAorICogSnVz
dCBzZW5kcyBlbXB0eSBwYWNrZXQgdG8ga2ljay1vZmYgTkFUCisgKi8KK3N0YXRpYyBpbnQgc2Vu
ZF9rZWVwYWxpdmVfcGt0KGludCBzb2NrLCBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqbG9jYWxfYWRk
ciwgaW50IGxvY2FsX3BvcnQsIGNvbnN0IHN0cnVjdCBpbl9hZGRyICpyZW1vdGVfYWRkciwgaW50
IHJlbW90ZV9wb3J0KSB7CisgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworICAgY2hhciBzcmNf
YWRkclsxNl0sIGRzdF9hZGRyWzE2XTsKKyAgIAorICAgU1RSTENQWShzcmNfYWRkciwgdXRpbHNf
aW5ldF9udG9hKCpsb2NhbF9hZGRyKSwgc2l6ZW9mKHNyY19hZGRyKSk7CisgICBTVFJMQ1BZKGRz
dF9hZGRyLCB1dGlsc19pbmV0X250b2EoKnJlbW90ZV9hZGRyKSwgc2l6ZW9mKGRzdF9hZGRyKSk7
CisgICAKKyAgIERFQlVHQyhEQkNMQVNTX1JUUCwiU2VuZGluZyBSVFAga2VlcC1hbGl2ZSBwYWNr
ZXQgZnJvbSAlczoldSB0byAlczoldSIsCisgICAgICAgICAgICAgICAgc3JjX2FkZHIsIGxvY2Fs
X3BvcnQsIGRzdF9hZGRyLCByZW1vdGVfcG9ydCk7CisgICAKKyAgIG1lbXNldCgmc2luLCAwLCBz
aXplb2Yoc2luKSk7CisgICAKKyAgIHNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgIG1lbWNw
eSgmc2luLnNpbl9hZGRyLCByZW1vdGVfYWRkciwgc2l6ZW9mKHNpbi5zaW5fYWRkcikpOworICAg
c2luLnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlX3BvcnQpOworICAgCisgICBpZihzZW5kdG8oc29j
aywgTlVMTCwgMCwgMCwgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciopJnNpbiwgKHNvY2tsZW5fdClz
aXplb2Yoc2luKSkgPCAwKSB7CisgICAgICBFUlJPUigiVW5hYmxlIHRvIHNlbmQgUlRQIGtlZXAt
YWxpdmUgcGFja2V0IGZyb20gJXM6JWQgdG8gJXM6JWQ6ICVzIiwKKyAgICAgICAgICAgICAgICB1
dGlsc19pbmV0X250b2EoKmxvY2FsX2FkZHIpLCBsb2NhbF9wb3J0LCB1dGlsc19pbmV0X250b2Eo
KnJlbW90ZV9hZGRyKSwgcmVtb3RlX3BvcnQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICByZXR1
cm4gLTE7CisgICB9CisgICAKKyAgIHJldHVybiAwOworfQogCiAvKgogICogbWF0Y2hfc29ja2V0
Cg==

--MP_/tPp.QEg0g7a5HXMVYtA2CuH
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--MP_/tPp.QEg0g7a5HXMVYtA2CuH
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Siproxd-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/siproxd-users

--MP_/tPp.QEg0g7a5HXMVYtA2CuH--